sliftutils 1.9.6 → 1.9.8

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/index.d.ts CHANGED
@@ -1182,7 +1182,7 @@ declare module "sliftutils/storage/BulkDatabase2/BulkDatabaseBase" {
1182
1182
  export type BulkDatabase2Config = {
1183
1183
  maxTriggerThrottleMs?: number;
1184
1184
  };
1185
- export type MergeSkipReason = "mergeInFlight" | "tabLockHeld" | "fileLockHeld" | "nothingToMerge";
1185
+ export type MergeSkipReason = "mergeInFlight" | "tabLockHeld" | "fileLockHeld" | "fileLockUnwritable" | "nothingToMerge";
1186
1186
  export type MergeAttemptResult = {
1187
1187
  merged: boolean;
1188
1188
  skipReason?: MergeSkipReason;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliftutils",
3
- "version": "1.9.6",
3
+ "version": "1.9.8",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -16,6 +16,7 @@ const discord_1 = require("../../notifications/discord");
16
16
  const changes_1 = require("./changes");
17
17
  const sessions_1 = require("./sessions");
18
18
  const state_1 = require("./state");
19
+ const batching_1 = require("socket-function/src/batching");
19
20
  // A revocation says: this key, used from this address, is no longer accepted. An unrevoke says the
20
21
  // opposite about one pair: this key is allowed from this address. They cancel out when both halves
21
22
  // match, which is why a revocation is one event with an id of its own, and never a name derived
@@ -121,7 +122,7 @@ exports.unrevokesFor = unrevokesFor;
121
122
 
122
123
  Deduplication is on the pair. The same key from a second address is a second event and gets its
123
124
  own revocation, because an unrevoke only ever forgives the pair it names. */
124
- async function recordRevocation(config) {
125
+ exports.recordRevocation = (0, batching_1.runInSerial)(async (config) => {
125
126
  let { sourceURL, fingerprint, keyLine, attempt, hostLabel } = config;
126
127
  let state = (0, state_1.getState)();
127
128
  let pair = pairKey({ fingerprint, ip: attempt.ip });
@@ -202,8 +203,7 @@ async function recordRevocation(config) {
202
203
  + `\nallowed only from: \`${attempt.required}\``,
203
204
  });
204
205
  return true;
205
- }
206
- exports.recordRevocation = recordRevocation;
206
+ });
207
207
  /** Takes everything the revoke repos list into local state. Once here a revocation never leaves,
208
208
  even if the file is deleted: the key that writes revocations is on every server, so an attacker
209
209
  holding it could otherwise erase the record that locked them out. */
@@ -319,5 +319,5 @@ async function reportRevokedKeys() {
319
319
  }
320
320
  }
