@bitgo-beta/sdk-api 1.10.1-beta.327 → 1.10.1-beta.329
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +6 -6
- package/dist/src/bitgoAPI.d.ts.map +1 -1
- package/dist/src/bitgoAPI.js +3 -4
- package/package.json +6 -6
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/sdk-api",
|
|
3
|
-
"version": "1.10.1-beta.
|
|
3
|
+
"version": "1.10.1-beta.329",
|
|
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-beta/sdk-core": "8.2.1-beta.
|
|
44
|
-
"@bitgo-beta/sjcl": "1.0.2-beta.
|
|
45
|
-
"@bitgo-beta/unspents": "0.13.2-beta.
|
|
46
|
-
"@bitgo-beta/utxo-lib": "8.0.3-beta.
|
|
43
|
+
"@bitgo-beta/sdk-core": "8.2.1-beta.330",
|
|
44
|
+
"@bitgo-beta/sjcl": "1.0.2-beta.568",
|
|
45
|
+
"@bitgo-beta/unspents": "0.13.2-beta.330",
|
|
46
|
+
"@bitgo-beta/utxo-lib": "8.0.3-beta.331",
|
|
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": "eb8a4e9b4f6dc5ce6af1ba83e9cfde9661d603df"
|
|
67
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitgoAPI.d.ts","sourceRoot":"","sources":["../../src/bitgoAPI.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bitgoAPI.d.ts","sourceRoot":"","sources":["../../src/bitgoAPI.ts"],"names":[],"mappings":"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"}
|
package/dist/src/bitgoAPI.js
CHANGED
|
@@ -1214,14 +1214,13 @@ class BitGoAPI {
|
|
|
1214
1214
|
}
|
|
1215
1215
|
const networkName = sdk_core_1.common.Environments[this.getEnv()].network;
|
|
1216
1216
|
const network = utxolib.networks[networkName];
|
|
1217
|
-
let address;
|
|
1218
1217
|
try {
|
|
1219
|
-
|
|
1218
|
+
const script = utxolib.addressFormat.toOutputScriptTryFormats(params.address, network);
|
|
1219
|
+
return params.address === utxolib.address.fromOutputScript(script, network);
|
|
1220
1220
|
}
|
|
1221
1221
|
catch (e) {
|
|
1222
1222
|
return false;
|
|
1223
1223
|
}
|
|
1224
|
-
return address.version === network.pubKeyHash || address.version === network.scriptHash;
|
|
1225
1224
|
}
|
|
1226
1225
|
/**
|
|
1227
1226
|
* Split a secret into shards using Shamir Secret Sharing.
|
|
@@ -1702,4 +1701,4 @@ class BitGoAPI {
|
|
|
1702
1701
|
}
|
|
1703
1702
|
exports.BitGoAPI = BitGoAPI;
|
|
1704
1703
|
BitGoAPI._testnetWarningMessage = false;
|
|
1705
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Z29BUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBc0I4QjtBQUM5Qix5Q0FBeUM7QUFDekMsZ0RBQWdEO0FBQ2hELG1EQUE4RDtBQUM5RCxvREFBb0Q7QUFDcEQscURBQXlEO0FBQ3pELG1DQUFvQztBQUNwQyxpQ0FBNkI7QUFDN0IsNEJBQTRCO0FBQzVCLHVDQUF1QztBQUN2Qyx5Q0FBeUM7QUFDekMsOEJBQThCO0FBQzlCLCtCQU9lO0FBQ2YsdUNBQTZDO0FBeUM3Qyw0Q0FBNkM7QUFDN0MseUNBQTBDO0FBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRXBDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzlDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVDLHNDQUF1QztBQUV2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDeEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDMUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUU5RCxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUM3QixJQUFJLGdCQUFnQixDQUFDO0FBQ3JCLElBQUksQ0FBQywyQkFBUyxJQUFJLENBQUMsNkJBQVcsRUFBRTtJQUM5QixLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUM5QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDeEIsZ0JBQWdCLEdBQUcsT0FB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QUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxNQUFNLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQzthQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ1osTUFBTSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVk7UUFDVixvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUc7WUFDdkMsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsMERBQTBEO2dCQUMxRCxPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7Z0JBQzdELE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDcEI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILGtGQUFrRjtRQUNsRixPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUEsMkJBQWdCLEVBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7O0FBLzNESCw0QkFnNERDO0FBcjNEa0IsK0JBQXNCLEdBQUcsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWxpYXNFbnZpcm9ubWVudHMsXG4gIEJhc2VDb2luLFxuICBiaXRjb2luLFxuICBCaXRHb0Jhc2UsXG4gIEJpdEdvUmVxdWVzdCxcbiAgQ29pbkNvbnN0cnVjdG9yLFxuICBjb21tb24sXG4gIERlY3J5cHRPcHRpb25zLFxuICBkZWZhdWx0Q29uc3RhbnRzLFxuICBFY2RoRGVyaXZlZEtleXBhaXIsXG4gIEVuY3J5cHRPcHRpb25zLFxuICBFbnZpcm9ubWVudE5hbWUsXG4gIGdlbmVyYXRlUmFuZG9tUGFzc3dvcmQsXG4gIGdldEFkZHJlc3NQMlBLSCxcbiAgZ2V0U2hhcmVkU2VjcmV0LFxuICBHZXRTaGFyaW5nS2V5T3B0aW9ucyxcbiAgR2V0U2lnbmluZ0tleUFwaSxcbiAgR2xvYmFsQ29pbkZhY3RvcnksXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBtYWtlUmFuZG9tS2V5LFxuICBzYW5pdGl6ZUxlZ2FjeVBhdGgsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvLWJldGEvc2pjbCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyLCBFQ1BhaXJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyBiaXRjb2luTWVzc2FnZSBmcm9tICdiaXRjb2luanMtbWVzc2FnZSc7XG5pbXBvcnQgeyBpc0Jyb3dzZXIsIGlzV2ViV29ya2VyIH0gZnJvbSAnYnJvd3Nlci1vci1ub2RlJztcbmltcG9ydCB7IGNyZWF0ZUhtYWMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IGRlYnVnTGliIGZyb20gJ2RlYnVnJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHNlY3AyNTZrMSBmcm9tICdzZWNwMjU2azEnO1xuaW1wb3J0ICogYXMgc3VwZXJhZ2VudCBmcm9tICdzdXBlcmFnZW50JztcbmltcG9ydCAqIGFzIHVybExpYiBmcm9tICd1cmwnO1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVzcG9uc2VFcnJvcixcbiAgaGFuZGxlUmVzcG9uc2VSZXN1bHQsXG4gIHNlcmlhbGl6ZVJlcXVlc3REYXRhLFxuICBzZXRSZXF1ZXN0UXVlcnlTdHJpbmcsXG4gIHRvQml0Z29SZXF1ZXN0LFxuICB2ZXJpZnlSZXNwb25zZSxcbn0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgZGVjcnlwdCwgZW5jcnlwdCB9IGZyb20gJy4vZW5jcnlwdCc7XG5pbXBvcnQge1xuICBBY2Nlc3NUb2tlbk9wdGlvbnMsXG4gIEFkZEFjY2Vzc1Rva2VuT3B0aW9ucyxcbiAgQWRkQWNjZXNzVG9rZW5SZXNwb25zZSxcbiAgQXV0aGVudGljYXRlT3B0aW9ucyxcbiAgQXV0aGVudGljYXRlV2l0aEF1dGhDb2RlT3B0aW9ucyxcbiAgQml0R29BUElPcHRpb25zLFxuICBCaXRHb0pzb24sXG4gIEJpdEdvU2ltdWxhdGVXZWJob29rT3B0aW9ucyxcbiAgQ2FsY3VsYXRlSG1hY1N1YmplY3RPcHRpb25zLFxuICBDYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc09wdGlvbnMsXG4gIENhbGN1bGF0ZVJlcXVlc3RIbWFjT3B0aW9ucyxcbiAgQ2hhbmdlUGFzc3dvcmRPcHRpb25zLFxuICBEZXByZWNhdGVkVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIEVzdGltYXRlRmVlT3B0aW9ucyxcbiAgRXh0ZW5kVG9rZW5PcHRpb25zLFxuICBHZXRFY2RoU2VjcmV0T3B0aW9ucyxcbiAgR2V0VXNlck9wdGlvbnMsXG4gIExpc3RXZWJob29rTm90aWZpY2F0aW9uc09wdGlvbnMsXG4gIExvZ2luUmVzcG9uc2UsXG4gIFBpbmdPcHRpb25zLFxuICBQcm9jZXNzZWRBdXRoZW50aWNhdGlvbk9wdGlvbnMsXG4gIFJlY29uc3RpdHV0ZWRTZWNyZXQsXG4gIFJlY29uc3RpdHV0ZVNlY3JldE9wdGlvbnMsXG4gIFJlZ2lzdGVyUHVzaFRva2VuT3B0aW9ucyxcbiAgUmVtb3ZlQWNjZXNzVG9rZW5PcHRpb25zLFxuICBSZXF1ZXN0SGVhZGVycyxcbiAgU3BsaXRTZWNyZXQsXG4gIFNwbGl0U2VjcmV0T3B0aW9ucyxcbiAgVG9rZW5Jc3N1YW5jZSxcbiAgVG9rZW5Jc3N1YW5jZVJlc3BvbnNlLFxuICBVbmxvY2tPcHRpb25zLFxuICBVc2VyLFxuICBWZXJpZnlQYXNzd29yZE9wdGlvbnMsXG4gIFZlcmlmeVB1c2hUb2tlbk9wdGlvbnMsXG4gIFZlcmlmeVJlc3BvbnNlSW5mbyxcbiAgVmVyaWZ5UmVzcG9uc2VPcHRpb25zLFxuICBWZXJpZnlTaGFyZHNPcHRpb25zLFxuICBXZWJob29rT3B0aW9ucyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgc2hhbWlyID0gcmVxdWlyZSgnc2VjcmV0cy5qcy1ncmVtcGUnKTtcbmltcG9ydCBwanNvbiA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xuY29uc3QgZGVidWcgPSBkZWJ1Z0xpYignYml0Z286YXBpJyk7XG5cbmNvbnN0IEJsb2NrY2hhaW4gPSByZXF1aXJlKCcuL3YxL2Jsb2NrY2hhaW4nKTtcbmNvbnN0IEtleWNoYWlucyA9IHJlcXVpcmUoJy4vdjEva2V5Y2hhaW5zJyk7XG5pbXBvcnQgV2FsbGV0ID0gcmVxdWlyZSgnLi92MS93YWxsZXQnKTtcblxuY29uc3QgV2FsbGV0cyA9IHJlcXVpcmUoJy4vdjEvd2FsbGV0cycpO1xuY29uc3QgTWFya2V0cyA9IHJlcXVpcmUoJy4vdjEvbWFya2V0cycpO1xuY29uc3QgUGVuZGluZ0FwcHJvdmFscyA9IHJlcXVpcmUoJy4vdjEvcGVuZGluZ2FwcHJvdmFscycpO1xuY29uc3QgVHJhdmVsUnVsZSA9IHJlcXVpcmUoJy4vdjEvdHJhdmVsUnVsZScpO1xuY29uc3QgVHJhbnNhY3Rpb25CdWlsZGVyID0gcmVxdWlyZSgnLi92MS90cmFuc2FjdGlvbkJ1aWxkZXInKTtcblxubGV0IGVuYWJsZVByb3h5QWdlbnQgPSBmYWxzZTtcbmxldCBwcm94eUFnZW50TW9kdWxlO1xuaWYgKCFpc0Jyb3dzZXIgJiYgIWlzV2ViV29ya2VyKSB7XG4gIGRlYnVnKCdlbmFibGluZyBwcm94eS1hZ2VudCcpO1xuICBlbmFibGVQcm94eUFnZW50ID0gdHJ1ZTtcbiAgcHJveHlBZ2VudE1vZHVsZSA9IHJlcXVpcmUoJ3Byb3h5LWFnZW50Jyk7XG59XG5cbmNvbnN0IHBhdGNoZWRSZXF1ZXN0TWV0aG9kcyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbCcsICdwYXRjaCcsICdvcHRpb25zJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCBjbGFzcyBCaXRHb0FQSSBpbXBsZW1lbnRzIEJpdEdvQmFzZSB7XG4gIC8vIHYxIHR5cGVzXG4gIHByb3RlY3RlZCBfa2V5Y2hhaW5zOiBhbnk7XG4gIHByb3RlY3RlZCBfd2FsbGV0czogYW55O1xuICBwcm90ZWN0ZWQgX21hcmtldHM/OiBhbnk7XG4gIHByb3RlY3RlZCBfYmxvY2tjaGFpbj86IGFueTtcbiAgcHJvdGVjdGVkIF90cmF2ZWxSdWxlPzogYW55O1xuICBwcm90ZWN0ZWQgX3BlbmRpbmdBcHByb3ZhbHM/OiBhbnk7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBfY29uc3RhbnRzOiBhbnk7XG4gIHByb3RlY3RlZCBzdGF0aWMgX2NvbnN0YW50c0V4cGlyZTogYW55O1xuICBwcm90ZWN0ZWQgc3RhdGljIF90ZXN0bmV0V2FybmluZ01lc3NhZ2UgPSBmYWxzZTtcbiAgcHVibGljIHJlYWRvbmx5IGVudjogRW52aXJvbm1lbnROYW1lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Jhc2VVcmw6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9iYXNlQXBpVXJsOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfYmFzZUFwaVVybFYyOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfZW52OiBFbnZpcm9ubWVudE5hbWU7XG4gIHByb3RlY3RlZCByZWFkb25seSBfYXV0aFZlcnNpb246IEV4Y2x1ZGU8Qml0R29BUElPcHRpb25zWydhdXRoVmVyc2lvbiddLCB1bmRlZmluZWQ+ID0gMjtcbiAgcHJvdGVjdGVkIF9obWFjVmVyaWZpY2F0aW9uID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wcm94eT86IHN0cmluZztcbiAgcHJvdGVjdGVkIF91c2VyPzogVXNlcjtcbiAgcHJvdGVjdGVkIF9leHRlbnNpb25LZXk/OiBFQ1BhaXJJbnRlcmZhY2U7XG4gIHByb3RlY3RlZCBfcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbiAgcHJvdGVjdGVkIF90b2tlbj86IHN0cmluZztcbiAgcHJvdGVjdGVkIF92ZXJzaW9uID0gcGpzb24udmVyc2lvbjtcbiAgcHJvdGVjdGVkIF91c2VyQWdlbnQ/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfZWNkaFhwcnY/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfcmVmcmVzaFRva2VuPzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NsaWVudElkPzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NsaWVudFNlY3JldD86IHN0cmluZztcbiAgcHJvdGVjdGVkIF92YWxpZGF0ZTogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBCaXRHb0FQSU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgIGlmIChcbiAgICAgICFjb21tb24udmFsaWRhdGVQYXJhbXMoXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgW10sXG4gICAgICAgIFtcbiAgICAgICAgICAnYWNjZXNzVG9rZW4nLFxuICAgICAgICAgICd1c2VyQWdlbnQnLFxuICAgICAgICAgICdjdXN0b21Sb290VVJJJyxcbiAgICAgICAgICAnY3VzdG9tQml0Y29pbk5ldHdvcmsnLFxuICAgICAgICAgICdzZXJ2ZXJYcHViJyxcbiAgICAgICAgICAnc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmwnLFxuICAgICAgICBdXG4gICAgICApIHx8XG4gICAgICAocGFyYW1zLnVzZVByb2R1Y3Rpb24gJiYgIV8uaXNCb29sZWFuKHBhcmFtcy51c2VQcm9kdWN0aW9uKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIG9wZXJhdGUgb24gdGhlIHRlc3Qgc2VydmVyLlxuICAgIC8vIERlcHJlY2F0ZSB1c2VQcm9kdWN0aW9uIGluIHRoZSBmdXR1cmVcbiAgICBsZXQgZW52OiBFbnZpcm9ubWVudE5hbWU7XG5cbiAgICBpZiAocGFyYW1zLnVzZVByb2R1Y3Rpb24pIHtcbiAgICAgIGlmIChwYXJhbXMuZW52ICYmIHBhcmFtcy5lbnYgIT09ICdwcm9kJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCB1c2UgdXNlUHJvZHVjdGlvbiB3aGVuIGVudj0nICsgcGFyYW1zLmVudik7XG4gICAgICB9XG4gICAgICBlbnYgPSAncHJvZCc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHBhcmFtcy5jdXN0b21Sb290VVJJIHx8XG4gICAgICBwYXJhbXMuY3VzdG9tQml0Y29pbk5ldHdvcmsgfHxcbiAgICAgIHBhcmFtcy5jdXN0b21TaWduaW5nQWRkcmVzcyB8fFxuICAgICAgcGFyYW1zLnNlcnZlclhwdWIgfHxcbiAgICAgIHByb2Nlc3MuZW52LkJJVEdPX0NVU1RPTV9ST09UX1VSSSB8fFxuICAgICAgcHJvY2Vzcy5lbnYuQklUR09fQ1VTVE9NX0JJVENPSU5fTkVUV09SS1xuICAgICkge1xuICAgICAgLy8gZm9yIGJyYW5jaCBkZXBsb3lzLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gc3BlY2lmeSBjdXN0b20gZW5kcG9pbnRzIHdoaWxlIHN0aWxsXG4gICAgICAvLyBtYWludGFpbmluZyB0aGUgbmFtZSBvZiBzcGVjaWZpZWQgdGhlIGVudmlyb25tZW50XG4gICAgICBlbnYgPSBwYXJhbXMuZW52ID09PSAnYnJhbmNoJyA/ICdicmFuY2gnIDogJ2N1c3RvbSc7XG4gICAgICBpZiAocGFyYW1zLmN1c3RvbVJvb3RVUkkpIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnVyaSA9IHBhcmFtcy5jdXN0b21Sb290VVJJO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5jdXN0b21CaXRjb2luTmV0d29yaykge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0ubmV0d29yayA9IHBhcmFtcy5jdXN0b21CaXRjb2luTmV0d29yaztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuY3VzdG9tU2lnbmluZ0FkZHJlc3MpIHtcbiAgICAgICAgKGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XSBhcyBhbnkpLmN1c3RvbVNpZ25pbmdBZGRyZXNzID0gcGFyYW1zLmN1c3RvbVNpZ25pbmdBZGRyZXNzO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5zZXJ2ZXJYcHViKSB7XG4gICAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS5zZXJ2ZXJYcHViID0gcGFyYW1zLnNlcnZlclhwdWI7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnN0ZWxsYXJGZWRlcmF0aW9uU2VydmVyVXJsKSB7XG4gICAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS5zdGVsbGFyRmVkZXJhdGlvblNlcnZlclVybCA9IHBhcmFtcy5zdGVsbGFyRmVkZXJhdGlvblNlcnZlclVybDtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCkge1xuICAgICAgICB0aGlzLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbnYgPSBwYXJhbXMuZW52IHx8IChwcm9jZXNzLmVudi5CSVRHT19FTlYgYXMgRW52aXJvbm1lbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGhhc24ndCBiZWVuIHNldCB0byB0cnVlIGFscmVhZHkgc29tZSBjb25kaXRpb25zIGFyZSBub3QgbWV0XG4gICAgaWYgKHBhcmFtcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkICYmICF0aGlzLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29va2llcyBhcmUgb25seSBhbGxvd2VkIHdoZW4gY3VzdG9tIFVSSXMgYXJlIGluIHVzZScpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYXV0aFZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fYXV0aFZlcnNpb24gPSBwYXJhbXMuYXV0aFZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBlbnYgaXMgYW4gYWxpYXMsIHN3YXAgaXQgb3V0IHdpdGggdGhlIGVxdWl2YWxlbnQgc3VwcG9ydGVkIGVudmlyb25tZW50XG4gICAgaWYgKGVudiBpbiBBbGlhc0Vudmlyb25tZW50cykge1xuICAgICAgZW52ID0gQWxpYXNFbnZpcm9ubWVudHNbZW52XTtcbiAgICB9XG5cbiAgICBpZiAoZW52ID09PSAnY3VzdG9tJyAmJiBfLmlzVW5kZWZpbmVkKGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdtdXN0IHVzZSAtLWN1c3RvbXJvb3R1cmkgb3Igc2V0IHRoZSBCSVRHT19DVVNUT01fUk9PVF9VUkkgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiB1c2luZyB0aGUgY3VzdG9tIGVudmlyb25tZW50J1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZW52KSB7XG4gICAgICBpZiAoY29tbW9uLkVudmlyb25tZW50c1tlbnZdKSB7XG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0udXJpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudmlyb25tZW50ICcgKyBlbnYgKyAnLiBTdXBwb3J0ZWQgZW52aXJvbm1lbnRzOiBwcm9kLCB0ZXN0LCBkZXYsIGxhdGVzdCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbnYgPSAndGVzdCc7XG4gICAgICBpZiAoIUJpdEdvQVBJLl90ZXN0bmV0V2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgQml0R29BUEkuX3Rlc3RuZXRXYXJuaW5nTWVzc2FnZSA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUubG9nKCdCaXRHbyBTREsgZW52IG5vdCBzZXQgLSBkZWZhdWx0aW5nIHRvIHRlc3QgYXQgdGVzdC5iaXRnby5jb20uJyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9iYXNlVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnVyaTtcbiAgICB9XG4gICAgdGhpcy5fZW52ID0gdGhpcy5lbnYgPSBlbnY7XG5cbiAgICBjb25zdCBzdXBwb3J0ZWRBcGlUb2tlbnMgPSBbXG4gICAgICAnZXRoZXJzY2FuQXBpVG9rZW4nLFxuICAgICAgJ3BvbHlnb25zY2FuQXBpVG9rZW4nLFxuICAgICAgJ2FyYmlzY2FuQXBpVG9rZW4nLFxuICAgICAgJ29wdGltaXN0aWNFdGhlcnNjYW5BcGlUb2tlbicsXG4gICAgICAnemtzeW5jRXhwbG9yZXJBcGlUb2tlbicsXG4gICAgXTtcblxuICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoc3VwcG9ydGVkQXBpVG9rZW5zLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdW2tleV0gPSBwYXJhbXNba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbW1vbi5zZXROZXR3b3JrKGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS5uZXR3b3JrKTtcblxuICAgIHRoaXMuX2Jhc2VBcGlVcmwgPSB0aGlzLl9iYXNlVXJsICsgJy9hcGkvdjEnO1xuICAgIHRoaXMuX2Jhc2VBcGlVcmxWMiA9IHRoaXMuX2Jhc2VVcmwgKyAnL2FwaS92Mic7XG4gICAgdGhpcy5fdG9rZW4gPSBwYXJhbXMuYWNjZXNzVG9rZW47XG4gICAgdGhpcy5fdXNlckFnZW50ID0gcGFyYW1zLnVzZXJBZ2VudCB8fCAnQml0R29KUy1hcGkvJyArIHRoaXMudmVyc2lvbigpO1xuICAgIHRoaXMuX3JlcUlkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3JlZnJlc2hUb2tlbiA9IHBhcmFtcy5yZWZyZXNoVG9rZW47XG4gICAgdGhpcy5fY2xpZW50SWQgPSBwYXJhbXMuY2xpZW50SWQ7XG4gICAgdGhpcy5fY2xpZW50U2VjcmV0ID0gcGFyYW1zLmNsaWVudFNlY3JldDtcbiAgICB0aGlzLl9rZXljaGFpbnMgPSBudWxsO1xuICAgIHRoaXMuX3dhbGxldHMgPSBudWxsO1xuXG4gICAgLy8gd2hldGhlciB0byBwZXJmb3JtIGV4dHJhIGNsaWVudC1zaWRlIHZhbGlkYXRpb24gZm9yIHNvbWUgdGhpbmdzLCBzdWNoIGFzXG4gICAgLy8gYWRkcmVzcyB2YWxpZGF0aW9uIG9yIHNpZ25hdHVyZSB2YWxpZGF0aW9uLiBkZWZhdWx0cyB0byB0cnVlLCBidXQgY2FuIGJlXG4gICAgLy8gdHVybmVkIG9mZiBieSBzZXR0aW5nIHRvIGZhbHNlLiBjYW4gYWxzbyBiZSBvdmVycmlkZGVuIGluZGl2aWR1YWxseSBpbiB0aGVcbiAgICAvLyBmdW5jdGlvbnMgdGhhdCB1c2UgaXQuXG4gICAgdGhpcy5fdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG5cbiAgICBpZiAoIXBhcmFtcy5obWFjVmVyaWZpY2F0aW9uICYmIHBhcmFtcy5obWFjVmVyaWZpY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgoZW52ID09ICdwcm9kJyB8fCBlbnYgPT0gJ2FkbWluUHJvZCcpICYmIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS5obWFjVmVyaWZpY2F0aW9uRW5mb3JjZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZGlzYWJsZSByZXF1ZXN0IEhNQUMgdmVyaWZpY2F0aW9uIGluIGVudmlyb25tZW50ICR7dGhpcy5nZXRFbnYoKX1gKTtcbiAgICAgIH1cbiAgICAgIGRlYnVnKCdITUFDIHZlcmlmaWNhdGlvbiBleHBsaWNpdGx5IGRpc2FibGVkIGJ5IGNvbnN0cnVjdG9yIG9wdGlvbicpO1xuICAgICAgdGhpcy5faG1hY1ZlcmlmaWNhdGlvbiA9IHBhcmFtcy5obWFjVmVyaWZpY2F0aW9uO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5wcm94eSAmJiBwcm9jZXNzLmVudi5CSVRHT19VU0VfUFJPWFkpIHtcbiAgICAgIHBhcmFtcy5wcm94eSA9IHByb2Nlc3MuZW52LkJJVEdPX1VTRV9QUk9YWTtcbiAgICB9XG5cbiAgICBpZiAoKHByb2Nlc3MgYXMgYW55KS5icm93c2VyICYmIHBhcmFtcy5wcm94eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgdXNlIGh0dHBzIHByb3h5IHBhcmFtcyB3aGlsZSBpbiBicm93c2VyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJveHkgPSBwYXJhbXMucHJveHk7XG5cbiAgICAvLyBjYXB0dXJlIG91dGVyIHN0YWNrIHNvIHdlIGhhdmUgdXNlZnVsIGRlYnVnIGluZm9ybWF0aW9uIGlmIGZldGNoIGNvbnN0YW50cyBmYWlsc1xuICAgIGNvbnN0IGUgPSBuZXcgRXJyb3IoKTtcblxuICAgIC8vIEtpY2sgb2ZmIGZpcnN0IGxvYWQgb2YgY29uc3RhbnRzXG4gICAgdGhpcy5mZXRjaENvbnN0YW50cygpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIGFuIGVycm9yIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgZW50aXJlIHNjcmlwdFxuICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gZmV0Y2ggaW5pdGlhbCBjbGllbnQgY29uc3RhbnRzIGZyb20gQml0R28nKTtcbiAgICAgICAgZGVidWcoZS5zdGFjayk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3VwZXJhZ2VudCByZXF1ZXN0IGZvciBzcGVjaWZpZWQgaHR0cCBtZXRob2QgYW5kIFVSTCBjb25maWd1cmVkIHRvIHRoZSBTREsgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gaHR0cCBtZXRob2QgZm9yIHRoZSBuZXcgcmVxdWVzdFxuICAgKiBAcGFyYW0gdXJsIC0gVVJMIGZvciB0aGUgbmV3IHJlcXVlc3RcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBZ2VudFJlcXVlc3QobWV0aG9kOiAodHlwZW9mIHBhdGNoZWRSZXF1ZXN0TWV0aG9kcylbbnVtYmVyXSwgdXJsOiBzdHJpbmcpOiBzdXBlcmFnZW50LlN1cGVyQWdlbnRSZXF1ZXN0IHtcbiAgICBsZXQgcmVxOiBzdXBlcmFnZW50LlN1cGVyQWdlbnRSZXF1ZXN0ID0gc3VwZXJhZ2VudFttZXRob2RdKHVybCk7XG4gICAgaWYgKHRoaXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCkge1xuICAgICAgcmVxID0gcmVxLndpdGhDcmVkZW50aWFscygpO1xuICAgIH1cbiAgICByZXR1cm4gcmVxO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBiYXNlY29pbiBvYmplY3RcbiAgICogQHBhcmFtIG5hbWVcbiAgICovXG4gIHB1YmxpYyBjb2luKG5hbWU6IHN0cmluZyk6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gR2xvYmFsQ29pbkZhY3RvcnkuZ2V0SW5zdGFuY2UodGhpcywgbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IEJpdEdvIGVudmlyb25tZW50XG4gICAqL1xuICBnZXRFbnYoKTogRW52aXJvbm1lbnROYW1lIHtcbiAgICByZXR1cm4gdGhpcy5fZW52O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBhdXRoIHZlcnNpb24gdXNlZCBmb3IgcmVxdWVzdHMgdG8gdGhlIEJpdEdvIHNlcnZlclxuICAgKi9cbiAgZ2V0QXV0aFZlcnNpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aFZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhIHBhdGNoaW5nIGZ1bmN0aW9uIHdoaWNoIGNhbiBhcHBseSBvdXIgYXV0aG9yaXphdGlvblxuICAgKiBoZWFkZXJzIHRvIGFueSBvdXRib3VuZCByZXF1ZXN0LlxuICAgKiBAcGFyYW0gbWV0aG9kXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3RQYXRjaChtZXRob2Q6ICh0eXBlb2YgcGF0Y2hlZFJlcXVlc3RNZXRob2RzKVtudW1iZXJdLCB1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHJlcSA9IHRoaXMuZ2V0QWdlbnRSZXF1ZXN0KG1ldGhvZCwgdXJsKTtcbiAgICBpZiAodGhpcy5fcHJveHkgJiYgZW5hYmxlUHJveHlBZ2VudCkge1xuICAgICAgZGVidWcoJ3Byb3h5aW5nIHJlcXVlc3QgdGhyb3VnaCAlcycsIHRoaXMuX3Byb3h5KTtcbiAgICAgIGNvbnN0IHByb3h5VXJsOiBzdHJpbmcgPSB0aGlzLl9wcm94eTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IHByb3h5QWdlbnRNb2R1bGUuUHJveHlBZ2VudCh7XG4gICAgICAgIGdldFByb3h5Rm9yVXJsOiAoKSA9PiBwcm94eVVybCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGFnZW50KSB7XG4gICAgICAgIHJlcS5hZ2VudChhZ2VudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxUaGVuID0gcmVxLnRoZW4uYmluZChyZXEpO1xuICAgIHJlcS50aGVuID0gKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSA9PiB7XG4gICAgICAvLyBpbnRlcmNlcHQgYSByZXF1ZXN0IGJlZm9yZSBpdCdzIHN1Ym1pdHRlZCB0byB0aGUgc2VydmVyIGZvciB2MiBhdXRoZW50aWNhdGlvbiAoYmFzZWQgb24gdG9rZW4pXG4gICAgICBpZiAodGhpcy5fdmVyc2lvbikge1xuICAgICAgICAvLyBUT0RPIC0gZGVjaWRlIHdoZXJlIHRvIGdldCB2ZXJzaW9uXG4gICAgICAgIHJlcS5zZXQoJ0JpdEdvLVNESy1WZXJzaW9uJywgdGhpcy5fdmVyc2lvbik7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLl9yZXFJZCkpIHtcbiAgICAgICAgcmVxLnNldCgnUmVxdWVzdC1JRCcsIHRoaXMuX3JlcUlkLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIGluY3JlbWVudCBhZnRlciBzZXR0aW5nIHRoZSBoZWFkZXIgc28gdGhlIHNlcXVlbmNlIG51bWJlcnMgc3RhcnQgYXQgMFxuICAgICAgICB0aGlzLl9yZXFJZC5pbmMoKTtcblxuICAgICAgICAvLyByZXF1ZXN0IGlkcyBtdXN0IGJlIHNldCBiZWZvcmUgZWFjaCByZXF1ZXN0IGluc3RlYWQgb2YgYmVpbmcga2VwdFxuICAgICAgICAvLyBpbnNpZGUgdGhlIGJpdGdvIG9iamVjdC4gVGhpcyBpcyB0byBwcmV2ZW50IHJlZW50cmFuY3kgaXNzdWVzIHdoZXJlXG4gICAgICAgIC8vIG11bHRpcGxlIHNpbXVsdGFuZW91cyByZXF1ZXN0cyBjb3VsZCBjYXVzZSBpbmNvcnJlY3QgcmVxSWRzIHRvIGJlIHVzZWRcbiAgICAgICAgZGVsZXRlIHRoaXMuX3JlcUlkO1xuICAgICAgfVxuXG4gICAgICAvLyBwcmV2ZW50IElFIGZyb20gY2FjaGluZyByZXF1ZXN0c1xuICAgICAgcmVxLnNldCgnSWYtTW9kaWZpZWQtU2luY2UnLCAnTW9uLCAyNiBKdWwgMTk5NyAwNTowMDowMCBHTVQnKTtcblxuICAgICAgaWYgKCEocHJvY2VzcyBhcyBhbnkpLmJyb3dzZXIgJiYgdGhpcy5fdXNlckFnZW50KSB7XG4gICAgICAgIC8vIElmIG5vdCBpbiB0aGUgYnJvd3Nlciwgc2V0IHRoZSBVc2VyLUFnZW50LiBCcm93c2VycyBkb24ndCBhbGxvd1xuICAgICAgICAvLyBzZXR0aW5nIG9mIFVzZXItQWdlbnQsIHNvIHdlIG11c3QgZGlzYWJsZSB0aGlzIHdoZW4gcnVuIGluIHRoZVxuICAgICAgICAvLyBicm93c2VyIChicm93c2VyaWZ5IHNldHMgcHJvY2Vzcy5icm93c2VyKS5cbiAgICAgICAgcmVxLnNldCgnVXNlci1BZ2VudCcsIHRoaXMuX3VzZXJBZ2VudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IHRvIGp1c3QgYWJvdmUgNSBtaW51dGVzIGJ5IGRlZmF1bHRcbiAgICAgIHJlcS50aW1lb3V0KChwcm9jZXNzLmVudi5CSVRHT19USU1FT1VUIGFzIGFueSkgKiAxMDAwIHx8IDMwNSAqIDEwMDApO1xuXG4gICAgICAvLyBpZiB0aGVyZSBpcyBubyB0b2tlbiwgYW5kIHdlJ3JlIG5vdCBsb2dnZWQgaW4sIHRoZSByZXF1ZXN0IGNhbm5vdCBiZSB2MiBhdXRoZW50aWNhdGVkXG4gICAgICByZXEuaXNWMkF1dGhlbnRpY2F0ZWQgPSB0cnVlO1xuICAgICAgcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4gPSB0aGlzLl90b2tlbjtcbiAgICAgIC8vIHNvbWUgb2YgdGhlIG9sZGVyIHRva2VucyBhcHBlYXIgdG8gYmUgb25seSA0MCBjaGFyYWN0ZXJzIGxvbmdcbiAgICAgIGlmICgodGhpcy5fdG9rZW4gJiYgdGhpcy5fdG9rZW4ubGVuZ3RoICE9PSA2NyAmJiB0aGlzLl90b2tlbi5pbmRleE9mKCd2MngnKSAhPT0gMCkgfHwgcmVxLmZvcmNlVjFBdXRoKSB7XG4gICAgICAgIC8vIHVzZSB0aGUgb2xkIG1ldGhvZFxuICAgICAgICByZXEuaXNWMkF1dGhlbnRpY2F0ZWQgPSBmYWxzZTtcblxuICAgICAgICByZXEuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgdGhpcy5fdG9rZW4pO1xuICAgICAgICBkZWJ1Zygnc2VuZGluZyB2MSAlcyByZXF1ZXN0IHRvICVzIHdpdGggdG9rZW4gJXMnLCBtZXRob2QsIHVybCwgdGhpcy5fdG9rZW4/LnN1YnN0cigwLCA4KSk7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbFRoZW4ob25mdWxmaWxsZWQpLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICAgICAgfVxuXG4gICAgICByZXEuc2V0KCdCaXRHby1BdXRoLVZlcnNpb24nLCB0aGlzLl9hdXRoVmVyc2lvbiA9PT0gMyA/ICczLjAnIDogJzIuMCcpO1xuXG4gICAgICBpZiAodGhpcy5fdG9rZW4pIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHNlcmlhbGl6ZVJlcXVlc3REYXRhKHJlcSk7XG4gICAgICAgIHNldFJlcXVlc3RRdWVyeVN0cmluZyhyZXEpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RQcm9wZXJ0aWVzID0gdGhpcy5jYWxjdWxhdGVSZXF1ZXN0SGVhZGVycyh7XG4gICAgICAgICAgdXJsOiByZXEudXJsLFxuICAgICAgICAgIHRva2VuOiB0aGlzLl90b2tlbixcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgdGV4dDogZGF0YSB8fCAnJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5zZXQoJ0F1dGgtVGltZXN0YW1wJywgcmVxdWVzdFByb3BlcnRpZXMudGltZXN0YW1wLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIHdlJ3JlIG5vdCBzZW5kaW5nIHRoZSBhY3R1YWwgdG9rZW4sIGJ1dCBvbmx5IGl0cyBoYXNoXG4gICAgICAgIHJlcS5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyByZXF1ZXN0UHJvcGVydGllcy50b2tlbkhhc2gpO1xuICAgICAgICBkZWJ1Zygnc2VuZGluZyB2MiAlcyByZXF1ZXN0IHRvICVzIHdpdGggdG9rZW4gJXMnLCBtZXRob2QsIHVybCwgdGhpcy5fdG9rZW4/LnN1YnN0cigwLCA4KSk7XG5cbiAgICAgICAgLy8gc2V0IHRoZSBITUFDXG4gICAgICAgIHJlcS5zZXQoJ0hNQUMnLCByZXF1ZXN0UHJvcGVydGllcy5obWFjKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBWZXJpZnkgdGhlIHJlc3BvbnNlIGJlZm9yZSBjYWxsaW5nIHRoZSBvcmlnaW5hbCBvbmZ1bGZpbGxlZCBoYW5kbGVyLFxuICAgICAgICogYW5kIG1ha2Ugc3VyZSBvbnJlamVjdGVkIGlzIGNhbGxlZCBpZiBhIHZlcmlmaWNhdGlvbiBlcnJvciBpcyBlbmNvdW50ZXJlZFxuICAgICAgICovXG4gICAgICBjb25zdCBuZXdPbkZ1bGZpbGxlZCA9IG9uZnVsZmlsbGVkXG4gICAgICAgID8gKHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAvLyBITUFDIHZlcmlmaWNhdGlvbiBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgc2tpcHBlZCBpbiBjZXJ0YWluIGVudmlyb25tZW50cy5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgY2hlY2tlZCBpbiB0aGUgY29uc3RydWN0b3IsIGJ1dCBjaGVja2luZyBpdCBhZ2FpbiBhdCByZXF1ZXN0IHRpbWVcbiAgICAgICAgICAgIC8vIHdpbGwgaGVscCBwcmV2ZW50IGFnYWluc3QgdGFtcGVyaW5nIG9mIHRoaXMgcHJvcGVydHkgYWZ0ZXIgdGhlIG9iamVjdCBpcyBjcmVhdGVkXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2htYWNWZXJpZmljYXRpb24gJiYgIWNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0uaG1hY1ZlcmlmaWNhdGlvbkVuZm9yY2VkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvbmZ1bGZpbGxlZChyZXNwb25zZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcmlmaWVkUmVzcG9uc2UgPSB2ZXJpZnlSZXNwb25zZSh0aGlzLCB0aGlzLl90b2tlbiwgbWV0aG9kLCByZXEsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJldHVybiBvbmZ1bGZpbGxlZCh2ZXJpZmllZFJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIDogbnVsbDtcbiAgICAgIHJldHVybiBvcmlnaW5hbFRoZW4obmV3T25GdWxmaWxsZWQpLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICAgIH07XG4gICAgcmV0dXJuIHRvQml0Z29SZXF1ZXN0KHJlcSk7XG4gIH1cblxuICBnZXQodXJsOiBzdHJpbmcpOiBCaXRHb1JlcXVlc3Qge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RQYXRjaCgnZ2V0JywgdXJsKTtcbiAgfVxuICBwb3N0KHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3Bvc3QnLCB1cmwpO1xuICB9XG4gIHB1dCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdwdXQnLCB1cmwpO1xuICB9XG4gIGRlbCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdkZWwnLCB1cmwpO1xuICB9XG4gIHBhdGNoKHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3BhdGNoJywgdXJsKTtcbiAgfVxuICBvcHRpb25zKHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ29wdGlvbnMnLCB1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgSE1BQyBmb3IgdGhlIGdpdmVuIGtleSBhbmQgbWVzc2FnZVxuICAgKiBAcGFyYW0ga2V5IHtTdHJpbmd9IC0gdGhlIGtleSB0byB1c2UgZm9yIHRoZSBITUFDXG4gICAqIEBwYXJhbSBtZXNzYWdlIHtTdHJpbmd9IC0gdGhlIGFjdHVhbCBtZXNzYWdlIHRvIEhNQUNcbiAgICogQHJldHVybnMgeyp9IC0gdGhlIHJlc3VsdCBvZiB0aGUgSE1BQyBvcGVyYXRpb25cbiAgICovXG4gIGNhbGN1bGF0ZUhNQUMoa2V5OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyZWF0ZUhtYWMoJ3NoYTI1NicsIGtleSkudXBkYXRlKG1lc3NhZ2UpLmRpZ2VzdCgnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBzdWJqZWN0IHN0cmluZyB0aGF0IGlzIHRvIGJlIEhNQUMnZWQgZm9yIGEgSFRUUCByZXF1ZXN0IG9yIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB1cmxQYXRoIHJlcXVlc3QgdXJsLCBpbmNsdWRpbmcgcXVlcnkgcGFyYW1zXG4gICAqIEBwYXJhbSB0ZXh0IHJlcXVlc3QgYm9keSB0ZXh0XG4gICAqIEBwYXJhbSB0aW1lc3RhbXAgcmVxdWVzdCB0aW1lc3RhbXAgZnJvbSBgRGF0ZS5ub3coKWBcbiAgICogQHBhcmFtIHN0YXR1c0NvZGUgT25seSBzZXQgZm9yIEhUVFAgcmVzcG9uc2VzLCBsZWF2ZSBibGFuayBmb3IgcmVxdWVzdHNcbiAgICogQHBhcmFtIG1ldGhvZCByZXF1ZXN0IG1ldGhvZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgY2FsY3VsYXRlSE1BQ1N1YmplY3QoeyB1cmxQYXRoLCB0ZXh0LCB0aW1lc3RhbXAsIHN0YXR1c0NvZGUsIG1ldGhvZCB9OiBDYWxjdWxhdGVIbWFjU3ViamVjdE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVybERldGFpbHMgPSB1cmxMaWIucGFyc2UodXJsUGF0aCk7XG4gICAgY29uc3QgcXVlcnlQYXRoID0gdXJsRGV0YWlscy5xdWVyeSAmJiB1cmxEZXRhaWxzLnF1ZXJ5Lmxlbmd0aCA+IDAgPyB1cmxEZXRhaWxzLnBhdGggOiB1cmxEZXRhaWxzLnBhdGhuYW1lO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChzdGF0dXNDb2RlKSAmJiBfLmlzSW50ZWdlcihzdGF0dXNDb2RlKSAmJiBfLmlzRmluaXRlKHN0YXR1c0NvZGUpKSB7XG4gICAgICBpZiAodGhpcy5fYXV0aFZlcnNpb24gPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIFttZXRob2QudG9VcHBlckNhc2UoKSwgdGltZXN0YW1wLCBxdWVyeVBhdGgsIHN0YXR1c0NvZGUsIHRleHRdLmpvaW4oJ3wnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbdGltZXN0YW1wLCBxdWVyeVBhdGgsIHN0YXR1c0NvZGUsIHRleHRdLmpvaW4oJ3wnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2F1dGhWZXJzaW9uID09PSAzKSB7XG4gICAgICByZXR1cm4gW21ldGhvZC50b1VwcGVyQ2FzZSgpLCB0aW1lc3RhbXAsICczLjAnLCBxdWVyeVBhdGgsIHRleHRdLmpvaW4oJ3wnKTtcbiAgICB9XG4gICAgcmV0dXJuIFt0aW1lc3RhbXAsIHF1ZXJ5UGF0aCwgdGV4dF0uam9pbignfCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgSE1BQyBmb3IgYW4gSFRUUCByZXF1ZXN0XG4gICAqL1xuICBjYWxjdWxhdGVSZXF1ZXN0SE1BQyh7IHVybDogdXJsUGF0aCwgdGV4dCwgdGltZXN0YW1wLCB0b2tlbiwgbWV0aG9kIH06IENhbGN1bGF0ZVJlcXVlc3RIbWFjT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2lnbmF0dXJlU3ViamVjdCA9IHRoaXMuY2FsY3VsYXRlSE1BQ1N1YmplY3QoeyB1cmxQYXRoLCB0ZXh0LCB0aW1lc3RhbXAsIG1ldGhvZCB9KTtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgSE1BQ1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUhNQUModG9rZW4sIHNpZ25hdHVyZVN1YmplY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSByZXF1ZXN0IGhlYWRlcnMgd2l0aCBITUFDXG4gICAqL1xuICBjYWxjdWxhdGVSZXF1ZXN0SGVhZGVycyh7IHVybCwgdGV4dCwgdG9rZW4sIG1ldGhvZCB9OiBDYWxjdWxhdGVSZXF1ZXN0SGVhZGVyc09wdGlvbnMpOiBSZXF1ZXN0SGVhZGVycyB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBobWFjID0gdGhpcy5jYWxjdWxhdGVSZXF1ZXN0SE1BQyh7IHVybCwgdGV4dCwgdGltZXN0YW1wLCB0b2tlbiwgbWV0aG9kIH0pO1xuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSBTSEEyNTYgaGFzaCBvZiB0aGUgdG9rZW5cbiAgICBjb25zdCBoYXNoRGlnZXN0ID0gc2pjbC5oYXNoLnNoYTI1Ni5oYXNoKHRva2VuKTtcbiAgICBjb25zdCB0b2tlbkhhc2ggPSBzamNsLmNvZGVjLmhleC5mcm9tQml0cyhoYXNoRGlnZXN0KTtcbiAgICByZXR1cm4ge1xuICAgICAgaG1hYyxcbiAgICAgIHRpbWVzdGFtcCxcbiAgICAgIHRva2VuSGFzaCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGUgSE1BQyBmb3IgYW4gSFRUUCByZXNwb25zZVxuICAgKi9cbiAgdmVyaWZ5UmVzcG9uc2Uoe1xuICAgIHVybDogdXJsUGF0aCxcbiAgICBzdGF0dXNDb2RlLFxuICAgIHRleHQsXG4gICAgdGltZXN0YW1wLFxuICAgIHRva2VuLFxuICAgIGhtYWMsXG4gICAgbWV0aG9kLFxuICB9OiBWZXJpZnlSZXNwb25zZU9wdGlvbnMpOiBWZXJpZnlSZXNwb25zZUluZm8ge1xuICAgIGNvbnN0IHNpZ25hdHVyZVN1YmplY3QgPSB0aGlzLmNhbGN1bGF0ZUhNQUNTdWJqZWN0KHtcbiAgICAgIHVybFBhdGgsXG4gICAgICB0ZXh0LFxuICAgICAgdGltZXN0YW1wLFxuICAgICAgc3RhdHVzQ29kZSxcbiAgICAgIG1ldGhvZCxcbiAgICB9KTtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgSE1BQ1xuICAgIGNvbnN0IGV4cGVjdGVkSG1hYyA9IHRoaXMuY2FsY3VsYXRlSE1BQyh0b2tlbiwgc2lnbmF0dXJlU3ViamVjdCk7XG5cbiAgICAvLyBkZXRlcm1pbmUgaWYgdGhlIHJlc3BvbnNlIGlzIHN0aWxsIHdpdGhpbiB0aGUgdmFsaWRpdHkgd2luZG93ICg1IG1pbnV0ZSB3aW5kb3cpXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBpc0luUmVzcG9uc2VWYWxpZGl0eVdpbmRvdyA9IHRpbWVzdGFtcCA+PSBub3cgLSAxMDAwICogNjAgKiA1ICYmIHRpbWVzdGFtcCA8PSBub3c7XG5cbiAgICAvLyB2ZXJpZnkgdGhlIEhNQUMgYW5kIHRpbWVzdGFtcFxuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiBleHBlY3RlZEhtYWMgPT09IGhtYWMsXG4gICAgICBleHBlY3RlZEhtYWMsXG4gICAgICBzaWduYXR1cmVTdWJqZWN0LFxuICAgICAgaXNJblJlc3BvbnNlVmFsaWRpdHlXaW5kb3csXG4gICAgICB2ZXJpZmljYXRpb25UaW1lOiBub3csXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB1c2VmdWwgY29uc3RhbnQgdmFsdWVzIGZyb20gdGhlIEJpdEdvIHNlcnZlci5cbiAgICogVGhlc2UgdmFsdWVzIGRvIGNoYW5nZSBpbmZyZXF1ZW50bHksIHNvIHRoZXkgbmVlZCB0byBiZSBmZXRjaGVkLFxuICAgKiBidXQgYXJlIHVubGlrZWx5IHRvIGNoYW5nZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGEgQml0R28gb2JqZWN0LFxuICAgKiBzbyB0aGV5IGNhbiBzYWZlbHkgY2FjaGVkLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hDb25zdGFudHMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBlbnYgPSB0aGlzLmdldEVudigpO1xuXG4gICAgaWYgKCFCaXRHb0FQSS5fY29uc3RhbnRzKSB7XG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzID0ge307XG4gICAgfVxuICAgIGlmICghQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZSkge1xuICAgICAgQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZSA9IHt9O1xuICAgIH1cblxuICAgIGlmIChCaXRHb0FQSS5fY29uc3RhbnRzW2Vudl0gJiYgQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZVtlbnZdICYmIG5ldyBEYXRlKCkgPCBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlW2Vudl0pIHtcbiAgICAgIHJldHVybiBCaXRHb0FQSS5fY29uc3RhbnRzW2Vudl07XG4gICAgfVxuXG4gICAgLy8gY2xpZW50IGNvbnN0YW50cyBjYWxsIGNhbm5vdCBiZSBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBub3JtYWwgSE1BQyB2YWxpZGF0aW9uXG4gICAgLy8gc2NoZW1lLCBzbyB3ZSBuZWVkIHRvIHVzZSBhIHJhdyBzdXBlcmFnZW50IGluc3RhbmNlIHRvIGRvIHRoaXMgcmVxdWVzdC5cbiAgICAvLyBQcm94eSBzZXR0aW5ncyBtdXN0IHN0aWxsIGJlIHJlc3BlY3RlZCBob3dldmVyXG4gICAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IHRoaXMuZ2V0QWdlbnRSZXF1ZXN0KCdnZXQnLCB0aGlzLnVybCgnL2NsaWVudC9jb25zdGFudHMnKSk7XG4gICAgcmVzdWx0UHJvbWlzZS5zZXQoJ0JpdEdvLVNESy1WZXJzaW9uJywgdGhpcy5fdmVyc2lvbik7XG4gICAgaWYgKHRoaXMuX3Byb3h5ICYmIGVuYWJsZVByb3h5QWdlbnQpIHtcbiAgICAgIGNvbnN0IHByb3h5VXJsOiBzdHJpbmcgPSB0aGlzLl9wcm94eTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IHByb3h5QWdlbnRNb2R1bGUuUHJveHlBZ2VudCh7XG4gICAgICAgIGdldFByb3h5Rm9yVXJsOiAoKSA9PiBwcm94eVVybCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGFnZW50KSB7XG4gICAgICAgIHJlc3VsdFByb21pc2UuYWdlbnQoYWdlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXN1bHRQcm9taXNlO1xuICAgIEJpdEdvQVBJLl9jb25zdGFudHNbZW52XSA9IHJlc3VsdC5ib2R5LmNvbnN0YW50cztcblxuICAgIGlmIChyZXN1bHQuYm9keT8udHRsICYmIHR5cGVvZiByZXN1bHQuYm9keT8udHRsID09PSAnbnVtYmVyJykge1xuICAgICAgQml0R29BUEkuX2NvbnN0YW50c0V4cGlyZVtlbnZdID0gbmV3IERhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkgKyAocmVzdWx0LmJvZHkudHRsIGFzIG51bWJlcikgKiAxMDAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQml0R29BUEkuX2NvbnN0YW50c1tlbnZdO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHVybCBmb3IgY2FsbGluZyBCaXRHbyBwbGF0Zm9ybSBBUElzXG4gICAqIEBwYXJhbSBwYXRoXG4gICAqIEBwYXJhbSB2ZXJzaW9uXG4gICAqL1xuICB1cmwocGF0aDogc3RyaW5nLCB2ZXJzaW9uID0gMSk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZVVybCA9IHZlcnNpb24gPT09IDIgPyB0aGlzLl9iYXNlQXBpVXJsVjIgOiB0aGlzLl9iYXNlQXBpVXJsO1xuICAgIHJldHVybiBiYXNlVXJsICsgcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB1cmwgZm9yIGNhbGxpbmcgQml0R28gbWljcm9zZXJ2aWNlIEFQSXNcbiAgICovXG4gIG1pY3Jvc2VydmljZXNVcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYmFzZVVybCArIHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmVyc2lvbiBvZiB0aGUgQml0R29KUyBwYWNrYWdlXG4gICAqL1xuICB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogVGVzdCBjb25uZWN0aXZpdHkgdG8gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBwaW5nKHsgcmVxSWQgfTogUGluZ09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHJlcUlkKSB7XG4gICAgICB0aGlzLl9yZXFJZCA9IHJlcUlkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL3BpbmcnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgcmVxdWVzdCB0cmFjZXIgdG8gcHJvdmlkZSByZXF1ZXN0IElEcyBkdXJpbmcgbXVsdGktcmVxdWVzdCB3b3JrZmxvd3NcbiAgICovXG4gIHNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyOiBJUmVxdWVzdFRyYWNlcik6IHZvaWQge1xuICAgIGlmIChyZXFUcmFjZXIpIHtcbiAgICAgIHRoaXMuX3JlcUlkID0gcmVxVHJhY2VyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVuY3J5cHQgbG9jYWxseS5cbiAgICovXG4gIGVuY3J5cHQocGFyYW1zOiBFbmNyeXB0T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpbnB1dCcsICdwYXNzd29yZCddLCBbXSk7XG4gICAgaWYgKCFwYXJhbXMucGFzc3dvcmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGVuY3J5cHQgd2l0aG91dCBwYXNzd29yZGApO1xuICAgIH1cbiAgICByZXR1cm4gZW5jcnlwdChwYXJhbXMucGFzc3dvcmQsIHBhcmFtcy5pbnB1dCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjcnlwdCBhbiBlbmNyeXB0ZWQgc3RyaW5nIGxvY2FsbHkuXG4gICAqL1xuICBkZWNyeXB0KHBhcmFtczogRGVjcnlwdE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lucHV0JywgJ3Bhc3N3b3JkJ10sIFtdKTtcbiAgICBpZiAoIXBhcmFtcy5wYXNzd29yZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgZGVjcnlwdCB3aXRob3V0IHBhc3N3b3JkYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZGVjcnlwdChwYXJhbXMucGFzc3dvcmQsIHBhcmFtcy5pbnB1dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiY2NtOiB0YWcgZG9lc24ndCBtYXRjaFwiKSkge1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gJ3Bhc3N3b3JkIGVycm9yIC0gJyArIGVycm9yLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoaXMgQml0R28gb2JqZWN0IHRvIGEgSlNPTiBvYmplY3QuXG4gICAqXG4gICAqIENhdXRpb246IGNvbnRhaW5zIHNlbnNpdGl2ZSBkYXRhXG4gICAqL1xuICB0b0pTT04oKTogQml0R29Kc29uIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlcjogdGhpcy5fdXNlcixcbiAgICAgIHRva2VuOiB0aGlzLl90b2tlbixcbiAgICAgIGV4dGVuc2lvbktleTogdGhpcy5fZXh0ZW5zaW9uS2V5ID8gdGhpcy5fZXh0ZW5zaW9uS2V5LnRvV0lGKCkgOiB1bmRlZmluZWQsXG4gICAgICBlY2RoWHBydjogdGhpcy5fZWNkaFhwcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdXNlclxuICAgKi9cbiAgdXNlcigpOiBVc2VyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBhIEpTT04gc2VyaWFsaXplZCBCaXRHbyBvYmplY3QuXG4gICAqXG4gICAqIE92ZXJ3cml0ZXMgdGhlIHByb3BlcnRpZXMgb24gdGhlIGN1cnJlbnQgQml0R28gb2JqZWN0IHdpdGhcbiAgICogdGhvc2Ugb2YgdGhlIGRlc2VyaWFsemVkIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIGpzb25cbiAgICovXG4gIGZyb21KU09OKGpzb246IEJpdEdvSnNvbik6IHZvaWQge1xuICAgIHRoaXMuX3VzZXIgPSBqc29uLnVzZXI7XG4gICAgdGhpcy5fdG9rZW4gPSBqc29uLnRva2VuO1xuICAgIHRoaXMuX2VjZGhYcHJ2ID0ganNvbi5lY2RoWHBydjtcbiAgICBpZiAoanNvbi5leHRlbnNpb25LZXkpIHtcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLm5ldHdvcms7XG4gICAgICB0aGlzLl9leHRlbnNpb25LZXkgPSB1dHhvbGliLkVDUGFpci5mcm9tV0lGKFxuICAgICAgICBqc29uLmV4dGVuc2lvbktleSxcbiAgICAgICAgdXR4b2xpYi5uZXR3b3Jrc1tuZXR3b3JrXSBhcyB1dHhvbGliLkJpdGNvaW5KU05ldHdvcmtcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgdGhlIHVzZXJuYW1lLCBwYXNzd29yZCBhbmQgb3RwIGludG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lIGFuZCBoYXNoZWQgcGFzc3dvcmQsIHJlYWR5IHRvXG4gICAqIHNlbmQgdG8gYml0Z28gZm9yIGF1dGhlbnRpY2F0aW9uLlxuICAgKi9cbiAgcHJlcHJvY2Vzc0F1dGhlbnRpY2F0aW9uUGFyYW1zKHtcbiAgICB1c2VybmFtZSxcbiAgICBwYXNzd29yZCxcbiAgICBvdHAsXG4gICAgZm9yY2VTTVMsXG4gICAgZXh0ZW5zaWJsZSxcbiAgICB0cnVzdCxcbiAgfTogQXV0aGVudGljYXRlT3B0aW9ucyk6IFByb2Nlc3NlZEF1dGhlbnRpY2F0aW9uT3B0aW9ucyB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHVzZXJuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgdXNlcm5hbWUnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvd2VyTmFtZSA9IHVzZXJuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwYXNzd29yZCBITUFDIHNvIHdlIGRvbid0IHNlbmQgY2xlYXItdGV4dCBwYXNzd29yZHNcbiAgICBjb25zdCBobWFjUGFzc3dvcmQgPSB0aGlzLmNhbGN1bGF0ZUhNQUMobG93ZXJOYW1lLCBwYXNzd29yZCk7XG5cbiAgICBjb25zdCBhdXRoUGFyYW1zOiBQcm9jZXNzZWRBdXRoZW50aWNhdGlvbk9wdGlvbnMgPSB7XG4gICAgICBlbWFpbDogbG93ZXJOYW1lLFxuICAgICAgcGFzc3dvcmQ6IGhtYWNQYXNzd29yZCxcbiAgICAgIGZvcmNlU01TOiAhIWZvcmNlU01TLFxuICAgIH07XG5cbiAgICBpZiAob3RwKSB7XG4gICAgICBhdXRoUGFyYW1zLm90cCA9IG90cDtcbiAgICAgIGlmICh0cnVzdCkge1xuICAgICAgICBhdXRoUGFyYW1zLnRydXN0ID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0ZW5zaWJsZSkge1xuICAgICAgdGhpcy5fZXh0ZW5zaW9uS2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICAgICAgYXV0aFBhcmFtcy5leHRlbnNpYmxlID0gdHJ1ZTtcbiAgICAgIGF1dGhQYXJhbXMuZXh0ZW5zaW9uQWRkcmVzcyA9IGdldEFkZHJlc3NQMlBLSCh0aGlzLl9leHRlbnNpb25LZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBhdXRoUGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIG1ldGhvZCBmb3IgYWN0aXZhdGluZyBhbiBhY2Nlc3MgdG9rZW4uXG4gICAqL1xuICBhdXRoZW50aWNhdGVXaXRoQWNjZXNzVG9rZW4oeyBhY2Nlc3NUb2tlbiB9OiBBY2Nlc3NUb2tlbk9wdGlvbnMpOiB2b2lkIHtcbiAgICBkZWJ1Zygnbm93IGF1dGhlbnRpY2F0aW5nIHdpdGggYWNjZXNzIHRva2VuICVzJywgYWNjZXNzVG9rZW4uc3Vic3RyaW5nKDAsIDgpKTtcbiAgICB0aGlzLl90b2tlbiA9IGFjY2Vzc1Rva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgRUNESCBrZXljaGFpbiBmb3IgdGhlIHVzZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpblBhc3N3b3JkIC0gVGhlIHVzZXIncyBsb2dpbiBwYXNzd29yZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgRUNESCBrZXljaGFpbiBkYXRhLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlcmUgaXMgYW4gaXNzdWUgY3JlYXRpbmcgdGhlIGtleWNoYWluLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVVzZXJFY2RoS2V5Y2hhaW4obG9naW5QYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBrZXlEYXRhID0gdGhpcy5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICBjb25zdCBoZE5vZGUgPSBiaXRjb2luLkhETm9kZS5mcm9tQmFzZTU4KGtleURhdGEueHBydik7XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIG5ldyBFQ0RIIGtleWNoYWluIHRvIHRoZSB1c2VyJ3MgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTxhbnk+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG5ldyBFQ0RIIGtleWNoYWluLlxuICAgICAqL1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmtleWNoYWlucygpLmFkZCh7XG4gICAgICBzb3VyY2U6ICdlY2RoJyxcbiAgICAgIHhwdWI6IGhkTm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICBlbmNyeXB0ZWRYcHJ2OiB0aGlzLmVuY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogbG9naW5QYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IGhkTm9kZS50b0Jhc2U1OCgpLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgdXNlcidzIHNldHRpbmdzIHdpdGggdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byB1cGRhdGUgdGhlIHVzZXIncyBzZXR0aW5ncyB3aXRoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlcmUgaXMgYW4gaXNzdWUgdXBkYXRpbmcgdGhlIHVzZXIncyBzZXR0aW5ncy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlVXNlclNldHRpbmdzKHBhcmFtczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wdXQodGhpcy51cmwoJy91c2VyL3NldHRpbmdzJywgMikpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoYXQgdGhlIHVzZXIncyBFQ0RIIGtleWNoYWluIGlzIGNyZWF0ZWQgZm9yIHdhbGxldCBzaGFyaW5nIGFuZCBUU1Mgd2FsbGV0cy5cbiAgICogSWYgdGhlIGtleWNoYWluIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSB1c2VyJ3Mgc2V0dGluZ3Mgd2lsbCBiZSB1cGRhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naW5QYXNzd29yZCAtIFRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdXNlcidzIHNldHRpbmdzIGVuc3VyaW5nIHdlIGhhdmUgdGhlIGVjZGhLZXljaGFpbiBpbiB0aGVyZS5cbiAgICogQHRocm93cyB7RXJyb3J9IC0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZXJlIGlzIGFuIGlzc3VlIGNyZWF0aW5nIHRoZSBrZXljaGFpbiBvciB1cGRhdGluZyB0aGUgdXNlcidzIHNldHRpbmdzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVVc2VyRWNkaEtleWNoYWluSXNDcmVhdGVkKGxvZ2luUGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB1c2VyJ3MgY3VycmVudCBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBjb25zdCB1c2VyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmdldCh0aGlzLnVybCgnL3VzZXIvc2V0dGluZ3MnKSkucmVzdWx0KCk7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHVzZXIncyBFQ0RIIGtleWNoYWluIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYSBuZXcga2V5Y2hhaW4gYW5kIHVwZGF0ZSB0aGUgdXNlcidzIHNldHRpbmdzLlxuICAgICAqL1xuICAgIGlmICghdXNlclNldHRpbmdzLnNldHRpbmdzLmVjZGhLZXljaGFpbikge1xuICAgICAgY29uc3QgbmV3S2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmNyZWF0ZVVzZXJFY2RoS2V5Y2hhaW4obG9naW5QYXNzd29yZCk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJTZXR0aW5ncyh7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgZWNkaEtleWNoYWluOiBuZXdLZXljaGFpbi54cHViLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSB0aGUgdXNlcidzIHNldHRpbmdzIG9iamVjdCB3aXRoIHRoZSBuZXcgRUNESCBrZXljaGFpbi5cbiAgICAgICAqL1xuICAgICAgdXNlclNldHRpbmdzLnNldHRpbmdzLmVjZGhLZXljaGFpbiA9IG5ld0tleWNoYWluLnhwdWI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgdXNlcidzIEVDREgga2V5Y2hhaW4gc2V0dGluZ3MuXG4gICAgICovXG4gICAgcmV0dXJuIHVzZXJTZXR0aW5ncy5zZXR0aW5ncztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dpbiB0byB0aGUgYml0Z28gcGxhdGZvcm0uXG4gICAqL1xuICBhc3luYyBhdXRoZW50aWNhdGUocGFyYW1zOiBBdXRoZW50aWNhdGVPcHRpb25zKTogUHJvbWlzZTxMb2dpblJlc3BvbnNlIHwgYW55PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghXy5pc09iamVjdChwYXJhbXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgb2JqZWN0IHBhcmFtcycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnBhc3N3b3JkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBwYXNzd29yZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JjZVYxQXV0aCA9ICEhcGFyYW1zLmZvcmNlVjFBdXRoO1xuICAgICAgY29uc3QgYXV0aFBhcmFtcyA9IHRoaXMucHJlcHJvY2Vzc0F1dGhlbnRpY2F0aW9uUGFyYW1zKHBhcmFtcyk7XG4gICAgICBjb25zdCBwYXNzd29yZCA9IHBhcmFtcy5wYXNzd29yZDtcblxuICAgICAgaWYgKHRoaXMuX3Rva2VuKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ2FscmVhZHkgbG9nZ2VkIGluJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhVcmwgPSB0aGlzLm1pY3Jvc2VydmljZXNVcmwoJy9hcGkvYXV0aC92MS9zZXNzaW9uJyk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wb3N0KGF1dGhVcmwpO1xuXG4gICAgICBpZiAoZm9yY2VWMUF1dGgpIHtcbiAgICAgICAgcmVxdWVzdC5mb3JjZVYxQXV0aCA9IHRydWU7XG4gICAgICAgIC8vIHRlbGwgdGhlIHNlcnZlciB0aGF0IHRoZSBjbGllbnQgd2FzIGZvcmNlZCB0byBkb3duZ3JhZGUgdGhlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sXG4gICAgICAgIGF1dGhQYXJhbXMuZm9yY2VWMUF1dGggPSB0cnVlO1xuICAgICAgICBkZWJ1ZygnZm9yY2luZyB2MSBhdXRoIGZvciBjYWxsIHRvIGF1dGhlbnRpY2F0ZScpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LnNlbmQoYXV0aFBhcmFtcyk7XG4gICAgICAvLyBleHRyYWN0IGJvZHkgYW5kIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgIGNvbnN0IGJvZHkgPSByZXNwb25zZS5ib2R5O1xuICAgICAgdGhpcy5fdXNlciA9IGJvZHkudXNlcjtcblxuICAgICAgaWYgKGJvZHkuYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgIHRoaXMuX3Rva2VuID0gYm9keS5hY2Nlc3NfdG9rZW47XG4gICAgICAgIC8vIGlmIHRoZSBkb3duZ3JhZGUgd2FzIGZvcmNlZCwgYWRkaW5nIGEgd2FybmluZyBtZXNzYWdlIG1pZ2h0IGJlIHBydWRlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNoZWNrIHRoZSBwcmVzZW5jZSBvZiBhbiBlbmNyeXB0ZWQgRUNESCB4cHJ2XG4gICAgICAgIC8vIGlmIG5vdCBwcmVzZW50LCBsZWdhY3kgYWNjb3VudFxuICAgICAgICBjb25zdCBlbmNyeXB0ZWRYcHJ2ID0gYm9keS5lbmNyeXB0ZWRFQ0RIWHBydjtcbiAgICAgICAgaWYgKCFlbmNyeXB0ZWRYcHJ2KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdLZXljaGFpbiBuZWVkcyBlbmNyeXB0ZWRYcHJ2IHByb3BlcnR5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZURldGFpbHMgPSB0aGlzLmhhbmRsZVRva2VuSXNzdWFuY2UocmVzcG9uc2UuYm9keSwgcGFzc3dvcmQpO1xuICAgICAgICB0aGlzLl90b2tlbiA9IHJlc3BvbnNlRGV0YWlscy50b2tlbjtcbiAgICAgICAgdGhpcy5fZWNkaFhwcnYgPSByZXNwb25zZURldGFpbHMuZWNkaFhwcnY7XG5cbiAgICAgICAgLy8gdmVyaWZ5IHRoZSByZXNwb25zZSdzIGF1dGhlbnRpY2l0eVxuICAgICAgICB2ZXJpZnlSZXNwb25zZSh0aGlzLCByZXNwb25zZURldGFpbHMudG9rZW4sICdwb3N0JywgcmVxdWVzdCwgcmVzcG9uc2UpO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgcmVtYWluaW5nIGNvbXBvbmVudCBmb3IgZWFzaWVyIGFjY2Vzc1xuICAgICAgICByZXNwb25zZS5ib2R5LmFjY2Vzc190b2tlbiA9IHRoaXMuX3Rva2VuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1c2VyU2V0dGluZ3MgPSBwYXJhbXMuZW5zdXJlRWNkaEtleWNoYWluID8gYXdhaXQgdGhpcy5lbnN1cmVVc2VyRWNkaEtleWNoYWluSXNDcmVhdGVkKHBhc3N3b3JkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh1c2VyU2V0dGluZ3M/LmVjZGhLZXljaGFpbikge1xuICAgICAgICByZXNwb25zZS5ib2R5LnVzZXIuZWNkaEtleWNoYWluID0gdXNlclNldHRpbmdzLmVjZGhLZXljaGFpbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhhbmRsZVJlc3BvbnNlUmVzdWx0PExvZ2luUmVzcG9uc2U+KCkocmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhhbmRsZVJlc3BvbnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByZXNwb25zZUJvZHkgUmVzcG9uc2UgYm9keSBvYmplY3RcbiAgICogQHBhcmFtIHBhc3N3b3JkIFBhc3N3b3JkIGZvciB0aGUgc3ltbWV0cmljIGRlY3J5cHRpb25cbiAgICovXG4gIGhhbmRsZVRva2VuSXNzdWFuY2UocmVzcG9uc2VCb2R5OiBUb2tlbklzc3VhbmNlUmVzcG9uc2UsIHBhc3N3b3JkPzogc3RyaW5nKTogVG9rZW5Jc3N1YW5jZSB7XG4gICAgLy8gbWFrZSBzdXJlIHRoZSByZXNwb25zZSBib2R5IGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkgcHJvcGVydGllc1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhyZXNwb25zZUJvZHksIFsnZGVyaXZhdGlvblBhdGgnXSwgWydlbmNyeXB0ZWRFQ0RIWHBydiddKTtcblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gdGhpcy5fZW52O1xuICAgIGNvbnN0IGVudmlyb25tZW50Q29uZmlnID0gY29tbW9uLkVudmlyb25tZW50c1tlbnZpcm9ubWVudF07XG4gICAgY29uc3Qgc2VydmVyWHB1YiA9IGVudmlyb25tZW50Q29uZmlnLnNlcnZlclhwdWI7XG4gICAgbGV0IGVjZGhYcHJ2ID0gdGhpcy5fZWNkaFhwcnY7XG4gICAgaWYgKCFlY2RoWHBydikge1xuICAgICAgaWYgKCFwYXNzd29yZCB8fCAhcmVzcG9uc2VCb2R5LmVuY3J5cHRlZEVDREhYcHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZWNkaFhwcnYgcHJvcGVydHkgbXVzdCBiZSBzZXQgb3IgcGFzc3dvcmQgYW5kIGVuY3J5cHRlZCBlbmNyeXB0ZWRFQ0RIWHBydiBtdXN0IGJlIHByb3ZpZGVkJyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBlY2RoWHBydiA9IHRoaXMuZGVjcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHJlc3BvbnNlQm9keS5lbmNyeXB0ZWRFQ0RIWHBydixcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlLmVycm9yQ29kZSA9ICdlY2RoX3hwcnZfZGVjcnlwdGlvbl9mYWlsdXJlJztcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRlY3J5cHQgZW5jcnlwdGVkRUNESFhwcnYuJyk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IEhETm9kZSBvYmplY3RzIGZvciBjbGllbnQncyB4cHJ2IGFuZCBzZXJ2ZXIncyB4cHViXG4gICAgY29uc3QgY2xpZW50SEROb2RlID0gYmlwMzIuZnJvbUJhc2U1OChlY2RoWHBydik7XG4gICAgY29uc3Qgc2VydmVySEROb2RlID0gYmlwMzIuZnJvbUJhc2U1OChzZXJ2ZXJYcHViKTtcblxuICAgIC8vIEJJUDMyIGRlcml2YXRpb24gcGF0aCBpcyBhcHBsaWVkIHRvIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgbWFzdGVyIGtleXNcbiAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IHNhbml0aXplTGVnYWN5UGF0aChyZXNwb25zZUJvZHkuZGVyaXZhdGlvblBhdGgpO1xuICAgIGNvbnN0IGNsaWVudERlcml2ZWROb2RlID0gY2xpZW50SEROb2RlLmRlcml2ZVBhdGgoZGVyaXZhdGlvblBhdGgpO1xuICAgIGNvbnN0IHNlcnZlckRlcml2ZWROb2RlID0gc2VydmVySEROb2RlLmRlcml2ZVBhdGgoZGVyaXZhdGlvblBhdGgpO1xuXG4gICAgY29uc3QgcHVibGljS2V5ID0gc2VydmVyRGVyaXZlZE5vZGUucHVibGljS2V5O1xuICAgIGNvbnN0IHNlY3JldEtleSA9IGNsaWVudERlcml2ZWROb2RlLnByaXZhdGVLZXk7XG4gICAgaWYgKCFzZWNyZXRLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY2xpZW50IHByaXZhdGUgS2V5Jyk7XG4gICAgfVxuICAgIGNvbnN0IHNlY3JldCA9IEJ1ZmZlci5mcm9tKFxuICAgICAgLy8gRklYTUUoQkctMzQzODYpOiB3ZSBzaG91bGQgdXNlIGBzZWNwMjU2azEuZWNkaCgpYCBpbiB0aGUgZnV0dXJlXG4gICAgICAvLyAgICAgICAgICAgICAgICAgIHNlZSBkaXNjdXNzaW9uIGhlcmUgaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4tY29yZS9zZWNwMjU2azEvaXNzdWVzLzM1MlxuICAgICAgc2VjcDI1NmsxLnB1YmxpY0tleVR3ZWFrTXVsKHB1YmxpY0tleSwgc2VjcmV0S2V5KVxuICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgLy8gZGVjcnlwdCB0b2tlbiB3aXRoIHN5bW1ldHJpYyBFQ0RIIGtleVxuICAgIGxldCByZXNwb25zZTogVG9rZW5Jc3N1YW5jZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgIHRva2VuOiB0aGlzLmRlY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiByZXNwb25zZUJvZHkuZW5jcnlwdGVkVG9rZW4sXG4gICAgICAgICAgcGFzc3dvcmQ6IHNlY3JldCxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGUuZXJyb3JDb2RlID0gJ3Rva2VuX2RlY3J5cHRpb25fZmFpbHVyZSc7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGVjcnlwdCB0b2tlbi4nKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGlmICghdGhpcy5fZWNkaFhwcnYpIHtcbiAgICAgIHJlc3BvbnNlLmVjZGhYcHJ2ID0gZWNkaFhwcnY7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKi9cbiAgdmVyaWZ5UGFzc3dvcmQocGFyYW1zOiBWZXJpZnlQYXNzd29yZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFzc3dvcmQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3VzZXIgfHwgIXRoaXMuX3VzZXIudXNlcm5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY3VycmVudCB1c2VyJyk7XG4gICAgfVxuICAgIGNvbnN0IGhtYWNQYXNzd29yZCA9IHRoaXMuY2FsY3VsYXRlSE1BQyh0aGlzLl91c2VyLnVzZXJuYW1lLCBwYXJhbXMucGFzc3dvcmQpO1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvdmVyaWZ5cGFzc3dvcmQnKSkuc2VuZCh7IHBhc3N3b3JkOiBobWFjUGFzc3dvcmQgfSkucmVzdWx0KCd2YWxpZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIG91dCBhbGwgc3RhdGUgZnJvbSB0aGlzIEJpdEdvIG9iamVjdCwgZWZmZWN0aXZlbHkgbG9nZ2luZyBvdXQgdGhlIGN1cnJlbnQgdXNlci5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIC8vIFRPRE86IGFyZSB0aGVyZSBhbnkgb3RoZXIgZmllbGRzIHdoaWNoIHNob3VsZCBiZSBjbGVhcmVkP1xuICAgIHRoaXMuX3VzZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVmcmVzaFRva2VuID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2VjZGhYcHJ2ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSByZWZyZXNoIHRva2VuIHRvIGdldCBuZXcgYWNjZXNzIHRva2VuLlxuICAgKiBJZiB0aGUgcmVmcmVzaCB0b2tlbiBpcyBudWxsL2RlZmluZWQsIHRoZW4gd2UgdXNlIHRoZSBzdG9yZWQgdG9rZW4gZnJvbSBhdXRoXG4gICAqL1xuICBhc3luYyByZWZyZXNoVG9rZW4ocGFyYW1zOiB7IHJlZnJlc2hUb2tlbj86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3JlZnJlc2hUb2tlbiddKTtcblxuICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IHBhcmFtcy5yZWZyZXNoVG9rZW4gfHwgdGhpcy5fcmVmcmVzaFRva2VuO1xuXG4gICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIHJlZnJlc2ggdG9rZW4gb3IgaGF2ZSBhdXRoZW50aWNhdGVkIHdpdGggT2F1dGggYmVmb3JlJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9jbGllbnRJZCB8fCAhdGhpcy5fY2xpZW50U2VjcmV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgY2xpZW50IGlkIGFuZCBzZWNyZXQgc2V0IGZpcnN0IHRvIHVzZSB0aGlzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMucG9zdCh0aGlzLl9iYXNlVXJsICsgJy9vYXV0aC90b2tlbicpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuX2NsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLl9jbGllbnRTZWNyZXQsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICAgIHRoaXMuX3Rva2VuID0gYm9keS5hY2Nlc3NfdG9rZW47XG4gICAgdGhpcy5fcmVmcmVzaFRva2VuID0gYm9keS5yZWZyZXNoX3Rva2VuO1xuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIGxpc3RBY2Nlc3NUb2tlbnNcbiAgICogR2V0IGluZm9ybWF0aW9uIG9uIGFsbCBvZiB0aGUgQml0R28gYWNjZXNzIHRva2VucyBvbiB0aGUgdXNlclxuICAgKiBAcmV0dXJuIHtcbiAgICogIGlkOiA8aWQgb2YgdGhlIHRva2VuPlxuICAgKiAgbGFiZWw6IDx0aGUgdXNlci1wcm92aWRlZCBsYWJlbCBmb3IgdGhpcyB0b2tlbj5cbiAgICogIHVzZXI6IDxpZCBvZiB0aGUgdXNlciBvbiB0aGUgdG9rZW4+XG4gICAqICBlbnRlcnByaXNlIDxpZCBvZiB0aGUgZW50ZXJwcmlzZSB0aGlzIHRva2VuIGlzIHZhbGlkIGZvcj5cbiAgICogIGNsaWVudDogPHRoZSBhdXRoIGNsaWVudCB0aGF0IHRoaXMgdG9rZW4gYmVsb25ncyB0bz5cbiAgICogIHNjb3BlOiA8bGlzdCBvZiBhbGxvd2VkIE9BdXRoIHNjb3BlIHZhbHVlcz5cbiAgICogIGNyZWF0ZWQ6IDxkYXRlIHRoZSB0b2tlbiB3YXMgY3JlYXRlZD5cbiAgICogIGV4cGlyZXM6IDxkYXRlIHRoZSB0b2tlbiB3aWxsIGV4cGlyZT5cbiAgICogIG9yaWdpbjogPHRoZSBvcmlnaW4gZm9yIHdoaWNoIHRoaXMgdG9rZW4gaXMgdmFsaWQ+XG4gICAqICBpc0V4dGVuc2libGU6IDxmbGFnIGluZGljYXRpbmcgaWYgdGhlIHRva2VuIGNhbiBiZSBleHRlbmRlZD5cbiAgICogIGV4dGVuc2lvbkFkZHJlc3M6IDxhZGRyZXNzIHdob3NlIHByaXZhdGUga2V5J3Mgc2lnbmF0dXJlIGlzIG5lY2Vzc2FyeSBmb3IgZXh0ZW5zaW9ucz5cbiAgICogIHVubG9jazogPGluZm8gZm9yIGFjdGlvbnMgdGhhdCByZXF1aXJlIGFuIHVubG9jayBiZWZvcmUgZmlyaW5nPlxuICAgKiB9XG4gICAqL1xuICBhc3luYyBsaXN0QWNjZXNzVG9rZW5zKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9hY2Nlc3N0b2tlbicpKS5zZW5kKCkucmVzdWx0KCdhY2Nlc3NUb2tlbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGRBY2Nlc3NUb2tlblxuICAgKiBBZGQgYSBCaXRHbyBBUEkgQWNjZXNzIFRva2VuIHRvIHRoZSBjdXJyZW50IHVzZXIgYWNjb3VudFxuICAgKiBAcGFyYW0gcGFyYW1zIHtcbiAgICogICAgb3RwOiAocmVxdWlyZWQpIDx2YWxpZCBvdHAgY29kZT5cbiAgICogICAgbGFiZWw6IChyZXF1aXJlZCkgPGxhYmVsIGZvciB0aGUgdG9rZW4+XG4gICAqICAgIGR1cmF0aW9uOiA8bGVuZ3RoIG9mIHRpbWUgaW4gc2Vjb25kcyB0aGUgdG9rZW4gd2lsbCBiZSB2YWxpZCBmb3I+XG4gICAqICAgIGlwUmVzdHJpY3Q6IDxhcnJheSBvZiBJUCBhZGRyZXNzIHN0cmluZ3MgdG8gd2hpdGVsaXN0PlxuICAgKiAgICB0eFZhbHVlTGltaXQ6IDxudW1iZXIgb2Ygb3V0Z29pbmcgc2F0b3NoaXMgYWxsb3dlZCBvbiB0aGlzIHRva2VuPlxuICAgKiAgICBzY29wZTogKHJlcXVpcmVkKSA8YXV0aG9yaXphdGlvbiBzY29wZSBvZiB0aGUgcmVxdWVzdGVkIHRva2VuPlxuICAgKiB9XG4gICAqIEByZXR1cm4ge1xuICAgKiAgICBpZDogPGlkIG9mIHRoZSB0b2tlbj5cbiAgICogICAgdG9rZW46IDxhY2Nlc3MgdG9rZW4gaGV4IHN0cmluZyB0byBiZSB1c2VkIGZvciBCaXRHbyBBUEkgcmVxdWVzdCB2ZXJpZmljYXRpb24+XG4gICAqICAgIGxhYmVsOiA8dXNlci1wcm92aWRlZCBsYWJlbCBmb3IgdGhpcyB0b2tlbj5cbiAgICogICAgdXNlcjogPGlkIG9mIHRoZSB1c2VyIG9uIHRoZSB0b2tlbj5cbiAgICogICAgZW50ZXJwcmlzZSA8aWQgb2YgdGhlIGVudGVycHJpc2UgdGhpcyB0b2tlbiBpcyB2YWxpZCBmb3I+XG4gICAqICAgIGNsaWVudDogPHRoZSBhdXRoIGNsaWVudCB0aGF0IHRoaXMgdG9rZW4gYmVsb25ncyB0bz5cbiAgICogICAgc2NvcGU6IDxsaXN0IG9mIGFsbG93ZWQgT0F1dGggc2NvcGUgdmFsdWVzPlxuICAgKiAgICBjcmVhdGVkOiA8ZGF0ZSB0aGUgdG9rZW4gd2FzIGNyZWF0ZWQ+XG4gICAqICAgIGV4cGlyZXM6IDxkYXRlIHRoZSB0b2tlbiB3aWxsIGV4cGlyZT5cbiAgICogICAgb3JpZ2luOiA8dGhlIG9yaWdpbiBmb3Igd2hpY2ggdGhpcyB0b2tlbiBpcyB2YWxpZD5cbiAgICogICAgaXNFeHRlbnNpYmxlOiA8ZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSB0b2tlbiBjYW4gYmUgZXh0ZW5kZWQ+XG4gICAqICAgIGV4dGVuc2lvbkFkZHJlc3M6IDxhZGRyZXNzIHdob3NlIHByaXZhdGUga2V5J3Mgc2lnbmF0dXJlIGlzIG5lY2Vzc2FyeSBmb3IgZXh0ZW5zaW9ucz5cbiAgICogICAgdW5sb2NrOiA8aW5mbyBmb3IgYWN0aW9ucyB0aGF0IHJlcXVpcmUgYW4gdW5sb2NrIGJlZm9yZSBmaXJpbmc+XG4gICAqIH1cbiAgICovXG4gIGFzeW5jIGFkZEFjY2Vzc1Rva2VuKHBhcmFtczogQWRkQWNjZXNzVG9rZW5PcHRpb25zKTogUHJvbWlzZTxBZGRBY2Nlc3NUb2tlblJlc3BvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMubGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGxhYmVsJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIG5vbi1zdHJpbmcgcGFyYW1zXG4gICAgICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuZHVyYXRpb24pIHx8IHBhcmFtcy5kdXJhdGlvbiA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2R1cmF0aW9uIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuaXBSZXN0cmljdCkge1xuICAgICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuaXBSZXN0cmljdCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lwUmVzdHJpY3QgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIF8uZm9yRWFjaChwYXJhbXMuaXBSZXN0cmljdCwgKGlwQWRkcikgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhpcEFkZHIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lwUmVzdHJpY3QgbXVzdCBiZSBhbiBhcnJheSBvZiBJUCBhZGRyZXNzIHN0cmluZ3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eFZhbHVlTGltaXQpIHtcbiAgICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy50eFZhbHVlTGltaXQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFZhbHVlTGltaXQgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbXMudHhWYWx1ZUxpbWl0IDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndHhWYWx1ZUxpbWl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuc2NvcGUgJiYgcGFyYW1zLnNjb3BlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLnNjb3BlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2NvcGUgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3BlY2lmeSBzY29wZSBmb3IgdG9rZW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aFVybCA9IHRoaXMubWljcm9zZXJ2aWNlc1VybCgnL2FwaS9hdXRoL3YxL2FjY2Vzc3Rva2VuJyk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wb3N0KGF1dGhVcmwpO1xuXG4gICAgICBpZiAoIXRoaXMuX2VjZGhYcHJ2KSB7XG4gICAgICAgIC8vIHdpdGhvdXQgYSBwcml2YXRlIGtleSwgdGhlIHVzZXIgY2Fubm90IGRlY3J5cHQgdGhlIG5ldyBhY2Nlc3MgdG9rZW4gdGhlIHNlcnZlciB3aWxsIHNlbmRcbiAgICAgICAgcmVxdWVzdC5mb3JjZVYxQXV0aCA9IHRydWU7XG4gICAgICAgIGRlYnVnKCdmb3JjaW5nIHYxIGF1dGggZm9yIGFkZGluZyBhY2Nlc3MgdG9rZW4gdXNpbmcgdG9rZW4gJXMnLCB0aGlzLl90b2tlbj8uc3Vic3RyKDAsIDgpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0LnNlbmQocGFyYW1zKTtcbiAgICAgIGlmIChyZXF1ZXN0LmZvcmNlVjFBdXRoKSB7XG4gICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmJvZHkud2FybmluZyA9ICdBIHByb3RvY29sIGRvd25ncmFkZSBoYXMgb2NjdXJyZWQgYmVjYXVzZSB0aGlzIGlzIGEgbGVnYWN5IGFjY291bnQuJztcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3BvbnNlUmVzdWx0PEFkZEFjY2Vzc1Rva2VuUmVzcG9uc2U+KCkocmVzcG9uc2UpO1xuICAgICAgfVxuXG4gICAgICAvLyB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgYmVmb3JlIHByb2NlZWRpbmcgYW55IGZ1cnRoZXJcbiAgICAgIHZlcmlmeVJlc3BvbnNlKHRoaXMsIHRoaXMuX3Rva2VuLCAncG9zdCcsIHJlcXVlc3QsIHJlc3BvbnNlKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2VEZXRhaWxzID0gdGhpcy5oYW5kbGVUb2tlbklzc3VhbmNlKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgcmVzcG9uc2UuYm9keS50b2tlbiA9IHJlc3BvbnNlRGV0YWlscy50b2tlbjtcblxuICAgICAgcmV0dXJuIGhhbmRsZVJlc3BvbnNlUmVzdWx0PEFkZEFjY2Vzc1Rva2VuUmVzcG9uc2U+KCkocmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhhbmRsZVJlc3BvbnNlRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGV4cGlyZSB0aW1lIG9mIGFuIGFjY2VzcyB0b2tlbiBtYXRjaGluZyBlaXRoZXIgdGhlIGlkIG9yIGxhYmVsIHRvIHRoZSBjdXJyZW50IGRhdGUsIGVmZmVjdGl2ZWx5IGRlbGV0aW5nIGl0XG4gICAqXG4gICAqIFBhcmFtczpcbiAgICogaWQ6IDxpZCBvZiB0aGUgYWNjZXNzIHRva2VuIHRvIGJlIGRlbGV0ZWQ+XG4gICAqIGxhYmVsOiA8bGFiZWwgb2YgdGhlIGFjY2VzcyB0b2tlbiB0byBiZSBkZWxldGVkPlxuICAgKlxuICAgKiBSZXR1cm5zOlxuICAgKiBpZDogPGlkIG9mIHRoZSB0b2tlbj5cbiAgICogbGFiZWw6IDx1c2VyLXByb3ZpZGVkIGxhYmVsIGZvciB0aGlzIHRva2VuPlxuICAgKiB1c2VyOiA8aWQgb2YgdGhlIHVzZXIgb24gdGhlIHRva2VuPlxuICAgKiBlbnRlcnByaXNlIDxpZCBvZiB0aGUgZW50ZXJwcmlzZSB0aGlzIHRva2VuIGlzIHZhbGlkIGZvcj5cbiAgICogY2xpZW50OiA8dGhlIGF1dGggY2xpZW50IHRoYXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvPlxuICAgKiBzY29wZTogPGxpc3Qgb2YgYWxsb3dlZCBPQXV0aCBzY29wZSB2YWx1ZXM+XG4gICAqIGNyZWF0ZWQ6IDxkYXRlIHRoZSB0b2tlbiB3YXMgY3JlYXRlZD5cbiAgICogZXhwaXJlczogPGRhdGUgdGhlIHRva2VuIHdpbGwgZXhwaXJlPlxuICAgKiBvcmlnaW46IDx0aGUgb3JpZ2luIGZvciB3aGljaCB0aGlzIHRva2VuIGlzIHZhbGlkPlxuICAgKiBpc0V4dGVuc2libGU6IDxmbGFnIGluZGljYXRpbmcgaWYgdGhlIHRva2VuIGNhbiBiZSBleHRlbmRlZD5cbiAgICogZXh0ZW5zaW9uQWRkcmVzczogPGFkZHJlc3Mgd2hvc2UgcHJpdmF0ZSBrZXkncyBzaWduYXR1cmUgaXMgbmUqY2Vzc2FyeSBmb3IgZXh0ZW5zaW9ucz5cbiAgICogdW5sb2NrOiA8aW5mbyBmb3IgYWN0aW9ucyB0aGF0IHJlcXVpcmUgYW4gdW5sb2NrIGJlZm9yZSBmaXJpbmc+XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlbW92ZUFjY2Vzc1Rva2VuKHsgaWQsIGxhYmVsIH06IFJlbW92ZUFjY2Vzc1Rva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCghaWQgJiYgIWxhYmVsKSB8fCAoaWQgJiYgbGFiZWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBleGFjdGx5IG9uZSBvZiBpZCBvciBsYWJlbCcpO1xuICAgIH1cbiAgICBpZiAoaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlbCh0aGlzLnVybChgL3VzZXIvYWNjZXNzdG9rZW4vJHtpZH1gKSlcbiAgICAgICAgLnNlbmQoKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gYXdhaXQgdGhpcy5saXN0QWNjZXNzVG9rZW5zKCk7XG5cbiAgICBpZiAoIXRva2Vucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b2tlbiB3aXRoIHRoaXMgbGFiZWwgZG9lcyBub3QgZXhpc3QnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaGluZ1Rva2VucyA9IF8uZmlsdGVyKHRva2VucywgeyBsYWJlbCB9KTtcbiAgICBpZiAobWF0Y2hpbmdUb2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbWJpZ3VvdXMgY2FsbDogbXVsdGlwbGUgdG9rZW5zIG1hdGNoaW5nIHRoaXMgbGFiZWwnKTtcbiAgICB9XG4gICAgaWYgKG1hdGNoaW5nVG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b2tlbiB3aXRoIHRoaXMgbGFiZWwgZG9lcyBub3QgZXhpc3QnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWwodGhpcy51cmwoYC91c2VyL2FjY2Vzc3Rva2VuLyR7bWF0Y2hpbmdUb2tlbnNbMF0uaWR9YCkpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSByYW5kb20gcGFzc3dvcmRcbiAgICogQHBhcmFtICAge051bWJlcn0gbnVtV29yZHMgICAgIE51bWJlciBvZiAzMi1iaXQgd29yZHNcbiAgICogQHJldHVybnMge1N0cmluZ30gICAgICAgICAgYmFzZTU4IHJhbmRvbSBwYXNzd29yZFxuICAgKi9cbiAgZ2VuZXJhdGVSYW5kb21QYXNzd29yZChudW1Xb3JkcyA9IDUpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKG51bVdvcmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgb2YgQml0R29cbiAgICovXG4gIGFzeW5jIGxvZ291dCgpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9sb2dvdXQnKSkucmVzdWx0KCk7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdXNlciBieSBJRCAobmFtZS9lbWFpbCBvbmx5KVxuICAgKiBAcGFyYW0gaWRcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFVzZXIoeyBpZCB9OiBHZXRVc2VyT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKGlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgaWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKGAvdXNlci8ke2lkfWApKS5yZXN1bHQoJ3VzZXInKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGxvZ2dlZCBpbiB1c2VyXG4gICAqL1xuICBhc3luYyBtZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldFVzZXIoeyBpZDogJ21lJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvY2sgdGhlIHNlc3Npb24gYnkgcHJvdmlkaW5nIE9UUFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3RwIFJlcXVpcmVkIE9UUCBjb2RlIGZvciB0aGUgYWNjb3VudC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIERlc2lyZWQgZHVyYXRpb24gb2YgdGhlIHVubG9jayBpbiBzZWNvbmRzIChkZWZhdWx0PTYwMCwgbWF4PTM2MDApLlxuICAgKi9cbiAgYXN5bmMgdW5sb2NrKHsgb3RwLCBkdXJhdGlvbiB9OiBVbmxvY2tPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAob3RwICYmICFfLmlzU3RyaW5nKG90cCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIG9yIHVuZGVmaW5lZCBvdHAnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvdW5sb2NrJykpLnNlbmQoeyBvdHAsIGR1cmF0aW9uIH0pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2sgdGhlIHNlc3Npb25cbiAgICovXG4gIGFzeW5jIGxvY2soKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci9sb2NrJykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAqL1xuICBhc3luYyBzZXNzaW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9zZXNzaW9uJykpLnJlc3VsdCgnc2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYSBwdXNoL3NtcyBmb3IgdGhlIE9UUCBjb2RlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmZvcmNlU01TIElmIHNldCB0byB0cnVlLCB3aWxsIHVzZSBTTVMgdG8gc2VuZCB0aGUgT1RQIHRvIHRoZSB1c2VyIGV2ZW4gaWYgdGhleSBoYXZlIG90aGVyIDJGQSBtZXRob2Qgc2V0IHVwLlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgc2VuZE9UUChwYXJhbXM6IHsgZm9yY2VTTVM/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvc2VuZG90cCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHRva2VuLCBwcm92aWRlZCB0aGUgY3VycmVudCB0b2tlbiBpcyBleHRlbmRhYmxlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBkdXJhdGlvbjogZHVyYXRpb24gaW4gc2Vjb25kcyBieSB3aGljaCB0byBleHRlbmQgdGhlIHRva2VuLCBzdGFydGluZyBhdCB0aGUgY3VycmVudCB0aW1lXG4gICAqL1xuICBhc3luYyBleHRlbmRUb2tlbihwYXJhbXM6IEV4dGVuZFRva2VuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuX2V4dGVuc2lvbktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IF9leHRlbnNpb25LZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGR1cmF0aW9uID0gcGFyYW1zLmR1cmF0aW9uO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aW1lc3RhbXAgKyAnfCcgKyB0aGlzLl90b2tlbiArICd8JyArIGR1cmF0aW9uO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSB0aGlzLl9leHRlbnNpb25LZXkucHJpdmF0ZUtleTtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gcHJpdmF0ZUtleSBvbiBleHRlbnNpb25LZXknKTtcbiAgICB9XG4gICAgY29uc3QgaXNDb21wcmVzc2VkID0gdGhpcy5fZXh0ZW5zaW9uS2V5LmNvbXByZXNzZWQ7XG4gICAgY29uc3QgcHJlZml4ID0gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLm1lc3NhZ2VQcmVmaXg7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYml0Y29pbk1lc3NhZ2Uuc2lnbihtZXNzYWdlLCBwcml2YXRlS2V5LCBpc0NvbXByZXNzZWQsIHByZWZpeCkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvZXh0ZW5kdG9rZW4nKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5zZXQoJ3RpbWVzdGFtcCcsIHRpbWVzdGFtcC50b1N0cmluZygpKVxuICAgICAgLnNldCgnc2lnbmF0dXJlJywgc2lnbmF0dXJlKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleSBmb3Igc2hhcmluZyBhIHdhbGxldCB3aXRoIGEgdXNlclxuICAgKiBAcGFyYW0gZW1haWwgZW1haWwgb2YgdXNlciB0byBzaGFyZSB3YWxsZXQgd2l0aFxuICAgKi9cbiAgYXN5bmMgZ2V0U2hhcmluZ0tleSh7IGVtYWlsIH06IEdldFNoYXJpbmdLZXlPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcoZW1haWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBlbWFpbCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL3NoYXJpbmdrZXknKSkuc2VuZCh7IGVtYWlsIH0pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXJzIHRoYXQgd2FudCB0byBzaWduIHdpdGggYSBrZXkgd2lsbCB1c2UgdGhpcyBhcGkgdG8gZmV0Y2ggdGhlIGtleWNoYWluIGFuZCB0aGUgcGF0aC5cbiAgICogVXNlcnMgdGhhdCB3YW50IHRvIHZlcmlmeSBhIHNpZ25hdHVyZSB3aWxsIHVzZSB0aGlzIGFwaSB0byBmZXRjaCBhbm90aGVyIHVzZXJzIGVjZGggcHVia2V5LlxuICAgKiBOb3RlOiBJZiB0aGUgdXNlciBpZCBpcyBub3QgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byBnZXR0aW5nIHRoZSBjdXJyZW50IHVzZXIncyBrZXljaGFpbi5cbiAgICogQHBhcmFtIGJpdGdvXG4gICAqIEBwYXJhbSBlbnRlcnByaXNlSWRcbiAgICogQHBhcmFtIHVzZXJJZFxuICAgKi9cbiAgYXN5bmMgZ2V0U2lnbmluZ0tleUZvclVzZXIoZW50ZXJwcmlzZUlkOiBzdHJpbmcsIHVzZXJJZD86IHN0cmluZyk6IFByb21pc2U8R2V0U2lnbmluZ0tleUFwaT4ge1xuICAgIGNvbnN0IHVzZXIgPSB1c2VySWQgPz8gJ21lJztcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoYC9lbnRlcnByaXNlLyR7ZW50ZXJwcmlzZUlkfS91c2VyLyR7dXNlcn0vc2lnbmluZ2tleWAsIDIpKVxuICAgICAgLnF1ZXJ5KHt9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBnZXRWYWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGU7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIHNldFZhbGlkYXRlKHZhbGlkYXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbih2YWxpZGF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgIH1cbiAgICB0aGlzLl92YWxpZGF0ZSA9IHZhbGlkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbmV3IGNvaW4gaW5zdGFuY2Ugd2l0aCBpdHMgYnVpbGRlciBmYWN0b3J5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIGNvaW4gbmFtZSBhcyBpdCB3YXMgcmVnaXN0ZXJlZCBpbiBAYml0Z28tYmV0YS9zdGF0aWNzXG4gICAqIEBwYXJhbSB7Q29pbkNvbnN0cnVjdG9yfSBjb2luIHRoZSBidWlsZGVyIGZhY3RvcnkgY2xhc3MgZm9yIHRoYXQgY29pblxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlcihuYW1lOiBzdHJpbmcsIGNvaW46IENvaW5Db25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgIEdsb2JhbENvaW5GYWN0b3J5LnJlZ2lzdGVyKG5hbWUsIGNvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBiaXRjb2luIG1hcmtldCBkYXRhXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBtYXJrZXRzKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9tYXJrZXRzKSB7XG4gICAgICB0aGlzLl9tYXJrZXRzID0gbmV3IE1hcmtldHModGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tYXJrZXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGF0ZXN0IGJpdGNvaW4gcHJpY2VzXG4gICAqIChEZXByZWNhdGVkOiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSkgdXNlIGBiaXRnby5tYXJrZXRzKCkubGF0ZXN0KClgXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICAvLyBjYi1jb21wYXRcbiAgYXN5bmMgbWFya2V0KCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvbWFya2V0L2xhdGVzdCcpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWFya2V0IGRhdGEgZnJvbSB5ZXN0ZXJkYXlcbiAgICogKERlcHJlY2F0ZWQ6IFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlKSB1c2UgYml0Z28ubWFya2V0cygpLnllc3RlcmRheSgpXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyB5ZXN0ZXJkYXkoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy9tYXJrZXQveWVzdGVyZGF5JykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYmxvY2tjaGFpbiBvYmplY3QuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBibG9ja2NoYWluKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9ibG9ja2NoYWluKSB7XG4gICAgICB0aGlzLl9ibG9ja2NoYWluID0gbmV3IEJsb2NrY2hhaW4odGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ibG9ja2NoYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlcidzIGtleWNoYWlucyBvYmplY3QuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBrZXljaGFpbnMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX2tleWNoYWlucykge1xuICAgICAgdGhpcy5fa2V5Y2hhaW5zID0gbmV3IEtleWNoYWlucyh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2tleWNoYWlucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRyYXZlbCBydWxlIG9iamVjdFxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgdHJhdmVsUnVsZSgpOiBhbnkge1xuICAgIGlmICghdGhpcy5fdHJhdmVsUnVsZSkge1xuICAgICAgdGhpcy5fdHJhdmVsUnVsZSA9IG5ldyBUcmF2ZWxSdWxlKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdHJhdmVsUnVsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIncyB3YWxsZXRzIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHdhbGxldHMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX3dhbGxldHMpIHtcbiAgICAgIHRoaXMuX3dhbGxldHMgPSBuZXcgV2FsbGV0cyh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlbmRpbmcgYXBwcm92YWxzIHRoYXQgY2FuIGJlIGFwcHJvdmVkLyBvciByZWplY3RlZFxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBhbnkge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ0FwcHJvdmFscykge1xuICAgICAgdGhpcy5fcGVuZGluZ0FwcHJvdmFscyA9IG5ldyBQZW5kaW5nQXBwcm92YWxzKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0FwcHJvdmFscztcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBXYWxsZXQgb2JqZWN0LCBpbml0aWFsaXplZCB3aXRoIHRoZSB3YWxsZXQgcGFyYW1zXG4gICAqIENhbiBiZSB1c2VkIHRvIHJlY29uc3RpdHV0ZSBhIHdhbGxldCBmcm9tIGNhY2hlZCBkYXRhXG4gICAqIEBwYXJhbSB3YWxsZXRQYXJhbXNcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIG5ld1dhbGxldE9iamVjdCh3YWxsZXRQYXJhbXMpOiBhbnkge1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMsIHdhbGxldFBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogVjEgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBtaW5lciBmZWUgYW1vdW50cywgZ2l2ZW4gdGhlIG51bWJlciBhbmRcbiAgICogdHlwZSBvZiB0cmFuc2FjdGlvbiBpbnB1dHMsIGFsb25nIHdpdGggYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcyBwZXIgdmtCLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG5ldyBjb2RlLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGFzeW5jIGNhbGN1bGF0ZU1pbmVyRmVlSW5mbyhwYXJhbXM6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uQnVpbGRlci5jYWxjdWxhdGVNaW5lckZlZUluZm8ocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgYSBCaXRjb2luIGFkZHJlc3MgaXMgYSB2YWxpZCBiYXNlNTggYWRkcmVzc1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgdmVyaWZ5QWRkcmVzcyhwYXJhbXM6IERlcHJlY2F0ZWRWZXJpZnlBZGRyZXNzT3B0aW9ucyA9IHt9KTogYm9vbGVhbiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdKTtcblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ldHdvcmtOYW1lID0gY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmdldEVudigpXS5uZXR3b3JrO1xuICAgIGNvbnN0IG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzW25ldHdvcmtOYW1lXTtcblxuICAgIGxldCBhZGRyZXNzO1xuICAgIHRyeSB7XG4gICAgICBhZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21CYXNlNThDaGVjayhwYXJhbXMuYWRkcmVzcywgbmV0d29yayk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRyZXNzLnZlcnNpb24gPT09IG5ldHdvcmsucHViS2V5SGFzaCB8fCBhZGRyZXNzLnZlcnNpb24gPT09IG5ldHdvcmsuc2NyaXB0SGFzaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCBhIHNlY3JldCBpbnRvIHNoYXJkcyB1c2luZyBTaGFtaXIgU2VjcmV0IFNoYXJpbmcuXG4gICAqIEBwYXJhbSBzZWVkIEEgaGV4YWRlY2ltYWwgc2VjcmV0IHRvIHNwbGl0XG4gICAqIEBwYXJhbSBwYXNzd29yZHMgQW4gYXJyYXkgb2YgdGhlIHBhc3N3b3JkcyB1c2VkIHRvIGVuY3J5cHQgZWFjaCBzaGFyZVxuICAgKiBAcGFyYW0gbSBUaGUgdGhyZXNob2xkIG51bWJlciBvZiBzaGFyZHMgbmVjZXNzYXJ5IHRvIHJlY29uc3RpdHV0ZSB0aGUgc2VjcmV0XG4gICAqL1xuICBzcGxpdFNlY3JldCh7IHNlZWQsIHBhc3N3b3JkcywgbSB9OiBTcGxpdFNlY3JldE9wdGlvbnMpOiBTcGxpdFNlY3JldCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhc3N3b3JkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3dvcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzSW50ZWdlcihtKSB8fCBtIDwgMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAyJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhc3N3b3Jkcy5sZW5ndGggPCBtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3N3b3JkcyBhcnJheSBsZW5ndGggY2Fubm90IGJlIGxlc3MgdGhhbiBtJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbiA9IHBhc3N3b3Jkcy5sZW5ndGg7XG4gICAgY29uc3Qgc2VjcmV0czogc3RyaW5nW10gPSBzaGFtaXIuc2hhcmUoc2VlZCwgbiwgbSk7XG4gICAgY29uc3Qgc2hhcmRzID0gXy56aXBXaXRoKHNlY3JldHMsIHBhc3N3b3JkcywgKHNoYXJkLCBwYXNzd29yZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdCh7IGlucHV0OiBzaGFyZCwgcGFzc3dvcmQgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgbm9kZSA9IGJpcDMyLmZyb21TZWVkKEJ1ZmZlci5mcm9tKHNlZWQsICdoZXgnKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHhwdWI6IG5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgbSxcbiAgICAgIG4sXG4gICAgICBzZWVkU2hhcmVzOiBzaGFyZHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbnN0aXR1dGUgYSBzZWNyZXQgd2hpY2ggd2FzIHNoYXJkZWQgd2l0aCBgc3BsaXRTZWNyZXRgLlxuICAgKiBAcGFyYW0gc2hhcmRzXG4gICAqIEBwYXJhbSBwYXNzd29yZHNcbiAgICovXG4gIHJlY29uc3RpdHV0ZVNlY3JldCh7IHNoYXJkcywgcGFzc3dvcmRzIH06IFJlY29uc3RpdHV0ZVNlY3JldE9wdGlvbnMpOiBSZWNvbnN0aXR1dGVkU2VjcmV0IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2hhcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFzc3dvcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzd29yZHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChzaGFyZHMubGVuZ3RoICE9PSBwYXNzd29yZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoYXJkcyBhbmQgcGFzc3dvcmRzIGFycmF5cyBtdXN0IGhhdmUgc2FtZSBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNyZXRzID0gXy56aXBXaXRoKHNoYXJkcywgcGFzc3dvcmRzLCAoc2hhcmQsIHBhc3N3b3JkKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kZWNyeXB0KHsgaW5wdXQ6IHNoYXJkLCBwYXNzd29yZCB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBzZWVkOiBzdHJpbmcgPSBzaGFtaXIuY29tYmluZShzZWNyZXRzKTtcbiAgICBjb25zdCBub2RlID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpKTtcbiAgICByZXR1cm4ge1xuICAgICAgeHB1Yjogbm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgYXMgc3RyaW5nLFxuICAgICAgeHBydjogbm9kZS50b0Jhc2U1OCgpIGFzIHN0cmluZyxcbiAgICAgIHNlZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gc2hhcmRzXG4gICAqIEBwYXJhbSBwYXNzd29yZHNcbiAgICogQHBhcmFtIG1cbiAgICogQHBhcmFtIHhwdWIgT3B0aW9uYWwgeHB1YiB0byB2ZXJpZnkgdGhlIHJlc3VsdHMgYWdhaW5zdFxuICAgKi9cbiAgdmVyaWZ5U2hhcmRzKHsgc2hhcmRzLCBwYXNzd29yZHMsIG0sIHhwdWIgfTogVmVyaWZ5U2hhcmRzT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgYSBnaXZlbiBhcnJheSdzIHZhbHVlcyBnaXZlbiBzdWJzZXQgc2l6ZSBtXG4gICAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB3aG9zZSB2YWx1ZXMgYXJlIHRvIGJlIGFycmFuZ2VkIGluIGFsbCBjb21iaW5hdGlvbnNcbiAgICAgKiBAcGFyYW0gbSBUaGUgc2l6ZSBvZiBlYWNoIHN1YnNldFxuICAgICAqIEBwYXJhbSBlbnRyeUluZGljZXMgUmVjdXJzaXZlbHkgdHJhaWxpbmcgc2V0IG9mIGN1cnJlbnRseSBjaG9zZW4gYXJyYXkgaW5kaWNlcyBmb3IgdGhlIGNvbWJpbmF0aW9uIHN1YnNldCB1bmRlciBjb25zdHJ1Y3Rpb25cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVDb21iaW5hdGlvbnMgPSAoYXJyYXk6IHN0cmluZ1tdLCBtOiBudW1iZXIsIGVudHJ5SW5kaWNlczogbnVtYmVyW10gPSBbXSk6IHN0cmluZ1tdW10gPT4ge1xuICAgICAgbGV0IGNvbWJpbmF0aW9uczogc3RyaW5nW11bXSA9IFtdO1xuXG4gICAgICBpZiAoZW50cnlJbmRpY2VzLmxlbmd0aCA9PT0gbSkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q29tYmluYXRpb24gPSBfLmF0KGFycmF5LCBlbnRyeUluZGljZXMpO1xuICAgICAgICByZXR1cm4gW2N1cnJlbnRDb21iaW5hdGlvbl07XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBoaWdoZXN0IGluZGV4XG4gICAgICBsZXQgZW50cnlJbmRleCA9IF8ubGFzdChlbnRyeUluZGljZXMpO1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBpbmRpY2VzLCBhc3N1bWUgLTFcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKGVudHJ5SW5kZXgpKSB7XG4gICAgICAgIGVudHJ5SW5kZXggPSAtMTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSBlbnRyeUluZGV4ICsgMTsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIGFwcGVuZCB0aGUgY3VycmVudCBpbmRleCB0byB0aGUgdHJhaWxpbmcgaW5kaWNlc1xuICAgICAgICBjb25zdCBjdXJyZW50RW50cnlJbmRpY2VzID0gWy4uLmVudHJ5SW5kaWNlcywgaV07XG4gICAgICAgIGNvbnN0IG5ld0NvbWJpbmF0aW9ucyA9IGdlbmVyYXRlQ29tYmluYXRpb25zKGFycmF5LCBtLCBjdXJyZW50RW50cnlJbmRpY2VzKTtcbiAgICAgICAgY29tYmluYXRpb25zID0gWy4uLmNvbWJpbmF0aW9ucywgLi4ubmV3Q29tYmluYXRpb25zXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbWJpbmF0aW9ucztcbiAgICB9O1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNoYXJkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hhcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhc3N3b3JkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3dvcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmRzLmxlbmd0aCAhPT0gcGFzc3dvcmRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZHMgYW5kIHBhc3N3b3JkcyBhcnJheXMgbXVzdCBoYXZlIHNhbWUgbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjcmV0cyA9IF8uemlwV2l0aChzaGFyZHMsIHBhc3N3b3JkcywgKHNoYXJkLCBwYXNzd29yZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdCh7IGlucHV0OiBzaGFyZCwgcGFzc3dvcmQgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2VjcmV0Q29tYmluYXRpb25zID0gZ2VuZXJhdGVDb21iaW5hdGlvbnMoc2VjcmV0cywgbSk7XG4gICAgY29uc3Qgc2VlZHMgPSBzZWNyZXRDb21iaW5hdGlvbnMubWFwKChjdXJyZW50Q29tYmluYXRpb24pID0+IHtcbiAgICAgIHJldHVybiBzaGFtaXIuY29tYmluZShjdXJyZW50Q29tYmluYXRpb24pO1xuICAgIH0pO1xuICAgIGNvbnN0IHVuaXF1ZVNlZWRzID0gXy51bmlxKHNlZWRzKTtcbiAgICBpZiAodW5pcXVlU2VlZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHNlZWQgPSBfLmZpcnN0KHVuaXF1ZVNlZWRzKTtcbiAgICBjb25zdCBub2RlID0gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oc2VlZCwgJ2hleCcpKTtcbiAgICBjb25zdCByZXN0b3JlZFhwdWIgPSBub2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh4cHViKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHhwdWIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigneHB1YiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdG9yZWRYcHViICE9PSB4cHViKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBgZ2V0U2hhcmVkU2VjcmV0KClgXG4gICAqL1xuICBnZXRFQ0RIU2VjcmV0KHsgb3RoZXJQdWJLZXlIZXgsIGVja2V5IH06IEdldEVjZGhTZWNyZXRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIV8uaXNTdHJpbmcob3RoZXJQdWJLZXlIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ290aGVyUHViS2V5SGV4IHN0cmluZyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNPYmplY3QoZWNrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vja2V5IG9iamVjdCByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKG90aGVyUHViS2V5SGV4LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyJ3MgcHJpdmF0ZSBFQ0RIIGtleWNoYWluXG4gICAqL1xuICBhc3luYyBnZXRFQ0RIS2V5Y2hhaW4oZWNkaEtleWNoYWluUHViPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIWVjZGhLZXljaGFpblB1Yikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL3NldHRpbmdzJykpLnJlc3VsdCgpO1xuICAgICAgaWYgKCFyZXN1bHQuc2V0dGluZ3MuZWNkaEtleWNoYWluKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ2VjZGgga2V5Y2hhaW4gbm90IGZvdW5kIGZvciB1c2VyJyk7XG4gICAgICB9XG4gICAgICBlY2RoS2V5Y2hhaW5QdWIgPSByZXN1bHQuc2V0dGluZ3MuZWNkaEtleWNoYWluO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5rZXljaGFpbnMoKS5nZXQoeyB4cHViOiBlY2RoS2V5Y2hhaW5QdWIgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdXNlciBkZXJpdmVkIHB1YmxpYyBhbmQgcHJpdmF0ZSBFQ0RIIGtleXBhaXJcbiAgICogQHBhcmFtIHBhc3N3b3JkIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHVzZXIncyBFQ0RIIGVuY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0gZW50SWQ/IG9wdGlvbmFsIGVudGVycHJpc2UgaWQgdG8gY2hlY2sgZm9yIHBlcm1pc3Npb25zXG4gICAqL1xuICBhc3luYyBnZXRFY2RoS2V5cGFpclByaXZhdGUocGFzc3dvcmQ6IHN0cmluZywgZW50SWQ6IHN0cmluZyk6IFByb21pc2U8RWNkaERlcml2ZWRLZXlwYWlyPiB7XG4gICAgY29uc3QgdXNlclNpZ25pbmdLZXkgPSBhd2FpdCB0aGlzLmdldFNpZ25pbmdLZXlGb3JVc2VyKGVudElkKTtcbiAgICBjb25zdCBwdWJrZXlPZkFkbWluRWNkaEtleUhleCA9IHVzZXJTaWduaW5nS2V5LmRlcml2ZWRQdWJrZXk7XG4gICAgaWYgKCF1c2VyU2lnbmluZ0tleS5lY2RoS2V5Y2hhaW4gfHwgIXVzZXJTaWduaW5nS2V5LmRlcml2YXRpb25QYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIHVzZXIga2V5Y2hhaW4uIFBsZWFzZSBjb250YWN0IHN1cHBvcnRAYml0Z28uY29tLicpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyRWNkaEtleWNoYWluID0gYXdhaXQgdGhpcy5nZXRFQ0RIS2V5Y2hhaW4odXNlclNpZ25pbmdLZXkuZWNkaEtleWNoYWluKTtcbiAgICBsZXQgeHBydjtcbiAgICB0cnkge1xuICAgICAgeHBydiA9IHRoaXMuZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHVzZXJFY2RoS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IHBhc3N3b3JkLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGVyaXZlZFB1YktleTogcHVia2V5T2ZBZG1pbkVjZGhLZXlIZXgsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogdXNlclNpZ25pbmdLZXkuZGVyaXZhdGlvblBhdGgsXG4gICAgICB4cHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIG9wZXJhdGluZ1N5c3RlbTogb25lIG9mIGlvcywgYW5kcm9pZFxuICAgKiAtIHB1c2hUb2tlbjogaGV4LWZvcm1hdHRlZCB0b2tlbiBmb3IgdGhlIHJlc3BlY3RpdmUgbmF0aXZlIHB1c2ggbm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyByZWdpc3RlclB1c2hUb2tlbihwYXJhbXM6IFJlZ2lzdGVyUHVzaFRva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsncHVzaFRva2VuJywgJ29wZXJhdGluZ1N5c3RlbSddLCBbXSk7XG5cbiAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAvLyB0aGlzIGRldmljZSBoYXMgdG8gYmUgcmVnaXN0ZXJlZCB0byBhbiBleHRlbnNpYmxlIHNlc3Npb25cbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGxvZ2dlZCBpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3B1c2hUb2tlbicsICdvcGVyYXRpbmdTeXN0ZW0nXSk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvZGV2aWNlcycpKS5zZW5kKHBvc3RQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBwdXNoVmVyaWZpY2F0aW9uVG9rZW46IHRoZSB0b2tlbiByZWNlaXZlZCB2aWEgcHVzaCBub3RpZmljYXRpb24gdG8gY29uZmlybSB0aGUgZGV2aWNlJ3MgbW9iaWxpdHlcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHZlcmlmeVB1c2hUb2tlbihwYXJhbXM6IFZlcmlmeVB1c2hUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIG9iamVjdCBwYXJhbXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnB1c2hWZXJpZmljYXRpb25Ub2tlbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHB1c2hWZXJpZmljYXRpb25Ub2tlbicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgIC8vIHRoaXMgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIHRvIGFuIGV4dGVuc2libGUgc2Vzc2lvblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgbG9nZ2VkIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsICdwdXNoVmVyaWZpY2F0aW9uVG9rZW4nKTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy9kZXZpY2VzL3ZlcmlmeScpKS5zZW5kKHBvc3RQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ2luIHRvIHRoZSBiaXRnbyBzeXN0ZW0gdXNpbmcgYW4gYXV0aGNvZGUgZ2VuZXJhdGVkIHZpYSBPYXV0aFxuICAgKi9cbiAgYXN5bmMgYXV0aGVudGljYXRlV2l0aEF1dGhDb2RlKHBhcmFtczogQXV0aGVudGljYXRlV2l0aEF1dGhDb2RlT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgb2JqZWN0IHBhcmFtcycpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuYXV0aENvZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBhdXRoQ29kZScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fY2xpZW50SWQgfHwgIXRoaXMuX2NsaWVudFNlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIGNsaWVudCBpZCBhbmQgc2VjcmV0IHNldCBmaXJzdCB0byB1c2UgdGhpcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGF1dGhDb2RlID0gcGFyYW1zLmF1dGhDb2RlO1xuXG4gICAgaWYgKHRoaXMuX3Rva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FscmVhZHkgbG9nZ2VkIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucG9zdCh0aGlzLl9iYXNlVXJsICsgJy9vYXV0aC90b2tlbicpO1xuICAgIHJlcXVlc3QuZm9yY2VWMUF1dGggPSB0cnVlOyAvLyBPQXV0aCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB2MSBhdXRoZW50aWNhdGlvblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXF1ZXN0XG4gICAgICAuc2VuZCh7XG4gICAgICAgIGdyYW50X3R5cGU6ICdhdXRob3JpemF0aW9uX2NvZGUnLFxuICAgICAgICBjb2RlOiBhdXRoQ29kZSxcbiAgICAgICAgY2xpZW50X2lkOiB0aGlzLl9jbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5fY2xpZW50U2VjcmV0LFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIHRoaXMuX3Rva2VuID0gYm9keS5hY2Nlc3NfdG9rZW47XG4gICAgdGhpcy5fcmVmcmVzaFRva2VuID0gYm9keS5yZWZyZXNoX3Rva2VuO1xuICAgIHRoaXMuX3VzZXIgPSBhd2FpdCB0aGlzLm1lKCk7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBwYXNzd29yZCBvZiB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyLlxuICAgKiBBbHNvIGNoYW5nZSBhbGwgdjEgYW5kIHYyIGtleWNoYWluIHBhc3N3b3JkcyBpZiB0aGV5IG1hdGNoIHRoZVxuICAgKiBnaXZlbiBvbGRQYXNzd29yZC4gUmV0dXJucyBub3RoaW5nIG9uIHN1Y2Nlc3MuXG4gICAqIEBwYXJhbSBvbGRQYXNzd29yZCB7U3RyaW5nfSAtIHRoZSBjdXJyZW50IHBhc3N3b3JkXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCB7U3RyaW5nfSAtIHRoZSBuZXcgcGFzc3dvcmRcbiAgICovXG4gIGFzeW5jIGNoYW5nZVBhc3N3b3JkKHsgb2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkIH06IENoYW5nZVBhc3N3b3JkT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKG9sZFBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgb2xkUGFzc3dvcmQnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcobmV3UGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBuZXdQYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoKTtcbiAgICBpZiAodHlwZW9mIHVzZXIgIT09ICdvYmplY3QnIHx8ICF1c2VyLnVzZXJuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgb2JqZWN0IHVzZXInKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uID0gYXdhaXQgdGhpcy52ZXJpZnlQYXNzd29yZCh7IHBhc3N3b3JkOiBvbGRQYXNzd29yZCB9KTtcbiAgICBpZiAoIXZhbGlkYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHByb3ZpZGVkIG9sZFBhc3N3b3JkIGlzIGluY29ycmVjdCcpO1xuICAgIH1cblxuICAgIC8vIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGNvaW4gd2UgY2hvb3NlIGJlY2F1c2UgdGhlIHYyIHVwZGF0ZVBhc3N3b3JkIGZ1bmN0aW9ucyB1cGRhdGVzIGFsbCB2MiBrZXljaGFpbnNcbiAgICAvLyB3ZSBqdXN0IG5lZWQgdG8gY2hvb3NlIGEgY29pbiB0aGF0IGV4aXN0cyBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudFxuICAgIGNvbnN0IGNvaW4gPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLm5ldHdvcmsgPT09ICdiaXRjb2luJyA/ICdidGMnIDogJ3RidGMnO1xuXG4gICAgY29uc3QgdXBkYXRlS2V5Y2hhaW5QYXNzd29yZFBhcmFtcyA9IHsgb2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkIH07XG4gICAgY29uc3QgdjFLZXljaGFpblVwZGF0ZVBXUmVzdWx0ID0gYXdhaXQgdGhpcy5rZXljaGFpbnMoKS51cGRhdGVQYXNzd29yZCh1cGRhdGVLZXljaGFpblBhc3N3b3JkUGFyYW1zKTtcbiAgICBjb25zdCB2MktleWNoYWlucyA9IGF3YWl0IHRoaXMuY29pbihjb2luKS5rZXljaGFpbnMoKS51cGRhdGVQYXNzd29yZCh1cGRhdGVLZXljaGFpblBhc3N3b3JkUGFyYW1zKTtcblxuICAgIGNvbnN0IHVwZGF0ZVBhc3N3b3JkUGFyYW1zID0ge1xuICAgICAga2V5Y2hhaW5zOiB2MUtleWNoYWluVXBkYXRlUFdSZXN1bHQua2V5Y2hhaW5zLFxuICAgICAgdjJfa2V5Y2hhaW5zOiB2MktleWNoYWlucyxcbiAgICAgIHZlcnNpb246IHYxS2V5Y2hhaW5VcGRhdGVQV1Jlc3VsdC52ZXJzaW9uLFxuICAgICAgb2xkUGFzc3dvcmQ6IHRoaXMuY2FsY3VsYXRlSE1BQyh1c2VyLnVzZXJuYW1lLCBvbGRQYXNzd29yZCksXG4gICAgICBwYXNzd29yZDogdGhpcy5jYWxjdWxhdGVITUFDKHVzZXIudXNlcm5hbWUsIG5ld1Bhc3N3b3JkKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvY2hhbmdlcGFzc3dvcmQnKSkuc2VuZCh1cGRhdGVQYXNzd29yZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgYWRkcmVzcyBsYWJlbHMgb24gYWxsIG9mIHRoZSB1c2VyJ3Mgd2FsbGV0c1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgbGFiZWxzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvbGFiZWxzJykpLnJlc3VsdCgnbGFiZWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVzIGFwcHJveGltYXRlIGZlZSBwZXIga2IgbmVlZGVkIGZvciBhIHR4IHRvIGdldCBpbnRvIGEgYmxvY2tcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy5udW1CbG9ja3MgdGFyZ2V0IGJsb2NrcyBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGJlIGNvbmZpcm1lZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLm1heEZlZSBtYXhpbXVtIGZlZSB3aWxsaW5nIHRvIGJlIHBhaWQgKGZvciBzYWZldHkpXG4gICAqIEBwYXJhbSB7YXJyYXlbc3RyaW5nXX0gcGFyYW1zLmlucHV0cyBsaXN0IG9mIHVuY29uZmlybWVkIHR4SWRzIGZyb20gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiB1c2VzIGlucHV0c1xuICAgKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLnR4U2l6ZSBlc3RpbWF0ZWQgdHJhbnNhY3Rpb24gc2l6ZSBpbiBieXRlcywgb3B0aW9uYWwgcGFyYW1ldGVyIHVzZWQgZm9yIENQRlAgZXN0aW1hdGlvbi5cbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuY3BmcEF3YXJlIGZsYWcgaW5kaWNhdGluZyBmZWUgc2hvdWxkIHRha2UgaW50byBhY2NvdW50IENQRlBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGVzdGltYXRlRmVlKHBhcmFtczogRXN0aW1hdGVGZWVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBhbnkgPSB7IHZlcnNpb246IDEyIH07XG4gICAgaWYgKHBhcmFtcy5udW1CbG9ja3MpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubnVtQmxvY2tzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLm51bUJsb2NrcyA9IHBhcmFtcy5udW1CbG9ja3M7XG4gICAgfVxuICAgIGlmIChwYXJhbXMubWF4RmVlKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLm1heEZlZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBxdWVyeVBhcmFtcy5tYXhGZWUgPSBwYXJhbXMubWF4RmVlO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmlucHV0cykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5pbnB1dHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuICAgICAgcXVlcnlQYXJhbXMuaW5wdXRzID0gcGFyYW1zLmlucHV0cztcbiAgICB9XG4gICAgaWYgKHBhcmFtcy50eFNpemUpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudHhTaXplKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLnR4U2l6ZSA9IHBhcmFtcy50eFNpemU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuY3BmcEF3YXJlKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5jcGZwQXdhcmUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuICAgICAgcXVlcnlQYXJhbXMuY3BmcEF3YXJlID0gcGFyYW1zLmNwZnBBd2FyZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy90eC9mZWUnKSkucXVlcnkocXVlcnlQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBCaXRHbydzIGd1YXJhbnRlZSB1c2luZyBhbiBpbnN0YW50IGlkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGluc3RhbnRHdWFyYW50ZWUocGFyYW1zOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGlkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHRoaXMuZ2V0KHRoaXMudXJsKCcvaW5zdGFudC8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gICAgaWYgKCFib2R5Lmd1YXJhbnRlZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBndWFyYW50ZWUgZm91bmQgaW4gcmVzcG9uc2UgYm9keScpO1xuICAgIH1cbiAgICBpZiAoIWJvZHkuc2lnbmF0dXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHNpZ25hdHVyZSBmb3VuZCBpbiBndWFyYW50ZWUgcmVzcG9uc2UgYm9keScpO1xuICAgIH1cbiAgICBjb25zdCBzaWduaW5nQWRkcmVzcyA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0uc2lnbmluZ0FkZHJlc3M7XG4gICAgY29uc3Qgc2lnbmF0dXJlQnVmZmVyID0gQnVmZmVyLmZyb20oYm9keS5zaWduYXR1cmUsICdoZXgnKTtcbiAgICBjb25zdCBwcmVmaXggPSB1dHhvbGliLm5ldHdvcmtzW2NvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0ubmV0d29ya10ubWVzc2FnZVByZWZpeDtcbiAgICBjb25zdCBpc1ZhbGlkU2lnbmF0dXJlID0gYml0Y29pbk1lc3NhZ2UudmVyaWZ5KGJvZHkuZ3VhcmFudGVlLCBzaWduaW5nQWRkcmVzcywgc2lnbmF0dXJlQnVmZmVyLCBwcmVmaXgpO1xuICAgIGlmICghaXNWYWxpZFNpZ25hdHVyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmNvcnJlY3Qgc2lnbmF0dXJlJyk7XG4gICAgfVxuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHRhcmdldCBhZGRyZXNzIGZvciBwYXltZW50IG9mIGEgQml0R28gZmVlXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRCaXRHb0ZlZUFkZHJlc3MoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvYmlsbGluZy9hZGRyZXNzJykpLnNlbmQoe30pLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gYWRkcmVzcyBvYmplY3QgKGluY2x1ZGluZyB0aGUgd2FsbGV0IGlkKSBmb3IgYSBnaXZlbiBhZGRyZXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gbG9vayB1cC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFdhbGxldEFkZHJlc3MoeyBhZGRyZXNzIH06IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybChgL3dhbGxldGFkZHJlc3MvJHthZGRyZXNzfWApKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBsaXN0IG9mIHVzZXIgd2ViaG9va3NcbiAgICpcbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBsaXN0V2ViaG9va3MoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy93ZWJob29rcycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbmV3IHVzZXIgd2ViaG9va1xuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IFdlYmhvb2tPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnVybCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHVybCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHR5cGUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB1c2VyIHdlYmhvb2tcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHJlbW92ZVdlYmhvb2socGFyYW1zOiBXZWJob29rT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy51cmwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB1cmwnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB0eXBlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGxpc3Qgb2Ygd2ViaG9vayBub3RpZmljYXRpb25zIGZvciB0aGUgdXNlclxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tOb3RpZmljYXRpb25zKHBhcmFtczogTGlzdFdlYmhvb2tOb3RpZmljYXRpb25zT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogYW55ID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzL25vdGlmaWNhdGlvbnMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIGEgdXNlciB3ZWJob29rXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBCaXRHb1NpbXVsYXRlV2ViaG9va09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJywgJ2Jsb2NrSWQnXSwgW10pO1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMud2ViaG9va0lkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgd2ViaG9va0lkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5ibG9ja0lkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgYmxvY2tJZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoYC93ZWJob29rcy8ke3BhcmFtcy53ZWJob29rSWR9L3NpbXVsYXRlYCkpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBnZXQgY29uc3RhbnRzIHdoaWNoIGFyZSByZWxldmFudCB0byB0aGUgY2xpZW50LlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGhhcyBhIGtub3duIHJhY2UgY29uZGl0aW9uLiBJdCBtYXkgcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgb3ZlciB0aW1lLFxuICAgKiBlc3BlY2lhbGx5IGlmIGNhbGxlZCBzaG9ydGx5IGFmdGVyIGNyZWF0aW9uIG9mIHRoZSBCaXRHbyBvYmplY3QuXG4gICAqXG4gICAqIE5ldyBjb2RlIHNob3VsZCBjYWxsIGZldGNoQ29uc3RhbnRzKCkgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xpZW50IGNvbnN0YW50cyBvYmplY3RcbiAgICovXG4gIGdldENvbnN0YW50cygpOiBhbnkge1xuICAgIC8vIGtpY2sgb2ZmIGEgZnJlc2ggcmVxdWVzdCBmb3IgdGhlIGNsaWVudCBjb25zdGFudHNcbiAgICB0aGlzLmZldGNoQ29uc3RhbnRzKCkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICAvLyBtYWtlIHN1cmUgYW4gZXJyb3IgZG9lcyBub3QgdGVybWluYXRlIHRoZSBlbnRpcmUgc2NyaXB0XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCBjbGllbnQgY29uc3RhbnRzIGZyb20gQml0R28nKTtcbiAgICAgICAgY29uc29sZS50cmFjZShlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gdXNlIGRlZmF1bHRDb25zdGFudHMgYXMgdGhlIGJhY2t1cCBmb3Iga2V5cyB0aGF0IGFyZSBub3Qgc2V0IGluIHRoaXMuX2NvbnN0YW50c1xuICAgIHJldHVybiBfLm1lcmdlKHt9LCBkZWZhdWx0Q29uc3RhbnRzKHRoaXMuZ2V0RW52KCkpLCBCaXRHb0FQSS5fY29uc3RhbnRzW3RoaXMuZ2V0RW52KCldKTtcbiAgfVxufVxuIl19
|
|
1704
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Z29BUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBc0I4QjtBQUM5Qix5Q0FBeUM7QUFDekMsZ0RBQWdEO0FBQ2hELG1EQUE4RDtBQUM5RCxvREFBb0Q7QUFDcEQscURBQXlEO0FBQ3pELG1DQUFvQztBQUNwQyxpQ0FBNkI7QUFDN0IsNEJBQTRCO0FBQzVCLHVDQUF1QztBQUN2Qyx5Q0FBeUM7QUFDekMsOEJBQThCO0FBQzlCLCtCQU9lO0FBQ2YsdUNBQTZDO0FBeUM3Qyw0Q0FBNkM7QUFDN0MseUNBQTBDO0FBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRXBDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzlDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVDLHNDQUF1QztBQUV2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDeEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDMUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUU5RCxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUM3QixJQUFJLGdCQUFnQixDQUFDO0FBQ3JCLElBQUksQ0FBQywyQkFBUyxJQUFJLENBQUMsNkJBQVcsRUFBRTtJQUM5QixLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUM5QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDeEIsZ0JBQWdCLEdBQUcsT0FB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QUF5QixDQUFDLENBQUM7U0FDNUM7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLE1BQU0sQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDO2FBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDWixNQUFNLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWTtRQUNWLG9EQUFvRDtRQUNwRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRztZQUN2QyxJQUFJLEdBQUcsRUFBRTtnQkFDUCwwREFBMEQ7Z0JBQzFELE9BQU8sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztnQkFDN0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNwQjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsa0ZBQWtGO1FBQ2xGLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBQSwyQkFBZ0IsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQzs7QUE3M0RILDRCQTgzREM7QUFuM0RrQiwrQkFBc0IsR0FBRyxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBbGlhc0Vudmlyb25tZW50cyxcbiAgQmFzZUNvaW4sXG4gIGJpdGNvaW4sXG4gIEJpdEdvQmFzZSxcbiAgQml0R29SZXF1ZXN0LFxuICBDb2luQ29uc3RydWN0b3IsXG4gIGNvbW1vbixcbiAgRGVjcnlwdE9wdGlvbnMsXG4gIGRlZmF1bHRDb25zdGFudHMsXG4gIEVjZGhEZXJpdmVkS2V5cGFpcixcbiAgRW5jcnlwdE9wdGlvbnMsXG4gIEVudmlyb25tZW50TmFtZSxcbiAgZ2VuZXJhdGVSYW5kb21QYXNzd29yZCxcbiAgZ2V0QWRkcmVzc1AyUEtILFxuICBnZXRTaGFyZWRTZWNyZXQsXG4gIEdldFNoYXJpbmdLZXlPcHRpb25zLFxuICBHZXRTaWduaW5nS2V5QXBpLFxuICBHbG9iYWxDb2luRmFjdG9yeSxcbiAgSVJlcXVlc3RUcmFjZXIsXG4gIG1ha2VSYW5kb21LZXksXG4gIHNhbml0aXplTGVnYWN5UGF0aCxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgc2pjbCBmcm9tICdAYml0Z28tYmV0YS9zamNsJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgYmlwMzIsIEVDUGFpckludGVyZmFjZSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIGJpdGNvaW5NZXNzYWdlIGZyb20gJ2JpdGNvaW5qcy1tZXNzYWdlJztcbmltcG9ydCB7IGlzQnJvd3NlciwgaXNXZWJXb3JrZXIgfSBmcm9tICdicm93c2VyLW9yLW5vZGUnO1xuaW1wb3J0IHsgY3JlYXRlSG1hYyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgZGVidWdMaWIgZnJvbSAnZGVidWcnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgc2VjcDI1NmsxIGZyb20gJ3NlY3AyNTZrMSc7XG5pbXBvcnQgKiBhcyBzdXBlcmFnZW50IGZyb20gJ3N1cGVyYWdlbnQnO1xuaW1wb3J0ICogYXMgdXJsTGliIGZyb20gJ3VybCc7XG5pbXBvcnQge1xuICBoYW5kbGVSZXNwb25zZUVycm9yLFxuICBoYW5kbGVSZXNwb25zZVJlc3VsdCxcbiAgc2VyaWFsaXplUmVxdWVzdERhdGEsXG4gIHNldFJlcXVlc3RRdWVyeVN0cmluZyxcbiAgdG9CaXRnb1JlcXVlc3QsXG4gIHZlcmlmeVJlc3BvbnNlLFxufSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBkZWNyeXB0LCBlbmNyeXB0IH0gZnJvbSAnLi9lbmNyeXB0JztcbmltcG9ydCB7XG4gIEFjY2Vzc1Rva2VuT3B0aW9ucyxcbiAgQWRkQWNjZXNzVG9rZW5PcHRpb25zLFxuICBBZGRBY2Nlc3NUb2tlblJlc3BvbnNlLFxuICBBdXRoZW50aWNhdGVPcHRpb25zLFxuICBBdXRoZW50aWNhdGVXaXRoQXV0aENvZGVPcHRpb25zLFxuICBCaXRHb0FQSU9wdGlvbnMsXG4gIEJpdEdvSnNvbixcbiAgQml0R29TaW11bGF0ZVdlYmhvb2tPcHRpb25zLFxuICBDYWxjdWxhdGVIbWFjU3ViamVjdE9wdGlvbnMsXG4gIENhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzT3B0aW9ucyxcbiAgQ2FsY3VsYXRlUmVxdWVzdEhtYWNPcHRpb25zLFxuICBDaGFuZ2VQYXNzd29yZE9wdGlvbnMsXG4gIERlcHJlY2F0ZWRWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgRXN0aW1hdGVGZWVPcHRpb25zLFxuICBFeHRlbmRUb2tlbk9wdGlvbnMsXG4gIEdldEVjZGhTZWNyZXRPcHRpb25zLFxuICBHZXRVc2VyT3B0aW9ucyxcbiAgTGlzdFdlYmhvb2tOb3RpZmljYXRpb25zT3B0aW9ucyxcbiAgTG9naW5SZXNwb25zZSxcbiAgUGluZ09wdGlvbnMsXG4gIFByb2Nlc3NlZEF1dGhlbnRpY2F0aW9uT3B0aW9ucyxcbiAgUmVjb25zdGl0dXRlZFNlY3JldCxcbiAgUmVjb25zdGl0dXRlU2VjcmV0T3B0aW9ucyxcbiAgUmVnaXN0ZXJQdXNoVG9rZW5PcHRpb25zLFxuICBSZW1vdmVBY2Nlc3NUb2tlbk9wdGlvbnMsXG4gIFJlcXVlc3RIZWFkZXJzLFxuICBTcGxpdFNlY3JldCxcbiAgU3BsaXRTZWNyZXRPcHRpb25zLFxuICBUb2tlbklzc3VhbmNlLFxuICBUb2tlbklzc3VhbmNlUmVzcG9uc2UsXG4gIFVubG9ja09wdGlvbnMsXG4gIFVzZXIsXG4gIFZlcmlmeVBhc3N3b3JkT3B0aW9ucyxcbiAgVmVyaWZ5UHVzaFRva2VuT3B0aW9ucyxcbiAgVmVyaWZ5UmVzcG9uc2VJbmZvLFxuICBWZXJpZnlSZXNwb25zZU9wdGlvbnMsXG4gIFZlcmlmeVNoYXJkc09wdGlvbnMsXG4gIFdlYmhvb2tPcHRpb25zLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCBzaGFtaXIgPSByZXF1aXJlKCdzZWNyZXRzLmpzLWdyZW1wZScpO1xuaW1wb3J0IHBqc29uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzphcGknKTtcblxuY29uc3QgQmxvY2tjaGFpbiA9IHJlcXVpcmUoJy4vdjEvYmxvY2tjaGFpbicpO1xuY29uc3QgS2V5Y2hhaW5zID0gcmVxdWlyZSgnLi92MS9rZXljaGFpbnMnKTtcbmltcG9ydCBXYWxsZXQgPSByZXF1aXJlKCcuL3YxL3dhbGxldCcpO1xuXG5jb25zdCBXYWxsZXRzID0gcmVxdWlyZSgnLi92MS93YWxsZXRzJyk7XG5jb25zdCBNYXJrZXRzID0gcmVxdWlyZSgnLi92MS9tYXJrZXRzJyk7XG5jb25zdCBQZW5kaW5nQXBwcm92YWxzID0gcmVxdWlyZSgnLi92MS9wZW5kaW5nYXBwcm92YWxzJyk7XG5jb25zdCBUcmF2ZWxSdWxlID0gcmVxdWlyZSgnLi92MS90cmF2ZWxSdWxlJyk7XG5jb25zdCBUcmFuc2FjdGlvbkJ1aWxkZXIgPSByZXF1aXJlKCcuL3YxL3RyYW5zYWN0aW9uQnVpbGRlcicpO1xuXG5sZXQgZW5hYmxlUHJveHlBZ2VudCA9IGZhbHNlO1xubGV0IHByb3h5QWdlbnRNb2R1bGU7XG5pZiAoIWlzQnJvd3NlciAmJiAhaXNXZWJXb3JrZXIpIHtcbiAgZGVidWcoJ2VuYWJsaW5nIHByb3h5LWFnZW50Jyk7XG4gIGVuYWJsZVByb3h5QWdlbnQgPSB0cnVlO1xuICBwcm94eUFnZW50TW9kdWxlID0gcmVxdWlyZSgncHJveHktYWdlbnQnKTtcbn1cblxuY29uc3QgcGF0Y2hlZFJlcXVlc3RNZXRob2RzID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsJywgJ3BhdGNoJywgJ29wdGlvbnMnXSBhcyBjb25zdDtcblxuZXhwb3J0IGNsYXNzIEJpdEdvQVBJIGltcGxlbWVudHMgQml0R29CYXNlIHtcbiAgLy8gdjEgdHlwZXNcbiAgcHJvdGVjdGVkIF9rZXljaGFpbnM6IGFueTtcbiAgcHJvdGVjdGVkIF93YWxsZXRzOiBhbnk7XG4gIHByb3RlY3RlZCBfbWFya2V0cz86IGFueTtcbiAgcHJvdGVjdGVkIF9ibG9ja2NoYWluPzogYW55O1xuICBwcm90ZWN0ZWQgX3RyYXZlbFJ1bGU/OiBhbnk7XG4gIHByb3RlY3RlZCBfcGVuZGluZ0FwcHJvdmFscz86IGFueTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIF9jb25zdGFudHM6IGFueTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBfY29uc3RhbnRzRXhwaXJlOiBhbnk7XG4gIHByb3RlY3RlZCBzdGF0aWMgX3Rlc3RuZXRXYXJuaW5nTWVzc2FnZSA9IGZhbHNlO1xuICBwdWJsaWMgcmVhZG9ubHkgZW52OiBFbnZpcm9ubWVudE5hbWU7XG4gIHByb3RlY3RlZCByZWFkb25seSBfYmFzZVVybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Jhc2VBcGlVcmw6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9iYXNlQXBpVXJsVjI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9lbnY6IEVudmlyb25tZW50TmFtZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9hdXRoVmVyc2lvbjogRXhjbHVkZTxCaXRHb0FQSU9wdGlvbnNbJ2F1dGhWZXJzaW9uJ10sIHVuZGVmaW5lZD4gPSAyO1xuICBwcm90ZWN0ZWQgX2htYWNWZXJpZmljYXRpb24gPSB0cnVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3Byb3h5Pzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3VzZXI/OiBVc2VyO1xuICBwcm90ZWN0ZWQgX2V4dGVuc2lvbktleT86IEVDUGFpckludGVyZmFjZTtcbiAgcHJvdGVjdGVkIF9yZXFJZD86IElSZXF1ZXN0VHJhY2VyO1xuICBwcm90ZWN0ZWQgX3Rva2VuPzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3ZlcnNpb24gPSBwanNvbi52ZXJzaW9uO1xuICBwcm90ZWN0ZWQgX3VzZXJBZ2VudD86IHN0cmluZztcbiAgcHJvdGVjdGVkIF9lY2RoWHBydj86IHN0cmluZztcbiAgcHJvdGVjdGVkIF9yZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY2xpZW50SWQ/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY2xpZW50U2VjcmV0Pzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3ZhbGlkYXRlOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IEJpdEdvQVBJT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgIWNvbW1vbi52YWxpZGF0ZVBhcmFtcyhcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBbXSxcbiAgICAgICAgW1xuICAgICAgICAgICdhY2Nlc3NUb2tlbicsXG4gICAgICAgICAgJ3VzZXJBZ2VudCcsXG4gICAgICAgICAgJ2N1c3RvbVJvb3RVUkknLFxuICAgICAgICAgICdjdXN0b21CaXRjb2luTmV0d29yaycsXG4gICAgICAgICAgJ3NlcnZlclhwdWInLFxuICAgICAgICAgICdzdGVsbGFyRmVkZXJhdGlvblNlcnZlclVybCcsXG4gICAgICAgIF1cbiAgICAgICkgfHxcbiAgICAgIChwYXJhbXMudXNlUHJvZHVjdGlvbiAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnVzZVByb2R1Y3Rpb24pKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gQnkgZGVmYXVsdCwgd2Ugb3BlcmF0ZSBvbiB0aGUgdGVzdCBzZXJ2ZXIuXG4gICAgLy8gRGVwcmVjYXRlIHVzZVByb2R1Y3Rpb24gaW4gdGhlIGZ1dHVyZVxuICAgIGxldCBlbnY6IEVudmlyb25tZW50TmFtZTtcblxuICAgIGlmIChwYXJhbXMudXNlUHJvZHVjdGlvbikge1xuICAgICAgaWYgKHBhcmFtcy5lbnYgJiYgcGFyYW1zLmVudiAhPT0gJ3Byb2QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHVzZSB1c2VQcm9kdWN0aW9uIHdoZW4gZW52PScgKyBwYXJhbXMuZW52KTtcbiAgICAgIH1cbiAgICAgIGVudiA9ICdwcm9kJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgcGFyYW1zLmN1c3RvbVJvb3RVUkkgfHxcbiAgICAgIHBhcmFtcy5jdXN0b21CaXRjb2luTmV0d29yayB8fFxuICAgICAgcGFyYW1zLmN1c3RvbVNpZ25pbmdBZGRyZXNzIHx8XG4gICAgICBwYXJhbXMuc2VydmVyWHB1YiB8fFxuICAgICAgcHJvY2Vzcy5lbnYuQklUR09fQ1VTVE9NX1JPT1RfVVJJIHx8XG4gICAgICBwcm9jZXNzLmVudi5CSVRHT19DVVNUT01fQklUQ09JTl9ORVRXT1JLXG4gICAgKSB7XG4gICAgICAvLyBmb3IgYnJhbmNoIGRlcGxveXMsIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGN1c3RvbSBlbmRwb2ludHMgd2hpbGUgc3RpbGxcbiAgICAgIC8vIG1haW50YWluaW5nIHRoZSBuYW1lIG9mIHNwZWNpZmllZCB0aGUgZW52aXJvbm1lbnRcbiAgICAgIGVudiA9IHBhcmFtcy5lbnYgPT09ICdicmFuY2gnID8gJ2JyYW5jaCcgOiAnY3VzdG9tJztcbiAgICAgIGlmIChwYXJhbXMuY3VzdG9tUm9vdFVSSSkge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0udXJpID0gcGFyYW1zLmN1c3RvbVJvb3RVUkk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmN1c3RvbUJpdGNvaW5OZXR3b3JrKSB7XG4gICAgICAgIGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS5uZXR3b3JrID0gcGFyYW1zLmN1c3RvbUJpdGNvaW5OZXR3b3JrO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5jdXN0b21TaWduaW5nQWRkcmVzcykge1xuICAgICAgICAoY29tbW9uLkVudmlyb25tZW50c1tlbnZdIGFzIGFueSkuY3VzdG9tU2lnbmluZ0FkZHJlc3MgPSBwYXJhbXMuY3VzdG9tU2lnbmluZ0FkZHJlc3M7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnNlcnZlclhwdWIpIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnNlcnZlclhwdWIgPSBwYXJhbXMuc2VydmVyWHB1YjtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuc3RlbGxhckZlZGVyYXRpb25TZXJ2ZXJVcmwpIHtcbiAgICAgICAgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnN0ZWxsYXJGZWRlcmF0aW9uU2VydmVyVXJsID0gcGFyYW1zLnN0ZWxsYXJGZWRlcmF0aW9uU2VydmVyVXJsO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkKSB7XG4gICAgICAgIHRoaXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9IHBhcmFtcy5lbnYgfHwgKHByb2Nlc3MuZW52LkJJVEdPX0VOViBhcyBFbnZpcm9ubWVudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgaGFzbid0IGJlZW4gc2V0IHRvIHRydWUgYWxyZWFkeSBzb21lIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXRcbiAgICBpZiAocGFyYW1zLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgJiYgIXRoaXMuY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb29raWVzIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiBjdXN0b20gVVJJcyBhcmUgaW4gdXNlJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hdXRoVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9hdXRoVmVyc2lvbiA9IHBhcmFtcy5hdXRoVmVyc2lvbjtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGVudiBpcyBhbiBhbGlhcywgc3dhcCBpdCBvdXQgd2l0aCB0aGUgZXF1aXZhbGVudCBzdXBwb3J0ZWQgZW52aXJvbm1lbnRcbiAgICBpZiAoZW52IGluIEFsaWFzRW52aXJvbm1lbnRzKSB7XG4gICAgICBlbnYgPSBBbGlhc0Vudmlyb25tZW50c1tlbnZdO1xuICAgIH1cblxuICAgIGlmIChlbnYgPT09ICdjdXN0b20nICYmIF8uaXNVbmRlZmluZWQoY29tbW9uLkVudmlyb25tZW50c1tlbnZdLnVyaSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ211c3QgdXNlIC0tY3VzdG9tcm9vdHVyaSBvciBzZXQgdGhlIEJJVEdPX0NVU1RPTV9ST09UX1VSSSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHVzaW5nIHRoZSBjdXN0b20gZW52aXJvbm1lbnQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlbnYpIHtcbiAgICAgIGlmIChjb21tb24uRW52aXJvbm1lbnRzW2Vudl0pIHtcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZW52XS51cmk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW52aXJvbm1lbnQgJyArIGVudiArICcuIFN1cHBvcnRlZCBlbnZpcm9ubWVudHM6IHByb2QsIHRlc3QsIGRldiwgbGF0ZXN0Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9ICd0ZXN0JztcbiAgICAgIGlmICghQml0R29BUEkuX3Rlc3RuZXRXYXJuaW5nTWVzc2FnZSkge1xuICAgICAgICBCaXRHb0FQSS5fdGVzdG5ldFdhcm5pbmdNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coJ0JpdEdvIFNESyBlbnYgbm90IHNldCAtIGRlZmF1bHRpbmcgdG8gdGVzdCBhdCB0ZXN0LmJpdGdvLmNvbS4nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Jhc2VVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2Vudl0udXJpO1xuICAgIH1cbiAgICB0aGlzLl9lbnYgPSB0aGlzLmVudiA9IGVudjtcblxuICAgIGNvbnN0IHN1cHBvcnRlZEFwaVRva2VucyA9IFtcbiAgICAgICdldGhlcnNjYW5BcGlUb2tlbicsXG4gICAgICAncG9seWdvbnNjYW5BcGlUb2tlbicsXG4gICAgICAnYXJiaXNjYW5BcGlUb2tlbicsXG4gICAgICAnb3B0aW1pc3RpY0V0aGVyc2NhbkFwaVRva2VuJyxcbiAgICAgICd6a3N5bmNFeHBsb3JlckFwaVRva2VuJyxcbiAgICBdO1xuXG4gICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChzdXBwb3J0ZWRBcGlUb2tlbnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb21tb24uRW52aXJvbm1lbnRzW2Vudl1ba2V5XSA9IHBhcmFtc1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29tbW9uLnNldE5ldHdvcmsoY29tbW9uLkVudmlyb25tZW50c1tlbnZdLm5ldHdvcmspO1xuXG4gICAgdGhpcy5fYmFzZUFwaVVybCA9IHRoaXMuX2Jhc2VVcmwgKyAnL2FwaS92MSc7XG4gICAgdGhpcy5fYmFzZUFwaVVybFYyID0gdGhpcy5fYmFzZVVybCArICcvYXBpL3YyJztcbiAgICB0aGlzLl90b2tlbiA9IHBhcmFtcy5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLl91c2VyQWdlbnQgPSBwYXJhbXMudXNlckFnZW50IHx8ICdCaXRHb0pTLWFwaS8nICsgdGhpcy52ZXJzaW9uKCk7XG4gICAgdGhpcy5fcmVxSWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVmcmVzaFRva2VuID0gcGFyYW1zLnJlZnJlc2hUb2tlbjtcbiAgICB0aGlzLl9jbGllbnRJZCA9IHBhcmFtcy5jbGllbnRJZDtcbiAgICB0aGlzLl9jbGllbnRTZWNyZXQgPSBwYXJhbXMuY2xpZW50U2VjcmV0O1xuICAgIHRoaXMuX2tleWNoYWlucyA9IG51bGw7XG4gICAgdGhpcy5fd2FsbGV0cyA9IG51bGw7XG5cbiAgICAvLyB3aGV0aGVyIHRvIHBlcmZvcm0gZXh0cmEgY2xpZW50LXNpZGUgdmFsaWRhdGlvbiBmb3Igc29tZSB0aGluZ3MsIHN1Y2ggYXNcbiAgICAvLyBhZGRyZXNzIHZhbGlkYXRpb24gb3Igc2lnbmF0dXJlIHZhbGlkYXRpb24uIGRlZmF1bHRzIHRvIHRydWUsIGJ1dCBjYW4gYmVcbiAgICAvLyB0dXJuZWQgb2ZmIGJ5IHNldHRpbmcgdG8gZmFsc2UuIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW4gaW5kaXZpZHVhbGx5IGluIHRoZVxuICAgIC8vIGZ1bmN0aW9ucyB0aGF0IHVzZSBpdC5cbiAgICB0aGlzLl92YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcblxuICAgIGlmICghcGFyYW1zLmhtYWNWZXJpZmljYXRpb24gJiYgcGFyYW1zLmhtYWNWZXJpZmljYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKChlbnYgPT0gJ3Byb2QnIHx8IGVudiA9PSAnYWRtaW5Qcm9kJykgJiYgY29tbW9uLkVudmlyb25tZW50c1tlbnZdLmhtYWNWZXJpZmljYXRpb25FbmZvcmNlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkaXNhYmxlIHJlcXVlc3QgSE1BQyB2ZXJpZmljYXRpb24gaW4gZW52aXJvbm1lbnQgJHt0aGlzLmdldEVudigpfWApO1xuICAgICAgfVxuICAgICAgZGVidWcoJ0hNQUMgdmVyaWZpY2F0aW9uIGV4cGxpY2l0bHkgZGlzYWJsZWQgYnkgY29uc3RydWN0b3Igb3B0aW9uJyk7XG4gICAgICB0aGlzLl9obWFjVmVyaWZpY2F0aW9uID0gcGFyYW1zLmhtYWNWZXJpZmljYXRpb247XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnByb3h5ICYmIHByb2Nlc3MuZW52LkJJVEdPX1VTRV9QUk9YWSkge1xuICAgICAgcGFyYW1zLnByb3h5ID0gcHJvY2Vzcy5lbnYuQklUR09fVVNFX1BST1hZO1xuICAgIH1cblxuICAgIGlmICgocHJvY2VzcyBhcyBhbnkpLmJyb3dzZXIgJiYgcGFyYW1zLnByb3h5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCB1c2UgaHR0cHMgcHJveHkgcGFyYW1zIHdoaWxlIGluIGJyb3dzZXInKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm94eSA9IHBhcmFtcy5wcm94eTtcblxuICAgIC8vIGNhcHR1cmUgb3V0ZXIgc3RhY2sgc28gd2UgaGF2ZSB1c2VmdWwgZGVidWcgaW5mb3JtYXRpb24gaWYgZmV0Y2ggY29uc3RhbnRzIGZhaWxzXG4gICAgY29uc3QgZSA9IG5ldyBFcnJvcigpO1xuXG4gICAgLy8gS2ljayBvZmYgZmlyc3QgbG9hZCBvZiBjb25zdGFudHNcbiAgICB0aGlzLmZldGNoQ29uc3RhbnRzKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICAvLyBtYWtlIHN1cmUgYW4gZXJyb3IgZG9lcyBub3QgdGVybWluYXRlIHRoZSBlbnRpcmUgc2NyaXB0XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCBpbml0aWFsIGNsaWVudCBjb25zdGFudHMgZnJvbSBCaXRHbycpO1xuICAgICAgICBkZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdXBlcmFnZW50IHJlcXVlc3QgZm9yIHNwZWNpZmllZCBodHRwIG1ldGhvZCBhbmQgVVJMIGNvbmZpZ3VyZWQgdG8gdGhlIFNESyBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBtZXRob2QgLSBodHRwIG1ldGhvZCBmb3IgdGhlIG5ldyByZXF1ZXN0XG4gICAqIEBwYXJhbSB1cmwgLSBVUkwgZm9yIHRoZSBuZXcgcmVxdWVzdFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFnZW50UmVxdWVzdChtZXRob2Q6ICh0eXBlb2YgcGF0Y2hlZFJlcXVlc3RNZXRob2RzKVtudW1iZXJdLCB1cmw6IHN0cmluZyk6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3Qge1xuICAgIGxldCByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3QgPSBzdXBlcmFnZW50W21ldGhvZF0odXJsKTtcbiAgICBpZiAodGhpcy5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkKSB7XG4gICAgICByZXEgPSByZXEud2l0aENyZWRlbnRpYWxzKCk7XG4gICAgfVxuICAgIHJldHVybiByZXE7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhc2Vjb2luIG9iamVjdFxuICAgKiBAcGFyYW0gbmFtZVxuICAgKi9cbiAgcHVibGljIGNvaW4obmFtZTogc3RyaW5nKTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBHbG9iYWxDb2luRmFjdG9yeS5nZXRJbnN0YW5jZSh0aGlzLCBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgQml0R28gZW52aXJvbm1lbnRcbiAgICovXG4gIGdldEVudigpOiBFbnZpcm9ubWVudE5hbWUge1xuICAgIHJldHVybiB0aGlzLl9lbnY7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IGF1dGggdmVyc2lvbiB1c2VkIGZvciByZXF1ZXN0cyB0byB0aGUgQml0R28gc2VydmVyXG4gICAqL1xuICBnZXRBdXRoVmVyc2lvbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hdXRoVmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgcGF0Y2hpbmcgZnVuY3Rpb24gd2hpY2ggY2FuIGFwcGx5IG91ciBhdXRob3JpemF0aW9uXG4gICAqIGhlYWRlcnMgdG8gYW55IG91dGJvdW5kIHJlcXVlc3QuXG4gICAqIEBwYXJhbSBtZXRob2RcbiAgICovXG4gIHByaXZhdGUgcmVxdWVzdFBhdGNoKG1ldGhvZDogKHR5cGVvZiBwYXRjaGVkUmVxdWVzdE1ldGhvZHMpW251bWJlcl0sIHVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVxID0gdGhpcy5nZXRBZ2VudFJlcXVlc3QobWV0aG9kLCB1cmwpO1xuICAgIGlmICh0aGlzLl9wcm94eSAmJiBlbmFibGVQcm94eUFnZW50KSB7XG4gICAgICBkZWJ1ZygncHJveHlpbmcgcmVxdWVzdCB0aHJvdWdoICVzJywgdGhpcy5fcHJveHkpO1xuICAgICAgY29uc3QgcHJveHlVcmw6IHN0cmluZyA9IHRoaXMuX3Byb3h5O1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgcHJveHlBZ2VudE1vZHVsZS5Qcm94eUFnZW50KHtcbiAgICAgICAgZ2V0UHJveHlGb3JVcmw6ICgpID0+IHByb3h5VXJsLFxuICAgICAgfSk7XG4gICAgICBpZiAoYWdlbnQpIHtcbiAgICAgICAgcmVxLmFnZW50KGFnZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbFRoZW4gPSByZXEudGhlbi5iaW5kKHJlcSk7XG4gICAgcmVxLnRoZW4gPSAob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpID0+IHtcbiAgICAgIC8vIGludGVyY2VwdCBhIHJlcXVlc3QgYmVmb3JlIGl0J3Mgc3VibWl0dGVkIHRvIHRoZSBzZXJ2ZXIgZm9yIHYyIGF1dGhlbnRpY2F0aW9uIChiYXNlZCBvbiB0b2tlbilcbiAgICAgIGlmICh0aGlzLl92ZXJzaW9uKSB7XG4gICAgICAgIC8vIFRPRE8gLSBkZWNpZGUgd2hlcmUgdG8gZ2V0IHZlcnNpb25cbiAgICAgICAgcmVxLnNldCgnQml0R28tU0RLLVZlcnNpb24nLCB0aGlzLl92ZXJzaW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuX3JlcUlkKSkge1xuICAgICAgICByZXEuc2V0KCdSZXF1ZXN0LUlEJywgdGhpcy5fcmVxSWQudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgLy8gaW5jcmVtZW50IGFmdGVyIHNldHRpbmcgdGhlIGhlYWRlciBzbyB0aGUgc2VxdWVuY2UgbnVtYmVycyBzdGFydCBhdCAwXG4gICAgICAgIHRoaXMuX3JlcUlkLmluYygpO1xuXG4gICAgICAgIC8vIHJlcXVlc3QgaWRzIG11c3QgYmUgc2V0IGJlZm9yZSBlYWNoIHJlcXVlc3QgaW5zdGVhZCBvZiBiZWluZyBrZXB0XG4gICAgICAgIC8vIGluc2lkZSB0aGUgYml0Z28gb2JqZWN0LiBUaGlzIGlzIHRvIHByZXZlbnQgcmVlbnRyYW5jeSBpc3N1ZXMgd2hlcmVcbiAgICAgICAgLy8gbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlcXVlc3RzIGNvdWxkIGNhdXNlIGluY29ycmVjdCByZXFJZHMgdG8gYmUgdXNlZFxuICAgICAgICBkZWxldGUgdGhpcy5fcmVxSWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIHByZXZlbnQgSUUgZnJvbSBjYWNoaW5nIHJlcXVlc3RzXG4gICAgICByZXEuc2V0KCdJZi1Nb2RpZmllZC1TaW5jZScsICdNb24sIDI2IEp1bCAxOTk3IDA1OjAwOjAwIEdNVCcpO1xuXG4gICAgICBpZiAoIShwcm9jZXNzIGFzIGFueSkuYnJvd3NlciAmJiB0aGlzLl91c2VyQWdlbnQpIHtcbiAgICAgICAgLy8gSWYgbm90IGluIHRoZSBicm93c2VyLCBzZXQgdGhlIFVzZXItQWdlbnQuIEJyb3dzZXJzIGRvbid0IGFsbG93XG4gICAgICAgIC8vIHNldHRpbmcgb2YgVXNlci1BZ2VudCwgc28gd2UgbXVzdCBkaXNhYmxlIHRoaXMgd2hlbiBydW4gaW4gdGhlXG4gICAgICAgIC8vIGJyb3dzZXIgKGJyb3dzZXJpZnkgc2V0cyBwcm9jZXNzLmJyb3dzZXIpLlxuICAgICAgICByZXEuc2V0KCdVc2VyLUFnZW50JywgdGhpcy5fdXNlckFnZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgdG8ganVzdCBhYm92ZSA1IG1pbnV0ZXMgYnkgZGVmYXVsdFxuICAgICAgcmVxLnRpbWVvdXQoKHByb2Nlc3MuZW52LkJJVEdPX1RJTUVPVVQgYXMgYW55KSAqIDEwMDAgfHwgMzA1ICogMTAwMCk7XG5cbiAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHRva2VuLCBhbmQgd2UncmUgbm90IGxvZ2dlZCBpbiwgdGhlIHJlcXVlc3QgY2Fubm90IGJlIHYyIGF1dGhlbnRpY2F0ZWRcbiAgICAgIHJlcS5pc1YyQXV0aGVudGljYXRlZCA9IHRydWU7XG4gICAgICByZXEuYXV0aGVudGljYXRpb25Ub2tlbiA9IHRoaXMuX3Rva2VuO1xuICAgICAgLy8gc29tZSBvZiB0aGUgb2xkZXIgdG9rZW5zIGFwcGVhciB0byBiZSBvbmx5IDQwIGNoYXJhY3RlcnMgbG9uZ1xuICAgICAgaWYgKCh0aGlzLl90b2tlbiAmJiB0aGlzLl90b2tlbi5sZW5ndGggIT09IDY3ICYmIHRoaXMuX3Rva2VuLmluZGV4T2YoJ3YyeCcpICE9PSAwKSB8fCByZXEuZm9yY2VWMUF1dGgpIHtcbiAgICAgICAgLy8gdXNlIHRoZSBvbGQgbWV0aG9kXG4gICAgICAgIHJlcS5pc1YyQXV0aGVudGljYXRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJlcS5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyB0aGlzLl90b2tlbik7XG4gICAgICAgIGRlYnVnKCdzZW5kaW5nIHYxICVzIHJlcXVlc3QgdG8gJXMgd2l0aCB0b2tlbiAlcycsIG1ldGhvZCwgdXJsLCB0aGlzLl90b2tlbj8uc3Vic3RyKDAsIDgpKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsVGhlbihvbmZ1bGZpbGxlZCkuY2F0Y2gob25yZWplY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHJlcS5zZXQoJ0JpdEdvLUF1dGgtVmVyc2lvbicsIHRoaXMuX2F1dGhWZXJzaW9uID09PSAzID8gJzMuMCcgOiAnMi4wJyk7XG5cbiAgICAgIGlmICh0aGlzLl90b2tlbikge1xuICAgICAgICBjb25zdCBkYXRhID0gc2VyaWFsaXplUmVxdWVzdERhdGEocmVxKTtcbiAgICAgICAgc2V0UmVxdWVzdFF1ZXJ5U3RyaW5nKHJlcSk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdFByb3BlcnRpZXMgPSB0aGlzLmNhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzKHtcbiAgICAgICAgICB1cmw6IHJlcS51cmwsXG4gICAgICAgICAgdG9rZW46IHRoaXMuX3Rva2VuLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICB0ZXh0OiBkYXRhIHx8ICcnLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVxLnNldCgnQXV0aC1UaW1lc3RhbXAnLCByZXF1ZXN0UHJvcGVydGllcy50aW1lc3RhbXAudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgLy8gd2UncmUgbm90IHNlbmRpbmcgdGhlIGFjdHVhbCB0b2tlbiwgYnV0IG9ubHkgaXRzIGhhc2hcbiAgICAgICAgcmVxLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIHJlcXVlc3RQcm9wZXJ0aWVzLnRva2VuSGFzaCk7XG4gICAgICAgIGRlYnVnKCdzZW5kaW5nIHYyICVzIHJlcXVlc3QgdG8gJXMgd2l0aCB0b2tlbiAlcycsIG1ldGhvZCwgdXJsLCB0aGlzLl90b2tlbj8uc3Vic3RyKDAsIDgpKTtcblxuICAgICAgICAvLyBzZXQgdGhlIEhNQUNcbiAgICAgICAgcmVxLnNldCgnSE1BQycsIHJlcXVlc3RQcm9wZXJ0aWVzLmhtYWMpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFZlcmlmeSB0aGUgcmVzcG9uc2UgYmVmb3JlIGNhbGxpbmcgdGhlIG9yaWdpbmFsIG9uZnVsZmlsbGVkIGhhbmRsZXIsXG4gICAgICAgKiBhbmQgbWFrZSBzdXJlIG9ucmVqZWN0ZWQgaXMgY2FsbGVkIGlmIGEgdmVyaWZpY2F0aW9uIGVycm9yIGlzIGVuY291bnRlcmVkXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IG5ld09uRnVsZmlsbGVkID0gb25mdWxmaWxsZWRcbiAgICAgICAgPyAocmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIC8vIEhNQUMgdmVyaWZpY2F0aW9uIGlzIG9ubHkgYWxsb3dlZCB0byBiZSBza2lwcGVkIGluIGNlcnRhaW4gZW52aXJvbm1lbnRzLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBjaGVja2VkIGluIHRoZSBjb25zdHJ1Y3RvciwgYnV0IGNoZWNraW5nIGl0IGFnYWluIGF0IHJlcXVlc3QgdGltZVxuICAgICAgICAgICAgLy8gd2lsbCBoZWxwIHByZXZlbnQgYWdhaW5zdCB0YW1wZXJpbmcgb2YgdGhpcyBwcm9wZXJ0eSBhZnRlciB0aGUgb2JqZWN0IGlzIGNyZWF0ZWRcbiAgICAgICAgICAgIGlmICghdGhpcy5faG1hY1ZlcmlmaWNhdGlvbiAmJiAhY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmdldEVudigpXS5obWFjVmVyaWZpY2F0aW9uRW5mb3JjZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uZnVsZmlsbGVkKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdmVyaWZpZWRSZXNwb25zZSA9IHZlcmlmeVJlc3BvbnNlKHRoaXMsIHRoaXMuX3Rva2VuLCBtZXRob2QsIHJlcSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgcmV0dXJuIG9uZnVsZmlsbGVkKHZlcmlmaWVkUmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuICAgICAgcmV0dXJuIG9yaWdpbmFsVGhlbihuZXdPbkZ1bGZpbGxlZCkuY2F0Y2gob25yZWplY3RlZCk7XG4gICAgfTtcbiAgICByZXR1cm4gdG9CaXRnb1JlcXVlc3QocmVxKTtcbiAgfVxuXG4gIGdldCh1cmw6IHN0cmluZyk6IEJpdEdvUmVxdWVzdCB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFBhdGNoKCdnZXQnLCB1cmwpO1xuICB9XG4gIHBvc3QodXJsOiBzdHJpbmcpOiBCaXRHb1JlcXVlc3Qge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RQYXRjaCgncG9zdCcsIHVybCk7XG4gIH1cbiAgcHV0KHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ3B1dCcsIHVybCk7XG4gIH1cbiAgZGVsKHVybDogc3RyaW5nKTogQml0R29SZXF1ZXN0IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0UGF0Y2goJ2RlbCcsIHVybCk7XG4gIH1cbiAgcGF0Y2godXJsOiBzdHJpbmcpOiBCaXRHb1JlcXVlc3Qge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RQYXRjaCgncGF0Y2gnLCB1cmwpO1xuICB9XG4gIG9wdGlvbnModXJsOiBzdHJpbmcpOiBCaXRHb1JlcXVlc3Qge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RQYXRjaCgnb3B0aW9ucycsIHVybCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBITUFDIGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBtZXNzYWdlXG4gICAqIEBwYXJhbSBrZXkge1N0cmluZ30gLSB0aGUga2V5IHRvIHVzZSBmb3IgdGhlIEhNQUNcbiAgICogQHBhcmFtIG1lc3NhZ2Uge1N0cmluZ30gLSB0aGUgYWN0dWFsIG1lc3NhZ2UgdG8gSE1BQ1xuICAgKiBAcmV0dXJucyB7Kn0gLSB0aGUgcmVzdWx0IG9mIHRoZSBITUFDIG9wZXJhdGlvblxuICAgKi9cbiAgY2FsY3VsYXRlSE1BQyhrZXk6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY3JlYXRlSG1hYygnc2hhMjU2Jywga2V5KS51cGRhdGUobWVzc2FnZSkuZGlnZXN0KCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIHN1YmplY3Qgc3RyaW5nIHRoYXQgaXMgdG8gYmUgSE1BQydlZCBmb3IgYSBIVFRQIHJlcXVlc3Qgb3IgcmVzcG9uc2VcbiAgICogQHBhcmFtIHVybFBhdGggcmVxdWVzdCB1cmwsIGluY2x1ZGluZyBxdWVyeSBwYXJhbXNcbiAgICogQHBhcmFtIHRleHQgcmVxdWVzdCBib2R5IHRleHRcbiAgICogQHBhcmFtIHRpbWVzdGFtcCByZXF1ZXN0IHRpbWVzdGFtcCBmcm9tIGBEYXRlLm5vdygpYFxuICAgKiBAcGFyYW0gc3RhdHVzQ29kZSBPbmx5IHNldCBmb3IgSFRUUCByZXNwb25zZXMsIGxlYXZlIGJsYW5rIGZvciByZXF1ZXN0c1xuICAgKiBAcGFyYW0gbWV0aG9kIHJlcXVlc3QgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBjYWxjdWxhdGVITUFDU3ViamVjdCh7IHVybFBhdGgsIHRleHQsIHRpbWVzdGFtcCwgc3RhdHVzQ29kZSwgbWV0aG9kIH06IENhbGN1bGF0ZUhtYWNTdWJqZWN0T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsRGV0YWlscyA9IHVybExpYi5wYXJzZSh1cmxQYXRoKTtcbiAgICBjb25zdCBxdWVyeVBhdGggPSB1cmxEZXRhaWxzLnF1ZXJ5ICYmIHVybERldGFpbHMucXVlcnkubGVuZ3RoID4gMCA/IHVybERldGFpbHMucGF0aCA6IHVybERldGFpbHMucGF0aG5hbWU7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHN0YXR1c0NvZGUpICYmIF8uaXNJbnRlZ2VyKHN0YXR1c0NvZGUpICYmIF8uaXNGaW5pdGUoc3RhdHVzQ29kZSkpIHtcbiAgICAgIGlmICh0aGlzLl9hdXRoVmVyc2lvbiA9PT0gMykge1xuICAgICAgICByZXR1cm4gW21ldGhvZC50b1VwcGVyQ2FzZSgpLCB0aW1lc3RhbXAsIHF1ZXJ5UGF0aCwgc3RhdHVzQ29kZSwgdGV4dF0uam9pbignfCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFt0aW1lc3RhbXAsIHF1ZXJ5UGF0aCwgc3RhdHVzQ29kZSwgdGV4dF0uam9pbignfCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYXV0aFZlcnNpb24gPT09IDMpIHtcbiAgICAgIHJldHVybiBbbWV0aG9kLnRvVXBwZXJDYXNlKCksIHRpbWVzdGFtcCwgJzMuMCcsIHF1ZXJ5UGF0aCwgdGV4dF0uam9pbignfCcpO1xuICAgIH1cbiAgICByZXR1cm4gW3RpbWVzdGFtcCwgcXVlcnlQYXRoLCB0ZXh0XS5qb2luKCd8Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBITUFDIGZvciBhbiBIVFRQIHJlcXVlc3RcbiAgICovXG4gIGNhbGN1bGF0ZVJlcXVlc3RITUFDKHsgdXJsOiB1cmxQYXRoLCB0ZXh0LCB0aW1lc3RhbXAsIHRva2VuLCBtZXRob2QgfTogQ2FsY3VsYXRlUmVxdWVzdEhtYWNPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBzaWduYXR1cmVTdWJqZWN0ID0gdGhpcy5jYWxjdWxhdGVITUFDU3ViamVjdCh7IHVybFBhdGgsIHRleHQsIHRpbWVzdGFtcCwgbWV0aG9kIH0pO1xuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSBITUFDXG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlSE1BQyh0b2tlbiwgc2lnbmF0dXJlU3ViamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHJlcXVlc3QgaGVhZGVycyB3aXRoIEhNQUNcbiAgICovXG4gIGNhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzKHsgdXJsLCB0ZXh0LCB0b2tlbiwgbWV0aG9kIH06IENhbGN1bGF0ZVJlcXVlc3RIZWFkZXJzT3B0aW9ucyk6IFJlcXVlc3RIZWFkZXJzIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGhtYWMgPSB0aGlzLmNhbGN1bGF0ZVJlcXVlc3RITUFDKHsgdXJsLCB0ZXh0LCB0aW1lc3RhbXAsIHRva2VuLCBtZXRob2QgfSk7XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIFNIQTI1NiBoYXNoIG9mIHRoZSB0b2tlblxuICAgIGNvbnN0IGhhc2hEaWdlc3QgPSBzamNsLmhhc2guc2hhMjU2Lmhhc2godG9rZW4pO1xuICAgIGNvbnN0IHRva2VuSGFzaCA9IHNqY2wuY29kZWMuaGV4LmZyb21CaXRzKGhhc2hEaWdlc3QpO1xuICAgIHJldHVybiB7XG4gICAgICBobWFjLFxuICAgICAgdGltZXN0YW1wLFxuICAgICAgdG9rZW5IYXNoLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSBITUFDIGZvciBhbiBIVFRQIHJlc3BvbnNlXG4gICAqL1xuICB2ZXJpZnlSZXNwb25zZSh7XG4gICAgdXJsOiB1cmxQYXRoLFxuICAgIHN0YXR1c0NvZGUsXG4gICAgdGV4dCxcbiAgICB0aW1lc3RhbXAsXG4gICAgdG9rZW4sXG4gICAgaG1hYyxcbiAgICBtZXRob2QsXG4gIH06IFZlcmlmeVJlc3BvbnNlT3B0aW9ucyk6IFZlcmlmeVJlc3BvbnNlSW5mbyB7XG4gICAgY29uc3Qgc2lnbmF0dXJlU3ViamVjdCA9IHRoaXMuY2FsY3VsYXRlSE1BQ1N1YmplY3Qoe1xuICAgICAgdXJsUGF0aCxcbiAgICAgIHRleHQsXG4gICAgICB0aW1lc3RhbXAsXG4gICAgICBzdGF0dXNDb2RlLFxuICAgICAgbWV0aG9kLFxuICAgIH0pO1xuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSBITUFDXG4gICAgY29uc3QgZXhwZWN0ZWRIbWFjID0gdGhpcy5jYWxjdWxhdGVITUFDKHRva2VuLCBzaWduYXR1cmVTdWJqZWN0KTtcblxuICAgIC8vIGRldGVybWluZSBpZiB0aGUgcmVzcG9uc2UgaXMgc3RpbGwgd2l0aGluIHRoZSB2YWxpZGl0eSB3aW5kb3cgKDUgbWludXRlIHdpbmRvdylcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGlzSW5SZXNwb25zZVZhbGlkaXR5V2luZG93ID0gdGltZXN0YW1wID49IG5vdyAtIDEwMDAgKiA2MCAqIDUgJiYgdGltZXN0YW1wIDw9IG5vdztcblxuICAgIC8vIHZlcmlmeSB0aGUgSE1BQyBhbmQgdGltZXN0YW1wXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IGV4cGVjdGVkSG1hYyA9PT0gaG1hYyxcbiAgICAgIGV4cGVjdGVkSG1hYyxcbiAgICAgIHNpZ25hdHVyZVN1YmplY3QsXG4gICAgICBpc0luUmVzcG9uc2VWYWxpZGl0eVdpbmRvdyxcbiAgICAgIHZlcmlmaWNhdGlvblRpbWU6IG5vdyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHVzZWZ1bCBjb25zdGFudCB2YWx1ZXMgZnJvbSB0aGUgQml0R28gc2VydmVyLlxuICAgKiBUaGVzZSB2YWx1ZXMgZG8gY2hhbmdlIGluZnJlcXVlbnRseSwgc28gdGhleSBuZWVkIHRvIGJlIGZldGNoZWQsXG4gICAqIGJ1dCBhcmUgdW5saWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYSBCaXRHbyBvYmplY3QsXG4gICAqIHNvIHRoZXkgY2FuIHNhZmVseSBjYWNoZWQuXG4gICAqL1xuICBhc3luYyBmZXRjaENvbnN0YW50cygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGVudiA9IHRoaXMuZ2V0RW52KCk7XG5cbiAgICBpZiAoIUJpdEdvQVBJLl9jb25zdGFudHMpIHtcbiAgICAgIEJpdEdvQVBJLl9jb25zdGFudHMgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlKSB7XG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlID0ge307XG4gICAgfVxuXG4gICAgaWYgKEJpdEdvQVBJLl9jb25zdGFudHNbZW52XSAmJiBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlW2Vudl0gJiYgbmV3IERhdGUoKSA8IEJpdEdvQVBJLl9jb25zdGFudHNFeHBpcmVbZW52XSkge1xuICAgICAgcmV0dXJuIEJpdEdvQVBJLl9jb25zdGFudHNbZW52XTtcbiAgICB9XG5cbiAgICAvLyBjbGllbnQgY29uc3RhbnRzIGNhbGwgY2Fubm90IGJlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIG5vcm1hbCBITUFDIHZhbGlkYXRpb25cbiAgICAvLyBzY2hlbWUsIHNvIHdlIG5lZWQgdG8gdXNlIGEgcmF3IHN1cGVyYWdlbnQgaW5zdGFuY2UgdG8gZG8gdGhpcyByZXF1ZXN0LlxuICAgIC8vIFByb3h5IHNldHRpbmdzIG11c3Qgc3RpbGwgYmUgcmVzcGVjdGVkIGhvd2V2ZXJcbiAgICBjb25zdCByZXN1bHRQcm9taXNlID0gdGhpcy5nZXRBZ2VudFJlcXVlc3QoJ2dldCcsIHRoaXMudXJsKCcvY2xpZW50L2NvbnN0YW50cycpKTtcbiAgICByZXN1bHRQcm9taXNlLnNldCgnQml0R28tU0RLLVZlcnNpb24nLCB0aGlzLl92ZXJzaW9uKTtcbiAgICBpZiAodGhpcy5fcHJveHkgJiYgZW5hYmxlUHJveHlBZ2VudCkge1xuICAgICAgY29uc3QgcHJveHlVcmw6IHN0cmluZyA9IHRoaXMuX3Byb3h5O1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgcHJveHlBZ2VudE1vZHVsZS5Qcm94eUFnZW50KHtcbiAgICAgICAgZ2V0UHJveHlGb3JVcmw6ICgpID0+IHByb3h5VXJsLFxuICAgICAgfSk7XG4gICAgICBpZiAoYWdlbnQpIHtcbiAgICAgICAgcmVzdWx0UHJvbWlzZS5hZ2VudChhZ2VudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFByb21pc2U7XG4gICAgQml0R29BUEkuX2NvbnN0YW50c1tlbnZdID0gcmVzdWx0LmJvZHkuY29uc3RhbnRzO1xuXG4gICAgaWYgKHJlc3VsdC5ib2R5Py50dGwgJiYgdHlwZW9mIHJlc3VsdC5ib2R5Py50dGwgPT09ICdudW1iZXInKSB7XG4gICAgICBCaXRHb0FQSS5fY29uc3RhbnRzRXhwaXJlW2Vudl0gPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSArIChyZXN1bHQuYm9keS50dGwgYXMgbnVtYmVyKSAqIDEwMDApO1xuICAgIH1cblxuICAgIHJldHVybiBCaXRHb0FQSS5fY29uc3RhbnRzW2Vudl07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdXJsIGZvciBjYWxsaW5nIEJpdEdvIHBsYXRmb3JtIEFQSXNcbiAgICogQHBhcmFtIHBhdGhcbiAgICogQHBhcmFtIHZlcnNpb25cbiAgICovXG4gIHVybChwYXRoOiBzdHJpbmcsIHZlcnNpb24gPSAxKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlVXJsID0gdmVyc2lvbiA9PT0gMiA/IHRoaXMuX2Jhc2VBcGlVcmxWMiA6IHRoaXMuX2Jhc2VBcGlVcmw7XG4gICAgcmV0dXJuIGJhc2VVcmwgKyBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHVybCBmb3IgY2FsbGluZyBCaXRHbyBtaWNyb3NlcnZpY2UgQVBJc1xuICAgKi9cbiAgbWljcm9zZXJ2aWNlc1VybChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9iYXNlVXJsICsgcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2ZXJzaW9uIG9mIHRoZSBCaXRHb0pTIHBhY2thZ2VcbiAgICovXG4gIHZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0IGNvbm5lY3Rpdml0eSB0byB0aGUgc2VydmVyXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIHBpbmcoeyByZXFJZCB9OiBQaW5nT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAocmVxSWQpIHtcbiAgICAgIHRoaXMuX3JlcUlkID0gcmVxSWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvcGluZycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSByZXF1ZXN0IHRyYWNlciB0byBwcm92aWRlIHJlcXVlc3QgSURzIGR1cmluZyBtdWx0aS1yZXF1ZXN0IHdvcmtmbG93c1xuICAgKi9cbiAgc2V0UmVxdWVzdFRyYWNlcihyZXFUcmFjZXI6IElSZXF1ZXN0VHJhY2VyKTogdm9pZCB7XG4gICAgaWYgKHJlcVRyYWNlcikge1xuICAgICAgdGhpcy5fcmVxSWQgPSByZXFUcmFjZXI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZW5jcnlwdCBsb2NhbGx5LlxuICAgKi9cbiAgZW5jcnlwdChwYXJhbXM6IEVuY3J5cHRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lucHV0JywgJ3Bhc3N3b3JkJ10sIFtdKTtcbiAgICBpZiAoIXBhcmFtcy5wYXNzd29yZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgZW5jcnlwdCB3aXRob3V0IHBhc3N3b3JkYCk7XG4gICAgfVxuICAgIHJldHVybiBlbmNyeXB0KHBhcmFtcy5wYXNzd29yZCwgcGFyYW1zLmlucHV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNyeXB0IGFuIGVuY3J5cHRlZCBzdHJpbmcgbG9jYWxseS5cbiAgICovXG4gIGRlY3J5cHQocGFyYW1zOiBEZWNyeXB0T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaW5wdXQnLCAncGFzc3dvcmQnXSwgW10pO1xuICAgIGlmICghcGFyYW1zLnBhc3N3b3JkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBkZWNyeXB0IHdpdGhvdXQgcGFzc3dvcmRgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBkZWNyeXB0KHBhcmFtcy5wYXNzd29yZCwgcGFyYW1zLmlucHV0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJjY206IHRhZyBkb2Vzbid0IG1hdGNoXCIpKSB7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgPSAncGFzc3dvcmQgZXJyb3IgLSAnICsgZXJyb3IubWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhpcyBCaXRHbyBvYmplY3QgdG8gYSBKU09OIG9iamVjdC5cbiAgICpcbiAgICogQ2F1dGlvbjogY29udGFpbnMgc2Vuc2l0aXZlIGRhdGFcbiAgICovXG4gIHRvSlNPTigpOiBCaXRHb0pzb24ge1xuICAgIHJldHVybiB7XG4gICAgICB1c2VyOiB0aGlzLl91c2VyLFxuICAgICAgdG9rZW46IHRoaXMuX3Rva2VuLFxuICAgICAgZXh0ZW5zaW9uS2V5OiB0aGlzLl9leHRlbnNpb25LZXkgPyB0aGlzLl9leHRlbnNpb25LZXkudG9XSUYoKSA6IHVuZGVmaW5lZCxcbiAgICAgIGVjZGhYcHJ2OiB0aGlzLl9lY2RoWHBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB1c2VyXG4gICAqL1xuICB1c2VyKCk6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGEgSlNPTiBzZXJpYWxpemVkIEJpdEdvIG9iamVjdC5cbiAgICpcbiAgICogT3ZlcndyaXRlcyB0aGUgcHJvcGVydGllcyBvbiB0aGUgY3VycmVudCBCaXRHbyBvYmplY3Qgd2l0aFxuICAgKiB0aG9zZSBvZiB0aGUgZGVzZXJpYWx6ZWQgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ganNvblxuICAgKi9cbiAgZnJvbUpTT04oanNvbjogQml0R29Kc29uKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlciA9IGpzb24udXNlcjtcbiAgICB0aGlzLl90b2tlbiA9IGpzb24udG9rZW47XG4gICAgdGhpcy5fZWNkaFhwcnYgPSBqc29uLmVjZGhYcHJ2O1xuICAgIGlmIChqc29uLmV4dGVuc2lvbktleSkge1xuICAgICAgY29uc3QgbmV0d29yayA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5nZXRFbnYoKV0ubmV0d29yaztcbiAgICAgIHRoaXMuX2V4dGVuc2lvbktleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYoXG4gICAgICAgIGpzb24uZXh0ZW5zaW9uS2V5LFxuICAgICAgICB1dHhvbGliLm5ldHdvcmtzW25ldHdvcmtdIGFzIHV0eG9saWIuQml0Y29pbkpTTmV0d29ya1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGUgdXNlcm5hbWUsIHBhc3N3b3JkIGFuZCBvdHAgaW50byBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgdXNlcm5hbWUgYW5kIGhhc2hlZCBwYXNzd29yZCwgcmVhZHkgdG9cbiAgICogc2VuZCB0byBiaXRnbyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqL1xuICBwcmVwcm9jZXNzQXV0aGVudGljYXRpb25QYXJhbXMoe1xuICAgIHVzZXJuYW1lLFxuICAgIHBhc3N3b3JkLFxuICAgIG90cCxcbiAgICBmb3JjZVNNUyxcbiAgICBleHRlbnNpYmxlLFxuICAgIHRydXN0LFxuICB9OiBBdXRoZW50aWNhdGVPcHRpb25zKTogUHJvY2Vzc2VkQXV0aGVudGljYXRpb25PcHRpb25zIHtcbiAgICBpZiAoIV8uaXNTdHJpbmcodXNlcm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyB1c2VybmFtZScpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIHBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbG93ZXJOYW1lID0gdXNlcm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHBhc3N3b3JkIEhNQUMgc28gd2UgZG9uJ3Qgc2VuZCBjbGVhci10ZXh0IHBhc3N3b3Jkc1xuICAgIGNvbnN0IGhtYWNQYXNzd29yZCA9IHRoaXMuY2FsY3VsYXRlSE1BQyhsb3dlck5hbWUsIHBhc3N3b3JkKTtcblxuICAgIGNvbnN0IGF1dGhQYXJhbXM6IFByb2Nlc3NlZEF1dGhlbnRpY2F0aW9uT3B0aW9ucyA9IHtcbiAgICAgIGVtYWlsOiBsb3dlck5hbWUsXG4gICAgICBwYXNzd29yZDogaG1hY1Bhc3N3b3JkLFxuICAgICAgZm9yY2VTTVM6ICEhZm9yY2VTTVMsXG4gICAgfTtcblxuICAgIGlmIChvdHApIHtcbiAgICAgIGF1dGhQYXJhbXMub3RwID0gb3RwO1xuICAgICAgaWYgKHRydXN0KSB7XG4gICAgICAgIGF1dGhQYXJhbXMudHJ1c3QgPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleHRlbnNpYmxlKSB7XG4gICAgICB0aGlzLl9leHRlbnNpb25LZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gICAgICBhdXRoUGFyYW1zLmV4dGVuc2libGUgPSB0cnVlO1xuICAgICAgYXV0aFBhcmFtcy5leHRlbnNpb25BZGRyZXNzID0gZ2V0QWRkcmVzc1AyUEtIKHRoaXMuX2V4dGVuc2lvbktleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF1dGhQYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgbWV0aG9kIGZvciBhY3RpdmF0aW5nIGFuIGFjY2VzcyB0b2tlbi5cbiAgICovXG4gIGF1dGhlbnRpY2F0ZVdpdGhBY2Nlc3NUb2tlbih7IGFjY2Vzc1Rva2VuIH06IEFjY2Vzc1Rva2VuT3B0aW9ucyk6IHZvaWQge1xuICAgIGRlYnVnKCdub3cgYXV0aGVudGljYXRpbmcgd2l0aCBhY2Nlc3MgdG9rZW4gJXMnLCBhY2Nlc3NUb2tlbi5zdWJzdHJpbmcoMCwgOCkpO1xuICAgIHRoaXMuX3Rva2VuID0gYWNjZXNzVG9rZW47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBFQ0RIIGtleWNoYWluIGZvciB0aGUgdXNlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2luUGFzc3dvcmQgLSBUaGUgdXNlcidzIGxvZ2luIHBhc3N3b3JkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG5ldyBFQ0RIIGtleWNoYWluIGRhdGEuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGVyZSBpcyBhbiBpc3N1ZSBjcmVhdGluZyB0aGUga2V5Y2hhaW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlVXNlckVjZGhLZXljaGFpbihsb2dpblBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGtleURhdGEgPSB0aGlzLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgIGNvbnN0IGhkTm9kZSA9IGJpdGNvaW4uSEROb2RlLmZyb21CYXNlNTgoa2V5RGF0YS54cHJ2KTtcblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgbmV3IEVDREgga2V5Y2hhaW4gdG8gdGhlIHVzZXIncyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtQcm9taXNlPGFueT59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgbmV3IEVDREgga2V5Y2hhaW4uXG4gICAgICovXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMua2V5Y2hhaW5zKCkuYWRkKHtcbiAgICAgIHNvdXJjZTogJ2VjZGgnLFxuICAgICAgeHB1YjogaGROb2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgIGVuY3J5cHRlZFhwcnY6IHRoaXMuZW5jcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBsb2dpblBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogaGROb2RlLnRvQmFzZTU4KCksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSB1c2VyJ3Mgc2V0dGluZ3Mgd2l0aCB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIHVwZGF0ZSB0aGUgdXNlcidzIHNldHRpbmdzIHdpdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGVyZSBpcyBhbiBpc3N1ZSB1cGRhdGluZyB0aGUgdXNlcidzIHNldHRpbmdzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVVc2VyU2V0dGluZ3MocGFyYW1zOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnB1dCh0aGlzLnVybCgnL3VzZXIvc2V0dGluZ3MnLCAyKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhhdCB0aGUgdXNlcidzIEVDREgga2V5Y2hhaW4gaXMgY3JlYXRlZCBmb3Igd2FsbGV0IHNoYXJpbmcgYW5kIFRTUyB3YWxsZXRzLlxuICAgKiBJZiB0aGUga2V5Y2hhaW4gZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIHVzZXIncyBzZXR0aW5ncyB3aWxsIGJlIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpblBhc3N3b3JkIC0gVGhlIHVzZXIncyBsb2dpbiBwYXNzd29yZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB1c2VyJ3Mgc2V0dGluZ3MgZW5zdXJpbmcgd2UgaGF2ZSB0aGUgZWNkaEtleWNoYWluIGluIHRoZXJlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlcmUgaXMgYW4gaXNzdWUgY3JlYXRpbmcgdGhlIGtleWNoYWluIG9yIHVwZGF0aW5nIHRoZSB1c2VyJ3Mgc2V0dGluZ3MuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVVzZXJFY2RoS2V5Y2hhaW5Jc0NyZWF0ZWQobG9naW5QYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHVzZXIncyBjdXJyZW50IHNldHRpbmdzLlxuICAgICAqL1xuICAgIGNvbnN0IHVzZXJTZXR0aW5ncyA9IGF3YWl0IHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9zZXR0aW5ncycpKS5yZXN1bHQoKTtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdXNlcidzIEVDREgga2V5Y2hhaW4gZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBhIG5ldyBrZXljaGFpbiBhbmQgdXBkYXRlIHRoZSB1c2VyJ3Mgc2V0dGluZ3MuXG4gICAgICovXG4gICAgaWYgKCF1c2VyU2V0dGluZ3Muc2V0dGluZ3MuZWNkaEtleWNoYWluKSB7XG4gICAgICBjb25zdCBuZXdLZXljaGFpbiA9IGF3YWl0IHRoaXMuY3JlYXRlVXNlckVjZGhLZXljaGFpbihsb2dpblBhc3N3b3JkKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlclNldHRpbmdzKHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICBlY2RoS2V5Y2hhaW46IG5ld0tleWNoYWluLnhwdWIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlIHRoZSB1c2VyJ3Mgc2V0dGluZ3Mgb2JqZWN0IHdpdGggdGhlIG5ldyBFQ0RIIGtleWNoYWluLlxuICAgICAgICovXG4gICAgICB1c2VyU2V0dGluZ3Muc2V0dGluZ3MuZWNkaEtleWNoYWluID0gbmV3S2V5Y2hhaW4ueHB1YjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSB1c2VyJ3MgRUNESCBrZXljaGFpbiBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICByZXR1cm4gdXNlclNldHRpbmdzLnNldHRpbmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ2luIHRvIHRoZSBiaXRnbyBwbGF0Zm9ybS5cbiAgICovXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShwYXJhbXM6IEF1dGhlbnRpY2F0ZU9wdGlvbnMpOiBQcm9taXNlPExvZ2luUmVzcG9uc2UgfCBhbnk+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBvYmplY3QgcGFyYW1zJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucGFzc3dvcmQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIHBhc3N3b3JkJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcmNlVjFBdXRoID0gISFwYXJhbXMuZm9yY2VWMUF1dGg7XG4gICAgICBjb25zdCBhdXRoUGFyYW1zID0gdGhpcy5wcmVwcm9jZXNzQXV0aGVudGljYXRpb25QYXJhbXMocGFyYW1zKTtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gcGFyYW1zLnBhc3N3b3JkO1xuXG4gICAgICBpZiAodGhpcy5fdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignYWxyZWFkeSBsb2dnZWQgaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aFVybCA9IHRoaXMubWljcm9zZXJ2aWNlc1VybCgnL2FwaS9hdXRoL3YxL3Nlc3Npb24nKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBvc3QoYXV0aFVybCk7XG5cbiAgICAgIGlmIChmb3JjZVYxQXV0aCkge1xuICAgICAgICByZXF1ZXN0LmZvcmNlVjFBdXRoID0gdHJ1ZTtcbiAgICAgICAgLy8gdGVsbCB0aGUgc2VydmVyIHRoYXQgdGhlIGNsaWVudCB3YXMgZm9yY2VkIHRvIGRvd25ncmFkZSB0aGUgYXV0aGVudGljYXRpb24gcHJvdG9jb2xcbiAgICAgICAgYXV0aFBhcmFtcy5mb3JjZVYxQXV0aCA9IHRydWU7XG4gICAgICAgIGRlYnVnKCdmb3JjaW5nIHYxIGF1dGggZm9yIGNhbGwgdG8gYXV0aGVudGljYXRlJyk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZTogc3VwZXJhZ2VudC5SZXNwb25zZSA9IGF3YWl0IHJlcXVlc3Quc2VuZChhdXRoUGFyYW1zKTtcbiAgICAgIC8vIGV4dHJhY3QgYm9keSBhbmQgdXNlciBpbmZvcm1hdGlvblxuICAgICAgY29uc3QgYm9keSA9IHJlc3BvbnNlLmJvZHk7XG4gICAgICB0aGlzLl91c2VyID0gYm9keS51c2VyO1xuXG4gICAgICBpZiAoYm9keS5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdGhpcy5fdG9rZW4gPSBib2R5LmFjY2Vzc190b2tlbjtcbiAgICAgICAgLy8gaWYgdGhlIGRvd25ncmFkZSB3YXMgZm9yY2VkLCBhZGRpbmcgYSB3YXJuaW5nIG1lc3NhZ2UgbWlnaHQgYmUgcHJ1ZGVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2hlY2sgdGhlIHByZXNlbmNlIG9mIGFuIGVuY3J5cHRlZCBFQ0RIIHhwcnZcbiAgICAgICAgLy8gaWYgbm90IHByZXNlbnQsIGxlZ2FjeSBhY2NvdW50XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFhwcnYgPSBib2R5LmVuY3J5cHRlZEVDREhYcHJ2O1xuICAgICAgICBpZiAoIWVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleWNoYWluIG5lZWRzIGVuY3J5cHRlZFhwcnYgcHJvcGVydHknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGV0YWlscyA9IHRoaXMuaGFuZGxlVG9rZW5Jc3N1YW5jZShyZXNwb25zZS5ib2R5LCBwYXNzd29yZCk7XG4gICAgICAgIHRoaXMuX3Rva2VuID0gcmVzcG9uc2VEZXRhaWxzLnRva2VuO1xuICAgICAgICB0aGlzLl9lY2RoWHBydiA9IHJlc3BvbnNlRGV0YWlscy5lY2RoWHBydjtcblxuICAgICAgICAvLyB2ZXJpZnkgdGhlIHJlc3BvbnNlJ3MgYXV0aGVudGljaXR5XG4gICAgICAgIHZlcmlmeVJlc3BvbnNlKHRoaXMsIHJlc3BvbnNlRGV0YWlscy50b2tlbiwgJ3Bvc3QnLCByZXF1ZXN0LCByZXNwb25zZSk7XG5cbiAgICAgICAgLy8gYWRkIHRoZSByZW1haW5pbmcgY29tcG9uZW50IGZvciBlYXNpZXIgYWNjZXNzXG4gICAgICAgIHJlc3BvbnNlLmJvZHkuYWNjZXNzX3Rva2VuID0gdGhpcy5fdG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXJTZXR0aW5ncyA9IHBhcmFtcy5lbnN1cmVFY2RoS2V5Y2hhaW4gPyBhd2FpdCB0aGlzLmVuc3VyZVVzZXJFY2RoS2V5Y2hhaW5Jc0NyZWF0ZWQocGFzc3dvcmQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHVzZXJTZXR0aW5ncz8uZWNkaEtleWNoYWluKSB7XG4gICAgICAgIHJlc3BvbnNlLmJvZHkudXNlci5lY2RoS2V5Y2hhaW4gPSB1c2VyU2V0dGluZ3MuZWNkaEtleWNoYWluO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8TG9naW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlc3BvbnNlQm9keSBSZXNwb25zZSBib2R5IG9iamVjdFxuICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgZm9yIHRoZSBzeW1tZXRyaWMgZGVjcnlwdGlvblxuICAgKi9cbiAgaGFuZGxlVG9rZW5Jc3N1YW5jZShyZXNwb25zZUJvZHk6IFRva2VuSXNzdWFuY2VSZXNwb25zZSwgcGFzc3dvcmQ/OiBzdHJpbmcpOiBUb2tlbklzc3VhbmNlIHtcbiAgICAvLyBtYWtlIHN1cmUgdGhlIHJlc3BvbnNlIGJvZHkgY29udGFpbnMgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzXG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHJlc3BvbnNlQm9keSwgWydkZXJpdmF0aW9uUGF0aCddLCBbJ2VuY3J5cHRlZEVDREhYcHJ2J10pO1xuXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLl9lbnY7XG4gICAgY29uc3QgZW52aXJvbm1lbnRDb25maWcgPSBjb21tb24uRW52aXJvbm1lbnRzW2Vudmlyb25tZW50XTtcbiAgICBjb25zdCBzZXJ2ZXJYcHViID0gZW52aXJvbm1lbnRDb25maWcuc2VydmVyWHB1YjtcbiAgICBsZXQgZWNkaFhwcnYgPSB0aGlzLl9lY2RoWHBydjtcbiAgICBpZiAoIWVjZGhYcHJ2KSB7XG4gICAgICBpZiAoIXBhc3N3b3JkIHx8ICFyZXNwb25zZUJvZHkuZW5jcnlwdGVkRUNESFhwcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlY2RoWHBydiBwcm9wZXJ0eSBtdXN0IGJlIHNldCBvciBwYXNzd29yZCBhbmQgZW5jcnlwdGVkIGVuY3J5cHRlZEVDREhYcHJ2IG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGVjZGhYcHJ2ID0gdGhpcy5kZWNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcmVzcG9uc2VCb2R5LmVuY3J5cHRlZEVDREhYcHJ2LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGUuZXJyb3JDb2RlID0gJ2VjZGhfeHBydl9kZWNyeXB0aW9uX2ZhaWx1cmUnO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWRFQ0RIWHBydi4nKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgSEROb2RlIG9iamVjdHMgZm9yIGNsaWVudCdzIHhwcnYgYW5kIHNlcnZlcidzIHhwdWJcbiAgICBjb25zdCBjbGllbnRIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGVjZGhYcHJ2KTtcbiAgICBjb25zdCBzZXJ2ZXJIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KHNlcnZlclhwdWIpO1xuXG4gICAgLy8gQklQMzIgZGVyaXZhdGlvbiBwYXRoIGlzIGFwcGxpZWQgdG8gYm90aCBjbGllbnQgYW5kIHNlcnZlciBtYXN0ZXIga2V5c1xuICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gc2FuaXRpemVMZWdhY3lQYXRoKHJlc3BvbnNlQm9keS5kZXJpdmF0aW9uUGF0aCk7XG4gICAgY29uc3QgY2xpZW50RGVyaXZlZE5vZGUgPSBjbGllbnRIRE5vZGUuZGVyaXZlUGF0aChkZXJpdmF0aW9uUGF0aCk7XG4gICAgY29uc3Qgc2VydmVyRGVyaXZlZE5vZGUgPSBzZXJ2ZXJIRE5vZGUuZGVyaXZlUGF0aChkZXJpdmF0aW9uUGF0aCk7XG5cbiAgICBjb25zdCBwdWJsaWNLZXkgPSBzZXJ2ZXJEZXJpdmVkTm9kZS5wdWJsaWNLZXk7XG4gICAgY29uc3Qgc2VjcmV0S2V5ID0gY2xpZW50RGVyaXZlZE5vZGUucHJpdmF0ZUtleTtcbiAgICBpZiAoIXNlY3JldEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBjbGllbnQgcHJpdmF0ZSBLZXknKTtcbiAgICB9XG4gICAgY29uc3Qgc2VjcmV0ID0gQnVmZmVyLmZyb20oXG4gICAgICAvLyBGSVhNRShCRy0zNDM4Nik6IHdlIHNob3VsZCB1c2UgYHNlY3AyNTZrMS5lY2RoKClgIGluIHRoZSBmdXR1cmVcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgc2VlIGRpc2N1c3Npb24gaGVyZSBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi1jb3JlL3NlY3AyNTZrMS9pc3N1ZXMvMzUyXG4gICAgICBzZWNwMjU2azEucHVibGljS2V5VHdlYWtNdWwocHVibGljS2V5LCBzZWNyZXRLZXkpXG4gICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAvLyBkZWNyeXB0IHRva2VuIHdpdGggc3ltbWV0cmljIEVDREgga2V5XG4gICAgbGV0IHJlc3BvbnNlOiBUb2tlbklzc3VhbmNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IHtcbiAgICAgICAgdG9rZW46IHRoaXMuZGVjcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHJlc3BvbnNlQm9keS5lbmNyeXB0ZWRUb2tlbixcbiAgICAgICAgICBwYXNzd29yZDogc2VjcmV0LFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZS5lcnJvckNvZGUgPSAndG9rZW5fZGVjcnlwdGlvbl9mYWlsdXJlJztcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWNyeXB0IHRva2VuLicpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9lY2RoWHBydikge1xuICAgICAgcmVzcG9uc2UuZWNkaFhwcnYgPSBlY2RoWHBydjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqL1xuICB2ZXJpZnlQYXNzd29yZChwYXJhbXM6IFZlcmlmeVBhc3N3b3JkT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXNzd29yZCcpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdXNlciB8fCAhdGhpcy5fdXNlci51c2VybmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBjdXJyZW50IHVzZXInKTtcbiAgICB9XG4gICAgY29uc3QgaG1hY1Bhc3N3b3JkID0gdGhpcy5jYWxjdWxhdGVITUFDKHRoaXMuX3VzZXIudXNlcm5hbWUsIHBhcmFtcy5wYXNzd29yZCk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci92ZXJpZnlwYXNzd29yZCcpKS5zZW5kKHsgcGFzc3dvcmQ6IGhtYWNQYXNzd29yZCB9KS5yZXN1bHQoJ3ZhbGlkJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgb3V0IGFsbCBzdGF0ZSBmcm9tIHRoaXMgQml0R28gb2JqZWN0LCBlZmZlY3RpdmVseSBsb2dnaW5nIG91dCB0aGUgY3VycmVudCB1c2VyLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gVE9ETzogYXJlIHRoZXJlIGFueSBvdGhlciBmaWVsZHMgd2hpY2ggc2hvdWxkIGJlIGNsZWFyZWQ/XG4gICAgdGhpcy5fdXNlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl90b2tlbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZWNkaFhwcnYgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlIHJlZnJlc2ggdG9rZW4gdG8gZ2V0IG5ldyBhY2Nlc3MgdG9rZW4uXG4gICAqIElmIHRoZSByZWZyZXNoIHRva2VuIGlzIG51bGwvZGVmaW5lZCwgdGhlbiB3ZSB1c2UgdGhlIHN0b3JlZCB0b2tlbiBmcm9tIGF1dGhcbiAgICovXG4gIGFzeW5jIHJlZnJlc2hUb2tlbihwYXJhbXM6IHsgcmVmcmVzaFRva2VuPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsncmVmcmVzaFRva2VuJ10pO1xuXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gcGFyYW1zLnJlZnJlc2hUb2tlbiB8fCB0aGlzLl9yZWZyZXNoVG9rZW47XG5cbiAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgcmVmcmVzaCB0b2tlbiBvciBoYXZlIGF1dGhlbnRpY2F0ZWQgd2l0aCBPYXV0aCBiZWZvcmUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2NsaWVudElkIHx8ICF0aGlzLl9jbGllbnRTZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBjbGllbnQgaWQgYW5kIHNlY3JldCBzZXQgZmlyc3QgdG8gdXNlIHRoaXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gYXdhaXQgdGhpcy5wb3N0KHRoaXMuX2Jhc2VVcmwgKyAnL29hdXRoL3Rva2VuJylcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sXG4gICAgICAgIGNsaWVudF9pZDogdGhpcy5fY2xpZW50SWQsXG4gICAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMuX2NsaWVudFNlY3JldCxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gICAgdGhpcy5fdG9rZW4gPSBib2R5LmFjY2Vzc190b2tlbjtcbiAgICB0aGlzLl9yZWZyZXNoVG9rZW4gPSBib2R5LnJlZnJlc2hfdG9rZW47XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogbGlzdEFjY2Vzc1Rva2Vuc1xuICAgKiBHZXQgaW5mb3JtYXRpb24gb24gYWxsIG9mIHRoZSBCaXRHbyBhY2Nlc3MgdG9rZW5zIG9uIHRoZSB1c2VyXG4gICAqIEByZXR1cm4ge1xuICAgKiAgaWQ6IDxpZCBvZiB0aGUgdG9rZW4+XG4gICAqICBsYWJlbDogPHRoZSB1c2VyLXByb3ZpZGVkIGxhYmVsIGZvciB0aGlzIHRva2VuPlxuICAgKiAgdXNlcjogPGlkIG9mIHRoZSB1c2VyIG9uIHRoZSB0b2tlbj5cbiAgICogIGVudGVycHJpc2UgPGlkIG9mIHRoZSBlbnRlcnByaXNlIHRoaXMgdG9rZW4gaXMgdmFsaWQgZm9yPlxuICAgKiAgY2xpZW50OiA8dGhlIGF1dGggY2xpZW50IHRoYXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvPlxuICAgKiAgc2NvcGU6IDxsaXN0IG9mIGFsbG93ZWQgT0F1dGggc2NvcGUgdmFsdWVzPlxuICAgKiAgY3JlYXRlZDogPGRhdGUgdGhlIHRva2VuIHdhcyBjcmVhdGVkPlxuICAgKiAgZXhwaXJlczogPGRhdGUgdGhlIHRva2VuIHdpbGwgZXhwaXJlPlxuICAgKiAgb3JpZ2luOiA8dGhlIG9yaWdpbiBmb3Igd2hpY2ggdGhpcyB0b2tlbiBpcyB2YWxpZD5cbiAgICogIGlzRXh0ZW5zaWJsZTogPGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdG9rZW4gY2FuIGJlIGV4dGVuZGVkPlxuICAgKiAgZXh0ZW5zaW9uQWRkcmVzczogPGFkZHJlc3Mgd2hvc2UgcHJpdmF0ZSBrZXkncyBzaWduYXR1cmUgaXMgbmVjZXNzYXJ5IGZvciBleHRlbnNpb25zPlxuICAgKiAgdW5sb2NrOiA8aW5mbyBmb3IgYWN0aW9ucyB0aGF0IHJlcXVpcmUgYW4gdW5sb2NrIGJlZm9yZSBmaXJpbmc+XG4gICAqIH1cbiAgICovXG4gIGFzeW5jIGxpc3RBY2Nlc3NUb2tlbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL2FjY2Vzc3Rva2VuJykpLnNlbmQoKS5yZXN1bHQoJ2FjY2Vzc1Rva2VucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZEFjY2Vzc1Rva2VuXG4gICAqIEFkZCBhIEJpdEdvIEFQSSBBY2Nlc3MgVG9rZW4gdG8gdGhlIGN1cnJlbnQgdXNlciBhY2NvdW50XG4gICAqIEBwYXJhbSBwYXJhbXMge1xuICAgKiAgICBvdHA6IChyZXF1aXJlZCkgPHZhbGlkIG90cCBjb2RlPlxuICAgKiAgICBsYWJlbDogKHJlcXVpcmVkKSA8bGFiZWwgZm9yIHRoZSB0b2tlbj5cbiAgICogICAgZHVyYXRpb246IDxsZW5ndGggb2YgdGltZSBpbiBzZWNvbmRzIHRoZSB0b2tlbiB3aWxsIGJlIHZhbGlkIGZvcj5cbiAgICogICAgaXBSZXN0cmljdDogPGFycmF5IG9mIElQIGFkZHJlc3Mgc3RyaW5ncyB0byB3aGl0ZWxpc3Q+XG4gICAqICAgIHR4VmFsdWVMaW1pdDogPG51bWJlciBvZiBvdXRnb2luZyBzYXRvc2hpcyBhbGxvd2VkIG9uIHRoaXMgdG9rZW4+XG4gICAqICAgIHNjb3BlOiAocmVxdWlyZWQpIDxhdXRob3JpemF0aW9uIHNjb3BlIG9mIHRoZSByZXF1ZXN0ZWQgdG9rZW4+XG4gICAqIH1cbiAgICogQHJldHVybiB7XG4gICAqICAgIGlkOiA8aWQgb2YgdGhlIHRva2VuPlxuICAgKiAgICB0b2tlbjogPGFjY2VzcyB0b2tlbiBoZXggc3RyaW5nIHRvIGJlIHVzZWQgZm9yIEJpdEdvIEFQSSByZXF1ZXN0IHZlcmlmaWNhdGlvbj5cbiAgICogICAgbGFiZWw6IDx1c2VyLXByb3ZpZGVkIGxhYmVsIGZvciB0aGlzIHRva2VuPlxuICAgKiAgICB1c2VyOiA8aWQgb2YgdGhlIHVzZXIgb24gdGhlIHRva2VuPlxuICAgKiAgICBlbnRlcnByaXNlIDxpZCBvZiB0aGUgZW50ZXJwcmlzZSB0aGlzIHRva2VuIGlzIHZhbGlkIGZvcj5cbiAgICogICAgY2xpZW50OiA8dGhlIGF1dGggY2xpZW50IHRoYXQgdGhpcyB0b2tlbiBiZWxvbmdzIHRvPlxuICAgKiAgICBzY29wZTogPGxpc3Qgb2YgYWxsb3dlZCBPQXV0aCBzY29wZSB2YWx1ZXM+XG4gICAqICAgIGNyZWF0ZWQ6IDxkYXRlIHRoZSB0b2tlbiB3YXMgY3JlYXRlZD5cbiAgICogICAgZXhwaXJlczogPGRhdGUgdGhlIHRva2VuIHdpbGwgZXhwaXJlPlxuICAgKiAgICBvcmlnaW46IDx0aGUgb3JpZ2luIGZvciB3aGljaCB0aGlzIHRva2VuIGlzIHZhbGlkPlxuICAgKiAgICBpc0V4dGVuc2libGU6IDxmbGFnIGluZGljYXRpbmcgaWYgdGhlIHRva2VuIGNhbiBiZSBleHRlbmRlZD5cbiAgICogICAgZXh0ZW5zaW9uQWRkcmVzczogPGFkZHJlc3Mgd2hvc2UgcHJpdmF0ZSBrZXkncyBzaWduYXR1cmUgaXMgbmVjZXNzYXJ5IGZvciBleHRlbnNpb25zPlxuICAgKiAgICB1bmxvY2s6IDxpbmZvIGZvciBhY3Rpb25zIHRoYXQgcmVxdWlyZSBhbiB1bmxvY2sgYmVmb3JlIGZpcmluZz5cbiAgICogfVxuICAgKi9cbiAgYXN5bmMgYWRkQWNjZXNzVG9rZW4ocGFyYW1zOiBBZGRBY2Nlc3NUb2tlbk9wdGlvbnMpOiBQcm9taXNlPEFkZEFjY2Vzc1Rva2VuUmVzcG9uc2U+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5sYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgbGFiZWwnKTtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgbm9uLXN0cmluZyBwYXJhbXNcbiAgICAgIGlmIChwYXJhbXMuZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikgfHwgcGFyYW1zLmR1cmF0aW9uIDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZHVyYXRpb24gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5pcFJlc3RyaWN0KSB7XG4gICAgICAgIGlmICghXy5pc0FycmF5KHBhcmFtcy5pcFJlc3RyaWN0KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaXBSZXN0cmljdCBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgXy5mb3JFYWNoKHBhcmFtcy5pcFJlc3RyaWN0LCAoaXBBZGRyKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGlwQWRkcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaXBSZXN0cmljdCBtdXN0IGJlIGFuIGFycmF5IG9mIElQIGFkZHJlc3Mgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR4VmFsdWVMaW1pdCkge1xuICAgICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnR4VmFsdWVMaW1pdCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4VmFsdWVMaW1pdCBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy50eFZhbHVlTGltaXQgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFZhbHVlTGltaXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5zY29wZSAmJiBwYXJhbXMuc2NvcGUubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuc2NvcGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzY29wZSBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzcGVjaWZ5IHNjb3BlIGZvciB0b2tlbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRoVXJsID0gdGhpcy5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL2F1dGgvdjEvYWNjZXNzdG9rZW4nKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBvc3QoYXV0aFVybCk7XG5cbiAgICAgIGlmICghdGhpcy5fZWNkaFhwcnYpIHtcbiAgICAgICAgLy8gd2l0aG91dCBhIHByaXZhdGUga2V5LCB0aGUgdXNlciBjYW5ub3QgZGVjcnlwdCB0aGUgbmV3IGFjY2VzcyB0b2tlbiB0aGUgc2VydmVyIHdpbGwgc2VuZFxuICAgICAgICByZXF1ZXN0LmZvcmNlVjFBdXRoID0gdHJ1ZTtcbiAgICAgICAgZGVidWcoJ2ZvcmNpbmcgdjEgYXV0aCBmb3IgYWRkaW5nIGFjY2VzcyB0b2tlbiB1c2luZyB0b2tlbiAlcycsIHRoaXMuX3Rva2VuPy5zdWJzdHIoMCwgOCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3Quc2VuZChwYXJhbXMpO1xuICAgICAgaWYgKHJlcXVlc3QuZm9yY2VWMUF1dGgpIHtcbiAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuYm9keS53YXJuaW5nID0gJ0EgcHJvdG9jb2wgZG93bmdyYWRlIGhhcyBvY2N1cnJlZCBiZWNhdXNlIHRoaXMgaXMgYSBsZWdhY3kgYWNjb3VudC4nO1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8QWRkQWNjZXNzVG9rZW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIHRoZSBzZXJ2ZXIncyByZXNwb25zZSBiZWZvcmUgcHJvY2VlZGluZyBhbnkgZnVydGhlclxuICAgICAgdmVyaWZ5UmVzcG9uc2UodGhpcywgdGhpcy5fdG9rZW4sICdwb3N0JywgcmVxdWVzdCwgcmVzcG9uc2UpO1xuXG4gICAgICBjb25zdCByZXNwb25zZURldGFpbHMgPSB0aGlzLmhhbmRsZVRva2VuSXNzdWFuY2UocmVzcG9uc2UuYm9keSk7XG4gICAgICByZXNwb25zZS5ib2R5LnRva2VuID0gcmVzcG9uc2VEZXRhaWxzLnRva2VuO1xuXG4gICAgICByZXR1cm4gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8QWRkQWNjZXNzVG9rZW5SZXNwb25zZT4oKShyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZXhwaXJlIHRpbWUgb2YgYW4gYWNjZXNzIHRva2VuIG1hdGNoaW5nIGVpdGhlciB0aGUgaWQgb3IgbGFiZWwgdG8gdGhlIGN1cnJlbnQgZGF0ZSwgZWZmZWN0aXZlbHkgZGVsZXRpbmcgaXRcbiAgICpcbiAgICogUGFyYW1zOlxuICAgKiBpZDogPGlkIG9mIHRoZSBhY2Nlc3MgdG9rZW4gdG8gYmUgZGVsZXRlZD5cbiAgICogbGFiZWw6IDxsYWJlbCBvZiB0aGUgYWNjZXNzIHRva2VuIHRvIGJlIGRlbGV0ZWQ+XG4gICAqXG4gICAqIFJldHVybnM6XG4gICAqIGlkOiA8aWQgb2YgdGhlIHRva2VuPlxuICAgKiBsYWJlbDogPHVzZXItcHJvdmlkZWQgbGFiZWwgZm9yIHRoaXMgdG9rZW4+XG4gICAqIHVzZXI6IDxpZCBvZiB0aGUgdXNlciBvbiB0aGUgdG9rZW4+XG4gICAqIGVudGVycHJpc2UgPGlkIG9mIHRoZSBlbnRlcnByaXNlIHRoaXMgdG9rZW4gaXMgdmFsaWQgZm9yPlxuICAgKiBjbGllbnQ6IDx0aGUgYXV0aCBjbGllbnQgdGhhdCB0aGlzIHRva2VuIGJlbG9uZ3MgdG8+XG4gICAqIHNjb3BlOiA8bGlzdCBvZiBhbGxvd2VkIE9BdXRoIHNjb3BlIHZhbHVlcz5cbiAgICogY3JlYXRlZDogPGRhdGUgdGhlIHRva2VuIHdhcyBjcmVhdGVkPlxuICAgKiBleHBpcmVzOiA8ZGF0ZSB0aGUgdG9rZW4gd2lsbCBleHBpcmU+XG4gICAqIG9yaWdpbjogPHRoZSBvcmlnaW4gZm9yIHdoaWNoIHRoaXMgdG9rZW4gaXMgdmFsaWQ+XG4gICAqIGlzRXh0ZW5zaWJsZTogPGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgdG9rZW4gY2FuIGJlIGV4dGVuZGVkPlxuICAgKiBleHRlbnNpb25BZGRyZXNzOiA8YWRkcmVzcyB3aG9zZSBwcml2YXRlIGtleSdzIHNpZ25hdHVyZSBpcyBuZSpjZXNzYXJ5IGZvciBleHRlbnNpb25zPlxuICAgKiB1bmxvY2s6IDxpbmZvIGZvciBhY3Rpb25zIHRoYXQgcmVxdWlyZSBhbiB1bmxvY2sgYmVmb3JlIGZpcmluZz5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQWNjZXNzVG9rZW4oeyBpZCwgbGFiZWwgfTogUmVtb3ZlQWNjZXNzVG9rZW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoKCFpZCAmJiAhbGFiZWwpIHx8IChpZCAmJiBsYWJlbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIG9mIGlkIG9yIGxhYmVsJyk7XG4gICAgfVxuICAgIGlmIChpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsKHRoaXMudXJsKGAvdXNlci9hY2Nlc3N0b2tlbi8ke2lkfWApKVxuICAgICAgICAuc2VuZCgpXG4gICAgICAgIC5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCB0aGlzLmxpc3RBY2Nlc3NUb2tlbnMoKTtcblxuICAgIGlmICghdG9rZW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHdpdGggdGhpcyBsYWJlbCBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoaW5nVG9rZW5zID0gXy5maWx0ZXIodG9rZW5zLCB7IGxhYmVsIH0pO1xuICAgIGlmIChtYXRjaGluZ1Rva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FtYmlndW91cyBjYWxsOiBtdWx0aXBsZSB0b2tlbnMgbWF0Y2hpbmcgdGhpcyBsYWJlbCcpO1xuICAgIH1cbiAgICBpZiAobWF0Y2hpbmdUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHdpdGggdGhpcyBsYWJlbCBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlbCh0aGlzLnVybChgL3VzZXIvYWNjZXNzdG9rZW4vJHttYXRjaGluZ1Rva2Vuc1swXS5pZH1gKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHJhbmRvbSBwYXNzd29yZFxuICAgKiBAcGFyYW0gICB7TnVtYmVyfSBudW1Xb3JkcyAgICAgTnVtYmVyIG9mIDMyLWJpdCB3b3Jkc1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSAgICAgICAgICBiYXNlNTggcmFuZG9tIHBhc3N3b3JkXG4gICAqL1xuICBnZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKG51bVdvcmRzID0gNSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdlbmVyYXRlUmFuZG9tUGFzc3dvcmQobnVtV29yZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBvZiBCaXRHb1xuICAgKi9cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL2xvZ291dCcpKS5yZXN1bHQoKTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB1c2VyIGJ5IElEIChuYW1lL2VtYWlsIG9ubHkpXG4gICAqIEBwYXJhbSBpZFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcih7IGlkIH06IEdldFVzZXJPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNTdHJpbmcoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHN0cmluZyBpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoYC91c2VyLyR7aWR9YCkpLnJlc3VsdCgndXNlcicpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgbG9nZ2VkIGluIHVzZXJcbiAgICovXG4gIGFzeW5jIG1lKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VXNlcih7IGlkOiAnbWUnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubG9jayB0aGUgc2Vzc2lvbiBieSBwcm92aWRpbmcgT1RQXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvdHAgUmVxdWlyZWQgT1RQIGNvZGUgZm9yIHRoZSBhY2NvdW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gRGVzaXJlZCBkdXJhdGlvbiBvZiB0aGUgdW5sb2NrIGluIHNlY29uZHMgKGRlZmF1bHQ9NjAwLCBtYXg9MzYwMCkuXG4gICAqL1xuICBhc3luYyB1bmxvY2soeyBvdHAsIGR1cmF0aW9uIH06IFVubG9ja09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChvdHAgJiYgIV8uaXNTdHJpbmcob3RwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgb3IgdW5kZWZpbmVkIG90cCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci91bmxvY2snKSkuc2VuZCh7IG90cCwgZHVyYXRpb24gfSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9jayB0aGUgc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgbG9jaygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL2xvY2snKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICovXG4gIGFzeW5jIHNlc3Npb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy91c2VyL3Nlc3Npb24nKSkucmVzdWx0KCdzZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhIHB1c2gvc21zIGZvciB0aGUgT1RQIGNvZGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuZm9yY2VTTVMgSWYgc2V0IHRvIHRydWUsIHdpbGwgdXNlIFNNUyB0byBzZW5kIHRoZSBPVFAgdG8gdGhlIHVzZXIgZXZlbiBpZiB0aGV5IGhhdmUgb3RoZXIgMkZBIG1ldGhvZCBzZXQgdXAuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBzZW5kT1RQKHBhcmFtczogeyBmb3JjZVNNUz86IGJvb2xlYW4gfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci9zZW5kb3RwJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRlbmQgdG9rZW4sIHByb3ZpZGVkIHRoZSBjdXJyZW50IHRva2VuIGlzIGV4dGVuZGFibGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIGR1cmF0aW9uOiBkdXJhdGlvbiBpbiBzZWNvbmRzIGJ5IHdoaWNoIHRvIGV4dGVuZCB0aGUgdG9rZW4sIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHRpbWVcbiAgICovXG4gIGFzeW5jIGV4dGVuZFRva2VuKHBhcmFtczogRXh0ZW5kVG9rZW5PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5fZXh0ZW5zaW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgX2V4dGVuc2lvbktleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZHVyYXRpb24gPSBwYXJhbXMuZHVyYXRpb247XG4gICAgY29uc3QgbWVzc2FnZSA9IHRpbWVzdGFtcCArICd8JyArIHRoaXMuX3Rva2VuICsgJ3wnICsgZHVyYXRpb247XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IHRoaXMuX2V4dGVuc2lvbktleS5wcml2YXRlS2V5O1xuICAgIGlmICghcHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBwcml2YXRlS2V5IG9uIGV4dGVuc2lvbktleScpO1xuICAgIH1cbiAgICBjb25zdCBpc0NvbXByZXNzZWQgPSB0aGlzLl9leHRlbnNpb25LZXkuY29tcHJlc3NlZDtcbiAgICBjb25zdCBwcmVmaXggPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4ubWVzc2FnZVByZWZpeDtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBiaXRjb2luTWVzc2FnZS5zaWduKG1lc3NhZ2UsIHByaXZhdGVLZXksIGlzQ29tcHJlc3NlZCwgcHJlZml4KS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvdXNlci9leHRlbmR0b2tlbicpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnNldCgndGltZXN0YW1wJywgdGltZXN0YW1wLnRvU3RyaW5nKCkpXG4gICAgICAuc2V0KCdzaWduYXR1cmUnLCBzaWduYXR1cmUpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEga2V5IGZvciBzaGFyaW5nIGEgd2FsbGV0IHdpdGggYSB1c2VyXG4gICAqIEBwYXJhbSBlbWFpbCBlbWFpbCBvZiB1c2VyIHRvIHNoYXJlIHdhbGxldCB3aXRoXG4gICAqL1xuICBhc3luYyBnZXRTaGFyaW5nS2V5KHsgZW1haWwgfTogR2V0U2hhcmluZ0tleU9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhlbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGVtYWlsJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3VzZXIvc2hhcmluZ2tleScpKS5zZW5kKHsgZW1haWwgfSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlcnMgdGhhdCB3YW50IHRvIHNpZ24gd2l0aCBhIGtleSB3aWxsIHVzZSB0aGlzIGFwaSB0byBmZXRjaCB0aGUga2V5Y2hhaW4gYW5kIHRoZSBwYXRoLlxuICAgKiBVc2VycyB0aGF0IHdhbnQgdG8gdmVyaWZ5IGEgc2lnbmF0dXJlIHdpbGwgdXNlIHRoaXMgYXBpIHRvIGZldGNoIGFub3RoZXIgdXNlcnMgZWNkaCBwdWJrZXkuXG4gICAqIE5vdGU6IElmIHRoZSB1c2VyIGlkIGlzIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIGdldHRpbmcgdGhlIGN1cnJlbnQgdXNlcidzIGtleWNoYWluLlxuICAgKiBAcGFyYW0gYml0Z29cbiAgICogQHBhcmFtIGVudGVycHJpc2VJZFxuICAgKiBAcGFyYW0gdXNlcklkXG4gICAqL1xuICBhc3luYyBnZXRTaWduaW5nS2V5Rm9yVXNlcihlbnRlcnByaXNlSWQ6IHN0cmluZywgdXNlcklkPzogc3RyaW5nKTogUHJvbWlzZTxHZXRTaWduaW5nS2V5QXBpPiB7XG4gICAgY29uc3QgdXNlciA9IHVzZXJJZCA/PyAnbWUnO1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybChgL2VudGVycHJpc2UvJHtlbnRlcnByaXNlSWR9L3VzZXIvJHt1c2VyfS9zaWduaW5na2V5YCwgMikpXG4gICAgICAucXVlcnkoe30pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICovXG4gIGdldFZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgc2V0VmFsaWRhdGUodmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHZhbGlkYXRlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIHRoaXMuX3ZhbGlkYXRlID0gdmFsaWRhdGU7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBuZXcgY29pbiBpbnN0YW5jZSB3aXRoIGl0cyBidWlsZGVyIGZhY3RvcnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgY29pbiBuYW1lIGFzIGl0IHdhcyByZWdpc3RlcmVkIGluIEBiaXRnby1iZXRhL3N0YXRpY3NcbiAgICogQHBhcmFtIHtDb2luQ29uc3RydWN0b3J9IGNvaW4gdGhlIGJ1aWxkZXIgZmFjdG9yeSBjbGFzcyBmb3IgdGhhdCBjb2luXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyKG5hbWU6IHN0cmluZywgY29pbjogQ29pbkNvbnN0cnVjdG9yKTogdm9pZCB7XG4gICAgR2xvYmFsQ29pbkZhY3RvcnkucmVnaXN0ZXIobmFtZSwgY29pbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJpdGNvaW4gbWFya2V0IGRhdGFcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIG1hcmtldHMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX21hcmtldHMpIHtcbiAgICAgIHRoaXMuX21hcmtldHMgPSBuZXcgTWFya2V0cyh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX21hcmtldHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXRlc3QgYml0Y29pbiBwcmljZXNcbiAgICogKERlcHJlY2F0ZWQ6IFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlKSB1c2UgYGJpdGdvLm1hcmtldHMoKS5sYXRlc3QoKWBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIC8vIGNiLWNvbXBhdFxuICBhc3luYyBtYXJrZXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy9tYXJrZXQvbGF0ZXN0JykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtYXJrZXQgZGF0YSBmcm9tIHllc3RlcmRheVxuICAgKiAoRGVwcmVjYXRlZDogV2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUpIHVzZSBiaXRnby5tYXJrZXRzKCkueWVzdGVyZGF5KClcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHllc3RlcmRheSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL21hcmtldC95ZXN0ZXJkYXknKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBibG9ja2NoYWluIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGJsb2NrY2hhaW4oKTogYW55IHtcbiAgICBpZiAoIXRoaXMuX2Jsb2NrY2hhaW4pIHtcbiAgICAgIHRoaXMuX2Jsb2NrY2hhaW4gPSBuZXcgQmxvY2tjaGFpbih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Jsb2NrY2hhaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyJ3Mga2V5Y2hhaW5zIG9iamVjdC5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGtleWNoYWlucygpOiBhbnkge1xuICAgIGlmICghdGhpcy5fa2V5Y2hhaW5zKSB7XG4gICAgICB0aGlzLl9rZXljaGFpbnMgPSBuZXcgS2V5Y2hhaW5zKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fa2V5Y2hhaW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdHJhdmVsIHJ1bGUgb2JqZWN0XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICB0cmF2ZWxSdWxlKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl90cmF2ZWxSdWxlKSB7XG4gICAgICB0aGlzLl90cmF2ZWxSdWxlID0gbmV3IFRyYXZlbFJ1bGUodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90cmF2ZWxSdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlcidzIHdhbGxldHMgb2JqZWN0LlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgd2FsbGV0cygpOiBhbnkge1xuICAgIGlmICghdGhpcy5fd2FsbGV0cykge1xuICAgICAgdGhpcy5fd2FsbGV0cyA9IG5ldyBXYWxsZXRzKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGVuZGluZyBhcHByb3ZhbHMgdGhhdCBjYW4gYmUgYXBwcm92ZWQvIG9yIHJlamVjdGVkXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwZW5kaW5nQXBwcm92YWxzKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nQXBwcm92YWxzKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nQXBwcm92YWxzID0gbmV3IFBlbmRpbmdBcHByb3ZhbHModGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wZW5kaW5nQXBwcm92YWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFdhbGxldCBvYmplY3QsIGluaXRpYWxpemVkIHdpdGggdGhlIHdhbGxldCBwYXJhbXNcbiAgICogQ2FuIGJlIHVzZWQgdG8gcmVjb25zdGl0dXRlIGEgd2FsbGV0IGZyb20gY2FjaGVkIGRhdGFcbiAgICogQHBhcmFtIHdhbGxldFBhcmFtc1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgbmV3V2FsbGV0T2JqZWN0KHdhbGxldFBhcmFtcyk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcywgd2FsbGV0UGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWMSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIG1pbmVyIGZlZSBhbW91bnRzLCBnaXZlbiB0aGUgbnVtYmVyIGFuZFxuICAgKiB0eXBlIG9mIHRyYW5zYWN0aW9uIGlucHV0cywgYWxvbmcgd2l0aCBhIGZlZSByYXRlIGluIHNhdG9zaGlzIHBlciB2a0IuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgbmV3IGNvZGUuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybiB7YW55fVxuICAgKi9cbiAgYXN5bmMgY2FsY3VsYXRlTWluZXJGZWVJbmZvKHBhcmFtczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLmNhbGN1bGF0ZU1pbmVyRmVlSW5mbyhwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBhIEJpdGNvaW4gYWRkcmVzcyBpcyBhIHZhbGlkIGJhc2U1OCBhZGRyZXNzXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICB2ZXJpZnlBZGRyZXNzKHBhcmFtczogRGVwcmVjYXRlZFZlcmlmeUFkZHJlc3NPcHRpb25zID0ge30pOiBib29sZWFuIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgW10pO1xuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV0d29ya05hbWUgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLm5ldHdvcms7XG4gICAgY29uc3QgbmV0d29yayA9IHV0eG9saWIubmV0d29ya3NbbmV0d29ya05hbWVdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IHV0eG9saWIuYWRkcmVzc0Zvcm1hdC50b091dHB1dFNjcmlwdFRyeUZvcm1hdHMocGFyYW1zLmFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgcmV0dXJuIHBhcmFtcy5hZGRyZXNzID09PSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChzY3JpcHQsIG5ldHdvcmspO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3BsaXQgYSBzZWNyZXQgaW50byBzaGFyZHMgdXNpbmcgU2hhbWlyIFNlY3JldCBTaGFyaW5nLlxuICAgKiBAcGFyYW0gc2VlZCBBIGhleGFkZWNpbWFsIHNlY3JldCB0byBzcGxpdFxuICAgKiBAcGFyYW0gcGFzc3dvcmRzIEFuIGFycmF5IG9mIHRoZSBwYXNzd29yZHMgdXNlZCB0byBlbmNyeXB0IGVhY2ggc2hhcmVcbiAgICogQHBhcmFtIG0gVGhlIHRocmVzaG9sZCBudW1iZXIgb2Ygc2hhcmRzIG5lY2Vzc2FyeSB0byByZWNvbnN0aXR1dGUgdGhlIHNlY3JldFxuICAgKi9cbiAgc3BsaXRTZWNyZXQoeyBzZWVkLCBwYXNzd29yZHMsIG0gfTogU3BsaXRTZWNyZXRPcHRpb25zKTogU3BsaXRTZWNyZXQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXNzd29yZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3N3b3JkcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmICghXy5pc0ludGVnZXIobSkgfHwgbSA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMicpO1xuICAgIH1cblxuICAgIGlmIChwYXNzd29yZHMubGVuZ3RoIDwgbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXNzd29yZHMgYXJyYXkgbGVuZ3RoIGNhbm5vdCBiZSBsZXNzIHRoYW4gbScpO1xuICAgIH1cblxuICAgIGNvbnN0IG4gPSBwYXNzd29yZHMubGVuZ3RoO1xuICAgIGNvbnN0IHNlY3JldHM6IHN0cmluZ1tdID0gc2hhbWlyLnNoYXJlKHNlZWQsIG4sIG0pO1xuICAgIGNvbnN0IHNoYXJkcyA9IF8uemlwV2l0aChzZWNyZXRzLCBwYXNzd29yZHMsIChzaGFyZCwgcGFzc3dvcmQpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmVuY3J5cHQoeyBpbnB1dDogc2hhcmQsIHBhc3N3b3JkIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IG5vZGUgPSBiaXAzMi5mcm9tU2VlZChCdWZmZXIuZnJvbShzZWVkLCAnaGV4JykpO1xuICAgIHJldHVybiB7XG4gICAgICB4cHViOiBub2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgIG0sXG4gICAgICBuLFxuICAgICAgc2VlZFNoYXJlczogc2hhcmRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVjb25zdGl0dXRlIGEgc2VjcmV0IHdoaWNoIHdhcyBzaGFyZGVkIHdpdGggYHNwbGl0U2VjcmV0YC5cbiAgICogQHBhcmFtIHNoYXJkc1xuICAgKiBAcGFyYW0gcGFzc3dvcmRzXG4gICAqL1xuICByZWNvbnN0aXR1dGVTZWNyZXQoeyBzaGFyZHMsIHBhc3N3b3JkcyB9OiBSZWNvbnN0aXR1dGVTZWNyZXRPcHRpb25zKTogUmVjb25zdGl0dXRlZFNlY3JldCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNoYXJkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hhcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhc3N3b3JkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3dvcmRzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcmRzLmxlbmd0aCAhPT0gcGFzc3dvcmRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaGFyZHMgYW5kIHBhc3N3b3JkcyBhcnJheXMgbXVzdCBoYXZlIHNhbWUgbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjcmV0cyA9IF8uemlwV2l0aChzaGFyZHMsIHBhc3N3b3JkcywgKHNoYXJkLCBwYXNzd29yZCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdCh7IGlucHV0OiBzaGFyZCwgcGFzc3dvcmQgfSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2VlZDogc3RyaW5nID0gc2hhbWlyLmNvbWJpbmUoc2VjcmV0cyk7XG4gICAgY29uc3Qgbm9kZSA9IGJpcDMyLmZyb21TZWVkKEJ1ZmZlci5mcm9tKHNlZWQsICdoZXgnKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHhwdWI6IG5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpIGFzIHN0cmluZyxcbiAgICAgIHhwcnY6IG5vZGUudG9CYXNlNTgoKSBhcyBzdHJpbmcsXG4gICAgICBzZWVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHNoYXJkc1xuICAgKiBAcGFyYW0gcGFzc3dvcmRzXG4gICAqIEBwYXJhbSBtXG4gICAqIEBwYXJhbSB4cHViIE9wdGlvbmFsIHhwdWIgdG8gdmVyaWZ5IHRoZSByZXN1bHRzIGFnYWluc3RcbiAgICovXG4gIHZlcmlmeVNoYXJkcyh7IHNoYXJkcywgcGFzc3dvcmRzLCBtLCB4cHViIH06IFZlcmlmeVNoYXJkc09wdGlvbnMpOiBib29sZWFuIHtcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhbGwgcG9zc2libGUgY29tYmluYXRpb25zIG9mIGEgZ2l2ZW4gYXJyYXkncyB2YWx1ZXMgZ2l2ZW4gc3Vic2V0IHNpemUgbVxuICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgd2hvc2UgdmFsdWVzIGFyZSB0byBiZSBhcnJhbmdlZCBpbiBhbGwgY29tYmluYXRpb25zXG4gICAgICogQHBhcmFtIG0gVGhlIHNpemUgb2YgZWFjaCBzdWJzZXRcbiAgICAgKiBAcGFyYW0gZW50cnlJbmRpY2VzIFJlY3Vyc2l2ZWx5IHRyYWlsaW5nIHNldCBvZiBjdXJyZW50bHkgY2hvc2VuIGFycmF5IGluZGljZXMgZm9yIHRoZSBjb21iaW5hdGlvbiBzdWJzZXQgdW5kZXIgY29uc3RydWN0aW9uXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlQ29tYmluYXRpb25zID0gKGFycmF5OiBzdHJpbmdbXSwgbTogbnVtYmVyLCBlbnRyeUluZGljZXM6IG51bWJlcltdID0gW10pOiBzdHJpbmdbXVtdID0+IHtcbiAgICAgIGxldCBjb21iaW5hdGlvbnM6IHN0cmluZ1tdW10gPSBbXTtcblxuICAgICAgaWYgKGVudHJ5SW5kaWNlcy5sZW5ndGggPT09IG0pIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbWJpbmF0aW9uID0gXy5hdChhcnJheSwgZW50cnlJbmRpY2VzKTtcbiAgICAgICAgcmV0dXJuIFtjdXJyZW50Q29tYmluYXRpb25dO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgaGlnaGVzdCBpbmRleFxuICAgICAgbGV0IGVudHJ5SW5kZXggPSBfLmxhc3QoZW50cnlJbmRpY2VzKTtcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gaW5kaWNlcywgYXNzdW1lIC0xXG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZChlbnRyeUluZGV4KSkge1xuICAgICAgICBlbnRyeUluZGV4ID0gLTE7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gZW50cnlJbmRleCArIDE7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBhcHBlbmQgdGhlIGN1cnJlbnQgaW5kZXggdG8gdGhlIHRyYWlsaW5nIGluZGljZXNcbiAgICAgICAgY29uc3QgY3VycmVudEVudHJ5SW5kaWNlcyA9IFsuLi5lbnRyeUluZGljZXMsIGldO1xuICAgICAgICBjb25zdCBuZXdDb21iaW5hdGlvbnMgPSBnZW5lcmF0ZUNvbWJpbmF0aW9ucyhhcnJheSwgbSwgY3VycmVudEVudHJ5SW5kaWNlcyk7XG4gICAgICAgIGNvbWJpbmF0aW9ucyA9IFsuLi5jb21iaW5hdGlvbnMsIC4uLm5ld0NvbWJpbmF0aW9uc107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21iaW5hdGlvbnM7XG4gICAgfTtcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGFyZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoYXJkcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXNzd29yZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3N3b3JkcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHNoYXJkcy5sZW5ndGggIT09IHBhc3N3b3Jkcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2hhcmRzIGFuZCBwYXNzd29yZHMgYXJyYXlzIG11c3QgaGF2ZSBzYW1lIGxlbmd0aCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlY3JldHMgPSBfLnppcFdpdGgoc2hhcmRzLCBwYXNzd29yZHMsIChzaGFyZCwgcGFzc3dvcmQpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRlY3J5cHQoeyBpbnB1dDogc2hhcmQsIHBhc3N3b3JkIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHNlY3JldENvbWJpbmF0aW9ucyA9IGdlbmVyYXRlQ29tYmluYXRpb25zKHNlY3JldHMsIG0pO1xuICAgIGNvbnN0IHNlZWRzID0gc2VjcmV0Q29tYmluYXRpb25zLm1hcCgoY3VycmVudENvbWJpbmF0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gc2hhbWlyLmNvbWJpbmUoY3VycmVudENvbWJpbmF0aW9uKTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmlxdWVTZWVkcyA9IF8udW5pcShzZWVkcyk7XG4gICAgaWYgKHVuaXF1ZVNlZWRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzZWVkID0gXy5maXJzdCh1bmlxdWVTZWVkcyk7XG4gICAgY29uc3Qgbm9kZSA9IGJpcDMyLmZyb21TZWVkKEJ1ZmZlci5mcm9tKHNlZWQsICdoZXgnKSk7XG4gICAgY29uc3QgcmVzdG9yZWRYcHViID0gbm9kZS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoeHB1YikpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyh4cHViKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3hwdWIgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3RvcmVkWHB1YiAhPT0geHB1Yikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgYGdldFNoYXJlZFNlY3JldCgpYFxuICAgKi9cbiAgZ2V0RUNESFNlY3JldCh7IG90aGVyUHViS2V5SGV4LCBlY2tleSB9OiBHZXRFY2RoU2VjcmV0T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKG90aGVyUHViS2V5SGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvdGhlclB1YktleUhleCBzdHJpbmcgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzT2JqZWN0KGVja2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlY2tleSBvYmplY3QgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0U2hhcmVkU2VjcmV0KGVja2V5LCBCdWZmZXIuZnJvbShvdGhlclB1YktleUhleCwgJ2hleCcpKS50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdXNlcidzIHByaXZhdGUgRUNESCBrZXljaGFpblxuICAgKi9cbiAgYXN5bmMgZ2V0RUNESEtleWNoYWluKGVjZGhLZXljaGFpblB1Yj86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFlY2RoS2V5Y2hhaW5QdWIpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0KHRoaXMudXJsKCcvdXNlci9zZXR0aW5ncycpKS5yZXN1bHQoKTtcbiAgICAgIGlmICghcmVzdWx0LnNldHRpbmdzLmVjZGhLZXljaGFpbikge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdlY2RoIGtleWNoYWluIG5vdCBmb3VuZCBmb3IgdXNlcicpO1xuICAgICAgfVxuICAgICAgZWNkaEtleWNoYWluUHViID0gcmVzdWx0LnNldHRpbmdzLmVjZGhLZXljaGFpbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMua2V5Y2hhaW5zKCkuZ2V0KHsgeHB1YjogZWNkaEtleWNoYWluUHViIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHVzZXIgZGVyaXZlZCBwdWJsaWMgYW5kIHByaXZhdGUgRUNESCBrZXlwYWlyXG4gICAqIEBwYXJhbSBwYXNzd29yZCBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSB1c2VyJ3MgRUNESCBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIGVudElkPyBvcHRpb25hbCBlbnRlcnByaXNlIGlkIHRvIGNoZWNrIGZvciBwZXJtaXNzaW9uc1xuICAgKi9cbiAgYXN5bmMgZ2V0RWNkaEtleXBhaXJQcml2YXRlKHBhc3N3b3JkOiBzdHJpbmcsIGVudElkOiBzdHJpbmcpOiBQcm9taXNlPEVjZGhEZXJpdmVkS2V5cGFpcj4ge1xuICAgIGNvbnN0IHVzZXJTaWduaW5nS2V5ID0gYXdhaXQgdGhpcy5nZXRTaWduaW5nS2V5Rm9yVXNlcihlbnRJZCk7XG4gICAgY29uc3QgcHVia2V5T2ZBZG1pbkVjZGhLZXlIZXggPSB1c2VyU2lnbmluZ0tleS5kZXJpdmVkUHVia2V5O1xuICAgIGlmICghdXNlclNpZ25pbmdLZXkuZWNkaEtleWNoYWluIHx8ICF1c2VyU2lnbmluZ0tleS5kZXJpdmF0aW9uUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSB1c2VyIGtleWNoYWluLiBQbGVhc2UgY29udGFjdCBzdXBwb3J0QGJpdGdvLmNvbS4nKTtcbiAgICB9XG4gICAgY29uc3QgdXNlckVjZGhLZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RUNESEtleWNoYWluKHVzZXJTaWduaW5nS2V5LmVjZGhLZXljaGFpbik7XG4gICAgbGV0IHhwcnY7XG4gICAgdHJ5IHtcbiAgICAgIHhwcnYgPSB0aGlzLmRlY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB1c2VyRWNkaEtleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCBwYXNzd29yZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcml2ZWRQdWJLZXk6IHB1YmtleU9mQWRtaW5FY2RoS2V5SGV4LFxuICAgICAgZGVyaXZhdGlvblBhdGg6IHVzZXJTaWduaW5nS2V5LmRlcml2YXRpb25QYXRoLFxuICAgICAgeHBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBvcGVyYXRpbmdTeXN0ZW06IG9uZSBvZiBpb3MsIGFuZHJvaWRcbiAgICogLSBwdXNoVG9rZW46IGhleC1mb3JtYXR0ZWQgdG9rZW4gZm9yIHRoZSByZXNwZWN0aXZlIG5hdGl2ZSBwdXNoIG5vdGlmaWNhdGlvbiBzZXJ2aWNlXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJQdXNoVG9rZW4ocGFyYW1zOiBSZWdpc3RlclB1c2hUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3B1c2hUb2tlbicsICdvcGVyYXRpbmdTeXN0ZW0nXSwgW10pO1xuXG4gICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgLy8gdGhpcyBkZXZpY2UgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgdG8gYW4gZXh0ZW5zaWJsZSBzZXNzaW9uXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBsb2dnZWQgaW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3N0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydwdXNoVG9rZW4nLCAnb3BlcmF0aW5nU3lzdGVtJ10pO1xuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL2RldmljZXMnKSkuc2VuZChwb3N0UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gcHVzaFZlcmlmaWNhdGlvblRva2VuOiB0aGUgdG9rZW4gcmVjZWl2ZWQgdmlhIHB1c2ggbm90aWZpY2F0aW9uIHRvIGNvbmZpcm0gdGhlIGRldmljZSdzIG1vYmlsaXR5XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICB2ZXJpZnlQdXNoVG9rZW4ocGFyYW1zOiBWZXJpZnlQdXNoVG9rZW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIV8uaXNPYmplY3QocGFyYW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBvYmplY3QgcGFyYW1zJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wdXNoVmVyaWZpY2F0aW9uVG9rZW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBwdXNoVmVyaWZpY2F0aW9uVG9rZW4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAvLyB0aGlzIGRldmljZSBoYXMgdG8gYmUgcmVnaXN0ZXJlZCB0byBhbiBleHRlbnNpYmxlIHNlc3Npb25cbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGxvZ2dlZCBpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCAncHVzaFZlcmlmaWNhdGlvblRva2VuJyk7XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKCcvZGV2aWNlcy92ZXJpZnknKSkuc2VuZChwb3N0UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dpbiB0byB0aGUgYml0Z28gc3lzdGVtIHVzaW5nIGFuIGF1dGhjb2RlIGdlbmVyYXRlZCB2aWEgT2F1dGhcbiAgICovXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZVdpdGhBdXRoQ29kZShwYXJhbXM6IEF1dGhlbnRpY2F0ZVdpdGhBdXRoQ29kZU9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIG9iamVjdCBwYXJhbXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmF1dGhDb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgYXV0aENvZGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2NsaWVudElkIHx8ICF0aGlzLl9jbGllbnRTZWNyZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBjbGllbnQgaWQgYW5kIHNlY3JldCBzZXQgZmlyc3QgdG8gdXNlIHRoaXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhdXRoQ29kZSA9IHBhcmFtcy5hdXRoQ29kZTtcblxuICAgIGlmICh0aGlzLl90b2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbHJlYWR5IGxvZ2dlZCBpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBvc3QodGhpcy5fYmFzZVVybCArICcvb2F1dGgvdG9rZW4nKTtcbiAgICByZXF1ZXN0LmZvcmNlVjFBdXRoID0gdHJ1ZTsgLy8gT0F1dGggY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdjEgYXV0aGVudGljYXRpb25cbiAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVxdWVzdFxuICAgICAgLnNlbmQoe1xuICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgY29kZTogYXV0aENvZGUsXG4gICAgICAgIGNsaWVudF9pZDogdGhpcy5fY2xpZW50SWQsXG4gICAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMuX2NsaWVudFNlY3JldCxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG5cbiAgICB0aGlzLl90b2tlbiA9IGJvZHkuYWNjZXNzX3Rva2VuO1xuICAgIHRoaXMuX3JlZnJlc2hUb2tlbiA9IGJvZHkucmVmcmVzaF90b2tlbjtcbiAgICB0aGlzLl91c2VyID0gYXdhaXQgdGhpcy5tZSgpO1xuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgcGFzc3dvcmQgb2YgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci5cbiAgICogQWxzbyBjaGFuZ2UgYWxsIHYxIGFuZCB2MiBrZXljaGFpbiBwYXNzd29yZHMgaWYgdGhleSBtYXRjaCB0aGVcbiAgICogZ2l2ZW4gb2xkUGFzc3dvcmQuIFJldHVybnMgbm90aGluZyBvbiBzdWNjZXNzLlxuICAgKiBAcGFyYW0gb2xkUGFzc3dvcmQge1N0cmluZ30gLSB0aGUgY3VycmVudCBwYXNzd29yZFxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQge1N0cmluZ30gLSB0aGUgbmV3IHBhc3N3b3JkXG4gICAqL1xuICBhc3luYyBjaGFuZ2VQYXNzd29yZCh7IG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCB9OiBDaGFuZ2VQYXNzd29yZE9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhvbGRQYXNzd29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgc3RyaW5nIG9sZFBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKG5ld1Bhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBzdHJpbmcgbmV3UGFzc3dvcmQnKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKCk7XG4gICAgaWYgKHR5cGVvZiB1c2VyICE9PSAnb2JqZWN0JyB8fCAhdXNlci51c2VybmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIG9iamVjdCB1c2VyJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMudmVyaWZ5UGFzc3dvcmQoeyBwYXNzd29yZDogb2xkUGFzc3dvcmQgfSk7XG4gICAgaWYgKCF2YWxpZGF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBwcm92aWRlZCBvbGRQYXNzd29yZCBpcyBpbmNvcnJlY3QnKTtcbiAgICB9XG5cbiAgICAvLyBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCBjb2luIHdlIGNob29zZSBiZWNhdXNlIHRoZSB2MiB1cGRhdGVQYXNzd29yZCBmdW5jdGlvbnMgdXBkYXRlcyBhbGwgdjIga2V5Y2hhaW5zXG4gICAgLy8gd2UganVzdCBuZWVkIHRvIGNob29zZSBhIGNvaW4gdGhhdCBleGlzdHMgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnRcbiAgICBjb25zdCBjb2luID0gY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmdldEVudigpXS5uZXR3b3JrID09PSAnYml0Y29pbicgPyAnYnRjJyA6ICd0YnRjJztcblxuICAgIGNvbnN0IHVwZGF0ZUtleWNoYWluUGFzc3dvcmRQYXJhbXMgPSB7IG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCB9O1xuICAgIGNvbnN0IHYxS2V5Y2hhaW5VcGRhdGVQV1Jlc3VsdCA9IGF3YWl0IHRoaXMua2V5Y2hhaW5zKCkudXBkYXRlUGFzc3dvcmQodXBkYXRlS2V5Y2hhaW5QYXNzd29yZFBhcmFtcyk7XG4gICAgY29uc3QgdjJLZXljaGFpbnMgPSBhd2FpdCB0aGlzLmNvaW4oY29pbikua2V5Y2hhaW5zKCkudXBkYXRlUGFzc3dvcmQodXBkYXRlS2V5Y2hhaW5QYXNzd29yZFBhcmFtcyk7XG5cbiAgICBjb25zdCB1cGRhdGVQYXNzd29yZFBhcmFtcyA9IHtcbiAgICAgIGtleWNoYWluczogdjFLZXljaGFpblVwZGF0ZVBXUmVzdWx0LmtleWNoYWlucyxcbiAgICAgIHYyX2tleWNoYWluczogdjJLZXljaGFpbnMsXG4gICAgICB2ZXJzaW9uOiB2MUtleWNoYWluVXBkYXRlUFdSZXN1bHQudmVyc2lvbixcbiAgICAgIG9sZFBhc3N3b3JkOiB0aGlzLmNhbGN1bGF0ZUhNQUModXNlci51c2VybmFtZSwgb2xkUGFzc3dvcmQpLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMuY2FsY3VsYXRlSE1BQyh1c2VyLnVzZXJuYW1lLCBuZXdQYXNzd29yZCksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnBvc3QodGhpcy51cmwoJy91c2VyL2NoYW5nZXBhc3N3b3JkJykpLnNlbmQodXBkYXRlUGFzc3dvcmRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhlIGFkZHJlc3MgbGFiZWxzIG9uIGFsbCBvZiB0aGUgdXNlcidzIHdhbGxldHNcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGxhYmVscygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLnVybCgnL2xhYmVscycpKS5yZXN1bHQoJ2xhYmVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlcyBhcHByb3hpbWF0ZSBmZWUgcGVyIGtiIG5lZWRlZCBmb3IgYSB0eCB0byBnZXQgaW50byBhIGJsb2NrXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIHRhcmdldCBibG9ja3MgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBiZSBjb25maXJtZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy5tYXhGZWUgbWF4aW11bSBmZWUgd2lsbGluZyB0byBiZSBwYWlkIChmb3Igc2FmZXR5KVxuICAgKiBAcGFyYW0ge2FycmF5W3N0cmluZ119IHBhcmFtcy5pbnB1dHMgbGlzdCBvZiB1bmNvbmZpcm1lZCB0eElkcyBmcm9tIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gdXNlcyBpbnB1dHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy50eFNpemUgZXN0aW1hdGVkIHRyYW5zYWN0aW9uIHNpemUgaW4gYnl0ZXMsIG9wdGlvbmFsIHBhcmFtZXRlciB1c2VkIGZvciBDUEZQIGVzdGltYXRpb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmNwZnBBd2FyZSBmbGFnIGluZGljYXRpbmcgZmVlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCBDUEZQXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBlc3RpbWF0ZUZlZShwYXJhbXM6IEVzdGltYXRlRmVlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeVBhcmFtczogYW55ID0geyB2ZXJzaW9uOiAxMiB9O1xuICAgIGlmIChwYXJhbXMubnVtQmxvY2tzKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLm51bUJsb2NrcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBxdWVyeVBhcmFtcy5udW1CbG9ja3MgPSBwYXJhbXMubnVtQmxvY2tzO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLm1heEZlZSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuICAgICAgcXVlcnlQYXJhbXMubWF4RmVlID0gcGFyYW1zLm1heEZlZTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5pbnB1dHMpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuaW5wdXRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLmlucHV0cyA9IHBhcmFtcy5pbnB1dHM7XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHhTaXplKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnR4U2l6ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBxdWVyeVBhcmFtcy50eFNpemUgPSBwYXJhbXMudHhTaXplO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmNwZnBBd2FyZSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuY3BmcEF3YXJlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5UGFyYW1zLmNwZnBBd2FyZSA9IHBhcmFtcy5jcGZwQXdhcmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvdHgvZmVlJykpLnF1ZXJ5KHF1ZXJ5UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQml0R28ncyBndWFyYW50ZWUgdXNpbmcgYW4gaW5zdGFudCBpZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBpbnN0YW50R3VhcmFudGVlKHBhcmFtczogeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyBpZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCB0aGlzLmdldCh0aGlzLnVybCgnL2luc3RhbnQvJyArIHBhcmFtcy5pZCkpLnJlc3VsdCgpO1xuICAgIGlmICghYm9keS5ndWFyYW50ZWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZ3VhcmFudGVlIGZvdW5kIGluIHJlc3BvbnNlIGJvZHknKTtcbiAgICB9XG4gICAgaWYgKCFib2R5LnNpZ25hdHVyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBzaWduYXR1cmUgZm91bmQgaW4gZ3VhcmFudGVlIHJlc3BvbnNlIGJvZHknKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmluZ0FkZHJlc3MgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLnNpZ25pbmdBZGRyZXNzO1xuICAgIGNvbnN0IHNpZ25hdHVyZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJvZHkuc2lnbmF0dXJlLCAnaGV4Jyk7XG4gICAgY29uc3QgcHJlZml4ID0gdXR4b2xpYi5uZXR3b3Jrc1tjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuZ2V0RW52KCldLm5ldHdvcmtdLm1lc3NhZ2VQcmVmaXg7XG4gICAgY29uc3QgaXNWYWxpZFNpZ25hdHVyZSA9IGJpdGNvaW5NZXNzYWdlLnZlcmlmeShib2R5Lmd1YXJhbnRlZSwgc2lnbmluZ0FkZHJlc3MsIHNpZ25hdHVyZUJ1ZmZlciwgcHJlZml4KTtcbiAgICBpZiAoIWlzVmFsaWRTaWduYXR1cmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IHNpZ25hdHVyZScpO1xuICAgIH1cbiAgICByZXR1cm4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0YXJnZXQgYWRkcmVzcyBmb3IgcGF5bWVudCBvZiBhIEJpdEdvIGZlZVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgZ2V0Qml0R29GZWVBZGRyZXNzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL2JpbGxpbmcvYWRkcmVzcycpKS5zZW5kKHt9KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGFkZHJlc3Mgb2JqZWN0IChpbmNsdWRpbmcgdGhlIHdhbGxldCBpZCkgZm9yIGEgZ2l2ZW4gYWRkcmVzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5hZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGxvb2sgdXAuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyBnZXRXYWxsZXRBZGRyZXNzKHsgYWRkcmVzcyB9OiB7IGFkZHJlc3M6IHN0cmluZyB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoYC93YWxsZXRhZGRyZXNzLyR7YWRkcmVzc31gKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggbGlzdCBvZiB1c2VyIHdlYmhvb2tzXG4gICAqXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG5ldyB1c2VyIHdlYmhvb2tcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGFkZFdlYmhvb2socGFyYW1zOiBXZWJob29rT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy51cmwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB1cmwnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkIHN0cmluZyB0eXBlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdXNlciB3ZWJob29rXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBhc3luYyByZW1vdmVXZWJob29rKHBhcmFtczogV2ViaG9va09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudXJsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgdXJsJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBzdHJpbmcgdHlwZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlbCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBsaXN0IG9mIHdlYmhvb2sgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHVzZXJcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGxpc3RXZWJob29rTm90aWZpY2F0aW9ucyhwYXJhbXM6IExpc3RXZWJob29rTm90aWZpY2F0aW9uc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IGFueSA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXQodGhpcy51cmwoJy93ZWJob29rcy9ub3RpZmljYXRpb25zJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSBhIHVzZXIgd2ViaG9va1xuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2ltdWxhdGVXZWJob29rKHBhcmFtczogQml0R29TaW11bGF0ZVdlYmhvb2tPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCcsICdibG9ja0lkJ10sIFtdKTtcbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLndlYmhvb2tJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIHdlYmhvb2tJZCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuYmxvY2tJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWQgc3RyaW5nIGJsb2NrSWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wb3N0KHRoaXMudXJsKGAvd2ViaG9va3MvJHtwYXJhbXMud2ViaG9va0lkfS9zaW11bGF0ZWApKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzbHkgZ2V0IGNvbnN0YW50cyB3aGljaCBhcmUgcmVsZXZhbnQgdG8gdGhlIGNsaWVudC5cbiAgICpcbiAgICogTm90ZTogVGhpcyBmdW5jdGlvbiBoYXMgYSBrbm93biByYWNlIGNvbmRpdGlvbi4gSXQgbWF5IHJldHVybiBkaWZmZXJlbnQgdmFsdWVzIG92ZXIgdGltZSxcbiAgICogZXNwZWNpYWxseSBpZiBjYWxsZWQgc2hvcnRseSBhZnRlciBjcmVhdGlvbiBvZiB0aGUgQml0R28gb2JqZWN0LlxuICAgKlxuICAgKiBOZXcgY29kZSBzaG91bGQgY2FsbCBmZXRjaENvbnN0YW50cygpIGRpcmVjdGx5IGluc3RlYWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsaWVudCBjb25zdGFudHMgb2JqZWN0XG4gICAqL1xuICBnZXRDb25zdGFudHMoKTogYW55IHtcbiAgICAvLyBraWNrIG9mZiBhIGZyZXNoIHJlcXVlc3QgZm9yIHRoZSBjbGllbnQgY29uc3RhbnRzXG4gICAgdGhpcy5mZXRjaENvbnN0YW50cygpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIGFuIGVycm9yIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgZW50aXJlIHNjcmlwdFxuICAgICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gZmV0Y2ggY2xpZW50IGNvbnN0YW50cyBmcm9tIEJpdEdvJyk7XG4gICAgICAgIGNvbnNvbGUudHJhY2UoZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHVzZSBkZWZhdWx0Q29uc3RhbnRzIGFzIHRoZSBiYWNrdXAgZm9yIGtleXMgdGhhdCBhcmUgbm90IHNldCBpbiB0aGlzLl9jb25zdGFudHNcbiAgICByZXR1cm4gXy5tZXJnZSh7fSwgZGVmYXVsdENvbnN0YW50cyh0aGlzLmdldEVudigpKSwgQml0R29BUEkuX2NvbnN0YW50c1t0aGlzLmdldEVudigpXSk7XG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/sdk-api",
|
|
3
|
-
"version": "1.10.1-beta.
|
|
3
|
+
"version": "1.10.1-beta.329",
|
|
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-beta/sdk-core": "8.2.1-beta.
|
|
44
|
-
"@bitgo-beta/sjcl": "1.0.2-beta.
|
|
45
|
-
"@bitgo-beta/unspents": "0.13.2-beta.
|
|
46
|
-
"@bitgo-beta/utxo-lib": "8.0.3-beta.
|
|
43
|
+
"@bitgo-beta/sdk-core": "8.2.1-beta.330",
|
|
44
|
+
"@bitgo-beta/sjcl": "1.0.2-beta.568",
|
|
45
|
+
"@bitgo-beta/unspents": "0.13.2-beta.330",
|
|
46
|
+
"@bitgo-beta/utxo-lib": "8.0.3-beta.331",
|
|
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": "eb8a4e9b4f6dc5ce6af1ba83e9cfde9661d603df"
|
|
67
67
|
}
|