@bitgo/sdk-api 1.45.4 → 1.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/package.json +5 -5
- package/dist/src/bitgoAPI.d.ts.map +1 -1
- package/dist/src/bitgoAPI.js +3 -9
- package/dist/src/v1/transactionBuilder.js +3 -5
- package/dist/src/v1/verifyAddress.d.ts +6 -0
- package/dist/src/v1/verifyAddress.d.ts.map +1 -0
- package/dist/src/v1/verifyAddress.js +18 -0
- package/package.json +5 -5
|
@@ -19,6 +19,7 @@ const unspents_1 = require("@bitgo/unspents");
|
|
|
19
19
|
const debugLib = require("debug");
|
|
20
20
|
const debug = debugLib('bitgo:v1:txb');
|
|
21
21
|
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
22
|
+
const verifyAddress_1 = require("./verifyAddress");
|
|
22
23
|
//
|
|
23
24
|
// TransactionBuilder
|
|
24
25
|
// @params:
|
|
@@ -146,10 +147,7 @@ exports.createTransaction = function (params) {
|
|
|
146
147
|
let totalOutputAmount = 0;
|
|
147
148
|
recipients.forEach(function (recipient) {
|
|
148
149
|
if (_.isString(recipient.address)) {
|
|
149
|
-
|
|
150
|
-
utxolib.address.fromBase58Check(recipient.address, network);
|
|
151
|
-
}
|
|
152
|
-
catch (e) {
|
|
150
|
+
if (!(0, verifyAddress_1.verifyAddress)(recipient.address, network)) {
|
|
153
151
|
throw new Error('invalid bitcoin address: ' + recipient.address);
|
|
154
152
|
}
|
|
155
153
|
if (!!recipient.script) {
|
|
@@ -901,4 +899,4 @@ exports.signTransaction = function (params) {
|
|
|
901
899
|
transactionHex: partialTransaction.toHex(),
|
|
902
900
|
});
|
|
903
901
|
};
|
|
904
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBRUg7R0FDRztBQUNILEVBQUU7QUFDRixxQkFBcUI7QUFDckIsa0RBQWtEO0FBQ2xELEVBQUU7QUFDRixvREFBb0Q7QUFDcEQsRUFBRTtBQUVGLDhDQUF3QztBQUN4QyxxQ0FBcUM7QUFDckMsMkNBQTJDO0FBQzNDLDRCQUE0QjtBQUM1Qiw4Q0FBK0M7QUFDL0Msa0NBQW1DO0FBQ25DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN2Qyw4Q0FBMEY7QUF1QjFGLEVBQUU7QUFDRixxQkFBcUI7QUFDckIsV0FBVztBQUNYLDBDQUEwQztBQUMxQyw4TUFBOE07QUFDOU0sc0dBQXNHO0FBQ3RHLGtJQUFrSTtBQUNsSSw2SEFBNkg7QUFDN0gsdUdBQXVHO0FBQ3ZHLCtFQUErRTtBQUMvRSxxRUFBcUU7QUFDckUsNkVBQTZFO0FBQzdFLHdHQUF3RztBQUN4RyxpSUFBaUk7QUFDakksd0lBQXdJO0FBQ3hJLDRJQUE0STtBQUM1SSx1RUFBdUU7QUFDdkUsMkVBQTJFO0FBQzNFLDRGQUE0RjtBQUM1RixPQUFPLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxNQUFNO0lBQzFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDeEUsSUFBSSxVQUFVLEdBQTZFLEVBQUUsQ0FBQztJQUM5RixJQUFJLFNBQVMsR0FBMEMsRUFBRSxDQUFDO0lBQzFELElBQUksa0JBQWtCLEdBQWEsRUFBRSxDQUFDO0lBQ3RDLElB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TSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtnQkFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO2FBQ2pGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUVELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUN0QixjQUFjLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFO0tBQzNDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5cbi8qKlxuICovXG4vL1xuLy8gVHJhbnNhY3Rpb25CdWlsZGVyXG4vLyBBIHV0aWxpdHkgZm9yIGJ1aWxkaW5nIGFuZCBzaWduaW5nIHRyYW5zYWN0aW9uc1xuLy9cbi8vIENvcHlyaWdodCAyMDE0LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5cbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIEJsdWViaXJkIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5pbXBvcnQgZGVidWdMaWIgPSByZXF1aXJlKCdkZWJ1ZycpO1xuY29uc3QgZGVidWcgPSBkZWJ1Z0xpYignYml0Z286djE6dHhiJyk7XG5pbXBvcnQgeyBjb21tb24sIGdldEFkZHJlc3NQMlBLSCwgZ2V0TmV0d29yaywgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW50ZXJmYWNlIEJhc2VPdXRwdXQge1xuICBhbW91bnQ6IG51bWJlcjtcbiAgdHJhdmVsSW5mbz86IGFueTtcbn1cblxuaW50ZXJmYWNlIEFkZHJlc3NPdXRwdXQgZXh0ZW5kcyBCYXNlT3V0cHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2NyaXB0T3V0cHV0IGV4dGVuZHMgQmFzZU91dHB1dCB7XG4gIHNjcmlwdDogQnVmZmVyO1xufVxuXG50eXBlIE91dHB1dCA9IEFkZHJlc3NPdXRwdXQgfCBTY3JpcHRPdXRwdXQ7XG5cbmludGVyZmFjZSBCaXRHb1Vuc3BlbnQge1xuICB2YWx1ZTogbnVtYmVyO1xuICB0eF9oYXNoOiBCdWZmZXI7XG4gIHR4X291dHB1dF9uOiBudW1iZXI7XG59XG5cbi8vXG4vLyBUcmFuc2FjdGlvbkJ1aWxkZXJcbi8vIEBwYXJhbXM6XG4vLyAgIHdhbGxldDogIGEgd2FsbGV0IG9iamVjdCB0byBzZW5kIGZyb21cbi8vICAgcmVjaXBpZW50czogYXJyYXkgb2YgcmVjaXBpZW50IG9iamVjdHMgYW5kIHRoZSBhbW91bnQgdG8gc2VuZCB0byBlYWNoIGUuZy4gW3thZGRyZXNzOiAnMzhCS0ROWmJQY0xvZ3ZWYmN4MmVrSjlFNlZ2OTREcURxdycsIGFtb3VudDogMTUwMH0sIHthZGRyZXNzOiAnMzZlTDh5UXFDbjFITVJtVkZGbzQ5dDJQSjNwYWk4d1FhbScsIGFtb3VudDogMjAwMH1dXG4vLyAgIGZlZTogdGhlIGZlZSB0byB1c2Ugd2l0aCB0aGlzIHRyYW5zYWN0aW9uLiAgaWYgbm90IHByb3ZpZGVkLCBhIGRlZmF1bHQsIG1pbmltdW0gZmVlIHdpbGwgYmUgdXNlZC5cbi8vICAgZmVlUmF0ZTogdGhlIGFtb3VudCBvZiBmZWUgcGVyIGtpbG9ieXRlIC0gb3B0aW9uYWwgLSBzcGVjaWZ5IGVpdGhlciBmZWUsIGZlZVJhdGUsIG9yIGZlZVR4Q29uZmlybVRhcmdldCBidXQgbm90IG1vcmUgdGhhbiBvbmVcbi8vICAgZmVlVHhDb25maXJtVGFyZ2V0OiBjYWxjdWxhdGUgdGhlIGZlZXMgcGVyIGtpbG9ieXRlIHN1Y2ggdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb25maXJtZWQgaW4gdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4vLyAgIG1heEZlZVJhdGU6IFRoZSBtYXhpbXVtIGZlZSBwZXIga2IgdG8gdXNlIGluIHNhdG9zaGlzLCBmb3Igc2FmZXR5IHB1cnBvc2VzIHdoZW4gdXNpbmcgZHluYW1pYyBmZWVzXG4vLyAgIG1pbkNvbmZpcm1zOiB0aGUgbWluaW11bSBjb25maXJtYXRpb25zIGFuIG91dHB1dCBtdXN0IGhhdmUgYmVmb3JlIHNwZW5kaW5nXG4vLyAgIGZvcmNlQ2hhbmdlQXRFbmQ6IGZvcmNlIHRoZSBjaGFuZ2UgYWRkcmVzcyB0byBiZSB0aGUgbGFzdCBvdXRwdXRcbi8vICAgY2hhbmdlQWRkcmVzczogc3BlY2lmeSB0aGUgY2hhbmdlIGFkZHJlc3MgcmF0aGVyIHRoYW4gZ2VuZXJhdGUgYSBuZXcgb25lXG4vLyAgIG5vU3BsaXRDaGFuZ2U6IHNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuLy8gICB0YXJnZXRXYWxsZXRVbnNwZW50czogc3BlY2lmeSBhIG51bWJlciBvZiB0YXJnZXQgdW5zcGVudHMgdG8gbWFpbnRhaW4gaW4gdGhlIHdhbGxldCAoY3VycmVudGx5IGRlZmF1bHRlZCB0byA4IGJ5IHRoZSBzZXJ2ZXIpXG4vLyAgIHZhbGlkYXRlOiBleHRyYSB2ZXJpZmljYXRpb24gb2YgdGhlIGNoYW5nZSBhZGRyZXNzZXMsIHdoaWNoIGlzIGFsd2F5cyBkb25lIHNlcnZlci1zaWRlIGFuZCBpcyByZWR1bmRhbnQgY2xpZW50LXNpZGUgKGRlZmF1bHRzIHRydWUpXG4vLyAgIG1pblVuc3BlbnRTaXplOiBUaGUgbWluaW11bSBzaXplIGluIHNhdG9zaGlzIG9mIHVuc3BlbnQgdG8gdXNlICh0byBwcmV2ZW50IHNwZW5kaW5nIHVuc3BlbnRzIHdvcnRoIGxlc3MgdGhhbiBmZWUgYWRkZWQpLiBEZWZhdWx0cyB0byAwLlxuLy8gICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzOiBVc2UgdGhpcyBzaW5nbGUga2V5IGFkZHJlc3MgdG8gcGF5IGZlZXNcbi8vICAgZmVlU2luZ2xlS2V5V0lGOiBVc2UgdGhlIGFkZHJlc3MgYmFzZWQgb24gdGhpcyBwcml2YXRlIGtleSB0byBwYXkgZmVlc1xuLy8gICB1bnNwZW50c0ZldGNoUGFyYW1zOiBFeHRyYSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgZmV0Y2hpbmcgdW5zcGVudHMgZm9yIHRoaXMgdHJhbnNhY3Rpb25cbmV4cG9ydHMuY3JlYXRlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGNvbnN0IG1pbkNvbmZpcm1zID0gcGFyYW1zLm1pbkNvbmZpcm1zIHx8IDA7XG4gIGNvbnN0IHZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuICBsZXQgcmVjaXBpZW50czogeyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogbnVtYmVyOyBzY3JpcHQ/OiBzdHJpbmc7IHRyYXZlbEluZm8/OiBhbnkgfVtdID0gW107XG4gIGxldCBvcFJldHVybnM6IHsgbWVzc2FnZTogc3RyaW5nOyBhbW91bnQ6IG51bWJlciB9W10gPSBbXTtcbiAgbGV0IGV4dHJhQ2hhbmdlQW1vdW50czogbnVtYmVyW10gPSBbXTtcbiAgbGV0IGVzdFR4U2l6ZTogbnVtYmVyO1xuICBsZXQgdHJhdmVsSW5mb3M7XG5cbiAgLy8gU2FuaXR5IGNoZWNrIHRoZSBhcmd1bWVudHMgcGFzc2VkIGluXG4gIGlmIChcbiAgICAhXy5pc09iamVjdChwYXJhbXMud2FsbGV0KSB8fFxuICAgIChwYXJhbXMuZmVlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWUpKSB8fFxuICAgIChwYXJhbXMuZmVlUmF0ZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlUmF0ZSkpIHx8XG4gICAgIV8uaXNJbnRlZ2VyKG1pbkNvbmZpcm1zKSB8fFxuICAgIChwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmZvcmNlQ2hhbmdlQXRFbmQpKSB8fFxuICAgIChwYXJhbXMuY2hhbmdlQWRkcmVzcyAmJiAhXy5pc1N0cmluZyhwYXJhbXMuY2hhbmdlQWRkcmVzcykpIHx8XG4gICAgKHBhcmFtcy5ub1NwbGl0Q2hhbmdlICYmICFfLmlzQm9vbGVhbihwYXJhbXMubm9TcGxpdENoYW5nZSkpIHx8XG4gICAgKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAmJiAhXy5pc0ludGVnZXIocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzKSkgfHxcbiAgICAodmFsaWRhdGUgJiYgIV8uaXNCb29sZWFuKHZhbGlkYXRlKSkgfHxcbiAgICAocGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSkpIHx8XG4gICAgKHBhcmFtcy5taW5VbnNwZW50U2l6ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWluVW5zcGVudFNpemUpKSB8fFxuICAgIChwYXJhbXMubWF4RmVlUmF0ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWF4RmVlUmF0ZSkpIHx8XG4gICAgLy8gdGhpcyBzaG91bGQgYmUgYW4gYXJyYXkgYW5kIGl0cyBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAxXG4gICAgKHBhcmFtcy51bnNwZW50cyAmJiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnVuc3BlbnRzKSB8fCBwYXJhbXMudW5zcGVudHMubGVuZ3RoIDwgMSkpIHx8XG4gICAgKHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQpKSB8fFxuICAgIChwYXJhbXMuaW5zdGFudCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB8fFxuICAgIChwYXJhbXMuYml0Z29GZWUgJiYgIV8uaXNPYmplY3QocGFyYW1zLmJpdGdvRmVlKSkgfHxcbiAgICAocGFyYW1zLnVuc3BlbnRzRmV0Y2hQYXJhbXMgJiYgIV8uaXNPYmplY3QocGFyYW1zLnVuc3BlbnRzRmV0Y2hQYXJhbXMpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgfVxuXG4gIGNvbnN0IGJpdGdvID0gcGFyYW1zLndhbGxldC5iaXRnbztcbiAgY29uc3QgY29uc3RhbnRzID0gYml0Z28uZ2V0Q29uc3RhbnRzKCk7XG4gIGNvbnN0IG5ldHdvcmsgPSBnZXROZXR3b3JrKGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldLm5ldHdvcmspO1xuXG4gIC8vIFRoZSB1c2VyIGNhbiBzcGVjaWZ5IGEgc2VwZXJhdGUsIHNpbmdsZS1rZXkgd2FsbGV0IGZvciB0aGUgcHVycG9zZXMgb2YgcGF5aW5nIG1pbmVyJ3MgZmVlc1xuICAvLyBXaGVuIGNyZWF0aW5nIGEgdHJhbnNhY3Rpb24gdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGFzIGFuIGlucHV0IGFkZHJlc3Mgb3IgdGhlIHByaXZhdGUga2V5IGluIFdJRlxuICBsZXQgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcztcbiAgbGV0IGZlZVNpbmdsZUtleUlucHV0QW1vdW50ID0gMDtcbiAgaWYgKHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHV0eG9saWIuYWRkcmVzcy5mcm9tQmFzZTU4Q2hlY2socGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA9IHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiaXRjb2luIGFkZHJlc3M6ICcgKyBwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcmFtcy5mZWVTaW5nbGVLZXlXSUYpIHtcbiAgICBjb25zdCBmZWVTaW5nbGVLZXkgPSB1dHhvbGliLkVDUGFpci5mcm9tV0lGKHBhcmFtcy5mZWVTaW5nbGVLZXlXSUYsIG5ldHdvcmsgYXMgdXR4b2xpYi5CaXRjb2luSlNOZXR3b3JrKTtcbiAgICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID0gZ2V0QWRkcmVzc1AyUEtIKGZlZVNpbmdsZUtleSk7XG4gICAgLy8gSWYgdGhlIHVzZXIgc3BlY2lmaWVzIGJvdGgsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyBjb3JyZXNwb25kcyB0byB0aGUgYWRkcmVzcyBvZiBmZWVTaW5nbGVLZXlXSUZcbiAgICBpZiAocGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgJiYgcGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgIT09IGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2ZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3M6ICcgK1xuICAgICAgICAgIHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzICtcbiAgICAgICAgICAnIGRpZCBub3QgY29ycmVzcG9uZCB0byBhZGRyZXNzIG9mIGZlZVNpbmdsZUtleVdJRjogJyArXG4gICAgICAgICAgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZWNpcGllbnRzIG11c3QgYmUgYXJyYXkgb2YgeyBhZGRyZXNzOiBhYmMsIGFtb3VudDogMTAwMDAwIH0gb2JqZWN0cycpO1xuICB9XG5cbiAgbGV0IGZlZVBhcmFtc0RlZmluZWQgPSAwO1xuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZSkpIHtcbiAgICBmZWVQYXJhbXNEZWZpbmVkKys7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgZmVlUGFyYW1zRGVmaW5lZCsrO1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQpKSB7XG4gICAgZmVlUGFyYW1zRGVmaW5lZCsrO1xuICB9XG5cbiAgaWYgKGZlZVBhcmFtc0RlZmluZWQgPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIG9mIGZlZSwgZmVlUmF0ZSBhbmQgZmVlVHhDb25maXJtVGFyZ2V0Jyk7XG4gIH1cblxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMubWF4RmVlUmF0ZSkpIHtcbiAgICBwYXJhbXMubWF4RmVlUmF0ZSA9IGNvbnN0YW50cy5tYXhGZWVSYXRlO1xuICB9XG5cbiAgLy8gQ29udmVydCB0aGUgb2xkIGZvcm1hdCBvZiBwYXJhbXMucmVjaXBpZW50cyAoZGljdGlvbmFyeSBvZiBhZGRyZXNzOmFtb3VudCkgdG8gbmV3IGZvcm1hdDogeyBkZXN0aW5hdGlvbkFkZHJlc3MsIGFtb3VudCB9XG4gIGlmICghKHBhcmFtcy5yZWNpcGllbnRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgcmVjaXBpZW50cyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKHBhcmFtcy5yZWNpcGllbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChkZXN0aW5hdGlvbkFkZHJlc3MpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9IHBhcmFtcy5yZWNpcGllbnRzW2Rlc3RpbmF0aW9uQWRkcmVzc107XG4gICAgICByZWNpcGllbnRzLnB1c2goeyBhZGRyZXNzOiBkZXN0aW5hdGlvbkFkZHJlc3MsIGFtb3VudDogYW1vdW50IH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJlY2lwaWVudHMgPSBwYXJhbXMucmVjaXBpZW50cztcbiAgfVxuXG4gIGlmIChwYXJhbXMub3BSZXR1cm5zKSB7XG4gICAgaWYgKCEocGFyYW1zLm9wUmV0dXJucyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgb3BSZXR1cm5zID0gW107XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMub3BSZXR1cm5zKS5mb3JFYWNoKGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IHBhcmFtcy5vcFJldHVybnNbbWVzc2FnZV07XG4gICAgICAgIG9wUmV0dXJucy5wdXNoKHsgbWVzc2FnZSwgYW1vdW50IH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wUmV0dXJucyA9IHBhcmFtcy5vcFJldHVybnM7XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlY2lwaWVudHMubGVuZ3RoID09PSAwICYmIG9wUmV0dXJucy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcmVjaXBpZW50Jyk7XG4gIH1cblxuICBsZXQgZmVlID0gcGFyYW1zLmZlZTtcbiAgbGV0IGZlZVJhdGUgPSBwYXJhbXMuZmVlUmF0ZTtcblxuICAvLyBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGNsYXNzIHdpbGwgY29tcHV0ZSB0aGUgZmVlXG4gIGNvbnN0IHNob3VsZENvbXB1dGVCZXN0RmVlID0gXy5pc1VuZGVmaW5lZChmZWUpO1xuXG4gIGxldCB0b3RhbE91dHB1dEFtb3VudCA9IDA7XG5cbiAgcmVjaXBpZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICBpZiAoXy5pc1N0cmluZyhyZWNpcGllbnQuYWRkcmVzcykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHV0eG9saWIuYWRkcmVzcy5mcm9tQmFzZTU4Q2hlY2socmVjaXBpZW50LmFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcmVjaXBpZW50LnNjcmlwdCkge1xuICAgICAgICAvLyBBIHNjcmlwdCB3YXMgcHJvdmlkZWQgYXMgd2VsbCAtIHZhbGlkYXRlIHRoYXQgdGhlIGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gdGhhdFxuICAgICAgICBpZiAodXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY2lwaWVudC5hZGRyZXNzLCBuZXR3b3JrKS50b1N0cmluZygnaGV4JykgIT09IHJlY2lwaWVudC5zY3JpcHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnYm90aCBzY3JpcHQgYW5kIGFkZHJlc3MgcHJvdmlkZWQgYnV0IHRoZXkgZGlkIG5vdCBtYXRjaDogJyArIHJlY2lwaWVudC5hZGRyZXNzICsgJyAnICsgcmVjaXBpZW50LnNjcmlwdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFfLmlzSW50ZWdlcihyZWNpcGllbnQuYW1vdW50KSB8fCByZWNpcGllbnQuYW1vdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFtb3VudCBmb3IgJyArIHJlY2lwaWVudC5hZGRyZXNzICsgJzogJyArIHJlY2lwaWVudC5hbW91bnQpO1xuICAgIH1cbiAgICB0b3RhbE91dHB1dEFtb3VudCArPSByZWNpcGllbnQuYW1vdW50O1xuICB9KTtcblxuICBvcFJldHVybnMuZm9yRWFjaChmdW5jdGlvbiAob3BSZXR1cm4pIHtcbiAgICB0b3RhbE91dHB1dEFtb3VudCArPSBvcFJldHVybi5hbW91bnQ7XG4gIH0pO1xuXG4gIGxldCBiaXRnb0ZlZUluZm8gPSBwYXJhbXMuYml0Z29GZWU7XG4gIGlmIChiaXRnb0ZlZUluZm8gJiYgKCFfLmlzSW50ZWdlcihiaXRnb0ZlZUluZm8uYW1vdW50KSB8fCAhXy5pc1N0cmluZyhiaXRnb0ZlZUluZm8uYWRkcmVzcykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJpdGdvRmVlSW5mbycpO1xuICB9XG5cbiAgLy8gVGhlIHRvdGFsIGFtb3VudCBuZWVkZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGxldCB0b3RhbEFtb3VudCA9IHRvdGFsT3V0cHV0QW1vdW50ICsgKGZlZSB8fCAwKTtcblxuICAvLyBUaGUgbGlzdCBvZiB1bnNwZW50IHRyYW5zYWN0aW9ucyBiZWluZyB1c2VkIGluIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGxldCB1bnNwZW50cztcblxuICAvLyB0aGUgdG90YWwgbnVtYmVyIG9mIHVuc3BlbnRzIG9uIHRoaXMgd2FsbGV0XG4gIGxldCB0b3RhbFVuc3BlbnRzQ291bnQ7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB1bnNwZW50cyB3ZSBmZXRjaGVkIGZyb20gdGhlIHNlcnZlciwgYmVmb3JlIGZpbHRlcmluZ1xuICBsZXQgZmV0Y2hlZFVuc3BlbnRzQ291bnQ7XG5cbiAgLy8gVGhlIGxpc3Qgb2YgdW5zcGVudCB0cmFuc2FjdGlvbnMgYmVpbmcgdXNlZCB3aXRoIHplcm8tY29uZmlybWF0aW9uc1xuICBsZXQgemVyb0NvbmZVbnNwZW50VHhJZHM7XG5cbiAgLy8gVGhlIHN1bSBvZiB0aGUgaW5wdXQgdmFsdWVzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICBsZXQgaW5wdXRBbW91bnQ7XG5cbiAgbGV0IGNoYW5nZU91dHB1dHM6IE91dHB1dFtdID0gW107XG5cbiAgbGV0IGNvbnRhaW5zVW5jb21wcmVzc2VkUHVibGljS2V5cyA9IGZhbHNlO1xuXG4gIC8vIFRoZSB0cmFuc2FjdGlvbi5cbiAgbGV0IHRyYW5zYWN0aW9uID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGb3JOZXR3b3JrKG5ldHdvcmspO1xuXG4gIGNvbnN0IGdldEJpdEdvRmVlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGJpdGdvRmVlSW5mbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5nZXRCaXRHb0ZlZSh7IGFtb3VudDogdG90YWxPdXRwdXRBbW91bnQsIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50IH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5mZWUgPiAwKSB7XG4gICAgICAgICAgYml0Z29GZWVJbmZvID0ge1xuICAgICAgICAgICAgYW1vdW50OiByZXN1bHQuZmVlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGJpdGdvRmVlSW5mbyAmJiBiaXRnb0ZlZUluZm8uYW1vdW50ID4gMCkge1xuICAgICAgICB0b3RhbEFtb3VudCArPSBiaXRnb0ZlZUluZm8uYW1vdW50O1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGdldEJpdEdvRmVlQWRkcmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYml0Z29GZWVJbmZvLCBvciBhZGRyZXNzIGlzIGFscmVhZHkgc2V0LCBkb24ndCBnZXQgYSBuZXcgb25lXG4gICAgICBpZiAoIWJpdGdvRmVlSW5mbyB8fCBiaXRnb0ZlZUluZm8uYWRkcmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gYml0Z28uZ2V0Qml0R29GZWVBZGRyZXNzKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGJpdGdvRmVlSW5mby5hZGRyZXNzID0gcmVzdWx0LmFkZHJlc3M7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBHZXQgYSBkeW5hbWljIGZlZSBlc3RpbWF0ZSBmcm9tIHRoZSBCaXRHbyBzZXJ2ZXIgaWYgZmVlVHhDb25maXJtVGFyZ2V0XG4gIC8vIGlzIHNwZWNpZmllZCBvciBpZiBubyBmZWUtcmVsYXRlZCBwYXJhbXMgYXJlIHNwZWNpZmllZFxuICBjb25zdCBnZXREeW5hbWljRmVlUmF0ZUVzdGltYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IHx8ICFmZWVQYXJhbXNEZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYml0Z29cbiAgICAgICAgLmVzdGltYXRlRmVlKHtcbiAgICAgICAgICBudW1CbG9ja3M6IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQsXG4gICAgICAgICAgbWF4RmVlOiBwYXJhbXMubWF4RmVlUmF0ZSxcbiAgICAgICAgICBpbnB1dHM6IHplcm9Db25mVW5zcGVudFR4SWRzLFxuICAgICAgICAgIHR4U2l6ZTogZXN0VHhTaXplLFxuICAgICAgICAgIGNwZnBBd2FyZTogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZEZlZVJhdGUgPSByZXN1bHQuY3BmcEZlZVBlcktiO1xuICAgICAgICAgIGNvbnN0IG1pbmltdW0gPSBwYXJhbXMuaW5zdGFudFxuICAgICAgICAgICAgPyBNYXRoLm1heChjb25zdGFudHMubWluRmVlUmF0ZSwgY29uc3RhbnRzLm1pbkluc3RhbnRGZWVSYXRlKVxuICAgICAgICAgICAgOiBjb25zdGFudHMubWluRmVlUmF0ZTtcbiAgICAgICAgICAvLyA1IHNhdG9zaGlzIHBlciBieXRlXG4gICAgICAgICAgLy8gaXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIHBhZGRpbmcgb25seSBhcHBsaWVzIHdoZW4gdGhlIHRocmVzaG9sZCBpcyBjcm9zc2VkLCBidXQgbm90IHdoZW4gdGhlIGRlbHRhIGlzIGxlc3MgdGhhbiB0aGUgcGFkZGluZ1xuICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSA1MDAwO1xuICAgICAgICAgIGlmIChlc3RpbWF0ZWRGZWVSYXRlIDwgbWluaW11bSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIG5ldyBEYXRlKCkgK1xuICAgICAgICAgICAgICAgICc6IEVycm9yIHdoZW4gZXN0aW1hdGluZyBmZWUgZm9yIHNlbmQgZnJvbSAnICtcbiAgICAgICAgICAgICAgICBwYXJhbXMud2FsbGV0LmlkKCkgK1xuICAgICAgICAgICAgICAgICcsIGl0IHdhcyB0b28gbG93IC0gJyArXG4gICAgICAgICAgICAgICAgZXN0aW1hdGVkRmVlUmF0ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZlZVJhdGUgPSBtaW5pbXVtICsgcGFkZGluZztcbiAgICAgICAgICB9IGVsc2UgaWYgKGVzdGltYXRlZEZlZVJhdGUgPiBwYXJhbXMubWF4RmVlUmF0ZSkge1xuICAgICAgICAgICAgZmVlUmF0ZSA9IHBhcmFtcy5tYXhGZWVSYXRlIC0gcGFkZGluZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmVlUmF0ZSA9IGVzdGltYXRlZEZlZVJhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmZWVSYXRlO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAvLyBzYW5pdHkgY2hlY2sgZmFpbGVkIG9uIHR4IHNpemVcbiAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLm1lc3NhZ2UsICdpbnZhbGlkIHR4U2l6ZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVqZWN0KGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb3VsZG4ndCBlc3RpbWF0ZSB0aGUgZmVlLCBwcm9jZWVkIHVzaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICBmZWVSYXRlID0gY29uc3RhbnRzLmZhbGxiYWNrRmVlUmF0ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBlc3RpbWF0aW5nIGZlZSBmb3Igc2VuZCBmcm9tICcgKyBwYXJhbXMud2FsbGV0LmlkKCkgKyAnOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gR2V0IHRoZSB1bnNwZW50cyBmb3IgdGhlIHNlbmRpbmcgd2FsbGV0LlxuICBjb25zdCBnZXRVbnNwZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocGFyYW1zLnVuc3BlbnRzKSB7XG4gICAgICAvLyB3ZSBqdXN0IHdhbm5hIHVzZSBjdXN0b20gdW5zcGVudHNcbiAgICAgIHVuc3BlbnRzID0gcGFyYW1zLnVuc3BlbnRzO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCBlbm91Z2ggdW5zcGVudHMgZm9yIHRoZSByZXF1ZXN0ZWQgYW1vdW50XG4gICAgY29uc3Qgb3B0aW9ucyA9IF8ubWVyZ2Uoe30sIHBhcmFtcy51bnNwZW50c0ZldGNoUGFyYW1zIHx8IHt9LCB7XG4gICAgICB0YXJnZXQ6IHRvdGFsQW1vdW50LFxuICAgICAgbWluU2l6ZTogcGFyYW1zLm1pblVuc3BlbnRTaXplIHx8IDAsXG4gICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCwgLy8gaW5zaXN0IG9uIGluc3RhbnQgdW5zcGVudHMgb25seVxuICAgICAgdGFyZ2V0V2FsbGV0VW5zcGVudHM6IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyxcbiAgICB9KTtcbiAgICBpZiAocGFyYW1zLmluc3RhbnQpIHtcbiAgICAgIG9wdGlvbnMuaW5zdGFudCA9IHBhcmFtcy5pbnN0YW50OyAvLyBpbnNpc3Qgb24gaW5zdGFudCB1bnNwZW50cyBvbmx5XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcy53YWxsZXQudW5zcGVudHNQYWdlZChvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgVW5zcGVudHMgZmV0Y2hlZFxcbjogICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0cywgbnVsbCwgMil9YCk7XG4gICAgICB0b3RhbFVuc3BlbnRzQ291bnQgPSByZXN1bHRzLnRvdGFsO1xuICAgICAgZmV0Y2hlZFVuc3BlbnRzQ291bnQgPSByZXN1bHRzLmNvdW50O1xuICAgICAgdW5zcGVudHMgPSByZXN1bHRzLnVuc3BlbnRzLmZpbHRlcihmdW5jdGlvbiAodSkge1xuICAgICAgICBjb25zdCBjb25maXJtcyA9IHUuY29uZmlybWF0aW9ucyB8fCAwO1xuICAgICAgICBpZiAoIXBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgJiYgdS5pc0NoYW5nZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25maXJtcyA+PSBtaW5Db25maXJtcztcbiAgICAgIH0pO1xuXG4gICAgICAvLyBhYm9ydCBlYXJseSBpZiB0aGVyZSdzIG5vIHZpYWJsZSB1bnNwZW50cywgYmVjYXVzZSBpdCB3b24ndCBiZSBwb3NzaWJsZSB0byBjcmVhdGUgdGhlIHR4biBsYXRlclxuICAgICAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBFcnJvcignMCB1bnNwZW50cyBhdmFpbGFibGUgZm9yIHRyYW5zYWN0aW9uIGNyZWF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNyZWF0ZSBhcnJheSBvZiB1bmNvbmZpcm1lZCB1bnNwZW50IElEIHN0cmluZ3Mgb2YgdGhlIGZvcm0gXCJ0eEhhc2g6b3V0cHV0SW5kZXhcIlxuICAgICAgemVyb0NvbmZVbnNwZW50VHhJZHMgPSBfKHJlc3VsdHMudW5zcGVudHMpXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICByZXR1cm4gIXUuY29uZmlybWF0aW9ucztcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodSkge1xuICAgICAgICAgIHJldHVybiB1LnR4X2hhc2ggKyAnOicgKyB1LnR4X291dHB1dF9uO1xuICAgICAgICB9KVxuICAgICAgICAudmFsdWUoKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoemVyb0NvbmZVbnNwZW50VHhJZHMpKSB7XG4gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gcGFzcyBhbiBlbXB0eSBhcnJheSBvZiBpbnB1dHMgdG8gdGhlIHNlcnZlciwgYmVjYXVzZSBpdCBhc3N1bWVzIGlmIHRoZVxuICAgICAgICAvLyBpbnB1dHMgYXJndW1lbnRzIGV4aXN0cywgaXQgY29udGFpbnMgdmFsdWVzXG4gICAgICAgIHplcm9Db25mVW5zcGVudFR4SWRzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHJlc3BlY3QgdGhlIG9sZCBzcGxpdENoYW5nZVNpemU9MCBwYXJhbWV0ZXJcbiAgICAgIGlmICghcGFyYW1zLm5vU3BsaXRDaGFuZ2UgJiYgcGFyYW1zLnNwbGl0Q2hhbmdlU2l6ZSAhPT0gMCkge1xuICAgICAgICBleHRyYUNoYW5nZUFtb3VudHMgPSByZXN1bHRzLmV4dHJhQ2hhbmdlQW1vdW50cyB8fCBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBHZXQgdGhlIHVuc3BlbnRzIGZvciB0aGUgc2luZ2xlIGtleSBmZWUgYWRkcmVzc1xuICBsZXQgZmVlU2luZ2xlS2V5VW5zcGVudHM6IEJpdEdvVW5zcGVudFtdID0gW107XG4gIGNvbnN0IGdldFVuc3BlbnRzRm9yU2luZ2xlS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICBsZXQgZmVlVGFyZ2V0ID0gMC4wMWU4O1xuICAgICAgaWYgKHBhcmFtcy5pbnN0YW50KSB7XG4gICAgICAgIGZlZVRhcmdldCArPSB0b3RhbEFtb3VudCAqIDAuMDAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJpdGdvXG4gICAgICAgIC5nZXQoYml0Z28udXJsKCcvYWRkcmVzcy8nICsgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyArICcvdW5zcGVudHM/dGFyZ2V0PScgKyBmZWVUYXJnZXQpKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keS50b3RhbCA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHVuc3BlbnRzIGF2YWlsYWJsZSBpbiBzaW5nbGUga2V5IGZlZSBzb3VyY2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHMgPSByZXNwb25zZS5ib2R5LnVuc3BlbnRzO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgbGV0IG1pbmVyRmVlSW5mbzogYW55ID0ge307XG4gIGxldCB0eEluZm86IGFueSA9IHt9O1xuXG4gIC8vIEl0ZXJhdGUgdW5zcGVudHMsIHN1bSB0aGUgaW5wdXRzLCBhbmQgc2F2ZSBfaW5wdXRzIHdpdGggdGhlIHRvdGFsXG4gIC8vIGlucHV0IGFtb3VudCBhbmQgZmluYWwgbGlzdCBvZiBpbnB1dHMgdG8gdXNlIHdpdGggdGhlIHRyYW5zYWN0aW9uLlxuICBsZXQgZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkOiBCaXRHb1Vuc3BlbnRbXSA9IFtdO1xuXG4gIGNvbnN0IGNvbGxlY3RJbnB1dHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF1bnNwZW50cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gdW5zcGVudHMgYXZhaWxhYmxlIG9uIHdhbGxldCcpO1xuICAgIH1cbiAgICBpbnB1dEFtb3VudCA9IDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGNvc3Qgb2Ygc3BlbmRpbmcgYSBzaW5nbGUgaW5wdXQsIGkuZS4gdGhlIHNtYWxsZXN0IGVjb25vbWljYWwgdW5zcGVudCB2YWx1ZVxuICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpIHx8IF8uaXNOdW1iZXIocGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSkpIHtcbiAgICAgICAgcmV0dXJuICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSA/IHBhcmFtcy5mZWVSYXRlIDogcGFyYW1zLm9yaWdpbmFsRmVlUmF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBiaXRnb1xuICAgICAgICAgIC5lc3RpbWF0ZUZlZSh7XG4gICAgICAgICAgICBudW1CbG9ja3M6IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQsXG4gICAgICAgICAgICBtYXhGZWU6IHBhcmFtcy5tYXhGZWVSYXRlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZlZVJhdGVFc3RpbWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZlZVJhdGVFc3RpbWF0ZS5mZWVQZXJLYjtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGZlZVJhdGUpIHtcbiAgICAgICAgLy8gRG9uJ3Qgc3BlbmQgaW5wdXRzIHRoYXQgY2Fubm90IHBheSBmb3IgdGhlaXIgb3duIGNvc3QuXG4gICAgICAgIGxldCBtaW5JbnB1dFZhbHVlID0gMDtcbiAgICAgICAgaWYgKF8uaXNJbnRlZ2VyKHBhcmFtcy5taW5VbnNwZW50U2l6ZSkpIHtcbiAgICAgICAgICBtaW5JbnB1dFZhbHVlID0gcGFyYW1zLm1pblVuc3BlbnRTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBydW5lZFVuc3BlbnRDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVW5zcGVudENvdW50ID0gdW5zcGVudHMubGVuZ3RoO1xuICAgICAgICB1bnNwZW50cyA9IF8uZmlsdGVyKHVuc3BlbnRzLCBmdW5jdGlvbiAodW5zcGVudCkge1xuICAgICAgICAgIGNvbnN0IGlzU2Vnd2l0SW5wdXQgPSAhIXVuc3BlbnQud2l0bmVzc1NjcmlwdDtcbiAgICAgICAgICBjb25zdCBjdXJyZW50SW5wdXRTaXplID0gaXNTZWd3aXRJbnB1dCA/IFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSA6IFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemU7XG4gICAgICAgICAgY29uc3QgZmVlQmFzZWRNaW5JbnB1dFZhbHVlID0gKGZlZVJhdGUgKiBjdXJyZW50SW5wdXRTaXplKSAvIDEwMDA7XG4gICAgICAgICAgY29uc3QgY3VycmVudE1pbklucHV0VmFsdWUgPSBNYXRoLm1heChtaW5JbnB1dFZhbHVlLCBmZWVCYXNlZE1pbklucHV0VmFsdWUpO1xuICAgICAgICAgIGlmIChjdXJyZW50TWluSW5wdXRWYWx1ZSA+IHVuc3BlbnQudmFsdWUpIHtcbiAgICAgICAgICAgIC8vIHBydW5pbmcgdW5zcGVudFxuICAgICAgICAgICAgY29uc3QgcHJ1bmVEZXRhaWxzID0ge1xuICAgICAgICAgICAgICBnZW5lcmFsTWluSW5wdXRWYWx1ZTogbWluSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgZmVlQmFzZWRNaW5JbnB1dFZhbHVlLFxuICAgICAgICAgICAgICBjdXJyZW50TWluSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgZmVlUmF0ZSxcbiAgICAgICAgICAgICAgaW5wdXRTaXplOiBjdXJyZW50SW5wdXRTaXplLFxuICAgICAgICAgICAgICB1bnNwZW50OiB1bnNwZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBwcnVuaW5nIHVuc3BlbnQ6ICR7SlNPTi5zdHJpbmdpZnkocHJ1bmVEZXRhaWxzLCBudWxsLCA0KX1gKTtcbiAgICAgICAgICAgIHBydW5lZFVuc3BlbnRDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBydW5lZFVuc3BlbnRDb3VudCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgcHJ1bmVkICR7cHJ1bmVkVW5zcGVudENvdW50fSBvdXQgb2YgJHtvcmlnaW5hbFVuc3BlbnRDb3VudH0gdW5zcGVudHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luc3VmZmljaWVudCBmdW5kcycpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZWd3aXRJbnB1dENvdW50ID0gMDtcbiAgICAgICAgdW5zcGVudHMuZXZlcnkoZnVuY3Rpb24gKHVuc3BlbnQpIHtcbiAgICAgICAgICBpZiAodW5zcGVudC53aXRuZXNzU2NyaXB0KSB7XG4gICAgICAgICAgICBzZWd3aXRJbnB1dENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlucHV0QW1vdW50ICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uYWRkSW5wdXQodW5zcGVudC50eF9oYXNoLCB1bnNwZW50LnR4X291dHB1dF9uLCAweGZmZmZmZmZmKTtcblxuICAgICAgICAgIHJldHVybiBpbnB1dEFtb3VudCA8IChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID8gdG90YWxPdXRwdXRBbW91bnQgOiB0b3RhbEFtb3VudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIHBheWluZyBmZWVzIGZyb20gYW4gZXh0ZXJuYWwgc2luZ2xlIGtleSB3YWxsZXQsIGFkZCB0aGUgaW5wdXRzXG4gICAgICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICAgICAgLy8gY29sbGVjdCB0aGUgYW1vdW50IHVzZWQgaW4gdGhlIGZlZSBpbnB1dHMgc28gd2UgY2FuIGdldCBjaGFuZ2UgbGF0ZXJcbiAgICAgICAgICBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCA9IDA7XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkID0gW107XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHMuZXZlcnkoZnVuY3Rpb24gKHVuc3BlbnQpIHtcbiAgICAgICAgICAgIGZlZVNpbmdsZUtleUlucHV0QW1vdW50ICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgICAgICBpbnB1dEFtb3VudCArPSB1bnNwZW50LnZhbHVlO1xuICAgICAgICAgICAgdHJhbnNhY3Rpb24uYWRkSW5wdXQodW5zcGVudC50eF9oYXNoLCB1bnNwZW50LnR4X291dHB1dF9uKTtcbiAgICAgICAgICAgIGZlZVNpbmdsZUtleVVuc3BlbnRzVXNlZC5wdXNoKHVuc3BlbnQpO1xuICAgICAgICAgICAgLy8gdXNlIHRoZSBmZWUgd2FsbGV0IHRvIHBheSBtaW5lciBmZWVzIGFuZCBwb3RlbnRpYWxseSBpbnN0YW50IGZlZXNcbiAgICAgICAgICAgIHJldHVybiBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCA8IGZlZSArIChiaXRnb0ZlZUluZm8gPyBiaXRnb0ZlZUluZm8uYW1vdW50IDogMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0eEluZm8gPSB7XG4gICAgICAgICAgblAyc2hJbnB1dHM6IHRyYW5zYWN0aW9uLnR4Lmlucy5sZW5ndGggLSAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IDEgOiAwKSAtIHNlZ3dpdElucHV0Q291bnQsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogc2Vnd2l0SW5wdXRDb3VudCxcbiAgICAgICAgICBuUDJwa2hJbnB1dHM6IGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPyAxIDogMCxcbiAgICAgICAgICAvLyBhZGQgc2luZ2xlIGtleSBzb3VyY2UgYWRkcmVzcyBjaGFuZ2VcbiAgICAgICAgICBuT3V0cHV0czpcbiAgICAgICAgICAgIHJlY2lwaWVudHMubGVuZ3RoICtcbiAgICAgICAgICAgIDEgKyAvLyByZWNpcGllbnRzIGFuZCBjaGFuZ2VcbiAgICAgICAgICAgIGV4dHJhQ2hhbmdlQW1vdW50cy5sZW5ndGggKyAvLyBleHRyYSBjaGFuZ2Ugc3BsaXR0aW5nXG4gICAgICAgICAgICAoYml0Z29GZWVJbmZvICYmIGJpdGdvRmVlSW5mby5hbW91bnQgPiAwID8gMSA6IDApICsgLy8gYWRkIG91dHB1dCBmb3IgYml0Z28gZmVlXG4gICAgICAgICAgICAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IDEgOiAwKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBBcyBwZXIgdGhlIHJlc3BvbnNlIG9mIGdldCB1bnNwZW50cyBBUEksIGZvciB2MSBzYWZlIHdhbGxldHMgcmVkZWVtU2NyaXB0IGlzIHJldHVybmVkXG4gICAgICAgIC8vIGluIHRoZSByZXNwb25zZSBpbiBoZXggZm9ybWF0XG4gICAgICAgIGNvbnRhaW5zVW5jb21wcmVzc2VkUHVibGljS2V5cyA9IHVuc3BlbnRzLnNvbWUoXG4gICAgICAgICAgKHUpID0+IHUucmVkZWVtU2NyaXB0Lmxlbmd0aCA9PT0gMjAxICogMiAvKiBoZXggbGVuZ3RoIGlzIHR3aWNlIHRoZSBsZW5ndGggaW4gYnl0ZXMgKi9cbiAgICAgICAgKTtcblxuICAgICAgICBlc3RUeFNpemUgPSBlc3RpbWF0ZVRyYW5zYWN0aW9uU2l6ZSh7XG4gICAgICAgICAgY29udGFpbnNVbmNvbXByZXNzZWRQdWJsaWNLZXlzLFxuICAgICAgICAgIG5QMnNoSW5wdXRzOiB0eEluZm8ublAyc2hJbnB1dHMsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogdHhJbmZvLm5QMnNoUDJ3c2hJbnB1dHMsXG4gICAgICAgICAgblAycGtoSW5wdXRzOiB0eEluZm8ublAycGtoSW5wdXRzLFxuICAgICAgICAgIG5PdXRwdXRzOiB0eEluZm8ubk91dHB1dHMsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKGdldER5bmFtaWNGZWVSYXRlRXN0aW1hdGUpXG4gICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1pbmVyRmVlSW5mbyA9IGV4cG9ydHMuY2FsY3VsYXRlTWluZXJGZWVJbmZvKHtcbiAgICAgICAgICBiaXRnbzogcGFyYW1zLndhbGxldC5iaXRnbyxcbiAgICAgICAgICBjb250YWluc1VuY29tcHJlc3NlZFB1YmxpY0tleXMsXG4gICAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgICBuUDJzaElucHV0czogdHhJbmZvLm5QMnNoSW5wdXRzLFxuICAgICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IHR4SW5mby5uUDJzaFAyd3NoSW5wdXRzLFxuICAgICAgICAgIG5QMnBraElucHV0czogdHhJbmZvLm5QMnBraElucHV0cyxcbiAgICAgICAgICBuT3V0cHV0czogdHhJbmZvLm5PdXRwdXRzLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2hvdWxkQ29tcHV0ZUJlc3RGZWUpIHtcbiAgICAgICAgICBjb25zdCBhcHByb3hpbWF0ZUZlZSA9IG1pbmVyRmVlSW5mby5mZWU7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkUmVjdXJzZSA9IF8uaXNVbmRlZmluZWQoZmVlKSB8fCBhcHByb3hpbWF0ZUZlZSA+IGZlZTtcbiAgICAgICAgICBmZWUgPSBhcHByb3hpbWF0ZUZlZTtcbiAgICAgICAgICAvLyBSZWNvbXB1dGUgdG90YWxBbW91bnQgZnJvbSBzY3JhdGNoXG4gICAgICAgICAgdG90YWxBbW91bnQgPSBmZWUgKyB0b3RhbE91dHB1dEFtb3VudDtcbiAgICAgICAgICBpZiAoYml0Z29GZWVJbmZvKSB7XG4gICAgICAgICAgICB0b3RhbEFtb3VudCArPSBiaXRnb0ZlZUluZm8uYW1vdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdWxkUmVjdXJzZSkge1xuICAgICAgICAgICAgLy8gaWYgZmVlIGNoYW5nZWQsIHJlLWNvbGxlY3QgaW5wdXRzXG4gICAgICAgICAgICBpbnB1dEFtb3VudCA9IDA7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbiA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25CdWlsZGVyRm9yTmV0d29yayhuZXR3b3JrKTtcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0SW5wdXRzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxGZWUgPSBmZWUgKyAoYml0Z29GZWVJbmZvID8gYml0Z29GZWVJbmZvLmFtb3VudCA6IDApO1xuXG4gICAgICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICAgICAgY29uc3Qgc3VtbWVkU2luZ2xlS2V5VW5zcGVudHMgPSBfLnN1bUJ5KGZlZVNpbmdsZUtleVVuc3BlbnRzLCAndmFsdWUnKTtcbiAgICAgICAgICBpZiAodG90YWxGZWUgPiBzdW1tZWRTaW5nbGVLZXlVbnNwZW50cykge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBhbnkgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdJbnN1ZmZpY2llbnQgZmVlIGFtb3VudCBhdmFpbGFibGUgaW4gc2luZ2xlIGtleSBmZWUgc291cmNlOiAnICsgc3VtbWVkU2luZ2xlS2V5VW5zcGVudHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIucmVzdWx0ID0ge1xuICAgICAgICAgICAgICBmZWU6IGZlZSxcbiAgICAgICAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgICAgICAgZXN0aW1hdGVkU2l6ZTogbWluZXJGZWVJbmZvLnNpemUsXG4gICAgICAgICAgICAgIGF2YWlsYWJsZTogaW5wdXRBbW91bnQsXG4gICAgICAgICAgICAgIGJpdGdvRmVlOiBiaXRnb0ZlZUluZm8sXG4gICAgICAgICAgICAgIHR4SW5mbzogdHhJbmZvLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBCbHVlYmlyZC5yZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5wdXRBbW91bnQgPCAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IHRvdGFsT3V0cHV0QW1vdW50IDogdG90YWxBbW91bnQpKSB7XG4gICAgICAgICAgLy8gVGhlIHVuc3BlbnRzIHdlJ3JlIHVzaW5nIGZvciBpbnB1dHMgZG8gbm90IGhhdmUgc3VmZmljaWVudCB2YWx1ZSBvbiB0aGVtIHRvXG4gICAgICAgICAgLy8gc2F0aXNmeSB0aGUgdXNlcidzIHJlcXVlc3RlZCBzcGVuZCBhbW91bnQuIFRoYXQgbWF5IGJlIGJlY2F1c2UgdGhlIHdhbGxldCdzIGJhbGFuY2VcbiAgICAgICAgICAvLyBpcyBzaW1wbHkgdG9vIGxvdywgb3IgaXQgbWlnaHQgYmUgdGhhdCB0aGUgd2FsbGV0J3MgYmFsYW5jZSBpcyBzdWZmaWNpZW50IGJ1dFxuICAgICAgICAgIC8vIHdlIGRpZG4ndCBmZXRjaCBlbm91Z2ggdW5zcGVudHMuIFRvbyBmZXcgdW5zcGVudHMgY291bGQgcmVzdWx0IGZyb20gdGhlIHdhbGxldFxuICAgICAgICAgIC8vIGhhdmluZyBtYW55IHNtYWxsIHVuc3BlbnRzIGFuZCB3ZSBoaXQgb3VyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgaW5wdXRzIHdlIGNhbiB1c2VcbiAgICAgICAgICAvLyBpbiBhIHR4biwgb3IgaXQgbWlnaHQgaGF2ZSBiZWVuIHRoYXQgdGhlIGZpbHRlcnMgdGhlIHVzZXIgcGFzc2VkIGluIChsaWtlIG1pbkNvbmZpcm1zKVxuICAgICAgICAgIC8vIGRpc3F1YWxpZmllZCB0b28gbWFueSBvZiB0aGUgdW5zcGVudHNcbiAgICAgICAgICBsZXQgZXJyO1xuICAgICAgICAgIGlmICh0b3RhbFVuc3BlbnRzQ291bnQgPT09IGZldGNoZWRVbnNwZW50c0NvdW50KSB7XG4gICAgICAgICAgICAvLyB3ZSBmZXRjaGVkIGV2ZXJ5IHVuc3BlbnQgdGhlIHdhbGxldCBoYWQsIGJ1dCBpdCBzdGlsbCB3YXNuJ3QgZW5vdWdoXG4gICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoJ0luc3VmZmljaWVudCBmdW5kcycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSB3ZXJlbid0IGFibGUgdG8gZmV0Y2ggYWxsIHRoZSB1bnNwZW50cyBvbiB0aGUgd2FsbGV0XG4gICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBUcmFuc2FjdGlvbiBzaXplIHRvbyBsYXJnZSBkdWUgdG8gdG9vIG1hbnkgdW5zcGVudHMuIENhbiBzZW5kIG9ubHkgJHtpbnB1dEFtb3VudH0gc2F0b3NoaXMgaW4gdGhpcyB0cmFuc2FjdGlvbmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVyci5yZXN1bHQgPSB7XG4gICAgICAgICAgICBmZWU6IGZlZSxcbiAgICAgICAgICAgIGZlZVJhdGU6IGZlZVJhdGUsXG4gICAgICAgICAgICBlc3RpbWF0ZWRTaXplOiBtaW5lckZlZUluZm8uc2l6ZSxcbiAgICAgICAgICAgIGF2YWlsYWJsZTogaW5wdXRBbW91bnQsXG4gICAgICAgICAgICBiaXRnb0ZlZTogYml0Z29GZWVJbmZvLFxuICAgICAgICAgICAgdHhJbmZvOiB0eEluZm8sXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9O1xuXG4gIC8vIEFkZCB0aGUgb3V0cHV0cyBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgY29uc3QgY29sbGVjdE91dHB1dHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1pbmVyRmVlSW5mby5zaXplID49IDkwMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYW5zYWN0aW9uIHRvbyBsYXJnZTogZXN0aW1hdGVkIHNpemUgJyArIG1pbmVyRmVlSW5mby5zaXplICsgJyBieXRlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHM6IE91dHB1dFtdID0gW107XG5cbiAgICByZWNpcGllbnRzLmZvckVhY2goZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgICAgbGV0IHNjcmlwdDtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgICBzY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQocmVjaXBpZW50LmFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHJlY2lwaWVudC5zY3JpcHQpKSB7XG4gICAgICAgIHNjcmlwdCA9IHJlY2lwaWVudC5zY3JpcHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25laXRoZXIgcmVjaXBpZW50IGFkZHJlc3Mgbm9yIHNjcmlwdCB3YXMgcHJvdmlkZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWRhdGUgdHJhdmVsSW5mbyBpZiBpdCBleGlzdHNcbiAgICAgIGxldCB0cmF2ZWxJbmZvO1xuICAgICAgaWYgKCFfLmlzRW1wdHkocmVjaXBpZW50LnRyYXZlbEluZm8pKSB7XG4gICAgICAgIHRyYXZlbEluZm8gPSByZWNpcGllbnQudHJhdmVsSW5mbztcbiAgICAgICAgLy8gQmV0dGVyIHRvIGF2b2lkIHRyb3VibGUgbm93LCBiZWZvcmUgdHggaXMgY3JlYXRlZFxuICAgICAgICBiaXRnby50cmF2ZWxSdWxlKCkudmFsaWRhdGVUcmF2ZWxJbmZvKHRyYXZlbEluZm8pO1xuICAgICAgfVxuXG4gICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICBzY3JpcHQ6IHNjcmlwdCxcbiAgICAgICAgYW1vdW50OiByZWNpcGllbnQuYW1vdW50LFxuICAgICAgICB0cmF2ZWxJbmZvOiB0cmF2ZWxJbmZvLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBvcFJldHVybnMuZm9yRWFjaChmdW5jdGlvbiAoeyBtZXNzYWdlLCBhbW91bnQgfSkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gdXR4b2xpYi5zY3JpcHQuZnJvbUFTTSgnT1BfUkVUVVJOICcgKyBCdWZmZXIuZnJvbShtZXNzYWdlKS50b1N0cmluZygnaGV4JykpO1xuICAgICAgb3V0cHV0cy5wdXNoKHsgc2NyaXB0LCBhbW91bnQgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBnZXRDaGFuZ2VPdXRwdXRzID0gZnVuY3Rpb24gKGNoYW5nZUFtb3VudDogbnVtYmVyKTogT3V0cHV0W10gfCBCbHVlYmlyZDxPdXRwdXRbXT4ge1xuICAgICAgaWYgKGNoYW5nZUFtb3VudCA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduZWdhdGl2ZSBjaGFuZ2UgYW1vdW50OiAnICsgY2hhbmdlQW1vdW50KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0OiBPdXRwdXRbXSA9IFtdO1xuICAgICAgLy8gaWYgd2UgcGFpZCBmZWVzIGZyb20gYSBzaW5nbGUga2V5IHdhbGxldCwgcmV0dXJuIHRoZSBmZWUgY2hhbmdlIGZpcnN0XG4gICAgICBpZiAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgICAgICBjb25zdCBmZWVTaW5nbGVLZXlXYWxsZXRDaGFuZ2VBbW91bnQgPVxuICAgICAgICAgIGZlZVNpbmdsZUtleUlucHV0QW1vdW50IC0gKGZlZSArIChiaXRnb0ZlZUluZm8gPyBiaXRnb0ZlZUluZm8uYW1vdW50IDogMCkpO1xuICAgICAgICBpZiAoZmVlU2luZ2xlS2V5V2FsbGV0Q2hhbmdlQW1vdW50ID49IGNvbnN0YW50cy5taW5PdXRwdXRTaXplKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goeyBhZGRyZXNzOiBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzLCBhbW91bnQ6IGZlZVNpbmdsZUtleVdhbGxldENoYW5nZUFtb3VudCB9KTtcbiAgICAgICAgICBjaGFuZ2VBbW91bnQgPSBjaGFuZ2VBbW91bnQgLSBmZWVTaW5nbGVLZXlXYWxsZXRDaGFuZ2VBbW91bnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZUFtb3VudCA8IGNvbnN0YW50cy5taW5PdXRwdXRTaXplKSB7XG4gICAgICAgIC8vIEdpdmUgaXQgdG8gdGhlIG1pbmVyc1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLndhbGxldC50eXBlKCkgPT09ICdzYWZlJykge1xuICAgICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5hZGRyZXNzZXMoKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHsgYWRkcmVzczogcmVzcG9uc2UuYWRkcmVzc2VzWzBdLmFkZHJlc3MsIGFtb3VudDogY2hhbmdlQW1vdW50IH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgZXh0cmFDaGFuZ2VUb3RhbCA9IF8uc3VtKGV4dHJhQ2hhbmdlQW1vdW50cyk7XG4gICAgICAvLyBTYW5pdHkgY2hlY2tcbiAgICAgIGlmIChleHRyYUNoYW5nZVRvdGFsID4gY2hhbmdlQW1vdW50KSB7XG4gICAgICAgIGV4dHJhQ2hhbmdlQW1vdW50cyA9IFtdO1xuICAgICAgICBleHRyYUNoYW5nZVRvdGFsID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gY29weSBhbmQgYWRkIHJlbWFpbmluZyBjaGFuZ2UgYW1vdW50XG4gICAgICBjb25zdCBhbGxDaGFuZ2VBbW91bnRzID0gZXh0cmFDaGFuZ2VBbW91bnRzLnNsaWNlKDApO1xuICAgICAgYWxsQ2hhbmdlQW1vdW50cy5wdXNoKGNoYW5nZUFtb3VudCAtIGV4dHJhQ2hhbmdlVG90YWwpO1xuXG4gICAgICAvLyBSZWN1cnNpdmUgYXN5bmMgZnVuYyB0byBhZGQgYWxsIGNoYW5nZSBvdXRwdXRzXG4gICAgICBjb25zdCBhZGRDaGFuZ2VPdXRwdXRzID0gZnVuY3Rpb24gKCk6IE91dHB1dFtdIHwgQmx1ZWJpcmQ8T3V0cHV0W10+IHtcbiAgICAgICAgY29uc3QgdGhpc0Ftb3VudCA9IGFsbENoYW5nZUFtb3VudHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCF0aGlzQW1vdW50KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocGFyYW1zLmNoYW5nZUFkZHJlc3MpIHtcbiAgICAgICAgICAgIC8vIElmIHVzZXIgcGFzc2VkIGEgY2hhbmdlIGFkZHJlc3MsIHVzZSBpdCBmb3IgYWxsIG91dHB1dHNcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXMuY2hhbmdlQWRkcmVzcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBhZGRyZXNzIHBlciBvdXRwdXQsIGZvciBwcml2YWN5XG4gICAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgc2Vnd2l0IG9yIG5vdFxuICAgICAgICAgICAgY29uc3QgY2hhbmdlQ2hhaW4gPSBwYXJhbXMud2FsbGV0LmdldENoYW5nZUNoYWluKHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluLCB2YWxpZGF0ZTogdmFsaWRhdGUgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuYWRkcmVzcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYWRkcmVzcykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHsgYWRkcmVzczogYWRkcmVzcywgYW1vdW50OiB0aGlzQW1vdW50IH0pO1xuICAgICAgICAgIHJldHVybiBhZGRDaGFuZ2VPdXRwdXRzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFkZENoYW5nZU91dHB1dHMoKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGNoYW5nZSBvdXRwdXQocykgYW5kIGluc3RhbnQgZmVlIG91dHB1dCBpZiBhcHBsaWNhYmxlXG4gICAgcmV0dXJuIEJsdWViaXJkLnRyeShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0Q2hhbmdlT3V0cHV0cyhpbnB1dEFtb3VudCAtIHRvdGFsQW1vdW50KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGNoYW5nZU91dHB1dHMgPSByZXN1bHQ7XG4gICAgICBjb25zdCBleHRyYU91dHB1dHMgPSBjaGFuZ2VPdXRwdXRzLmNvbmNhdChbXSk7IC8vIGNvcHkgdGhlIGFycmF5XG4gICAgICBpZiAoYml0Z29GZWVJbmZvICYmIGJpdGdvRmVlSW5mby5hbW91bnQgPiAwKSB7XG4gICAgICAgIGV4dHJhT3V0cHV0cy5wdXNoKGJpdGdvRmVlSW5mbyk7XG4gICAgICB9XG4gICAgICBleHRyYU91dHB1dHMuZm9yRWFjaChmdW5jdGlvbiAob3V0cHV0KSB7XG4gICAgICAgIGlmICgob3V0cHV0IGFzIEFkZHJlc3NPdXRwdXQpLmFkZHJlc3MpIHtcbiAgICAgICAgICAob3V0cHV0IGFzIFNjcmlwdE91dHB1dCkuc2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KChvdXRwdXQgYXMgQWRkcmVzc091dHB1dCkuYWRkcmVzcywgbmV0d29yayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZWNpZGUgd2hlcmUgdG8gcHV0IHRoZSBvdXRwdXRzIC0gZGVmYXVsdCBpcyB0byByYW5kb21pemUgdW5sZXNzIGZvcmNlZCB0byBlbmRcbiAgICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSBwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCA/IG91dHB1dHMubGVuZ3RoIDogXy5yYW5kb20oMCwgb3V0cHV0cy5sZW5ndGgpO1xuICAgICAgICBvdXRwdXRzLnNwbGljZShvdXRwdXRJbmRleCwgMCwgb3V0cHV0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgYWxsIG91dHB1dHMgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAgICBvdXRwdXRzLmZvckVhY2goZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5hZGRPdXRwdXQoKG91dHB1dCBhcyBTY3JpcHRPdXRwdXQpLnNjcmlwdCwgb3V0cHV0LmFtb3VudCk7XG4gICAgICB9KTtcblxuICAgICAgdHJhdmVsSW5mb3MgPSBfKG91dHB1dHMpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKG91dHB1dCwgaW5kZXgpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBvdXRwdXQudHJhdmVsSW5mbztcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0Lm91dHB1dEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigpXG4gICAgICAgIC52YWx1ZSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIFNlcmlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24sIHJldHVybmluZyB3aGF0IGlzIG5lZWRlZCB0byBzaWduIGl0XG4gIGNvbnN0IHNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBvbmx5IG5lZWQgdG8gcmV0dXJuIHRoZSB1bnNwZW50cyB0aGF0IHdlcmUgdXNlZCBhbmQganVzdCB0aGUgY2hhaW5QYXRoLCByZWRlZW1TY3JpcHQsIGFuZCBpbnN0YW50IGZsYWdcbiAgICBjb25zdCBwaWNrZWRVbnNwZW50czogYW55ID0gXy5tYXAodW5zcGVudHMsIGZ1bmN0aW9uICh1bnNwZW50KSB7XG4gICAgICByZXR1cm4gXy5waWNrKHVuc3BlbnQsIFsnY2hhaW5QYXRoJywgJ3JlZGVlbVNjcmlwdCcsICdpbnN0YW50JywgJ3dpdG5lc3NTY3JpcHQnLCAnc2NyaXB0JywgJ3ZhbHVlJ10pO1xuICAgIH0pO1xuICAgIGNvbnN0IHBydW5lZFVuc3BlbnRzID0gXy5zbGljZShwaWNrZWRVbnNwZW50cywgMCwgdHJhbnNhY3Rpb24udHguaW5zLmxlbmd0aCAtIGZlZVNpbmdsZUtleVVuc3BlbnRzVXNlZC5sZW5ndGgpO1xuICAgIF8uZWFjaChmZWVTaW5nbGVLZXlVbnNwZW50c1VzZWQsIGZ1bmN0aW9uIChmZWVVbnNwZW50KSB7XG4gICAgICBwcnVuZWRVbnNwZW50cy5wdXNoKHsgcmVkZWVtU2NyaXB0OiBmYWxzZSwgY2hhaW5QYXRoOiBmYWxzZSB9KTsgLy8gbWFyayBhcyBmYWxzZSB0byBzaWduaWZ5IGEgbm9uLW11bHRpc2lnIGFkZHJlc3NcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHtcbiAgICAgIHRyYW5zYWN0aW9uSGV4OiB0cmFuc2FjdGlvbi5idWlsZEluY29tcGxldGUoKS50b0hleCgpLFxuICAgICAgdW5zcGVudHM6IHBydW5lZFVuc3BlbnRzLFxuICAgICAgZmVlOiBmZWUsXG4gICAgICBjaGFuZ2VBZGRyZXNzZXM6IGNoYW5nZU91dHB1dHMubWFwKGZ1bmN0aW9uIChjbykge1xuICAgICAgICByZXR1cm4gXy5waWNrKGNvLCBbJ2FkZHJlc3MnLCAncGF0aCcsICdhbW91bnQnXSk7XG4gICAgICB9KSxcbiAgICAgIHdhbGxldElkOiBwYXJhbXMud2FsbGV0LmlkKCksXG4gICAgICB3YWxsZXRLZXljaGFpbnM6IHBhcmFtcy53YWxsZXQua2V5Y2hhaW5zLFxuICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50LFxuICAgICAgYml0Z29GZWU6IGJpdGdvRmVlSW5mbyxcbiAgICAgIGVzdGltYXRlZFNpemU6IG1pbmVyRmVlSW5mby5zaXplLFxuICAgICAgdHhJbmZvOiB0eEluZm8sXG4gICAgICB0cmF2ZWxJbmZvczogdHJhdmVsSW5mb3MsXG4gICAgfTtcblxuICAgIC8vIEFkZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBpZiAocmVzdWx0Lmluc3RhbnQgJiYgYml0Z29GZWVJbmZvKSB7XG4gICAgICByZXN1bHQuaW5zdGFudEZlZSA9IF8ucGljayhiaXRnb0ZlZUluZm8sIFsnYW1vdW50JywgJ2FkZHJlc3MnXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0Qml0R29GZWUoKTtcbiAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gQmx1ZWJpcmQuYWxsKFtnZXRCaXRHb0ZlZUFkZHJlc3MoKSwgZ2V0VW5zcGVudHMoKSwgZ2V0VW5zcGVudHNGb3JTaW5nbGVLZXkoKV0pO1xuICAgIH0pXG4gICAgLnRoZW4oY29sbGVjdElucHV0cylcbiAgICAudGhlbihjb2xsZWN0T3V0cHV0cylcbiAgICAudGhlbihzZXJpYWxpemUpO1xufTtcblxuLyoqXG4gKiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhIHRyYW5zYWN0aW9uIGluIGJ5dGVzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2ZcbiAqIGlucHV0cyBhbmQgb3V0cHV0cyBwcmVzZW50LlxuICogQHBhcmFtcyBwYXJhbXMge1xuICogICBuUDJzaElucHV0czogbnVtYmVyIG9mIFAyU0ggKG11bHRpc2lnKSBpbnB1dHNcbiAqICAgblAycGtoSW5wdXRzOiBudW1iZXIgb2YgUDJQS0ggKHNpbmdsZSBzaWcpIGlucHV0c1xuICogICBuT3V0cHV0czogbnVtYmVyIG9mIG91dHB1dHNcbiAqIH1cbiAqXG4gKiBAcmV0dXJucyBzaXplOiBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgdHJhbnNhY3Rpb24gaW4gYnl0ZXNcbiAqL1xuY29uc3QgZXN0aW1hdGVUcmFuc2FjdGlvblNpemUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm5QMnNoSW5wdXRzKSB8fCBwYXJhbXMublAyc2hJbnB1dHMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcG9zaXRpdmUgblAyc2hJbnB1dHMnKTtcbiAgfVxuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uUDJwa2hJbnB1dHMpIHx8IHBhcmFtcy5uUDJwa2hJbnB1dHMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcG9zaXRpdmUgblAycGtoSW5wdXRzIHRvIGJlIG51bWVyaWMnKTtcbiAgfVxuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uUDJzaFAyd3NoSW5wdXRzKSB8fCBwYXJhbXMublAyc2hQMndzaElucHV0cyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBwb3NpdGl2ZSBuUDJzaFAyd3NoSW5wdXRzIHRvIGJlIG51bWVyaWMnKTtcbiAgfVxuICBpZiAocGFyYW1zLm5QMnNoSW5wdXRzICsgcGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgYXQgbGVhc3Qgb25lIG5QMnNoSW5wdXRzIG9yIG5QMnNoUDJ3c2hJbnB1dHMnKTtcbiAgfVxuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uT3V0cHV0cykgfHwgcGFyYW1zLm5PdXRwdXRzIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHBvc2l0aXZlIG5PdXRwdXRzJyk7XG4gIH1cblxuICAvLyBUaGUgc2l6ZSBvZiBhbiB1bmNvbXByZXNzZWQgcHVibGljIGtleSBpcyAzMiBieXRlcyBtb3JlIHRoYW4gdGhlIGNvbXByZXNzZWQga2V5LFxuICAvLyBhbmQgaGVuY2UsIG5lZWRzIHRvIGJlIGFjY291bnRlZCBmb3IgaW4gdGhlIHRyYW5zYWN0aW9uIHNpemUgZXN0aW1hdGlvbi5cbiAgY29uc3QgdW5jb21wcmVzc2VkUHVibGljS2V5c1RyaXBsZUNvcnJlY3Rpb25GYWN0b3IgPSAzMiAqIDM7XG5cbiAgcmV0dXJuIChcbiAgICAvLyBUaGlzIGlzIG5vdCBxdWl0ZSBhY2N1cmF0ZSAtIGlmIHRoZXJlIGlzIGEgbWl4IG9mIGlucHV0cyBzY3JpcHRzIHdoZXJlIHNvbWUgdXNlZFxuICAgIC8vIGNvbXByZXNzZWQga2V5cyBhbmQgc29tZSB1c2VkIHVuY29tcHJlc3NlZCBrZXlzLCB3ZSB3b3VsZCBvdmVyZXN0aW1hdGUgdGhlIHNpemUuXG4gICAgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBtaXhlZCBpbnB1dCBzZXRzLCB0aGlzIHNob3VsZCBub3QgYmUgYW4gaXNzdWUgaW4gcHJhY3RpY2UuXG4gICAgKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgK1xuICAgICAgKHBhcmFtcy5jb250YWluc1VuY29tcHJlc3NlZFB1YmxpY0tleXMgPyB1bmNvbXByZXNzZWRQdWJsaWNLZXlzVHJpcGxlQ29ycmVjdGlvbkZhY3RvciA6IDApKSAqXG4gICAgICBwYXJhbXMublAyc2hJbnB1dHMgK1xuICAgIFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSAqIChwYXJhbXMublAyc2hQMndzaElucHV0cyB8fCAwKSArXG4gICAgVmlydHVhbFNpemVzLnR4UDJwa2hJbnB1dFNpemVVbmNvbXByZXNzZWRLZXkgKiAocGFyYW1zLm5QMnBraElucHV0cyB8fCAwKSArXG4gICAgVmlydHVhbFNpemVzLnR4UDJwa2hPdXRwdXRTaXplICogcGFyYW1zLm5PdXRwdXRzICtcbiAgICAvLyBpZiB0aGUgdHggY29udGFpbnMgYXQgbGVhc3Qgb25lIHNlZ3dpdCBpbnB1dCwgdGhlIHR4IG92ZXJoZWFkIGlzIGluY3JlYXNlZCBieSAxXG4gICAgVmlydHVhbFNpemVzLnR4T3ZlcmhlYWRTaXplICtcbiAgICAocGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMgPiAwID8gMSA6IDApXG4gICk7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgZmVlIGFuZCBlc3RpbWF0ZWQgc2l6ZSBpbiBieXRlcyBmb3IgYSB0cmFuc2FjdGlvbi5cbiAqIEBwYXJhbXMgcGFyYW1zIHtcbiAqICAgYml0Z286IGJpdGdvIG9iamVjdFxuICogICBmZWVSYXRlOiBzYXRvc2hpcyBwZXIga2lsb2J5dGVcbiAqICAgblAyc2hJbnB1dHM6IG51bWJlciBvZiBQMlNIIChtdWx0aXNpZykgaW5wdXRzXG4gKiAgIG5QMnBraElucHV0czogbnVtYmVyIG9mIFAyUEtIIChzaW5nbGUgc2lnKSBpbnB1dHNcbiAqICAgbk91dHB1dHM6IG51bWJlciBvZiBvdXRwdXRzXG4gKiB9XG4gKlxuICogQHJldHVybnMge1xuICogICBzaXplOiBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgdHJhbnNhY3Rpb24gaW4gYnl0ZXNcbiAqICAgZmVlOiBlc3RpbWF0ZWQgZmVlIGluIHNhdG9zaGlzIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAqICAgZmVlUmF0ZTogZmVlIHJhdGUgdGhhdCB3YXMgdXNlZCB0byBlc3RpbWF0ZSB0aGUgZmVlIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAqIH1cbiAqL1xuZXhwb3J0cy5jYWxjdWxhdGVNaW5lckZlZUluZm8gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGNvbnN0IGZlZVJhdGVUb1VzZSA9IHBhcmFtcy5mZWVSYXRlIHx8IHBhcmFtcy5iaXRnby5nZXRDb25zdGFudHMoKS5mYWxsYmFja0ZlZVJhdGU7XG4gIGNvbnN0IGVzdGltYXRlZFNpemUgPSBlc3RpbWF0ZVRyYW5zYWN0aW9uU2l6ZShwYXJhbXMpO1xuXG4gIHJldHVybiB7XG4gICAgc2l6ZTogZXN0aW1hdGVkU2l6ZSxcbiAgICBmZWU6IE1hdGguY2VpbCgoZXN0aW1hdGVkU2l6ZSAqIGZlZVJhdGVUb1VzZSkgLyAxMDAwKSxcbiAgICBmZWVSYXRlOiBmZWVSYXRlVG9Vc2UsXG4gIH07XG59O1xuXG4vKlxuICogR2l2ZW4gYSB0cmFuc2FjdGlvbiBoZXgsIHVuc3BlbnQgaW5mb3JtYXRpb24gKGNoYWluIHBhdGggYW5kIHJlZGVlbSBzY3JpcHRzKSwgYW5kIHRoZSBrZXljaGFpbiB4cHJ2LFxuICogcGVyZm9ybSBrZXkgZGVyaXZhdGlvbiBhbmQgc2lnbiB0aGUgaW5wdXRzIGluIHRoZSB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgdW5zcGVudCBpbmZvcm1hdGlvbiBwcm92aWRlZFxuICpcbiAqIEBwYXJhbXM6XG4gKiAgdHJhbnNhY3Rpb25IZXggc2VyaWFsaXplZCBmb3JtIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBoZXhcbiAqICB1bnNwZW50cyBhcnJheSBvZiB1bnNwZW50IGluZm9ybWF0aW9uLCB3aGVyZSBlYWNoIHVuc3BlbnQgaXMgYSBjaGFpblBhdGggYW5kIHJlZGVlbVNjcmlwdCB3aXRoIHRoZSBzYW1lXG4gKiAgaW5kZXggYXMgdGhlIGlucHV0cyBpbiB0aGUgdHJhbnNhY3Rpb25IZXhcbiAqICBrZXljaGFpbiBLZXljaGFpbiBjb250YWluaW5nIHRoZSB4cHJ2IHRvIHNpZ24gd2l0aC4gRm9yIGxlZ2FjeSBzdXBwb3J0IG9mIHNhZmUgd2FsbGV0cywga2V5Y2hhaW4gY2FuXG4gYWxzbyBiZSBhIFdJRiBwcml2YXRlIGtleS5cbiAqICBzaWduaW5nS2V5IHByaXZhdGUga2V5IGluIFdJRiBmb3Igc2FmZSB3YWxsZXRzLCB3aGVuIGtleWNoYWluIGlzIHVuYXZhaWxhYmxlXG4gKiAgdmFsaWRhdGUgY2xpZW50LXNpZGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiAtIGNhbiBiZSBkaXNhYmxlZCBmb3IgaW1wcm92ZWQgcGVyZm9ybWFuY2UgKHNpZ25hdHVyZXNcbiAqICAgICAgICAgICBhcmUgc3RpbGwgdmFsaWRhdGVkIHNlcnZlci1zaWRlKS5cbiAqICBmZWVTaW5nbGVLZXlXSUYgVXNlIHRoZSBhZGRyZXNzIGJhc2VkIG9uIHRoaXMgcHJpdmF0ZSBrZXkgdG8gcGF5IGZlZXNcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnRzLnNpZ25UcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgbGV0IGtleWNoYWluID0gcGFyYW1zLmtleWNoYWluOyAvLyBkdXBsaWNhdGUgc28gYXMgdG8gbm90IG11dGF0ZSBiZWxvd1xuXG4gIGNvbnN0IHZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuICBsZXQgcHJpdktleTtcbiAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50cmFuc2FjdGlvbkhleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUgdHJhbnNhY3Rpb24gaGV4IGFzIGEgc3RyaW5nJyk7XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy51bnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUgdW5zcGVudHMgYXJyYXknKTtcbiAgfVxuICBpZiAoIV8uaXNCb29sZWFuKHZhbGlkYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHZhbGlkYXRlIHRvIGJlIGEgYm9vbGVhbicpO1xuICB9XG4gIGxldCBuZXR3b3JrID0gZ2V0TmV0d29yaygpO1xuICBjb25zdCBlbmFibGVCQ0ggPSBfLmlzQm9vbGVhbihwYXJhbXMuZm9yY2VCQ0gpICYmIHBhcmFtcy5mb3JjZUJDSCA9PT0gdHJ1ZTtcblxuICBpZiAoIV8uaXNPYmplY3Qoa2V5Y2hhaW4pIHx8ICFfLmlzU3RyaW5nKChrZXljaGFpbiBhcyBhbnkpLnhwcnYpKSB7XG4gICAgaWYgKF8uaXNTdHJpbmcocGFyYW1zLnNpZ25pbmdLZXkpKSB7XG4gICAgICBwcml2S2V5ID0gdXR4b2xpYi5FQ1BhaXIuZnJvbVdJRihwYXJhbXMuc2lnbmluZ0tleSwgbmV0d29yayBhcyB1dHhvbGliLkJpdGNvaW5KU05ldHdvcmspO1xuICAgICAga2V5Y2hhaW4gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHRoZSBrZXljaGFpbiBvYmplY3Qgd2l0aCB4cHJ2Jyk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGZlZVNpbmdsZUtleTtcbiAgaWYgKHBhcmFtcy5mZWVTaW5nbGVLZXlXSUYpIHtcbiAgICBmZWVTaW5nbGVLZXkgPSB1dHhvbGliLkVDUGFpci5mcm9tV0lGKHBhcmFtcy5mZWVTaW5nbGVLZXlXSUYsIG5ldHdvcmsgYXMgdXR4b2xpYi5CaXRjb2luSlNOZXR3b3JrKTtcbiAgfVxuXG4gIGRlYnVnKCdOZXR3b3JrOiAlTycsIG5ldHdvcmspO1xuXG4gIGlmIChlbmFibGVCQ0gpIHtcbiAgICBkZWJ1ZygnRW5hYmxpbmcgQkNI4oCmJyk7XG4gICAgbmV0d29yayA9IHV0eG9saWIubmV0d29ya3MuYml0Y29pbmNhc2g7XG4gICAgZGVidWcoJ05ldyBuZXR3b3JrOiAlTycsIG5ldHdvcmspO1xuICB9XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleChwYXJhbXMudHJhbnNhY3Rpb25IZXgsIG5ldHdvcmspO1xuICBpZiAodHJhbnNhY3Rpb24uaW5zLmxlbmd0aCAhPT0gcGFyYW1zLnVuc3BlbnRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbGVuZ3RoIG9mIHVuc3BlbnRzIGFycmF5IHNob3VsZCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIGlucHV0cycpO1xuICB9XG5cbiAgLy8gZGVjb3JhdGUgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dCB2YWx1ZXMgZm9yIFRyYW5zYWN0aW9uQnVpbGRlciBpbnN0YW50aWF0aW9uXG4gIGNvbnN0IGlzVXR4b1R4ID0gXy5pc09iamVjdCh0cmFuc2FjdGlvbikgJiYgQXJyYXkuaXNBcnJheSgodHJhbnNhY3Rpb24gYXMgYW55KS5pbnMpO1xuICBjb25zdCBhcmVWYWxpZFVuc3BlbnRzID0gXy5pc09iamVjdChwYXJhbXMpICYmIEFycmF5LmlzQXJyYXkoKHBhcmFtcyBhcyBhbnkpLnVuc3BlbnRzKTtcbiAgaWYgKGlzVXR4b1R4ICYmIGFyZVZhbGlkVW5zcGVudHMpIHtcbiAgICAvLyBleHRlbmQgdGhlIHRyYW5zYWN0aW9uIGlucHV0cyB3aXRoIHRoZSB2YWx1ZXNcbiAgICBjb25zdCBpbnB1dFZhbHVlcyA9IF8ubWFwKChwYXJhbXMgYXMgYW55KS51bnNwZW50cywgKHUpID0+IF8ucGljayh1LCAndmFsdWUnKSk7XG4gICAgdHJhbnNhY3Rpb24uaW5zLm1hcCgoY3VycmVudEl0ZW0sIGluZGV4KSA9PiBfLmV4dGVuZChjdXJyZW50SXRlbSwgaW5wdXRWYWx1ZXNbaW5kZXhdKSk7XG4gIH1cblxuICBsZXQgcm9vdEV4dEtleTtcbiAgaWYgKGtleWNoYWluKSB7XG4gICAgcm9vdEV4dEtleSA9IGJpcDMyLmZyb21CYXNlNTgoa2V5Y2hhaW4ueHBydik7XG4gIH1cblxuICBjb25zdCB0eGIgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZyb21UcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHR4Yi50eC5pbnMubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgY29uc3QgY3VycmVudFVuc3BlbnQgPSBwYXJhbXMudW5zcGVudHNbaW5kZXhdO1xuICAgIGlmIChjdXJyZW50VW5zcGVudC5yZWRlZW1TY3JpcHQgPT09IGZhbHNlKSB7XG4gICAgICAvLyB0aGlzIGlzIHRoZSBpbnB1dCBmcm9tIGEgc2luZ2xlIGtleSBmZWUgYWRkcmVzc1xuICAgICAgaWYgKCFmZWVTaW5nbGVLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaW5nbGUga2V5IGFkZHJlc3MgdXNlZCBpbiBpbnB1dCBidXQgZmVlU2luZ2xlS2V5V0lGIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlQkNIKSB7XG4gICAgICAgIGZlZVNpbmdsZUtleS5uZXR3b3JrID0gbmV0d29yaztcbiAgICAgIH1cblxuICAgICAgdHhiLnNpZ24oaW5kZXgsIGZlZVNpbmdsZUtleSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdCAmJiBlbmFibGVCQ0gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQkNIIGRvZXMgbm90IHN1cHBvcnQgc2Vnd2l0IGlucHV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYWluUGF0aCA9IGN1cnJlbnRVbnNwZW50LmNoYWluUGF0aDtcbiAgICBpZiAocm9vdEV4dEtleSkge1xuICAgICAgY29uc3QgeyB3YWxsZXRTdWJQYXRoID0gJy8wLzAnIH0gPSBrZXljaGFpbjtcbiAgICAgIGNvbnN0IHBhdGggPSBzYW5pdGl6ZUxlZ2FjeVBhdGgoa2V5Y2hhaW4ucGF0aCArIHdhbGxldFN1YlBhdGggKyBjaGFpblBhdGgpO1xuICAgICAgZGVidWcoXG4gICAgICAgICdkZXJpdmVkIHVzZXIga2V5IHBhdGggXCIlc1wiIHVzaW5nIGtleWNoYWluIHBhdGggXCIlc1wiLCB3YWxsZXRTdWJQYXRoIFwiJXNcIiwga2V5Y2hhaW4gd2FsbGV0U3ViUGF0aCBcIiVzXCIgYW5kIGNoYWluUGF0aCBcIiVzXCInLFxuICAgICAgICBwYXRoLFxuICAgICAgICBrZXljaGFpbi5wYXRoLFxuICAgICAgICB3YWxsZXRTdWJQYXRoLFxuICAgICAgICBrZXljaGFpbi53YWxsZXRTdWJQYXRoLFxuICAgICAgICBjaGFpblBhdGhcbiAgICAgICk7XG4gICAgICBwcml2S2V5ID0gcm9vdEV4dEtleS5kZXJpdmVQYXRoKHBhdGgpO1xuICAgIH1cblxuICAgIHByaXZLZXkubmV0d29yayA9IG5ldHdvcms7XG5cbiAgICAvLyBzdWJzY3JpcHQgaXMgdGhlIHBhcnQgb2YgdGhlIG91dHB1dCBzY3JpcHQgYWZ0ZXIgdGhlIE9QX0NPREVTRVBBUkFUT1IuXG4gICAgLy8gU2luY2Ugd2UgYXJlIG9ubHkgZXZlciBzaWduaW5nIHAyc2ggb3V0cHV0cywgd2hpY2ggZG8gbm90IGhhdmVcbiAgICAvLyBPUF9DT0RFU0VQQVJBVE9SUywgaXQgaXMgYWx3YXlzIHRoZSBvdXRwdXQgc2NyaXB0LlxuICAgIGNvbnN0IHN1YnNjcmlwdCA9IEJ1ZmZlci5mcm9tKGN1cnJlbnRVbnNwZW50LnJlZGVlbVNjcmlwdCwgJ2hleCcpO1xuICAgIGN1cnJlbnRVbnNwZW50LnZhbGlkYXRpb25TY3JpcHQgPSBzdWJzY3JpcHQ7XG5cbiAgICAvLyBJbiBvcmRlciB0byBzaWduIHdpdGggYml0Y29pbmpzLWxpYiwgd2UgbXVzdCB1c2UgaXRzIHRyYW5zYWN0aW9uXG4gICAgLy8gYnVpbGRlciwgY29uZnVzaW5nbHkgbmFtZWQgdGhlIHNhbWUgZXhhY3QgdGhpbmcgYXMgb3VyIHRyYW5zYWN0aW9uXG4gICAgLy8gYnVpbGRlciwgYnV0IHdpdGggaW5lcXVpdmFsZW50IGJlaGF2aW9yLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3aXRuZXNzU2NyaXB0ID0gY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdCA/IEJ1ZmZlci5mcm9tKGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHQsICdoZXgnKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHNpZ0hhc2ggPSB1dHhvbGliLmJpdGdvLmdldERlZmF1bHRTaWdIYXNoKG5ldHdvcmspO1xuICAgICAgdHhiLnNpZ24oaW5kZXgsIHByaXZLZXksIHN1YnNjcmlwdCwgc2lnSGFzaCwgY3VycmVudFVuc3BlbnQudmFsdWUsIHdpdG5lc3NTY3JpcHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHRyeSBmYWxsYmFjayBkZXJpdmF0aW9uIHBhdGggKHNlZSBCRy00NjQ5NylcbiAgICAgIGxldCBmYWxsYmFja1NpZ25pbmdTdWNjZXNzZnVsID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmYWxsYmFja1BhdGggPSBzYW5pdGl6ZUxlZ2FjeVBhdGgoa2V5Y2hhaW4ucGF0aCArIGNoYWluUGF0aCk7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgICdkZXJpdmVkIGZhbGxiYWNrIHVzZXIga2V5IHBhdGggXCIlc1wiIHVzaW5nIGtleWNoYWluIHBhdGggXCIlc1wiIGFuZCBjaGFpblBhdGggXCIlc1wiJyxcbiAgICAgICAgICBmYWxsYmFja1BhdGgsXG4gICAgICAgICAga2V5Y2hhaW4ucGF0aCxcbiAgICAgICAgICBjaGFpblBhdGhcbiAgICAgICAgKTtcbiAgICAgICAgcHJpdktleSA9IHJvb3RFeHRLZXkuZGVyaXZlUGF0aChmYWxsYmFja1BhdGgpO1xuICAgICAgICBjb25zdCB3aXRuZXNzU2NyaXB0ID0gY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdFxuICAgICAgICAgID8gQnVmZmVyLmZyb20oY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdCwgJ2hleCcpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNpZ0hhc2ggPSB1dHhvbGliLmJpdGdvLmdldERlZmF1bHRTaWdIYXNoKG5ldHdvcmspO1xuICAgICAgICB0eGIuc2lnbihpbmRleCwgcHJpdktleSwgc3Vic2NyaXB0LCBzaWdIYXNoLCBjdXJyZW50VW5zcGVudC52YWx1ZSwgd2l0bmVzc1NjcmlwdCk7XG4gICAgICAgIGZhbGxiYWNrU2lnbmluZ1N1Y2Nlc3NmdWwgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZmFsbGJhY2tFcnJvcikge1xuICAgICAgICBkZWJ1ZygnaW5wdXQgc2lnbiBmYWlsZWQgZm9yIGZhbGxiYWNrIHBhdGg6ICVzJywgZmFsbGJhY2tFcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIC8vIHdlIG5lZWQgdG8ga25vdyB3aGF0J3MgY2F1c2luZyB0aGlzXG4gICAgICBpZiAoIWZhbGxiYWNrU2lnbmluZ1N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgZS5yZXN1bHQgPSB7XG4gICAgICAgICAgdW5zcGVudDogY3VycmVudFVuc3BlbnQsXG4gICAgICAgIH07XG4gICAgICAgIGUubWVzc2FnZSA9IGBGYWlsZWQgdG8gc2lnbiBpbnB1dCAjJHtpbmRleH0gLSAke2UubWVzc2FnZX0gLSAke0pTT04uc3RyaW5naWZ5KGUucmVzdWx0LCBudWxsLCA0KX0gLSBcXG4ke1xuICAgICAgICAgIGUuc3RhY2tcbiAgICAgICAgfWA7XG4gICAgICAgIGRlYnVnKCdpbnB1dCBzaWduIGZhaWxlZDogJXMnLCBlLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhcnRpYWxUcmFuc2FjdGlvbiA9IHR4Yi5idWlsZEluY29tcGxldGUoKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBwYXJ0aWFsVHJhbnNhY3Rpb24uaW5zLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlQ291bnQgPSB1dHhvbGliLmJpdGdvXG4gICAgICAgIC5nZXRTaWduYXR1cmVWZXJpZmljYXRpb25zKHBhcnRpYWxUcmFuc2FjdGlvbiwgaW5kZXgsIHBhcmFtcy51bnNwZW50c1tpbmRleF0udmFsdWUpXG4gICAgICAgIC5maWx0ZXIoKHYpID0+IHYuc2lnbmVkQnkgIT09IHVuZGVmaW5lZCkubGVuZ3RoO1xuICAgICAgaWYgKHNpZ25hdHVyZUNvdW50IDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGF0IGxlYXN0IG9uZSB2YWxpZCBzaWduYXR1cmUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuZnVsbExvY2FsU2lnbmluZyAmJiBzaWduYXR1cmVDb3VudCA8IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmdWxsTG9jYWxTaWduaW5nIHNldDogZXhwZWN0ZWQgYXQgbGVhc3QgdHdvIHZhbGlkIHNpZ25hdHVyZXMnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHtcbiAgICB0cmFuc2FjdGlvbkhleDogcGFydGlhbFRyYW5zYWN0aW9uLnRvSGV4KCksXG4gIH0pO1xufTtcbiJdfQ==
|
|
902
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBRUg7R0FDRztBQUNILEVBQUU7QUFDRixxQkFBcUI7QUFDckIsa0RBQWtEO0FBQ2xELEVBQUU7QUFDRixvREFBb0Q7QUFDcEQsRUFBRTtBQUVGLDhDQUF3QztBQUN4QyxxQ0FBcUM7QUFDckMsMkNBQTJDO0FBQzNDLDRCQUE0QjtBQUM1Qiw4Q0FBK0M7QUFDL0Msa0NBQW1DO0FBQ25DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN2Qyw4Q0FBMEY7QUFDMUYsbURBQWdEO0FBdUJoRCxFQUFFO0FBQ0YscUJBQXFCO0FBQ3JCLFdBQVc7QUFDWCwwQ0FBMEM7QUFDMUMsOE1BQThNO0FBQzlNLHNHQUFzRztBQUN0RyxrSUFBa0k7QUFDbEksNkhBQTZIO0FBQzdILHVHQUF1RztBQUN2RywrRUFBK0U7QUFDL0UscUVBQXFFO0FBQ3JFLDZFQUE2RTtBQUM3RSx3R0FBd0c7QUFDeEcsaUlBQWlJO0FBQ2pJLHdJQUF3STtBQUN4SSw0SUFBNEk7QUFDNUksdUVBQXVFO0FBQ3ZFLDJFQUEyRTtBQUMzRSw0RkFBNEY7QUFDNUYsT0FBTyxDQUFDLGlCQUFpQixHQUFHLFVBQVUsTUFBTTtJQUMxQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztJQUM1QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3hFLElBQUksVUFBVSxHQUE2RSxFQUFFLENBQUM7SUFDOUYsSUFBSSxTQUFTLEdBQTBDLEVBQUUsQ0FBQztJQUMxRCxJQUFJLGtCQUFrQixHQUFhLEVBQUUsQ0FBQztJQUN0QyxJQUFJLFNBQWlCLENBQUM7SUFDdEIsSUFBSSxXQUFXLENBQUM7SUFFaEIsdUNBQXVDO0lBQ3ZDLElBQ0UsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDMUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUN6QixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEUsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0QsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUQsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzFFLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDeEYsQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsNERBQTREO1FBQzVELENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELENBQUMsTUFBTSxDQUFDLG1CQUFtQixJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUN2RTtRQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztLQUNyQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2xDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFBLHFCQUFVLEVBQUMsaUJBQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFeEUsNkZBQTZGO0lBQzdGLGtHQUFrRztJQUNsRyxJQUFJLHlCQUF5QixDQUFDO0lBQzlCLElBQUksdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLElBQUksTUFBTSxDQUFDLHlCQUF5QixFQUFFO1FBQ3BDLElBQUk7WUFDRixPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0UseUJBQXlCLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDO1NBQzlEO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1NBQ2pGO0tBQ0Y7SUFFRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUU7UUFDMUIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxPQUFtQyxDQUFDLENBQUM7UUFDekcseUJBQXlCLEdBQUcsSUFBQSwwQkFBZSxFQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFELDZIQUE2SDtRQUM3SCxJQUFJLE1BQU0sQ0FBQyx5QkFBeUIsSUFBSSxNQUFNLENBQUMseUJBQXlCLEtBQUsseUJBQXlCLEVBQUU7WUFDdEcsTUFBTSxJQUFJLEtBQUssQ0FDYiw2QkFBNkI7Z0JBQzNCLE1BQU0sQ0FBQyx5QkFBeUI7Z0JBQ2hDLHFEQUFxRDtnQkFDckQseUJBQXlCLENBQzVCLENBQUM7U0FDSDtLQUNGO0lBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0VBQXNFLENBQUMsQ0FBQztLQUN6RjtJQUVELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUM5QixnQkFBZ0IsRUFBRSxDQUFDO0tBQ3BCO0lBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ2xDLGdCQUFnQixFQUFFLENBQUM7S0FDcEI7SUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsRUFBRTtRQUM3QyxnQkFBZ0IsRUFBRSxDQUFDO0tBQ3BCO0lBRUQsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUU7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO0tBQ3hGO0lBRUQsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUNwQyxNQUFNLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7S0FDMUM7SUFFRCwySEFBMkg7SUFDM0gsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsWUFBWSxLQUFLLENBQUMsRUFBRTtRQUN6QyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLGtCQUFrQjtZQUNqRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDckQsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztLQUNKO1NBQU07UUFDTCxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztLQUNoQztJQUVELElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNwQixJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxZQUFZLEtBQUssQ0FBQyxFQUFFO1lBQ3hDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxPQUFPO2dCQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7U0FDOUI7S0FDRjtJQUVELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0tBQ3JEO0lBRUQsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNyQixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBRTdCLDBEQUEwRDtJQUMxRCxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFaEQsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFFMUIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLFNBQVM7UUFDcEMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsSUFBQSw2QkFBYSxFQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2xFO1lBQ0QsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDdEIsZ0ZBQWdGO2dCQUNoRixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsQ0FBQyxNQUFNLEVBQUU7b0JBQ25HLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkRBQTJELEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FDekcsQ0FBQztpQkFDSDthQUNGO1NBQ0Y7UUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdEY7UUFDRCxpQkFBaUIsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLFFBQVE7UUFDbEMsaUJBQWlCLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDbkMsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRTtRQUM1RixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7S0FDekM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxXQUFXLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFakQsbUVBQW1FO0lBQ25FLElBQUksUUFBUSxDQUFDO0lBRWIsOENBQThDO0lBQzlDLElBQUksa0JBQWtCLENBQUM7SUFFdkIsc0VBQXNFO0lBQ3RFLElBQUksb0JBQW9CLENBQUM7SUFFekIsc0VBQXNFO0lBQ3RFLElBQUksb0JBQW9CLENBQUM7SUFFekIsb0RBQW9EO0lBQ3BELElBQUksV0FBVyxDQUFDO0lBRWhCLElBQUksYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUVqQyxJQUFJLDhCQUE4QixHQUFHLEtBQUssQ0FBQztJQUUzQyxtQkFBbUI7SUFDbkIsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU1RSxNQUFNLFdBQVcsR0FBRztRQUNsQixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbEIsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLE9BQU87YUFDUjtZQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLE1BQU07Z0JBQzVHLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFO29CQUM1QixZQUFZLEdBQUc7d0JBQ2IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHO3FCQUNuQixDQUFDO2lCQUNIO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDTixJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDM0MsV0FBVyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUM7YUFDcEM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sa0JBQWtCLEdBQUc7UUFDekIsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLGdGQUFnRjtZQUNoRixJQUFJLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3pDLE9BQU87YUFDUjtZQUNELE9BQU8sS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsTUFBTTtnQkFDckQsWUFBWSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRix5RUFBeUU7SUFDekUseURBQXlEO0lBQ3pELE1BQU0seUJBQXlCLEdBQUc7UUFDaEMsSUFBSSxNQUFNLENBQUMsa0JBQWtCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNsRCxPQUFPLEtBQUs7aUJBQ1QsV0FBVyxDQUFDO2dCQUNYLFNBQVMsRUFBRSxNQUFNLENBQUMsa0JBQWtCO2dCQUNwQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVU7Z0JBQ3pCLE1BQU0sRUFBRSxvQkFBb0I7Z0JBQzVCLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixTQUFTLEVBQUUsSUFBSTthQUNoQixDQUFDO2lCQUNELElBQUksQ0FBQyxVQUFVLE1BQU07Z0JBQ3BCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztnQkFDN0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU87b0JBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLGlCQUFpQixDQUFDO29CQUM3RCxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztnQkFDekIsc0JBQXNCO2dCQUN0QixrSUFBa0k7Z0JBQ2xJLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxnQkFBZ0IsR0FBRyxPQUFPLEVBQUU7b0JBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsSUFBSSxJQUFJLEVBQUU7d0JBQ1IsNENBQTRDO3dCQUM1QyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRTt3QkFDbEIscUJBQXFCO3dCQUNyQixnQkFBZ0IsQ0FDbkIsQ0FBQztvQkFDRixPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztpQkFDN0I7cUJBQU0sSUFBSSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUMvQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7aUJBQ3ZDO3FCQUFNO29CQUNMLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQztpQkFDNUI7Z0JBQ0QsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQ2hCLGlDQUFpQztnQkFDakMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsRUFBRTtvQkFDM0MsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzQjtxQkFBTTtvQkFDTCx1REFBdUQ7b0JBQ3ZELE9BQU8sR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDO29CQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0YsT0FBTyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQzNCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNILENBQUMsQ0FBQztJQUVGLDJDQUEyQztJQUMzQyxNQUFNLFdBQVcsR0FBRztRQUNsQixJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDbkIsb0NBQW9DO1lBQ3BDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQzNCLE9BQU87U0FDUjtRQUVELCtDQUErQztRQUMvQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsbUJBQW1CLElBQUksRUFBRSxFQUFFO1lBQzVELE1BQU0sRUFBRSxXQUFXO1lBQ25CLE9BQU8sRUFBRSxNQUFNLENBQUMsY0FBYyxJQUFJLENBQUM7WUFDbkMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxvQkFBb0I7U0FDbEQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGtDQUFrQztTQUNyRTtRQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsT0FBTztZQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDbkMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNyQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUM1QyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO29CQUNyRCxPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxPQUFPLFFBQVEsSUFBSSxXQUFXLENBQUM7WUFDakMsQ0FBQyxDQUFDLENBQUM7WUFFSCxrR0FBa0c7WUFDbEcsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDekIsTUFBTSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQzthQUM5RDtZQUVELGtGQUFrRjtZQUNsRixvQkFBb0IsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztpQkFDdkMsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDakIsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDMUIsQ0FBQyxDQUFDO2lCQUNELEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ3pDLENBQUMsQ0FBQztpQkFDRCxLQUFLLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO2dCQUNuQywwRkFBMEY7Z0JBQzFGLDhDQUE4QztnQkFDOUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO2FBQ2xDO1lBRUQsMkVBQTJFO1lBQzNFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxlQUFlLEtBQUssQ0FBQyxFQUFFO2dCQUN6RCxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksRUFBRSxDQUFDO2FBQ3ZEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixrREFBa0Q7SUFDbEQsSUFBSSxvQkFBb0IsR0FBbUIsRUFBRSxDQUFDO0lBQzlDLE1BQU0sdUJBQXVCLEdBQUc7UUFDOUIsSUFBSSx5QkFBeUIsRUFBRTtZQUM3QixJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUM7WUFDdkIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUNsQixTQUFTLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQzthQUNsQztZQUNELE9BQU8sS0FBSztpQkFDVCxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcseUJBQXlCLEdBQUcsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLENBQUM7aUJBQ3pGLElBQUksQ0FBQyxVQUFVLFFBQVE7Z0JBQ3RCLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFO29CQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7aUJBQ25FO2dCQUNELG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDLENBQUM7SUFFRixJQUFJLFlBQVksR0FBUSxFQUFFLENBQUM7SUFDM0IsSUFBSSxNQUFNLEdBQVEsRUFBRSxDQUFDO0lBRXJCLG9FQUFvRTtJQUNwRSxxRUFBcUU7SUFDckUsSUFBSSx3QkFBd0IsR0FBbUIsRUFBRSxDQUFDO0lBRWxELE1BQU0sYUFBYSxHQUFHO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNwRDtRQUNELFdBQVcsR0FBRyxDQUFDLENBQUM7UUFFaEIsNEZBQTRGO1FBQzVGLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNsQixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUNwRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7YUFDakY7aUJBQU07Z0JBQ0wsT0FBTyxLQUFLO3FCQUNULFdBQVcsQ0FBQztvQkFDWCxTQUFTLEVBQUUsTUFBTSxDQUFDLGtCQUFrQjtvQkFDcEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2lCQUMxQixDQUFDO3FCQUNELElBQUksQ0FBQyxVQUFVLGVBQWU7b0JBQzdCLE9BQU8sZUFBZSxDQUFDLFFBQVEsQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLENBQUM7YUFDTjtRQUNILENBQUMsQ0FBQzthQUNDLElBQUksQ0FBQyxVQUFVLE9BQU87WUFDckIseURBQXlEO1lBQ3pELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUN0QyxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQzthQUN2QztZQUVELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUM3QyxRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxPQUFPO2dCQUM3QyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztnQkFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLHVCQUFZLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLHVCQUFZLENBQUMsZUFBZSxDQUFDO2dCQUMxRyxNQUFNLHFCQUFxQixHQUFHLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDO2dCQUNsRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLHFCQUFxQixDQUFDLENBQUM7Z0JBQzVFLElBQUksb0JBQW9CLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRTtvQkFDeEMsa0JBQWtCO29CQUNsQixNQUFNLFlBQVksR0FBRzt3QkFDbkIsb0JBQW9CLEVBQUUsYUFBYTt3QkFDbkMscUJBQXFCO3dCQUNyQixvQkFBb0I7d0JBQ3BCLE9BQU87d0JBQ1AsU0FBUyxFQUFFLGdCQUFnQjt3QkFDM0IsT0FBTyxFQUFFLE9BQU87cUJBQ2pCLENBQUM7b0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDekUsa0JBQWtCLEVBQUUsQ0FBQztvQkFDckIsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksa0JBQWtCLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsa0JBQWtCLFdBQVcsb0JBQW9CLFdBQVcsQ0FBQyxDQUFDO2FBQ3JGO1lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDekIsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLE9BQU87Z0JBQzlCLElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRTtvQkFDekIsZ0JBQWdCLEVBQUUsQ0FBQztpQkFDcEI7Z0JBQ0QsV0FBVyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQzdCLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUV2RSxPQUFPLFdBQVcsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckYsQ0FBQyxDQUFDLENBQUM7WUFFSCxvRUFBb0U7WUFDcEUsSUFBSSx5QkFBeUIsRUFBRTtnQkFDN0IsdUVBQXVFO2dCQUN2RSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztnQkFDOUIsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFVBQVUsT0FBTztvQkFDMUMsdUJBQXVCLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztvQkFDekMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQzdCLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzNELHdCQUF3QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdkMsb0VBQW9FO29CQUNwRSxPQUFPLHVCQUF1QixHQUFHLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xGLENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxNQUFNLEdBQUc7Z0JBQ1AsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQjtnQkFDL0YsZ0JBQWdCLEVBQUUsZ0JBQWdCO2dCQUNsQyxZQUFZLEVBQUUseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0MsdUNBQXVDO2dCQUN2QyxRQUFRLEVBQ04sVUFBVSxDQUFDLE1BQU07b0JBQ2pCLENBQUMsR0FBRyx3QkFBd0I7b0JBQzVCLGtCQUFrQixDQUFDLE1BQU0sR0FBRyx5QkFBeUI7b0JBQ3JELENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLDJCQUEyQjtvQkFDL0UsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEMsQ0FBQztZQUVGLHdGQUF3RjtZQUN4RixnQ0FBZ0M7WUFDaEMsOEJBQThCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FDNUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsNkNBQTZDLENBQ3ZGLENBQUM7WUFFRixTQUFTLEdBQUcsdUJBQXVCLENBQUM7Z0JBQ2xDLDhCQUE4QjtnQkFDOUIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2dCQUN6QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7Z0JBQ2pDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTthQUMxQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMseUJBQXlCLENBQUM7YUFDL0IsSUFBSSxDQUFDO1lBQ0osWUFBWSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztnQkFDM0MsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDMUIsOEJBQThCO2dCQUM5QixPQUFPLEVBQUUsT0FBTztnQkFDaEIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2dCQUN6QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7Z0JBQ2pDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTthQUMxQixDQUFDLENBQUM7WUFFSCxJQUFJLG9CQUFvQixFQUFFO2dCQUN4QixNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDO2dCQUN4QyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLGNBQWMsR0FBRyxHQUFHLENBQUM7Z0JBQ2pFLEdBQUcsR0FBRyxjQUFjLENBQUM7Z0JBQ3JCLHFDQUFxQztnQkFDckMsV0FBVyxHQUFHLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQztnQkFDdEMsSUFBSSxZQUFZLEVBQUU7b0JBQ2hCLFdBQVcsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDO2lCQUNwQztnQkFDRCxJQUFJLGFBQWEsRUFBRTtvQkFDakIsb0NBQW9DO29CQUNwQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO29CQUNoQixXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDeEUsT0FBTyxhQUFhLEVBQUUsQ0FBQztpQkFDeEI7YUFDRjtZQUVELE1BQU0sUUFBUSxHQUFHLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEUsSUFBSSx5QkFBeUIsRUFBRTtnQkFDN0IsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLFFBQVEsR0FBRyx1QkFBdUIsRUFBRTtvQkFDdEMsTUFBTSxHQUFHLEdBQVEsSUFBSSxLQUFLLENBQ3hCLDhEQUE4RCxHQUFHLHVCQUF1QixDQUN6RixDQUFDO29CQUNGLEdBQUcsQ0FBQyxNQUFNLEdBQUc7d0JBQ1gsR0FBRyxFQUFFLEdBQUc7d0JBQ1IsT0FBTyxFQUFFLE9BQU87d0JBQ2hCLGFBQWEsRUFBRSxZQUFZLENBQUMsSUFBSTt3QkFDaEMsU0FBUyxFQUFFLFdBQVc7d0JBQ3RCLFFBQVEsRUFBRSxZQUFZO3dCQUN0QixNQUFNLEVBQUUsTUFBTTtxQkFDZixDQUFDO29CQUNGLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDN0I7YUFDRjtZQUVELElBQUksV0FBVyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDL0UsOEVBQThFO2dCQUM5RSxzRkFBc0Y7Z0JBQ3RGLGdGQUFnRjtnQkFDaEYsaUZBQWlGO2dCQUNqRixxRkFBcUY7Z0JBQ3JGLHlGQUF5RjtnQkFDekYsd0NBQXdDO2dCQUN4QyxJQUFJLEdBQUcsQ0FBQztnQkFDUixJQUFJLGtCQUFrQixLQUFLLG9CQUFvQixFQUFFO29CQUMvQyxzRUFBc0U7b0JBQ3RFLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2lCQUN2QztxQkFBTTtvQkFDTCwwREFBMEQ7b0JBQzFELEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FDYixzRUFBc0UsV0FBVywrQkFBK0IsQ0FDakgsQ0FBQztpQkFDSDtnQkFDRCxHQUFHLENBQUMsTUFBTSxHQUFHO29CQUNYLEdBQUcsRUFBRSxHQUFHO29CQUNSLE9BQU8sRUFBRSxPQUFPO29CQUNoQixhQUFhLEVBQUUsWUFBWSxDQUFDLElBQUk7b0JBQ2hDLFNBQVMsRUFBRSxXQUFXO29CQUN0QixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsTUFBTSxFQUFFLE1BQU07aUJBQ2YsQ0FBQztnQkFDRixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDN0I7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGLHdDQUF3QztJQUN4QyxNQUFNLGNBQWMsR0FBRztRQUNyQixJQUFJLFlBQVksQ0FBQyxJQUFJLElBQUksS0FBSyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLEdBQUcsWUFBWSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQztTQUMxRjtRQUVELE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUU3QixVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsU0FBUztZQUNwQyxJQUFJLE1BQU0sQ0FBQztZQUNYLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ2pDLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ3JFO2lCQUFNLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3ZDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO2FBQzNCO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQzthQUN0RTtZQUVELG1DQUFtQztZQUNuQyxJQUFJLFVBQVUsQ0FBQztZQUNmLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDcEMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7Z0JBQ2xDLG9EQUFvRDtnQkFDcEQsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ25EO1lBRUQsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDWCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQ3hCLFVBQVUsRUFBRSxVQUFVO2FBQ3ZCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRTtZQUM3QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzRixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLGdCQUFnQixHQUFHLFVBQVUsWUFBb0I7WUFDckQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixHQUFHLFlBQVksQ0FBQyxDQUFDO2FBQzVEO1lBRUQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1lBQzVCLHdFQUF3RTtZQUN4RSxJQUFJLHlCQUF5QixFQUFFO2dCQUM3QixNQUFNLDhCQUE4QixHQUNsQyx1QkFBdUIsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0UsSUFBSSw4QkFBOEIsSUFBSSxTQUFTLENBQUMsYUFBYSxFQUFFO29CQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sRUFBRSw4QkFBOEIsRUFBRSxDQUFDLENBQUM7b0JBQzVGLFlBQVksR0FBRyxZQUFZLEdBQUcsOEJBQThCLENBQUM7aUJBQzlEO2FBQ0Y7WUFFRCxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsYUFBYSxFQUFFO2dCQUMxQyx3QkFBd0I7Z0JBQ3hCLE9BQU8sTUFBTSxDQUFDO2FBQ2Y7WUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssTUFBTSxFQUFFO2dCQUNuQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsUUFBUTtvQkFDdEQsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztvQkFDOUUsT0FBTyxNQUFNLENBQUM7Z0JBQ2hCLENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNqRCxlQUFlO1lBQ2YsSUFBSSxnQkFBZ0IsR0FBRyxZQUFZLEVBQUU7Z0JBQ25DLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztnQkFDeEIsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO2FBQ3RCO1lBRUQsdUNBQXVDO1lBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztZQUV2RCxpREFBaUQ7WUFDakQsTUFBTSxnQkFBZ0IsR0FBRztnQkFDdkIsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ2YsT0FBTyxNQUFNLENBQUM7aUJBQ2Y7Z0JBQ0QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDO29CQUNsQixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUU7d0JBQ3hCLDBEQUEwRDt3QkFDMUQsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDO3FCQUM3Qjt5QkFBTTt3QkFDTCx5REFBeUQ7d0JBQ3pELDZCQUE2Qjt3QkFDN0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3pELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLE1BQU07NEJBQ2xHLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQzt3QkFDeEIsQ0FBQyxDQUFDLENBQUM7cUJBQ0o7Z0JBQ0gsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsT0FBTztvQkFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7b0JBQ3RELE9BQU8sZ0JBQWdCLEVBQUUsQ0FBQztnQkFDNUIsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUM7WUFFRixPQUFPLGdCQUFnQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDO1FBRUYsNERBQTREO1FBQzVELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNsQixPQUFPLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxNQUFNO1lBQ3RCLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFDdkIsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtZQUNoRSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDM0MsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNqQztZQUNELFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxNQUFNO2dCQUNuQyxJQUFLLE1BQXdCLENBQUMsT0FBTyxFQUFFO29CQUNwQyxNQUF1QixDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBRSxNQUF3QixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDOUc7Z0JBRUQsaUZBQWlGO2dCQUNqRixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxDQUFDO1lBRUgscUNBQXFDO1lBQ3JDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxNQUFNO2dCQUM5QixXQUFXLENBQUMsU0FBUyxDQUFFLE1BQXVCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RSxDQUFDLENBQUMsQ0FBQztZQUVILFdBQVcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO2lCQUNyQixHQUFHLENBQUMsVUFBVSxNQUFNLEVBQUUsS0FBSztnQkFDMUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDWCxPQUFPLFNBQVMsQ0FBQztpQkFDbEI7Z0JBQ0QsTUFBTSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUMsQ0FBQztpQkFDRCxNQUFNLEVBQUU7aUJBQ1IsS0FBSyxFQUFFLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLGlFQUFpRTtJQUNqRSxNQUFNLFNBQVMsR0FBRztRQUNoQix5R0FBeUc7UUFDekcsTUFBTSxjQUFjLEdBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxPQUFPO1lBQzNELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdkcsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9HLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsVUFBVSxVQUFVO1lBQ25ELGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsa0RBQWtEO1FBQ3BILENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQVE7WUFDbEIsY0FBYyxFQUFFLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUU7WUFDckQsUUFBUSxFQUFFLGNBQWM7WUFDeEIsR0FBRyxFQUFFLEdBQUc7WUFDUixlQUFlLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7Z0JBQzdDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDO1lBQ0YsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO1lBQzVCLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVM7WUFDeEMsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLGFBQWEsRUFBRSxZQUFZLENBQUMsSUFBSTtZQUNoQyxNQUFNLEVBQUUsTUFBTTtZQUNkLFdBQVcsRUFBRSxXQUFXO1NBQ3pCLENBQUM7UUFFRixrQ0FBa0M7UUFDbEMsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLFlBQVksRUFBRTtZQUNsQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FDakU7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7SUFFRixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDbEIsT0FBTyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDLENBQUM7U0FDQyxJQUFJLENBQUM7UUFDSixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxhQUFhLENBQUM7U0FDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQztTQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxNQUFNO0lBQzlDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxNQUFNLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRTtRQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7S0FDbkQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUU7UUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0tBQ2xFO0lBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksTUFBTSxDQUFDLGdCQUFnQixHQUFHLENBQUMsRUFBRTtRQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7S0FDdEU7SUFDRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixHQUFHLENBQUMsRUFBRTtRQUNwRCxNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7S0FDM0U7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUU7UUFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0tBQ2hEO0lBRUQsbUZBQW1GO0lBQ25GLDJFQUEyRTtJQUMzRSxNQUFNLDRDQUE0QyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFNUQsT0FBTztJQUNMLG1GQUFtRjtJQUNuRixtRkFBbUY7SUFDbkYsaUZBQWlGO0lBQ2pGLENBQUMsdUJBQVksQ0FBQyxlQUFlO1FBQzNCLENBQUMsTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0YsTUFBTSxDQUFDLFdBQVc7UUFDcEIsdUJBQVksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7UUFDbEUsdUJBQVksQ0FBQywrQkFBK0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO1FBQ3pFLHVCQUFZLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLFFBQVE7UUFDaEQsa0ZBQWtGO1FBQ2xGLHVCQUFZLENBQUMsY0FBYztRQUMzQixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3RDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLENBQUMscUJBQXFCLEdBQUcsVUFBVSxNQUFNO0lBQzlDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDbkYsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEQsT0FBTztRQUNMLElBQUksRUFBRSxhQUFhO1FBQ25CLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNyRCxPQUFPLEVBQUUsWUFBWTtLQUN0QixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxDQUFDLGVBQWUsR0FBRyxVQUFVLE1BQU07SUFDeEMsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHNDQUFzQztJQUV0RSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3hFLElBQUksT0FBTyxDQUFDO0lBQ1osSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1FBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztLQUM5RDtJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7S0FDakQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7S0FDdkQ7SUFDRCxJQUFJLE9BQU8sR0FBRyxJQUFBLHFCQUFVLEdBQUUsQ0FBQztJQUMzQixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQztJQUUzRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUUsUUFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNoRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQW1DLENBQUMsQ0FBQztZQUN6RixRQUFRLEdBQUcsU0FBUyxDQUFDO1NBQ3RCO2FBQU07WUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7U0FDNUQ7S0FDRjtJQUVELElBQUksWUFBWSxDQUFDO0lBQ2pCLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRTtRQUMxQixZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxPQUFtQyxDQUFDLENBQUM7S0FDcEc7SUFFRCxLQUFLLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTlCLElBQUksU0FBUyxFQUFFO1FBQ2IsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN2QyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDbkM7SUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0YsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLDJFQUEyRSxDQUFDLENBQUM7S0FDOUY7SUFFRCw4RUFBOEU7SUFDOUUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFFLFdBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEYsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUUsTUFBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZGLElBQUksUUFBUSxJQUFJLGdCQUFnQixFQUFFO1FBQ2hDLGdEQUFnRDtRQUNoRCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFFLE1BQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0UsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3hGO0lBRUQsSUFBSSxVQUFVLENBQUM7SUFDZixJQUFJLFFBQVEsRUFBRTtRQUNaLFVBQVUsR0FBRyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDOUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRS9FLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUU7UUFDdEQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLGNBQWMsQ0FBQyxZQUFZLEtBQUssS0FBSyxFQUFFO1lBQ3pDLGtEQUFrRDtZQUNsRCxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG1FQUFtRSxDQUFDLENBQUM7YUFDdEY7WUFFRCxJQUFJLFNBQVMsRUFBRTtnQkFDYixZQUFZLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzthQUNoQztZQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzlCLFNBQVM7U0FDVjtRQUVELElBQUksY0FBYyxDQUFDLGFBQWEsSUFBSSxTQUFTLEVBQUU7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUMzQyxJQUFJLFVBQVUsRUFBRTtZQUNkLE1BQU0sRUFBRSxhQUFhLEdBQUcsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUEsNkJBQWtCLEVBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxhQUFhLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDM0UsS0FBSyxDQUNILHlIQUF5SCxFQUN6SCxJQUFJLEVBQ0osUUFBUSxDQUFDLElBQUksRUFDYixhQUFhLEVBQ2IsUUFBUSxDQUFDLGFBQWEsRUFDdEIsU0FBUyxDQUNWLENBQUM7WUFDRixPQUFPLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QztRQUVELE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRTFCLHlFQUF5RTtRQUN6RSxpRUFBaUU7UUFDakUscURBQXFEO1FBQ3JELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRSxjQUFjLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1FBRTVDLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsMkNBQTJDO1FBQzNDLElBQUk7WUFDRixNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNsSCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDbkY7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLDhDQUE4QztZQUM5QyxJQUFJLHlCQUF5QixHQUFHLEtBQUssQ0FBQztZQUN0QyxJQUFJO2dCQUNGLE1BQU0sWUFBWSxHQUFHLElBQUEsNkJBQWtCLEVBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFDbkUsS0FBSyxDQUNILGlGQUFpRixFQUNqRixZQUFZLEVBQ1osUUFBUSxDQUFDLElBQUksRUFDYixTQUFTLENBQ1YsQ0FBQztnQkFDRixPQUFPLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLGFBQWE7b0JBQ2hELENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDO29CQUNsRCxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNkLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pELEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQ2xGLHlCQUF5QixHQUFHLElBQUksQ0FBQzthQUNsQztZQUFDLE9BQU8sYUFBYSxFQUFFO2dCQUN0QixLQUFLLENBQUMseUNBQXlDLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3pFO1lBQ0Qsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtnQkFDOUIsQ0FBQyxDQUFDLE1BQU0sR0FBRztvQkFDVCxPQUFPLEVBQUUsY0FBYztpQkFDeEIsQ0FBQztnQkFDRixDQUFDLENBQUMsT0FBTyxHQUFHLHlCQUF5QixLQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUM5RixDQUFDLENBQUMsS0FDSixFQUFFLENBQUM7Z0JBQ0gsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzNCO1NBQ0Y7S0FDRjtJQUVELE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBRWpELElBQUksUUFBUSxFQUFFO1FBQ1osa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM5QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsS0FBSztpQkFDakMseUJBQXlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUNsRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2xELElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtnQkFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO2FBQ2pGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUVELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUN0QixjQUFjLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFO0tBQzNDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5cbi8qKlxuICovXG4vL1xuLy8gVHJhbnNhY3Rpb25CdWlsZGVyXG4vLyBBIHV0aWxpdHkgZm9yIGJ1aWxkaW5nIGFuZCBzaWduaW5nIHRyYW5zYWN0aW9uc1xuLy9cbi8vIENvcHlyaWdodCAyMDE0LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5cbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIEJsdWViaXJkIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5pbXBvcnQgZGVidWdMaWIgPSByZXF1aXJlKCdkZWJ1ZycpO1xuY29uc3QgZGVidWcgPSBkZWJ1Z0xpYignYml0Z286djE6dHhiJyk7XG5pbXBvcnQgeyBjb21tb24sIGdldEFkZHJlc3NQMlBLSCwgZ2V0TmV0d29yaywgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IHZlcmlmeUFkZHJlc3MgfSBmcm9tICcuL3ZlcmlmeUFkZHJlc3MnO1xuXG5pbnRlcmZhY2UgQmFzZU91dHB1dCB7XG4gIGFtb3VudDogbnVtYmVyO1xuICB0cmF2ZWxJbmZvPzogYW55O1xufVxuXG5pbnRlcmZhY2UgQWRkcmVzc091dHB1dCBleHRlbmRzIEJhc2VPdXRwdXQge1xuICBhZGRyZXNzOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTY3JpcHRPdXRwdXQgZXh0ZW5kcyBCYXNlT3V0cHV0IHtcbiAgc2NyaXB0OiBCdWZmZXI7XG59XG5cbnR5cGUgT3V0cHV0ID0gQWRkcmVzc091dHB1dCB8IFNjcmlwdE91dHB1dDtcblxuaW50ZXJmYWNlIEJpdEdvVW5zcGVudCB7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHR4X2hhc2g6IEJ1ZmZlcjtcbiAgdHhfb3V0cHV0X246IG51bWJlcjtcbn1cblxuLy9cbi8vIFRyYW5zYWN0aW9uQnVpbGRlclxuLy8gQHBhcmFtczpcbi8vICAgd2FsbGV0OiAgYSB3YWxsZXQgb2JqZWN0IHRvIHNlbmQgZnJvbVxuLy8gICByZWNpcGllbnRzOiBhcnJheSBvZiByZWNpcGllbnQgb2JqZWN0cyBhbmQgdGhlIGFtb3VudCB0byBzZW5kIHRvIGVhY2ggZS5nLiBbe2FkZHJlc3M6ICczOEJLRE5aYlBjTG9ndlZiY3gyZWtKOUU2VnY5NERxRHF3JywgYW1vdW50OiAxNTAwfSwge2FkZHJlc3M6ICczNmVMOHlRcUNuMUhNUm1WRkZvNDl0MlBKM3BhaTh3UWFtJywgYW1vdW50OiAyMDAwfV1cbi8vICAgZmVlOiB0aGUgZmVlIHRvIHVzZSB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uICBpZiBub3QgcHJvdmlkZWQsIGEgZGVmYXVsdCwgbWluaW11bSBmZWUgd2lsbCBiZSB1c2VkLlxuLy8gICBmZWVSYXRlOiB0aGUgYW1vdW50IG9mIGZlZSBwZXIga2lsb2J5dGUgLSBvcHRpb25hbCAtIHNwZWNpZnkgZWl0aGVyIGZlZSwgZmVlUmF0ZSwgb3IgZmVlVHhDb25maXJtVGFyZ2V0IGJ1dCBub3QgbW9yZSB0aGFuIG9uZVxuLy8gICBmZWVUeENvbmZpcm1UYXJnZXQ6IGNhbGN1bGF0ZSB0aGUgZmVlcyBwZXIga2lsb2J5dGUgc3VjaCB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIGNvbmZpcm1lZCBpbiB0aGlzIG51bWJlciBvZiBibG9ja3Ncbi8vICAgbWF4RmVlUmF0ZTogVGhlIG1heGltdW0gZmVlIHBlciBrYiB0byB1c2UgaW4gc2F0b3NoaXMsIGZvciBzYWZldHkgcHVycG9zZXMgd2hlbiB1c2luZyBkeW5hbWljIGZlZXNcbi8vICAgbWluQ29uZmlybXM6IHRoZSBtaW5pbXVtIGNvbmZpcm1hdGlvbnMgYW4gb3V0cHV0IG11c3QgaGF2ZSBiZWZvcmUgc3BlbmRpbmdcbi8vICAgZm9yY2VDaGFuZ2VBdEVuZDogZm9yY2UgdGhlIGNoYW5nZSBhZGRyZXNzIHRvIGJlIHRoZSBsYXN0IG91dHB1dFxuLy8gICBjaGFuZ2VBZGRyZXNzOiBzcGVjaWZ5IHRoZSBjaGFuZ2UgYWRkcmVzcyByYXRoZXIgdGhhbiBnZW5lcmF0ZSBhIG5ldyBvbmVcbi8vICAgbm9TcGxpdENoYW5nZTogc2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4vLyAgIHRhcmdldFdhbGxldFVuc3BlbnRzOiBzcGVjaWZ5IGEgbnVtYmVyIG9mIHRhcmdldCB1bnNwZW50cyB0byBtYWludGFpbiBpbiB0aGUgd2FsbGV0IChjdXJyZW50bHkgZGVmYXVsdGVkIHRvIDggYnkgdGhlIHNlcnZlcilcbi8vICAgdmFsaWRhdGU6IGV4dHJhIHZlcmlmaWNhdGlvbiBvZiB0aGUgY2hhbmdlIGFkZHJlc3Nlcywgd2hpY2ggaXMgYWx3YXlzIGRvbmUgc2VydmVyLXNpZGUgYW5kIGlzIHJlZHVuZGFudCBjbGllbnQtc2lkZSAoZGVmYXVsdHMgdHJ1ZSlcbi8vICAgbWluVW5zcGVudFNpemU6IFRoZSBtaW5pbXVtIHNpemUgaW4gc2F0b3NoaXMgb2YgdW5zcGVudCB0byB1c2UgKHRvIHByZXZlbnQgc3BlbmRpbmcgdW5zcGVudHMgd29ydGggbGVzcyB0aGFuIGZlZSBhZGRlZCkuIERlZmF1bHRzIHRvIDAuXG4vLyAgIGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3M6IFVzZSB0aGlzIHNpbmdsZSBrZXkgYWRkcmVzcyB0byBwYXkgZmVlc1xuLy8gICBmZWVTaW5nbGVLZXlXSUY6IFVzZSB0aGUgYWRkcmVzcyBiYXNlZCBvbiB0aGlzIHByaXZhdGUga2V5IHRvIHBheSBmZWVzXG4vLyAgIHVuc3BlbnRzRmV0Y2hQYXJhbXM6IEV4dHJhIHBhcmFtZXRlcnMgdG8gdXNlIGZvciBmZXRjaGluZyB1bnNwZW50cyBmb3IgdGhpcyB0cmFuc2FjdGlvblxuZXhwb3J0cy5jcmVhdGVUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgY29uc3QgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXMgfHwgMDtcbiAgY29uc3QgdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG4gIGxldCByZWNpcGllbnRzOiB7IGFkZHJlc3M6IHN0cmluZzsgYW1vdW50OiBudW1iZXI7IHNjcmlwdD86IHN0cmluZzsgdHJhdmVsSW5mbz86IGFueSB9W10gPSBbXTtcbiAgbGV0IG9wUmV0dXJuczogeyBtZXNzYWdlOiBzdHJpbmc7IGFtb3VudDogbnVtYmVyIH1bXSA9IFtdO1xuICBsZXQgZXh0cmFDaGFuZ2VBbW91bnRzOiBudW1iZXJbXSA9IFtdO1xuICBsZXQgZXN0VHhTaXplOiBudW1iZXI7XG4gIGxldCB0cmF2ZWxJbmZvcztcblxuICAvLyBTYW5pdHkgY2hlY2sgdGhlIGFyZ3VtZW50cyBwYXNzZWQgaW5cbiAgaWYgKFxuICAgICFfLmlzT2JqZWN0KHBhcmFtcy53YWxsZXQpIHx8XG4gICAgKHBhcmFtcy5mZWUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZSkpIHx8XG4gICAgKHBhcmFtcy5mZWVSYXRlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSkgfHxcbiAgICAhXy5pc0ludGVnZXIobWluQ29uZmlybXMpIHx8XG4gICAgKHBhcmFtcy5mb3JjZUNoYW5nZUF0RW5kICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCkpIHx8XG4gICAgKHBhcmFtcy5jaGFuZ2VBZGRyZXNzICYmICFfLmlzU3RyaW5nKHBhcmFtcy5jaGFuZ2VBZGRyZXNzKSkgfHxcbiAgICAocGFyYW1zLm5vU3BsaXRDaGFuZ2UgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5ub1NwbGl0Q2hhbmdlKSkgfHxcbiAgICAocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzICYmICFfLmlzSW50ZWdlcihwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMpKSB8fFxuICAgICh2YWxpZGF0ZSAmJiAhXy5pc0Jvb2xlYW4odmFsaWRhdGUpKSB8fFxuICAgIChwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlKSkgfHxcbiAgICAocGFyYW1zLm1pblVuc3BlbnRTaXplICYmICFfLmlzTnVtYmVyKHBhcmFtcy5taW5VbnNwZW50U2l6ZSkpIHx8XG4gICAgKHBhcmFtcy5tYXhGZWVSYXRlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5tYXhGZWVSYXRlKSkgfHxcbiAgICAvLyB0aGlzIHNob3VsZCBiZSBhbiBhcnJheSBhbmQgaXRzIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IDFcbiAgICAocGFyYW1zLnVuc3BlbnRzICYmICghQXJyYXkuaXNBcnJheShwYXJhbXMudW5zcGVudHMpIHx8IHBhcmFtcy51bnNwZW50cy5sZW5ndGggPCAxKSkgfHxcbiAgICAocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAmJiAhXy5pc0ludGVnZXIocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCkpIHx8XG4gICAgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHx8XG4gICAgKHBhcmFtcy5iaXRnb0ZlZSAmJiAhXy5pc09iamVjdChwYXJhbXMuYml0Z29GZWUpKSB8fFxuICAgIChwYXJhbXMudW5zcGVudHNGZXRjaFBhcmFtcyAmJiAhXy5pc09iamVjdChwYXJhbXMudW5zcGVudHNGZXRjaFBhcmFtcykpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICB9XG5cbiAgY29uc3QgYml0Z28gPSBwYXJhbXMud2FsbGV0LmJpdGdvO1xuICBjb25zdCBjb25zdGFudHMgPSBiaXRnby5nZXRDb25zdGFudHMoKTtcbiAgY29uc3QgbmV0d29yayA9IGdldE5ldHdvcmsoY29tbW9uLkVudmlyb25tZW50c1tiaXRnby5nZXRFbnYoKV0ubmV0d29yayk7XG5cbiAgLy8gVGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBzZXBlcmF0ZSwgc2luZ2xlLWtleSB3YWxsZXQgZm9yIHRoZSBwdXJwb3NlcyBvZiBwYXlpbmcgbWluZXIncyBmZWVzXG4gIC8vIFdoZW4gY3JlYXRpbmcgYSB0cmFuc2FjdGlvbiB0aGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4gaW5wdXQgYWRkcmVzcyBvciB0aGUgcHJpdmF0ZSBrZXkgaW4gV0lGXG4gIGxldCBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzO1xuICBsZXQgZmVlU2luZ2xlS2V5SW5wdXRBbW91bnQgPSAwO1xuICBpZiAocGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpIHtcbiAgICB0cnkge1xuICAgICAgdXR4b2xpYi5hZGRyZXNzLmZyb21CYXNlNThDaGVjayhwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcywgbmV0d29yayk7XG4gICAgICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID0gcGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3M7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJpdGNvaW4gYWRkcmVzczogJyArIHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFyYW1zLmZlZVNpbmdsZUtleVdJRikge1xuICAgIGNvbnN0IGZlZVNpbmdsZUtleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYocGFyYW1zLmZlZVNpbmdsZUtleVdJRiwgbmV0d29yayBhcyB1dHhvbGliLkJpdGNvaW5KU05ldHdvcmspO1xuICAgIGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPSBnZXRBZGRyZXNzUDJQS0goZmVlU2luZ2xlS2V5KTtcbiAgICAvLyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgYm90aCwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzIGNvcnJlc3BvbmRzIHRvIHRoZSBhZGRyZXNzIG9mIGZlZVNpbmdsZUtleVdJRlxuICAgIGlmIChwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyAmJiBwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyAhPT0gZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzczogJyArXG4gICAgICAgICAgcGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgK1xuICAgICAgICAgICcgZGlkIG5vdCBjb3JyZXNwb25kIHRvIGFkZHJlc3Mgb2YgZmVlU2luZ2xlS2V5V0lGOiAnICtcbiAgICAgICAgICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY2lwaWVudHMgbXVzdCBiZSBhcnJheSBvZiB7IGFkZHJlc3M6IGFiYywgYW1vdW50OiAxMDAwMDAgfSBvYmplY3RzJyk7XG4gIH1cblxuICBsZXQgZmVlUGFyYW1zRGVmaW5lZCA9IDA7XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlKSkge1xuICAgIGZlZVBhcmFtc0RlZmluZWQrKztcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICBmZWVQYXJhbXNEZWZpbmVkKys7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCkpIHtcbiAgICBmZWVQYXJhbXNEZWZpbmVkKys7XG4gIH1cblxuICBpZiAoZmVlUGFyYW1zRGVmaW5lZCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgb2YgZmVlLCBmZWVSYXRlIGFuZCBmZWVUeENvbmZpcm1UYXJnZXQnKTtcbiAgfVxuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5tYXhGZWVSYXRlKSkge1xuICAgIHBhcmFtcy5tYXhGZWVSYXRlID0gY29uc3RhbnRzLm1heEZlZVJhdGU7XG4gIH1cblxuICAvLyBDb252ZXJ0IHRoZSBvbGQgZm9ybWF0IG9mIHBhcmFtcy5yZWNpcGllbnRzIChkaWN0aW9uYXJ5IG9mIGFkZHJlc3M6YW1vdW50KSB0byBuZXcgZm9ybWF0OiB7IGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50IH1cbiAgaWYgKCEocGFyYW1zLnJlY2lwaWVudHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICByZWNpcGllbnRzID0gW107XG4gICAgT2JqZWN0LmtleXMocGFyYW1zLnJlY2lwaWVudHMpLmZvckVhY2goZnVuY3Rpb24gKGRlc3RpbmF0aW9uQWRkcmVzcykge1xuICAgICAgY29uc3QgYW1vdW50ID0gcGFyYW1zLnJlY2lwaWVudHNbZGVzdGluYXRpb25BZGRyZXNzXTtcbiAgICAgIHJlY2lwaWVudHMucHVzaCh7IGFkZHJlc3M6IGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50OiBhbW91bnQgfSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmVjaXBpZW50cyA9IHBhcmFtcy5yZWNpcGllbnRzO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5vcFJldHVybnMpIHtcbiAgICBpZiAoIShwYXJhbXMub3BSZXR1cm5zIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICBvcFJldHVybnMgPSBbXTtcbiAgICAgIE9iamVjdC5rZXlzKHBhcmFtcy5vcFJldHVybnMpLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgYW1vdW50ID0gcGFyYW1zLm9wUmV0dXJuc1ttZXNzYWdlXTtcbiAgICAgICAgb3BSZXR1cm5zLnB1c2goeyBtZXNzYWdlLCBhbW91bnQgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BSZXR1cm5zID0gcGFyYW1zLm9wUmV0dXJucztcbiAgICB9XG4gIH1cblxuICBpZiAocmVjaXBpZW50cy5sZW5ndGggPT09IDAgJiYgb3BSZXR1cm5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSByZWNpcGllbnQnKTtcbiAgfVxuXG4gIGxldCBmZWUgPSBwYXJhbXMuZmVlO1xuICBsZXQgZmVlUmF0ZSA9IHBhcmFtcy5mZWVSYXRlO1xuXG4gIC8vIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgY2xhc3Mgd2lsbCBjb21wdXRlIHRoZSBmZWVcbiAgY29uc3Qgc2hvdWxkQ29tcHV0ZUJlc3RGZWUgPSBfLmlzVW5kZWZpbmVkKGZlZSk7XG5cbiAgbGV0IHRvdGFsT3V0cHV0QW1vdW50ID0gMDtcblxuICByZWNpcGllbnRzLmZvckVhY2goZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgIGlmIChfLmlzU3RyaW5nKHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgaWYgKCF2ZXJpZnlBZGRyZXNzKHJlY2lwaWVudC5hZGRyZXNzLCBuZXR3b3JrKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcmVjaXBpZW50LnNjcmlwdCkge1xuICAgICAgICAvLyBBIHNjcmlwdCB3YXMgcHJvdmlkZWQgYXMgd2VsbCAtIHZhbGlkYXRlIHRoYXQgdGhlIGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gdGhhdFxuICAgICAgICBpZiAodXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY2lwaWVudC5hZGRyZXNzLCBuZXR3b3JrKS50b1N0cmluZygnaGV4JykgIT09IHJlY2lwaWVudC5zY3JpcHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnYm90aCBzY3JpcHQgYW5kIGFkZHJlc3MgcHJvdmlkZWQgYnV0IHRoZXkgZGlkIG5vdCBtYXRjaDogJyArIHJlY2lwaWVudC5hZGRyZXNzICsgJyAnICsgcmVjaXBpZW50LnNjcmlwdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFfLmlzSW50ZWdlcihyZWNpcGllbnQuYW1vdW50KSB8fCByZWNpcGllbnQuYW1vdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFtb3VudCBmb3IgJyArIHJlY2lwaWVudC5hZGRyZXNzICsgJzogJyArIHJlY2lwaWVudC5hbW91bnQpO1xuICAgIH1cbiAgICB0b3RhbE91dHB1dEFtb3VudCArPSByZWNpcGllbnQuYW1vdW50O1xuICB9KTtcblxuICBvcFJldHVybnMuZm9yRWFjaChmdW5jdGlvbiAob3BSZXR1cm4pIHtcbiAgICB0b3RhbE91dHB1dEFtb3VudCArPSBvcFJldHVybi5hbW91bnQ7XG4gIH0pO1xuXG4gIGxldCBiaXRnb0ZlZUluZm8gPSBwYXJhbXMuYml0Z29GZWU7XG4gIGlmIChiaXRnb0ZlZUluZm8gJiYgKCFfLmlzSW50ZWdlcihiaXRnb0ZlZUluZm8uYW1vdW50KSB8fCAhXy5pc1N0cmluZyhiaXRnb0ZlZUluZm8uYWRkcmVzcykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJpdGdvRmVlSW5mbycpO1xuICB9XG5cbiAgLy8gVGhlIHRvdGFsIGFtb3VudCBuZWVkZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGxldCB0b3RhbEFtb3VudCA9IHRvdGFsT3V0cHV0QW1vdW50ICsgKGZlZSB8fCAwKTtcblxuICAvLyBUaGUgbGlzdCBvZiB1bnNwZW50IHRyYW5zYWN0aW9ucyBiZWluZyB1c2VkIGluIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGxldCB1bnNwZW50cztcblxuICAvLyB0aGUgdG90YWwgbnVtYmVyIG9mIHVuc3BlbnRzIG9uIHRoaXMgd2FsbGV0XG4gIGxldCB0b3RhbFVuc3BlbnRzQ291bnQ7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB1bnNwZW50cyB3ZSBmZXRjaGVkIGZyb20gdGhlIHNlcnZlciwgYmVmb3JlIGZpbHRlcmluZ1xuICBsZXQgZmV0Y2hlZFVuc3BlbnRzQ291bnQ7XG5cbiAgLy8gVGhlIGxpc3Qgb2YgdW5zcGVudCB0cmFuc2FjdGlvbnMgYmVpbmcgdXNlZCB3aXRoIHplcm8tY29uZmlybWF0aW9uc1xuICBsZXQgemVyb0NvbmZVbnNwZW50VHhJZHM7XG5cbiAgLy8gVGhlIHN1bSBvZiB0aGUgaW5wdXQgdmFsdWVzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICBsZXQgaW5wdXRBbW91bnQ7XG5cbiAgbGV0IGNoYW5nZU91dHB1dHM6IE91dHB1dFtdID0gW107XG5cbiAgbGV0IGNvbnRhaW5zVW5jb21wcmVzc2VkUHVibGljS2V5cyA9IGZhbHNlO1xuXG4gIC8vIFRoZSB0cmFuc2FjdGlvbi5cbiAgbGV0IHRyYW5zYWN0aW9uID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGb3JOZXR3b3JrKG5ldHdvcmspO1xuXG4gIGNvbnN0IGdldEJpdEdvRmVlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGJpdGdvRmVlSW5mbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5nZXRCaXRHb0ZlZSh7IGFtb3VudDogdG90YWxPdXRwdXRBbW91bnQsIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50IH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5mZWUgPiAwKSB7XG4gICAgICAgICAgYml0Z29GZWVJbmZvID0ge1xuICAgICAgICAgICAgYW1vdW50OiByZXN1bHQuZmVlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGJpdGdvRmVlSW5mbyAmJiBiaXRnb0ZlZUluZm8uYW1vdW50ID4gMCkge1xuICAgICAgICB0b3RhbEFtb3VudCArPSBiaXRnb0ZlZUluZm8uYW1vdW50O1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGdldEJpdEdvRmVlQWRkcmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYml0Z29GZWVJbmZvLCBvciBhZGRyZXNzIGlzIGFscmVhZHkgc2V0LCBkb24ndCBnZXQgYSBuZXcgb25lXG4gICAgICBpZiAoIWJpdGdvRmVlSW5mbyB8fCBiaXRnb0ZlZUluZm8uYWRkcmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gYml0Z28uZ2V0Qml0R29GZWVBZGRyZXNzKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGJpdGdvRmVlSW5mby5hZGRyZXNzID0gcmVzdWx0LmFkZHJlc3M7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBHZXQgYSBkeW5hbWljIGZlZSBlc3RpbWF0ZSBmcm9tIHRoZSBCaXRHbyBzZXJ2ZXIgaWYgZmVlVHhDb25maXJtVGFyZ2V0XG4gIC8vIGlzIHNwZWNpZmllZCBvciBpZiBubyBmZWUtcmVsYXRlZCBwYXJhbXMgYXJlIHNwZWNpZmllZFxuICBjb25zdCBnZXREeW5hbWljRmVlUmF0ZUVzdGltYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IHx8ICFmZWVQYXJhbXNEZWZpbmVkKSB7XG4gICAgICByZXR1cm4gYml0Z29cbiAgICAgICAgLmVzdGltYXRlRmVlKHtcbiAgICAgICAgICBudW1CbG9ja3M6IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQsXG4gICAgICAgICAgbWF4RmVlOiBwYXJhbXMubWF4RmVlUmF0ZSxcbiAgICAgICAgICBpbnB1dHM6IHplcm9Db25mVW5zcGVudFR4SWRzLFxuICAgICAgICAgIHR4U2l6ZTogZXN0VHhTaXplLFxuICAgICAgICAgIGNwZnBBd2FyZTogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZEZlZVJhdGUgPSByZXN1bHQuY3BmcEZlZVBlcktiO1xuICAgICAgICAgIGNvbnN0IG1pbmltdW0gPSBwYXJhbXMuaW5zdGFudFxuICAgICAgICAgICAgPyBNYXRoLm1heChjb25zdGFudHMubWluRmVlUmF0ZSwgY29uc3RhbnRzLm1pbkluc3RhbnRGZWVSYXRlKVxuICAgICAgICAgICAgOiBjb25zdGFudHMubWluRmVlUmF0ZTtcbiAgICAgICAgICAvLyA1IHNhdG9zaGlzIHBlciBieXRlXG4gICAgICAgICAgLy8gaXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIHBhZGRpbmcgb25seSBhcHBsaWVzIHdoZW4gdGhlIHRocmVzaG9sZCBpcyBjcm9zc2VkLCBidXQgbm90IHdoZW4gdGhlIGRlbHRhIGlzIGxlc3MgdGhhbiB0aGUgcGFkZGluZ1xuICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSA1MDAwO1xuICAgICAgICAgIGlmIChlc3RpbWF0ZWRGZWVSYXRlIDwgbWluaW11bSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIG5ldyBEYXRlKCkgK1xuICAgICAgICAgICAgICAgICc6IEVycm9yIHdoZW4gZXN0aW1hdGluZyBmZWUgZm9yIHNlbmQgZnJvbSAnICtcbiAgICAgICAgICAgICAgICBwYXJhbXMud2FsbGV0LmlkKCkgK1xuICAgICAgICAgICAgICAgICcsIGl0IHdhcyB0b28gbG93IC0gJyArXG4gICAgICAgICAgICAgICAgZXN0aW1hdGVkRmVlUmF0ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZlZVJhdGUgPSBtaW5pbXVtICsgcGFkZGluZztcbiAgICAgICAgICB9IGVsc2UgaWYgKGVzdGltYXRlZEZlZVJhdGUgPiBwYXJhbXMubWF4RmVlUmF0ZSkge1xuICAgICAgICAgICAgZmVlUmF0ZSA9IHBhcmFtcy5tYXhGZWVSYXRlIC0gcGFkZGluZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmVlUmF0ZSA9IGVzdGltYXRlZEZlZVJhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmZWVSYXRlO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAvLyBzYW5pdHkgY2hlY2sgZmFpbGVkIG9uIHR4IHNpemVcbiAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLm1lc3NhZ2UsICdpbnZhbGlkIHR4U2l6ZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVqZWN0KGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb3VsZG4ndCBlc3RpbWF0ZSB0aGUgZmVlLCBwcm9jZWVkIHVzaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICBmZWVSYXRlID0gY29uc3RhbnRzLmZhbGxiYWNrRmVlUmF0ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBlc3RpbWF0aW5nIGZlZSBmb3Igc2VuZCBmcm9tICcgKyBwYXJhbXMud2FsbGV0LmlkKCkgKyAnOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gR2V0IHRoZSB1bnNwZW50cyBmb3IgdGhlIHNlbmRpbmcgd2FsbGV0LlxuICBjb25zdCBnZXRVbnNwZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocGFyYW1zLnVuc3BlbnRzKSB7XG4gICAgICAvLyB3ZSBqdXN0IHdhbm5hIHVzZSBjdXN0b20gdW5zcGVudHNcbiAgICAgIHVuc3BlbnRzID0gcGFyYW1zLnVuc3BlbnRzO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCBlbm91Z2ggdW5zcGVudHMgZm9yIHRoZSByZXF1ZXN0ZWQgYW1vdW50XG4gICAgY29uc3Qgb3B0aW9ucyA9IF8ubWVyZ2Uoe30sIHBhcmFtcy51bnNwZW50c0ZldGNoUGFyYW1zIHx8IHt9LCB7XG4gICAgICB0YXJnZXQ6IHRvdGFsQW1vdW50LFxuICAgICAgbWluU2l6ZTogcGFyYW1zLm1pblVuc3BlbnRTaXplIHx8IDAsXG4gICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCwgLy8gaW5zaXN0IG9uIGluc3RhbnQgdW5zcGVudHMgb25seVxuICAgICAgdGFyZ2V0V2FsbGV0VW5zcGVudHM6IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyxcbiAgICB9KTtcbiAgICBpZiAocGFyYW1zLmluc3RhbnQpIHtcbiAgICAgIG9wdGlvbnMuaW5zdGFudCA9IHBhcmFtcy5pbnN0YW50OyAvLyBpbnNpc3Qgb24gaW5zdGFudCB1bnNwZW50cyBvbmx5XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcy53YWxsZXQudW5zcGVudHNQYWdlZChvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgVW5zcGVudHMgZmV0Y2hlZFxcbjogICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0cywgbnVsbCwgMil9YCk7XG4gICAgICB0b3RhbFVuc3BlbnRzQ291bnQgPSByZXN1bHRzLnRvdGFsO1xuICAgICAgZmV0Y2hlZFVuc3BlbnRzQ291bnQgPSByZXN1bHRzLmNvdW50O1xuICAgICAgdW5zcGVudHMgPSByZXN1bHRzLnVuc3BlbnRzLmZpbHRlcihmdW5jdGlvbiAodSkge1xuICAgICAgICBjb25zdCBjb25maXJtcyA9IHUuY29uZmlybWF0aW9ucyB8fCAwO1xuICAgICAgICBpZiAoIXBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgJiYgdS5pc0NoYW5nZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25maXJtcyA+PSBtaW5Db25maXJtcztcbiAgICAgIH0pO1xuXG4gICAgICAvLyBhYm9ydCBlYXJseSBpZiB0aGVyZSdzIG5vIHZpYWJsZSB1bnNwZW50cywgYmVjYXVzZSBpdCB3b24ndCBiZSBwb3NzaWJsZSB0byBjcmVhdGUgdGhlIHR4biBsYXRlclxuICAgICAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBFcnJvcignMCB1bnNwZW50cyBhdmFpbGFibGUgZm9yIHRyYW5zYWN0aW9uIGNyZWF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNyZWF0ZSBhcnJheSBvZiB1bmNvbmZpcm1lZCB1bnNwZW50IElEIHN0cmluZ3Mgb2YgdGhlIGZvcm0gXCJ0eEhhc2g6b3V0cHV0SW5kZXhcIlxuICAgICAgemVyb0NvbmZVbnNwZW50VHhJZHMgPSBfKHJlc3VsdHMudW5zcGVudHMpXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICByZXR1cm4gIXUuY29uZmlybWF0aW9ucztcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodSkge1xuICAgICAgICAgIHJldHVybiB1LnR4X2hhc2ggKyAnOicgKyB1LnR4X291dHB1dF9uO1xuICAgICAgICB9KVxuICAgICAgICAudmFsdWUoKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoemVyb0NvbmZVbnNwZW50VHhJZHMpKSB7XG4gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gcGFzcyBhbiBlbXB0eSBhcnJheSBvZiBpbnB1dHMgdG8gdGhlIHNlcnZlciwgYmVjYXVzZSBpdCBhc3N1bWVzIGlmIHRoZVxuICAgICAgICAvLyBpbnB1dHMgYXJndW1lbnRzIGV4aXN0cywgaXQgY29udGFpbnMgdmFsdWVzXG4gICAgICAgIHplcm9Db25mVW5zcGVudFR4SWRzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHJlc3BlY3QgdGhlIG9sZCBzcGxpdENoYW5nZVNpemU9MCBwYXJhbWV0ZXJcbiAgICAgIGlmICghcGFyYW1zLm5vU3BsaXRDaGFuZ2UgJiYgcGFyYW1zLnNwbGl0Q2hhbmdlU2l6ZSAhPT0gMCkge1xuICAgICAgICBleHRyYUNoYW5nZUFtb3VudHMgPSByZXN1bHRzLmV4dHJhQ2hhbmdlQW1vdW50cyB8fCBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBHZXQgdGhlIHVuc3BlbnRzIGZvciB0aGUgc2luZ2xlIGtleSBmZWUgYWRkcmVzc1xuICBsZXQgZmVlU2luZ2xlS2V5VW5zcGVudHM6IEJpdEdvVW5zcGVudFtdID0gW107XG4gIGNvbnN0IGdldFVuc3BlbnRzRm9yU2luZ2xlS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICBsZXQgZmVlVGFyZ2V0ID0gMC4wMWU4O1xuICAgICAgaWYgKHBhcmFtcy5pbnN0YW50KSB7XG4gICAgICAgIGZlZVRhcmdldCArPSB0b3RhbEFtb3VudCAqIDAuMDAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJpdGdvXG4gICAgICAgIC5nZXQoYml0Z28udXJsKCcvYWRkcmVzcy8nICsgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyArICcvdW5zcGVudHM/dGFyZ2V0PScgKyBmZWVUYXJnZXQpKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keS50b3RhbCA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHVuc3BlbnRzIGF2YWlsYWJsZSBpbiBzaW5nbGUga2V5IGZlZSBzb3VyY2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHMgPSByZXNwb25zZS5ib2R5LnVuc3BlbnRzO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgbGV0IG1pbmVyRmVlSW5mbzogYW55ID0ge307XG4gIGxldCB0eEluZm86IGFueSA9IHt9O1xuXG4gIC8vIEl0ZXJhdGUgdW5zcGVudHMsIHN1bSB0aGUgaW5wdXRzLCBhbmQgc2F2ZSBfaW5wdXRzIHdpdGggdGhlIHRvdGFsXG4gIC8vIGlucHV0IGFtb3VudCBhbmQgZmluYWwgbGlzdCBvZiBpbnB1dHMgdG8gdXNlIHdpdGggdGhlIHRyYW5zYWN0aW9uLlxuICBsZXQgZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkOiBCaXRHb1Vuc3BlbnRbXSA9IFtdO1xuXG4gIGNvbnN0IGNvbGxlY3RJbnB1dHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF1bnNwZW50cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gdW5zcGVudHMgYXZhaWxhYmxlIG9uIHdhbGxldCcpO1xuICAgIH1cbiAgICBpbnB1dEFtb3VudCA9IDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGNvc3Qgb2Ygc3BlbmRpbmcgYSBzaW5nbGUgaW5wdXQsIGkuZS4gdGhlIHNtYWxsZXN0IGVjb25vbWljYWwgdW5zcGVudCB2YWx1ZVxuICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpIHx8IF8uaXNOdW1iZXIocGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSkpIHtcbiAgICAgICAgcmV0dXJuICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSA/IHBhcmFtcy5mZWVSYXRlIDogcGFyYW1zLm9yaWdpbmFsRmVlUmF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBiaXRnb1xuICAgICAgICAgIC5lc3RpbWF0ZUZlZSh7XG4gICAgICAgICAgICBudW1CbG9ja3M6IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQsXG4gICAgICAgICAgICBtYXhGZWU6IHBhcmFtcy5tYXhGZWVSYXRlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZlZVJhdGVFc3RpbWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZlZVJhdGVFc3RpbWF0ZS5mZWVQZXJLYjtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGZlZVJhdGUpIHtcbiAgICAgICAgLy8gRG9uJ3Qgc3BlbmQgaW5wdXRzIHRoYXQgY2Fubm90IHBheSBmb3IgdGhlaXIgb3duIGNvc3QuXG4gICAgICAgIGxldCBtaW5JbnB1dFZhbHVlID0gMDtcbiAgICAgICAgaWYgKF8uaXNJbnRlZ2VyKHBhcmFtcy5taW5VbnNwZW50U2l6ZSkpIHtcbiAgICAgICAgICBtaW5JbnB1dFZhbHVlID0gcGFyYW1zLm1pblVuc3BlbnRTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBydW5lZFVuc3BlbnRDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVW5zcGVudENvdW50ID0gdW5zcGVudHMubGVuZ3RoO1xuICAgICAgICB1bnNwZW50cyA9IF8uZmlsdGVyKHVuc3BlbnRzLCBmdW5jdGlvbiAodW5zcGVudCkge1xuICAgICAgICAgIGNvbnN0IGlzU2Vnd2l0SW5wdXQgPSAhIXVuc3BlbnQud2l0bmVzc1NjcmlwdDtcbiAgICAgICAgICBjb25zdCBjdXJyZW50SW5wdXRTaXplID0gaXNTZWd3aXRJbnB1dCA/IFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSA6IFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemU7XG4gICAgICAgICAgY29uc3QgZmVlQmFzZWRNaW5JbnB1dFZhbHVlID0gKGZlZVJhdGUgKiBjdXJyZW50SW5wdXRTaXplKSAvIDEwMDA7XG4gICAgICAgICAgY29uc3QgY3VycmVudE1pbklucHV0VmFsdWUgPSBNYXRoLm1heChtaW5JbnB1dFZhbHVlLCBmZWVCYXNlZE1pbklucHV0VmFsdWUpO1xuICAgICAgICAgIGlmIChjdXJyZW50TWluSW5wdXRWYWx1ZSA+IHVuc3BlbnQudmFsdWUpIHtcbiAgICAgICAgICAgIC8vIHBydW5pbmcgdW5zcGVudFxuICAgICAgICAgICAgY29uc3QgcHJ1bmVEZXRhaWxzID0ge1xuICAgICAgICAgICAgICBnZW5lcmFsTWluSW5wdXRWYWx1ZTogbWluSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgZmVlQmFzZWRNaW5JbnB1dFZhbHVlLFxuICAgICAgICAgICAgICBjdXJyZW50TWluSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgZmVlUmF0ZSxcbiAgICAgICAgICAgICAgaW5wdXRTaXplOiBjdXJyZW50SW5wdXRTaXplLFxuICAgICAgICAgICAgICB1bnNwZW50OiB1bnNwZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBwcnVuaW5nIHVuc3BlbnQ6ICR7SlNPTi5zdHJpbmdpZnkocHJ1bmVEZXRhaWxzLCBudWxsLCA0KX1gKTtcbiAgICAgICAgICAgIHBydW5lZFVuc3BlbnRDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBydW5lZFVuc3BlbnRDb3VudCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgcHJ1bmVkICR7cHJ1bmVkVW5zcGVudENvdW50fSBvdXQgb2YgJHtvcmlnaW5hbFVuc3BlbnRDb3VudH0gdW5zcGVudHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luc3VmZmljaWVudCBmdW5kcycpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZWd3aXRJbnB1dENvdW50ID0gMDtcbiAgICAgICAgdW5zcGVudHMuZXZlcnkoZnVuY3Rpb24gKHVuc3BlbnQpIHtcbiAgICAgICAgICBpZiAodW5zcGVudC53aXRuZXNzU2NyaXB0KSB7XG4gICAgICAgICAgICBzZWd3aXRJbnB1dENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlucHV0QW1vdW50ICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uYWRkSW5wdXQodW5zcGVudC50eF9oYXNoLCB1bnNwZW50LnR4X291dHB1dF9uLCAweGZmZmZmZmZmKTtcblxuICAgICAgICAgIHJldHVybiBpbnB1dEFtb3VudCA8IChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID8gdG90YWxPdXRwdXRBbW91bnQgOiB0b3RhbEFtb3VudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIHBheWluZyBmZWVzIGZyb20gYW4gZXh0ZXJuYWwgc2luZ2xlIGtleSB3YWxsZXQsIGFkZCB0aGUgaW5wdXRzXG4gICAgICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICAgICAgLy8gY29sbGVjdCB0aGUgYW1vdW50IHVzZWQgaW4gdGhlIGZlZSBpbnB1dHMgc28gd2UgY2FuIGdldCBjaGFuZ2UgbGF0ZXJcbiAgICAgICAgICBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCA9IDA7XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkID0gW107XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHMuZXZlcnkoZnVuY3Rpb24gKHVuc3BlbnQpIHtcbiAgICAgICAgICAgIGZlZVNpbmdsZUtleUlucHV0QW1vdW50ICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgICAgICBpbnB1dEFtb3VudCArPSB1bnNwZW50LnZhbHVlO1xuICAgICAgICAgICAgdHJhbnNhY3Rpb24uYWRkSW5wdXQodW5zcGVudC50eF9oYXNoLCB1bnNwZW50LnR4X291dHB1dF9uKTtcbiAgICAgICAgICAgIGZlZVNpbmdsZUtleVVuc3BlbnRzVXNlZC5wdXNoKHVuc3BlbnQpO1xuICAgICAgICAgICAgLy8gdXNlIHRoZSBmZWUgd2FsbGV0IHRvIHBheSBtaW5lciBmZWVzIGFuZCBwb3RlbnRpYWxseSBpbnN0YW50IGZlZXNcbiAgICAgICAgICAgIHJldHVybiBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCA8IGZlZSArIChiaXRnb0ZlZUluZm8gPyBiaXRnb0ZlZUluZm8uYW1vdW50IDogMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0eEluZm8gPSB7XG4gICAgICAgICAgblAyc2hJbnB1dHM6IHRyYW5zYWN0aW9uLnR4Lmlucy5sZW5ndGggLSAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IDEgOiAwKSAtIHNlZ3dpdElucHV0Q291bnQsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogc2Vnd2l0SW5wdXRDb3VudCxcbiAgICAgICAgICBuUDJwa2hJbnB1dHM6IGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPyAxIDogMCxcbiAgICAgICAgICAvLyBhZGQgc2luZ2xlIGtleSBzb3VyY2UgYWRkcmVzcyBjaGFuZ2VcbiAgICAgICAgICBuT3V0cHV0czpcbiAgICAgICAgICAgIHJlY2lwaWVudHMubGVuZ3RoICtcbiAgICAgICAgICAgIDEgKyAvLyByZWNpcGllbnRzIGFuZCBjaGFuZ2VcbiAgICAgICAgICAgIGV4dHJhQ2hhbmdlQW1vdW50cy5sZW5ndGggKyAvLyBleHRyYSBjaGFuZ2Ugc3BsaXR0aW5nXG4gICAgICAgICAgICAoYml0Z29GZWVJbmZvICYmIGJpdGdvRmVlSW5mby5hbW91bnQgPiAwID8gMSA6IDApICsgLy8gYWRkIG91dHB1dCBmb3IgYml0Z28gZmVlXG4gICAgICAgICAgICAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IDEgOiAwKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBBcyBwZXIgdGhlIHJlc3BvbnNlIG9mIGdldCB1bnNwZW50cyBBUEksIGZvciB2MSBzYWZlIHdhbGxldHMgcmVkZWVtU2NyaXB0IGlzIHJldHVybmVkXG4gICAgICAgIC8vIGluIHRoZSByZXNwb25zZSBpbiBoZXggZm9ybWF0XG4gICAgICAgIGNvbnRhaW5zVW5jb21wcmVzc2VkUHVibGljS2V5cyA9IHVuc3BlbnRzLnNvbWUoXG4gICAgICAgICAgKHUpID0+IHUucmVkZWVtU2NyaXB0Lmxlbmd0aCA9PT0gMjAxICogMiAvKiBoZXggbGVuZ3RoIGlzIHR3aWNlIHRoZSBsZW5ndGggaW4gYnl0ZXMgKi9cbiAgICAgICAgKTtcblxuICAgICAgICBlc3RUeFNpemUgPSBlc3RpbWF0ZVRyYW5zYWN0aW9uU2l6ZSh7XG4gICAgICAgICAgY29udGFpbnNVbmNvbXByZXNzZWRQdWJsaWNLZXlzLFxuICAgICAgICAgIG5QMnNoSW5wdXRzOiB0eEluZm8ublAyc2hJbnB1dHMsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogdHhJbmZvLm5QMnNoUDJ3c2hJbnB1dHMsXG4gICAgICAgICAgblAycGtoSW5wdXRzOiB0eEluZm8ublAycGtoSW5wdXRzLFxuICAgICAgICAgIG5PdXRwdXRzOiB0eEluZm8ubk91dHB1dHMsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKGdldER5bmFtaWNGZWVSYXRlRXN0aW1hdGUpXG4gICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1pbmVyRmVlSW5mbyA9IGV4cG9ydHMuY2FsY3VsYXRlTWluZXJGZWVJbmZvKHtcbiAgICAgICAgICBiaXRnbzogcGFyYW1zLndhbGxldC5iaXRnbyxcbiAgICAgICAgICBjb250YWluc1VuY29tcHJlc3NlZFB1YmxpY0tleXMsXG4gICAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgICBuUDJzaElucHV0czogdHhJbmZvLm5QMnNoSW5wdXRzLFxuICAgICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IHR4SW5mby5uUDJzaFAyd3NoSW5wdXRzLFxuICAgICAgICAgIG5QMnBraElucHV0czogdHhJbmZvLm5QMnBraElucHV0cyxcbiAgICAgICAgICBuT3V0cHV0czogdHhJbmZvLm5PdXRwdXRzLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2hvdWxkQ29tcHV0ZUJlc3RGZWUpIHtcbiAgICAgICAgICBjb25zdCBhcHByb3hpbWF0ZUZlZSA9IG1pbmVyRmVlSW5mby5mZWU7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkUmVjdXJzZSA9IF8uaXNVbmRlZmluZWQoZmVlKSB8fCBhcHByb3hpbWF0ZUZlZSA+IGZlZTtcbiAgICAgICAgICBmZWUgPSBhcHByb3hpbWF0ZUZlZTtcbiAgICAgICAgICAvLyBSZWNvbXB1dGUgdG90YWxBbW91bnQgZnJvbSBzY3JhdGNoXG4gICAgICAgICAgdG90YWxBbW91bnQgPSBmZWUgKyB0b3RhbE91dHB1dEFtb3VudDtcbiAgICAgICAgICBpZiAoYml0Z29GZWVJbmZvKSB7XG4gICAgICAgICAgICB0b3RhbEFtb3VudCArPSBiaXRnb0ZlZUluZm8uYW1vdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdWxkUmVjdXJzZSkge1xuICAgICAgICAgICAgLy8gaWYgZmVlIGNoYW5nZWQsIHJlLWNvbGxlY3QgaW5wdXRzXG4gICAgICAgICAgICBpbnB1dEFtb3VudCA9IDA7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbiA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25CdWlsZGVyRm9yTmV0d29yayhuZXR3b3JrKTtcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0SW5wdXRzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxGZWUgPSBmZWUgKyAoYml0Z29GZWVJbmZvID8gYml0Z29GZWVJbmZvLmFtb3VudCA6IDApO1xuXG4gICAgICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICAgICAgY29uc3Qgc3VtbWVkU2luZ2xlS2V5VW5zcGVudHMgPSBfLnN1bUJ5KGZlZVNpbmdsZUtleVVuc3BlbnRzLCAndmFsdWUnKTtcbiAgICAgICAgICBpZiAodG90YWxGZWUgPiBzdW1tZWRTaW5nbGVLZXlVbnNwZW50cykge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBhbnkgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdJbnN1ZmZpY2llbnQgZmVlIGFtb3VudCBhdmFpbGFibGUgaW4gc2luZ2xlIGtleSBmZWUgc291cmNlOiAnICsgc3VtbWVkU2luZ2xlS2V5VW5zcGVudHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIucmVzdWx0ID0ge1xuICAgICAgICAgICAgICBmZWU6IGZlZSxcbiAgICAgICAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgICAgICAgZXN0aW1hdGVkU2l6ZTogbWluZXJGZWVJbmZvLnNpemUsXG4gICAgICAgICAgICAgIGF2YWlsYWJsZTogaW5wdXRBbW91bnQsXG4gICAgICAgICAgICAgIGJpdGdvRmVlOiBiaXRnb0ZlZUluZm8sXG4gICAgICAgICAgICAgIHR4SW5mbzogdHhJbmZvLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBCbHVlYmlyZC5yZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5wdXRBbW91bnQgPCAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IHRvdGFsT3V0cHV0QW1vdW50IDogdG90YWxBbW91bnQpKSB7XG4gICAgICAgICAgLy8gVGhlIHVuc3BlbnRzIHdlJ3JlIHVzaW5nIGZvciBpbnB1dHMgZG8gbm90IGhhdmUgc3VmZmljaWVudCB2YWx1ZSBvbiB0aGVtIHRvXG4gICAgICAgICAgLy8gc2F0aXNmeSB0aGUgdXNlcidzIHJlcXVlc3RlZCBzcGVuZCBhbW91bnQuIFRoYXQgbWF5IGJlIGJlY2F1c2UgdGhlIHdhbGxldCdzIGJhbGFuY2VcbiAgICAgICAgICAvLyBpcyBzaW1wbHkgdG9vIGxvdywgb3IgaXQgbWlnaHQgYmUgdGhhdCB0aGUgd2FsbGV0J3MgYmFsYW5jZSBpcyBzdWZmaWNpZW50IGJ1dFxuICAgICAgICAgIC8vIHdlIGRpZG4ndCBmZXRjaCBlbm91Z2ggdW5zcGVudHMuIFRvbyBmZXcgdW5zcGVudHMgY291bGQgcmVzdWx0IGZyb20gdGhlIHdhbGxldFxuICAgICAgICAgIC8vIGhhdmluZyBtYW55IHNtYWxsIHVuc3BlbnRzIGFuZCB3ZSBoaXQgb3VyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgaW5wdXRzIHdlIGNhbiB1c2VcbiAgICAgICAgICAvLyBpbiBhIHR4biwgb3IgaXQgbWlnaHQgaGF2ZSBiZWVuIHRoYXQgdGhlIGZpbHRlcnMgdGhlIHVzZXIgcGFzc2VkIGluIChsaWtlIG1pbkNvbmZpcm1zKVxuICAgICAgICAgIC8vIGRpc3F1YWxpZmllZCB0b28gbWFueSBvZiB0aGUgdW5zcGVudHNcbiAgICAgICAgICBsZXQgZXJyO1xuICAgICAgICAgIGlmICh0b3RhbFVuc3BlbnRzQ291bnQgPT09IGZldGNoZWRVbnNwZW50c0NvdW50KSB7XG4gICAgICAgICAgICAvLyB3ZSBmZXRjaGVkIGV2ZXJ5IHVuc3BlbnQgdGhlIHdhbGxldCBoYWQsIGJ1dCBpdCBzdGlsbCB3YXNuJ3QgZW5vdWdoXG4gICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoJ0luc3VmZmljaWVudCBmdW5kcycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSB3ZXJlbid0IGFibGUgdG8gZmV0Y2ggYWxsIHRoZSB1bnNwZW50cyBvbiB0aGUgd2FsbGV0XG4gICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBUcmFuc2FjdGlvbiBzaXplIHRvbyBsYXJnZSBkdWUgdG8gdG9vIG1hbnkgdW5zcGVudHMuIENhbiBzZW5kIG9ubHkgJHtpbnB1dEFtb3VudH0gc2F0b3NoaXMgaW4gdGhpcyB0cmFuc2FjdGlvbmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVyci5yZXN1bHQgPSB7XG4gICAgICAgICAgICBmZWU6IGZlZSxcbiAgICAgICAgICAgIGZlZVJhdGU6IGZlZVJhdGUsXG4gICAgICAgICAgICBlc3RpbWF0ZWRTaXplOiBtaW5lckZlZUluZm8uc2l6ZSxcbiAgICAgICAgICAgIGF2YWlsYWJsZTogaW5wdXRBbW91bnQsXG4gICAgICAgICAgICBiaXRnb0ZlZTogYml0Z29GZWVJbmZvLFxuICAgICAgICAgICAgdHhJbmZvOiB0eEluZm8sXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9O1xuXG4gIC8vIEFkZCB0aGUgb3V0cHV0cyBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgY29uc3QgY29sbGVjdE91dHB1dHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1pbmVyRmVlSW5mby5zaXplID49IDkwMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYW5zYWN0aW9uIHRvbyBsYXJnZTogZXN0aW1hdGVkIHNpemUgJyArIG1pbmVyRmVlSW5mby5zaXplICsgJyBieXRlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHM6IE91dHB1dFtdID0gW107XG5cbiAgICByZWNpcGllbnRzLmZvckVhY2goZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgICAgbGV0IHNjcmlwdDtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgICBzY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQocmVjaXBpZW50LmFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHJlY2lwaWVudC5zY3JpcHQpKSB7XG4gICAgICAgIHNjcmlwdCA9IHJlY2lwaWVudC5zY3JpcHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25laXRoZXIgcmVjaXBpZW50IGFkZHJlc3Mgbm9yIHNjcmlwdCB3YXMgcHJvdmlkZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWRhdGUgdHJhdmVsSW5mbyBpZiBpdCBleGlzdHNcbiAgICAgIGxldCB0cmF2ZWxJbmZvO1xuICAgICAgaWYgKCFfLmlzRW1wdHkocmVjaXBpZW50LnRyYXZlbEluZm8pKSB7XG4gICAgICAgIHRyYXZlbEluZm8gPSByZWNpcGllbnQudHJhdmVsSW5mbztcbiAgICAgICAgLy8gQmV0dGVyIHRvIGF2b2lkIHRyb3VibGUgbm93LCBiZWZvcmUgdHggaXMgY3JlYXRlZFxuICAgICAgICBiaXRnby50cmF2ZWxSdWxlKCkudmFsaWRhdGVUcmF2ZWxJbmZvKHRyYXZlbEluZm8pO1xuICAgICAgfVxuXG4gICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICBzY3JpcHQ6IHNjcmlwdCxcbiAgICAgICAgYW1vdW50OiByZWNpcGllbnQuYW1vdW50LFxuICAgICAgICB0cmF2ZWxJbmZvOiB0cmF2ZWxJbmZvLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBvcFJldHVybnMuZm9yRWFjaChmdW5jdGlvbiAoeyBtZXNzYWdlLCBhbW91bnQgfSkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gdXR4b2xpYi5zY3JpcHQuZnJvbUFTTSgnT1BfUkVUVVJOICcgKyBCdWZmZXIuZnJvbShtZXNzYWdlKS50b1N0cmluZygnaGV4JykpO1xuICAgICAgb3V0cHV0cy5wdXNoKHsgc2NyaXB0LCBhbW91bnQgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBnZXRDaGFuZ2VPdXRwdXRzID0gZnVuY3Rpb24gKGNoYW5nZUFtb3VudDogbnVtYmVyKTogT3V0cHV0W10gfCBCbHVlYmlyZDxPdXRwdXRbXT4ge1xuICAgICAgaWYgKGNoYW5nZUFtb3VudCA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduZWdhdGl2ZSBjaGFuZ2UgYW1vdW50OiAnICsgY2hhbmdlQW1vdW50KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0OiBPdXRwdXRbXSA9IFtdO1xuICAgICAgLy8gaWYgd2UgcGFpZCBmZWVzIGZyb20gYSBzaW5nbGUga2V5IHdhbGxldCwgcmV0dXJuIHRoZSBmZWUgY2hhbmdlIGZpcnN0XG4gICAgICBpZiAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgICAgICBjb25zdCBmZWVTaW5nbGVLZXlXYWxsZXRDaGFuZ2VBbW91bnQgPVxuICAgICAgICAgIGZlZVNpbmdsZUtleUlucHV0QW1vdW50IC0gKGZlZSArIChiaXRnb0ZlZUluZm8gPyBiaXRnb0ZlZUluZm8uYW1vdW50IDogMCkpO1xuICAgICAgICBpZiAoZmVlU2luZ2xlS2V5V2FsbGV0Q2hhbmdlQW1vdW50ID49IGNvbnN0YW50cy5taW5PdXRwdXRTaXplKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goeyBhZGRyZXNzOiBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzLCBhbW91bnQ6IGZlZVNpbmdsZUtleVdhbGxldENoYW5nZUFtb3VudCB9KTtcbiAgICAgICAgICBjaGFuZ2VBbW91bnQgPSBjaGFuZ2VBbW91bnQgLSBmZWVTaW5nbGVLZXlXYWxsZXRDaGFuZ2VBbW91bnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZUFtb3VudCA8IGNvbnN0YW50cy5taW5PdXRwdXRTaXplKSB7XG4gICAgICAgIC8vIEdpdmUgaXQgdG8gdGhlIG1pbmVyc1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLndhbGxldC50eXBlKCkgPT09ICdzYWZlJykge1xuICAgICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5hZGRyZXNzZXMoKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHsgYWRkcmVzczogcmVzcG9uc2UuYWRkcmVzc2VzWzBdLmFkZHJlc3MsIGFtb3VudDogY2hhbmdlQW1vdW50IH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgZXh0cmFDaGFuZ2VUb3RhbCA9IF8uc3VtKGV4dHJhQ2hhbmdlQW1vdW50cyk7XG4gICAgICAvLyBTYW5pdHkgY2hlY2tcbiAgICAgIGlmIChleHRyYUNoYW5nZVRvdGFsID4gY2hhbmdlQW1vdW50KSB7XG4gICAgICAgIGV4dHJhQ2hhbmdlQW1vdW50cyA9IFtdO1xuICAgICAgICBleHRyYUNoYW5nZVRvdGFsID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gY29weSBhbmQgYWRkIHJlbWFpbmluZyBjaGFuZ2UgYW1vdW50XG4gICAgICBjb25zdCBhbGxDaGFuZ2VBbW91bnRzID0gZXh0cmFDaGFuZ2VBbW91bnRzLnNsaWNlKDApO1xuICAgICAgYWxsQ2hhbmdlQW1vdW50cy5wdXNoKGNoYW5nZUFtb3VudCAtIGV4dHJhQ2hhbmdlVG90YWwpO1xuXG4gICAgICAvLyBSZWN1cnNpdmUgYXN5bmMgZnVuYyB0byBhZGQgYWxsIGNoYW5nZSBvdXRwdXRzXG4gICAgICBjb25zdCBhZGRDaGFuZ2VPdXRwdXRzID0gZnVuY3Rpb24gKCk6IE91dHB1dFtdIHwgQmx1ZWJpcmQ8T3V0cHV0W10+IHtcbiAgICAgICAgY29uc3QgdGhpc0Ftb3VudCA9IGFsbENoYW5nZUFtb3VudHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCF0aGlzQW1vdW50KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocGFyYW1zLmNoYW5nZUFkZHJlc3MpIHtcbiAgICAgICAgICAgIC8vIElmIHVzZXIgcGFzc2VkIGEgY2hhbmdlIGFkZHJlc3MsIHVzZSBpdCBmb3IgYWxsIG91dHB1dHNcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXMuY2hhbmdlQWRkcmVzcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBhZGRyZXNzIHBlciBvdXRwdXQsIGZvciBwcml2YWN5XG4gICAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgc2Vnd2l0IG9yIG5vdFxuICAgICAgICAgICAgY29uc3QgY2hhbmdlQ2hhaW4gPSBwYXJhbXMud2FsbGV0LmdldENoYW5nZUNoYWluKHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluLCB2YWxpZGF0ZTogdmFsaWRhdGUgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuYWRkcmVzcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYWRkcmVzcykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHsgYWRkcmVzczogYWRkcmVzcywgYW1vdW50OiB0aGlzQW1vdW50IH0pO1xuICAgICAgICAgIHJldHVybiBhZGRDaGFuZ2VPdXRwdXRzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFkZENoYW5nZU91dHB1dHMoKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGNoYW5nZSBvdXRwdXQocykgYW5kIGluc3RhbnQgZmVlIG91dHB1dCBpZiBhcHBsaWNhYmxlXG4gICAgcmV0dXJuIEJsdWViaXJkLnRyeShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0Q2hhbmdlT3V0cHV0cyhpbnB1dEFtb3VudCAtIHRvdGFsQW1vdW50KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGNoYW5nZU91dHB1dHMgPSByZXN1bHQ7XG4gICAgICBjb25zdCBleHRyYU91dHB1dHMgPSBjaGFuZ2VPdXRwdXRzLmNvbmNhdChbXSk7IC8vIGNvcHkgdGhlIGFycmF5XG4gICAgICBpZiAoYml0Z29GZWVJbmZvICYmIGJpdGdvRmVlSW5mby5hbW91bnQgPiAwKSB7XG4gICAgICAgIGV4dHJhT3V0cHV0cy5wdXNoKGJpdGdvRmVlSW5mbyk7XG4gICAgICB9XG4gICAgICBleHRyYU91dHB1dHMuZm9yRWFjaChmdW5jdGlvbiAob3V0cHV0KSB7XG4gICAgICAgIGlmICgob3V0cHV0IGFzIEFkZHJlc3NPdXRwdXQpLmFkZHJlc3MpIHtcbiAgICAgICAgICAob3V0cHV0IGFzIFNjcmlwdE91dHB1dCkuc2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KChvdXRwdXQgYXMgQWRkcmVzc091dHB1dCkuYWRkcmVzcywgbmV0d29yayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZWNpZGUgd2hlcmUgdG8gcHV0IHRoZSBvdXRwdXRzIC0gZGVmYXVsdCBpcyB0byByYW5kb21pemUgdW5sZXNzIGZvcmNlZCB0byBlbmRcbiAgICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSBwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCA/IG91dHB1dHMubGVuZ3RoIDogXy5yYW5kb20oMCwgb3V0cHV0cy5sZW5ndGgpO1xuICAgICAgICBvdXRwdXRzLnNwbGljZShvdXRwdXRJbmRleCwgMCwgb3V0cHV0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgYWxsIG91dHB1dHMgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAgICBvdXRwdXRzLmZvckVhY2goZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICB0cmFuc2FjdGlvbi5hZGRPdXRwdXQoKG91dHB1dCBhcyBTY3JpcHRPdXRwdXQpLnNjcmlwdCwgb3V0cHV0LmFtb3VudCk7XG4gICAgICB9KTtcblxuICAgICAgdHJhdmVsSW5mb3MgPSBfKG91dHB1dHMpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKG91dHB1dCwgaW5kZXgpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBvdXRwdXQudHJhdmVsSW5mbztcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0Lm91dHB1dEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigpXG4gICAgICAgIC52YWx1ZSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIFNlcmlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24sIHJldHVybmluZyB3aGF0IGlzIG5lZWRlZCB0byBzaWduIGl0XG4gIGNvbnN0IHNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBvbmx5IG5lZWQgdG8gcmV0dXJuIHRoZSB1bnNwZW50cyB0aGF0IHdlcmUgdXNlZCBhbmQganVzdCB0aGUgY2hhaW5QYXRoLCByZWRlZW1TY3JpcHQsIGFuZCBpbnN0YW50IGZsYWdcbiAgICBjb25zdCBwaWNrZWRVbnNwZW50czogYW55ID0gXy5tYXAodW5zcGVudHMsIGZ1bmN0aW9uICh1bnNwZW50KSB7XG4gICAgICByZXR1cm4gXy5waWNrKHVuc3BlbnQsIFsnY2hhaW5QYXRoJywgJ3JlZGVlbVNjcmlwdCcsICdpbnN0YW50JywgJ3dpdG5lc3NTY3JpcHQnLCAnc2NyaXB0JywgJ3ZhbHVlJ10pO1xuICAgIH0pO1xuICAgIGNvbnN0IHBydW5lZFVuc3BlbnRzID0gXy5zbGljZShwaWNrZWRVbnNwZW50cywgMCwgdHJhbnNhY3Rpb24udHguaW5zLmxlbmd0aCAtIGZlZVNpbmdsZUtleVVuc3BlbnRzVXNlZC5sZW5ndGgpO1xuICAgIF8uZWFjaChmZWVTaW5nbGVLZXlVbnNwZW50c1VzZWQsIGZ1bmN0aW9uIChmZWVVbnNwZW50KSB7XG4gICAgICBwcnVuZWRVbnNwZW50cy5wdXNoKHsgcmVkZWVtU2NyaXB0OiBmYWxzZSwgY2hhaW5QYXRoOiBmYWxzZSB9KTsgLy8gbWFyayBhcyBmYWxzZSB0byBzaWduaWZ5IGEgbm9uLW11bHRpc2lnIGFkZHJlc3NcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHtcbiAgICAgIHRyYW5zYWN0aW9uSGV4OiB0cmFuc2FjdGlvbi5idWlsZEluY29tcGxldGUoKS50b0hleCgpLFxuICAgICAgdW5zcGVudHM6IHBydW5lZFVuc3BlbnRzLFxuICAgICAgZmVlOiBmZWUsXG4gICAgICBjaGFuZ2VBZGRyZXNzZXM6IGNoYW5nZU91dHB1dHMubWFwKGZ1bmN0aW9uIChjbykge1xuICAgICAgICByZXR1cm4gXy5waWNrKGNvLCBbJ2FkZHJlc3MnLCAncGF0aCcsICdhbW91bnQnXSk7XG4gICAgICB9KSxcbiAgICAgIHdhbGxldElkOiBwYXJhbXMud2FsbGV0LmlkKCksXG4gICAgICB3YWxsZXRLZXljaGFpbnM6IHBhcmFtcy53YWxsZXQua2V5Y2hhaW5zLFxuICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50LFxuICAgICAgYml0Z29GZWU6IGJpdGdvRmVlSW5mbyxcbiAgICAgIGVzdGltYXRlZFNpemU6IG1pbmVyRmVlSW5mby5zaXplLFxuICAgICAgdHhJbmZvOiB0eEluZm8sXG4gICAgICB0cmF2ZWxJbmZvczogdHJhdmVsSW5mb3MsXG4gICAgfTtcblxuICAgIC8vIEFkZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBpZiAocmVzdWx0Lmluc3RhbnQgJiYgYml0Z29GZWVJbmZvKSB7XG4gICAgICByZXN1bHQuaW5zdGFudEZlZSA9IF8ucGljayhiaXRnb0ZlZUluZm8sIFsnYW1vdW50JywgJ2FkZHJlc3MnXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0Qml0R29GZWUoKTtcbiAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gQmx1ZWJpcmQuYWxsKFtnZXRCaXRHb0ZlZUFkZHJlc3MoKSwgZ2V0VW5zcGVudHMoKSwgZ2V0VW5zcGVudHNGb3JTaW5nbGVLZXkoKV0pO1xuICAgIH0pXG4gICAgLnRoZW4oY29sbGVjdElucHV0cylcbiAgICAudGhlbihjb2xsZWN0T3V0cHV0cylcbiAgICAudGhlbihzZXJpYWxpemUpO1xufTtcblxuLyoqXG4gKiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhIHRyYW5zYWN0aW9uIGluIGJ5dGVzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2ZcbiAqIGlucHV0cyBhbmQgb3V0cHV0cyBwcmVzZW50LlxuICogQHBhcmFtcyBwYXJhbXMge1xuICogICBuUDJzaElucHV0czogbnVtYmVyIG9mIFAyU0ggKG11bHRpc2lnKSBpbnB1dHNcbiAqICAgblAycGtoSW5wdXRzOiBudW1iZXIgb2YgUDJQS0ggKHNpbmdsZSBzaWcpIGlucHV0c1xuICogICBuT3V0cHV0czogbnVtYmVyIG9mIG91dHB1dHNcbiAqIH1cbiAqXG4gKiBAcmV0dXJucyBzaXplOiBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgdHJhbnNhY3Rpb24gaW4gYnl0ZXNcbiAqL1xuY29uc3QgZXN0aW1hdGVUcmFuc2FjdGlvblNpemUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm5QMnNoSW5wdXRzKSB8fCBwYXJhbXMublAyc2hJbnB1dHMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcG9zaXRpdmUgblAyc2hJbnB1dHMnKTtcbiAgfVxuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uUDJwa2hJbnB1dHMpIHx8IHBhcmFtcy5uUDJwa2hJbnB1dHMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcG9zaXRpdmUgblAycGtoSW5wdXRzIHRvIGJlIG51bWVyaWMnKTtcbiAgfVxuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uUDJzaFAyd3NoSW5wdXRzKSB8fCBwYXJhbXMublAyc2hQMndzaElucHV0cyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBwb3NpdGl2ZSBuUDJzaFAyd3NoSW5wdXRzIHRvIGJlIG51bWVyaWMnKTtcbiAgfVxuICBpZiAocGFyYW1zLm5QMnNoSW5wdXRzICsgcGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgYXQgbGVhc3Qgb25lIG5QMnNoSW5wdXRzIG9yIG5QMnNoUDJ3c2hJbnB1dHMnKTtcbiAgfVxuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uT3V0cHV0cykgfHwgcGFyYW1zLm5PdXRwdXRzIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHBvc2l0aXZlIG5PdXRwdXRzJyk7XG4gIH1cblxuICAvLyBUaGUgc2l6ZSBvZiBhbiB1bmNvbXByZXNzZWQgcHVibGljIGtleSBpcyAzMiBieXRlcyBtb3JlIHRoYW4gdGhlIGNvbXByZXNzZWQga2V5LFxuICAvLyBhbmQgaGVuY2UsIG5lZWRzIHRvIGJlIGFjY291bnRlZCBmb3IgaW4gdGhlIHRyYW5zYWN0aW9uIHNpemUgZXN0aW1hdGlvbi5cbiAgY29uc3QgdW5jb21wcmVzc2VkUHVibGljS2V5c1RyaXBsZUNvcnJlY3Rpb25GYWN0b3IgPSAzMiAqIDM7XG5cbiAgcmV0dXJuIChcbiAgICAvLyBUaGlzIGlzIG5vdCBxdWl0ZSBhY2N1cmF0ZSAtIGlmIHRoZXJlIGlzIGEgbWl4IG9mIGlucHV0cyBzY3JpcHRzIHdoZXJlIHNvbWUgdXNlZFxuICAgIC8vIGNvbXByZXNzZWQga2V5cyBhbmQgc29tZSB1c2VkIHVuY29tcHJlc3NlZCBrZXlzLCB3ZSB3b3VsZCBvdmVyZXN0aW1hdGUgdGhlIHNpemUuXG4gICAgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBtaXhlZCBpbnB1dCBzZXRzLCB0aGlzIHNob3VsZCBub3QgYmUgYW4gaXNzdWUgaW4gcHJhY3RpY2UuXG4gICAgKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgK1xuICAgICAgKHBhcmFtcy5jb250YWluc1VuY29tcHJlc3NlZFB1YmxpY0tleXMgPyB1bmNvbXByZXNzZWRQdWJsaWNLZXlzVHJpcGxlQ29ycmVjdGlvbkZhY3RvciA6IDApKSAqXG4gICAgICBwYXJhbXMublAyc2hJbnB1dHMgK1xuICAgIFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSAqIChwYXJhbXMublAyc2hQMndzaElucHV0cyB8fCAwKSArXG4gICAgVmlydHVhbFNpemVzLnR4UDJwa2hJbnB1dFNpemVVbmNvbXByZXNzZWRLZXkgKiAocGFyYW1zLm5QMnBraElucHV0cyB8fCAwKSArXG4gICAgVmlydHVhbFNpemVzLnR4UDJwa2hPdXRwdXRTaXplICogcGFyYW1zLm5PdXRwdXRzICtcbiAgICAvLyBpZiB0aGUgdHggY29udGFpbnMgYXQgbGVhc3Qgb25lIHNlZ3dpdCBpbnB1dCwgdGhlIHR4IG92ZXJoZWFkIGlzIGluY3JlYXNlZCBieSAxXG4gICAgVmlydHVhbFNpemVzLnR4T3ZlcmhlYWRTaXplICtcbiAgICAocGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMgPiAwID8gMSA6IDApXG4gICk7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgZmVlIGFuZCBlc3RpbWF0ZWQgc2l6ZSBpbiBieXRlcyBmb3IgYSB0cmFuc2FjdGlvbi5cbiAqIEBwYXJhbXMgcGFyYW1zIHtcbiAqICAgYml0Z286IGJpdGdvIG9iamVjdFxuICogICBmZWVSYXRlOiBzYXRvc2hpcyBwZXIga2lsb2J5dGVcbiAqICAgblAyc2hJbnB1dHM6IG51bWJlciBvZiBQMlNIIChtdWx0aXNpZykgaW5wdXRzXG4gKiAgIG5QMnBraElucHV0czogbnVtYmVyIG9mIFAyUEtIIChzaW5nbGUgc2lnKSBpbnB1dHNcbiAqICAgbk91dHB1dHM6IG51bWJlciBvZiBvdXRwdXRzXG4gKiB9XG4gKlxuICogQHJldHVybnMge1xuICogICBzaXplOiBlc3RpbWF0ZWQgc2l6ZSBvZiB0aGUgdHJhbnNhY3Rpb24gaW4gYnl0ZXNcbiAqICAgZmVlOiBlc3RpbWF0ZWQgZmVlIGluIHNhdG9zaGlzIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAqICAgZmVlUmF0ZTogZmVlIHJhdGUgdGhhdCB3YXMgdXNlZCB0byBlc3RpbWF0ZSB0aGUgZmVlIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAqIH1cbiAqL1xuZXhwb3J0cy5jYWxjdWxhdGVNaW5lckZlZUluZm8gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGNvbnN0IGZlZVJhdGVUb1VzZSA9IHBhcmFtcy5mZWVSYXRlIHx8IHBhcmFtcy5iaXRnby5nZXRDb25zdGFudHMoKS5mYWxsYmFja0ZlZVJhdGU7XG4gIGNvbnN0IGVzdGltYXRlZFNpemUgPSBlc3RpbWF0ZVRyYW5zYWN0aW9uU2l6ZShwYXJhbXMpO1xuXG4gIHJldHVybiB7XG4gICAgc2l6ZTogZXN0aW1hdGVkU2l6ZSxcbiAgICBmZWU6IE1hdGguY2VpbCgoZXN0aW1hdGVkU2l6ZSAqIGZlZVJhdGVUb1VzZSkgLyAxMDAwKSxcbiAgICBmZWVSYXRlOiBmZWVSYXRlVG9Vc2UsXG4gIH07XG59O1xuXG4vKlxuICogR2l2ZW4gYSB0cmFuc2FjdGlvbiBoZXgsIHVuc3BlbnQgaW5mb3JtYXRpb24gKGNoYWluIHBhdGggYW5kIHJlZGVlbSBzY3JpcHRzKSwgYW5kIHRoZSBrZXljaGFpbiB4cHJ2LFxuICogcGVyZm9ybSBrZXkgZGVyaXZhdGlvbiBhbmQgc2lnbiB0aGUgaW5wdXRzIGluIHRoZSB0cmFuc2FjdGlvbiBiYXNlZCBvbiB0aGUgdW5zcGVudCBpbmZvcm1hdGlvbiBwcm92aWRlZFxuICpcbiAqIEBwYXJhbXM6XG4gKiAgdHJhbnNhY3Rpb25IZXggc2VyaWFsaXplZCBmb3JtIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBoZXhcbiAqICB1bnNwZW50cyBhcnJheSBvZiB1bnNwZW50IGluZm9ybWF0aW9uLCB3aGVyZSBlYWNoIHVuc3BlbnQgaXMgYSBjaGFpblBhdGggYW5kIHJlZGVlbVNjcmlwdCB3aXRoIHRoZSBzYW1lXG4gKiAgaW5kZXggYXMgdGhlIGlucHV0cyBpbiB0aGUgdHJhbnNhY3Rpb25IZXhcbiAqICBrZXljaGFpbiBLZXljaGFpbiBjb250YWluaW5nIHRoZSB4cHJ2IHRvIHNpZ24gd2l0aC4gRm9yIGxlZ2FjeSBzdXBwb3J0IG9mIHNhZmUgd2FsbGV0cywga2V5Y2hhaW4gY2FuXG4gYWxzbyBiZSBhIFdJRiBwcml2YXRlIGtleS5cbiAqICBzaWduaW5nS2V5IHByaXZhdGUga2V5IGluIFdJRiBmb3Igc2FmZSB3YWxsZXRzLCB3aGVuIGtleWNoYWluIGlzIHVuYXZhaWxhYmxlXG4gKiAgdmFsaWRhdGUgY2xpZW50LXNpZGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiAtIGNhbiBiZSBkaXNhYmxlZCBmb3IgaW1wcm92ZWQgcGVyZm9ybWFuY2UgKHNpZ25hdHVyZXNcbiAqICAgICAgICAgICBhcmUgc3RpbGwgdmFsaWRhdGVkIHNlcnZlci1zaWRlKS5cbiAqICBmZWVTaW5nbGVLZXlXSUYgVXNlIHRoZSBhZGRyZXNzIGJhc2VkIG9uIHRoaXMgcHJpdmF0ZSBrZXkgdG8gcGF5IGZlZXNcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnRzLnNpZ25UcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgbGV0IGtleWNoYWluID0gcGFyYW1zLmtleWNoYWluOyAvLyBkdXBsaWNhdGUgc28gYXMgdG8gbm90IG11dGF0ZSBiZWxvd1xuXG4gIGNvbnN0IHZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuICBsZXQgcHJpdktleTtcbiAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50cmFuc2FjdGlvbkhleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUgdHJhbnNhY3Rpb24gaGV4IGFzIGEgc3RyaW5nJyk7XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy51bnNwZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUgdW5zcGVudHMgYXJyYXknKTtcbiAgfVxuICBpZiAoIV8uaXNCb29sZWFuKHZhbGlkYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHZhbGlkYXRlIHRvIGJlIGEgYm9vbGVhbicpO1xuICB9XG4gIGxldCBuZXR3b3JrID0gZ2V0TmV0d29yaygpO1xuICBjb25zdCBlbmFibGVCQ0ggPSBfLmlzQm9vbGVhbihwYXJhbXMuZm9yY2VCQ0gpICYmIHBhcmFtcy5mb3JjZUJDSCA9PT0gdHJ1ZTtcblxuICBpZiAoIV8uaXNPYmplY3Qoa2V5Y2hhaW4pIHx8ICFfLmlzU3RyaW5nKChrZXljaGFpbiBhcyBhbnkpLnhwcnYpKSB7XG4gICAgaWYgKF8uaXNTdHJpbmcocGFyYW1zLnNpZ25pbmdLZXkpKSB7XG4gICAgICBwcml2S2V5ID0gdXR4b2xpYi5FQ1BhaXIuZnJvbVdJRihwYXJhbXMuc2lnbmluZ0tleSwgbmV0d29yayBhcyB1dHhvbGliLkJpdGNvaW5KU05ldHdvcmspO1xuICAgICAga2V5Y2hhaW4gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHRoZSBrZXljaGFpbiBvYmplY3Qgd2l0aCB4cHJ2Jyk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGZlZVNpbmdsZUtleTtcbiAgaWYgKHBhcmFtcy5mZWVTaW5nbGVLZXlXSUYpIHtcbiAgICBmZWVTaW5nbGVLZXkgPSB1dHhvbGliLkVDUGFpci5mcm9tV0lGKHBhcmFtcy5mZWVTaW5nbGVLZXlXSUYsIG5ldHdvcmsgYXMgdXR4b2xpYi5CaXRjb2luSlNOZXR3b3JrKTtcbiAgfVxuXG4gIGRlYnVnKCdOZXR3b3JrOiAlTycsIG5ldHdvcmspO1xuXG4gIGlmIChlbmFibGVCQ0gpIHtcbiAgICBkZWJ1ZygnRW5hYmxpbmcgQkNI4oCmJyk7XG4gICAgbmV0d29yayA9IHV0eG9saWIubmV0d29ya3MuYml0Y29pbmNhc2g7XG4gICAgZGVidWcoJ05ldyBuZXR3b3JrOiAlTycsIG5ldHdvcmspO1xuICB9XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleChwYXJhbXMudHJhbnNhY3Rpb25IZXgsIG5ldHdvcmspO1xuICBpZiAodHJhbnNhY3Rpb24uaW5zLmxlbmd0aCAhPT0gcGFyYW1zLnVuc3BlbnRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbGVuZ3RoIG9mIHVuc3BlbnRzIGFycmF5IHNob3VsZCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIGlucHV0cycpO1xuICB9XG5cbiAgLy8gZGVjb3JhdGUgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dCB2YWx1ZXMgZm9yIFRyYW5zYWN0aW9uQnVpbGRlciBpbnN0YW50aWF0aW9uXG4gIGNvbnN0IGlzVXR4b1R4ID0gXy5pc09iamVjdCh0cmFuc2FjdGlvbikgJiYgQXJyYXkuaXNBcnJheSgodHJhbnNhY3Rpb24gYXMgYW55KS5pbnMpO1xuICBjb25zdCBhcmVWYWxpZFVuc3BlbnRzID0gXy5pc09iamVjdChwYXJhbXMpICYmIEFycmF5LmlzQXJyYXkoKHBhcmFtcyBhcyBhbnkpLnVuc3BlbnRzKTtcbiAgaWYgKGlzVXR4b1R4ICYmIGFyZVZhbGlkVW5zcGVudHMpIHtcbiAgICAvLyBleHRlbmQgdGhlIHRyYW5zYWN0aW9uIGlucHV0cyB3aXRoIHRoZSB2YWx1ZXNcbiAgICBjb25zdCBpbnB1dFZhbHVlcyA9IF8ubWFwKChwYXJhbXMgYXMgYW55KS51bnNwZW50cywgKHUpID0+IF8ucGljayh1LCAndmFsdWUnKSk7XG4gICAgdHJhbnNhY3Rpb24uaW5zLm1hcCgoY3VycmVudEl0ZW0sIGluZGV4KSA9PiBfLmV4dGVuZChjdXJyZW50SXRlbSwgaW5wdXRWYWx1ZXNbaW5kZXhdKSk7XG4gIH1cblxuICBsZXQgcm9vdEV4dEtleTtcbiAgaWYgKGtleWNoYWluKSB7XG4gICAgcm9vdEV4dEtleSA9IGJpcDMyLmZyb21CYXNlNTgoa2V5Y2hhaW4ueHBydik7XG4gIH1cblxuICBjb25zdCB0eGIgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZyb21UcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHR4Yi50eC5pbnMubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgY29uc3QgY3VycmVudFVuc3BlbnQgPSBwYXJhbXMudW5zcGVudHNbaW5kZXhdO1xuICAgIGlmIChjdXJyZW50VW5zcGVudC5yZWRlZW1TY3JpcHQgPT09IGZhbHNlKSB7XG4gICAgICAvLyB0aGlzIGlzIHRoZSBpbnB1dCBmcm9tIGEgc2luZ2xlIGtleSBmZWUgYWRkcmVzc1xuICAgICAgaWYgKCFmZWVTaW5nbGVLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaW5nbGUga2V5IGFkZHJlc3MgdXNlZCBpbiBpbnB1dCBidXQgZmVlU2luZ2xlS2V5V0lGIG5vdCBwcm92aWRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlQkNIKSB7XG4gICAgICAgIGZlZVNpbmdsZUtleS5uZXR3b3JrID0gbmV0d29yaztcbiAgICAgIH1cblxuICAgICAgdHhiLnNpZ24oaW5kZXgsIGZlZVNpbmdsZUtleSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdCAmJiBlbmFibGVCQ0gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQkNIIGRvZXMgbm90IHN1cHBvcnQgc2Vnd2l0IGlucHV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYWluUGF0aCA9IGN1cnJlbnRVbnNwZW50LmNoYWluUGF0aDtcbiAgICBpZiAocm9vdEV4dEtleSkge1xuICAgICAgY29uc3QgeyB3YWxsZXRTdWJQYXRoID0gJy8wLzAnIH0gPSBrZXljaGFpbjtcbiAgICAgIGNvbnN0IHBhdGggPSBzYW5pdGl6ZUxlZ2FjeVBhdGgoa2V5Y2hhaW4ucGF0aCArIHdhbGxldFN1YlBhdGggKyBjaGFpblBhdGgpO1xuICAgICAgZGVidWcoXG4gICAgICAgICdkZXJpdmVkIHVzZXIga2V5IHBhdGggXCIlc1wiIHVzaW5nIGtleWNoYWluIHBhdGggXCIlc1wiLCB3YWxsZXRTdWJQYXRoIFwiJXNcIiwga2V5Y2hhaW4gd2FsbGV0U3ViUGF0aCBcIiVzXCIgYW5kIGNoYWluUGF0aCBcIiVzXCInLFxuICAgICAgICBwYXRoLFxuICAgICAgICBrZXljaGFpbi5wYXRoLFxuICAgICAgICB3YWxsZXRTdWJQYXRoLFxuICAgICAgICBrZXljaGFpbi53YWxsZXRTdWJQYXRoLFxuICAgICAgICBjaGFpblBhdGhcbiAgICAgICk7XG4gICAgICBwcml2S2V5ID0gcm9vdEV4dEtleS5kZXJpdmVQYXRoKHBhdGgpO1xuICAgIH1cblxuICAgIHByaXZLZXkubmV0d29yayA9IG5ldHdvcms7XG5cbiAgICAvLyBzdWJzY3JpcHQgaXMgdGhlIHBhcnQgb2YgdGhlIG91dHB1dCBzY3JpcHQgYWZ0ZXIgdGhlIE9QX0NPREVTRVBBUkFUT1IuXG4gICAgLy8gU2luY2Ugd2UgYXJlIG9ubHkgZXZlciBzaWduaW5nIHAyc2ggb3V0cHV0cywgd2hpY2ggZG8gbm90IGhhdmVcbiAgICAvLyBPUF9DT0RFU0VQQVJBVE9SUywgaXQgaXMgYWx3YXlzIHRoZSBvdXRwdXQgc2NyaXB0LlxuICAgIGNvbnN0IHN1YnNjcmlwdCA9IEJ1ZmZlci5mcm9tKGN1cnJlbnRVbnNwZW50LnJlZGVlbVNjcmlwdCwgJ2hleCcpO1xuICAgIGN1cnJlbnRVbnNwZW50LnZhbGlkYXRpb25TY3JpcHQgPSBzdWJzY3JpcHQ7XG5cbiAgICAvLyBJbiBvcmRlciB0byBzaWduIHdpdGggYml0Y29pbmpzLWxpYiwgd2UgbXVzdCB1c2UgaXRzIHRyYW5zYWN0aW9uXG4gICAgLy8gYnVpbGRlciwgY29uZnVzaW5nbHkgbmFtZWQgdGhlIHNhbWUgZXhhY3QgdGhpbmcgYXMgb3VyIHRyYW5zYWN0aW9uXG4gICAgLy8gYnVpbGRlciwgYnV0IHdpdGggaW5lcXVpdmFsZW50IGJlaGF2aW9yLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3aXRuZXNzU2NyaXB0ID0gY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdCA/IEJ1ZmZlci5mcm9tKGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHQsICdoZXgnKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHNpZ0hhc2ggPSB1dHhvbGliLmJpdGdvLmdldERlZmF1bHRTaWdIYXNoKG5ldHdvcmspO1xuICAgICAgdHhiLnNpZ24oaW5kZXgsIHByaXZLZXksIHN1YnNjcmlwdCwgc2lnSGFzaCwgY3VycmVudFVuc3BlbnQudmFsdWUsIHdpdG5lc3NTY3JpcHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHRyeSBmYWxsYmFjayBkZXJpdmF0aW9uIHBhdGggKHNlZSBCRy00NjQ5NylcbiAgICAgIGxldCBmYWxsYmFja1NpZ25pbmdTdWNjZXNzZnVsID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmYWxsYmFja1BhdGggPSBzYW5pdGl6ZUxlZ2FjeVBhdGgoa2V5Y2hhaW4ucGF0aCArIGNoYWluUGF0aCk7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgICdkZXJpdmVkIGZhbGxiYWNrIHVzZXIga2V5IHBhdGggXCIlc1wiIHVzaW5nIGtleWNoYWluIHBhdGggXCIlc1wiIGFuZCBjaGFpblBhdGggXCIlc1wiJyxcbiAgICAgICAgICBmYWxsYmFja1BhdGgsXG4gICAgICAgICAga2V5Y2hhaW4ucGF0aCxcbiAgICAgICAgICBjaGFpblBhdGhcbiAgICAgICAgKTtcbiAgICAgICAgcHJpdktleSA9IHJvb3RFeHRLZXkuZGVyaXZlUGF0aChmYWxsYmFja1BhdGgpO1xuICAgICAgICBjb25zdCB3aXRuZXNzU2NyaXB0ID0gY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdFxuICAgICAgICAgID8gQnVmZmVyLmZyb20oY3VycmVudFVuc3BlbnQud2l0bmVzc1NjcmlwdCwgJ2hleCcpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNpZ0hhc2ggPSB1dHhvbGliLmJpdGdvLmdldERlZmF1bHRTaWdIYXNoKG5ldHdvcmspO1xuICAgICAgICB0eGIuc2lnbihpbmRleCwgcHJpdktleSwgc3Vic2NyaXB0LCBzaWdIYXNoLCBjdXJyZW50VW5zcGVudC52YWx1ZSwgd2l0bmVzc1NjcmlwdCk7XG4gICAgICAgIGZhbGxiYWNrU2lnbmluZ1N1Y2Nlc3NmdWwgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZmFsbGJhY2tFcnJvcikge1xuICAgICAgICBkZWJ1ZygnaW5wdXQgc2lnbiBmYWlsZWQgZm9yIGZhbGxiYWNrIHBhdGg6ICVzJywgZmFsbGJhY2tFcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIC8vIHdlIG5lZWQgdG8ga25vdyB3aGF0J3MgY2F1c2luZyB0aGlzXG4gICAgICBpZiAoIWZhbGxiYWNrU2lnbmluZ1N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgZS5yZXN1bHQgPSB7XG4gICAgICAgICAgdW5zcGVudDogY3VycmVudFVuc3BlbnQsXG4gICAgICAgIH07XG4gICAgICAgIGUubWVzc2FnZSA9IGBGYWlsZWQgdG8gc2lnbiBpbnB1dCAjJHtpbmRleH0gLSAke2UubWVzc2FnZX0gLSAke0pTT04uc3RyaW5naWZ5KGUucmVzdWx0LCBudWxsLCA0KX0gLSBcXG4ke1xuICAgICAgICAgIGUuc3RhY2tcbiAgICAgICAgfWA7XG4gICAgICAgIGRlYnVnKCdpbnB1dCBzaWduIGZhaWxlZDogJXMnLCBlLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhcnRpYWxUcmFuc2FjdGlvbiA9IHR4Yi5idWlsZEluY29tcGxldGUoKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBwYXJ0aWFsVHJhbnNhY3Rpb24uaW5zLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlQ291bnQgPSB1dHhvbGliLmJpdGdvXG4gICAgICAgIC5nZXRTaWduYXR1cmVWZXJpZmljYXRpb25zKHBhcnRpYWxUcmFuc2FjdGlvbiwgaW5kZXgsIHBhcmFtcy51bnNwZW50c1tpbmRleF0udmFsdWUpXG4gICAgICAgIC5maWx0ZXIoKHYpID0+IHYuc2lnbmVkQnkgIT09IHVuZGVmaW5lZCkubGVuZ3RoO1xuICAgICAgaWYgKHNpZ25hdHVyZUNvdW50IDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGF0IGxlYXN0IG9uZSB2YWxpZCBzaWduYXR1cmUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuZnVsbExvY2FsU2lnbmluZyAmJiBzaWduYXR1cmVDb3VudCA8IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmdWxsTG9jYWxTaWduaW5nIHNldDogZXhwZWN0ZWQgYXQgbGVhc3QgdHdvIHZhbGlkIHNpZ25hdHVyZXMnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHtcbiAgICB0cmFuc2FjdGlvbkhleDogcGFydGlhbFRyYW5zYWN0aW9uLnRvSGV4KCksXG4gIH0pO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyAddress.d.ts","sourceRoot":"","sources":["../../../src/v1/verifyAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,KAAA,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAOhE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyAddress = void 0;
|
|
4
|
+
const utxolib = require("@bitgo/utxo-lib");
|
|
5
|
+
/**
|
|
6
|
+
* Verify a Bitcoin address is a valid address
|
|
7
|
+
*/
|
|
8
|
+
function verifyAddress(address, network) {
|
|
9
|
+
try {
|
|
10
|
+
const script = utxolib.addressFormat.toOutputScriptTryFormats(address, network, undefined);
|
|
11
|
+
return address === utxolib.address.fromOutputScript(script, network);
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.verifyAddress = verifyAddress;
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5QWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92MS92ZXJpZnlBZGRyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUEyQztBQUczQzs7R0FFRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBZ0I7SUFDckQsSUFBSTtRQUNGLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRixPQUFPLE9BQU8sS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztLQUN0RTtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUM7QUFQRCxzQ0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG4vKipcbiAqIFZlcmlmeSBhIEJpdGNvaW4gYWRkcmVzcyBpcyBhIHZhbGlkIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeUFkZHJlc3MoYWRkcmVzcywgbmV0d29yazogTmV0d29yayk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNjcmlwdCA9IHV0eG9saWIuYWRkcmVzc0Zvcm1hdC50b091dHB1dFNjcmlwdFRyeUZvcm1hdHMoYWRkcmVzcywgbmV0d29yaywgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gYWRkcmVzcyA9PT0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoc2NyaXB0LCBuZXR3b3JrKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo/sdk-api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.47.0",
|
|
4
4
|
"description": "REST wrapper for BitGoJS",
|
|
5
5
|
"main": "./dist/src/index.js",
|
|
6
6
|
"types": "./dist/src/index.d.ts",
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
]
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@bitgo/sdk-core": "^26.
|
|
43
|
+
"@bitgo/sdk-core": "^26.11.0",
|
|
44
44
|
"@bitgo/sjcl": "^1.0.1",
|
|
45
|
-
"@bitgo/unspents": "^0.47.
|
|
46
|
-
"@bitgo/utxo-lib": "^9.
|
|
45
|
+
"@bitgo/unspents": "^0.47.3",
|
|
46
|
+
"@bitgo/utxo-lib": "^9.37.0",
|
|
47
47
|
"@types/superagent": "4.1.15",
|
|
48
48
|
"bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.2",
|
|
49
49
|
"bluebird": "^3.5.3",
|
|
@@ -63,5 +63,5 @@
|
|
|
63
63
|
"resolutions": {
|
|
64
64
|
"degenerator": "5.0.0"
|
|
65
65
|
},
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "fe5a76b85ae0d400d573fa3beeec1318cda53cdb"
|
|
67
67
|
}
|