321
321
  exports.reportRevokedKeys = reportRevokedKeys;
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2b2NhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJldm9jYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkRBQTZCO0FBQzdCLGdEQUF3QjtBQUN4QixtQ0FBcUM7QUFDckMsc0RBQThFO0FBQzlFLGtEQUFnRTtBQUNoRSx3Q0FBNEM7QUFDNUMsK0JBQStCO0FBQy9CLDJDQUFnSDtBQUNoSCx5REFBK0Q7QUFDL0QsdUNBQW9FO0FBQ3BFLHlDQUFpRTtBQUNqRSxtQ0FBOEM7QUFFOUMsbUdBQW1HO0FBQ25HLG1HQUFtRztBQUNuRyxnR0FBZ0c7QUFDaEcsMEZBQTBGO0FBQzFGLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQztBQUN0QyxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFDbEMsTUFBTSxpQkFBaUIsR0FBRyw0Q0FBNEMsQ0FBQztBQVV2RTtzQ0FDc0M7QUFDdEMsU0FBZ0IsT0FBTyxDQUFDLE1BQTJDO0lBQy9ELE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUNoRCxDQUFDO0FBRkQsMEJBRUM7QUFFRCw2RkFBNkY7QUFDN0YsU0FBZ0IsZUFBZSxDQUFDLFdBQW1CO0lBQy9DLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzRCxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUEsb0JBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN6SSxDQUFDO0FBSEQsMENBR0M7QUFFRCx5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RyxJQUFBLGdCQUFRLEdBQUUsQ0FBQztJQUN2QixLQUFLLElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDdEQsSUFBSSxVQUFVLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyRCxTQUFTO1FBQ2IsQ0FBQztRQUNELFVBQVUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLE1BQU0sSUFBQSxpQkFBUyxHQUFFLENBQUM7UUFDbEIsNEZBQTRGO1FBQzVGLDBEQUEwRDtRQUMxRCxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUEsK0JBQWMsRUFBQyxPQUFPLENBQUMsS0FBSyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1AsU0FBUztRQUNiLENBQUM7UUFDRCxrREFBa0Q7UUFDbEQsSUFBSSxLQUFLLEdBQUcsSUFBQSwyQkFBZ0IsRUFBQyxNQUFNLElBQUEsNEJBQWlCLEdBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUEsZ0NBQXNCLEVBQUM7WUFDbkIsUUFBUSxFQUFFLGlCQUFpQixVQUFVLENBQUMsRUFBRSxJQUFJLFNBQVMsY0FBYyxJQUFBLDRCQUFXLEVBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckYsSUFBSSxFQUNBLCtFQUErRTtrQkFDN0UsbUVBQW1FLEtBQUssRUFBRTtrQkFDMUUsY0FBYyxJQUFBLDZCQUFZLEVBQUMsR0FBRyxDQUFDLElBQUk7a0JBQ25DLEtBQUssa0JBQWtCLENBQUMsVUFBVSxDQUFDLEVBQUU7U0FDOUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztBQUNMLENBQUM7QUF6QkQsOENBeUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsga2V5RmluZ2VycHJpbnQsIGtleU5pY2VOYW1lLCBzdW1tYXJpemVLZXkgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXNcIjtcbmltcG9ydCB7IHJldm9rZVJlcG9QYXRoLCByZXZva2VSZXBvVVJMIH0gZnJvbSBcIi4uL3Jldm9rZVNvdXJjZVwiO1xuaW1wb3J0IHsgc291cmNlUmVwb1BhdGggfSBmcm9tIFwiLi4vc291cmNlc1wiO1xuaW1wb3J0IHsgcnVuR2l0IH0gZnJvbSBcIi4vZ2l0XCI7XG5pbXBvcnQgeyBlbnN1cmVSZXZva2VLZXksIGxpc3RSZXBvRGlyLCByZWFkUmVwb0ZpbGUsIHJldm9rZVJlcG8sIHNvdXJjZVJlcG8sIHN5bmNSZXBvRmlsZXMgfSBmcm9tIFwiLi9yZXBvRmlsZXNcIjtcbmltcG9ydCB7IG1lc3NhZ2VUaW1lc3RhbXAgfSBmcm9tIFwiLi4vLi4vbm90aWZpY2F0aW9ucy9kaXNjb3JkXCI7XG5pbXBvcnQgeyBhZGRDaGFuZ2VSZWFzb24sIGFkZExlYWRpbmdDaGFuZ2VSZWFzb24gfSBmcm9tIFwiLi9jaGFuZ2VzXCI7XG5pbXBvcnQgeyBkZXNjcmliZUFsbEVuZGVkLCBlbmRBbGxTU0hTZXNzaW9ucyB9IGZyb20gXCIuL3Nlc3Npb25zXCI7XG5pbXBvcnQgeyBnZXRTdGF0ZSwgc2F2ZVN0YXRlIH0gZnJvbSBcIi4vc3RhdGVcIjtcblxuLy8gQSByZXZvY2F0aW9uIHNheXM6IHRoaXMga2V5LCB1c2VkIGZyb20gdGhpcyBhZGRyZXNzLCBpcyBubyBsb25nZXIgYWNjZXB0ZWQuIEFuIHVucmV2b2tlIHNheXMgdGhlXG4vLyBvcHBvc2l0ZSBhYm91dCBvbmUgcGFpcjogdGhpcyBrZXkgaXMgYWxsb3dlZCBmcm9tIHRoaXMgYWRkcmVzcy4gVGhleSBjYW5jZWwgb3V0IHdoZW4gYm90aCBoYWx2ZXNcbi8vIG1hdGNoLCB3aGljaCBpcyB3aHkgYSByZXZvY2F0aW9uIGlzIG9uZSBldmVudCB3aXRoIGFuIGlkIG9mIGl0cyBvd24sIGFuZCBuZXZlciBhIG5hbWUgZGVyaXZlZFxuLy8gZnJvbSB0aGUga2V5IC0gZm9yZ2l2aW5nIGEga2V5IGZvciBvbmUgYWRkcmVzcyBtdXN0IG5vdCBtYWtlIGl0IHVucmV2b2thYmxlIGV2ZXJ5d2hlcmUuXG5jb25zdCBSRVZPQ0FUSU9OU19ESVIgPSBcInJldm9jYXRpb25zXCI7XG5jb25zdCBVTlJFVk9LRVNfRElSID0gXCJ1bnJldm9rZWRcIjtcbmNvbnN0IFJFVk9DQVRJT05fUkVBU09OID0gXCJhdXRoZW50aWNhdGVkIGFjY2VzcyBmcm9tIGFuIHVuYXBwcm92ZWQgSVBcIjtcblxuZXhwb3J0IHR5cGUgQXR0ZW1wdCA9IHtcbiAgICBpcDogc3RyaW5nO1xuICAgIHVzZXI6IHN0cmluZztcbiAgICBwb3J0OiBzdHJpbmc7XG4gICAgcmVxdWlyZWQ6IHN0cmluZztcbiAgICBsaW5lOiBzdHJpbmc7XG59O1xuXG4vKiogV2hhdCBhbiB1bnJldm9rZSBoYXMgdG8gbmFtZSB0byB1bmRvIGEgcmV2b2NhdGlvbiwgYW5kIHdoYXQgc3RvcHMgYSBzZWNvbmQgcmV2b2NhdGlvbiBvZiB0aGVcbiAgICBzYW1lIGtleSBmcm9tIHRoZSBzYW1lIGFkZHJlc3MuICovXG5leHBvcnQgZnVuY3Rpb24gcGFpcktleShjb25maWc6IHsgZmluZ2VycHJpbnQ6IHN0cmluZzsgaXA6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIGAke2NvbmZpZy5maW5nZXJwcmludH0gJHtjb25maWcuaXB9YDtcbn1cblxuLyoqIFVuaXF1ZSB0byB0aGUgZXZlbnQuIFRoZSB0aW1lIGlzIHRoZXJlIHRvIHJlYWQsIHRoZSByYW5kb20gaGFsZiBpcyB0aGVyZSB0byBiZSB1bmlxdWUuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3UmV2b2NhdGlvbklkKGZpbmdlcnByaW50OiBzdHJpbmcpIHtcbiAgICBsZXQgc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCBcIi1cIik7XG4gICAgcmV0dXJuIGAke3N0YW1wfS0ke3JhbmRvbUJ5dGVzKDgpLnRvU3RyaW5nKFwiaGV4XCIpfS0ke2ZpbmdlcnByaW50LnJlcGxhY2UoL15TSEEyNTY6LywgXCJcIikuc2xpY2UoMCwgOCkucmVwbGFjZSgvW15BLVphLXowLTldKy9nLCBcIlwiKX1gO1xufVxuXG4vKiogV2h5IGEga2V5IHN0b3BwZWQgYmVpbmcgYWNjZXB0ZWQsIGluIHRoZSB3b3JkcyBvZiB3aGljaGV2ZXIgbWFjaGluZSBzYXcgaXQgaGFwcGVuLiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVSZXZvY2F0aW9uKHJldm9jYXRpb246IHsgcmV2b2tlZEF0OiBzdHJpbmc7IHJldm9rZWRCeTogc3RyaW5nOyByZWFzb246IHN0cmluZzsgaXA6IHN0cmluZyB9KSB7XG4gICAgbGV0IHdoZW4gPSBEYXRlLnBhcnNlKHJldm9jYXRpb24ucmV2b2tlZEF0KTtcbiAgICBsZXQgcGFydHMgPSBbXG4gICAgICAgIE51bWJlci5pc0Zpbml0ZSh3aGVuKSA/IGByZXZva2VkICR7bWVzc2FnZVRpbWVzdGFtcChuZXcgRGF0ZSh3aGVuKSl9YCA6IGByZXZva2VkIGF0IGFuIHVucmVjb3JkZWQgdGltZWAsXG4gICAgICAgIHJldm9jYXRpb24ucmV2b2tlZEJ5ICYmIGBieSBcXGAke3Jldm9jYXRpb24ucmV2b2tlZEJ5fVxcYGAgfHwgXCJcIixcbiAgICAgICAgcmV2b2NhdGlvbi5yZWFzb24gfHwgXCJcIixcbiAgICAgICAgcmV2b2NhdGlvbi5pcCAmJiBgZnJvbSBcXGAke3Jldm9jYXRpb24uaXB9XFxgYCB8fCBcIlwiLFxuICAgIF07XG4gICAgcmV0dXJuIHBhcnRzLmZpbHRlcihwYXJ0ID0+IHBhcnQpLmpvaW4oXCIsIFwiKTtcbn1cblxuZXhwb3J0IHR5cGUgUmV2b2NhdGlvbkZpbGUgPSB7XG4gICAgcmV2b2NhdGlvbklkOiBzdHJpbmc7XG4gICAgZmluZ2VycHJpbnQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIHJldm9rZWRBdDogc3RyaW5nO1xuICAgIHJldm9rZWRCeTogc3RyaW5nO1xuICAgIHJlYXNvbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRSZXZvY2F0aW9uRmlsZXMoc291cmNlVVJMOiBzdHJpbmcpOiBQcm9taXNlPFJldm9jYXRpb25GaWxlW10+IHtcbiAgICBsZXQgcmVwbyA9IHJldm9rZVJlcG8oc291cmNlVVJMKTtcbiAgICBsZXQgcmV2b2NhdGlvbnM6IFJldm9jYXRpb25GaWxlW10gPSBbXTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGF3YWl0IGxpc3RSZXBvRGlyKHJlcG8sIFJFVk9DQVRJT05TX0RJUikpIHtcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcGFyc2VkID0gSlNPTi5wYXJzZShhd2FpdCByZWFkUmVwb0ZpbGUocmVwbywgcGF0aC5qb2luKFJFVk9DQVRJT05TX0RJUiwgbmFtZSkpIHx8IFwiXCIpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZC5maW5nZXJwcmludCkge1xuICAgICAgICAgICAgICAgIHJldm9jYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByZXZvY2F0aW9uSWQ6IHBhcnNlZC5yZXZvY2F0aW9uSWQgfHwgbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiXCIpLFxuICAgICAgICAgICAgICAgICAgICBmaW5nZXJwcmludDogcGFyc2VkLmZpbmdlcnByaW50LFxuICAgICAgICAgICAgICAgICAgICBpcDogcGFyc2VkLmlwIHx8IHBhcnNlZC5hdHRlbXB0Py5pcCB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICByZXZva2VkQXQ6IHBhcnNlZC5yZXZva2VkQXQgfHwgXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcmV2b2tlZEJ5OiBwYXJzZWQucmV2b2tlZEJ5IHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcGFyc2VkLnJlYXNvbiB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgSWdub3JpbmcgdW5yZWFkYWJsZSByZXZvY2F0aW9uICR7bmFtZX0uICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV2b2NhdGlvbnM7XG59XG5cbi8qKiBXaGljaCBrZXkgaXMgYWxsb3dlZCBmcm9tIHdoaWNoIGFkZHJlc3MuIFVucmV2b2tlcyBsaXZlIGluIHRoZSBzb3VyY2UgcmVwbywgc28gdGhleSBhcmUgY292ZXJlZFxuICAgIGJ5IGl0cyBzaWduYXR1cmUsIGFuZCBub3RoaW5nIGlzIHJlYWQgb3V0IG9mIHRoZW0gYnV0IHRoZSBwYWlycyB0aGV5IGFsbG93IGFuZCwgZm9yIGZpbGVzXG4gICAgd3JpdHRlbiBiZWZvcmUgcGFpcnMgZXhpc3RlZCwgdGhlIHJldm9jYXRpb24gaWRzIHRoZXkgbmFtZS4gKi9cbmV4cG9ydCB0eXBlIFVucmV2b2tlcyA9IHtcbiAgICAvLyBmaW5nZXJwcmludCBhbmQgaXAsIHRvIGV2ZXJ5IHVucmV2b2tlIHRoYXQgYWxsb3dzIHRoZW0uIEV2ZXJ5IG9uZSByYXRoZXIgdGhhbiB0aGUgbGFzdCxcbiAgICAvLyBiZWNhdXNlIHRoZSBzYW1lIHBhaXIgaXMgb2Z0ZW4gbmFtZWQgYWdhaW4gYnkgYSBsYXRlciB1bnJldm9rZSBhbmQgdGhlcmUgaXMgbm8gcmVhc29uIHRvXG4gICAgLy8gcHJlZmVyIG9uZSBvdmVyIGFub3RoZXIuXG4gICAgcGFpcnM6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgICAvLyBSZXZvY2F0aW9uIGlkIHRvIHRoZSB1bnJldm9rZXMgbmFtaW5nIGl0LiBPbmx5IGZvciB1bnJldm9rZXMgd3JpdHRlbiBiZWZvcmUgdGhpcyB3YXMgYWJvdXRcbiAgICAvLyBwYWlycyBhdCBhbGwsIHNvIGEgbWFjaGluZSByZWFkaW5nIG9uZSBhbHJlYWR5IGluIGEgcmVwbyBzdGlsbCBob25vdXJzIGl0LlxuICAgIGxlZ2FjeUlkczogTWFwPHN0cmluZywgc3RyaW5nW10+O1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRVbnJldm9rZXMoc291cmNlVVJMOiBzdHJpbmcpOiBQcm9taXNlPFVucmV2b2tlcz4ge1xuICAgIGxldCByZXBvID0gc291cmNlUmVwbyhzb3VyY2VVUkwpO1xuICAgIGxldCBwYWlycyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICBsZXQgbGVnYWN5SWRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgIGxldCBhZGQgPSAoaW50bzogTWFwPHN0cmluZywgc3RyaW5nW10+LCBrZXk6IHN0cmluZywgdW5yZXZva2VJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGludG8uc2V0KGtleSwgWy4uLihpbnRvLmdldChrZXkpIHx8IFtdKSwgdW5yZXZva2VJZF0pO1xuICAgIH07XG4gICAgZm9yIChsZXQgbmFtZSBvZiBhd2FpdCBsaXN0UmVwb0RpcihyZXBvLCBVTlJFVk9LRVNfRElSKSkge1xuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVucmV2b2tlSWQgPSBuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJcIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcGFyc2VkID0gSlNPTi5wYXJzZShhd2FpdCByZWFkUmVwb0ZpbGUocmVwbywgcGF0aC5qb2luKFVOUkVWT0tFU19ESVIsIG5hbWUpKSB8fCBcIlwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGFsbG93ZWQgb2YgcGFyc2VkLmFsbG93ZWQgfHwgW10pIHtcbiAgICAgICAgICAgICAgICAvLyBFaXRoZXIga2luZCBvZiBpZGVudGl0eTogYW4gc3NoIGtleSBuYW1lcyBhIGZpbmdlcnByaW50LCBhIG1hY2hpbmUgYSBtYWNoaW5lSWQuXG4gICAgICAgICAgICAgICAgbGV0IGlkZW50aXR5ID0gYWxsb3dlZC5maW5nZXJwcmludCB8fCBhbGxvd2VkLm1hY2hpbmVJZDtcbiAgICAgICAgICAgICAgICBpZiAoaWRlbnRpdHkgJiYgYWxsb3dlZC5pcCkge1xuICAgICAgICAgICAgICAgICAgICBhZGQocGFpcnMsIHBhaXJLZXkoeyBmaW5nZXJwcmludDogaWRlbnRpdHksIGlwOiBhbGxvd2VkLmlwIH0pLCB1bnJldm9rZUlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCByZXZvY2F0aW9uSWQgb2YgcGFyc2VkLnJldm9jYXRpb25JZHMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBhZGQobGVnYWN5SWRzLCByZXZvY2F0aW9uSWQsIHVucmV2b2tlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgSWdub3JpbmcgdW5yZWFkYWJsZSB1bnJldm9rZSAke25hbWV9LiAke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgcGFpcnMsIGxlZ2FjeUlkcyB9O1xufVxuXG4vKiogRXZlcnkgdW5yZXZva2UgY292ZXJpbmcgb25lIHJldm9jYXRpb246IGJ5IHRoZSBwYWlyIGl0IGlzIGFib3V0LCBhbmQgYnkgaXRzIGlkIGZvciB0aGUgZmlsZXNcbiAgICB3cml0dGVuIGJlZm9yZSBwYWlycyBleGlzdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmV2b2tlc0Zvcih1bnJldm9rZXM6IFVucmV2b2tlcywgcmV2b2NhdGlvbjogeyByZXZvY2F0aW9uSWQ6IHN0cmluZzsgZmluZ2VycHJpbnQ6IHN0cmluZzsgaXA6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgLi4udW5yZXZva2VzLnBhaXJzLmdldChwYWlyS2V5KHJldm9jYXRpb24pKSB8fCBbXSxcbiAgICAgICAgLi4udW5yZXZva2VzLmxlZ2FjeUlkcy5nZXQocmV2b2NhdGlvbi5yZXZvY2F0aW9uSWQpIHx8IFtdLFxuICAgIF07XG59XG5cbi8qKiBXcml0ZXMgYSByZXZvY2F0aW9uLCB1bmxlc3MgdGhpcyBrZXkgaXMgYWxyZWFkeSByZXZva2VkIGZvciB0aGlzIGFkZHJlc3MuIENoZWNrZWQgdHdpY2U6XG4gICAgYWdhaW5zdCB3aGF0IHRoaXMgbWFjaGluZSBhbHJlYWR5IGtub3dzLCB3aGljaCBuZWVkcyBubyBuZXR3b3JrLCBhbmQgYWdhaW4gYWdhaW5zdCB0aGUgcmVwb1xuICAgIGFmdGVyIHB1bGxpbmcgaXQsIHNvIGEgZmxvb2Qgb2YgdW5rbm93biBrZXlzIGNhbm5vdCB0dXJuIGludG8gYSBmbG9vZCBvZiBjb21taXRzLlxuXG4gICAgRGVkdXBsaWNhdGlvbiBpcyBvbiB0aGUgcGFpci4gVGhlIHNhbWUga2V5IGZyb20gYSBzZWNvbmQgYWRkcmVzcyBpcyBhIHNlY29uZCBldmVudCBhbmQgZ2V0cyBpdHNcbiAgICBvd24gcmV2b2NhdGlvbiwgYmVjYXVzZSBhbiB1bnJldm9rZSBvbmx5IGV2ZXIgZm9yZ2l2ZXMgdGhlIHBhaXIgaXQgbmFtZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3JkUmV2b2NhdGlvbihjb25maWc6IHtcbiAgICBzb3VyY2VVUkw6IHN0cmluZztcbiAgICBmaW5nZXJwcmludDogc3RyaW5nO1xuICAgIGtleUxpbmU6IHN0cmluZztcbiAgICBhdHRlbXB0OiBBdHRlbXB0O1xuICAgIGhvc3RMYWJlbDogc3RyaW5nO1xufSkge1xuICAgIGxldCB7IHNvdXJjZVVSTCwgZmluZ2VycHJpbnQsIGtleUxpbmUsIGF0dGVtcHQsIGhvc3RMYWJlbCB9ID0gY29uZmlnO1xuICAgIGxldCBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgbGV0IHBhaXIgPSBwYWlyS2V5KHsgZmluZ2VycHJpbnQsIGlwOiBhdHRlbXB0LmlwIH0pO1xuICAgIGlmIChPYmplY3QudmFsdWVzKHN0YXRlLnJldm9jYXRpb25zKS5zb21lKGVudHJ5ID0+IHBhaXJLZXkoZW50cnkpID09PSBwYWlyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN5bmNSZXBvRmlsZXMocmV2b2tlUmVwbyhzb3VyY2VVUkwpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCByZWNvcmQgdGhlIHJldm9jYXRpb24gb2YgJHtmaW5nZXJwcmludH0sICR7cmV2b2tlUmVwb1VSTChzb3VyY2VVUkwpfSBjb3VsZCBub3QgYmUgcmVhZC4gJHtlfWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCByZXZvY2F0aW9uSWQgPSBuZXdSZXZvY2F0aW9uSWQoZmluZ2VycHJpbnQpO1xuICAgIGxldCBleGlzdGluZyA9IChhd2FpdCByZWFkUmV2b2NhdGlvbkZpbGVzKHNvdXJjZVVSTCkpLmZpbmQoZW50cnkgPT4gcGFpcktleShlbnRyeSkgPT09IHBhaXIpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAvLyBBbm90aGVyIG1hY2hpbmUgZ290IHRoZXJlIGZpcnN0LCB3aGljaCBpcyB0aGUgbm9ybWFsIG91dGNvbWUgd2hlbiBzZXZlcmFsIHNlZSB0aGUgc2FtZVxuICAgICAgICAvLyBhdHRlbXB0LiBSZWNvcmQgaXQgbG9jYWxseSBzbyB3ZSBuZXZlciBsb29rIGFnYWluLlxuICAgICAgICBzdGF0ZS5yZXZvY2F0aW9uc1tleGlzdGluZy5yZXZvY2F0aW9uSWRdID0ge1xuICAgICAgICAgICAgcmV2b2NhdGlvbklkOiBleGlzdGluZy5yZXZvY2F0aW9uSWQsXG4gICAgICAgICAgICBmaW5nZXJwcmludDogZXhpc3RpbmcuZmluZ2VycHJpbnQsIGlwOiBleGlzdGluZy5pcCxcbiAgICAgICAgICAgIHJldm9rZWRBdDogZXhpc3RpbmcucmV2b2tlZEF0LCByZXZva2VkQnk6IGV4aXN0aW5nLnJldm9rZWRCeSxcbiAgICAgICAgICAgIHJlYXNvbjogZXhpc3RpbmcucmVhc29uLFxuICAgICAgICAgICAgdW5yZXZva2VJZDogXCJcIiwgdW5yZXZva2VkOiBmYWxzZSxcbiAgICAgICAgICAgIHJlcG9ydGVkUmVtb3ZlZDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHNhdmVTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHJlcG9QYXRoID0gcmV2b2tlUmVwb1BhdGgoc291cmNlVVJMKTtcbiAgICBsZXQga2V5UGF0aCA9IGF3YWl0IGVuc3VyZVJldm9rZUtleShzb3VyY2VVUkwpO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIFJFVk9DQVRJT05TX0RJUik7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgcmV2b2tlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LCBgJHtyZXZvY2F0aW9uSWR9Lmpzb25gKSwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICByZXZvY2F0aW9uSWQsXG4gICAgICAgIGZpbmdlcnByaW50LFxuICAgICAgICAvLyBUaGUgdHdvIGhhbHZlcyBvZiB3aGF0IGhhcHBlbmVkLiBBbiB1bnJldm9rZSBuYW1pbmcgYm90aCBpcyB3aGF0IHVuZG9lcyB0aGlzLlxuICAgICAgICBpcDogYXR0ZW1wdC5pcCxcbiAgICAgICAga2V5OiBrZXlMaW5lLFxuICAgICAgICByZXZva2VkQXQsXG4gICAgICAgIHJldm9rZWRCeTogaG9zdExhYmVsLFxuICAgICAgICByZWFzb246IFJFVk9DQVRJT05fUkVBU09OLFxuICAgICAgICBhdHRlbXB0LFxuICAgIH0sIHVuZGVmaW5lZCwgNCkgKyBcIlxcblwiKTtcblxuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcImFkZFwiLCBcIi1BXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoIH0pO1xuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBgcmV2b2tlICR7cmV2b2NhdGlvbklkfWBdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoIH0pO1xuICAgIGxldCBwdXNoID0gYXdhaXQgcnVuR2l0KHsgYXJnczogW1wicHVzaFwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGgsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAocHVzaC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgLy8gTW9zdCBsaWtlbHkgYW5vdGhlciBtYWNoaW5lIHB1c2hlZCB0aGUgc2FtZSByZXZvY2F0aW9uIGZpcnN0LiBUaGUgbmV4dCBjaGVjayB3aWxsIHB1bGxcbiAgICAgICAgLy8gaXQgYW5kIHJlY29yZCBpdCwgc28gdGhlcmUgaXMgbm90aGluZyB0byByZXRyeSBoZXJlLlxuICAgICAgICBjb25zb2xlLmxvZyhgQ291bGQgbm90IHB1c2ggdGhlIHJldm9jYXRpb24gb2YgJHtmaW5nZXJwcmludH0sIHdpbGwgcGljayBpdCB1cCBvbiB0aGUgbmV4dCBjaGVjay4gJHsocHVzaC5zdGRvdXQgKyBwdXNoLnN0ZGVycikudHJpbSgpfWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN0YXRlLnJldm9jYXRpb25zW3Jldm9jYXRpb25JZF0gPSB7XG4gICAgICAgIHJldm9jYXRpb25JZCwgZmluZ2VycHJpbnQsIGlwOiBhdHRlbXB0LmlwLFxuICAgICAgICByZXZva2VkQXQsIHJldm9rZWRCeTogaG9zdExhYmVsLCByZWFzb246IFJFVk9DQVRJT05fUkVBU09OLFxuICAgICAgICB1bnJldm9rZUlkOiBcIlwiLCB1bnJldm9rZWQ6IGZhbHNlLFxuICAgICAgICAvLyBUaGUgbWVzc2FnZSBiZWxvdyBhbHJlYWR5IHNheXMgdGhpcyBtYWNoaW5lIGhhcyBzdG9wcGVkIGFjY2VwdGluZyB0aGUga2V5LCBzbyB0aGUgb25lXG4gICAgICAgIC8vIGFib3V0IG5vdGljaW5nIGEgcmV2b2NhdGlvbiB3b3VsZCBvbmx5IHJlcGVhdCBpdC5cbiAgICAgICAgcmVwb3J0ZWRSZW1vdmVkOiB0cnVlLFxuICAgIH07XG4gICAgYXdhaXQgc2F2ZVN0YXRlKCk7XG4gICAgbGV0IGVuZGVkID0gZGVzY3JpYmVBbGxFbmRlZChhd2FpdCBlbmRBbGxTU0hTZXNzaW9ucygpKTtcbiAgICAvLyBTYWlkIHdoZW4gdGhlIGZpbGUgaXMgd3JpdHRlbiwgbm90IGhlcmUsIHNvIG9uZSBldmVudCBwcm9kdWNlcyBvbmUgbWVzc2FnZS5cbiAgICBhZGRMZWFkaW5nQ2hhbmdlUmVhc29uKHtcbiAgICAgICAgaGVhZGxpbmU6IGBTVVNQSUNJT1VTIElQICR7YXR0ZW1wdC5pcH0gRlJPWkUgS0VZICR7a2V5TGluZSAmJiBrZXlOaWNlTmFtZShrZXlMaW5lKSB8fCBmaW5nZXJwcmludH1gLFxuICAgICAgICBib2R5OlxuICAgICAgICAgICAgYFNvbWVvbmUgbG9nZ2VkIGluIGZyb20gJHthdHRlbXB0LmlwfSB1c2luZyBhIGtleSB0aGF0IGlzIG5vdCBhbGxvd2VkIGZyb20gdGhlcmUuIFRoZWBcbiAgICAgICAgICAgICsgYCBrZXkgaXRzZWxmIHdhcyBjb3JyZWN0LCBzbyBlaXRoZXIgc29tZW9uZSBlbHNlIGhhcyBhIGNvcHkgb2YgaXQsIG9yIG9uZSBvZiB5b3VyIG93bmBcbiAgICAgICAgICAgICsgYCBhZGRyZXNzZXMgY2hhbmdlZC5gXG4gICAgICAgICAgICArIGBcXG5cXG5UaGUga2V5IGlzIGZyb3plbiBvbiBldmVyeSBtYWNoaW5lIG5vdywgYW5kIHdvcmtzIG5vd2hlcmUuJHtlbmRlZH1gXG4gICAgICAgICAgICArIGBcXG5cXG5JZiB0aGlzIHdhcyBhbiBhdHRhY2ssIHJlbW92ZSB0aGF0IGtleSBmcm9tIFxcYCR7c291cmNlVVJMfVxcYCBub3cuYFxuICAgICAgICAgICAgKyBgXFxuSWYgaXQgd2FzIHlvdSwgcnVuOmBcbiAgICAgICAgICAgICsgYFxcblxcYFxcYFxcYFxcbmNkICR7c291cmNlUmVwb1BhdGgoc291cmNlVVJMKX1cXG55YXJuIHVucmV2b2tlIGdpdFxcblxcYFxcYFxcYGBcbiAgICAgICAgICAgICsgYFxcbkl0IGFsbG93cyAke2F0dGVtcHQuaXB9IG9uIHRoYXQga2V5LCBhbmQgdGFrZXMgYW4gaG91ciB0byByZWFjaCBldmVyeSBtYWNoaW5lLmBcbiAgICAgICAgICAgICsgYFxcblxcbmtleTogXFxgJHtrZXlMaW5lICYmIHN1bW1hcml6ZUtleShrZXlMaW5lKSB8fCBmaW5nZXJwcmludH1cXGBgXG4gICAgICAgICAgICArIGBcXG50cmllZCB0byBsb2cgaW4gYXM6IFxcYCR7YXR0ZW1wdC51c2VyfVxcYGBcbiAgICAgICAgICAgICsgYFxcbmFsbG93ZWQgb25seSBmcm9tOiBcXGAke2F0dGVtcHQucmVxdWlyZWR9XFxgYCxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRha2VzIGV2ZXJ5dGhpbmcgdGhlIHJldm9rZSByZXBvcyBsaXN0IGludG8gbG9jYWwgc3RhdGUuIE9uY2UgaGVyZSBhIHJldm9jYXRpb24gbmV2ZXIgbGVhdmVzLFxuICAgIGV2ZW4gaWYgdGhlIGZpbGUgaXMgZGVsZXRlZDogdGhlIGtleSB0aGF0IHdyaXRlcyByZXZvY2F0aW9ucyBpcyBvbiBldmVyeSBzZXJ2ZXIsIHNvIGFuIGF0dGFja2VyXG4gICAgaG9sZGluZyBpdCBjb3VsZCBvdGhlcndpc2UgZXJhc2UgdGhlIHJlY29yZCB0aGF0IGxvY2tlZCB0aGVtIG91dC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhYnNvcmJSZXZvY2F0aW9ucyhzb3VyY2VVUkxzOiBzdHJpbmdbXSkge1xuICAgIGxldCBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBzb3VyY2VVUkwgb2Ygc291cmNlVVJMcykge1xuICAgICAgICBsZXQgZW50cmllcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudHJpZXMgPSBhd2FpdCByZWFkUmV2b2NhdGlvbkZpbGVzKHNvdXJjZVVSTCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFVucmVhZGFibGUgaXMgbm90IGVtcHR5LiBXaGF0ZXZlciB3ZSBhbHJlYWR5IGtuZXcgc3RheXMgZXhhY3RseSBhcyBpdCBpcy5cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXBwaW5nIHRoZSByZXZvY2F0aW9ucyBvZiAke3Jldm9rZVJlcG9VUkwoc291cmNlVVJMKX0sIHRoZXkgY291bGQgbm90IGJlIHJlYWQuICR7ZX1gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZXZvY2F0aW9uc1tlbnRyeS5yZXZvY2F0aW9uSWRdKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS5yZXZvY2F0aW9uc1tlbnRyeS5yZXZvY2F0aW9uSWRdID0ge1xuICAgICAgICAgICAgICAgIHJldm9jYXRpb25JZDogZW50cnkucmV2b2NhdGlvbklkLFxuICAgICAgICAgICAgICAgIGZpbmdlcnByaW50OiBlbnRyeS5maW5nZXJwcmludCxcbiAgICAgICAgICAgICAgICBpcDogZW50cnkuaXAsXG4gICAgICAgICAgICAgICAgcmV2b2tlZEF0OiBlbnRyeS5yZXZva2VkQXQsXG4gICAgICAgICAgICAgICAgcmV2b2tlZEJ5OiBlbnRyeS5yZXZva2VkQnksXG4gICAgICAgICAgICAgICAgcmVhc29uOiBlbnRyeS5yZWFzb24sXG4gICAgICAgICAgICAgICAgdW5yZXZva2VJZDogXCJcIixcbiAgICAgICAgICAgICAgICB1bnJldm9rZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlcG9ydGVkUmVtb3ZlZDogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgYXdhaXQgc2F2ZVN0YXRlKCk7XG4gICAgfVxufVxuXG4vKiogQW4gdW5yZXZva2UgY291bnRzIHRoZSBtb21lbnQgaXQgaXMgc2Vlbi5cblxuICAgIFRoZXJlIHVzZWQgdG8gYmUgYW4gaG91cidzIHdhaXQgYmVmb3JlIGhvbm91cmluZyBvbmUsIGFnYWluc3QgYSBzaWduaW5nIGtleSB0aGF0IGhhZCBpdHNlbGZcbiAgICBiZWVuIHN0b2xlbi4gSXQgd2FzIG5ldmVyIHdvcnRoIGl0OiBhbiB1bnJldm9rZSBoYXMgdG8gYmUgc2lnbmVkLCBzbyB3cml0aW5nIG9uZSBhbHJlYWR5IHRha2VzXG4gICAgdGhlIGhhcmR3YXJlIGtleSwgYW5kIGFueW9uZSBob2xkaW5nIHRoYXQgY2FuIHNpZ24gYSBuZXcgYXV0aG9yaXplZF9rZXlzIG5hbWluZyB3aGF0ZXZlciB0aGV5XG4gICAgbGlrZSAtIHRoZXkgaGF2ZSBubyByZWFzb24gdG8gZ28gbmVhciBhbiB1bnJldm9rZS4gTWVhbndoaWxlIHRoZSB3YWl0IGNvc3QgcmVhbCBhY2Nlc3MsIGFuZCBhXG4gICAgbWFjaGluZSBkZXBsb3llZCBhZnRlciBhbiBpbmNpZGVudCB3b3VsZCBmcmVlemUga2V5cyBpdCBoYWQgbmV2ZXIgaGFkIGEgcHJvYmxlbSB3aXRoLCBmb3IgYW5cbiAgICBob3VyLCBiZWNhdXNlIGl0IHdhcyBzZWVpbmcgdGhlIHVucmV2b2tlIGZvciB0aGUgZmlyc3QgdGltZS5cblxuICAgIFdoYXQgc3RpbGwgcHJvdGVjdHMgYSBzdG9sZW4gc2lnbmluZyBrZXkgaXMgdGhlIDI0IGhvdXJzIGJlZm9yZSBhIE5FVyBzaWduZXIgaXMgYWNjZXB0ZWQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlVbnJldm9rZXMoc291cmNlVVJMczogc3RyaW5nW10pIHtcbiAgICBsZXQgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgIGxldCB1bnJldm9rZXM6IFVucmV2b2tlcyA9IHsgcGFpcnM6IG5ldyBNYXAoKSwgbGVnYWN5SWRzOiBuZXcgTWFwKCkgfTtcbiAgICBmb3IgKGxldCBzb3VyY2VVUkwgb2Ygc291cmNlVVJMcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IGF3YWl0IHJlYWRVbnJldm9rZXMoc291cmNlVVJMKTtcbiAgICAgICAgICAgIGZvciAobGV0IFtwYWlyLCBpZHNdIG9mIHNvdXJjZS5wYWlycykge1xuICAgICAgICAgICAgICAgIHVucmV2b2tlcy5wYWlycy5zZXQocGFpciwgWy4uLih1bnJldm9rZXMucGFpcnMuZ2V0KHBhaXIpIHx8IFtdKSwgLi4uaWRzXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBbcmV2b2NhdGlvbklkLCBpZHNdIG9mIHNvdXJjZS5sZWdhY3lJZHMpIHtcbiAgICAgICAgICAgICAgICB1bnJldm9rZXMubGVnYWN5SWRzLnNldChyZXZvY2F0aW9uSWQsIFsuLi4odW5yZXZva2VzLmxlZ2FjeUlkcy5nZXQocmV2b2NhdGlvbklkKSB8fCBbXSksIC4uLmlkc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBVbnJlYWRhYmxlIGlzIG5vdCBcInRoZXJlIGFyZSBubyB1bnJldm9rZXNcIi4gVGhlIHJldm9jYXRpb25zIHNpbXBseSBzdGFuZC5cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXBwaW5nIHRoZSB1bnJldm9rZXMgb2YgJHtzb3VyY2VVUkx9LCB0aGV5IGNvdWxkIG5vdCBiZSByZWFkLiAke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgcmV2b2NhdGlvbiBvZiBPYmplY3QudmFsdWVzKHN0YXRlLnJldm9jYXRpb25zKSkge1xuICAgICAgICBpZiAocmV2b2NhdGlvbi51bnJldm9rZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb3ZlcmluZyA9IHVucmV2b2tlc0Zvcih1bnJldm9rZXMsIHJldm9jYXRpb24pO1xuICAgICAgICBpZiAoIWNvdmVyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVucmV2b2tlSWQgPSBjb3ZlcmluZ1swXTtcbiAgICAgICAgcmV2b2NhdGlvbi51bnJldm9rZUlkID0gdW5yZXZva2VJZDtcbiAgICAgICAgcmV2b2NhdGlvbi51bnJldm9rZWQgPSB0cnVlO1xuICAgICAgICByZXZvY2F0aW9uLnJlcG9ydGVkUmVtb3ZlZCA9IGZhbHNlO1xuICAgICAgICBhd2FpdCBzYXZlU3RhdGUoKTtcbiAgICAgICAgLy8gT25seSBtZWFucyBhbnl0aGluZyBpZiB0aGUga2V5IGNvbWVzIGJhY2sgaW50byB0aGUgZmlsZSwgc28gaXQgaXMgc2FpZCB0aGVyZS5cbiAgICAgICAgYWRkQ2hhbmdlUmVhc29uKFxuICAgICAgICAgICAgYFVuZnJvemUgYSBrZXkgZm9yIFxcYCR7cmV2b2NhdGlvbi5pcH1cXGAuIEl0IHdhcyBmcm96ZW4gZm9yIGJlaW5nIHVzZWQgZnJvbSB0aGVyZSwgYW5kYFxuICAgICAgICAgICAgKyBgICR7dW5yZXZva2VJZH0gc2F5cyB0aGF0IGFkZHJlc3MgaXMgYWxsb3dlZCBhZnRlciBhbGwuYFxuICAgICAgICApO1xuICAgIH1cbn1cblxuLyoqIFJlcG9ydHMgZWFjaCByZXZvY2F0aW9uIHRoZSBmaXJzdCB0aW1lIGl0IGFjdHVhbGx5IHRha2VzIGEga2V5IG91dCBvZiB0aGlzIG1hY2hpbmUncyBmaWxlLiBUaGVcbiAgICBkcm9wcGluZyBpdHNlbGYgaGFwcGVucyBpbiByZWFkU2lnbmVkUmVwbywgd2hpY2ggc3RyaXBzIHJldm9rZWQga2V5cyBiZWZvcmUgYW55dGhpbmcgcmVhZHMgdGhlbVxuICAgIC0gdGhpcyBvbmx5IHNheXMgc28sIGFuZCBraWxscyB3aGF0ZXZlciBzZXNzaW9ucyB0aGUga2V5IHdhcyBob2xkaW5nIG9wZW4uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwb3J0UmV2b2tlZEtleXMoKSB7XG4gICAgbGV0IHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICBmb3IgKGxldCByZXZvY2F0aW9uIG9mIE9iamVjdC52YWx1ZXMoc3RhdGUucmV2b2NhdGlvbnMpKSB7XG4gICAgICAgIGlmIChyZXZvY2F0aW9uLnVucmV2b2tlZCB8fCByZXZvY2F0aW9uLnJlcG9ydGVkUmVtb3ZlZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV2b2NhdGlvbi5yZXBvcnRlZFJlbW92ZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCBzYXZlU3RhdGUoKTtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgZmlsZS4gSXQgbGVmdCBsb25nIGFnbywgYW5kIHRoaXMgaXMgYSBtYWNoaW5lIHRoYXRcbiAgICAgICAgLy8gcmVzdGFydGVkIGFuZCByZWFkIHRoZSByZXZvY2F0aW9uIGJhY2sgb3V0IG9mIHRoZSByZXBvLlxuICAgICAgICBsZXQga2V5ID0gc3RhdGUuYXBwbGllZEtleXMuZmluZChhcHBsaWVkID0+IGtleUZpbmdlcnByaW50KGFwcGxpZWQpID09PSByZXZvY2F0aW9uLmZpbmdlcnByaW50KTtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoYXRldmVyIHRoYXQga2V5IGlzIGhvbGRpbmcgb3BlbiBnb2VzIHdpdGggaXQuXG4gICAgICAgIGxldCBlbmRlZCA9IGRlc2NyaWJlQWxsRW5kZWQoYXdhaXQgZW5kQWxsU1NIU2Vzc2lvbnMoKSk7XG4gICAgICAgIGFkZExlYWRpbmdDaGFuZ2VSZWFzb24oe1xuICAgICAgICAgICAgaGVhZGxpbmU6IGBTVVNQSUNJT1VTIElQICR7cmV2b2NhdGlvbi5pcCB8fCBcInVua25vd25cIn0gRlJPWkUgS0VZICR7a2V5TmljZU5hbWUoa2V5KX1gLFxuICAgICAgICAgICAgYm9keTpcbiAgICAgICAgICAgICAgICBgQW5vdGhlciBtYWNoaW5lIHNhdyB0aGlzIGtleSB1c2VkIGZyb20gYW4gYWRkcmVzcyBpdCBpcyBub3QgYWxsb3dlZCBmcm9tLCBhbmRgXG4gICAgICAgICAgICAgICAgKyBgIGZyb3plIGl0IGV2ZXJ5d2hlcmUuIFRoaXMgbWFjaGluZSBoYXMgc3RvcHBlZCBhY2NlcHRpbmcgaXQgdG9vLiR7ZW5kZWR9YFxuICAgICAgICAgICAgICAgICsgYFxcblxcbmtleTogXFxgJHtzdW1tYXJpemVLZXkoa2V5KX1cXGBgXG4gICAgICAgICAgICAgICAgKyBgXFxuJHtkZXNjcmliZVJldm9jYXRpb24ocmV2b2NhdGlvbil9YCxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
323
- /* _JS_SOURCE_HASH = "a4209df94bbfce0817a7b2ba2eb5c9c155514fcb8be4d09cde798255565361e5"; */
322
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2b2NhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJldm9jYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkRBQTZCO0FBQzdCLGdEQUF3QjtBQUN4QixtQ0FBcUM7QUFDckMsc0RBQThFO0FBQzlFLGtEQUFnRTtBQUNoRSx3Q0FBNEM7QUFDNUMsK0JBQStCO0FBQy9CLDJDQUFnSDtBQUNoSCx5REFBK0Q7QUFDL0QsdUNBQW9FO0FBQ3BFLHlDQUFpRTtBQUNqRSxtQ0FBOEM7QUFDOUMsMkRBQTJEO0FBRTNELG1HQUFtRztBQUNuRyxtR0FBbUc7QUFDbkcsZ0dBQWdHO0FBQ2hHLDBGQUEwRjtBQUMxRixNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUM7QUFDdEMsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDO0FBQ2xDLE1BQU0saUJBQWlCLEdBQUcsNENBQTRDLENBQUM7QUFVdkU7c0NBQ3NDO0FBQ3RDLFNBQWdCLE9BQU8sQ0FBQyxNQUEyQztJQUMvRCxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDaEQsQ0FBQztBQUZELDBCQUVDO0FBRUQsNkZBQTZGO0FBQzdGLFNBQWdCLGVBQWUsQ0FBQyxXQUFtQjtJQUMvQyxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0QsT0FBTyxHQUFHLEtBQUssSUFBSSxJQUFBLG9CQUFXLEVBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDekksQ0FBQztBQUhE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c2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBrZXlGaW5nZXJwcmludCwga2V5TmljZU5hbWUsIHN1bW1hcml6ZUtleSB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5c1wiO1xuaW1wb3J0IHsgcmV2b2tlUmVwb1BhdGgsIHJldm9rZVJlcG9VUkwgfSBmcm9tIFwiLi4vcmV2b2tlU291cmNlXCI7XG5pbXBvcnQgeyBzb3VyY2VSZXBvUGF0aCB9IGZyb20gXCIuLi9zb3VyY2VzXCI7XG5pbXBvcnQgeyBydW5HaXQgfSBmcm9tIFwiLi9naXRcIjtcbmltcG9ydCB7IGVuc3VyZVJldm9rZUtleSwgbGlzdFJlcG9EaXIsIHJlYWRSZXBvRmlsZSwgcmV2b2tlUmVwbywgc291cmNlUmVwbywgc3luY1JlcG9GaWxlcyB9IGZyb20gXCIuL3JlcG9GaWxlc1wiO1xuaW1wb3J0IHsgbWVzc2FnZVRpbWVzdGFtcCB9IGZyb20gXCIuLi8uLi9ub3RpZmljYXRpb25zL2Rpc2NvcmRcIjtcbmltcG9ydCB7IGFkZENoYW5nZVJlYXNvbiwgYWRkTGVhZGluZ0NoYW5nZVJlYXNvbiB9IGZyb20gXCIuL2NoYW5nZXNcIjtcbmltcG9ydCB7IGRlc2NyaWJlQWxsRW5kZWQsIGVuZEFsbFNTSFNlc3Npb25zIH0gZnJvbSBcIi4vc2Vzc2lvbnNcIjtcbmltcG9ydCB7IGdldFN0YXRlLCBzYXZlU3RhdGUgfSBmcm9tIFwiLi9zdGF0ZVwiO1xuaW1wb3J0IHsgcnVuSW5TZXJpYWwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuXG4vLyBBIHJldm9jYXRpb24gc2F5czogdGhpcyBrZXksIHVzZWQgZnJvbSB0aGlzIGFkZHJlc3MsIGlzIG5vIGxvbmdlciBhY2NlcHRlZC4gQW4gdW5yZXZva2Ugc2F5cyB0aGVcbi8vIG9wcG9zaXRlIGFib3V0IG9uZSBwYWlyOiB0aGlzIGtleSBpcyBhbGxvd2VkIGZyb20gdGhpcyBhZGRyZXNzLiBUaGV5IGNhbmNlbCBvdXQgd2hlbiBib3RoIGhhbHZlc1xuLy8gbWF0Y2gsIHdoaWNoIGlzIHdoeSBhIHJldm9jYXRpb24gaXMgb25lIGV2ZW50IHdpdGggYW4gaWQgb2YgaXRzIG93biwgYW5kIG5ldmVyIGEgbmFtZSBkZXJpdmVkXG4vLyBmcm9tIHRoZSBrZXkgLSBmb3JnaXZpbmcgYSBrZXkgZm9yIG9uZSBhZGRyZXNzIG11c3Qgbm90IG1ha2UgaXQgdW5yZXZva2FibGUgZXZlcnl3aGVyZS5cbmNvbnN0IFJFVk9DQVRJT05TX0RJUiA9IFwicmV2b2NhdGlvbnNcIjtcbmNvbnN0IFVOUkVWT0tFU19ESVIgPSBcInVucmV2b2tlZFwiO1xuY29uc3QgUkVWT0NBVElPTl9SRUFTT04gPSBcImF1dGhlbnRpY2F0ZWQgYWNjZXNzIGZyb20gYW4gdW5hcHByb3ZlZCBJUFwiO1xuXG5leHBvcnQgdHlwZSBBdHRlbXB0ID0ge1xuICAgIGlwOiBzdHJpbmc7XG4gICAgdXNlcjogc3RyaW5nO1xuICAgIHBvcnQ6IHN0cmluZztcbiAgICByZXF1aXJlZDogc3RyaW5nO1xuICAgIGxpbmU6IHN0cmluZztcbn07XG5cbi8qKiBXaGF0IGFuIHVucmV2b2tlIGhhcyB0byBuYW1lIHRvIHVuZG8gYSByZXZvY2F0aW9uLCBhbmQgd2hhdCBzdG9wcyBhIHNlY29uZCByZXZvY2F0aW9uIG9mIHRoZVxuICAgIHNhbWUga2V5IGZyb20gdGhlIHNhbWUgYWRkcmVzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWlyS2V5KGNvbmZpZzogeyBmaW5nZXJwcmludDogc3RyaW5nOyBpcDogc3RyaW5nIH0pIHtcbiAgICByZXR1cm4gYCR7Y29uZmlnLmZpbmdlcnByaW50fSAke2NvbmZpZy5pcH1gO1xufVxuXG4vKiogVW5pcXVlIHRvIHRoZSBldmVudC4gVGhlIHRpbWUgaXMgdGhlcmUgdG8gcmVhZCwgdGhlIHJhbmRvbSBoYWxmIGlzIHRoZXJlIHRvIGJlIHVuaXF1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdSZXZvY2F0aW9uSWQoZmluZ2VycHJpbnQ6IHN0cmluZykge1xuICAgIGxldCBzdGFtcCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9bOi5dL2csIFwiLVwiKTtcbiAgICByZXR1cm4gYCR7c3RhbXB9LSR7cmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoXCJoZXhcIil9LSR7ZmluZ2VycHJpbnQucmVwbGFjZSgvXlNIQTI1NjovLCBcIlwiKS5zbGljZSgwLCA4KS5yZXBsYWNlKC9bXkEtWmEtejAtOV0rL2csIFwiXCIpfWA7XG59XG5cbi8qKiBXaHkgYSBrZXkgc3RvcHBlZCBiZWluZyBhY2NlcHRlZCwgaW4gdGhlIHdvcmRzIG9mIHdoaWNoZXZlciBtYWNoaW5lIHNhdyBpdCBoYXBwZW4uICovXG5mdW5jdGlvbiBkZXNjcmliZVJldm9jYXRpb24ocmV2b2NhdGlvbjogeyByZXZva2VkQXQ6IHN0cmluZzsgcmV2b2tlZEJ5OiBzdHJpbmc7IHJlYXNvbjogc3RyaW5nOyBpcDogc3RyaW5nIH0pIHtcbiAgICBsZXQgd2hlbiA9IERhdGUucGFyc2UocmV2b2NhdGlvbi5yZXZva2VkQXQpO1xuICAgIGxldCBwYXJ0cyA9IFtcbiAgICAgICAgTnVtYmVyLmlzRmluaXRlKHdoZW4pID8gYHJldm9rZWQgJHttZXNzYWdlVGltZXN0YW1wKG5ldyBEYXRlKHdoZW4pKX1gIDogYHJldm9rZWQgYXQgYW4gdW5yZWNvcmRlZCB0aW1lYCxcbiAgICAgICAgcmV2b2NhdGlvbi5yZXZva2VkQnkgJiYgYGJ5IFxcYCR7cmV2b2NhdGlvbi5yZXZva2VkQnl9XFxgYCB8fCBcIlwiLFxuICAgICAgICByZXZvY2F0aW9uLnJlYXNvbiB8fCBcIlwiLFxuICAgICAgICByZXZvY2F0aW9uLmlwICYmIGBmcm9tIFxcYCR7cmV2b2NhdGlvbi5pcH1cXGBgIHx8IFwiXCIsXG4gICAgXTtcbiAgICByZXR1cm4gcGFydHMuZmlsdGVyKHBhcnQgPT4gcGFydCkuam9pbihcIiwgXCIpO1xufVxuXG5leHBvcnQgdHlwZSBSZXZvY2F0aW9uRmlsZSA9IHtcbiAgICByZXZvY2F0aW9uSWQ6IHN0cmluZztcbiAgICBmaW5nZXJwcmludDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgcmV2b2tlZEF0OiBzdHJpbmc7XG4gICAgcmV2b2tlZEJ5OiBzdHJpbmc7XG4gICAgcmVhc29uOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFJldm9jYXRpb25GaWxlcyhzb3VyY2VVUkw6IHN0cmluZyk6IFByb21pc2U8UmV2b2NhdGlvbkZpbGVbXT4ge1xuICAgIGxldCByZXBvID0gcmV2b2tlUmVwbyhzb3VyY2VVUkwpO1xuICAgIGxldCByZXZvY2F0aW9uczogUmV2b2NhdGlvbkZpbGVbXSA9IFtdO1xuICAgIGZvciAobGV0IG5hbWUgb2YgYXdhaXQgbGlzdFJlcG9EaXIocmVwbywgUkVWT0NBVElPTlNfRElSKSkge1xuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRSZXBvRmlsZShyZXBvLCBwYXRoLmpvaW4oUkVWT0NBVElPTlNfRElSLCBuYW1lKSkgfHwgXCJcIik7XG4gICAgICAgICAgICBpZiAocGFyc2VkLmZpbmdlcnByaW50KSB7XG4gICAgICAgICAgICAgICAgcmV2b2NhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHJldm9jYXRpb25JZDogcGFyc2VkLnJldm9jYXRpb25JZCB8fCBuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJcIiksXG4gICAgICAgICAgICAgICAgICAgIGZpbmdlcnByaW50OiBwYXJzZWQuZmluZ2VycHJpbnQsXG4gICAgICAgICAgICAgICAgICAgIGlwOiBwYXJzZWQuaXAgfHwgcGFyc2VkLmF0dGVtcHQ/LmlwIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJldm9rZWRBdDogcGFyc2VkLnJldm9rZWRBdCB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICByZXZva2VkQnk6IHBhcnNlZC5yZXZva2VkQnkgfHwgXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBwYXJzZWQucmVhc29uIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyB1bnJlYWRhYmxlIHJldm9jYXRpb24gJHtuYW1lfS4gJHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXZvY2F0aW9ucztcbn1cblxuLyoqIFdoaWNoIGtleSBpcyBhbGxvd2VkIGZyb20gd2hpY2ggYWRkcmVzcy4gVW5yZXZva2VzIGxpdmUgaW4gdGhlIHNvdXJjZSByZXBvLCBzbyB0aGV5IGFyZSBjb3ZlcmVkXG4gICAgYnkgaXRzIHNpZ25hdHVyZSwgYW5kIG5vdGhpbmcgaXMgcmVhZCBvdXQgb2YgdGhlbSBidXQgdGhlIHBhaXJzIHRoZXkgYWxsb3cgYW5kLCBmb3IgZmlsZXNcbiAgICB3cml0dGVuIGJlZm9yZSBwYWlycyBleGlzdGVkLCB0aGUgcmV2b2NhdGlvbiBpZHMgdGhleSBuYW1lLiAqL1xuZXhwb3J0IHR5cGUgVW5yZXZva2VzID0ge1xuICAgIC8vIGZpbmdlcnByaW50IGFuZCBpcCwgdG8gZXZlcnkgdW5yZXZva2UgdGhhdCBhbGxvd3MgdGhlbS4gRXZlcnkgb25lIHJhdGhlciB0aGFuIHRoZSBsYXN0LFxuICAgIC8vIGJlY2F1c2UgdGhlIHNhbWUgcGFpciBpcyBvZnRlbiBuYW1lZCBhZ2FpbiBieSBhIGxhdGVyIHVucmV2b2tlIGFuZCB0aGVyZSBpcyBubyByZWFzb24gdG9cbiAgICAvLyBwcmVmZXIgb25lIG92ZXIgYW5vdGhlci5cbiAgICBwYWlyczogTWFwPHN0cmluZywgc3RyaW5nW10+O1xuICAgIC8vIFJldm9jYXRpb24gaWQgdG8gdGhlIHVucmV2b2tlcyBuYW1pbmcgaXQuIE9ubHkgZm9yIHVucmV2b2tlcyB3cml0dGVuIGJlZm9yZSB0aGlzIHdhcyBhYm91dFxuICAgIC8vIHBhaXJzIGF0IGFsbCwgc28gYSBtYWNoaW5lIHJlYWRpbmcgb25lIGFscmVhZHkgaW4gYSByZXBvIHN0aWxsIGhvbm91cnMgaXQuXG4gICAgbGVnYWN5SWRzOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFVucmV2b2tlcyhzb3VyY2VVUkw6IHN0cmluZyk6IFByb21pc2U8VW5yZXZva2VzPiB7XG4gICAgbGV0IHJlcG8gPSBzb3VyY2VSZXBvKHNvdXJjZVVSTCk7XG4gICAgbGV0IHBhaXJzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgIGxldCBsZWdhY3lJZHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gICAgbGV0IGFkZCA9IChpbnRvOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4sIGtleTogc3RyaW5nLCB1bnJldm9rZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaW50by5zZXQoa2V5LCBbLi4uKGludG8uZ2V0KGtleSkgfHwgW10pLCB1bnJldm9rZUlkXSk7XG4gICAgfTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGF3YWl0IGxpc3RSZXBvRGlyKHJlcG8sIFVOUkVWT0tFU19ESVIpKSB7XG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdW5yZXZva2VJZCA9IG5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIlwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRSZXBvRmlsZShyZXBvLCBwYXRoLmpvaW4oVU5SRVZPS0VTX0RJUiwgbmFtZSkpIHx8IFwiXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgYWxsb3dlZCBvZiBwYXJzZWQuYWxsb3dlZCB8fCBbXSkge1xuICAgICAgICAgICAgICAgIC8vIEVpdGhlciBraW5kIG9mIGlkZW50aXR5OiBhbiBzc2gga2V5IG5hbWVzIGEgZmluZ2VycHJpbnQsIGEgbWFjaGluZSBhIG1hY2hpbmVJZC5cbiAgICAgICAgICAgICAgICBsZXQgaWRlbnRpdHkgPSBhbGxvd2VkLmZpbmdlcnByaW50IHx8IGFsbG93ZWQubWFjaGluZUlkO1xuICAgICAgICAgICAgICAgIGlmIChpZGVudGl0eSAmJiBhbGxvd2VkLmlwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZChwYWlycywgcGFpcktleSh7IGZpbmdlcnByaW50OiBpZGVudGl0eSwgaXA6IGFsbG93ZWQuaXAgfSksIHVucmV2b2tlSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHJldm9jYXRpb25JZCBvZiBwYXJzZWQucmV2b2NhdGlvbklkcyB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGFkZChsZWdhY3lJZHMsIHJldm9jYXRpb25JZCwgdW5yZXZva2VJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyB1bnJlYWRhYmxlIHVucmV2b2tlICR7bmFtZX0uICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBwYWlycywgbGVnYWN5SWRzIH07XG59XG5cbi8qKiBFdmVyeSB1bnJldm9rZSBjb3ZlcmluZyBvbmUgcmV2b2NhdGlvbjogYnkgdGhlIHBhaXIgaXQgaXMgYWJvdXQsIGFuZCBieSBpdHMgaWQgZm9yIHRoZSBmaWxlc1xuICAgIHdyaXR0ZW4gYmVmb3JlIHBhaXJzIGV4aXN0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZXZva2VzRm9yKHVucmV2b2tlczogVW5yZXZva2VzLCByZXZvY2F0aW9uOiB7IHJldm9jYXRpb25JZDogc3RyaW5nOyBmaW5nZXJwcmludDogc3RyaW5nOyBpcDogc3RyaW5nIH0pIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi51bnJldm9rZXMucGFpcnMuZ2V0KHBhaXJLZXkocmV2b2NhdGlvbikpIHx8IFtdLFxuICAgICAgICAuLi51bnJldm9rZXMubGVnYWN5SWRzLmdldChyZXZvY2F0aW9uLnJldm9jYXRpb25JZCkgfHwgW10sXG4gICAgXTtcbn1cblxuLyoqIFdyaXRlcyBhIHJldm9jYXRpb24sIHVubGVzcyB0aGlzIGtleSBpcyBhbHJlYWR5IHJldm9rZWQgZm9yIHRoaXMgYWRkcmVzcy4gQ2hlY2tlZCB0d2ljZTpcbiAgICBhZ2FpbnN0IHdoYXQgdGhpcyBtYWNoaW5lIGFscmVhZHkga25vd3MsIHdoaWNoIG5lZWRzIG5vIG5ldHdvcmssIGFuZCBhZ2FpbiBhZ2FpbnN0IHRoZSByZXBvXG4gICAgYWZ0ZXIgcHVsbGluZyBpdCwgc28gYSBmbG9vZCBvZiB1bmtub3duIGtleXMgY2Fubm90IHR1cm4gaW50byBhIGZsb29kIG9mIGNvbW1pdHMuXG5cbiAgICBEZWR1cGxpY2F0aW9uIGlzIG9uIHRoZSBwYWlyLiBUaGUgc2FtZSBrZXkgZnJvbSBhIHNlY29uZCBhZGRyZXNzIGlzIGEgc2Vjb25kIGV2ZW50IGFuZCBnZXRzIGl0c1xuICAgIG93biByZXZvY2F0aW9uLCBiZWNhdXNlIGFuIHVucmV2b2tlIG9ubHkgZXZlciBmb3JnaXZlcyB0aGUgcGFpciBpdCBuYW1lcy4gKi9cbmV4cG9ydCBjb25zdCByZWNvcmRSZXZvY2F0aW9uID0gcnVuSW5TZXJpYWwoYXN5bmMgKGNvbmZpZzoge1xuICAgIHNvdXJjZVVSTDogc3RyaW5nO1xuICAgIGZpbmdlcnByaW50OiBzdHJpbmc7XG4gICAga2V5TGluZTogc3RyaW5nO1xuICAgIGF0dGVtcHQ6IEF0dGVtcHQ7XG4gICAgaG9zdExhYmVsOiBzdHJpbmc7XG59KSA9PiB7XG4gICAgbGV0IHsgc291cmNlVVJMLCBmaW5nZXJwcmludCwga2V5TGluZSwgYXR0ZW1wdCwgaG9zdExhYmVsIH0gPSBjb25maWc7XG4gICAgbGV0IHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICBsZXQgcGFpciA9IHBhaXJLZXkoeyBmaW5nZXJwcmludCwgaXA6IGF0dGVtcHQuaXAgfSk7XG4gICAgaWYgKE9iamVjdC52YWx1ZXMoc3RhdGUucmV2b2NhdGlvbnMpLnNvbWUoZW50cnkgPT4gcGFpcktleShlbnRyeSkgPT09IHBhaXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3luY1JlcG9GaWxlcyhyZXZva2VSZXBvKHNvdXJjZVVSTCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IHJlY29yZCB0aGUgcmV2b2NhdGlvbiBvZiAke2ZpbmdlcnByaW50fSwgJHtyZXZva2VSZXBvVVJMKHNvdXJjZVVSTCl9IGNvdWxkIG5vdCBiZSByZWFkLiAke2V9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHJldm9jYXRpb25JZCA9IG5ld1Jldm9jYXRpb25JZChmaW5nZXJwcmludCk7XG4gICAgbGV0IGV4aXN0aW5nID0gKGF3YWl0IHJlYWRSZXZvY2F0aW9uRmlsZXMoc291cmNlVVJMKSkuZmluZChlbnRyeSA9PiBwYWlyS2V5KGVudHJ5KSA9PT0gcGFpcik7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIC8vIEFub3RoZXIgbWFjaGluZSBnb3QgdGhlcmUgZmlyc3QsIHdoaWNoIGlzIHRoZSBub3JtYWwgb3V0Y29tZSB3aGVuIHNldmVyYWwgc2VlIHRoZSBzYW1lXG4gICAgICAgIC8vIGF0dGVtcHQuIFJlY29yZCBpdCBsb2NhbGx5IHNvIHdlIG5ldmVyIGxvb2sgYWdhaW4uXG4gICAgICAgIHN0YXRlLnJldm9jYXRpb25zW2V4aXN0aW5nLnJldm9jYXRpb25JZF0gPSB7XG4gICAgICAgICAgICByZXZvY2F0aW9uSWQ6IGV4aXN0aW5nLnJldm9jYXRpb25JZCxcbiAgICAgICAgICAgIGZpbmdlcnByaW50OiBleGlzdGluZy5maW5nZXJwcmludCwgaXA6IGV4aXN0aW5nLmlwLFxuICAgICAgICAgICAgcmV2b2tlZEF0OiBleGlzdGluZy5yZXZva2VkQXQsIHJldm9rZWRCeTogZXhpc3RpbmcucmV2b2tlZEJ5LFxuICAgICAgICAgICAgcmVhc29uOiBleGlzdGluZy5yZWFzb24sXG4gICAgICAgICAgICB1bnJldm9rZUlkOiBcIlwiLCB1bnJldm9rZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcmVwb3J0ZWRSZW1vdmVkOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgc2F2ZVN0YXRlKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgcmVwb1BhdGggPSByZXZva2VSZXBvUGF0aChzb3VyY2VVUkwpO1xuICAgIGxldCBrZXlQYXRoID0gYXdhaXQgZW5zdXJlUmV2b2tlS2V5KHNvdXJjZVVSTCk7XG4gICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgUkVWT0NBVElPTlNfRElSKTtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCByZXZva2VkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIGAke3Jldm9jYXRpb25JZH0uanNvbmApLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHJldm9jYXRpb25JZCxcbiAgICAgICAgZmluZ2VycHJpbnQsXG4gICAgICAgIC8vIFRoZSB0d28gaGFsdmVzIG9mIHdoYXQgaGFwcGVuZWQuIEFuIHVucmV2b2tlIG5hbWluZyBib3RoIGlzIHdoYXQgdW5kb2VzIHRoaXMuXG4gICAgICAgIGlwOiBhdHRlbXB0LmlwLFxuICAgICAgICBrZXk6IGtleUxpbmUsXG4gICAgICAgIHJldm9rZWRBdCxcbiAgICAgICAgcmV2b2tlZEJ5OiBob3N0TGFiZWwsXG4gICAgICAgIHJlYXNvbjogUkVWT0NBVElPTl9SRUFTT04sXG4gICAgICAgIGF0dGVtcHQsXG4gICAgfSwgdW5kZWZpbmVkLCA0KSArIFwiXFxuXCIpO1xuXG4gICAgYXdhaXQgcnVuR2l0KHsgYXJnczogW1wiYWRkXCIsIFwiLUFcIl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGggfSk7XG4gICAgYXdhaXQgcnVuR2l0KHsgYXJnczogW1wiLWNcIiwgXCJ1c2VyLmVtYWlsPXBvcnRzZWN1cmVAbG9jYWxob3N0XCIsIFwiLWNcIiwgXCJ1c2VyLm5hbWU9cG9ydHNlY3VyZVwiLCBcImNvbW1pdFwiLCBcIi1tXCIsIGByZXZva2UgJHtyZXZvY2F0aW9uSWR9YF0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGggfSk7XG4gICAgbGV0IHB1c2ggPSBhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJwdXNoXCIsIFwib3JpZ2luXCIsIFwiSEVBRFwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmIChwdXNoLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAvLyBNb3N0IGxpa2VseSBhbm90aGVyIG1hY2hpbmUgcHVzaGVkIHRoZSBzYW1lIHJldm9jYXRpb24gZmlyc3QuIFRoZSBuZXh0IGNoZWNrIHdpbGwgcHVsbFxuICAgICAgICAvLyBpdCBhbmQgcmVjb3JkIGl0LCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHJ5IGhlcmUuXG4gICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3QgcHVzaCB0aGUgcmV2b2NhdGlvbiBvZiAke2ZpbmdlcnByaW50fSwgd2lsbCBwaWNrIGl0IHVwIG9uIHRoZSBuZXh0IGNoZWNrLiAkeyhwdXNoLnN0ZG91dCArIHB1c2guc3RkZXJyKS50cmltKCl9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3RhdGUucmV2b2NhdGlvbnNbcmV2b2NhdGlvbklkXSA9IHtcbiAgICAgICAgcmV2b2NhdGlvbklkLCBmaW5nZXJwcmludCwgaXA6IGF0dGVtcHQuaXAsXG4gICAgICAgIHJldm9rZWRBdCwgcmV2b2tlZEJ5OiBob3N0TGFiZWwsIHJlYXNvbjogUkVWT0NBVElPTl9SRUFTT04sXG4gICAgICAgIHVucmV2b2tlSWQ6IFwiXCIsIHVucmV2b2tlZDogZmFsc2UsXG4gICAgICAgIC8vIFRoZSBtZXNzYWdlIGJlbG93IGFscmVhZHkgc2F5cyB0aGlzIG1hY2hpbmUgaGFzIHN0b3BwZWQgYWNjZXB0aW5nIHRoZSBrZXksIHNvIHRoZSBvbmVcbiAgICAgICAgLy8gYWJvdXQgbm90aWNpbmcgYSByZXZvY2F0aW9uIHdvdWxkIG9ubHkgcmVwZWF0IGl0LlxuICAgICAgICByZXBvcnRlZFJlbW92ZWQ6IHRydWUsXG4gICAgfTtcbiAgICBhd2FpdCBzYXZlU3RhdGUoKTtcbiAgICBsZXQgZW5kZWQgPSBkZXNjcmliZUFsbEVuZGVkKGF3YWl0IGVuZEFsbFNTSFNlc3Npb25zKCkpO1xuICAgIC8vIFNhaWQgd2hlbiB0aGUgZmlsZSBpcyB3cml0dGVuLCBub3QgaGVyZSwgc28gb25lIGV2ZW50IHByb2R1Y2VzIG9uZSBtZXNzYWdlLlxuICAgIGFkZExlYWRpbmdDaGFuZ2VSZWFzb24oe1xuICAgICAgICBoZWFkbGluZTogYFNVU1BJQ0lPVVMgSVAgJHthdHRlbXB0LmlwfSBGUk9aRSBLRVkgJHtrZXlMaW5lICYmIGtleU5pY2VOYW1lKGtleUxpbmUpIHx8IGZpbmdlcnByaW50fWAsXG4gICAgICAgIGJvZHk6XG4gICAgICAgICAgICBgU29tZW9uZSBsb2dnZWQgaW4gZnJvbSAke2F0dGVtcHQuaXB9IHVzaW5nIGEga2V5IHRoYXQgaXMgbm90IGFsbG93ZWQgZnJvbSB0aGVyZS4gVGhlYFxuICAgICAgICAgICAgKyBgIGtleSBpdHNlbGYgd2FzIGNvcnJlY3QsIHNvIGVpdGhlciBzb21lb25lIGVsc2UgaGFzIGEgY29weSBvZiBpdCwgb3Igb25lIG9mIHlvdXIgb3duYFxuICAgICAgICAgICAgKyBgIGFkZHJlc3NlcyBjaGFuZ2VkLmBcbiAgICAgICAgICAgICsgYFxcblxcblRoZSBrZXkgaXMgZnJvemVuIG9uIGV2ZXJ5IG1hY2hpbmUgbm93LCBhbmQgd29ya3Mgbm93aGVyZS4ke2VuZGVkfWBcbiAgICAgICAgICAgICsgYFxcblxcbklmIHRoaXMgd2FzIGFuIGF0dGFjaywgcmVtb3ZlIHRoYXQga2V5IGZyb20gXFxgJHtzb3VyY2VVUkx9XFxgIG5vdy5gXG4gICAgICAgICAgICArIGBcXG5JZiBpdCB3YXMgeW91LCBydW46YFxuICAgICAgICAgICAgKyBgXFxuXFxgXFxgXFxgXFxuY2QgJHtzb3VyY2VSZXBvUGF0aChzb3VyY2VVUkwpfVxcbnlhcm4gdW5yZXZva2UgZ2l0XFxuXFxgXFxgXFxgYFxuICAgICAgICAgICAgKyBgXFxuSXQgYWxsb3dzICR7YXR0ZW1wdC5pcH0gb24gdGhhdCBrZXksIGFuZCB0YWtlcyBhbiBob3VyIHRvIHJlYWNoIGV2ZXJ5IG1hY2hpbmUuYFxuICAgICAgICAgICAgKyBgXFxuXFxua2V5OiBcXGAke2tleUxpbmUgJiYgc3VtbWFyaXplS2V5KGtleUxpbmUpIHx8IGZpbmdlcnByaW50fVxcYGBcbiAgICAgICAgICAgICsgYFxcbnRyaWVkIHRvIGxvZyBpbiBhczogXFxgJHthdHRlbXB0LnVzZXJ9XFxgYFxuICAgICAgICAgICAgKyBgXFxuYWxsb3dlZCBvbmx5IGZyb206IFxcYCR7YXR0ZW1wdC5yZXF1aXJlZH1cXGBgLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xufSk7XG5cbi8qKiBUYWtlcyBldmVyeXRoaW5nIHRoZSByZXZva2UgcmVwb3MgbGlzdCBpbnRvIGxvY2FsIHN0YXRlLiBPbmNlIGhlcmUgYSByZXZvY2F0aW9uIG5ldmVyIGxlYXZlcyxcbiAgICBldmVuIGlmIHRoZSBmaWxlIGlzIGRlbGV0ZWQ6IHRoZSBrZXkgdGhhdCB3cml0ZXMgcmV2b2NhdGlvbnMgaXMgb24gZXZlcnkgc2VydmVyLCBzbyBhbiBhdHRhY2tlclxuICAgIGhvbGRpbmcgaXQgY291bGQgb3RoZXJ3aXNlIGVyYXNlIHRoZSByZWNvcmQgdGhhdCBsb2NrZWQgdGhlbSBvdXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWJzb3JiUmV2b2NhdGlvbnMoc291cmNlVVJMczogc3RyaW5nW10pIHtcbiAgICBsZXQgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgc291cmNlVVJMIG9mIHNvdXJjZVVSTHMpIHtcbiAgICAgICAgbGV0IGVudHJpZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnRyaWVzID0gYXdhaXQgcmVhZFJldm9jYXRpb25GaWxlcyhzb3VyY2VVUkwpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBVbnJlYWRhYmxlIGlzIG5vdCBlbXB0eS4gV2hhdGV2ZXIgd2UgYWxyZWFkeSBrbmV3IHN0YXlzIGV4YWN0bHkgYXMgaXQgaXMuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTa2lwcGluZyB0aGUgcmV2b2NhdGlvbnMgb2YgJHtyZXZva2VSZXBvVVJMKHNvdXJjZVVSTCl9LCB0aGV5IGNvdWxkIG5vdCBiZSByZWFkLiAke2V9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUucmV2b2NhdGlvbnNbZW50cnkucmV2b2NhdGlvbklkXSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUucmV2b2NhdGlvbnNbZW50cnkucmV2b2NhdGlvbklkXSA9IHtcbiAgICAgICAgICAgICAgICByZXZvY2F0aW9uSWQ6IGVudHJ5LnJldm9jYXRpb25JZCxcbiAgICAgICAgICAgICAgICBmaW5nZXJwcmludDogZW50cnkuZmluZ2VycHJpbnQsXG4gICAgICAgICAgICAgICAgaXA6IGVudHJ5LmlwLFxuICAgICAgICAgICAgICAgIHJldm9rZWRBdDogZW50cnkucmV2b2tlZEF0LFxuICAgICAgICAgICAgICAgIHJldm9rZWRCeTogZW50cnkucmV2b2tlZEJ5LFxuICAgICAgICAgICAgICAgIHJlYXNvbjogZW50cnkucmVhc29uLFxuICAgICAgICAgICAgICAgIHVucmV2b2tlSWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgdW5yZXZva2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXBvcnRlZFJlbW92ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGF3YWl0IHNhdmVTdGF0ZSgpO1xuICAgIH1cbn1cblxuLyoqIEFuIHVucmV2b2tlIGNvdW50cyB0aGUgbW9tZW50IGl0IGlzIHNlZW4uXG5cbiAgICBUaGVyZSB1c2VkIHRvIGJlIGFuIGhvdXIncyB3YWl0IGJlZm9yZSBob25vdXJpbmcgb25lLCBhZ2FpbnN0IGEgc2lnbmluZyBrZXkgdGhhdCBoYWQgaXRzZWxmXG4gICAgYmVlbiBzdG9sZW4uIEl0IHdhcyBuZXZlciB3b3J0aCBpdDogYW4gdW5yZXZva2UgaGFzIHRvIGJlIHNpZ25lZCwgc28gd3JpdGluZyBvbmUgYWxyZWFkeSB0YWtlc1xuICAgIHRoZSBoYXJkd2FyZSBrZXksIGFuZCBhbnlvbmUgaG9sZGluZyB0aGF0IGNhbiBzaWduIGEgbmV3IGF1dGhvcml6ZWRfa2V5cyBuYW1pbmcgd2hhdGV2ZXIgdGhleVxuICAgIGxpa2UgLSB0aGV5IGhhdmUgbm8gcmVhc29uIHRvIGdvIG5lYXIgYW4gdW5yZXZva2UuIE1lYW53aGlsZSB0aGUgd2FpdCBjb3N0IHJlYWwgYWNjZXNzLCBhbmQgYVxuICAgIG1hY2hpbmUgZGVwbG95ZWQgYWZ0ZXIgYW4gaW5jaWRlbnQgd291bGQgZnJlZXplIGtleXMgaXQgaGFkIG5ldmVyIGhhZCBhIHByb2JsZW0gd2l0aCwgZm9yIGFuXG4gICAgaG91ciwgYmVjYXVzZSBpdCB3YXMgc2VlaW5nIHRoZSB1bnJldm9rZSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cbiAgICBXaGF0IHN0aWxsIHByb3RlY3RzIGEgc3RvbGVuIHNpZ25pbmcga2V5IGlzIHRoZSAyNCBob3VycyBiZWZvcmUgYSBORVcgc2lnbmVyIGlzIGFjY2VwdGVkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5VW5yZXZva2VzKHNvdXJjZVVSTHM6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICBsZXQgdW5yZXZva2VzOiBVbnJldm9rZXMgPSB7IHBhaXJzOiBuZXcgTWFwKCksIGxlZ2FjeUlkczogbmV3IE1hcCgpIH07XG4gICAgZm9yIChsZXQgc291cmNlVVJMIG9mIHNvdXJjZVVSTHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSBhd2FpdCByZWFkVW5yZXZva2VzKHNvdXJjZVVSTCk7XG4gICAgICAgICAgICBmb3IgKGxldCBbcGFpciwgaWRzXSBvZiBzb3VyY2UucGFpcnMpIHtcbiAgICAgICAgICAgICAgICB1bnJldm9rZXMucGFpcnMuc2V0KHBhaXIsIFsuLi4odW5yZXZva2VzLnBhaXJzLmdldChwYWlyKSB8fCBbXSksIC4uLmlkc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgW3Jldm9jYXRpb25JZCwgaWRzXSBvZiBzb3VyY2UubGVnYWN5SWRzKSB7XG4gICAgICAgICAgICAgICAgdW5yZXZva2VzLmxlZ2FjeUlkcy5zZXQocmV2b2NhdGlvbklkLCBbLi4uKHVucmV2b2tlcy5sZWdhY3lJZHMuZ2V0KHJldm9jYXRpb25JZCkgfHwgW10pLCAuLi5pZHNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gVW5yZWFkYWJsZSBpcyBub3QgXCJ0aGVyZSBhcmUgbm8gdW5yZXZva2VzXCIuIFRoZSByZXZvY2F0aW9ucyBzaW1wbHkgc3RhbmQuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTa2lwcGluZyB0aGUgdW5yZXZva2VzIG9mICR7c291cmNlVVJMfSwgdGhleSBjb3VsZCBub3QgYmUgcmVhZC4gJHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHJldm9jYXRpb24gb2YgT2JqZWN0LnZhbHVlcyhzdGF0ZS5yZXZvY2F0aW9ucykpIHtcbiAgICAgICAgaWYgKHJldm9jYXRpb24udW5yZXZva2VkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY292ZXJpbmcgPSB1bnJldm9rZXNGb3IodW5yZXZva2VzLCByZXZvY2F0aW9uKTtcbiAgICAgICAgaWYgKCFjb3ZlcmluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1bnJldm9rZUlkID0gY292ZXJpbmdbMF07XG4gICAgICAgIHJldm9jYXRpb24udW5yZXZva2VJZCA9IHVucmV2b2tlSWQ7XG4gICAgICAgIHJldm9jYXRpb24udW5yZXZva2VkID0gdHJ1ZTtcbiAgICAgICAgcmV2b2NhdGlvbi5yZXBvcnRlZFJlbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgc2F2ZVN0YXRlKCk7XG4gICAgICAgIC8vIE9ubHkgbWVhbnMgYW55dGhpbmcgaWYgdGhlIGtleSBjb21lcyBiYWNrIGludG8gdGhlIGZpbGUsIHNvIGl0IGlzIHNhaWQgdGhlcmUuXG4gICAgICAgIGFkZENoYW5nZVJlYXNvbihcbiAgICAgICAgICAgIGBVbmZyb3plIGEga2V5IGZvciBcXGAke3Jldm9jYXRpb24uaXB9XFxgLiBJdCB3YXMgZnJvemVuIGZvciBiZWluZyB1c2VkIGZyb20gdGhlcmUsIGFuZGBcbiAgICAgICAgICAgICsgYCAke3VucmV2b2tlSWR9IHNheXMgdGhhdCBhZGRyZXNzIGlzIGFsbG93ZWQgYWZ0ZXIgYWxsLmBcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbi8qKiBSZXBvcnRzIGVhY2ggcmV2b2NhdGlvbiB0aGUgZmlyc3QgdGltZSBpdCBhY3R1YWxseSB0YWtlcyBhIGtleSBvdXQgb2YgdGhpcyBtYWNoaW5lJ3MgZmlsZS4gVGhlXG4gICAgZHJvcHBpbmcgaXRzZWxmIGhhcHBlbnMgaW4gcmVhZFNpZ25lZFJlcG8sIHdoaWNoIHN0cmlwcyByZXZva2VkIGtleXMgYmVmb3JlIGFueXRoaW5nIHJlYWRzIHRoZW1cbiAgICAtIHRoaXMgb25seSBzYXlzIHNvLCBhbmQga2lsbHMgd2hhdGV2ZXIgc2Vzc2lvbnMgdGhlIGtleSB3YXMgaG9sZGluZyBvcGVuLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcG9ydFJldm9rZWRLZXlzKCkge1xuICAgIGxldCBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgZm9yIChsZXQgcmV2b2NhdGlvbiBvZiBPYmplY3QudmFsdWVzKHN0YXRlLnJldm9jYXRpb25zKSkge1xuICAgICAgICBpZiAocmV2b2NhdGlvbi51bnJldm9rZWQgfHwgcmV2b2NhdGlvbi5yZXBvcnRlZFJlbW92ZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldm9jYXRpb24ucmVwb3J0ZWRSZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgc2F2ZVN0YXRlKCk7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIGZpbGUuIEl0IGxlZnQgbG9uZyBhZ28sIGFuZCB0aGlzIGlzIGEgbWFjaGluZSB0aGF0XG4gICAgICAgIC8vIHJlc3RhcnRlZCBhbmQgcmVhZCB0aGUgcmV2b2NhdGlvbiBiYWNrIG91dCBvZiB0aGUgcmVwby5cbiAgICAgICAgbGV0IGtleSA9IHN0YXRlLmFwcGxpZWRLZXlzLmZpbmQoYXBwbGllZCA9PiBrZXlGaW5nZXJwcmludChhcHBsaWVkKSA9PT0gcmV2b2NhdGlvbi5maW5nZXJwcmludCk7XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGF0ZXZlciB0aGF0IGtleSBpcyBob2xkaW5nIG9wZW4gZ29lcyB3aXRoIGl0LlxuICAgICAgICBsZXQgZW5kZWQgPSBkZXNjcmliZUFsbEVuZGVkKGF3YWl0IGVuZEFsbFNTSFNlc3Npb25zKCkpO1xuICAgICAgICBhZGRMZWFkaW5nQ2hhbmdlUmVhc29uKHtcbiAgICAgICAgICAgIGhlYWRsaW5lOiBgU1VTUElDSU9VUyBJUCAke3Jldm9jYXRpb24uaXAgfHwgXCJ1bmtub3duXCJ9IEZST1pFIEtFWSAke2tleU5pY2VOYW1lKGtleSl9YCxcbiAgICAgICAgICAgIGJvZHk6XG4gICAgICAgICAgICAgICAgYEFub3RoZXIgbWFjaGluZSBzYXcgdGhpcyBrZXkgdXNlZCBmcm9tIGFuIGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbSwgYW5kYFxuICAgICAgICAgICAgICAgICsgYCBmcm96ZSBpdCBldmVyeXdoZXJlLiBUaGlzIG1hY2hpbmUgaGFzIHN0b3BwZWQgYWNjZXB0aW5nIGl0IHRvby4ke2VuZGVkfWBcbiAgICAgICAgICAgICAgICArIGBcXG5cXG5rZXk6IFxcYCR7c3VtbWFyaXplS2V5KGtleSl9XFxgYFxuICAgICAgICAgICAgICAgICsgYFxcbiR7ZGVzY3JpYmVSZXZvY2F0aW9uKHJldm9jYXRpb24pfWAsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
323
+ /* _JS_SOURCE_HASH = "637b5a7e317a8b3908cd9dfac138c2eb1ebdf8bde38f5051c3fc72a5d91f9f44"; */
@@ -30,6 +30,7 @@ exports.revocationIdentity = revocationIdentity;
30
30
  On a machine that is already a portsecure host there may be no such credentials, but the source
31
31
  deploy key is right there, and the key derived from it is one that repo definitely accepts. */
32
32
  async function readRemoteRevocations(config) {
33
+ var _a;
33
34
  let { sourceURL } = config;
34
35
  let temporaryDirectory = await promises_1.default.mkdtemp(path_1.default.join(os_1.default.tmpdir(), "unrevoke-"));
35
36
  let repoPath = path_1.default.join(temporaryDirectory, "repo");
@@ -50,16 +51,24 @@ async function readRemoteRevocations(config) {
50
51
  }
51
52
  let revocations = [];
52
53
  let directory = path_1.default.join(repoPath, REVOCATIONS_DIR);
54
+ let names = [];
53
55
  try {
54
- for (let name of (await promises_1.default.readdir(directory)).sort()) {
55
- if (name.endsWith(".json")) {
56
- revocations.push(JSON.parse(await promises_1.default.readFile(path_1.default.join(directory, name), "utf8")));
57
- }
58
- }
56
+ names = (await promises_1.default.readdir(directory)).sort();
59
57
  }
60
58
  catch (e) {
61
59
  // No revocations directory at all just means nothing has ever been revoked.
62
60
  }
61
+ for (let name of names) {
62
+ if (!name.endsWith(".json")) {
63
+ continue;
64
+ }
65
+ try {
66
+ revocations.push(JSON.parse(await promises_1.default.readFile(path_1.default.join(directory, name), "utf8")));
67
+ }
68
+ catch (e) {
69
+ console.log(`Ignoring unreadable revocation ${REVOCATIONS_DIR}/${name} in ${(0, revokeSource_1.revokeRepoURL)(sourceURL)}. ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
70
+ }
71
+ }
63
72
  await promises_1.default.rm(temporaryDirectory, { recursive: true, force: true });
64
73
  return revocations;
65
74
  }
@@ -118,5 +127,5 @@ async function revokedKeysInRepo(config) {
118
127
  .map(revocation => ({ revocation, key: keys.find(key => (0, authorizedKeys_1.keyFingerprint)(key) === revocation.fingerprint) || "" }));
119
128
  }
120
129
  exports.revokedKeysInRepo = revokedKeysInRepo;
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5yZXZva2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1bnJldm9rZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixxREFBaUU7QUFDakUsaURBQWdFO0FBQ2hFLHVDQUEwQztBQUMxQyw0Q0FBZ0Q7QUFFbkMsUUFBQSxhQUFhLEdBQUcsV0FBVyxDQUFDO0FBQ3pDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQztBQXFCdEMsbUVBQW1FO0FBQ25FLFNBQWdCLFlBQVksQ0FBQyxVQUFzQjs7SUFDL0MsT0FBTyxVQUFVLENBQUMsRUFBRSxLQUFJLE1BQUEsVUFBVSxDQUFDLE9BQU8sMENBQUUsRUFBRSxDQUFBLElBQUksRUFBRSxDQUFDO0FBQ3pELENBQUM7QUFGRCxvQ0FFQztBQUVELHNGQUFzRjtBQUN0RixTQUFnQixrQkFBa0IsQ0FBQyxVQUFzQjtJQUNyRCxPQUFPLFVBQVUsQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7QUFDaEUsQ0FBQztBQUZELGdEQUVDO0FBRUQ7Ozs7a0dBSWtHO0FBQzNGLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxNQUE2QjtJQUNyRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQzNCLElBQUksa0JBQWtCLEdBQUcsTUFBTSxrQkFBRSxDQUFDLE9BQU8sQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQy9FLElBQUksUUFBUSxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFBLDRCQUFhLEVBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLENB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RixDQUFDO0FBQ04sQ0FBQztBQUxELHdDQUtDO0FBRUQsa0ZBQWtGO0FBQzNFLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxNQUErQztJQUNuRixJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNyQyxJQUFJLFdBQVcsR0FBRyxNQUFNLHFCQUFxQixDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM3RCxJQUFJLFNBQVMsR0FBRyxNQUFNLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELElBQUksWUFBWSxHQUFHLGNBQWMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDMUQsSUFBSSxJQUFJLEdBQUcsSUFBQSw4QkFBYSxFQUFDLE1BQU0sa0JBQUUsQ0FBQyxRQUFRLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RyxPQUFPLFlBQVk7U0FDZCxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBQSwrQkFBYyxFQUFDLEdBQUcsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN0RixHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBQSwrQkFBYyxFQUFDLEdBQUcsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUgsQ0FBQztBQVRELDhDQVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGtleUZpbmdlcnByaW50LCBub3JtYWxpemVLZXlzIH0gZnJvbSBcIi4vYXV0aG9yaXplZEtleXNcIjtcbmltcG9ydCB7IGRlcml2ZVJldm9rZUtleSwgcmV2b2tlUmVwb1VSTCB9IGZyb20gXCIuL3Jldm9rZVNvdXJjZVwiO1xuaW1wb3J0IHsgZmluZFNvdXJjZUtleSB9IGZyb20gXCIuL3NvdXJjZXNcIjtcbmltcG9ydCB7IHNwYXduUHJvbWlzZSB9IGZyb20gXCIuLi9oZWxwZXJzL3NwYXduXCI7XG5cbmV4cG9ydCBjb25zdCBVTlJFVk9LRVNfRElSID0gXCJ1bnJldm9rZWRcIjtcbmNvbnN0IFJFVk9DQVRJT05TX0RJUiA9IFwicmV2b2NhdGlvbnNcIjtcblxuLyoqIE9uZSByZXZvY2F0aW9uIGV2ZW50LiBFaXRoZXIgYW4gc3NoIGtleSB1c2VkIGZyb20gYW4gYWRkcmVzcyBpdCBpcyBub3QgYWxsb3dlZCBmcm9tLCBvciBhXG4gICAgbWFjaGluZSB0aGF0IHRhbGtlZCB0byB1cyBmcm9tIG9uZS4gQm90aCBhcmUgdGhlIHNhbWUgc2hhcGUgLSBhbiBpZGVudGl0eSBhbmQgYW4gYWRkcmVzcyAtIGFuZFxuICAgIGFuIHVucmV2b2tlIHVuZG9lcyBlaXRoZXIgYnkgYWxsb3dpbmcgdGhhdCBzYW1lIHBhaXIuXG5cbiAgICBXaGljaCBpcyB3aHkgdW5yZXZva2luZyBuZXZlciBtYWtlcyBhbnl0aGluZyB1bnJldm9rYWJsZTogdXNlZCBmcm9tIHNvbWUgb3RoZXIgYWRkcmVzcywgaXQgaXNcbiAgICByZXZva2VkIGFnYWluLCB1bmRlciBhIG5ldyBpZCBubyBleGlzdGluZyB1bnJldm9rZSBuYW1lcy4gKi9cbmV4cG9ydCB0eXBlIFJldm9jYXRpb24gPSB7XG4gICAgcmV2b2NhdGlvbklkOiBzdHJpbmc7XG4gICAgLy8gRXhhY3RseSBvbmUgb2YgdGhlc2UuIEEga2V5IHJldm9jYXRpb24gbmFtZXMgYSBmaW5nZXJwcmludCwgYSBtYWNoaW5lIHJldm9jYXRpb24gYSBtYWNoaW5lSWQuXG4gICAgZmluZ2VycHJpbnQ/OiBzdHJpbmc7XG4gICAgbWFjaGluZUlkPzogc3RyaW5nO1xuICAgIGlwPzogc3RyaW5nO1xuICAgIGtleT86IHN0cmluZztcbiAgICByZXZva2VkQXQ/OiBzdHJpbmc7XG4gICAgcmV2b2tlZEJ5Pzogc3RyaW5nO1xuICAgIHJlYXNvbj86IHN0cmluZztcbiAgICBhdHRlbXB0PzogeyBpcD86IHN0cmluZzsgdXNlcj86IHN0cmluZzsgcmVxdWlyZWQ/OiBzdHJpbmcgfTtcbn07XG5cbi8qKiBPbGRlciByZXZvY2F0aW9uIGZpbGVzIGNhcnJ5IHRoZSBhZGRyZXNzIHVuZGVyIGF0dGVtcHQgb25seS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXZvY2F0aW9uSVAocmV2b2NhdGlvbjogUmV2b2NhdGlvbikge1xuICAgIHJldHVybiByZXZvY2F0aW9uLmlwIHx8IHJldm9jYXRpb24uYXR0ZW1wdD8uaXAgfHwgXCJcIjtcbn1cblxuLyoqIFdoYXQgdGhlIHJldm9jYXRpb24gaXMgYWJvdXQsIHdoaWNoIGlzIHdoYXQgYW4gdW5yZXZva2UgaGFzIHRvIG5hbWUgdG8gdW5kbyBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXZvY2F0aW9uSWRlbnRpdHkocmV2b2NhdGlvbjogUmV2b2NhdGlvbikge1xuICAgIHJldHVybiByZXZvY2F0aW9uLmZpbmdlcnByaW50IHx8IHJldm9jYXRpb24ubWFjaGluZUlkIHx8IFwiXCI7XG59XG5cbi8qKiBFdmVyeSByZXZvY2F0aW9uIHRoZSByZXZva2UgcmVwbyBsaXN0cy4gQ2xvbmVkIHJlYWQgb25seSBpbnRvIGEgdGVtcCBkaXJlY3RvcnkuXG5cbiAgICBBIHBlcnNvbiBydW5uaW5nIHRoaXMgaGFzIHRoZWlyIG93biBhY2Nlc3MgdG8gdGhlIHJlcG8sIHNvIHRoZWlyIGNyZWRlbnRpYWxzIGFyZSB3aGF0IGlzIHVzZWQuXG4gICAgT24gYSBtYWNoaW5lIHRoYXQgaXMgYWxyZWFkeSBhIHBvcnRzZWN1cmUgaG9zdCB0aGVyZSBtYXkgYmUgbm8gc3VjaCBjcmVkZW50aWFscywgYnV0IHRoZSBzb3VyY2VcbiAgICBkZXBsb3kga2V5IGlzIHJpZ2h0IHRoZXJlLCBhbmQgdGhlIGtleSBkZXJpdmVkIGZyb20gaXQgaXMgb25lIHRoYXQgcmVwbyBkZWZpbml0ZWx5IGFjY2VwdHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFJlbW90ZVJldm9jYXRpb25zKGNvbmZpZzogeyBzb3VyY2VVUkw6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgc291cmNlVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHRlbXBvcmFyeURpcmVjdG9yeSA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcInVucmV2b2tlLVwiKSk7XG4gICAgbGV0IHJlcG9QYXRoID0gcGF0aC5qb2luKHRlbXBvcmFyeURpcmVjdG9yeSwgXCJyZXBvXCIpO1xuICAgIGxldCBjbG9uZUFyZ3MgPSBbXCJjbG9uZVwiLCBcIi0tZGVwdGhcIiwgXCIxXCIsIHJldm9rZVJlcG9VUkwoc291cmNlVVJMKSwgcmVwb1BhdGhdO1xuICAgIGxldCBzb3VyY2VLZXkgPSBhd2FpdCBmaW5kU291cmNlS2V5KHNvdXJjZVVSTCk7XG4gICAgaWYgKHNvdXJjZUtleSkge1xuICAgICAgICBsZXQgZGVyaXZlZCA9IGRlcml2ZVJldm9rZUtleShhd2FpdCBmcy5yZWFkRmlsZShzb3VyY2VLZXksIFwidXRmOFwiKSk7XG4gICAgICAgIGxldCBkZXJpdmVkS2V5UGF0aCA9IHBhdGguam9pbih0ZW1wb3JhcnlEaXJlY3RvcnksIFwia2V5XCIpO1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZGVyaXZlZEtleVBhdGgsIGRlcml2ZWQucHJpdmF0ZUtleUZpbGUsIHsgbW9kZTogMG82MDAgfSk7XG4gICAgICAgIGxldCBzc2hDb21tYW5kID0gYHNzaCAtaSAke2Rlcml2ZWRLZXlQYXRofSAtbyBJZGVudGl0aWVzT25seT15ZXMgLW8gQmF0Y2hNb2RlPXllcyAtbyBTdHJpY3RIb3N0S2V5Q2hlY2tpbmc9YWNjZXB0LW5ld2A7XG4gICAgICAgIGNsb25lQXJncyA9IFtcIi1jXCIsIGBjb3JlLnNzaENvbW1hbmQ9JHtzc2hDb21tYW5kfWAsIC4uLmNsb25lQXJnc107XG4gICAgfVxuICAgIGxldCBjbG9uZSA9IGF3YWl0IHNwYXduUHJvbWlzZSh7IGNvbW1hbmQ6IFwiZ2l0XCIsIGFyZ3M6IGNsb25lQXJncyB9KTtcbiAgICBpZiAoY2xvbmUuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGF3YWl0IGZzLnJtKHRlbXBvcmFyeURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgdG8gYmUgYWJsZSB0byByZWFkICR7cmV2b2tlUmVwb1VSTChzb3VyY2VVUkwpfS5cXG5gXG4gICAgICAgICAgICArIGAkeyhjbG9uZS5zdGRvdXQgKyBjbG9uZS5zdGRlcnIpLnRyaW0oKX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGxldCByZXZvY2F0aW9uczogUmV2b2NhdGlvbltdID0gW107XG4gICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgUkVWT0NBVElPTlNfRElSKTtcbiAgICB0cnkge1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIChhd2FpdCBmcy5yZWFkZGlyKGRpcmVjdG9yeSkpLnNvcnQoKSkge1xuICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIHJldm9jYXRpb25zLnB1c2goSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LCBuYW1lKSwgXCJ1dGY4XCIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIE5vIHJldm9jYXRpb25zIGRpcmVjdG9yeSBhdCBhbGwganVzdCBtZWFucyBub3RoaW5nIGhhcyBldmVyIGJlZW4gcmV2b2tlZC5cbiAgICB9XG4gICAgYXdhaXQgZnMucm0odGVtcG9yYXJ5RGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuIHJldm9jYXRpb25zO1xufVxuXG4vKiogV2hhdCB0aGUgdW5yZXZva2VzIGFscmVhZHkgaW4gYSByZXBvIGFsbG93OiBcIjxpZGVudGl0eT4gPGFkZHJlc3M+XCIgZm9yIGVhY2ggcGFpciwgcGx1cyB0aGUgYmFyZVxuICAgIHJldm9jYXRpb24gaWRzIHRoZSBvbGRlciBmb3JtYXQgbmFtZWQuXG5cbiAgICBSZWFkIG91dCBvZiB0aGUgcmVwbyByYXRoZXIgdGhhbiBvdXQgb2YgdGhlIGRhZW1vbidzIGFic29yYmVkIHN0YXRlLCBiZWNhdXNlIHdob2V2ZXIgcnVucyBhIGNsaVxuICAgIGlzIGxvb2tpbmcgYXQgYSBjaGVja291dCBhbmQgaGFzIG5vIGRhZW1vbiBpbiB0aGUgcHJvY2VzcyB0byBhc2suICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFVucmV2b2tlZEluUmVwbyhyZXBvUGF0aDogc3RyaW5nKSB7XG4gICAgbGV0IHVucmV2b2tlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIFVOUkVWT0tFU19ESVIpO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpLCBcInV0ZjhcIikpO1xuICAgICAgICAgICAgZm9yIChsZXQgYWxsb3dlZCBvZiBwYXJzZWQuYWxsb3dlZCB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGxldCBpZGVudGl0eSA9IGFsbG93ZWQuZmluZ2VycHJpbnQgfHwgYWxsb3dlZC5tYWNoaW5lSWQ7XG4gICAgICAgICAgICAgICAgaWYgKGlkZW50aXR5ICYmIGFsbG93ZWQuaXApIHtcbiAgICAgICAgICAgICAgICAgICAgdW5yZXZva2VkLmFkZChgJHtpZGVudGl0eX0gJHthbGxvd2VkLmlwfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5hbWVkIGlkcywgZm9yIHRoZSB1bnJldm9rZXMgd3JpdHRlbiBiZWZvcmUgdGhpcyB3YXMgYWJvdXQgcGFpcnMuXG4gICAgICAgICAgICBmb3IgKGxldCByZXZvY2F0aW9uSWQgb2YgcGFyc2VkLnJldm9jYXRpb25JZHMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICB1bnJldm9rZWQuYWRkKHJldm9jYXRpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgaGFzIGJlZW4gdW5yZXZva2VkLlxuICAgIH1cbiAgICByZXR1cm4gdW5yZXZva2VkO1xufVxuXG4vKiogVGhlIHJldm9jYXRpb25zIHRob3NlIHVucmV2b2tlcyBoYXZlIG5vdCBhbHJlYWR5IHVuZG9uZS5cblxuICAgIE1hdGNoZWQgb24gcmV2b2NhdGlvbklkZW50aXR5LCBub3Qgb24gZmluZ2VycHJpbnQ6IGEgbWFjaGluZSByZXZvY2F0aW9uIGNhcnJpZXMgYSBtYWNoaW5lSWQgYW5kXG4gICAgbm8gZmluZ2VycHJpbnQsIHNvIGNvbXBhcmluZyBmaW5nZXJwcmludHMgbGVhdmVzIGV2ZXJ5IG1hY2hpbmUgbG9va2luZyByZXZva2VkIGZvcmV2ZXIgbm8gbWF0dGVyXG4gICAgaG93IG1hbnkgdGltZXMgaXQgaXMgdW5yZXZva2VkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0aWxsUmV2b2tlZEJ5KHJldm9jYXRpb25zOiBSZXZvY2F0aW9uW10sIHVucmV2b2tlZDogU2V0PHN0cmluZz4pIHtcbiAgICByZXR1cm4gcmV2b2NhdGlvbnMuZmlsdGVyKHJldm9jYXRpb24gPT5cbiAgICAgICAgIXVucmV2b2tlZC5oYXMocmV2b2NhdGlvbi5yZXZvY2F0aW9uSWQpXG4gICAgICAgICYmICF1bnJldm9rZWQuaGFzKGAke3Jldm9jYXRpb25JZGVudGl0eShyZXZvY2F0aW9uKX0gJHtyZXZvY2F0aW9uSVAocmV2b2NhdGlvbil9YClcbiAgICApO1xufVxuXG4vKiogV2hpY2gga2V5cyBpbiBhIHJlcG8gYXJlIHJldm9rZWQuIFdoYXQgc2lnbmZpbGVzIGFuZCBzZWN1cmVzc2ggcmVmdXNlIG92ZXIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV2b2tlZEtleXNJblJlcG8oY29uZmlnOiB7IHJlcG9QYXRoOiBzdHJpbmc7IHNvdXJjZVVSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyByZXBvUGF0aCwgc291cmNlVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJldm9jYXRpb25zID0gYXdhaXQgcmVhZFJlbW90ZVJldm9jYXRpb25zKHsgc291cmNlVVJMIH0pO1xuICAgIGxldCB1bnJldm9rZWQgPSBhd2FpdCByZWFkVW5yZXZva2VkSW5SZXBvKHJlcG9QYXRoKTtcbiAgICBsZXQgc3RpbGxSZXZva2VkID0gc3RpbGxSZXZva2VkQnkocmV2b2NhdGlvbnMsIHVucmV2b2tlZCk7XG4gICAgbGV0IGtleXMgPSBub3JtYWxpemVLZXlzKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihyZXBvUGF0aCwgXCJhdXRob3JpemVkX2tleXNcIiksIFwidXRmOFwiKS5jYXRjaCgoKSA9PiBcIlwiKSk7XG4gICAgcmV0dXJuIHN0aWxsUmV2b2tlZFxuICAgICAgICAuZmlsdGVyKHJldm9jYXRpb24gPT4ga2V5cy5zb21lKGtleSA9PiBrZXlGaW5nZXJwcmludChrZXkpID09PSByZXZvY2F0aW9uLmZpbmdlcnByaW50KSlcbiAgICAgICAgLm1hcChyZXZvY2F0aW9uID0+ICh7IHJldm9jYXRpb24sIGtleToga2V5cy5maW5kKGtleSA9PiBrZXlGaW5nZXJwcmludChrZXkpID09PSByZXZvY2F0aW9uLmZpbmdlcnByaW50KSB8fCBcIlwiIH0pKTtcbn1cbiJdfQ==
122
- /* _JS_SOURCE_HASH = "6b290d33f04c0af3502c45031cb23c5019ea5b831a00de570e8417367d6fc180"; */
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5yZXZva2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1bnJldm9rZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixxREFBaUU7QUFDakUsaURBQWdFO0FBQ2hFLHVDQUEwQztBQUMxQyw0Q0FBZ0Q7QUFFbkMsUUFBQSxhQUFhLEdBQUcsV0FBVyxDQUFDO0FBQ3pDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQztBQXFCdEMsbUVBQW1FO0FBQ25FLFNBQWdCLFlBQVksQ0FBQyxVQUFzQjs7SUFDL0MsT0FBTyxVQUFVLENBQUMsRUFBRSxLQUFJLE1BQUEsVUFBVSxDQUFDLE9BQU8sMENBQUUsRUFBRSxDQUFBLElBQUksRUFBRSxDQUFDO0FBQ3pELENBQUM7QUFGRCxvQ0FFQztBQUVELHNGQUFzRjtBQUN0RixTQUFnQixrQkFBa0IsQ0FBQyxVQUFzQjtJQUNyRCxPQUFPLFVBQVUsQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7QUFDaEUsQ0FBQztBQUZELGdEQUVDO0FBRUQ7Ozs7a0dBSWtHO0FBQzNGLEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxNQUE2Qjs7SUFDckUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUMzQixJQUFJLGtCQUFrQixHQUFHLE1BQU0sa0JBQUUsQ0FBQyxPQUFPLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMvRSxJQUFJLFFBQVEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELElBQUksU0FBUyxHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBQSw0QkFBYSxFQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxD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QyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUEsK0JBQWMsRUFBQyxHQUFHLENBQUMsS0FBSyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFILENBQUM7QUFURCw4Q0FTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBrZXlGaW5nZXJwcmludCwgbm9ybWFsaXplS2V5cyB9IGZyb20gXCIuL2F1dGhvcml6ZWRLZXlzXCI7XG5pbXBvcnQgeyBkZXJpdmVSZXZva2VLZXksIHJldm9rZVJlcG9VUkwgfSBmcm9tIFwiLi9yZXZva2VTb3VyY2VcIjtcbmltcG9ydCB7IGZpbmRTb3VyY2VLZXkgfSBmcm9tIFwiLi9zb3VyY2VzXCI7XG5pbXBvcnQgeyBzcGF3blByb21pc2UgfSBmcm9tIFwiLi4vaGVscGVycy9zcGF3blwiO1xuXG5leHBvcnQgY29uc3QgVU5SRVZPS0VTX0RJUiA9IFwidW5yZXZva2VkXCI7XG5jb25zdCBSRVZPQ0FUSU9OU19ESVIgPSBcInJldm9jYXRpb25zXCI7XG5cbi8qKiBPbmUgcmV2b2NhdGlvbiBldmVudC4gRWl0aGVyIGFuIHNzaCBrZXkgdXNlZCBmcm9tIGFuIGFkZHJlc3MgaXQgaXMgbm90IGFsbG93ZWQgZnJvbSwgb3IgYVxuICAgIG1hY2hpbmUgdGhhdCB0YWxrZWQgdG8gdXMgZnJvbSBvbmUuIEJvdGggYXJlIHRoZSBzYW1lIHNoYXBlIC0gYW4gaWRlbnRpdHkgYW5kIGFuIGFkZHJlc3MgLSBhbmRcbiAgICBhbiB1bnJldm9rZSB1bmRvZXMgZWl0aGVyIGJ5IGFsbG93aW5nIHRoYXQgc2FtZSBwYWlyLlxuXG4gICAgV2hpY2ggaXMgd2h5IHVucmV2b2tpbmcgbmV2ZXIgbWFrZXMgYW55dGhpbmcgdW5yZXZva2FibGU6IHVzZWQgZnJvbSBzb21lIG90aGVyIGFkZHJlc3MsIGl0IGlzXG4gICAgcmV2b2tlZCBhZ2FpbiwgdW5kZXIgYSBuZXcgaWQgbm8gZXhpc3RpbmcgdW5yZXZva2UgbmFtZXMuICovXG5leHBvcnQgdHlwZSBSZXZvY2F0aW9uID0ge1xuICAgIHJldm9jYXRpb25JZDogc3RyaW5nO1xuICAgIC8vIEV4YWN0bHkgb25lIG9mIHRoZXNlLiBBIGtleSByZXZvY2F0aW9uIG5hbWVzIGEgZmluZ2VycHJpbnQsIGEgbWFjaGluZSByZXZvY2F0aW9uIGEgbWFjaGluZUlkLlxuICAgIGZpbmdlcnByaW50Pzogc3RyaW5nO1xuICAgIG1hY2hpbmVJZD86IHN0cmluZztcbiAgICBpcD86IHN0cmluZztcbiAgICBrZXk/OiBzdHJpbmc7XG4gICAgcmV2b2tlZEF0Pzogc3RyaW5nO1xuICAgIHJldm9rZWRCeT86IHN0cmluZztcbiAgICByZWFzb24/OiBzdHJpbmc7XG4gICAgYXR0ZW1wdD86IHsgaXA/OiBzdHJpbmc7IHVzZXI/OiBzdHJpbmc7IHJlcXVpcmVkPzogc3RyaW5nIH07XG59O1xuXG4vKiogT2xkZXIgcmV2b2NhdGlvbiBmaWxlcyBjYXJyeSB0aGUgYWRkcmVzcyB1bmRlciBhdHRlbXB0IG9ubHkuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2b2NhdGlvbklQKHJldm9jYXRpb246IFJldm9jYXRpb24pIHtcbiAgICByZXR1cm4gcmV2b2NhdGlvbi5pcCB8fCByZXZvY2F0aW9uLmF0dGVtcHQ/LmlwIHx8IFwiXCI7XG59XG5cbi8qKiBXaGF0IHRoZSByZXZvY2F0aW9uIGlzIGFib3V0LCB3aGljaCBpcyB3aGF0IGFuIHVucmV2b2tlIGhhcyB0byBuYW1lIHRvIHVuZG8gaXQuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2b2NhdGlvbklkZW50aXR5KHJldm9jYXRpb246IFJldm9jYXRpb24pIHtcbiAgICByZXR1cm4gcmV2b2NhdGlvbi5maW5nZXJwcmludCB8fCByZXZvY2F0aW9uLm1hY2hpbmVJZCB8fCBcIlwiO1xufVxuXG4vKiogRXZlcnkgcmV2b2NhdGlvbiB0aGUgcmV2b2tlIHJlcG8gbGlzdHMuIENsb25lZCByZWFkIG9ubHkgaW50byBhIHRlbXAgZGlyZWN0b3J5LlxuXG4gICAgQSBwZXJzb24gcnVubmluZyB0aGlzIGhhcyB0aGVpciBvd24gYWNjZXNzIHRvIHRoZSByZXBvLCBzbyB0aGVpciBjcmVkZW50aWFscyBhcmUgd2hhdCBpcyB1c2VkLlxuICAgIE9uIGEgbWFjaGluZSB0aGF0IGlzIGFscmVhZHkgYSBwb3J0c2VjdXJlIGhvc3QgdGhlcmUgbWF5IGJlIG5vIHN1Y2ggY3JlZGVudGlhbHMsIGJ1dCB0aGUgc291cmNlXG4gICAgZGVwbG95IGtleSBpcyByaWdodCB0aGVyZSwgYW5kIHRoZSBrZXkgZGVyaXZlZCBmcm9tIGl0IGlzIG9uZSB0aGF0IHJlcG8gZGVmaW5pdGVseSBhY2NlcHRzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRSZW1vdGVSZXZvY2F0aW9ucyhjb25maWc6IHsgc291cmNlVVJMOiBzdHJpbmcgfSkge1xuICAgIGxldCB7IHNvdXJjZVVSTCB9ID0gY29uZmlnO1xuICAgIGxldCB0ZW1wb3JhcnlEaXJlY3RvcnkgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJ1bnJldm9rZS1cIikpO1xuICAgIGxldCByZXBvUGF0aCA9IHBhdGguam9pbih0ZW1wb3JhcnlEaXJlY3RvcnksIFwicmVwb1wiKTtcbiAgICBsZXQgY2xvbmVBcmdzID0gW1wiY2xvbmVcIiwgXCItLWRlcHRoXCIsIFwiMVwiLCByZXZva2VSZXBvVVJMKHNvdXJjZVVSTCksIHJlcG9QYXRoXTtcbiAgICBsZXQgc291cmNlS2V5ID0gYXdhaXQgZmluZFNvdXJjZUtleShzb3VyY2VVUkwpO1xuICAgIGlmIChzb3VyY2VLZXkpIHtcbiAgICAgICAgbGV0IGRlcml2ZWQgPSBkZXJpdmVSZXZva2VLZXkoYXdhaXQgZnMucmVhZEZpbGUoc291cmNlS2V5LCBcInV0ZjhcIikpO1xuICAgICAgICBsZXQgZGVyaXZlZEtleVBhdGggPSBwYXRoLmpvaW4odGVtcG9yYXJ5RGlyZWN0b3J5LCBcImtleVwiKTtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGRlcml2ZWRLZXlQYXRoLCBkZXJpdmVkLnByaXZhdGVLZXlGaWxlLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgICAgICBsZXQgc3NoQ29tbWFuZCA9IGBzc2ggLWkgJHtkZXJpdmVkS2V5UGF0aH0gLW8gSWRlbnRpdGllc09ubHk9eWVzIC1vIEJhdGNoTW9kZT15ZXMgLW8gU3RyaWN0SG9zdEtleUNoZWNraW5nPWFjY2VwdC1uZXdgO1xuICAgICAgICBjbG9uZUFyZ3MgPSBbXCItY1wiLCBgY29yZS5zc2hDb21tYW5kPSR7c3NoQ29tbWFuZH1gLCAuLi5jbG9uZUFyZ3NdO1xuICAgIH1cbiAgICBsZXQgY2xvbmUgPSBhd2FpdCBzcGF3blByb21pc2UoeyBjb21tYW5kOiBcImdpdFwiLCBhcmdzOiBjbG9uZUFyZ3MgfSk7XG4gICAgaWYgKGNsb25lLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICBhd2FpdCBmcy5ybSh0ZW1wb3JhcnlEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4cGVjdGVkIHRvIGJlIGFibGUgdG8gcmVhZCAke3Jldm9rZVJlcG9VUkwoc291cmNlVVJMKX0uXFxuYFxuICAgICAgICAgICAgKyBgJHsoY2xvbmUuc3Rkb3V0ICsgY2xvbmUuc3RkZXJyKS50cmltKCl9YFxuICAgICAgICApO1xuICAgIH1cbiAgICBsZXQgcmV2b2NhdGlvbnM6IFJldm9jYXRpb25bXSA9IFtdO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIFJFVk9DQVRJT05TX0RJUik7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICAgIG5hbWVzID0gKGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5KSkuc29ydCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gTm8gcmV2b2NhdGlvbnMgZGlyZWN0b3J5IGF0IGFsbCBqdXN0IG1lYW5zIG5vdGhpbmcgaGFzIGV2ZXIgYmVlbiByZXZva2VkLlxuICAgIH1cbiAgICBmb3IgKGxldCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgIGlmICghbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV2b2NhdGlvbnMucHVzaChKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpLCBcInV0ZjhcIikpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nIHVucmVhZGFibGUgcmV2b2NhdGlvbiAke1JFVk9DQVRJT05TX0RJUn0vJHtuYW1lfSBpbiAke3Jldm9rZVJlcG9VUkwoc291cmNlVVJMKX0uICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgZnMucm0odGVtcG9yYXJ5RGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuIHJldm9jYXRpb25zO1xufVxuXG4vKiogV2hhdCB0aGUgdW5yZXZva2VzIGFscmVhZHkgaW4gYSByZXBvIGFsbG93OiBcIjxpZGVudGl0eT4gPGFkZHJlc3M+XCIgZm9yIGVhY2ggcGFpciwgcGx1cyB0aGUgYmFyZVxuICAgIHJldm9jYXRpb24gaWRzIHRoZSBvbGRlciBmb3JtYXQgbmFtZWQuXG5cbiAgICBSZWFkIG91dCBvZiB0aGUgcmVwbyByYXRoZXIgdGhhbiBvdXQgb2YgdGhlIGRhZW1vbidzIGFic29yYmVkIHN0YXRlLCBiZWNhdXNlIHdob2V2ZXIgcnVucyBhIGNsaVxuICAgIGlzIGxvb2tpbmcgYXQgYSBjaGVja291dCBhbmQgaGFzIG5vIGRhZW1vbiBpbiB0aGUgcHJvY2VzcyB0byBhc2suICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFVucmV2b2tlZEluUmVwbyhyZXBvUGF0aDogc3RyaW5nKSB7XG4gICAgbGV0IHVucmV2b2tlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIFVOUkVWT0tFU19ESVIpO1xuICAgICAgICBmb3IgKGxldCBuYW1lIG9mIGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpLCBcInV0ZjhcIikpO1xuICAgICAgICAgICAgZm9yIChsZXQgYWxsb3dlZCBvZiBwYXJzZWQuYWxsb3dlZCB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGxldCBpZGVudGl0eSA9IGFsbG93ZWQuZmluZ2VycHJpbnQgfHwgYWxsb3dlZC5tYWNoaW5lSWQ7XG4gICAgICAgICAgICAgICAgaWYgKGlkZW50aXR5ICYmIGFsbG93ZWQuaXApIHtcbiAgICAgICAgICAgICAgICAgICAgdW5yZXZva2VkLmFkZChgJHtpZGVudGl0eX0gJHthbGxvd2VkLmlwfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5hbWVkIGlkcywgZm9yIHRoZSB1bnJldm9rZXMgd3JpdHRlbiBiZWZvcmUgdGhpcyB3YXMgYWJvdXQgcGFpcnMuXG4gICAgICAgICAgICBmb3IgKGxldCByZXZvY2F0aW9uSWQgb2YgcGFyc2VkLnJldm9jYXRpb25JZHMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICB1bnJldm9rZWQuYWRkKHJldm9jYXRpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgaGFzIGJlZW4gdW5yZXZva2VkLlxuICAgIH1cbiAgICByZXR1cm4gdW5yZXZva2VkO1xufVxuXG4vKiogVGhlIHJldm9jYXRpb25zIHRob3NlIHVucmV2b2tlcyBoYXZlIG5vdCBhbHJlYWR5IHVuZG9uZS5cblxuICAgIE1hdGNoZWQgb24gcmV2b2NhdGlvbklkZW50aXR5LCBub3Qgb24gZmluZ2VycHJpbnQ6IGEgbWFjaGluZSByZXZvY2F0aW9uIGNhcnJpZXMgYSBtYWNoaW5lSWQgYW5kXG4gICAgbm8gZmluZ2VycHJpbnQsIHNvIGNvbXBhcmluZyBmaW5nZXJwcmludHMgbGVhdmVzIGV2ZXJ5IG1hY2hpbmUgbG9va2luZyByZXZva2VkIGZvcmV2ZXIgbm8gbWF0dGVyXG4gICAgaG93IG1hbnkgdGltZXMgaXQgaXMgdW5yZXZva2VkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0aWxsUmV2b2tlZEJ5KHJldm9jYXRpb25zOiBSZXZvY2F0aW9uW10sIHVucmV2b2tlZDogU2V0PHN0cmluZz4pIHtcbiAgICByZXR1cm4gcmV2b2NhdGlvbnMuZmlsdGVyKHJldm9jYXRpb24gPT5cbiAgICAgICAgIXVucmV2b2tlZC5oYXMocmV2b2NhdGlvbi5yZXZvY2F0aW9uSWQpXG4gICAgICAgICYmICF1bnJldm9rZWQuaGFzKGAke3Jldm9jYXRpb25JZGVudGl0eShyZXZvY2F0aW9uKX0gJHtyZXZvY2F0aW9uSVAocmV2b2NhdGlvbil9YClcbiAgICApO1xufVxuXG4vKiogV2hpY2gga2V5cyBpbiBhIHJlcG8gYXJlIHJldm9rZWQuIFdoYXQgc2lnbmZpbGVzIGFuZCBzZWN1cmVzc2ggcmVmdXNlIG92ZXIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV2b2tlZEtleXNJblJlcG8oY29uZmlnOiB7IHJlcG9QYXRoOiBzdHJpbmc7IHNvdXJjZVVSTDogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyByZXBvUGF0aCwgc291cmNlVVJMIH0gPSBjb25maWc7XG4gICAgbGV0IHJldm9jYXRpb25zID0gYXdhaXQgcmVhZFJlbW90ZVJldm9jYXRpb25zKHsgc291cmNlVVJMIH0pO1xuICAgIGxldCB1bnJldm9rZWQgPSBhd2FpdCByZWFkVW5yZXZva2VkSW5SZXBvKHJlcG9QYXRoKTtcbiAgICBsZXQgc3RpbGxSZXZva2VkID0gc3RpbGxSZXZva2VkQnkocmV2b2NhdGlvbnMsIHVucmV2b2tlZCk7XG4gICAgbGV0IGtleXMgPSBub3JtYWxpemVLZXlzKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihyZXBvUGF0aCwgXCJhdXRob3JpemVkX2tleXNcIiksIFwidXRmOFwiKS5jYXRjaCgoKSA9PiBcIlwiKSk7XG4gICAgcmV0dXJuIHN0aWxsUmV2b2tlZFxuICAgICAgICAuZmlsdGVyKHJldm9jYXRpb24gPT4ga2V5cy5zb21lKGtleSA9PiBrZXlGaW5nZXJwcmludChrZXkpID09PSByZXZvY2F0aW9uLmZpbmdlcnByaW50KSlcbiAgICAgICAgLm1hcChyZXZvY2F0aW9uID0+ICh7IHJldm9jYXRpb24sIGtleToga2V5cy5maW5kKGtleSA9PiBrZXlGaW5nZXJwcmludChrZXkpID09PSByZXZvY2F0aW9uLmZpbmdlcnByaW50KSB8fCBcIlwiIH0pKTtcbn1cbiJdfQ==
131
+ /* _JS_SOURCE_HASH = "da8eed43c07e7e245d4bd1faa31ac2bb8b6d6b2fd8b6e9d03b9cc030ffbb46af"; */
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
- //exports.isMachineAccepted = exports.addMachineCommand = exports.setMachines = exports.getOrCreateRemoteMachineId = exports.getTrustedMachines = exports.getMachines = exports.keysRepo = exports.MACHINES_DIR = void 0;
6
+ //exports.isMachineAccepted = exports.describeThisMachine = exports.addMachineCommand = exports.setMachines = exports.getOrCreateRemoteMachineId = exports.getTrustedMachines = exports.getMachines = exports.keysRepo = exports.MACHINES_DIR = void 0;
7
7
  const promises_1 = __importDefault(require("fs/promises"));
8
8
  const os_1 = __importDefault(require("os"));
9
9
  const path_1 = __importDefault(require("path"));
@@ -245,6 +245,13 @@ function addMachineCommand(config) {
245
245
  return `To trust ${machineId}, run: yarn addmachine ${domain || "<domain>"} ${machineId} ${ip} git`;
246
246
  }
247
247
  exports.addMachineCommand = addMachineCommand;
248
+ function describeThisMachine(domain) {
249
+ let host = os_1.default.hostname();
250
+ if (!domain)
251
+ return host;
252
+ return `${host} (machine ${(0, certs_1.getOwnMachineId)(domain)})`;
253
+ }
254
+ exports.describeThisMachine = describeThisMachine;
248
255
  /** Sends the one notification this file is allowed to send, when it can.
249
256
 
250
257
  The daemon configures notifications on startup and would simply send. This can also run in some
@@ -268,8 +275,11 @@ async function notifyBestEffort(headline, body) {
268
275
  /** Records that a machine we accept talked to us from an address it is not allowed from. One per
269
276
  machine and address, so a second address is a second revocation and an unrevoke of the first
270
277
  does not cover it. */
271
- async function recordMachineRevocation(config) {
278
+ const recordMachineRevocation = (0, batching_1.runInSerial)(async (config) => {
272
279
  let { sourceURL, machineId, ip, hostLabel } = config;
280
+ if ((0, readSignedRepo_1.isPairRevoked)(machineId, ip) || (0, readSignedRepo_1.isPairUnrevoked)(machineId, ip)) {
281
+ return "alreadyRevoked";
282
+ }
273
283
  // Clones it if it is not here yet, which is the usual state of a machine that has never had to
274
284
  // revoke anything. Without this the mkdir below would build the directory anyway and git would
275
285
  // then be run somewhere that is not a checkout, so the revocation was written where nothing
@@ -279,7 +289,7 @@ async function recordMachineRevocation(config) {
279
289
  }
280
290
  catch (e) {
281
291
  console.error(`Cannot record the revocation of ${machineId}, ${(0, revokeSource_1.revokeRepoURL)(sourceURL)} could not be read. ${e}`);
282
- return false;
292
+ return "failed";
283
293
  }
284
294
  let repoPath = (0, revokeSource_1.revokeRepoPath)(sourceURL);
285
295
  let keyPath = await (0, repoFiles_2.ensureRevokeKey)(sourceURL);
@@ -304,7 +314,7 @@ async function recordMachineRevocation(config) {
304
314
  if (push.status !== 0) {
305
315
  // Another machine most likely recorded the same thing first, and the next read picks it up.
306
316
  console.log(`Could not push the revocation of ${machineId} from ${ip}. ${(push.stdout + push.stderr).trim()}`);
307
- return false;
317
+ return "failed";
308
318
  }
309
319
  (0, readSignedRepo_1.noteRevocation)(revocationId, { identity: machineId, ip, revokedAt, revokedBy: hostLabel });
310
320
  console.log(`Revoked ${machineId} from ${ip}, ${revocationId}`);
@@ -320,8 +330,8 @@ async function recordMachineRevocation(config) {
320
330
  + `\nThe unrevoke allows ${machineId} from ${ip}, and takes effect as each machine picks it up.`
321
331
  + `\n\nmachine: \`${machineId}\``
322
332
  + `\nfrozen by: \`${hostLabel}\``);
323
- return true;
324
- }
333
+ return "froze";
334
+ });
325
335
  async function isMachineAccepted(config) {
326
336
  let { machineId, ip, domain } = config;
327
337
  if (!machineId || !ip) {
@@ -370,11 +380,13 @@ async function isMachineAccepted(config) {
370
380
  if (!(0, readSignedRepo_1.isPairRevoked)(machineId, ip) && !(0, readSignedRepo_1.isPairUnrevoked)(machineId, ip)) {
371
381
  // Only the machine that actually wrote the revocation may say it froze anything. One
372
382
  // that could not reach the revoke repo has refused this call and nothing more.
373
- let froze = await recordMachineRevocation({ sourceURL, machineId, ip, hostLabel: os_1.default.hostname() });
374
- let reason = froze
375
- && `Machine ${machineId} is not allowed from ${ip}, and is now frozen everywhere.`
376
- || `Machine ${machineId} is not allowed from ${ip}. It could not be frozen, ${(0, revokeSource_1.revokeRepoURL)(sourceURL)} could not be written.`;
377
- return { verdict: { accepted: false, reason }, froze };
383
+ let outcome = await recordMachineRevocation({ sourceURL, machineId, ip, hostLabel: describeThisMachine(domain) });
384
+ if (outcome === "froze") {
385
+ return { verdict: { accepted: false, reason: `Machine ${machineId} is not allowed from ${ip}, and is now frozen everywhere.` }, froze: true };
386
+ }
387
+ if (outcome === "failed") {
388
+ return { verdict: { accepted: false, reason: `Machine ${machineId} is not allowed from ${ip}. It could not be frozen, ${(0, revokeSource_1.revokeRepoURL)(sourceURL)} could not be written.` }, froze: false };
389
+ }
378
390
  }
379
391
  return { verdict: { accepted: false, reason: `Machine ${machineId} is not allowed from ${ip}.` }, froze: false };
380
392
  };
@@ -398,5 +410,5 @@ async function isMachineAccepted(config) {
398
410
  return (await evaluate()).verdict;
399
411
  }
400
412
  exports.isMachineAccepted = isMachineAccepted;
401
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjaGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNoaW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4Qix5REFBNkQ7QUFDN0Qsa0VBQStFO0FBQy9FLG9FQUFzRTtBQUN0RSxzREFBZ0U7QUFDaEUsa0VBQXFFO0FBQ3JFLDRFQUEySTtBQUMzSSxpRUFBK0U7QUFDL0UsdURBQTJEO0FBQzNELDREQUF5RDtBQUN6RCxzREFBdUk7QUFDdkksa0RBQWlJO0FBQ2pJLG9EQUFpRjtBQUNqRix5REFBbUQ7QUFDbkQsMkRBQStEO0FBRy9ELG1HQUFtRztBQUNuRyxpR0FBaUc7QUFDakcsZ0VBQWdFO0FBQ25ELFFBQUEsWUFBWSxHQUFHLFVBQVUsQ0FBQztBQUN2QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUM7QUFDdEMsTUFBTSxpQkFBaUIsR0FBRyw4Q0FBOEMsQ0FBQztBQUN6RSxnR0FBZ0c7QUFDaEcsbUNBQW1DO0FBQ25DLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN2Qyw2RkFBNkY7QUFDN0YsaUdBQWlHO0FBQ2pHLGtFQUFrRTtBQUNsRSxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUMsZ0dBQWdHO0FBQ2hHLGlHQUFpRztBQUNqRywwREFBMEQ7QUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQzFELGdHQUFnRztBQUNoRyxnR0FBZ0c7QUFDaEcsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2pELElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBU2pDLEtBQUssVUFBVSxVQUFVLENBQUMsUUFBZ0I7SUFDdEMsSUFB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QUFDO0lBQ0QsT0FBTyxDQUFDLE1BQU0sUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFDdEMsQ0FBQztBQXBGRCw4Q0FvRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcmVzb2x2ZUtleXNSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2tleXNSZXBvXCI7XG5pbXBvcnQgeyByZXZva2VSZXBvLCBzeW5jUmVwb0ZpbGVzIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9yZXBvRmlsZXNcIjtcbmltcG9ydCB7IG5ld1Jldm9jYXRpb25JZCB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmV2b2NhdGlvblwiO1xuaW1wb3J0IHsgcnVuR2l0LCBzeW5jUmVwbyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vZ2l0XCI7XG5pbXBvcnQgeyBlbnN1cmVSZXZva2VLZXkgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlcG9GaWxlc1wiO1xuaW1wb3J0IHsgaWRlbnRpdHlGcm96ZW5CeSwgaXNQYWlyUmV2b2tlZCwgaXNQYWlyVW5yZXZva2VkLCBub3RlUmV2b2NhdGlvbiwgcmVhZFNpZ25lZFJlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlYWRTaWduZWRSZXBvXCI7XG5pbXBvcnQgeyByZXZva2VSZXBvUGF0aCwgcmV2b2tlUmVwb1VSTCB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9yZXZva2VTb3VyY2VcIjtcbmltcG9ydCB7IHNvdXJjZVJlcG9QYXRoIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL3NvdXJjZXNcIjtcbmltcG9ydCB7IG5vdGlmeSB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vbm90aWZ5XCI7XG5pbXBvcnQgeyBhcmVEaXNjb3JkTm90aWZpY2F0aW9uc0NvbmZpZ3VyZWQsIGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zLCBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIIH0gZnJvbSBcIi4uL25vdGlmaWNhdGlvbnMvZGlzY29yZFwiO1xuaW1wb3J0IHsgREVWX2dldElkZW50aXR5RmlsZVBhdGgsIGdlbmVyYXRlQ0EsIGdldE1hY2hpbmVJZCwgZ2V0T3duTWFjaGluZUlkLCBJZGVudGl0eVN0b3JhZ2VUeXBlIH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvY2VydHNcIjtcbmltcG9ydCB7IGRlc2NyaWJlSG9zdCwgcnVuT3ZlclNTSCwgd3JpdGVSZW1vdGVGaWxlIH0gZnJvbSBcIi4uL2hlbHBlcnMvcmVtb3RlU1NIXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgcnVuSW5maW5pdGVQb2xsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IHNwYXduUHJvbWlzZSB9IGZyb20gXCIuLi9oZWxwZXJzL3NwYXduXCI7XG5cbi8vIFdoaWNoIG1hY2hpbmVzIHRoaXMgc3lzdGVtIHRhbGtzIHRvLCBrZXB0IGluIHRoZSBzYW1lIHJlcG8gYXMgdGhlIHNzaCBrZXlzLiBUaGF0IHJlcG8gaXMgYWxyZWFkeVxuLy8gc2lnbmVkLCBhbHJlYWR5IGRpc3RyaWJ1dGVkIHRvIGV2ZXJ5IG1hY2hpbmUsIGFuZCBhbHJlYWR5IGhhcyBzb21ld2hlcmUgdG8gcmVjb3JkIGEgcmVqZWN0aW9uLFxuLy8gc28gYSBzZWNvbmQgb25lIHdvdWxkIG9ubHkgYmUgYSBzZWNvbmQgdGhpbmcgdG8ga2VlcCBpbiBzdGVwLlxuZXhwb3J0IGNvbnN0IE1BQ0hJTkVTX0RJUiA9IFwibWFjaGluZXNcIjtcbmNvbnN0IFJFVk9DQVRJT05TX0RJUiA9IFwicmV2b2NhdGlvbnNcIjtcbmNvbnN0IFJFVk9DQVRJT05fUkVBU09OID0gXCJhIG1hY2hpbmUgdGFsa2VkIHRvIHVzIGZyb20gYW4gdW5hcHByb3ZlZCBJUFwiO1xuLy8gVGhlIHJldm9rZSByZXBvIGlzIHB1bGxlZCBhdCBtb3N0IHRoaXMgb2Z0ZW4uIEEgY2hlY2sgaGFwcGVucyBwZXIgcmVxdWVzdCwgYW5kIGEgcmVxdWVzdCBtdXN0XG4vLyBub3QgY29zdCBhIHJvdW5kIHRyaXAgdG8gZ2l0aHViLlxuY29uc3QgUkVWT0tFX1NZTkNfSU5URVJWQUwgPSA2MCAqIDEwMDA7XG4vLyBBbmQgdGhlIG1hY2hpbmUgbGlzdCBpcyByZS1yZWFkIGZyb20gdGhlIGNoZWNrb3V0IG9uIHRoaXMgaW50ZXJ2YWwsIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGVcbi8vIGNoZWNrb3V0IGl0c2VsZiBvbmx5IG1vdmVzIHdoZW4gdGhlIGRhZW1vbiBwdWxscyBpdCwgd2hpY2ggaXMgb24gdGhlIHNhbWUgc29ydCBvZiBpbnRlcnZhbCwgc29cbi8vIHJlYWRpbmcgbW9yZSBvZnRlbiB0aGFuIHRoaXMgd291bGQgb25seSByZS1yZWFkIHRoZSBzYW1lIGJ5dGVzLlxuY29uc3QgTUFDSElORVNfUkVGUkVTSF9JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIEhvdyBsb25nIGEgZmFpbHVyZSB0byBmaW5kIHRoZSBrZXlzIHJlcG8gaXMgcmVtZW1iZXJlZC4gQSBsb25nIGxpdmVkIHByb2Nlc3MgbWF5IHN0YXJ0IGJlZm9yZVxuLy8gdGhlIG1hY2hpbmUgaXMgc2V0IHVwLCBhbmQgc2hvdWxkIHBpY2sgaXQgdXAgb25jZSBpdCBpcywgd2l0aG91dCBiZWluZyByZXN0YXJ0ZWQgLSBidXQgaXQgbXVzdFxuLy8gbm90IHBheSBmb3IgcmVzb2x2aW5nIHRoZSByZXBvIG9uIGV2ZXJ5IHJlcXVlc3QgZWl0aGVyLlxuY29uc3QgUkVQT19SRVRSWV9ERUxBWSA9IDE1ICogMTAwMDtcbmNvbnN0IExPT1BCQUNLID0gW1wiMTI3LjAuMC4xXCIsIFwiOjoxXCIsIFwiOjpmZmZmOjEyNy4wLjAuMVwiXTtcbi8vIFRoZSB0cnVzdGVkIG1hY2hpbmUgbGlzdCBpcyByZS1yZWFkIGF0IG1vc3QgdGhpcyBvZnRlbiB3aGVuIGEgY2hlY2sgcmVqZWN0cywgc28gYSBjYWxsZXIgdGhhdFxuLy8gd2FzIGp1c3QgYWRkZWQgaXMgcGlja2VkIHVwIHF1aWNrbHkgd2l0aG91dCBsZXR0aW5nIGEgZmxvb2Qgb2YgcmVqZWN0aW9ucyByZS1yZWFkIGV2ZXJ5IHRpbWUuXG5jb25zdCBNQUNISU5FU19JTlZBTElEQVRJT05fSU5URVJWQUwgPSA2MCAqIDEwMDA7XG5sZXQgbGFzdE1hY2hpbmVzSW52YWxpZGF0aW9uID0gMDtcblxuLyoqIE9uZSBtYWNoaW5lIHdlIGFyZSB3aWxsaW5nIHRvIHRhbGsgdG8sIGFuZCB0aGUgYWRkcmVzc2VzIGl0IG1heSB0YWxrIHRvIHVzIGZyb20uICovXG5leHBvcnQgdHlwZSBNYWNoaW5lU3RhdGUgPSB7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXBzOiBzdHJpbmdbXTtcbiAgICBhZGRlZEF0OiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hY2hpbmVGaWxlUGF0aChyZXBvUGF0aDogc3RyaW5nLCBtYWNoaW5lSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4ocmVwb1BhdGgsIE1BQ0hJTkVTX0RJUiwgYCR7bWFjaGluZUlkfS5qc29uYCk7XG59XG5cbi8qKiBUaGlzIG1hY2hpbmUncyBrZXlzIHJlcG8sIHdvcmtlZCBvdXQgb25jZSBhbmQgdGhlbiByZW1lbWJlcmVkLlxuXG4gICAgQSBmYWlsdXJlIGlzIHJlbWVtYmVyZWQgdG9vLCBidXQgb25seSBicmllZmx5OiBhIHNlcnZlciBtYXkgd2VsbCBzdGFydCBiZWZvcmUgdGhlIG1hY2hpbmUgaGFzXG4gICAgYmVlbiBzZXQgdXAsIGFuZCBzaG91bGQgc3RhcnQgd29ya2luZyB3aGVuIGl0IGlzLCByYXRoZXIgdGhhbiBuZWVkaW5nIGEgcmVzdGFydC4gKi9cbmV4cG9ydCBjb25zdCBrZXlzUmVwbyA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBsb29rdXAgPSByZXNvbHZlS2V5c1JlcG8oKTtcbiAgICBsb29rdXAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGtleXNSZXBvLnJlc2V0KCksIFJFUE9fUkVUUllfREVMQVkpLnVucmVmKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IGxvb2t1cDtcbn0pO1xuXG4vKiogRXZlcnkgbWFjaGluZSBhIGNoZWNrb3V0IGxpc3RzLiBXaXRob3V0IGEgcmVwbywgdGhpcyBtYWNoaW5lJ3Mgb3duLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1hY2hpbmVzKHJlcG9QYXRoPzogc3RyaW5nKTogUHJvbWlzZTxNYWNoaW5lU3RhdGVbXT4ge1xuICAgIHJldHVybiBbLi4uKGF3YWl0IHJlYWRNYWNoaW5lcyhyZXBvUGF0aCB8fCAoYXdhaXQga2V5c1JlcG8oKSkucmVwb1BhdGgpKS52YWx1ZXMoKV07XG59XG5cbi8qKiBUaGUgbWFjaGluZXMgdGhlIHNpZ25lZCBmaWxlcyB2b3VjaCBmb3IuIE9ubHkgdGhlIG1hY2hpbmUgZmlsZXMgY292ZXJlZCBieSB0aGUgc2lnbmF0dXJlIGFyZVxuICAgIHJlYWQgLSBhbiB1bnNpZ25lZCBtYWNoaW5lcy8qLmpzb24gaXMgbm90IGV2aWRlbmNlIG9mIGFueXRoaW5nLCBzbyByZWFkU2lnbmVkUmVwbyBoYXMgYWxyZWFkeVxuICAgIGxlZnQgaXQgb3V0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFRydXN0ZWRNYWNoaW5lcygpIHtcbiAgICBsZXQgeyByZXBvUGF0aCwgc291cmNlVVJMIH0gPSBhd2FpdCBrZXlzUmVwbygpO1xuICAgIGxldCB7IGZpbGVzIH0gPSBhd2FpdCByZWFkU2lnbmVkUmVwbyh7IHJlcG9QYXRoLCBzb3VyY2VVUkwgfSk7XG4gICAgbGV0IG1hY2hpbmVzOiBNYWNoaW5lU3RhdGVbXSA9IFtdO1xuICAgIGZvciAobGV0IFtmaWxlUGF0aCwgY29udGVudHNdIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtNQUNISU5FU19ESVJ9L2ApICYmIGZpbGVQYXRoLnNsaWNlKE1BQ0hJTkVTX0RJUi5sZW5ndGggKyAxKSB8fCBcIlwiO1xuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSB8fCBuYW1lLmluY2x1ZGVzKFwiL1wiKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hY2hpbmUgPSBwYXJzZU1hY2hpbmVGaWxlKG5hbWUsIGNvbnRlbnRzLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgICAgIGlmIChtYWNoaW5lKSB7XG4gICAgICAgICAgICBtYWNoaW5lcy5wdXNoKG1hY2hpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYWNoaW5lcztcbn1cblxuY29uc3QgdHJ1c3RlZE1hY2hpbmVzID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgbGV0IHJlYWQgPSByZWFkVHJ1c3RlZE1hY2hpbmVzKCk7XG4gICAgcmVhZC5jYXRjaCgoKSA9PiB0cnVzdGVkTWFjaGluZXMucmVzZXQoKSk7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWQ7XG59KTtcblxubGV0IHJlZnJlc2hpbmcgPSBmYWxzZTtcblxuLyoqIFRoZSBtYWNoaW5lcyB0aGlzIHN5c3RlbSB0cnVzdHMsIGFzIHRoZSBzaWduZWQgcmVwbyBsaXN0cyB0aGVtLlxuXG4gICAgSGVsZCByYXRoZXIgdGhhbiByZWFkIHBlciBjYWxsLCBhbmQgcmVmcmVzaGVkIGluIHRoZSBiYWNrZ3JvdW5kLCBzbyBub2JvZHkgYXNraW5nIHdoZXRoZXIgYVxuICAgIG1hY2hpbmUgaXMgdHJ1c3RlZCB3YWl0cyBmb3IgYSBkaXJlY3Rvcnkgb2YgZmlsZXMgdG8gYmUgcmVhZCBhbmQgYSBzaWduYXR1cmUgdG8gYmUgY2hlY2tlZC4gQVxuICAgIHJlZnJlc2ggdGhhdCBmYWlscyBsZWF2ZXMgdGhlIGxpc3Qgd2UgYWxyZWFkeSBoYXZlOiB0aGUgY2hlY2tvdXQgaXMgb25seSBzdGFsZSwgbm90IHdyb25nLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRydXN0ZWRNYWNoaW5lcygpOiBQcm9taXNlPE1hY2hpbmVTdGF0ZVtdPiB7XG4gICAgaWYgKCFyZWZyZXNoaW5nKSB7XG4gICAgICAgIHJlZnJlc2hpbmcgPSB0cnVlO1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoTUFDSElORVNfUkVGUkVTSF9JTlRFUlZBTCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0cnVzdGVkTWFjaGluZXMuc2V0KFByb21pc2UucmVzb2x2ZShhd2FpdCByZWFkVHJ1c3RlZE1hY2hpbmVzKCkpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ291bGQgbm90IHJlLXJlYWQgdGhlIHRydXN0ZWQgbWFjaGluZXMsIGtlZXBpbmcgdGhlIG9uZXMgd2UgaGF2ZS4gJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRydXN0ZWRNYWNoaW5lcygpO1xufVxuXG4vKiogVGhlIG1hY2hpbmUgaWQgb2YgYSBtYWNoaW5lIHJlYWNoZWQgb3ZlciBzc2gsIGdlbmVyYXRpbmcgYW5kIGluc3RhbGxpbmcgYW4gaWRlbnRpdHkgZm9yIGl0IGlmXG4gICAgaXQgaGFzIG5vbmUgdW5kZXIgdGhpcyBkb21haW4uIFRoZSBwcml2YXRlIGtleSBlbmRzIHVwIG9uIHRoYXQgbWFjaGluZSBhbmQgbm93aGVyZSBlbHNlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlUmVtb3RlTWFjaGluZUlkKGhvc3Q6IHN0cmluZywgZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoREVWX2dldElkZW50aXR5RmlsZVBhdGgoZG9tYWluKSk7XG4gICAgbGV0IGhvbWUgPSAoYXdhaXQgcnVuT3ZlclNTSCh7IGhvc3QsIHNjcmlwdDogYGVjaG8gJEhPTUVgIH0pKS5zdGRvdXQudHJpbSgpO1xuICAgIGlmICghaG9tZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7aG9zdH0gdG8gcmVwb3J0IGEgaG9tZSBkaXJlY3RvcnksIGl0IHJlcG9ydGVkIG5vdGhpbmdgKTtcbiAgICB9XG4gICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgcnVuT3ZlclNTSCh7IGhvc3QsIHNjcmlwdDogYGNhdCAke2hvbWV9LyR7ZmlsZU5hbWV9IDI+L2Rldi9udWxsIHx8IHRydWVgIH0pO1xuICAgIGlmIChjb250ZW50cy5zdGRvdXQudHJpbSgpKSB7XG4gICAgICAgIGxldCBzdG9yZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzLnN0ZG91dCkgYXMgSWRlbnRpdHlTdG9yYWdlVHlwZTtcbiAgICAgICAgcmV0dXJuIGdldE1hY2hpbmVJZChzdG9yZWQuZG9tYWluLCBkb21haW4pO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgJHtkZXNjcmliZUhvc3QoaG9zdCl9IGhhcyBubyBpZGVudGl0eSBmb3IgJHtkb21haW59LCBnZW5lcmF0aW5nIG9uZWApO1xuICAgIGxldCBnZW5lcmF0ZWQgPSBnZW5lcmF0ZUNBKGRvbWFpbik7XG4gICAgbGV0IHN0b3JlZDogSWRlbnRpdHlTdG9yYWdlVHlwZSA9IHtcbiAgICAgICAgZG9tYWluOiBnZW5lcmF0ZWQuZG9tYWluLFxuICAgICAgICBjZXJ0QjY0OiBnZW5lcmF0ZWQuY2VydC50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAga2V5QjY0OiBnZW5lcmF0ZWQua2V5LnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgIH07XG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IGAke2hvbWV9LyR7ZmlsZU5hbWV9YCxcbiAgICAgICAgY29udGVudHM6IEpTT04uc3RyaW5naWZ5KHN0b3JlZCksXG4gICAgICAgIGZpbGVNb2RlOiBcIjYwMFwiLFxuICAgICAgICBkaXJlY3RvcnlNb2RlOiBcIjcwMFwiLFxuICAgIH0pO1xuICAgIHJldHVybiBnZXRNYWNoaW5lSWQoZ2VuZXJhdGVkLmRvbWFpbiwgZG9tYWluKTtcbn1cblxuLyoqIE1ha2VzIGEgY2hlY2tvdXQgbGlzdCBleGFjdGx5IHRoZXNlIG1hY2hpbmVzOiB0aG9zZSBuYW1lZCBhcmUgd3JpdHRlbiB3aXRoIHRoZSBhZGRyZXNzZXMgZ2l2ZW4sXG4gICAgYW5kIGFueXRoaW5nIG5vdCBuYW1lZCBpcyByZW1vdmVkLiBTbyByZWFkIHRoZW0sIGNoYW5nZSB3aGF0IHlvdSB3YW50LCBhbmQgd3JpdGUgdGhlIHJlc3VsdC5cblxuICAgIFRoZSBhZGRyZXNzZXMgYXJlIHBhcnQgb2Ygc2V0dGluZyByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIHN0ZXAsIGJlY2F1c2UgYSBtYWNoaW5lIHdpdGggbm9cbiAgICBhZGRyZXNzIGl0IG1heSB0YWxrIGZyb20gaXMgbm90IGEgbWFjaGluZSB0aGF0IHdvdWxkIGV2ZXIgYmUgYWNjZXB0ZWQgLSB0aGVyZSBpcyBubyBzdGF0ZSB3aGVyZVxuICAgIG5hbWluZyBvbmUgd2l0aG91dCB0aGVtIG1lYW5zIGFueXRoaW5nLlxuXG4gICAgTm90aGluZyBoZXJlIHNpZ25zIG9yIGNvbW1pdHMuIFRoZSBzaWduYXR1cmUgaXMgd2hhdCBldmVyeSBvdGhlciBtYWNoaW5lIGNoZWNrcyBiZWZvcmVcbiAgICBiZWxpZXZpbmcgYW55IG9mIHRoaXMsIGFuZCBpdCB0YWtlcyB0aGUgaGFyZHdhcmUga2V5LCBzbyBgeWFybiBzaWduZmlsZXMgZ2l0YCBpcyBzdGlsbCB5b3VycyB0b1xuICAgIHJ1biBhZnRlcndhcmRzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldE1hY2hpbmVzKGNvbmZpZzoge1xuICAgIHJlcG9QYXRoPzogc3RyaW5nO1xuICAgIG1hY2hpbmVzOiB7IG1hY2hpbmVJZDogc3RyaW5nOyBpcHM6IHN0cmluZ1tdIH1bXTtcbn0pOiBQcm9taXNlPE1hY2hpbmVTdGF0ZVtdPiB7XG4gICAgbGV0IHsgbWFjaGluZXMgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVwb1BhdGggPSBjb25maWcucmVwb1BhdGggfHwgKGF3YWl0IGtleXNSZXBvKCkpLnJlcG9QYXRoO1xuICAgIC8vIFdoYXRldmVyIHdhcyBoZWxkIGlzIG5vdyBzdGFsZSwgd2hvZXZlciByZWFkcyBpdCBuZXh0LlxuICAgIHRydXN0ZWRNYWNoaW5lcy5yZXNldCgpO1xuICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHJlYWRNYWNoaW5lcyhyZXBvUGF0aCk7XG4gICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgTUFDSElORVNfRElSKTtcbiAgICBsZXQgd3JpdHRlbjogTWFjaGluZVN0YXRlW10gPSBbXTtcbiAgICBmb3IgKGxldCBtYWNoaW5lIG9mIG1hY2hpbmVzKSB7XG4gICAgICAgIGlmICghbWFjaGluZS5tYWNoaW5lSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBtYWNoaW5lSWQsIHdhcyAke0pTT04uc3RyaW5naWZ5KG1hY2hpbmUubWFjaGluZUlkKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1hY2hpbmUuaXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBhZGRyZXNzZXMgZm9yICR7bWFjaGluZS5tYWNoaW5lSWR9LCB3YXMgbm9uZS4gQSBtYWNoaW5lIGlzIHRydXN0ZWQgZnJvbWBcbiAgICAgICAgICAgICAgICArIGAgdGhlIGFkZHJlc3NlcyBpdCBtYXkgdGFsayBmcm9tLCBzbyBsZWF2ZSBpdCBvdXQgb2YgdGhlIGxpc3QgdG8gcmVtb3ZlIGl0LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlwcyA9IG1hY2hpbmUuaXBzLmZpbHRlcigoaXAsIGluZGV4KSA9PiBpcCAmJiBtYWNoaW5lLmlwcy5pbmRleE9mKGlwKSA9PT0gaW5kZXgpO1xuICAgICAgICBsZXQgc3RhdGU6IE1hY2hpbmVTdGF0ZSA9IHtcbiAgICAgICAgICAgIG1hY2hpbmVJZDogbWFjaGluZS5tYWNoaW5lSWQsXG4gICAgICAgICAgICAvLyBJbiB0aGUgb3JkZXIgZ2l2ZW4sIHdpdGhvdXQgZHVwbGljYXRlcywgc28gdGhlIGZpbGUgcmVhZHMgdGhlIHdheSBpdCB3YXMgc2V0LlxuICAgICAgICAgICAgaXBzLFxuICAgICAgICAgICAgYWRkZWRBdDogZXhpc3RpbmcuZ2V0KG1hY2hpbmUubWFjaGluZUlkKT8uYWRkZWRBdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShtYWNoaW5lRmlsZVBhdGgocmVwb1BhdGgsIHN0YXRlLm1hY2hpbmVJZCksIEpTT04uc3RyaW5naWZ5KHN0YXRlLCB1bmRlZmluZWQsIDQpICsgXCJcXG5cIik7XG4gICAgICAgIHdyaXR0ZW4ucHVzaChzdGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gV2hhdGV2ZXIgdGhlIHJlcG8gaGFkIGFuZCB0aGUgY2FsbGVyIGRpZCBub3QgbmFtZSBpcyBubyBsb25nZXIgdHJ1c3RlZC5cbiAgICBmb3IgKGxldCBtYWNoaW5lSWQgb2YgZXhpc3Rpbmcua2V5cygpKSB7XG4gICAgICAgIGlmICghbWFjaGluZXMuc29tZShtYWNoaW5lID0+IG1hY2hpbmUubWFjaGluZUlkID09PSBtYWNoaW5lSWQpKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5ybShtYWNoaW5lRmlsZVBhdGgocmVwb1BhdGgsIG1hY2hpbmVJZCksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdyaXR0ZW47XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWFjaGluZUZpbGUobmFtZTogc3RyaW5nLCBjb250ZW50czogc3RyaW5nKTogTWFjaGluZVN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50cyk7XG4gICAgICAgIGxldCBtYWNoaW5lSWQgPSBwYXJzZWQubWFjaGluZUlkIHx8IG5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHsgbWFjaGluZUlkLCBpcHM6IHBhcnNlZC5pcHMgfHwgW10sIGFkZGVkQXQ6IHBhcnNlZC5hZGRlZEF0IHx8IFwiXCIgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyB1bnJlYWRhYmxlIG1hY2hpbmUgZmlsZSAke25hbWV9LiAke2V9YCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRXZlcnkgbWFjaGluZSBmaWxlIG9uIGRpc2suIEZvciBlZGl0aW5nIHRoZSByZXBvLCBub3QgZm9yIGRlY2lkaW5nIHRydXN0IC0gdHJ1c3QgcmVhZHMgdGhlXG4gICAgc2lnbmVkIGZpbGVzIHRocm91Z2ggcmVhZFRydXN0ZWRNYWNoaW5lcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNYWNoaW5lcyhyZXBvUGF0aDogc3RyaW5nKSB7XG4gICAgbGV0IG1hY2hpbmVzID0gbmV3IE1hcDxzdHJpbmcsIE1hY2hpbmVTdGF0ZT4oKTtcbiAgICBsZXQgZGlyZWN0b3J5ID0gcGF0aC5qb2luKHJlcG9QYXRoLCBNQUNISU5FU19ESVIpO1xuICAgIGxldCBuYW1lcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5KS5jYXRjaCgoKSA9PiBbXSBhcyBzdHJpbmdbXSk7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBuYW1lcy5zb3J0KCkpIHtcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYWNoaW5lID0gcGFyc2VNYWNoaW5lRmlsZShuYW1lLCBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LCBuYW1lKSwgXCJ1dGY4XCIpLmNhdGNoKCgpID0+IFwiXCIpKTtcbiAgICAgICAgaWYgKG1hY2hpbmUpIHtcbiAgICAgICAgICAgIG1hY2hpbmVzLnNldChtYWNoaW5lLm1hY2hpbmVJZCwgbWFjaGluZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hY2hpbmVzO1xufVxuXG5sZXQgbGFzdFJldm9rZVN5bmMgPSAwO1xuXG4vKiogUHVsbHMgdGhlIGtleXMgcmVwbyBhbmQgaXRzIHJldm9rZSByZXBvLCBhdCBtb3N0IG9uY2UgYSBSRVZPS0VfU1lOQ19JTlRFUlZBTCwgYmVjYXVzZSB0aGlzIGlzXG4gICAgYXNrZWQgcGVyIHJlcXVlc3QuIEJvdGgsIHNpbmNlIGVpdGhlciBjaGFuZ2luZyBjaGFuZ2VzIHRoZSBhbnN3ZXI6IHRoZSBrZXlzIHJlcG8gY2FycmllcyB0aGVcbiAgICBtYWNoaW5lcyBhbmQgdW5yZXZva2VzLCB0aGUgcmV2b2tlIHJlcG8gY2FycmllcyB0aGUgcmV2b2NhdGlvbnMuIEEgc3luYyB0aGF0IGZhaWxzIGxlYXZlcyB0aGVcbiAgICBjaGVja291dHMgd2UgYWxyZWFkeSBoYXZlLiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luY1Jldm9jYXRpb25zKHNvdXJjZVVSTDogc3RyaW5nKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0UmV2b2tlU3luYyA8IFJFVk9LRV9TWU5DX0lOVEVSVkFMKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdFJldm9rZVN5bmMgPSBEYXRlLm5vdygpO1xuICAgIGF3YWl0IHN5bmNSZXBvKHNvdXJjZVVSTCkuY2F0Y2goZSA9PiBjb25zb2xlLmxvZyhgQ291bGQgbm90IHN5bmMgJHtzb3VyY2VVUkx9LCB1c2luZyB0aGUgY2hlY2tvdXQgYWxyZWFkeSBoZXJlLiAke2V9YCkpO1xuICAgIGF3YWl0IHN5bmNSZXBvRmlsZXMocmV2b2tlUmVwbyhzb3VyY2VVUkwpKS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGBDb3VsZCBub3Qgc3luYyAke3Jldm9rZVJlcG9VUkwoc291cmNlVVJMKX0sIHVzaW5nIHRoZSByZXZvY2F0aW9ucyBhbHJlYWR5IGFic29yYmVkLiAke2V9YCkpO1xufVxuXG4vKiogV2hhdCB0byBydW4gdG8gdHJ1c3QgYSBtYWNoaW5lIHRoYXQgaGFzIGp1c3QgYmVlbiByZWZ1c2VkLlxuXG4gICAgRXZlcnl0aGluZyBpbiBpdCBpcyBhbHJlYWR5IGtub3duIHRvIHdob2V2ZXIgaXMgYmVpbmcgcmVmdXNlZDogdGhlaXIgbWFjaGluZSBpZCwgdGhlIGFkZHJlc3Mgd2VcbiAgICBzYXcgdGhlbSBhdCwgYW5kIHRoZSBkb21haW4gdGhleSBqdXN0IHRhbGtlZCB0by4gSGFuZGluZyBpdCBiYWNrIHNhdmVzIHRoZW0gd29ya2luZyBvdXQgdGhlXG4gICAgcGFydHMgb2YgYSBjb21tYW5kIHRoZXkgaGF2ZSBldmVyeSByaWdodCB0byBrbm93LiBSdW5uaW5nIGl0IHN0aWxsIHRha2VzIHRoZSBoYXJkd2FyZSBrZXkgb25cbiAgICB0aGUgbWFjaGluZSB0aGF0IG93bnMgdGhlIHJlcG8sIHNvIHRlbGxpbmcgdGhlbSBjb3N0cyBub3RoaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZE1hY2hpbmVDb21tYW5kKGNvbmZpZzogeyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZzsgZG9tYWluPzogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBtYWNoaW5lSWQsIGlwLCBkb21haW4gfSA9IGNvbmZpZztcbiAgICByZXR1cm4gYFRvIHRydXN0ICR7bWFjaGluZUlkfSwgcnVuOiB5YXJuIGFkZG1hY2hpbmUgJHtkb21haW4gfHwgXCI8ZG9tYWluPlwifSAke21hY2hpbmVJZH0gJHtpcH0gZ2l0YDtcbn1cblxuLyoqIFNlbmRzIHRoZSBvbmUgbm90aWZpY2F0aW9uIHRoaXMgZmlsZSBpcyBhbGxvd2VkIHRvIHNlbmQsIHdoZW4gaXQgY2FuLlxuXG4gICAgVGhlIGRhZW1vbiBjb25maWd1cmVzIG5vdGlmaWNhdGlvbnMgb24gc3RhcnR1cCBhbmQgd291bGQgc2ltcGx5IHNlbmQuIFRoaXMgY2FuIGFsc28gcnVuIGluIHNvbWVcbiAgICBvdGhlciBwcm9jZXNzLCB3aGljaCBoYXMgbm90LCBzbyB0aGUgd2ViaG9vayBpcyBwaWNrZWQgdXAgaGVyZSBpZiBpdCBpcyByZWFkYWJsZS4gQSBtYWNoaW5lXG4gICAgd2l0aCBubyB3ZWJob29rIHNldCB1cCBzdGlsbCByZWNvcmRzIHRoZSByZXZvY2F0aW9uIC0gYmVpbmcgdW5hYmxlIHRvIHRlbGwgYW55b25lIGlzIG5vdCBhXG4gICAgcmVhc29uIHRvIGtlZXAgYWNjZXB0aW5nIGEgbWFjaGluZSB0aGF0IGlzIGJlaW5nIG1pc3VzZWQuICovXG5hc3luYyBmdW5jdGlvbiBub3RpZnlCZXN0RWZmb3J0KGhlYWRsaW5lOiBzdHJpbmcsIGJvZHk6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICghYXJlRGlzY29yZE5vdGlmaWNhdGlvbnNDb25maWd1cmVkKCkpIHtcbiAgICAgICAgICAgIC8vIFJlYWQgZmlyc3Q6IGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zIGV4aXRzIHRoZSBwcm9jZXNzIHdoZW4gdGhlIGZpbGUgaXMgbWlzc2luZyxcbiAgICAgICAgICAgIC8vIHdoaWNoIGlzIHJpZ2h0IGZvciB0aGUgZGFlbW9uIGF0IHN0YXJ0dXAgYW5kIHdyb25nIGZvciBhIGxpYnJhcnkgY2FsbC5cbiAgICAgICAgICAgIGF3YWl0IGZzLnJlYWRGaWxlKERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEgsIFwidXRmOFwiKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zKHsgZmlsZVBhdGg6IERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEggfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbm90aWZ5KGhlYWRsaW5lLCBib2R5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3Qgc2VuZCBhIG5vdGlmaWNhdGlvbiBhYm91dCB0aGlzLCBpdCBpcyBvbmx5IGluIHRoZSBsb2cuICR7ZX1gKTtcbiAgICB9XG59XG5cbi8qKiBSZWNvcmRzIHRoYXQgYSBtYWNoaW5lIHdlIGFjY2VwdCB0YWxrZWQgdG8gdXMgZnJvbSBhbiBhZGRyZXNzIGl0IGlzIG5vdCBhbGxvd2VkIGZyb20uIE9uZSBwZXJcbiAgICBtYWNoaW5lIGFuZCBhZGRyZXNzLCBzbyBhIHNlY29uZCBhZGRyZXNzIGlzIGEgc2Vjb25kIHJldm9jYXRpb24gYW5kIGFuIHVucmV2b2tlIG9mIHRoZSBmaXJzdFxuICAgIGRvZXMgbm90IGNvdmVyIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjb3JkTWFjaGluZVJldm9jYXRpb24oY29uZmlnOiB7XG4gICAgc291cmNlVVJMOiBzdHJpbmc7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXA6IHN0cmluZztcbiAgICBob3N0TGFiZWw6IHN0cmluZztcbn0pIHtcbiAgICBsZXQgeyBzb3VyY2VVUkwsIG1hY2hpbmVJZCwgaXAsIGhvc3RMYWJlbCB9ID0gY29uZmlnO1xuICAgIC8vIENsb25lcyBpdCBpZiBpdCBpcyBub3QgaGVyZSB5ZXQsIHdoaWNoIGlzIHRoZSB1c3VhbCBzdGF0ZSBvZiBhIG1hY2hpbmUgdGhhdCBoYXMgbmV2ZXIgaGFkIHRvXG4gICAgLy8gcmV2b2tlIGFueXRoaW5nLiBXaXRob3V0IHRoaXMgdGhlIG1rZGlyIGJlbG93IHdvdWxkIGJ1aWxkIHRoZSBkaXJlY3RvcnkgYW55d2F5IGFuZCBnaXQgd291bGRcbiAgICAvLyB0aGVuIGJlIHJ1biBzb21ld2hlcmUgdGhhdCBpcyBub3QgYSBjaGVja291dCwgc28gdGhlIHJldm9jYXRpb24gd2FzIHdyaXR0ZW4gd2hlcmUgbm90aGluZ1xuICAgIC8vIHdvdWxkIGV2ZXIgcmVhZCBpdC5cbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBzeW5jUmVwb0ZpbGVzKHJldm9rZVJlcG8oc291cmNlVVJMKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgcmVjb3JkIHRoZSByZXZvY2F0aW9uIG9mICR7bWFjaGluZUlkfSwgJHtyZXZva2VSZXBvVVJMKHNvdXJjZVVSTCl9IGNvdWxkIG5vdCBiZSByZWFkLiAke2V9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHJlcG9QYXRoID0gcmV2b2tlUmVwb1BhdGgoc291cmNlVVJMKTtcbiAgICBsZXQga2V5UGF0aCA9IGF3YWl0IGVuc3VyZVJldm9rZUtleShzb3VyY2VVUkwpO1xuICAgIGxldCByZXZvY2F0aW9uSWQgPSBuZXdSZXZvY2F0aW9uSWQobWFjaGluZUlkKTtcbiAgICBsZXQgcmV2b2tlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGxldCBkaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVwb1BhdGgsIFJFVk9DQVRJT05TX0RJUik7XG4gICAgYXdhaXQgZnMubWtkaXIoZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGRpcmVjdG9yeSwgYCR7cmV2b2NhdGlvbklkfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcmV2b2NhdGlvbklkLFxuICAgICAgICBtYWNoaW5lSWQsXG4gICAgICAgIGlwLFxuICAgICAgICByZXZva2VkQXQsXG4gICAgICAgIHJldm9rZWRCeTogaG9zdExhYmVsLFxuICAgICAgICByZWFzb246IFJFVk9DQVRJT05fUkVBU09OLFxuICAgIH0sIHVuZGVmaW5lZCwgNCkgKyBcIlxcblwiKTtcblxuICAgIGF3YWl0IHJ1bkdpdCh7IGFyZ3M6IFtcImFkZFwiLCBcIi1BXCJdLCBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoIH0pO1xuICAgIGF3YWl0IHJ1bkdpdCh7XG4gICAgICAgIGFyZ3M6IFtcIi1jXCIsIFwidXNlci5lbWFpbD1wb3J0c2VjdXJlQGxvY2FsaG9zdFwiLCBcIi1jXCIsIFwidXNlci5uYW1lPXBvcnRzZWN1cmVcIiwgXCJjb21taXRcIiwgXCItbVwiLCBgcmV2b2tlICR7cmV2b2NhdGlvbklkfWBdLFxuICAgICAgICBjd2Q6IHJlcG9QYXRoLCBrZXlQYXRoLFxuICAgIH0pO1xuICAgIGxldCBwdXNoID0gYXdhaXQgcnVuR2l0KHsgYXJnczogW1wicHVzaFwiLCBcIm9yaWdpblwiLCBcIkhFQURcIl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGgsIGFsbG93RmFpbHVyZTogdHJ1ZSB9KTtcbiAgICBpZiAocHVzaC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgLy8gQW5vdGhlciBtYWNoaW5lIG1vc3QgbGlrZWx5IHJlY29yZGVkIHRoZSBzYW1lIHRoaW5nIGZpcnN0LCBhbmQgdGhlIG5leHQgcmVhZCBwaWNrcyBpdCB1cC5cbiAgICAgICAgY29uc29sZS5sb2coYENvdWxkIG5vdCBwdXNoIHRoZSByZXZvY2F0aW9uIG9mICR7bWFjaGluZUlkfSBmcm9tICR7aXB9LiAkeyhwdXNoLnN0ZG91dCArIHB1c2guc3RkZXJyKS50cmltKCl9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbm90ZVJldm9jYXRpb24ocmV2b2NhdGlvbklkLCB7IGlkZW50aXR5OiBtYWNoaW5lSWQsIGlwLCByZXZva2VkQXQsIHJldm9rZWRCeTogaG9zdExhYmVsIH0pO1xuICAgIGNvbnNvbGUubG9nKGBSZXZva2VkICR7bWFjaGluZUlkfSBmcm9tICR7aXB9LCAke3Jldm9jYXRpb25JZH1gKTtcblxuICAgIC8vIFNhaWQgYnkgd2hvZXZlciB3cm90ZSB0aGUgcmV2b2NhdGlvbiwgb25jZSwgdGhlIHNhbWUgYXMgZm9yIGFuIHNzaCBrZXkuIE1hY2hpbmVzIHRoYXQgb25seVxuICAgIC8vIHJlYWQgaXQgbGF0ZXIgc2F5IG5vdGhpbmcsIG9yIG9uZSBldmVudCB3b3VsZCBiZSByZXBvcnRlZCBieSBldmVyeSBtYWNoaW5lIHRoYXQgc2F3IGl0LlxuICAgIGF3YWl0IG5vdGlmeUJlc3RFZmZvcnQoXG4gICAgICAgIGBTVVNQSUNJT1VTIElQICR7aXB9IEZST1pFIE1BQ0hJTkUgJHttYWNoaW5lSWR9YCxcbiAgICAgICAgYFRydXN0ZWQgbWFjaGluZSAke21hY2hpbmVJZH0gdGFsa2VkIHRvIHVzIGZyb20gJHtpcH0sIGFuIGFkZHJlc3MgJHttYWNoaW5lSWR9IGlzIG5vdGBcbiAgICAgICAgKyBgIGFsbG93ZWQgZnJvbS4gVGhlIGNhbGxlciBwcm92ZWQgcG9zc2Vzc2lvbiBvZiAke21hY2hpbmVJZH0ncyBrZXksIHNvIGVpdGhlciBzb21lb25lYFxuICAgICAgICArIGAgZWxzZSBoYXMgYSBjb3B5IG9mIHRoZSBrZXksIG9yIHRoZSBtYWNoaW5lJ3MgYWRkcmVzcyBjaGFuZ2VkLmBcbiAgICAgICAgKyBgXFxuXFxuTWFjaGluZSAke21hY2hpbmVJZH0gaXMgZnJvemVuIGV2ZXJ5d2hlcmUgbm93LCBhbmQgbm90aGluZyBhY2NlcHRzIGNhbGxzIGZyb20gJHttYWNoaW5lSWR9LmBcbiAgICAgICAgKyBgXFxuXFxuSWYgdGhpcyB3YXMgYW4gYXR0YWNrLCByZW1vdmUgXFxgbWFjaGluZXMvJHttYWNoaW5lSWR9Lmpzb25cXGAgZnJvbSBcXGAke3NvdXJjZVVSTH1cXGAgbm93LmBcbiAgICAgICAgKyBgXFxuSWYgdGhlIG5ldyBhZGRyZXNzIGlzIGxlZ2l0aW1hdGUsIHJ1bjpgXG4gICAgICAgICsgYFxcblxcYFxcYFxcYFxcbmNkICR7c291cmNlUmVwb1BhdGgoc291cmNlVVJMKX1cXG55YXJuIHVucmV2b2tlIGdpdFxcblxcYFxcYFxcYGBcbiAgICAgICAgKyBgXFxuVGhlIHVucmV2b2tlIGFsbG93cyAke21hY2hpbmVJZH0gZnJvbSAke2lwfSwgYW5kIHRha2VzIGVmZmVjdCBhcyBlYWNoIG1hY2hpbmUgcGlja3MgaXQgdXAuYFxuICAgICAgICArIGBcXG5cXG5tYWNoaW5lOiBcXGAke21hY2hpbmVJZH1cXGBgXG4gICAgICAgICsgYFxcbmZyb3plbiBieTogXFxgJHtob3N0TGFiZWx9XFxgYFxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgdGFsayB0byB0aGlzIG1hY2hpbmUsIGNvbWluZyBmcm9tIHRoaXMgYWRkcmVzcy5cblxuICAgIEJvdGggaGFsdmVzIGFyZSByZXF1aXJlZCBhbmQgbmVpdGhlciBpcyBhIGd1ZXNzOiB0aGUgY2FsbGVyIGtub3dzIHRoZSBtYWNoaW5lIGlkIGJlY2F1c2UgdGhlXG4gICAgY29ubmVjdGlvbiBwcm92ZWQgaXQsIGFuZCBrbm93cyB0aGUgYWRkcmVzcyBiZWNhdXNlIHRoZSBwYWNrZXRzIGNhbWUgZnJvbSB0aGVyZS4gQSBtYWNoaW5lIHdlXG4gICAgZG8gbm90IGxpc3QgaXMgc2ltcGx5IG5vdCBhY2NlcHRlZC4gQSBtYWNoaW5lIHdlIGRvIGxpc3QsIGFycml2aW5nIGZyb20gYW4gYWRkcmVzcyBpdCBkb2VzIG5vdFxuICAgIGhhdmUsIGlzIHRyZWF0ZWQgYXMgdGhlIHNhbWUga2luZCBvZiBldmVudCBhcyBhIHN0b2xlbiBzc2gga2V5IC0gaXQgaXMgcmV2b2tlZCBldmVyeXdoZXJlLCBhbmRcbiAgICBzdGF5cyByZXZva2VkIHVudGlsIGFuIHVucmV2b2tlIGFsbG93cyB0aGF0IG1hY2hpbmUgZnJvbSB0aGF0IGFkZHJlc3MuXG5cbiAgICBTYXlzIHdoeSB3aGVuIHRoZSBhbnN3ZXIgaXMgbm8sIGJlY2F1c2UgdGhlIHRocmVlIHdheXMgdG8gYmUgcmVmdXNlZCBhcmUgZW50aXJlbHkgZGlmZmVyZW50XG4gICAgdGhpbmdzIHRvIGEgcGVyc29uIHJlYWRpbmcgaXQ6IG5ldmVyIHRydXN0ZWQgYXQgYWxsLCB0cnVzdGVkIGJ1dCBmcm96ZW4sIG9yIHRydXN0ZWQgYW5kIHRhbGtpbmdcbiAgICBmcm9tIHNvbWV3aGVyZSBpdCBzaG91bGQgbm90IGJlLlxuXG4gICAgVGhyb3dzIHdoZW4gdGhlIHJlcG8gaXRzZWxmIGNhbm5vdCBiZSByZWFkIG9yIGlzIG5vdCBzaWduZWQsIHJhdGhlciB0aGFuIGFuc3dlcmluZyBmYWxzZTogdGhhdFxuICAgIGlzIGEgYnJva2VuIGluc3RhbGxhdGlvbiwgbm90IGEgcmVqZWN0ZWQgbWFjaGluZSwgYW5kIHRoZSB0d28gZGVzZXJ2ZSBkaWZmZXJlbnQgaGFuZGxpbmcuICovXG5leHBvcnQgdHlwZSBNYWNoaW5lVmVyZGljdCA9IHsgYWNjZXB0ZWQ6IGJvb2xlYW47IHJlYXNvbjogc3RyaW5nIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc01hY2hpbmVBY2NlcHRlZChjb25maWc6IHtcbiAgICBtYWNoaW5lSWQ6IHN0cmluZztcbiAgICBpcDogc3RyaW5nO1xuICAgIC8vIFVzZWQgZm9yIGxvY2FsIGxvb3BiYWNrIGFjY2VwdGFuY2UsIGFuZCBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLlxuICAgIGRvbWFpbj86IHN0cmluZztcbn0pOiBQcm9taXNlPE1hY2hpbmVWZXJkaWN0PiB7XG4gICAgbGV0IHsgbWFjaGluZUlkLCBpcCwgZG9tYWluIH0gPSBjb25maWc7XG4gICAgaWYgKCFtYWNoaW5lSWQgfHwgIWlwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBtYWNoaW5lSWQgYW5kIGFuIGlwLCB3YXMgJHtKU09OLnN0cmluZ2lmeShtYWNoaW5lSWQpfSBhbmQgJHtKU09OLnN0cmluZ2lmeShpcCl9YCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHdob2xlIGNoZWNrLCBwbHVzIHdoZXRoZXIgaXQgZnJvemUgdGhlIG1hY2hpbmUuIEEgcmVqZWN0aW9uIHRoYXQgZnJvemUgaXQgaXMgZmluYWwsIHNvXG4gICAgLy8gdGhlcmUgaXMgbm90aGluZyB0byBnYWluIGZyb20gbG9va2luZyBhZ2Fpbi4gQW55IG90aGVyIHJlamVjdGlvbiBtaWdodCBqdXN0IGJlIGEgc3RhbGUgdmlldyAtXG4gICAgLy8gYSBtYWNoaW5lIGFkZGVkIHNlY29uZHMgYWdvIHRoYXQgb3VyIGNhY2hlZCBsaXN0IGhhcyBub3QgY2F1Z2h0IHVwIHRvIC0gc28gaXQgaXMgd29ydGggb25lXG4gICAgLy8gZnJlc2ggbG9vaywgd2hpY2ggaXMgd2hhdCB0aGUgcmV0cnkgYmVsb3cgZG9lcy5cbiAgICBsZXQgZXZhbHVhdGUgPSBhc3luYyAoKTogUHJvbWlzZTx7IHZlcmRpY3Q6IE1hY2hpbmVWZXJkaWN0OyBmcm96ZTogYm9vbGVhbiB9PiA9PiB7XG4gICAgICAgIGlmIChMT09QQkFDSy5pbmNsdWRlcyhpcCkgJiYgISFkb21haW4gJiYgbWFjaGluZUlkID09PSBnZXRPd25NYWNoaW5lSWQoZG9tYWluKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogdHJ1ZSwgcmVhc29uOiBcIlwiIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHNvdXJjZVVSTCB9ID0gYXdhaXQga2V5c1JlcG8oKTtcbiAgICAgICAgYXdhaXQgc3luY1Jldm9jYXRpb25zKHNvdXJjZVVSTCk7XG4gICAgICAgIC8vIFRoZSBsaXN0IGhhcyByZXZvY2F0aW9ucyBhbHJlYWR5IGFwcGxpZWQgLSByZWFkU2lnbmVkUmVwbyBkcm9wcyBmcm96ZW4gbWFjaGluZXMgLSBzbyBhXG4gICAgICAgIC8vIG1hY2hpbmUgaW4gaXQgaXMgdHJ1c3RlZCwgYW5kIGEgbWFjaGluZSBtaXNzaW5nIGZyb20gaXQgaXMgZWl0aGVyIHVua25vd24gb3IgZnJvemVuLlxuICAgICAgICBsZXQgbWFjaGluZSA9IChhd2FpdCBnZXRUcnVzdGVkTWFjaGluZXMoKSkuZmluZChlbnRyeSA9PiBlbnRyeS5tYWNoaW5lSWQgPT09IG1hY2hpbmVJZCk7XG4gICAgICAgIGlmICghbWFjaGluZSkge1xuICAgICAgICAgICAgbGV0IGZyb3plbiA9IGlkZW50aXR5RnJvemVuQnkobWFjaGluZUlkKTtcbiAgICAgICAgICAgIGlmIChmcm96ZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2ZXJkaWN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYE1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIGZyb3plbjogaXQgd2FzIHVzZWQgZnJvbSAke2Zyb3plbi5pcCB8fCBcImFuIGFkZHJlc3Mgbm90aGluZyByZWNvcmRlZFwifWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGAke2Zyb3plbi5yZXZva2VkQXQgJiYgYCwgYXQgJHtmcm96ZW4ucmV2b2tlZEF0fWAgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBgJHtmcm96ZW4ucmV2b2tlZEJ5ICYmIGAsIG5vdGljZWQgYnkgJHtmcm96ZW4ucmV2b2tlZEJ5fWAgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBgLCB3aGljaCBpcyBub3QgYW4gYWRkcmVzcyBpdCBpcyBhbGxvd2VkIGZyb20gKHJldm9jYXRpb24gJHtmcm96ZW4ucmV2b2NhdGlvbklkfSkuYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYCBUbyBnaXZlIGl0IGFjY2VzcyBhZ2FpbiwgcnVuOiBjZCAke3NvdXJjZVJlcG9QYXRoKHNvdXJjZVVSTCl9ICYmIHlhcm4gdW5yZXZva2UgZ2l0YCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZnJvemU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiBmYWxzZSwgcmVhc29uOiBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgbm90IHRydXN0ZWQuICR7YWRkTWFjaGluZUNvbW1hbmQoeyBtYWNoaW5lSWQsIGlwLCBkb21haW4gfSl9YCB9LCBmcm96ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvb3BiYWNrIGlzIGFsd2F5cyBhbiBhbGxvd2VkIGFkZHJlc3MuIFRoZSBtYWNoaW5lIHN0aWxsIGhhcyB0byBiZSB0cnVzdGVkIC0gYW4gdW5rbm93blxuICAgICAgICAvLyBvciBmcm96ZW4gb25lIHdhcyBhbHJlYWR5IHJlZnVzZWQgYWJvdmUgLSBidXQgbm8gaXAgbGlzdCBjYW4gZGVzY3JpYmUgYSBtYWNoaW5lIHRhbGtpbmdcbiAgICAgICAgLy8gdG8gaXRzZWxmOiBhIG1hY2hpbmUgaXMgbGlzdGVkIHVuZGVyIHRoZSBhZGRyZXNzIG90aGVycyByZWFjaCBpdCBhdCwgbmV2ZXIgMTI3LjAuMC4xLFxuICAgICAgICAvLyBzbyBjaGVja2luZyBsb29wYmFjayBhZ2FpbnN0IHRoYXQgbGlzdCByZWplY3RzIGV2ZXJ5IGxvY2FsIGNhbGwgYW5kIHRoZW4gZnJlZXplcyB0aGVcbiAgICAgICAgLy8gbWFjaGluZSBldmVyeXdoZXJlIGZvciBtYWtpbmcgaXQuXG4gICAgICAgIGlmIChtYWNoaW5lLmlwcy5pbmNsdWRlcyhpcCkgfHwgTE9PUEJBQ0suaW5jbHVkZXMoaXApKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiB0cnVlLCByZWFzb246IFwiXCIgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaXN0ZWQsIGJ1dCB0YWxraW5nIHRvIHVzIGZyb20gc29tZXdoZXJlIGl0IHNob3VsZCBub3QgYmUuIFJlY29yZGVkIG9uY2UgZm9yIHRoaXMgbWFjaGluZVxuICAgICAgICAvLyBhbmQgYWRkcmVzcywgc28gYmVpbmcgdGFsa2VkIHRvIHJlcGVhdGVkbHkgZG9lcyBub3Qgd3JpdGUgcmVwZWF0ZWRseS5cbiAgICAgICAgaWYgKCFpc1BhaXJSZXZva2VkKG1hY2hpbmVJZCwgaXApICYmICFpc1BhaXJVbnJldm9rZWQobWFjaGluZUlkLCBpcCkpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIG1hY2hpbmUgdGhhdCBhY3R1YWxseSB3cm90ZSB0aGUgcmV2b2NhdGlvbiBtYXkgc2F5IGl0IGZyb3plIGFueXRoaW5nLiBPbmVcbiAgICAgICAgICAgIC8vIHRoYXQgY291bGQgbm90IHJlYWNoIHRoZSByZXZva2UgcmVwbyBoYXMgcmVmdXNlZCB0aGlzIGNhbGwgYW5kIG5vdGhpbmcgbW9yZS5cbiAgICAgICAgICAgIGxldCBmcm96ZSA9IGF3YWl0IHJlY29yZE1hY2hpbmVSZXZvY2F0aW9uKHsgc291cmNlVVJMLCBtYWNoaW5lSWQsIGlwLCBob3N0TGFiZWw6IG9zLmhvc3RuYW1lKCkgfSk7XG4gICAgICAgICAgICBsZXQgcmVhc29uID0gZnJvemVcbiAgICAgICAgICAgICAgICAmJiBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgbm90IGFsbG93ZWQgZnJvbSAke2lwfSwgYW5kIGlzIG5vdyBmcm96ZW4gZXZlcnl3aGVyZS5gXG4gICAgICAgICAgICAgICAgfHwgYE1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIG5vdCBhbGxvd2VkIGZyb20gJHtpcH0uIEl0IGNvdWxkIG5vdCBiZSBmcm96ZW4sICR7cmV2b2tlUmVwb1VSTChzb3VyY2VVUkwpfSBjb3VsZCBub3QgYmUgd3JpdHRlbi5gO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogZmFsc2UsIHJlYXNvbiB9LCBmcm96ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGBNYWNoaW5lICR7bWFjaGluZUlkfSBpcyBub3QgYWxsb3dlZCBmcm9tICR7aXB9LmAgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgfTtcblxuICAgIGxldCB7IHZlcmRpY3QsIGZyb3plIH0gPSBhd2FpdCBldmFsdWF0ZSgpO1xuICAgIC8vIEFuIGFjY2VwdCwgb3IgYSByZWplY3Rpb24gdGhhdCBqdXN0IGZyb3plIHRoZSBtYWNoaW5lLCBpcyB0aGUgZmluYWwgd29yZC4gQW55IG90aGVyIHJlamVjdGlvblxuICAgIC8vIG1pZ2h0IGp1c3QgYmUgYSBzdGFsZSBsaXN0IC0gYSBtYWNoaW5lIGFkZGVkIHNlY29uZHMgYWdvIHdlIGhhdmUgbm90IGNhdWdodCB1cCB0byAtIHNvIGl0IGlzXG4gICAgLy8gd29ydGggb25lIGZyZXNoIGxvb2suXG4gICAgaWYgKHZlcmRpY3QuYWNjZXB0ZWQgfHwgZnJvemUpIHtcbiAgICAgICAgcmV0dXJuIHZlcmRpY3Q7XG4gICAgfVxuICAgIC8vIFJlLXJlYWQgdGhlIGxpc3QgYXQgbW9zdCBvbmNlIGEgbWludXRlLCBzbyBhIGJ1cnN0IG9mIGJhZCBjYWxsZXJzIGNhbm5vdCBtYWtlIHVzIHJlLXJlYWQgb25cbiAgICAvLyBldmVyeSBvbmUgb2YgdGhlbS4gRm9yY2UgdGhlIGNoZWNrb3V0IGJhY2sgdG8gdGhlIHJlbW90ZSBmaXJzdCwgc28gYSBtYWNoaW5lIGFkZGVkIGFuZCBzaWduZWRcbiAgICAvLyBzZWNvbmRzIGFnbyBpcyBwaWNrZWQgdXAgZXZlbiBpZiB0aGUgY2hlY2tvdXQgd2FzIGxlZnQgZGlydHksIHRoZW4gdGFrZSB0aGUgZnJlc2ggbG9vayBhc1xuICAgIC8vIGZpbmFsLlxuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdE1hY2hpbmVzSW52YWxpZGF0aW9uID4gTUFDSElORVNfSU5WQUxJREFUSU9OX0lOVEVSVkFMKSB7XG4gICAgICAgIGxhc3RNYWNoaW5lc0ludmFsaWRhdGlvbiA9IERhdGUubm93KCk7XG4gICAgICAgIGxldCB7IHNvdXJjZVVSTCB9ID0gYXdhaXQga2V5c1JlcG8oKTtcbiAgICAgICAgYXdhaXQgc3luY1JlcG8oc291cmNlVVJMLCB7IGZvcmNlVXBkYXRlOiB0cnVlIH0pLmNhdGNoKGUgPT4gY29uc29sZS5sb2coYENvdWxkIG5vdCBmb3JjZSB1cGRhdGUgJHtzb3VyY2VVUkx9LiAke2V9YCkpO1xuICAgICAgICB0cnVzdGVkTWFjaGluZXMucmVzZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIChhd2FpdCBldmFsdWF0ZSgpKS52ZXJkaWN0O1xufVxuIl19
402
- /* _JS_SOURCE_HASH = "c5e62dd10f51942a9c6296e4d6c2784eaf3d3af1705e2e7a1ff3f02c6ccfc2b1"; */
413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjaGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNoaW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBNkI7QUFDN0IsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4Qix5REFBNkQ7QUFDN0Qsa0VBQStFO0FBQy9FLG9FQUFzRTtBQUN0RSxzREFBZ0U7QUFDaEUsa0VBQXFFO0FBQ3JFLDRFQUEySTtBQUMzSSxpRUFBK0U7QUFDL0UsdURBQTJEO0FBQzNELDREQUF5RDtBQUN6RCxzREFBdUk7QUFDdkksa0RBQWlJO0FBQ2pJLG9EQUFpRjtBQUNqRix5REFBbUQ7QUFDbkQsMkRBQTRFO0FBRzVFLG1HQUFtRztBQUNuRyxpR0FBaUc7QUFDakcsZ0VBQWdFO0FBQ25ELFFBQUEsWUFBWSxHQUFHLFVBQVUsQ0FBQztBQUN2QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUM7QUFDdEMsTUFBTSxpQkFBaUIsR0FBRyw4Q0FBOEMsQ0FBQztBQUN6RSxnR0FBZ0c7QUFDaEcsbUNBQW1DO0FBQ25DLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN2Qyw2RkFBNkY7QUFDN0YsaUdBQWlHO0FBQ2pHLGtFQUFrRTtBQUNsRSxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUMsZ0dBQWdHO0FBQ2hHLGlHQUFpRztBQUNqRywwREFBMEQ7QUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQzFELGdHQUFnRztBQUNoRyxnR0FBZ0c7QUFDaEcsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2pELElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBU2pDLEtBQUssVUFBVSxVQUFVLENBQUMsUUFBZ0I7SUFDdEMsSUFB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Q0FBQztJQUMxQyxnR0FBZ0c7SUFDaEcsK0ZBQStGO0lBQy9GLHdCQUF3QjtJQUN4QixJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksS0FBSyxFQUFFLENBQUM7UUFDNUIsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUNELDhGQUE4RjtJQUM5RixnR0FBZ0c7SUFDaEcsNEZBQTRGO0lBQzVGLFNBQVM7SUFDVCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyx3QkFBd0IsR0FBRyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3pFLHdCQUF3QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxJQUFBLGdCQUFRLEdBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUEsY0FBUSxFQUFDLFNBQVMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLFNBQVMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEgsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRCxPQUFPLENBQUMsTUFBTSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxDQUFDO0FBdEZELDhDQXNGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlcG8gfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMva2V5c1JlcG9cIjtcbmltcG9ydCB7IHJldm9rZVJlcG8sIHN5bmNSZXBvRmlsZXMgfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvZGFlbW9uL3JlcG9GaWxlc1wiO1xuaW1wb3J0IHsgbmV3UmV2b2NhdGlvbklkIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9yZXZvY2F0aW9uXCI7XG5pbXBvcnQgeyBydW5HaXQsIHN5bmNSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9naXRcIjtcbmltcG9ydCB7IGVuc3VyZVJldm9rZUtleSB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVwb0ZpbGVzXCI7XG5pbXBvcnQgeyBpZGVudGl0eUZyb3plbkJ5LCBpc1BhaXJSZXZva2VkLCBpc1BhaXJVbnJldm9rZWQsIG5vdGVSZXZvY2F0aW9uLCByZWFkU2lnbmVkUmVwbyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVhZFNpZ25lZFJlcG9cIjtcbmltcG9ydCB7IHJldm9rZVJlcG9QYXRoLCByZXZva2VSZXBvVVJMIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL3Jldm9rZVNvdXJjZVwiO1xuaW1wb3J0IHsgc291cmNlUmVwb1BhdGggfSBmcm9tIFwiLi4vYXV0aG9yaXplZEtleXMvc291cmNlc1wiO1xuaW1wb3J0IHsgbm90aWZ5IH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9ub3RpZnlcIjtcbmltcG9ydCB7IGFyZURpc2NvcmROb3RpZmljYXRpb25zQ29uZmlndXJlZCwgY29uZmlndXJlRGlzY29yZE5vdGlmaWNhdGlvbnMsIERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEggfSBmcm9tIFwiLi4vbm90aWZpY2F0aW9ucy9kaXNjb3JkXCI7XG5pbXBvcnQgeyBERVZfZ2V0SWRlbnRpdHlGaWxlUGF0aCwgZ2VuZXJhdGVDQSwgZ2V0TWFjaGluZUlkLCBnZXRPd25NYWNoaW5lSWQsIElkZW50aXR5U3RvcmFnZVR5cGUgfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuaW1wb3J0IHsgZGVzY3JpYmVIb3N0LCBydW5PdmVyU1NILCB3cml0ZVJlbW90ZUZpbGUgfSBmcm9tIFwiLi4vaGVscGVycy9yZW1vdGVTU0hcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBydW5JbmZpbml0ZVBvbGwsIHJ1bkluU2VyaWFsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IHNwYXduUHJvbWlzZSB9IGZyb20gXCIuLi9oZWxwZXJzL3NwYXduXCI7XG5cbi8vIFdoaWNoIG1hY2hpbmVzIHRoaXMgc3lzdGVtIHRhbGtzIHRvLCBrZXB0IGluIHRoZSBzYW1lIHJlcG8gYXMgdGhlIHNzaCBrZXlzLiBUaGF0IHJlcG8gaXMgYWxyZWFkeVxuLy8gc2lnbmVkLCBhbHJlYWR5IGRpc3RyaWJ1dGVkIHRvIGV2ZXJ5IG1hY2hpbmUsIGFuZCBhbHJlYWR5IGhhcyBzb21ld2hlcmUgdG8gcmVjb3JkIGEgcmVqZWN0aW9uLFxuLy8gc28gYSBzZWNvbmQgb25lIHdvdWxkIG9ubHkgYmUgYSBzZWNvbmQgdGhpbmcgdG8ga2VlcCBpbiBzdGVwLlxuZXhwb3J0IGNvbnN0IE1BQ0hJTkVTX0RJUiA9IFwibWFjaGluZXNcIjtcbmNvbnN0IFJFVk9DQVRJT05TX0RJUiA9IFwicmV2b2NhdGlvbnNcIjtcbmNvbnN0IFJFVk9DQVRJT05fUkVBU09OID0gXCJhIG1hY2hpbmUgdGFsa2VkIHRvIHVzIGZyb20gYW4gdW5hcHByb3ZlZCBJUFwiO1xuLy8gVGhlIHJldm9rZSByZXBvIGlzIHB1bGxlZCBhdCBtb3N0IHRoaXMgb2Z0ZW4uIEEgY2hlY2sgaGFwcGVucyBwZXIgcmVxdWVzdCwgYW5kIGEgcmVxdWVzdCBtdXN0XG4vLyBub3QgY29zdCBhIHJvdW5kIHRyaXAgdG8gZ2l0aHViLlxuY29uc3QgUkVWT0tFX1NZTkNfSU5URVJWQUwgPSA2MCAqIDEwMDA7XG4vLyBBbmQgdGhlIG1hY2hpbmUgbGlzdCBpcyByZS1yZWFkIGZyb20gdGhlIGNoZWNrb3V0IG9uIHRoaXMgaW50ZXJ2YWwsIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGVcbi8vIGNoZWNrb3V0IGl0c2VsZiBvbmx5IG1vdmVzIHdoZW4gdGhlIGRhZW1vbiBwdWxscyBpdCwgd2hpY2ggaXMgb24gdGhlIHNhbWUgc29ydCBvZiBpbnRlcnZhbCwgc29cbi8vIHJlYWRpbmcgbW9yZSBvZnRlbiB0aGFuIHRoaXMgd291bGQgb25seSByZS1yZWFkIHRoZSBzYW1lIGJ5dGVzLlxuY29uc3QgTUFDSElORVNfUkVGUkVTSF9JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIEhvdyBsb25nIGEgZmFpbHVyZSB0byBmaW5kIHRoZSBrZXlzIHJlcG8gaXMgcmVtZW1iZXJlZC4gQSBsb25nIGxpdmVkIHByb2Nlc3MgbWF5IHN0YXJ0IGJlZm9yZVxuLy8gdGhlIG1hY2hpbmUgaXMgc2V0IHVwLCBhbmQgc2hvdWxkIHBpY2sgaXQgdXAgb25jZSBpdCBpcywgd2l0aG91dCBiZWluZyByZXN0YXJ0ZWQgLSBidXQgaXQgbXVzdFxuLy8gbm90IHBheSBmb3IgcmVzb2x2aW5nIHRoZSByZXBvIG9uIGV2ZXJ5IHJlcXVlc3QgZWl0aGVyLlxuY29uc3QgUkVQT19SRVRSWV9ERUxBWSA9IDE1ICogMTAwMDtcbmNvbnN0IExPT1BCQUNLID0gW1wiMTI3LjAuMC4xXCIsIFwiOjoxXCIsIFwiOjpmZmZmOjEyNy4wLjAuMVwiXTtcbi8vIFRoZSB0cnVzdGVkIG1hY2hpbmUgbGlzdCBpcyByZS1yZWFkIGF0IG1vc3QgdGhpcyBvZnRlbiB3aGVuIGEgY2hlY2sgcmVqZWN0cywgc28gYSBjYWxsZXIgdGhhdFxuLy8gd2FzIGp1c3QgYWRkZWQgaXMgcGlja2VkIHVwIHF1aWNrbHkgd2l0aG91dCBsZXR0aW5nIGEgZmxvb2Qgb2YgcmVqZWN0aW9ucyByZS1yZWFkIGV2ZXJ5IHRpbWUuXG5jb25zdCBNQUNISU5FU19JTlZBTElEQVRJT05fSU5URVJWQUwgPSA2MCAqIDEwMDA7XG5sZXQgbGFzdE1hY2hpbmVzSW52YWxpZGF0aW9uID0gMDtcblxuLyoqIE9uZSBtYWNoaW5lIHdlIGFyZSB3aWxsaW5nIHRvIHRhbGsgdG8sIGFuZCB0aGUgYWRkcmVzc2VzIGl0IG1heSB0YWxrIHRvIHVzIGZyb20uICovXG5leHBvcnQgdHlwZSBNYWNoaW5lU3RhdGUgPSB7XG4gICAgbWFjaGluZUlkOiBzdHJpbmc7XG4gICAgaXBzOiBzdHJpbmdbXTtcbiAgICBhZGRlZEF0OiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hY2hpbmVGaWxlUGF0aChyZXBvUGF0aDogc3RyaW5nLCBtYWNoaW5lSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4ocmVwb1BhdGgsIE1BQ0hJTkVTX0RJUiwgYCR7bWFjaGluZUlkfS5qc29uYCk7XG59XG5cbi8qKiBUaGlzIG1hY2hpbmUncyBrZXlzIHJlcG8sIHdvcmtlZCBvdXQgb25jZSBhbmQgdGhlbiByZW1lbWJlcmVkLlxuXG4gICAgQSBmYWlsdXJlIGlzIHJlbWVtYmVyZWQgdG9vLCBidXQgb25seSBicmllZmx5OiBhIHNlcnZlciBtYXkgd2VsbCBzdGFydCBiZWZvcmUgdGhlIG1hY2hpbmUgaGFzXG4gICAgYmVlbiBzZXQgdXAsIGFuZCBzaG91bGQgc3RhcnQgd29ya2luZyB3aGVuIGl0IGlzLCByYXRoZXIgdGhhbiBuZWVkaW5nIGEgcmVzdGFydC4gKi9cbmV4cG9ydCBjb25zdCBrZXlzUmVwbyA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBsb29rdXAgPSByZXNvbHZlS2V5c1JlcG8oKTtcbiAgICBsb29rdXAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGtleXNSZXBvLnJlc2V0KCksIFJFUE9fUkVUUllfREVMQVkpLnVucmVmKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IGxvb2t1cDtcbn0pO1xuXG4vKiogRXZlcnkgbWFjaGluZSBhIGNoZWNrb3V0IGxpc3RzLiBXaXRob3V0IGEgcmVwbywgdGhpcyBtYWNoaW5lJ3Mgb3duLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1hY2hpbmVzKHJlcG9QYXRoPzogc3RyaW5nKTogUHJvbWlzZTxNYWNoaW5lU3RhdGVbXT4ge1xuICAgIHJldHVybiBbLi4uKGF3YWl0IHJlYWRNYWNoaW5lcyhyZXBvUGF0aCB8fCAoYXdhaXQga2V5c1JlcG8oKSkucmVwb1BhdGgpKS52YWx1ZXMoKV07XG59XG5cbi8qKiBUaGUgbWFjaGluZXMgdGhlIHNpZ25lZCBmaWxlcyB2b3VjaCBmb3IuIE9ubHkgdGhlIG1hY2hpbmUgZmlsZXMgY292ZXJlZCBieSB0aGUgc2lnbmF0dXJlIGFyZVxuICAgIHJlYWQgLSBhbiB1bnNpZ25lZCBtYWNoaW5lcy8qLmpzb24gaXMgbm90IGV2aWRlbmNlIG9mIGFueXRoaW5nLCBzbyByZWFkU2lnbmVkUmVwbyBoYXMgYWxyZWFkeVxuICAgIGxlZnQgaXQgb3V0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFRydXN0ZWRNYWNoaW5lcygpIHtcbiAgICBsZXQgeyByZXBvUGF0aCwgc291cmNlVVJMIH0gPSBhd2FpdCBrZXlzUmVwbygpO1xuICAgIGxldCB7IGZpbGVzIH0gPSBhd2FpdCByZWFkU2lnbmVkUmVwbyh7IHJlcG9QYXRoLCBzb3VyY2VVUkwgfSk7XG4gICAgbGV0IG1hY2hpbmVzOiBNYWNoaW5lU3RhdGVbXSA9IFtdO1xuICAgIGZvciAobGV0IFtmaWxlUGF0aCwgY29udGVudHNdIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtNQUNISU5FU19ESVJ9L2ApICYmIGZpbGVQYXRoLnNsaWNlKE1BQ0hJTkVTX0RJUi5sZW5ndGggKyAxKSB8fCBcIlwiO1xuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSB8fCBuYW1lLmluY2x1ZGVzKFwiL1wiKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hY2hpbmUgPSBwYXJzZU1hY2hpbmVGaWxlKG5hbWUsIGNvbnRlbnRzLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgICAgIGlmIChtYWNoaW5lKSB7XG4gICAgICAgICAgICBtYWNoaW5lcy5wdXNoKG1hY2hpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYWNoaW5lcztcbn1cblxuY29uc3QgdHJ1c3RlZE1hY2hpbmVzID0gbGF6eShhc3luYyAoKSA9PiB7XG4gICAgbGV0IHJlYWQgPSByZWFkVHJ1c3RlZE1hY2hpbmVzKCk7XG4gICAgcmVhZC5jYXRjaCgoKSA9PiB0cnVzdGVkTWFjaGluZXMucmVzZXQoKSk7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWQ7XG59KTtcblxubGV0IHJlZnJlc2hpbmcgPSBmYWxzZTtcblxuLyoqIFRoZSBtYWNoaW5lcyB0aGlzIHN5c3RlbSB0cnVzdHMsIGFzIHRoZSBzaWduZWQgcmVwbyBsaXN0cyB0aGVtLlxuXG4gICAgSGVsZCByYXRoZXIgdGhhbiByZWFkIHBlciBjYWxsLCBhbmQgcmVmcmVzaGVkIGluIHRoZSBiYWNrZ3JvdW5kLCBzbyBub2JvZHkgYXNraW5nIHdoZXRoZXIgYVxuICAgIG1hY2hpbmUgaXMgdHJ1c3RlZCB3YWl0cyBmb3IgYSBkaXJlY3Rvcnkgb2YgZmlsZXMgdG8gYmUgcmVhZCBhbmQgYSBzaWduYXR1cmUgdG8gYmUgY2hlY2tlZC4gQVxuICAgIHJlZnJlc2ggdGhhdCBmYWlscyBsZWF2ZXMgdGhlIGxpc3Qgd2UgYWxyZWFkeSBoYXZlOiB0aGUgY2hlY2tvdXQgaXMgb25seSBzdGFsZSwgbm90IHdyb25nLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRydXN0ZWRNYWNoaW5lcygpOiBQcm9taXNlPE1hY2hpbmVTdGF0ZVtdPiB7XG4gICAgaWYgKCFyZWZyZXNoaW5nKSB7XG4gICAgICAgIHJlZnJlc2hpbmcgPSB0cnVlO1xuICAgICAgICBydW5JbmZpbml0ZVBvbGwoTUFDSElORVNfUkVGUkVTSF9JTlRFUlZBTCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0cnVzdGVkTWFjaGluZXMuc2V0KFByb21pc2UucmVzb2x2ZShhd2FpdCByZWFkVHJ1c3RlZE1hY2hpbmVzKCkpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ291bGQgbm90IHJlLXJlYWQgdGhlIHRydXN0ZWQgbWFjaGluZXMsIGtlZXBpbmcgdGhlIG9uZXMgd2UgaGF2ZS4gJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRydXN0ZWRNYWNoaW5lcygpO1xufVxuXG4vKiogVGhlIG1hY2hpbmUgaWQgb2YgYSBtYWNoaW5lIHJlYWNoZWQgb3ZlciBzc2gsIGdlbmVyYXRpbmcgYW5kIGluc3RhbGxpbmcgYW4gaWRlbnRpdHkgZm9yIGl0IGlmXG4gICAgaXQgaGFzIG5vbmUgdW5kZXIgdGhpcyBkb21haW4uIFRoZSBwcml2YXRlIGtleSBlbmRzIHVwIG9uIHRoYXQgbWFjaGluZSBhbmQgbm93aGVyZSBlbHNlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlUmVtb3RlTWFjaGluZUlkKGhvc3Q6IHN0cmluZywgZG9tYWluOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoREVWX2dldElkZW50aXR5RmlsZVBhdGgoZG9tYWluKSk7XG4gICAgbGV0IGhvbWUgPSAoYXdhaXQgcnVuT3ZlclNTSCh7IGhvc3QsIHNjcmlwdDogYGVjaG8gJEhPTUVgIH0pKS5zdGRvdXQudHJpbSgpO1xuICAgIGlmICghaG9tZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7aG9zdH0gdG8gcmVwb3J0IGEgaG9tZSBkaXJlY3RvcnksIGl0IHJlcG9ydGVkIG5vdGhpbmdgKTtcbiAgICB9XG4gICAgbGV0IGNvbnRlbnRzID0gYXdhaXQgcnVuT3ZlclNTSCh7IGhvc3QsIHNjcmlwdDogYGNhdCAke2hvbWV9LyR7ZmlsZU5hbWV9IDI+L2Rldi9udWxsIHx8IHRydWVgIH0pO1xuICAgIGlmIChjb250ZW50cy5zdGRvdXQudHJpbSgpKSB7XG4gICAgICAgIGxldCBzdG9yZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRzLnN0ZG91dCkgYXMgSWRlbnRpdHlTdG9yYWdlVHlwZTtcbiAgICAgICAgcmV0dXJuIGdldE1hY2hpbmVJZChzdG9yZWQuZG9tYWluLCBkb21haW4pO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgJHtkZXNjcmliZUhvc3QoaG9zdCl9IGhhcyBubyBpZGVudGl0eSBmb3IgJHtkb21haW59LCBnZW5lcmF0aW5nIG9uZWApO1xuICAgIGxldCBnZW5lcmF0ZWQgPSBnZW5lcmF0ZUNBKGRvbWFpbik7XG4gICAgbGV0IHN0b3JlZDogSWRlbnRpdHlTdG9yYWdlVHlwZSA9IHtcbiAgICAgICAgZG9tYWluOiBnZW5lcmF0ZWQuZG9tYWluLFxuICAgICAgICBjZXJ0QjY0OiBnZW5lcmF0ZWQuY2VydC50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAga2V5QjY0OiBnZW5lcmF0ZWQua2V5LnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgIH07XG4gICAgYXdhaXQgd3JpdGVSZW1vdGVGaWxlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgZmlsZVBhdGg6IGAke2hvbWV9LyR7ZmlsZU5hbWV9YCxcbiAgICAgICAgY29udGVudHM6IEpTT04uc3RyaW5naWZ5KHN0b3JlZCksXG4gICAgICAgIGZpbGVNb2RlOiBcIjYwMFwiLFxuICAgICAgICBkaXJlY3RvcnlNb2RlOiBcIjcwMFwiLFxuICAgIH0pO1xuICAgIHJldHVybiBnZXRNYWNoaW5lSWQoZ2VuZXJhdGVkLmRvbWFpbiwgZG9tYWluKTtcbn1cblxuLyoqIE1ha2VzIGEgY2hlY2tvdXQgbGlzdCBleGFjdGx5IHRoZXNlIG1hY2hpbmVzOiB0aG9zZSBuYW1lZCBhcmUgd3JpdHRlbiB3aXRoIHRoZSBhZGRyZXNzZXMgZ2l2ZW4sXG4gICAgYW5kIGFueXRoaW5nIG5vdCBuYW1lZCBpcyByZW1vdmVkLiBTbyByZWFkIHRoZW0sIGNoYW5nZSB3aGF0IHlvdSB3YW50LCBhbmQgd3JpdGUgdGhlIHJlc3VsdC5cblxuICAgIFRoZSBhZGRyZXNzZXMgYXJlIHBhcnQgb2Ygc2V0dGluZyByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIHN0ZXAsIGJlY2F1c2UgYSBtYWNoaW5lIHdpdGggbm9cbiAgICBhZGRyZXNzIGl0IG1heSB0YWxrIGZyb20gaXMgbm90IGEgbWFjaGluZSB0aGF0IHdvdWxkIGV2ZXIgYmUgYWNjZXB0ZWQgLSB0aGVyZSBpcyBubyBzdGF0ZSB3aGVyZVxuICAgIG5hbWluZyBvbmUgd2l0aG91dCB0aGVtIG1lYW5zIGFueXRoaW5nLlxuXG4gICAgTm90aGluZyBoZXJlIHNpZ25zIG9yIGNvbW1pdHMuIFRoZSBzaWduYXR1cmUgaXMgd2hhdCBldmVyeSBvdGhlciBtYWNoaW5lIGNoZWNrcyBiZWZvcmVcbiAgICBiZWxpZXZpbmcgYW55IG9mIHRoaXMsIGFuZCBpdCB0YWtlcyB0aGUgaGFyZHdhcmUga2V5LCBzbyBgeWFybiBzaWduZmlsZXMgZ2l0YCBpcyBzdGlsbCB5b3VycyB0b1xuICAgIHJ1biBhZnRlcndhcmRzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldE1hY2hpbmVzKGNvbmZpZzoge1xuICAgIHJlcG9QYXRoPzogc3RyaW5nO1xuICAgIG1hY2hpbmVzOiB7IG1hY2hpbmVJZDogc3RyaW5nOyBpcHM6IHN0cmluZ1tdIH1bXTtcbn0pOiBQcm9taXNlPE1hY2hpbmVTdGF0ZVtdPiB7XG4gICAgbGV0IHsgbWFjaGluZXMgfSA9IGNvbmZpZztcbiAgICBsZXQgcmVwb1BhdGggPSBjb25maWcucmVwb1BhdGggfHwgKGF3YWl0IGtleXNSZXBvKCkpLnJlcG9QYXRoO1xuICAgIC8vIFdoYXRldmVyIHdhcyBoZWxkIGlzIG5vdyBzdGFsZSwgd2hvZXZlciByZWFkcyBpdCBuZXh0LlxuICAgIHRydXN0ZWRNYWNoaW5lcy5yZXNldCgpO1xuICAgIGxldCBleGlzdGluZyA9IGF3YWl0IHJlYWRNYWNoaW5lcyhyZXBvUGF0aCk7XG4gICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgTUFDSElORVNfRElSKTtcbiAgICBsZXQgd3JpdHRlbjogTWFjaGluZVN0YXRlW10gPSBbXTtcbiAgICBmb3IgKGxldCBtYWNoaW5lIG9mIG1hY2hpbmVzKSB7XG4gICAgICAgIGlmICghbWFjaGluZS5tYWNoaW5lSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBtYWNoaW5lSWQsIHdhcyAke0pTT04uc3RyaW5naWZ5KG1hY2hpbmUubWFjaGluZUlkKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1hY2hpbmUuaXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBhZGRyZXNzZXMgZm9yICR7bWFjaGluZS5tYWNoaW5lSWR9LCB3YXMgbm9uZS4gQSBtYWNoaW5lIGlzIHRydXN0ZWQgZnJvbWBcbiAgICAgICAgICAgICAgICArIGAgdGhlIGFkZHJlc3NlcyBpdCBtYXkgdGFsayBmcm9tLCBzbyBsZWF2ZSBpdCBvdXQgb2YgdGhlIGxpc3QgdG8gcmVtb3ZlIGl0LmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlwcyA9IG1hY2hpbmUuaXBzLmZpbHRlcigoaXAsIGluZGV4KSA9PiBpcCAmJiBtYWNoaW5lLmlwcy5pbmRleE9mKGlwKSA9PT0gaW5kZXgpO1xuICAgICAgICBsZXQgc3RhdGU6IE1hY2hpbmVTdGF0ZSA9IHtcbiAgICAgICAgICAgIG1hY2hpbmVJZDogbWFjaGluZS5tYWNoaW5lSWQsXG4gICAgICAgICAgICAvLyBJbiB0aGUgb3JkZXIgZ2l2ZW4sIHdpdGhvdXQgZHVwbGljYXRlcywgc28gdGhlIGZpbGUgcmVhZHMgdGhlIHdheSBpdCB3YXMgc2V0LlxuICAgICAgICAgICAgaXBzLFxuICAgICAgICAgICAgYWRkZWRBdDogZXhpc3RpbmcuZ2V0KG1hY2hpbmUubWFjaGluZUlkKT8uYWRkZWRBdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKGRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShtYWNoaW5lRmlsZVBhdGgocmVwb1BhdGgsIHN0YXRlLm1hY2hpbmVJZCksIEpTT04uc3RyaW5naWZ5KHN0YXRlLCB1bmRlZmluZWQsIDQpICsgXCJcXG5cIik7XG4gICAgICAgIHdyaXR0ZW4ucHVzaChzdGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gV2hhdGV2ZXIgdGhlIHJlcG8gaGFkIGFuZCB0aGUgY2FsbGVyIGRpZCBub3QgbmFtZSBpcyBubyBsb25nZXIgdHJ1c3RlZC5cbiAgICBmb3IgKGxldCBtYWNoaW5lSWQgb2YgZXhpc3Rpbmcua2V5cygpKSB7XG4gICAgICAgIGlmICghbWFjaGluZXMuc29tZShtYWNoaW5lID0+IG1hY2hpbmUubWFjaGluZUlkID09PSBtYWNoaW5lSWQpKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5ybShtYWNoaW5lRmlsZVBhdGgocmVwb1BhdGgsIG1hY2hpbmVJZCksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdyaXR0ZW47XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWFjaGluZUZpbGUobmFtZTogc3RyaW5nLCBjb250ZW50czogc3RyaW5nKTogTWFjaGluZVN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50cyk7XG4gICAgICAgIGxldCBtYWNoaW5lSWQgPSBwYXJzZWQubWFjaGluZUlkIHx8IG5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHsgbWFjaGluZUlkLCBpcHM6IHBhcnNlZC5pcHMgfHwgW10sIGFkZGVkQXQ6IHBhcnNlZC5hZGRlZEF0IHx8IFwiXCIgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyB1bnJlYWRhYmxlIG1hY2hpbmUgZmlsZSAke25hbWV9LiAke2V9YCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRXZlcnkgbWFjaGluZSBmaWxlIG9uIGRpc2suIEZvciBlZGl0aW5nIHRoZSByZXBvLCBub3QgZm9yIGRlY2lkaW5nIHRydXN0IC0gdHJ1c3QgcmVhZHMgdGhlXG4gICAgc2lnbmVkIGZpbGVzIHRocm91Z2ggcmVhZFRydXN0ZWRNYWNoaW5lcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNYWNoaW5lcyhyZXBvUGF0aDogc3RyaW5nKSB7XG4gICAgbGV0IG1hY2hpbmVzID0gbmV3IE1hcDxzdHJpbmcsIE1hY2hpbmVTdGF0ZT4oKTtcbiAgICBsZXQgZGlyZWN0b3J5ID0gcGF0aC5qb2luKHJlcG9QYXRoLCBNQUNISU5FU19ESVIpO1xuICAgIGxldCBuYW1lcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5KS5jYXRjaCgoKSA9PiBbXSBhcyBzdHJpbmdbXSk7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBuYW1lcy5zb3J0KCkpIHtcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYWNoaW5lID0gcGFyc2VNYWNoaW5lRmlsZShuYW1lLCBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LCBuYW1lKSwgXCJ1dGY4XCIpLmNhdGNoKCgpID0+IFwiXCIpKTtcbiAgICAgICAgaWYgKG1hY2hpbmUpIHtcbiAgICAgICAgICAgIG1hY2hpbmVzLnNldChtYWNoaW5lLm1hY2hpbmVJZCwgbWFjaGluZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hY2hpbmVzO1xufVxuXG5sZXQgbGFzdFJldm9rZVN5bmMgPSAwO1xuXG4vKiogUHVsbHMgdGhlIGtleXMgcmVwbyBhbmQgaXRzIHJldm9rZSByZXBvLCBhdCBtb3N0IG9uY2UgYSBSRVZPS0VfU1lOQ19JTlRFUlZBTCwgYmVjYXVzZSB0aGlzIGlzXG4gICAgYXNrZWQgcGVyIHJlcXVlc3QuIEJvdGgsIHNpbmNlIGVpdGhlciBjaGFuZ2luZyBjaGFuZ2VzIHRoZSBhbnN3ZXI6IHRoZSBrZXlzIHJlcG8gY2FycmllcyB0aGVcbiAgICBtYWNoaW5lcyBhbmQgdW5yZXZva2VzLCB0aGUgcmV2b2tlIHJlcG8gY2FycmllcyB0aGUgcmV2b2NhdGlvbnMuIEEgc3luYyB0aGF0IGZhaWxzIGxlYXZlcyB0aGVcbiAgICBjaGVja291dHMgd2UgYWxyZWFkeSBoYXZlLiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luY1Jldm9jYXRpb25zKHNvdXJjZVVSTDogc3RyaW5nKSB7XG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0UmV2b2tlU3luYyA8IFJFVk9LRV9TWU5DX0lOVEVSVkFMKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdFJldm9rZVN5bmMgPSBEYXRlLm5vdygpO1xuICAgIGF3YWl0IHN5bmNSZXBvKHNvdXJjZVVSTCkuY2F0Y2goZSA9PiBjb25zb2xlLmxvZyhgQ291bGQgbm90IHN5bmMgJHtzb3VyY2VVUkx9LCB1c2luZyB0aGUgY2hlY2tvdXQgYWxyZWFkeSBoZXJlLiAke2V9YCkpO1xuICAgIGF3YWl0IHN5bmNSZXBvRmlsZXMocmV2b2tlUmVwbyhzb3VyY2VVUkwpKS5jYXRjaChlID0+IGNvbnNvbGUubG9nKGBDb3VsZCBub3Qgc3luYyAke3Jldm9rZVJlcG9VUkwoc291cmNlVVJMKX0sIHVzaW5nIHRoZSByZXZvY2F0aW9ucyBhbHJlYWR5IGFic29yYmVkLiAke2V9YCkpO1xufVxuXG4vKiogV2hhdCB0byBydW4gdG8gdHJ1c3QgYSBtYWNoaW5lIHRoYXQgaGFzIGp1c3QgYmVlbiByZWZ1c2VkLlxuXG4gICAgRXZlcnl0aGluZyBpbiBpdCBpcyBhbHJlYWR5IGtub3duIHRvIHdob2V2ZXIgaXMgYmVpbmcgcmVmdXNlZDogdGhlaXIgbWFjaGluZSBpZCwgdGhlIGFkZHJlc3Mgd2VcbiAgICBzYXcgdGhlbSBhdCwgYW5kIHRoZSBkb21haW4gdGhleSBqdXN0IHRhbGtlZCB0by4gSGFuZGluZyBpdCBiYWNrIHNhdmVzIHRoZW0gd29ya2luZyBvdXQgdGhlXG4gICAgcGFydHMgb2YgYSBjb21tYW5kIHRoZXkgaGF2ZSBldmVyeSByaWdodCB0byBrbm93LiBSdW5uaW5nIGl0IHN0aWxsIHRha2VzIHRoZSBoYXJkd2FyZSBrZXkgb25cbiAgICB0aGUgbWFjaGluZSB0aGF0IG93bnMgdGhlIHJlcG8sIHNvIHRlbGxpbmcgdGhlbSBjb3N0cyBub3RoaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZE1hY2hpbmVDb21tYW5kKGNvbmZpZzogeyBtYWNoaW5lSWQ6IHN0cmluZzsgaXA6IHN0cmluZzsgZG9tYWluPzogc3RyaW5nIH0pIHtcbiAgICBsZXQgeyBtYWNoaW5lSWQsIGlwLCBkb21haW4gfSA9IGNvbmZpZztcbiAgICByZXR1cm4gYFRvIHRydXN0ICR7bWFjaGluZUlkfSwgcnVuOiB5YXJuIGFkZG1hY2hpbmUgJHtkb21haW4gfHwgXCI8ZG9tYWluPlwifSAke21hY2hpbmVJZH0gJHtpcH0gZ2l0YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlVGhpc01hY2hpbmUoZG9tYWluPzogc3RyaW5nKSB7XG4gICAgbGV0IGhvc3QgPSBvcy5ob3N0bmFtZSgpO1xuICAgIGlmICghZG9tYWluKSByZXR1cm4gaG9zdDtcbiAgICByZXR1cm4gYCR7aG9zdH0gKG1hY2hpbmUgJHtnZXRPd25NYWNoaW5lSWQoZG9tYWluKX0pYDtcbn1cblxuLyoqIFNlbmRzIHRoZSBvbmUgbm90aWZpY2F0aW9uIHRoaXMgZmlsZSBpcyBhbGxvd2VkIHRvIHNlbmQsIHdoZW4gaXQgY2FuLlxuXG4gICAgVGhlIGRhZW1vbiBjb25maWd1cmVzIG5vdGlmaWNhdGlvbnMgb24gc3RhcnR1cCBhbmQgd291bGQgc2ltcGx5IHNlbmQuIFRoaXMgY2FuIGFsc28gcnVuIGluIHNvbWVcbiAgICBvdGhlciBwcm9jZXNzLCB3aGljaCBoYXMgbm90LCBzbyB0aGUgd2ViaG9vayBpcyBwaWNrZWQgdXAgaGVyZSBpZiBpdCBpcyByZWFkYWJsZS4gQSBtYWNoaW5lXG4gICAgd2l0aCBubyB3ZWJob29rIHNldCB1cCBzdGlsbCByZWNvcmRzIHRoZSByZXZvY2F0aW9uIC0gYmVpbmcgdW5hYmxlIHRvIHRlbGwgYW55b25lIGlzIG5vdCBhXG4gICAgcmVhc29uIHRvIGtlZXAgYWNjZXB0aW5nIGEgbWFjaGluZSB0aGF0IGlzIGJlaW5nIG1pc3VzZWQuICovXG5hc3luYyBmdW5jdGlvbiBub3RpZnlCZXN0RWZmb3J0KGhlYWRsaW5lOiBzdHJpbmcsIGJvZHk6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICghYXJlRGlzY29yZE5vdGlmaWNhdGlvbnNDb25maWd1cmVkKCkpIHtcbiAgICAgICAgICAgIC8vIFJlYWQgZmlyc3Q6IGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zIGV4aXRzIHRoZSBwcm9jZXNzIHdoZW4gdGhlIGZpbGUgaXMgbWlzc2luZyxcbiAgICAgICAgICAgIC8vIHdoaWNoIGlzIHJpZ2h0IGZvciB0aGUgZGFlbW9uIGF0IHN0YXJ0dXAgYW5kIHdyb25nIGZvciBhIGxpYnJhcnkgY2FsbC5cbiAgICAgICAgICAgIGF3YWl0IGZzLnJlYWRGaWxlKERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEgsIFwidXRmOFwiKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zKHsgZmlsZVBhdGg6IERFRkFVTFRfV0VCSE9PS19GSUxFX1BBVEggfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbm90aWZ5KGhlYWRsaW5lLCBib2R5KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDb3VsZCBub3Qgc2VuZCBhIG5vdGlmaWNhdGlvbiBhYm91dCB0aGlzLCBpdCBpcyBvbmx5IGluIHRoZSBsb2cuICR7ZX1gKTtcbiAgICB9XG59XG5cbnR5cGUgUmV2b2NhdGlvbk91dGNvbWUgPSBcImZyb3plXCIgfCBcImZhaWxlZFwiIHwgXCJhbHJlYWR5UmV2b2tlZFwiO1xuXG4vKiogUmVjb3JkcyB0aGF0IGEgbWFjaGluZSB3ZSBhY2NlcHQgdGFsa2VkIHRvIHVzIGZyb20gYW4gYWRkcmVzcyBpdCBpcyBub3QgYWxsb3dlZCBmcm9tLiBPbmUgcGVyXG4gICAgbWFjaGluZSBhbmQgYWRkcmVzcywgc28gYSBzZWNvbmQgYWRkcmVzcyBpcyBhIHNlY29uZCByZXZvY2F0aW9uIGFuZCBhbiB1bnJldm9rZSBvZiB0aGUgZmlyc3RcbiAgICBkb2VzIG5vdCBjb3ZlciBpdC4gKi9cbmNvbnN0IHJlY29yZE1hY2hpbmVSZXZvY2F0aW9uID0gcnVuSW5TZXJpYWwoYXN5bmMgKGNvbmZpZzoge1xuICAgIHNvdXJjZVVSTDogc3RyaW5nO1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgaG9zdExhYmVsOiBzdHJpbmc7XG59KTogUHJvbWlzZTxSZXZvY2F0aW9uT3V0Y29tZT4gPT4ge1xuICAgIGxldCB7IHNvdXJjZVVSTCwgbWFjaGluZUlkLCBpcCwgaG9zdExhYmVsIH0gPSBjb25maWc7XG4gICAgaWYgKGlzUGFpclJldm9rZWQobWFjaGluZUlkLCBpcCkgfHwgaXNQYWlyVW5yZXZva2VkKG1hY2hpbmVJZCwgaXApKSB7XG4gICAgICAgIHJldHVybiBcImFscmVhZHlSZXZva2VkXCI7XG4gICAgfVxuICAgIC8vIENsb25lcyBpdCBpZiBpdCBpcyBub3QgaGVyZSB5ZXQsIHdoaWNoIGlzIHRoZSB1c3VhbCBzdGF0ZSBvZiBhIG1hY2hpbmUgdGhhdCBoYXMgbmV2ZXIgaGFkIHRvXG4gICAgLy8gcmV2b2tlIGFueXRoaW5nLiBXaXRob3V0IHRoaXMgdGhlIG1rZGlyIGJlbG93IHdvdWxkIGJ1aWxkIHRoZSBkaXJlY3RvcnkgYW55d2F5IGFuZCBnaXQgd291bGRcbiAgICAvLyB0aGVuIGJlIHJ1biBzb21ld2hlcmUgdGhhdCBpcyBub3QgYSBjaGVja291dCwgc28gdGhlIHJldm9jYXRpb24gd2FzIHdyaXR0ZW4gd2hlcmUgbm90aGluZ1xuICAgIC8vIHdvdWxkIGV2ZXIgcmVhZCBpdC5cbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBzeW5jUmVwb0ZpbGVzKHJldm9rZVJlcG8oc291cmNlVVJMKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgcmVjb3JkIHRoZSByZXZvY2F0aW9uIG9mICR7bWFjaGluZUlkfSwgJHtyZXZva2VSZXBvVVJMKHNvdXJjZVVSTCl9IGNvdWxkIG5vdCBiZSByZWFkLiAke2V9YCk7XG4gICAgICAgIHJldHVybiBcImZhaWxlZFwiO1xuICAgIH1cbiAgICBsZXQgcmVwb1BhdGggPSByZXZva2VSZXBvUGF0aChzb3VyY2VVUkwpO1xuICAgIGxldCBrZXlQYXRoID0gYXdhaXQgZW5zdXJlUmV2b2tlS2V5KHNvdXJjZVVSTCk7XG4gICAgbGV0IHJldm9jYXRpb25JZCA9IG5ld1Jldm9jYXRpb25JZChtYWNoaW5lSWQpO1xuICAgIGxldCByZXZva2VkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgbGV0IGRpcmVjdG9yeSA9IHBhdGguam9pbihyZXBvUGF0aCwgUkVWT0NBVElPTlNfRElSKTtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LCBgJHtyZXZvY2F0aW9uSWR9Lmpzb25gKSwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICByZXZvY2F0aW9uSWQsXG4gICAgICAgIG1hY2hpbmVJZCxcbiAgICAgICAgaXAsXG4gICAgICAgIHJldm9rZWRBdCxcbiAgICAgICAgcmV2b2tlZEJ5OiBob3N0TGFiZWwsXG4gICAgICAgIHJlYXNvbjogUkVWT0NBVElPTl9SRUFTT04sXG4gICAgfSwgdW5kZWZpbmVkLCA0KSArIFwiXFxuXCIpO1xuXG4gICAgYXdhaXQgcnVuR2l0KHsgYXJnczogW1wiYWRkXCIsIFwiLUFcIl0sIGN3ZDogcmVwb1BhdGgsIGtleVBhdGggfSk7XG4gICAgYXdhaXQgcnVuR2l0KHtcbiAgICAgICAgYXJnczogW1wiLWNcIiwgXCJ1c2VyLmVtYWlsPXBvcnRzZWN1cmVAbG9jYWxob3N0XCIsIFwiLWNcIiwgXCJ1c2VyLm5hbWU9cG9ydHNlY3VyZVwiLCBcImNvbW1pdFwiLCBcIi1tXCIsIGByZXZva2UgJHtyZXZvY2F0aW9uSWR9YF0sXG4gICAgICAgIGN3ZDogcmVwb1BhdGgsIGtleVBhdGgsXG4gICAgfSk7XG4gICAgbGV0IHB1c2ggPSBhd2FpdCBydW5HaXQoeyBhcmdzOiBbXCJwdXNoXCIsIFwib3JpZ2luXCIsIFwiSEVBRFwiXSwgY3dkOiByZXBvUGF0aCwga2V5UGF0aCwgYWxsb3dGYWlsdXJlOiB0cnVlIH0pO1xuICAgIGlmIChwdXNoLnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAvLyBBbm90aGVyIG1hY2hpbmUgbW9zdCBsaWtlbHkgcmVjb3JkZWQgdGhlIHNhbWUgdGhpbmcgZmlyc3QsIGFuZCB0aGUgbmV4dCByZWFkIHBpY2tzIGl0IHVwLlxuICAgICAgICBjb25zb2xlLmxvZyhgQ291bGQgbm90IHB1c2ggdGhlIHJldm9jYXRpb24gb2YgJHttYWNoaW5lSWR9IGZyb20gJHtpcH0uICR7KHB1c2guc3Rkb3V0ICsgcHVzaC5zdGRlcnIpLnRyaW0oKX1gKTtcbiAgICAgICAgcmV0dXJuIFwiZmFpbGVkXCI7XG4gICAgfVxuICAgIG5vdGVSZXZvY2F0aW9uKHJldm9jYXRpb25JZCwgeyBpZGVudGl0eTogbWFjaGluZUlkLCBpcCwgcmV2b2tlZEF0LCByZXZva2VkQnk6IGhvc3RMYWJlbCB9KTtcbiAgICBjb25zb2xlLmxvZyhgUmV2b2tlZCAke21hY2hpbmVJZH0gZnJvbSAke2lwfSwgJHtyZXZvY2F0aW9uSWR9YCk7XG5cbiAgICAvLyBTYWlkIGJ5IHdob2V2ZXIgd3JvdGUgdGhlIHJldm9jYXRpb24sIG9uY2UsIHRoZSBzYW1lIGFzIGZvciBhbiBzc2gga2V5LiBNYWNoaW5lcyB0aGF0IG9ubHlcbiAgICAvLyByZWFkIGl0IGxhdGVyIHNheSBub3RoaW5nLCBvciBvbmUgZXZlbnQgd291bGQgYmUgcmVwb3J0ZWQgYnkgZXZlcnkgbWFjaGluZSB0aGF0IHNhdyBpdC5cbiAgICBhd2FpdCBub3RpZnlCZXN0RWZmb3J0KFxuICAgICAgICBgU1VTUElDSU9VUyBJUCAke2lwfSBGUk9aRSBNQUNISU5FICR7bWFjaGluZUlkfWAsXG4gICAgICAgIGBUcnVzdGVkIG1hY2hpbmUgJHttYWNoaW5lSWR9IHRhbGtlZCB0byB1cyBmcm9tICR7aXB9LCBhbiBhZGRyZXNzICR7bWFjaGluZUlkfSBpcyBub3RgXG4gICAgICAgICsgYCBhbGxvd2VkIGZyb20uIFRoZSBjYWxsZXIgcHJvdmVkIHBvc3Nlc3Npb24gb2YgJHttYWNoaW5lSWR9J3Mga2V5LCBzbyBlaXRoZXIgc29tZW9uZWBcbiAgICAgICAgKyBgIGVsc2UgaGFzIGEgY29weSBvZiB0aGUga2V5LCBvciB0aGUgbWFjaGluZSdzIGFkZHJlc3MgY2hhbmdlZC5gXG4gICAgICAgICsgYFxcblxcbk1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIGZyb3plbiBldmVyeXdoZXJlIG5vdywgYW5kIG5vdGhpbmcgYWNjZXB0cyBjYWxscyBmcm9tICR7bWFjaGluZUlkfS5gXG4gICAgICAgICsgYFxcblxcbklmIHRoaXMgd2FzIGFuIGF0dGFjaywgcmVtb3ZlIFxcYG1hY2hpbmVzLyR7bWFjaGluZUlkfS5qc29uXFxgIGZyb20gXFxgJHtzb3VyY2VVUkx9XFxgIG5vdy5gXG4gICAgICAgICsgYFxcbklmIHRoZSBuZXcgYWRkcmVzcyBpcyBsZWdpdGltYXRlLCBydW46YFxuICAgICAgICArIGBcXG5cXGBcXGBcXGBcXG5jZCAke3NvdXJjZVJlcG9QYXRoKHNvdXJjZVVSTCl9XFxueWFybiB1bnJldm9rZSBnaXRcXG5cXGBcXGBcXGBgXG4gICAgICAgICsgYFxcblRoZSB1bnJldm9rZSBhbGxvd3MgJHttYWNoaW5lSWR9IGZyb20gJHtpcH0sIGFuZCB0YWtlcyBlZmZlY3QgYXMgZWFjaCBtYWNoaW5lIHBpY2tzIGl0IHVwLmBcbiAgICAgICAgKyBgXFxuXFxubWFjaGluZTogXFxgJHttYWNoaW5lSWR9XFxgYFxuICAgICAgICArIGBcXG5mcm96ZW4gYnk6IFxcYCR7aG9zdExhYmVsfVxcYGBcbiAgICApO1xuICAgIHJldHVybiBcImZyb3plXCI7XG59KTtcblxuLyoqIFdoZXRoZXIgd2Ugd2lsbCB0YWxrIHRvIHRoaXMgbWFjaGluZSwgY29taW5nIGZyb20gdGhpcyBhZGRyZXNzLlxuXG4gICAgQm90aCBoYWx2ZXMgYXJlIHJlcXVpcmVkIGFuZCBuZWl0aGVyIGlzIGEgZ3Vlc3M6IHRoZSBjYWxsZXIga25vd3MgdGhlIG1hY2hpbmUgaWQgYmVjYXVzZSB0aGVcbiAgICBjb25uZWN0aW9uIHByb3ZlZCBpdCwgYW5kIGtub3dzIHRoZSBhZGRyZXNzIGJlY2F1c2UgdGhlIHBhY2tldHMgY2FtZSBmcm9tIHRoZXJlLiBBIG1hY2hpbmUgd2VcbiAgICBkbyBub3QgbGlzdCBpcyBzaW1wbHkgbm90IGFjY2VwdGVkLiBBIG1hY2hpbmUgd2UgZG8gbGlzdCwgYXJyaXZpbmcgZnJvbSBhbiBhZGRyZXNzIGl0IGRvZXMgbm90XG4gICAgaGF2ZSwgaXMgdHJlYXRlZCBhcyB0aGUgc2FtZSBraW5kIG9mIGV2ZW50IGFzIGEgc3RvbGVuIHNzaCBrZXkgLSBpdCBpcyByZXZva2VkIGV2ZXJ5d2hlcmUsIGFuZFxuICAgIHN0YXlzIHJldm9rZWQgdW50aWwgYW4gdW5yZXZva2UgYWxsb3dzIHRoYXQgbWFjaGluZSBmcm9tIHRoYXQgYWRkcmVzcy5cblxuICAgIFNheXMgd2h5IHdoZW4gdGhlIGFuc3dlciBpcyBubywgYmVjYXVzZSB0aGUgdGhyZWUgd2F5cyB0byBiZSByZWZ1c2VkIGFyZSBlbnRpcmVseSBkaWZmZXJlbnRcbiAgICB0aGluZ3MgdG8gYSBwZXJzb24gcmVhZGluZyBpdDogbmV2ZXIgdHJ1c3RlZCBhdCBhbGwsIHRydXN0ZWQgYnV0IGZyb3plbiwgb3IgdHJ1c3RlZCBhbmQgdGFsa2luZ1xuICAgIGZyb20gc29tZXdoZXJlIGl0IHNob3VsZCBub3QgYmUuXG5cbiAgICBUaHJvd3Mgd2hlbiB0aGUgcmVwbyBpdHNlbGYgY2Fubm90IGJlIHJlYWQgb3IgaXMgbm90IHNpZ25lZCwgcmF0aGVyIHRoYW4gYW5zd2VyaW5nIGZhbHNlOiB0aGF0XG4gICAgaXMgYSBicm9rZW4gaW5zdGFsbGF0aW9uLCBub3QgYSByZWplY3RlZCBtYWNoaW5lLCBhbmQgdGhlIHR3byBkZXNlcnZlIGRpZmZlcmVudCBoYW5kbGluZy4gKi9cbmV4cG9ydCB0eXBlIE1hY2hpbmVWZXJkaWN0ID0geyBhY2NlcHRlZDogYm9vbGVhbjsgcmVhc29uOiBzdHJpbmcgfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzTWFjaGluZUFjY2VwdGVkKGNvbmZpZzoge1xuICAgIG1hY2hpbmVJZDogc3RyaW5nO1xuICAgIGlwOiBzdHJpbmc7XG4gICAgLy8gVXNlZCBmb3IgbG9jYWwgbG9vcGJhY2sgYWNjZXB0YW5jZSwgYW5kIGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuXG4gICAgZG9tYWluPzogc3RyaW5nO1xufSk6IFByb21pc2U8TWFjaGluZVZlcmRpY3Q+IHtcbiAgICBsZXQgeyBtYWNoaW5lSWQsIGlwLCBkb21haW4gfSA9IGNvbmZpZztcbiAgICBpZiAoIW1hY2hpbmVJZCB8fCAhaXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIG1hY2hpbmVJZCBhbmQgYW4gaXAsIHdhcyAke0pTT04uc3RyaW5naWZ5KG1hY2hpbmVJZCl9IGFuZCAke0pTT04uc3RyaW5naWZ5KGlwKX1gKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgd2hvbGUgY2hlY2ssIHBsdXMgd2hldGhlciBpdCBmcm96ZSB0aGUgbWFjaGluZS4gQSByZWplY3Rpb24gdGhhdCBmcm96ZSBpdCBpcyBmaW5hbCwgc29cbiAgICAvLyB0aGVyZSBpcyBub3RoaW5nIHRvIGdhaW4gZnJvbSBsb29raW5nIGFnYWluLiBBbnkgb3RoZXIgcmVqZWN0aW9uIG1pZ2h0IGp1c3QgYmUgYSBzdGFsZSB2aWV3IC1cbiAgICAvLyBhIG1hY2hpbmUgYWRkZWQgc2Vjb25kcyBhZ28gdGhhdCBvdXIgY2FjaGVkIGxpc3QgaGFzIG5vdCBjYXVnaHQgdXAgdG8gLSBzbyBpdCBpcyB3b3J0aCBvbmVcbiAgICAvLyBmcmVzaCBsb29rLCB3aGljaCBpcyB3aGF0IHRoZSByZXRyeSBiZWxvdyBkb2VzLlxuICAgIGxldCBldmFsdWF0ZSA9IGFzeW5jICgpOiBQcm9taXNlPHsgdmVyZGljdDogTWFjaGluZVZlcmRpY3Q7IGZyb3plOiBib29sZWFuIH0+ID0+IHtcbiAgICAgICAgaWYgKExPT1BCQUNLLmluY2x1ZGVzKGlwKSAmJiAhIWRvbWFpbiAmJiBtYWNoaW5lSWQgPT09IGdldE93bk1hY2hpbmVJZChkb21haW4pKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiB0cnVlLCByZWFzb246IFwiXCIgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgc291cmNlVVJMIH0gPSBhd2FpdCBrZXlzUmVwbygpO1xuICAgICAgICBhd2FpdCBzeW5jUmV2b2NhdGlvbnMoc291cmNlVVJMKTtcbiAgICAgICAgLy8gVGhlIGxpc3QgaGFzIHJldm9jYXRpb25zIGFscmVhZHkgYXBwbGllZCAtIHJlYWRTaWduZWRSZXBvIGRyb3BzIGZyb3plbiBtYWNoaW5lcyAtIHNvIGFcbiAgICAgICAgLy8gbWFjaGluZSBpbiBpdCBpcyB0cnVzdGVkLCBhbmQgYSBtYWNoaW5lIG1pc3NpbmcgZnJvbSBpdCBpcyBlaXRoZXIgdW5rbm93biBvciBmcm96ZW4uXG4gICAgICAgIGxldCBtYWNoaW5lID0gKGF3YWl0IGdldFRydXN0ZWRNYWNoaW5lcygpKS5maW5kKGVudHJ5ID0+IGVudHJ5Lm1hY2hpbmVJZCA9PT0gbWFjaGluZUlkKTtcbiAgICAgICAgaWYgKCFtYWNoaW5lKSB7XG4gICAgICAgICAgICBsZXQgZnJvemVuID0gaWRlbnRpdHlGcm96ZW5CeShtYWNoaW5lSWQpO1xuICAgICAgICAgICAgaWYgKGZyb3plbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZlcmRpY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgZnJvemVuOiBpdCB3YXMgdXNlZCBmcm9tICR7ZnJvemVuLmlwIHx8IFwiYW4gYWRkcmVzcyBub3RoaW5nIHJlY29yZGVkXCJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYCR7ZnJvemVuLnJldm9rZWRBdCAmJiBgLCBhdCAke2Zyb3plbi5yZXZva2VkQXR9YCB8fCBcIlwifWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGAke2Zyb3plbi5yZXZva2VkQnkgJiYgYCwgbm90aWNlZCBieSAke2Zyb3plbi5yZXZva2VkQnl9YCB8fCBcIlwifWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGAsIHdoaWNoIGlzIG5vdCBhbiBhZGRyZXNzIGl0IGlzIGFsbG93ZWQgZnJvbSAocmV2b2NhdGlvbiAke2Zyb3plbi5yZXZvY2F0aW9uSWR9KS5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBgIFRvIGdpdmUgaXQgYWNjZXNzIGFnYWluLCBydW46IGNkICR7c291cmNlUmVwb1BhdGgoc291cmNlVVJMKX0gJiYgeWFybiB1bnJldm9rZSBnaXRgLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmcm96ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IGZhbHNlLCByZWFzb246IGBNYWNoaW5lICR7bWFjaGluZUlkfSBpcyBub3QgdHJ1c3RlZC4gJHthZGRNYWNoaW5lQ29tbWFuZCh7IG1hY2hpbmVJZCwgaXAsIGRvbWFpbiB9KX1gIH0sIGZyb3plOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcGJhY2sgaXMgYWx3YXlzIGFuIGFsbG93ZWQgYWRkcmVzcy4gVGhlIG1hY2hpbmUgc3RpbGwgaGFzIHRvIGJlIHRydXN0ZWQgLSBhbiB1bmtub3duXG4gICAgICAgIC8vIG9yIGZyb3plbiBvbmUgd2FzIGFscmVhZHkgcmVmdXNlZCBhYm92ZSAtIGJ1dCBubyBpcCBsaXN0IGNhbiBkZXNjcmliZSBhIG1hY2hpbmUgdGFsa2luZ1xuICAgICAgICAvLyB0byBpdHNlbGY6IGEgbWFjaGluZSBpcyBsaXN0ZWQgdW5kZXIgdGhlIGFkZHJlc3Mgb3RoZXJzIHJlYWNoIGl0IGF0LCBuZXZlciAxMjcuMC4wLjEsXG4gICAgICAgIC8vIHNvIGNoZWNraW5nIGxvb3BiYWNrIGFnYWluc3QgdGhhdCBsaXN0IHJlamVjdHMgZXZlcnkgbG9jYWwgY2FsbCBhbmQgdGhlbiBmcmVlemVzIHRoZVxuICAgICAgICAvLyBtYWNoaW5lIGV2ZXJ5d2hlcmUgZm9yIG1ha2luZyBpdC5cbiAgICAgICAgaWYgKG1hY2hpbmUuaXBzLmluY2x1ZGVzKGlwKSB8fCBMT09QQkFDSy5pbmNsdWRlcyhpcCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZlcmRpY3Q6IHsgYWNjZXB0ZWQ6IHRydWUsIHJlYXNvbjogXCJcIiB9LCBmcm96ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpc3RlZCwgYnV0IHRhbGtpbmcgdG8gdXMgZnJvbSBzb21ld2hlcmUgaXQgc2hvdWxkIG5vdCBiZS4gUmVjb3JkZWQgb25jZSBmb3IgdGhpcyBtYWNoaW5lXG4gICAgICAgIC8vIGFuZCBhZGRyZXNzLCBzbyBiZWluZyB0YWxrZWQgdG8gcmVwZWF0ZWRseSBkb2VzIG5vdCB3cml0ZSByZXBlYXRlZGx5LlxuICAgICAgICBpZiAoIWlzUGFpclJldm9rZWQobWFjaGluZUlkLCBpcCkgJiYgIWlzUGFpclVucmV2b2tlZChtYWNoaW5lSWQsIGlwKSkge1xuICAgICAgICAgICAgLy8gT25seSB0aGUgbWFjaGluZSB0aGF0IGFjdHVhbGx5IHdyb3RlIHRoZSByZXZvY2F0aW9uIG1heSBzYXkgaXQgZnJvemUgYW55dGhpbmcuIE9uZVxuICAgICAgICAgICAgLy8gdGhhdCBjb3VsZCBub3QgcmVhY2ggdGhlIHJldm9rZSByZXBvIGhhcyByZWZ1c2VkIHRoaXMgY2FsbCBhbmQgbm90aGluZyBtb3JlLlxuICAgICAgICAgICAgbGV0IG91dGNvbWUgPSBhd2FpdCByZWNvcmRNYWNoaW5lUmV2b2NhdGlvbih7IHNvdXJjZVVSTCwgbWFjaGluZUlkLCBpcCwgaG9zdExhYmVsOiBkZXNjcmliZVRoaXNNYWNoaW5lKGRvbWFpbikgfSk7XG4gICAgICAgICAgICBpZiAob3V0Y29tZSA9PT0gXCJmcm96ZVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogZmFsc2UsIHJlYXNvbjogYE1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIG5vdCBhbGxvd2VkIGZyb20gJHtpcH0sIGFuZCBpcyBub3cgZnJvemVuIGV2ZXJ5d2hlcmUuYCB9LCBmcm96ZTogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91dGNvbWUgPT09IFwiZmFpbGVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2ZXJkaWN0OiB7IGFjY2VwdGVkOiBmYWxzZSwgcmVhc29uOiBgTWFjaGluZSAke21hY2hpbmVJZH0gaXMgbm90IGFsbG93ZWQgZnJvbSAke2lwfS4gSXQgY291bGQgbm90IGJlIGZyb3plbiwgJHtyZXZva2VSZXBvVVJMKHNvdXJjZVVSTCl9IGNvdWxkIG5vdCBiZSB3cml0dGVuLmAgfSwgZnJvemU6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogeyBhY2NlcHRlZDogZmFsc2UsIHJlYXNvbjogYE1hY2hpbmUgJHttYWNoaW5lSWR9IGlzIG5vdCBhbGxvd2VkIGZyb20gJHtpcH0uYCB9LCBmcm96ZTogZmFsc2UgfTtcbiAgICB9O1xuXG4gICAgbGV0IHsgdmVyZGljdCwgZnJvemUgfSA9IGF3YWl0IGV2YWx1YXRlKCk7XG4gICAgLy8gQW4gYWNjZXB0LCBvciBhIHJlamVjdGlvbiB0aGF0IGp1c3QgZnJvemUgdGhlIG1hY2hpbmUsIGlzIHRoZSBmaW5hbCB3b3JkLiBBbnkgb3RoZXIgcmVqZWN0aW9uXG4gICAgLy8gbWlnaHQganVzdCBiZSBhIHN0YWxlIGxpc3QgLSBhIG1hY2hpbmUgYWRkZWQgc2Vjb25kcyBhZ28gd2UgaGF2ZSBub3QgY2F1Z2h0IHVwIHRvIC0gc28gaXQgaXNcbiAgICAvLyB3b3J0aCBvbmUgZnJlc2ggbG9vay5cbiAgICBpZiAodmVyZGljdC5hY2NlcHRlZCB8fCBmcm96ZSkge1xuICAgICAgICByZXR1cm4gdmVyZGljdDtcbiAgICB9XG4gICAgLy8gUmUtcmVhZCB0aGUgbGlzdCBhdCBtb3N0IG9uY2UgYSBtaW51dGUsIHNvIGEgYnVyc3Qgb2YgYmFkIGNhbGxlcnMgY2Fubm90IG1ha2UgdXMgcmUtcmVhZCBvblxuICAgIC8vIGV2ZXJ5IG9uZSBvZiB0aGVtLiBGb3JjZSB0aGUgY2hlY2tvdXQgYmFjayB0byB0aGUgcmVtb3RlIGZpcnN0LCBzbyBhIG1hY2hpbmUgYWRkZWQgYW5kIHNpZ25lZFxuICAgIC8vIHNlY29uZHMgYWdvIGlzIHBpY2tlZCB1cCBldmVuIGlmIHRoZSBjaGVja291dCB3YXMgbGVmdCBkaXJ0eSwgdGhlbiB0YWtlIHRoZSBmcmVzaCBsb29rIGFzXG4gICAgLy8gZmluYWwuXG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0TWFjaGluZXNJbnZhbGlkYXRpb24gPiBNQUNISU5FU19JTlZBTElEQVRJT05fSU5URVJWQUwpIHtcbiAgICAgICAgbGFzdE1hY2hpbmVzSW52YWxpZGF0aW9uID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IHsgc291cmNlVVJMIH0gPSBhd2FpdCBrZXlzUmVwbygpO1xuICAgICAgICBhd2FpdCBzeW5jUmVwbyhzb3VyY2VVUkwsIHsgZm9yY2VVcGRhdGU6IHRydWUgfSkuY2F0Y2goZSA9PiBjb25zb2xlLmxvZyhgQ291bGQgbm90IGZvcmNlIHVwZGF0ZSAke3NvdXJjZVVSTH0uICR7ZX1gKSk7XG4gICAgICAgIHRydXN0ZWRNYWNoaW5lcy5yZXNldCgpO1xuICAgIH1cbiAgICByZXR1cm4gKGF3YWl0IGV2YWx1YXRlKCkpLnZlcmRpY3Q7XG59XG4iXX0=
414
+ /* _JS_SOURCE_HASH = "d41a0c07e11ff64052c7e3abc0f9a64b1096d0837c9fca3aa87ff9a887c65ad8"; */
@@ -28,7 +28,7 @@ export type StorageFactory = (path: string) => Promise<FileStorage>;
28
28
  export type BulkDatabase2Config = {
29
29
  maxTriggerThrottleMs?: number;
30
30
  };
31
- export type MergeSkipReason = "mergeInFlight" | "tabLockHeld" | "fileLockHeld" | "nothingToMerge";
31
+ export type MergeSkipReason = "mergeInFlight" | "tabLockHeld" | "fileLockHeld" | "fileLockUnwritable" | "nothingToMerge";
32
32
  export type MergeAttemptResult = {
33
33
  merged: boolean;
34
34
  skipReason?: MergeSkipReason;
@@ -111,6 +111,7 @@ export type MergeSkipReason =
111
111
  | "tabLockHeld"
112
112
  // Another process holds the cross-process .merge-lock file (or won the settle race for it).
113
113
  | "fileLockHeld"
114
+ | "fileLockUnwritable"
114
115
  // compact() only: the collection has no files on disk.
115
116
  | "nothingToMerge";
116
117
 
@@ -689,7 +690,7 @@ export class BulkDatabaseBase<T extends { key: string }> {
689
690
  try {
690
691
  await this.tryMergeThrottled();
691
692
  } catch (e) {
692
- console.warn(`${this.name}: background merge failed: ${(e as Error).message}`);
693
+ console.warn(`${this.name}: background merge failed:`, (e as Error).stack ?? e);
693
694
  }
694
695
  }
695
696
 
@@ -714,7 +715,14 @@ export class BulkDatabaseBase<T extends { key: string }> {
714
715
  if (this.mergeInFlight) return await this.mergeSkip("mergeInFlight");
715
716
  if (!tryAcquireMergeLock(this.name, writerId)) return await this.mergeSkip("tabLockHeld");
716
717
  const storage = await this.storage();
717
- const haveFileLock = await tryAcquireMergeFileLock(storage, writerId);
718
+ let haveFileLock: boolean;
719
+ try {
720
+ haveFileLock = await tryAcquireMergeFileLock(storage, writerId);
721
+ } catch (e) {
722
+ releaseMergeLock(this.name, writerId);
723
+ console.warn(`${blue(this.name)} ${magenta("merge")} skipped: fileLockUnwritable, writer ${writerId} could not write .merge-lock:`, (e as Error).stack ?? e);
724
+ return { merged: false, skipReason: "fileLockUnwritable" };
725
+ }
718
726
  if (!haveFileLock) {
719
727
  releaseMergeLock(this.name, writerId);
720
728
  return await this.mergeSkip("fileLockHeld");