velocious 1.0.443 → 1.0.445

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.
@@ -192,6 +192,13 @@ function frontendModelClientMessageForError(error) {
192
192
  if (error instanceof VelociousError && error.safeToExpose) {
193
193
  return error.message;
194
194
  }
195
+ // Validation failures are expected user-flow errors. Always forward the
196
+ // validation summary so the client shows the real reason (e.g. "Name can't
197
+ // be blank") instead of the generic "Request failed." message, regardless of
198
+ // whether the raising code also attached error.velocious metadata.
199
+ if (error instanceof ValidationError) {
200
+ return error.message;
201
+ }
195
202
  if (frontendModelErrorHasVelociousMetadata(error) && error instanceof Error) {
196
203
  return error.message;
197
204
  }
@@ -2441,6 +2448,22 @@ export default class FrontendModelController extends Controller {
2441
2448
  model: resolvedModel,
2442
2449
  requestId
2443
2450
  }]);
2451
+ // Surface genuinely unexpected backend failures on the framework-error
2452
+ // channel so process-level bug reporters capture them, instead of the
2453
+ // controller silently swallowing them behind the generic "Request
2454
+ // failed." client message. Developer-annotated user-flow errors
2455
+ // (`error.velocious` metadata — handled by the early return above),
2456
+ // validation errors, and deliberately client-safe VelociousErrors are
2457
+ // expected and must NOT be reported as framework errors.
2458
+ if (!(error instanceof ValidationError) && !(error instanceof VelociousError && error.safeToExpose)) {
2459
+ const errorPayload = {
2460
+ context: { action, commandType, frontendModelEndpoint: true, model: resolvedModel, requestId },
2461
+ error: error instanceof Error ? error : new Error(String(error)),
2462
+ request: this.getRequest()
2463
+ };
2464
+ this.getConfiguration().getErrorEvents().emit("framework-error", errorPayload);
2465
+ this.getConfiguration().getErrorEvents().emit("all-error", { ...errorPayload, errorType: "framework-error" });
2466
+ }
2444
2467
  }
2445
2468
  /**
2446
2469
  * Runs frontend model render command response.
@@ -2994,4 +3017,4 @@ export default class FrontendModelController extends Controller {
2994
3017
  return value;
2995
3018
  }
2996
3019
  }
2997
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLFFBQVEsTUFBTSxrQ0FBa0MsQ0FBQTtBQUN2RCxPQUFPLHlCQUF5QixNQUFNLDRDQUE0QyxDQUFBO0FBQ2xGLE9BQU8sRUFBQyx3Q0FBd0MsRUFBRSxnREFBZ0QsRUFBRSx5QkFBeUIsRUFBRSx1Q0FBdUMsRUFBQyxNQUFNLDBDQUEwQyxDQUFBO0FBQ3ZOLE9BQU8sRUFBQyxjQUFjLElBQUksbUJBQW1CLEVBQUUsY0FBYyxJQUFJLG1CQUFtQixFQUFFLGNBQWMsSUFBSSxtQkFBbUIsRUFBRSxnQkFBZ0IsSUFBSSxxQkFBcUIsRUFBRSx1QkFBdUIsSUFBSSw0QkFBNEIsRUFBRSxhQUFhLElBQUksa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUN2UyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsc0NBQXNDLEVBQUUsc0JBQXNCLEVBQUUsb0NBQW9DLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQTtBQUNyTCxPQUFPLGNBQWMsTUFBTSxzQkFBc0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFDMUQsT0FBTyxjQUFjLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxhQUFhLE1BQU0seUJBQXlCLENBQUE7QUFFbkQ7Ozs7R0FJRztBQUNILFNBQVMsNkJBQTZCLENBQUMsT0FBTztJQUM1QyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRXpCLE9BQU8scUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDdkMsQ0FBQztBQUVEOzs7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QyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBDb250cm9sbGVyIGZyb20gXCIuL2NvbnRyb2xsZXIuanNcIlxuaW1wb3J0IFJlc3BvbnNlIGZyb20gXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiXG5pbXBvcnQgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBmcm9tIFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbiwgZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uLCBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoLCBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3R9IGZyb20gXCIuL2Zyb250ZW5kLW1vZGVscy9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcbmltcG9ydCB7bm9ybWFsaXplR3JvdXAgYXMgbm9ybWFsaXplUXVlcnlHcm91cCwgbm9ybWFsaXplSm9pbnMgYXMgbm9ybWFsaXplUXVlcnlKb2lucywgbm9ybWFsaXplUGx1Y2sgYXMgbm9ybWFsaXplUXVlcnlQbHVjaywgbm9ybWFsaXplUHJlbG9hZCBhcyBub3JtYWxpemVRdWVyeVByZWxvYWQsIG5vcm1hbGl6ZVNlYXJjaE9wZXJhdG9yIGFzIG5vcm1hbGl6ZVF1ZXJ5U2VhcmNoT3BlcmF0b3IsIG5vcm1hbGl6ZVNvcnQgYXMgbm9ybWFsaXplUXVlcnlTb3J0fSBmcm9tIFwiLi9mcm9udGVuZC1tb2RlbHMvcXVlcnkuanNcIlxuaW1wb3J0IHthc3NpZ25TYWZlUHJvcGVydHksIGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlLCBpc0JhY2tlbmRNb2RlbEluc3RhbmNlLCBzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWV9IGZyb20gXCIuL2Zyb250ZW5kLW1vZGVscy90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5pbXBvcnQgUm91dGVzUmVzb2x2ZXIgZnJvbSBcIi4vcm91dGVzL3Jlc29sdmVyLmpzXCJcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yfSBmcm9tIFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuaW1wb3J0IFZlbG9jaW91c0Vycm9yIGZyb20gXCIuL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tIFwiLi91dGlscy9wbGFpbi1vYmplY3QuanNcIlxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIHByZWxvYWQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IHN0cmluZyB8IHN0cmluZ1tdIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGx9IHByZWxvYWQgLSBQcmVsb2FkIHNob3J0aGFuZC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQgfCBudWxsfSAtIE5vcm1hbGl6ZWQgcHJlbG9hZC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFByZWxvYWQocHJlbG9hZCkge1xuICBpZiAoIXByZWxvYWQpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZVF1ZXJ5UHJlbG9hZChwcmVsb2FkKVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIGpvaW5zLlxuICogQHBhcmFtIHs/fSBqb2lucyAtIEpvaW5zIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSAtIE5vcm1hbGl6ZWQgcmVsYXRpb25zaGlwLW9iamVjdCBqb2lucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEpvaW5zKGpvaW5zKSB7XG4gIGlmICgham9pbnMpIHJldHVybiBudWxsXG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbm9ybWFsaXplUXVlcnlKb2lucyhqb2lucylcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yRm9yRXJyb3IoZXJyb3IpXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBzZWxlY3QuXG4gKiBAcGFyYW0gez99IHNlbGVjdCAtIFNlbGVjdCBwYXlsb2FkLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBbcm9vdE1vZGVsTmFtZV0gLSBPcHRpb25hbCByb290IG1vZGVsIG5hbWUgZm9yIHNob3J0aGFuZCBwYXlsb2Fkcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCBudWxsfSAtIE5vcm1hbGl6ZWQgbW9kZWwtbmFtZSBrZXllZCBzZWxlY3QgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsU2VsZWN0KHNlbGVjdCwgcm9vdE1vZGVsTmFtZSA9IG51bGwpIHtcbiAgaWYgKCFzZWxlY3QpIHJldHVybiBudWxsXG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAoIXJvb3RNb2RlbE5hbWUpIHtcbiAgICAgIHRocm93IGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IoXCJJbnZhbGlkIHNlbGVjdCBzaG9ydGhhbmQgd2l0aG91dCByb290IG1vZGVsIG5hbWVcIilcbiAgICB9XG5cbiAgICByZXR1cm4ge1tyb290TW9kZWxOYW1lXTogW3NlbGVjdF19XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3QpKSB7XG4gICAgaWYgKCFyb290TW9kZWxOYW1lKSB7XG4gICAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKFwiSW52YWxpZCBzZWxlY3Qgc2hvcnRoYW5kIHdpdGhvdXQgcm9vdCBtb2RlbCBuYW1lXCIpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIHNlbGVjdCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVOYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgc2VsZWN0IGF0dHJpYnV0ZSBmb3IgJHtyb290TW9kZWxOYW1lfTogJHt0eXBlb2YgYXR0cmlidXRlTmFtZX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7W3Jvb3RNb2RlbE5hbWVdOiBBcnJheS5mcm9tKG5ldyBTZXQoc2VsZWN0KSl9XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3Qoc2VsZWN0KSkge1xuICAgIHRocm93IGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgc2VsZWN0IHR5cGU6ICR7dHlwZW9mIHNlbGVjdH1gKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZWQuXG4gICAgQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgZm9yIChjb25zdCBbbW9kZWxOYW1lLCBzZWxlY3RWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VsZWN0KSkge1xuICAgIGlmICh0eXBlb2Ygc2VsZWN0VmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5vcm1hbGl6ZWRbbW9kZWxOYW1lXSA9IFtzZWxlY3RWYWx1ZV1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdFZhbHVlKSkge1xuICAgICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCBzZWxlY3QgdmFsdWUgZm9yICR7bW9kZWxOYW1lfTogJHt0eXBlb2Ygc2VsZWN0VmFsdWV9YClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2Ygc2VsZWN0VmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIHNlbGVjdCBhdHRyaWJ1dGUgZm9yICR7bW9kZWxOYW1lfTogJHt0eXBlb2YgYXR0cmlidXRlTmFtZX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vcm1hbGl6ZWRbbW9kZWxOYW1lXSA9IEFycmF5LmZyb20obmV3IFNldChzZWxlY3RWYWx1ZSkpXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIEZyb250ZW5kTW9kZWxTZWFyY2ggdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxTZWFyY2hcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2x1bW4gLSBDb2x1bW4gb3IgYXR0cmlidXRlIG5hbWUuXG4gKiBAcHJvcGVydHkge1wiZXFcIiB8IFwibGlrZVwiIHwgXCJub3RFcVwiIHwgXCJndFwiIHwgXCJndGVxXCIgfCBcImx0XCIgfCBcImx0ZXFcIn0gb3BlcmF0b3IgLSBTZWFyY2ggb3BlcmF0b3IuXG4gKiBAcHJvcGVydHkgez99IHZhbHVlIC0gU2VhcmNoIHZhbHVlLlxuICovXG5cbi8qKlxuICogRnJvbnRlbmRNb2RlbFNvcnQgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxTb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sdW1uIC0gQXR0cmlidXRlIG5hbWUgdG8gc29ydCBieS5cbiAqIEBwcm9wZXJ0eSB7XCJhc2NcIiB8IFwiZGVzY1wifSBkaXJlY3Rpb24gLSBTb3J0IGRpcmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aCBmcm9tIHJvb3QgbW9kZWwuXG4gKi9cblxuLyoqXG4gKiBGcm9udGVuZE1vZGVsR3JvdXAgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxHcm91cFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbHVtbiAtIEF0dHJpYnV0ZSBuYW1lIHRvIGdyb3VwIGJ5LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gcGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoIGZyb20gcm9vdCBtb2RlbC5cbiAqL1xuXG4vKipcbiAqIEZyb250ZW5kTW9kZWxQbHVjayB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFBsdWNrXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sdW1uIC0gQXR0cmlidXRlIG5hbWUgdG8gcGx1Y2suXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBwYXRoIC0gUmVsYXRpb25zaGlwIHBhdGggZnJvbSByb290IG1vZGVsLlxuICovXG5cbi8qKlxuICogRnJvbnRlbmRNb2RlbFBhZ2luYXRpb24gdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxQYWdpbmF0aW9uXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGxpbWl0IC0gTWF4aW11bSBudW1iZXIgb2YgcmVjb3Jkcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gb2Zmc2V0IC0gTnVtYmVyIG9mIHJlY29yZHMgdG8gc2tpcC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gcGFnZSAtIDEtYmFzZWQgcGFnZSBudW1iZXIuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHBlclBhZ2UgLSBQYWdlIHNpemUuXG4gKi9cblxuY29uc3QgZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzU3ltYm9sID0gU3ltYm9sKFwiZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzXCIpXG5jb25zdCBmcm9udGVuZE1vZGVsR3JvdXBlZENvbHVtbnNTeW1ib2wgPSBTeW1ib2woXCJmcm9udGVuZE1vZGVsR3JvdXBlZENvbHVtbnNcIilcbmNvbnN0IGZyb250ZW5kTW9kZWxXaGVyZU5vTWF0Y2hTeW1ib2wgPSBTeW1ib2woXCJmcm9udGVuZE1vZGVsV2hlcmVOb01hdGNoXCIpXG5jb25zdCBmcm9udGVuZE1vZGVsQ2xpZW50U2FmZUVycm9yTWVzc2FnZSA9IFwiUmVxdWVzdCBmYWlsZWQuXCJcbmNvbnN0IGZyb250ZW5kTW9kZWxEZWJ1Z0Vycm9yRW52aXJvbm1lbnRzID0gbmV3IFNldChbXCJkZXZlbG9wbWVudFwiLCBcInRlc3RcIl0pXG5cbi8qKlxuICogUnVucyBmcm9udGVuZCBtb2RlbCBxdWVyeSBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBxdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCAmIHtbZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzU3ltYm9sXT86IFNldDxzdHJpbmc+LCBbZnJvbnRlbmRNb2RlbEdyb3VwZWRDb2x1bW5zU3ltYm9sXT86IFNldDxzdHJpbmc+fX0gLSBRdWVyeSBtZXRhZGF0YSBhY2Nlc3MgaGVscGVyLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsUXVlcnlNZXRhZGF0YShxdWVyeSkge1xuICByZXR1cm4gLyoqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS4gQHR5cGUge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCAmIHtbZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzU3ltYm9sXT86IFNldDxzdHJpbmc+LCBbZnJvbnRlbmRNb2RlbEdyb3VwZWRDb2x1bW5zU3ltYm9sXT86IFNldDxzdHJpbmc+fX0gKi8gKHF1ZXJ5KVxufVxuXG4vKipcbiAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgdmFsaWRhdGlvbiBlcnJvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlLlxuICogQHJldHVybnMge1ZlbG9jaW91c0Vycm9yfSAtIENsaWVudC1zYWZlIHZhbGlkYXRpb24gZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IobWVzc2FnZSkge1xuICByZXR1cm4gVmVsb2Npb3VzRXJyb3Iuc2FmZShtZXNzYWdlLCB7Y29kZTogXCJmcm9udGVuZC1tb2RlbC12YWxpZGF0aW9uXCJ9KVxufVxuXG4vKipcbiAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgdmFsaWRhdGlvbiBlcnJvciBmb3IgZXJyb3IuXG4gKiBAcGFyYW0gez99IGVycm9yIC0gRXJyb3IgcmFpc2VkIHdoaWxlIG5vcm1hbGl6aW5nIGNsaWVudCBxdWVyeSBwYXJhbXMuXG4gKiBAcmV0dXJucyB7VmVsb2Npb3VzRXJyb3J9IC0gQ2xpZW50LXNhZmUgdmFsaWRhdGlvbiBlcnJvciBwcmVzZXJ2aW5nIHRoZSBub3JtYWxpemVyIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3JGb3JFcnJvcihlcnJvcikge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNFcnJvciAmJiBlcnJvci5zYWZlVG9FeHBvc2UpIHJldHVybiBlcnJvclxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgPyBlcnJvci5tZXNzYWdlXG4gICAgOiBTdHJpbmcoZXJyb3IpXG5cbiAgcmV0dXJuIGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBlcnJvciBjYXJyaWVzIGFuIGBlcnJvci52ZWxvY2lvdXNgIG1ldGFkYXRhIGJhZy4gVGhlXG4gKiBwcmVzZW5jZSBvZiBhbnkgc3VjaCBiYWcgbWFya3MgdGhlIGVycm9yIGFzIFwiYW5ub3RhdGVkIGJ5IHRoZVxuICogZGV2ZWxvcGVyIGZvciB0aGUgZnJvbnRlbmRcIiDigJQgdGhlIGZyYW1ld29yayB0cmVhdHMgaXQgYXNcbiAqIHVzZXItZmFjaW5nOiBzdXJmYWNlIHRoZSBtZXNzYWdlLCBmb3J3YXJkIHRoZSBtZXRhZGF0YSwgYW5kIHNraXBcbiAqIHRoZSBub2lzeSBlbmRwb2ludC1lcnJvciBsb2cuXG4gKiBAcGFyYW0gez99IGVycm9yIC0gQ2F1Z2h0IGVycm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxFcnJvckhhc1ZlbG9jaW91c01ldGFkYXRhKGVycm9yKSB7XG4gIHJldHVybiBCb29sZWFuKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUgez99ICovIChlcnJvcikudmVsb2Npb3VzICYmIHR5cGVvZiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7P30gKi8gKGVycm9yKS52ZWxvY2lvdXMgPT09IFwib2JqZWN0XCIpXG59XG5cbi8qKlxuICogUnVucyBmcm9udGVuZCBtb2RlbCB2ZWxvY2lvdXMgbWV0YWRhdGEgZm9yIGVycm9yLlxuICogQHBhcmFtIHs/fSBlcnJvciAtIENhdWdodCBlcnJvci5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxWZWxvY2lvdXNNZXRhZGF0YUZvckVycm9yKGVycm9yKSB7XG4gIGlmICghZnJvbnRlbmRNb2RlbEVycm9ySGFzVmVsb2Npb3VzTWV0YWRhdGEoZXJyb3IpKSByZXR1cm4gbnVsbFxuICByZXR1cm4gLyoqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS4gQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7P30gKi8gKGVycm9yKS52ZWxvY2lvdXMpXG59XG5cbi8qKlxuICogUnVucyBmcm9udGVuZCBtb2RlbCBjbGllbnQgbWVzc2FnZSBmb3IgZXJyb3IuXG4gKiBAcGFyYW0gez99IGVycm9yIC0gQ2F1Z2h0IGVycm9yLlxuICogQHJldHVybnMge3N0cmluZ30gLSBNZXNzYWdlIHNhZmUgdG8gcmV0dXJuIHRvIEFQSSBjbGllbnRzLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsQ2xpZW50TWVzc2FnZUZvckVycm9yKGVycm9yKSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFZlbG9jaW91c0Vycm9yICYmIGVycm9yLnNhZmVUb0V4cG9zZSkge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlXG4gIH1cblxuICBpZiAoZnJvbnRlbmRNb2RlbEVycm9ySGFzVmVsb2Npb3VzTWV0YWRhdGEoZXJyb3IpICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZVxuICB9XG5cbiAgcmV0dXJuIGZyb250ZW5kTW9kZWxDbGllbnRTYWZlRXJyb3JNZXNzYWdlXG59XG5cbi8qKlxuICogUnVucyBmcm9udGVuZCBtb2RlbCBkZWJ1ZyBwYXlsb2FkIGZvciBlcnJvci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ3VycmVudCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZW52aXJvbm1lbnQgLSBDdXJyZW50IGVudmlyb25tZW50LlxuICogQHBhcmFtIHs/fSBhcmdzLmVycm9yIC0gQ2F1Z2h0IGVycm9yLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSAtIE9wdGlvbmFsIGRlYnVnIHBheWxvYWQgZm9yIG5vbi1wcm9kdWN0aW9uIGVudmlyb25tZW50cy5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbERlYnVnUGF5bG9hZEZvckVycm9yKHtjb25maWd1cmF0aW9uLCBlbnZpcm9ubWVudCwgZXJyb3J9KSB7XG4gIGNvbnN0IGRlYnVnQWxsb3dlZCA9IGZyb250ZW5kTW9kZWxEZWJ1Z0Vycm9yRW52aXJvbm1lbnRzLmhhcyhlbnZpcm9ubWVudCkgfHwgZW52aXJvbm1lbnQgIT09IFwicHJvZHVjdGlvblwiICYmIGNvbmZpZ3VyYXRpb24uZ2V0RXhwb3NlSW50ZXJuYWxFcnJvcnNUb0NsaWVudHMoKVxuXG4gIGlmICghZGVidWdBbGxvd2VkKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNFcnJvciAmJiBlcnJvci5zYWZlVG9FeHBvc2UpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIGlmIChmcm9udGVuZE1vZGVsRXJyb3JIYXNWZWxvY2lvdXNNZXRhZGF0YShlcnJvcikpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIGNvbnN0IGRlYnVnRXJyb3JDbGFzcyA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZVxuICAgID8gZXJyb3IubmFtZVxuICAgIDogdHlwZW9mIGVycm9yXG4gIGNvbnN0IGRlYnVnRXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgID8gZXJyb3IubWVzc2FnZVxuICAgIDogU3RyaW5nKGVycm9yKVxuICBjb25zdCBkZWJ1Z0JhY2t0cmFjZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgdHlwZW9mIGVycm9yLnN0YWNrID09PSBcInN0cmluZ1wiICYmIGVycm9yLnN0YWNrLmxlbmd0aCA+IDBcbiAgICA/IGVycm9yLnN0YWNrLnNwbGl0KFwiXFxuXCIpXG4gICAgOiB1bmRlZmluZWRcblxuICByZXR1cm4ge1xuICAgIGRlYnVnRXJyb3JDbGFzcyxcbiAgICBkZWJ1Z0Vycm9yTWVzc2FnZSxcbiAgICAuLi4oZGVidWdCYWNrdHJhY2UgPyB7ZGVidWdCYWNrdHJhY2V9IDoge30pXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBzZWFyY2hlcy5cbiAqIEBwYXJhbSB7P30gc2VhcmNoZXMgLSBTZWFyY2ggcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsU2VhcmNoW119IC0gTm9ybWFsaXplZCBzZWFyY2hlcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFNlYXJjaGVzKHNlYXJjaGVzKSB7XG4gIGlmICghc2VhcmNoZXMpIHJldHVybiBbXVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShzZWFyY2hlcykpIHtcbiAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIHNlYXJjaGVzIHR5cGU6ICR7dHlwZW9mIHNlYXJjaGVzfWApXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplZC5cbiAgICBAdHlwZSB7RnJvbnRlbmRNb2RlbFNlYXJjaFtdfSAqL1xuICBjb25zdCBub3JtYWxpemVkID0gW11cblxuICBmb3IgKGNvbnN0IHNlYXJjaCBvZiBzZWFyY2hlcykge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChzZWFyY2gpKSB7XG4gICAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIHNlYXJjaCBlbnRyeSB0eXBlOiAke3R5cGVvZiBzZWFyY2h9YClcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gc2VhcmNoLnBhdGhcbiAgICBjb25zdCBjb2x1bW4gPSBzZWFyY2guY29sdW1uXG4gICAgY29uc3Qgb3BlcmF0b3IgPSBzZWFyY2gub3BlcmF0b3JcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihcIkludmFsaWQgc2VhcmNoIHBhdGg6IGV4cGVjdGVkIGFuIGFycmF5XCIpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXRoRW50cnkgb2YgcGF0aCkge1xuICAgICAgaWYgKHR5cGVvZiBwYXRoRW50cnkgIT09IFwic3RyaW5nXCIgfHwgcGF0aEVudHJ5Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihcIkludmFsaWQgc2VhcmNoIHBhdGggZW50cnk6IGV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmdcIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbHVtbiAhPT0gXCJzdHJpbmdcIiB8fCBjb2x1bW4ubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihcIkludmFsaWQgc2VhcmNoIGNvbHVtbjogZXhwZWN0ZWQgbm9uLWVtcHR5IHN0cmluZ1wiKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3BlcmF0b3IgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgc2VhcmNoIG9wZXJhdG9yOiAke29wZXJhdG9yfWApXG4gICAgfVxuXG4gICAgbm9ybWFsaXplZC5wdXNoKHtcbiAgICAgIGNvbHVtbixcbiAgICAgIG9wZXJhdG9yOiBub3JtYWxpemVRdWVyeVNlYXJjaE9wZXJhdG9yKG9wZXJhdG9yKSxcbiAgICAgIHBhdGg6IFsuLi5wYXRoXSxcbiAgICAgIHZhbHVlOiBzZWFyY2gudmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCB3aGVyZS5cbiAqIEBwYXJhbSB7P30gd2hlcmUgLSBXaGVyZSBwYXlsb2FkLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gLSBOb3JtYWxpemVkIHdoZXJlIGhhc2guXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxXaGVyZSh3aGVyZSkge1xuICBpZiAoIXdoZXJlKSByZXR1cm4gbnVsbFxuXG4gIGlmICghaXNQbGFpbk9iamVjdCh3aGVyZSkpIHtcbiAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIHdoZXJlIHR5cGU6ICR7dHlwZW9mIHdoZXJlfWApXG4gIH1cblxuICByZXR1cm4gd2hlcmVcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCByYW5zYWNrLlxuICogQHBhcmFtIHs/fSByYW5zYWNrIC0gUmFuc2FjayBwYXlsb2FkLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gLSBOb3JtYWxpemVkIFJhbnNhY2sgaGFzaC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJhbnNhY2socmFuc2Fjaykge1xuICBpZiAoIXJhbnNhY2spIHJldHVybiBudWxsXG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KHJhbnNhY2spKSB7XG4gICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCByYW5zYWNrIHR5cGU6ICR7dHlwZW9mIHJhbnNhY2t9YClcbiAgfVxuXG4gIHJldHVybiByYW5zYWNrXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgZnJvbnRlbmQgbW9kZWwgaW50ZWdlciBwYXJhbS5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgaW50ZWdlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gUGFyYW0gbmFtZSBmb3IgZXJyb3JzLlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIE1pbmltdW0gYWxsb3dlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSAtIE5vcm1hbGl6ZWQgaW50ZWdlci5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEludGVnZXJQYXJhbSh2YWx1ZSwgbmFtZSwgbWluKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCAke25hbWV9OiBleHBlY3RlZCBpbnRlZ2VyIG51bWJlcmApXG4gIH1cblxuICBpZiAodmFsdWUgPCBtaW4pIHtcbiAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkICR7bmFtZX06IGV4cGVjdGVkIHZhbHVlID49ICR7bWlufWApXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBwYWdpbmF0aW9uLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBQYWdpbmF0aW9uIGFyZ3MuXG4gKiBAcGFyYW0gez99IGFyZ3MubGltaXQgLSBMaW1pdCBwYXlsb2FkLlxuICogQHBhcmFtIHs/fSBhcmdzLm9mZnNldCAtIE9mZnNldCBwYXlsb2FkLlxuICogQHBhcmFtIHs/fSBhcmdzLnBhZ2UgLSBQYWdlIHBheWxvYWQuXG4gKiBAcGFyYW0gez99IGFyZ3MucGVyUGFnZSAtIFBlci1wYWdlIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFBhZ2luYXRpb259IC0gTm9ybWFsaXplZCBwYWdpbmF0aW9uIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxQYWdpbmF0aW9uKHtsaW1pdCwgb2Zmc2V0LCBwYWdlLCBwZXJQYWdlfSkge1xuICByZXR1cm4ge1xuICAgIGxpbWl0OiBub3JtYWxpemVGcm9udGVuZE1vZGVsSW50ZWdlclBhcmFtKGxpbWl0LCBcImxpbWl0XCIsIDApLFxuICAgIG9mZnNldDogbm9ybWFsaXplRnJvbnRlbmRNb2RlbEludGVnZXJQYXJhbShvZmZzZXQsIFwib2Zmc2V0XCIsIDApLFxuICAgIHBhZ2U6IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxJbnRlZ2VyUGFyYW0ocGFnZSwgXCJwYWdlXCIsIDEpLFxuICAgIHBlclBhZ2U6IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxJbnRlZ2VyUGFyYW0ocGVyUGFnZSwgXCJwZXJQYWdlXCIsIDEpXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBkaXN0aW5jdC5cbiAqIEBwYXJhbSB7P30gZGlzdGluY3QgLSBEaXN0aW5jdCBwYXlsb2FkLlxuICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSAtIE5vcm1hbGl6ZWQgZGlzdGluY3QgZmxhZyB3aGVuIHByb3ZpZGVkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsRGlzdGluY3QoZGlzdGluY3QpIHtcbiAgaWYgKGRpc3RpbmN0ID09IG51bGwpIHJldHVybiBudWxsXG5cbiAgaWYgKHR5cGVvZiBkaXN0aW5jdCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIGRpc3RpbmN0OiBleHBlY3RlZCBib29sZWFuYClcbiAgfVxuXG4gIHJldHVybiBkaXN0aW5jdFxufVxuXG4vKipcbiAqIFJ1bnMgYnVpbGQgZnJvbnRlbmQgbW9kZWwgam9pbiBvYmplY3QgZnJvbSBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSAtIEpvaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBidWlsZEZyb250ZW5kTW9kZWxKb2luT2JqZWN0RnJvbVBhdGgocGF0aCkge1xuICAvKipcbiAgICogSm9pbiBvYmplY3QuXG4gICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICBjb25zdCBqb2luT2JqZWN0ID0ge31cbiAgLyoqXG4gICAqIEN1cnJlbnQgbm9kZS5cbiAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gIGxldCBjdXJyZW50Tm9kZSA9IGpvaW5PYmplY3RcblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgcGF0aCkge1xuICAgIGN1cnJlbnROb2RlW3JlbGF0aW9uc2hpcE5hbWVdID0ge31cbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlW3JlbGF0aW9uc2hpcE5hbWVdXG4gIH1cblxuICByZXR1cm4gam9pbk9iamVjdFxufVxuXG4vKipcbiAqIEJ1aWxkIGEgc3VjY2Vzc2Z1bCBzaW5nbGUtbW9kZWwgZnJvbnRlbmQtbW9kZWwgcmVzcG9uc2UgcGF5bG9hZC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1vZGVsIC0gU2VyaWFsaXplZCBtb2RlbCBwYXlsb2FkLlxuICogQHJldHVybnMge3ttb2RlbDogUmVjb3JkPHN0cmluZywgPz4sIHN0YXR1czogXCJzdWNjZXNzXCJ9fSAtIFN1Y2Nlc3MgcmVzcG9uc2UgcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFNlcmlhbGl6ZWRNb2RlbFN1Y2Nlc3MobW9kZWwpIHtcbiAgcmV0dXJuIHttb2RlbCwgc3RhdHVzOiBcInN1Y2Nlc3NcIn1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSBhdHRhY2htZW50IHBhcmFtcyBzaGFyZWQgYnkgYXR0YWNobWVudCBjb21tYW5kcy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIEZyb250ZW5kLW1vZGVsIHJlcXVlc3QgcGFyYW1zLlxuICogQHJldHVybnMge3thdHRhY2htZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgYXR0YWNobWVudE5hbWU6IHN0cmluZ30gfCBzdHJpbmd9IC0gQXR0YWNobWVudCBwYXJhbXMgb3IgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsQXR0YWNobWVudFBhcmFtcyhwYXJhbXMpIHtcbiAgY29uc3QgYXR0YWNobWVudE5hbWUgPSBwYXJhbXMuYXR0YWNobWVudE5hbWVcblxuICBpZiAodHlwZW9mIGF0dGFjaG1lbnROYW1lICE9PSBcInN0cmluZ1wiIHx8IGF0dGFjaG1lbnROYW1lLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4gXCJFeHBlY3RlZCBhdHRhY2htZW50TmFtZS5cIlxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdHRhY2htZW50SWQ6IHR5cGVvZiBwYXJhbXMuYXR0YWNobWVudElkID09PSBcInN0cmluZ1wiID8gcGFyYW1zLmF0dGFjaG1lbnRJZCA6IHVuZGVmaW5lZCxcbiAgICBhdHRhY2htZW50TmFtZVxuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCBtdXRhdGlvbiBhdHRyaWJ1dGVzIHNoYXJlZCBieSBjcmVhdGUgYW5kIHVwZGF0ZSBjb21tYW5kcy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIEZyb250ZW5kLW1vZGVsIHJlcXVlc3QgcGFyYW1zLlxuICogQHJldHVybnMge3thdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbmVzdGVkQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSB8IHN0cmluZ30gLSBNdXRhdGlvbiBhdHRyaWJ1dGVzIG9yIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbE11dGF0aW9uQXR0cmlidXRlcyhwYXJhbXMpIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IHBhcmFtcy5hdHRyaWJ1dGVzXG5cbiAgaWYgKCFhdHRyaWJ1dGVzIHx8IHR5cGVvZiBhdHRyaWJ1dGVzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFwiRXhwZWN0ZWQgbW9kZWwgYXR0cmlidXRlcy5cIlxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVzLFxuICAgIG5lc3RlZEF0dHJpYnV0ZXM6IHBhcmFtcy5uZXN0ZWRBdHRyaWJ1dGVzICYmIHR5cGVvZiBwYXJhbXMubmVzdGVkQXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIlxuICAgICAgPyAvKipcbiAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChwYXJhbXMubmVzdGVkQXR0cmlidXRlcylcbiAgICAgIDogbnVsbFxuICB9XG59XG5cbi8qKiBDb250cm9sbGVyIHdpdGggYnVpbHQtaW4gZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgYWN0aW9ucy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyb250ZW5kTW9kZWxDb250cm9sbGVyIGV4dGVuZHMgQ29udHJvbGxlciB7XG4gIC8qKlxuICAgKiBGcm9udGVuZCBtb2RlbCBwYXJhbXMuXG4gICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+IHwgdW5kZWZpbmVkfSAqL1xuICBfZnJvbnRlbmRNb2RlbFBhcmFtcyA9IHVuZGVmaW5lZFxuICAvKipcbiAgICogRnJvbnRlbmQgbW9kZWwgcGFyYW1zIG92ZXJyaWRlLlxuICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IHVuZGVmaW5lZH0gKi9cbiAgX2Zyb250ZW5kTW9kZWxQYXJhbXNPdmVycmlkZSA9IHVuZGVmaW5lZFxuICAvKipcbiAgICogRnJvbnRlbmQgbW9kZWwgYWJpbGl0eSBvdmVycmlkZS5cbiAgICBAdHlwZSB7aW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gKi9cbiAgX2Zyb250ZW5kTW9kZWxBYmlsaXR5T3ZlcnJpZGUgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gLSBEZWNvZGVkIHJlcXVlc3QgcGFyYW1zLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFBhcmFtcygpIHtcbiAgICBpZiAodGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtc092ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtc092ZXJyaWRlXG4gICAgfVxuXG4gICAgdGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtcyB8fD0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHRoaXMucGFyYW1zKCkpKVxuXG4gICAgcmV0dXJuIHRoaXMuX2Zyb250ZW5kTW9kZWxQYXJhbXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggZnJvbnRlbmQgbW9kZWwgcGFyYW1zLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBUZW1wb3JhcnkgZnJvbnRlbmQgbW9kZWwgcGFyYW1zLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZXhlY3V0ZWQgd2l0aCB0ZW1wb3JhcnkgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhc3luYyB3aXRoRnJvbnRlbmRNb2RlbFBhcmFtcyhwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcHJldmlvdXNPdmVycmlkZSA9IHRoaXMuX2Zyb250ZW5kTW9kZWxQYXJhbXNPdmVycmlkZVxuICAgIGNvbnN0IHByZXZpb3VzUGFyYW1zID0gdGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtc1xuXG4gICAgdGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtc092ZXJyaWRlID0gcGFyYW1zXG4gICAgdGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtcyA9IHVuZGVmaW5lZFxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2Zyb250ZW5kTW9kZWxQYXJhbXNPdmVycmlkZSA9IHByZXZpb3VzT3ZlcnJpZGVcbiAgICAgIHRoaXMuX2Zyb250ZW5kTW9kZWxQYXJhbXMgPSBwcmV2aW91c1BhcmFtc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggZnJvbnRlbmQgbW9kZWwgcmVxdWVzdCBjb250ZXh0LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBSZXF1ZXN0LXNjb3BlZCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIikuZGVmYXVsdH0gcmVzcG9uc2UgLSBSZXNwb25zZSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIENhbGxiYWNrIGV4ZWN1dGVkIGluc2lkZSByZXNvbHZlZCB0ZW5hbnQgYW5kIGFiaWxpdHkgY29udGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgd2l0aEZyb250ZW5kTW9kZWxSZXF1ZXN0Q29udGV4dChwYXJhbXMsIHJlc3BvbnNlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZVRlbmFudCh7XG4gICAgICBwYXJhbXMsXG4gICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QoKSxcbiAgICAgIHJlc3BvbnNlXG4gICAgfSlcblxuICAgIHJldHVybiBhd2FpdCBjb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogXCJGcm9udGVuZCBtb2RlbCByZXF1ZXN0XCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFiaWxpdHkgPSBhd2FpdCBjb25maWd1cmF0aW9uLnJlc29sdmVBYmlsaXR5KHtcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0KCksXG4gICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgfSlcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByZXZpb3VzIGFiaWxpdHkgb3ZlcnJpZGUuXG4gICAgICAgICAgQHR5cGUge2ltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IHByZXZpb3VzQWJpbGl0eU92ZXJyaWRlID0gdGhpcy5fZnJvbnRlbmRNb2RlbEFiaWxpdHlPdmVycmlkZVxuXG4gICAgICAgIHRoaXMuX2Zyb250ZW5kTW9kZWxBYmlsaXR5T3ZlcnJpZGUgPSBhYmlsaXR5XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgY29uZmlndXJhdGlvbi5ydW5XaXRoQWJpbGl0eShhYmlsaXR5LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5fZnJvbnRlbmRNb2RlbEFiaWxpdHlPdmVycmlkZSA9IHByZXZpb3VzQWJpbGl0eU92ZXJyaWRlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGN1cnJlbnQgYWJpbGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IC0gQ3VycmVudCBhYmlsaXR5IGZvciBmcm9udGVuZC1tb2RlbCByZXF1ZXN0IHNjb3BlLlxuICAgKi9cbiAgY3VycmVudEFiaWxpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb250ZW5kTW9kZWxBYmlsaXR5T3ZlcnJpZGUgfHwgc3VwZXIuY3VycmVudEFiaWxpdHkoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gLSBGcm9udGVuZCBtb2RlbCBjbGFzcyBmb3IgY29udHJvbGxlciByZXNvdXJjZSBhY3Rpb25zLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbENsYXNzKCkge1xuICAgIGNvbnN0IGZyb250ZW5kTW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzRnJvbUNvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpXG4gICAgY29uc3QgbW9kZWxOYW1lID0gdHlwZW9mIHBhcmFtcy5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHBhcmFtcy5tb2RlbCA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGNvbnRyb2xsZXJOYW1lID0gdHlwZW9mIHBhcmFtcy5jb250cm9sbGVyID09PSBcInN0cmluZ1wiID8gcGFyYW1zLmNvbnRyb2xsZXIgOiB1bmRlZmluZWRcblxuICAgIGlmIChmcm9udGVuZE1vZGVsQ2xhc3MpIHJldHVybiBmcm9udGVuZE1vZGVsQ2xhc3NcblxuICAgIHRocm93IG5ldyBFcnJvcihgTm8gZnJvbnRlbmQgbW9kZWwgY29uZmlndXJlZCBmb3IgbW9kZWwgJyR7bW9kZWxOYW1lIHx8IFwidW5rbm93blwifScgYW5kIGNvbnRyb2xsZXIgJyR7Y29udHJvbGxlck5hbWUgfHwgXCJ1bmtub3duXCJ9Jy4gRW5zdXJlIGEgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBzdWJjbGFzcyBleGlzdHMgaW4gc3JjL3Jlc291cmNlcy8gb3IgaXMgbGlzdGVkIGluIHRoZSBhYmlsaXR5IHJlc29sdmVyLmApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7e2JhY2tlbmRQcm9qZWN0OiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uLCBtb2RlbE5hbWU6IHN0cmluZywgcmVzb3VyY2VDbGFzczogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSwgcmVzb3VyY2VDb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IHwgbnVsbH0gLSBGcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGZvciBjdXJyZW50IGNvbnRyb2xsZXIuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpXG4gICAgY29uc3QgbW9kZWxOYW1lID0gdHlwZW9mIHBhcmFtcy5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHBhcmFtcy5tb2RlbCA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGNvbnRyb2xsZXJOYW1lID0gdHlwZW9mIHBhcmFtcy5jb250cm9sbGVyID09PSBcInN0cmluZ1wiID8gcGFyYW1zLmNvbnRyb2xsZXIgOiB1bmRlZmluZWRcbiAgICBjb25zdCBiYWNrZW5kUHJvamVjdHMgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRCYWNrZW5kUHJvamVjdHMoKVxuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgICAgaWYgKG1vZGVsTmFtZSAmJiBtb2RlbE5hbWUubGVuZ3RoID4gMCAmJiByZXNvdXJjZXNbbW9kZWxOYW1lXSkge1xuICAgICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbbW9kZWxOYW1lXVxuICAgICAgICBjb25zdCByZXNvdXJjZUNvbmZpZ3VyYXRpb24gPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuICAgICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICAgICAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24gfHwgIXJlc291cmNlQ2xhc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIG1vZGVsIHJlc291cmNlICcke21vZGVsTmFtZX0nIG11c3QgYmUgYSBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHN1YmNsYXNzYClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYmFja2VuZFByb2plY3QsXG4gICAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3MsXG4gICAgICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFjb250cm9sbGVyTmFtZSB8fCBjb250cm9sbGVyTmFtZS5sZW5ndGggPCAxKSBjb250aW51ZVxuXG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlTW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbcmVzb3VyY2VNb2RlbE5hbWVdXG4gICAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG4gICAgICAgIGNvbnN0IHJlc291cmNlQ2xhc3MgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbiB8fCAhcmVzb3VyY2VDbGFzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgJyR7cmVzb3VyY2VNb2RlbE5hbWV9JyBtdXN0IGJlIGEgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBzdWJjbGFzc2ApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvdXJjZVBhdGggPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGgocmVzb3VyY2VNb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgICBpZiAodGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VNYXRjaGVzQ29udHJvbGxlcih7Y29udHJvbGxlck5hbWUsIHJlc291cmNlUGF0aH0pKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJhY2tlbmRQcm9qZWN0LFxuICAgICAgICAgICAgbW9kZWxOYW1lOiByZXNvdXJjZU1vZGVsTmFtZSxcbiAgICAgICAgICAgIHJlc291cmNlQ2xhc3MsXG4gICAgICAgICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgYmFja2VuZCBwcm9qZWN0IG1vZGVsIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb259IGFyZ3MuYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubW9kZWxOYW1lIC0gTW9kZWwgbmFtZS5cbiAgICogQHJldHVybnMge3tiYWNrZW5kUHJvamVjdDogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbiwgbW9kZWxOYW1lOiBzdHJpbmcsIHJlc291cmNlQ2xhc3M6IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUsIHJlc291cmNlQ29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSB8IG51bGx9IC0gRnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgbW9kZWwgbmFtZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gb3JCYWNrZW5kUHJvamVjdE1vZGVsTmFtZSh7YmFja2VuZFByb2plY3QsIG1vZGVsTmFtZX0pIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gICAgY29uc3QgcmVzb3VyY2VEZWZpbml0aW9uID0gcmVzb3VyY2VzW21vZGVsTmFtZV1cblxuICAgIGlmICghcmVzb3VyY2VEZWZpbml0aW9uKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmVzb3VyY2VDb25maWd1cmF0aW9uID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcbiAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbiB8fCAhcmVzb3VyY2VDbGFzcykgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB7XG4gICAgICBiYWNrZW5kUHJvamVjdCxcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIHJlc291cmNlQ2xhc3MsXG4gICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGZvciBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7e2JhY2tlbmRQcm9qZWN0OiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uLCBtb2RlbE5hbWU6IHN0cmluZywgcmVzb3VyY2VDbGFzczogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSwgcmVzb3VyY2VDb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IHwgbnVsbH0gLSBGcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGZvciBtb2RlbCBjbGFzcy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpIHtcbiAgICBjb25zdCBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24oKVxuXG4gICAgaWYgKCFmcm9udGVuZE1vZGVsUmVzb3VyY2UpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRm9yQmFja2VuZFByb2plY3RNb2RlbE5hbWUoe1xuICAgICAgYmFja2VuZFByb2plY3Q6IGZyb250ZW5kTW9kZWxSZXNvdXJjZS5iYWNrZW5kUHJvamVjdCxcbiAgICAgIG1vZGVsTmFtZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHt7bW9kZWxOYW1lOiBzdHJpbmcsIHJlc291cmNlQ2xhc3M6IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9fSBmcm9udGVuZE1vZGVsUmVzb3VyY2UgLSBGcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsfSAtIEJhY2tpbmcgcmVjb3JkIGNsYXNzLCB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxSZXNvdXJjZU1vZGVsQ2xhc3MoZnJvbnRlbmRNb2RlbFJlc291cmNlKSB7XG4gICAgY29uc3QgcmVzb3VyY2VNb2RlbENsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlLnJlc291cmNlQ2xhc3MuTW9kZWxDbGFzc1xuXG4gICAgaWYgKHJlc291cmNlTW9kZWxDbGFzcykgcmV0dXJuIHJlc291cmNlTW9kZWxDbGFzc1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3NlcygpW2Zyb250ZW5kTW9kZWxSZXNvdXJjZS5tb2RlbE5hbWVdIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGNsYXNzIGZyb20gY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gLSBGcm9udGVuZCBtb2RlbCBjbGFzcyByZXNvbHZlZCBmcm9tIGJhY2tlbmQgcHJvamVjdCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbENsYXNzRnJvbUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgY29uc3QgZnJvbnRlbmRNb2RlbFJlc291cmNlID0gdGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uKClcblxuICAgIGlmICghZnJvbnRlbmRNb2RlbFJlc291cmNlKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmVzb3VyY2VNb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VNb2RlbENsYXNzKGZyb250ZW5kTW9kZWxSZXNvdXJjZSlcblxuICAgIGlmIChyZXNvdXJjZU1vZGVsQ2xhc3MpIHJldHVybiByZXNvdXJjZU1vZGVsQ2xhc3NcblxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3NlcygpXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3Nlc1tmcm9udGVuZE1vZGVsUmVzb3VyY2UubW9kZWxOYW1lXVxuXG4gICAgaWYgKCFtb2RlbENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIG1vZGVsICcke2Zyb250ZW5kTW9kZWxSZXNvdXJjZS5tb2RlbE5hbWV9JyBpcyBjb25maWd1cmVkIGZvciAnJHt0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5jb250cm9sbGVyfScsIGJ1dCBubyBtb2RlbCBjbGFzcyB3YXMgcmVnaXN0ZXJlZC4gUmVnaXN0ZXJlZCBtb2RlbHM6ICR7T2JqZWN0LmtleXMobW9kZWxDbGFzc2VzKS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIGZyb250ZW5kIG1vZGVsIGNsYXNzIGFuZCByZXF1ZXN0ZWQgcHJlbG9hZCB0YXJnZXQgY2xhc3NlcyBhcmUgaW5pdGlhbGl6ZWQuXG4gICAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBtb2RlbCBpbml0aWFsaXphdGlvbiB3YXMgc2tpcHBlZCBhdCBzdGFydHVwIChlLmcuLCBicm93c2VyIHRlc3RzKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgbW9kZWwgY2xhc3MgaXMgcmVhZHkuXG4gICAqL1xuICBhc3luYyBlbnN1cmVGcm9udGVuZE1vZGVsQ2xhc3NJbml0aWFsaXplZCgpIHtcbiAgICBjb25zdCBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLmZyb250ZW5kTW9kZWxDbGFzc0Zyb21Db25maWd1cmF0aW9uKClcblxuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxSZWNvcmRDbGFzc0luaXRpYWxpemVkKG1vZGVsQ2xhc3MpXG5cbiAgICBpZiAoIWZyb250ZW5kTW9kZWxSZXNvdXJjZSkgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxQcmVsb2FkQ2xhc3Nlc0luaXRpYWxpemVkKHtcbiAgICAgIGJhY2tlbmRQcm9qZWN0OiBmcm9udGVuZE1vZGVsUmVzb3VyY2UuYmFja2VuZFByb2plY3QsXG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgcHJlbG9hZDogdGhpcy5mcm9udGVuZE1vZGVsUHJlbG9hZCgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVuc3VyZSBmcm9udGVuZCBtb2RlbCByZWNvcmQgY2xhc3MgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBpbml0aWFsaXplLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBtb2RlbCBjbGFzcyBpcyByZWFkeS5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUZyb250ZW5kTW9kZWxSZWNvcmRDbGFzc0luaXRpYWxpemVkKG1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MgfHwgbW9kZWxDbGFzcy5pc0luaXRpYWxpemVkKCkpIHJldHVyblxuXG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG5cbiAgICBpZiAodHlwZW9mIG1vZGVsQ2xhc3MuZW5zdXJlSW5pdGlhbGl6ZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXdhaXQgbW9kZWxDbGFzcy5lbnN1cmVJbml0aWFsaXplZCh7Y29uZmlndXJhdGlvbn0pXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kZWxDbGFzcy5pbml0aWFsaXplUmVjb3JkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGF3YWl0IG1vZGVsQ2xhc3MuaW5pdGlhbGl6ZVJlY29yZCh7Y29uZmlndXJhdGlvbn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5zdXJlIGZyb250ZW5kIG1vZGVsIHByZWxvYWQgY2xhc3NlcyBpbml0aWFsaXplZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYXJncy5iYWNrZW5kUHJvamVjdCAtIEJhY2tlbmQgcHJvamVjdCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB3aG9zZSBwcmVsb2FkIHRyZWUgaXMgYmVpbmcgcmVzb2x2ZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkIHwgbnVsbH0gYXJncy5wcmVsb2FkIC0gTm9ybWFsaXplZCBwcmVsb2FkIHRyZWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcHJlbG9hZCB0YXJnZXQgY2xhc3NlcyBhcmUgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBhc3luYyBlbnN1cmVGcm9udGVuZE1vZGVsUHJlbG9hZENsYXNzZXNJbml0aWFsaXplZCh7YmFja2VuZFByb2plY3QsIG1vZGVsQ2xhc3MsIHByZWxvYWR9KSB7XG4gICAgaWYgKCFwcmVsb2FkKSByZXR1cm5cblxuICAgIGZvciAoY29uc3QgW3JlbGF0aW9uc2hpcE5hbWUsIHJlbGF0aW9uc2hpcFByZWxvYWRdIG9mIE9iamVjdC5lbnRyaWVzKHByZWxvYWQpKSB7XG4gICAgICBpZiAocmVsYXRpb25zaGlwUHJlbG9hZCA9PT0gZmFsc2UpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gYXdhaXQgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsUmVsYXRpb25zaGlwVGFyZ2V0Q2xhc3NJbml0aWFsaXplZCh7XG4gICAgICAgIGJhY2tlbmRQcm9qZWN0LFxuICAgICAgICByZWxhdGlvbnNoaXBcbiAgICAgIH0pXG5cbiAgICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcyB8fCAhaXNQbGFpbk9iamVjdChyZWxhdGlvbnNoaXBQcmVsb2FkKSkgY29udGludWVcblxuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsUHJlbG9hZENsYXNzZXNJbml0aWFsaXplZCh7XG4gICAgICAgIGJhY2tlbmRQcm9qZWN0LFxuICAgICAgICBtb2RlbENsYXNzOiB0YXJnZXRNb2RlbENsYXNzLFxuICAgICAgICBwcmVsb2FkOiAvKipcbiAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICBAdHlwZSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkfSAqLyAocmVsYXRpb25zaGlwUHJlbG9hZClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5zdXJlIGZyb250ZW5kIG1vZGVsIHJlbGF0aW9uc2hpcCB0YXJnZXQgY2xhc3MgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb259IGFyZ3MuYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9yZWxhdGlvbnNoaXBzL2Jhc2UuanNcIikuZGVmYXVsdH0gYXJncy5yZWxhdGlvbnNoaXAgLSBSZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsPn0gLSBUYXJnZXQgbW9kZWwgY2xhc3MsIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRnJvbnRlbmRNb2RlbFJlbGF0aW9uc2hpcFRhcmdldENsYXNzSW5pdGlhbGl6ZWQoe2JhY2tlbmRQcm9qZWN0LCByZWxhdGlvbnNoaXB9KSB7XG4gICAgaWYgKHJlbGF0aW9uc2hpcC50aHJvdWdoKSB7XG4gICAgICBjb25zdCB0aHJvdWdoUmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwLmdldE1vZGVsQ2xhc3MoKS5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwLnRocm91Z2gpXG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxSZWxhdGlvbnNoaXBUYXJnZXRDbGFzc0luaXRpYWxpemVkKHtcbiAgICAgICAgYmFja2VuZFByb2plY3QsXG4gICAgICAgIHJlbGF0aW9uc2hpcDogdGhyb3VnaFJlbGF0aW9uc2hpcFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsUmVsYXRpb25zaGlwVGFyZ2V0TW9kZWxDbGFzcyh7XG4gICAgICBiYWNrZW5kUHJvamVjdCxcbiAgICAgIHJlbGF0aW9uc2hpcFxuICAgIH0pXG5cbiAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHJldHVybiBudWxsXG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxSZWNvcmRDbGFzc0luaXRpYWxpemVkKHRhcmdldE1vZGVsQ2xhc3MpXG5cbiAgICByZXR1cm4gdGFyZ2V0TW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcmVsYXRpb25zaGlwIHRhcmdldCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYXJncy5iYWNrZW5kUHJvamVjdCAtIEJhY2tlbmQgcHJvamVjdCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL3JlbGF0aW9uc2hpcHMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlbGF0aW9uc2hpcCAtIFJlbGF0aW9uc2hpcCBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsfSAtIFRhcmdldCBtb2RlbCBjbGFzcywgd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUmVsYXRpb25zaGlwVGFyZ2V0TW9kZWxDbGFzcyh7YmFja2VuZFByb2plY3QsIHJlbGF0aW9uc2hpcH0pIHtcbiAgICBpZiAocmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljKCkgJiYgcmVsYXRpb25zaGlwLmdldFR5cGUoKSA9PT0gXCJiZWxvbmdzVG9cIikgcmV0dXJuIG51bGxcblxuICAgIGlmIChyZWxhdGlvbnNoaXAua2xhc3MpIHJldHVybiByZWxhdGlvbnNoaXAua2xhc3NcblxuICAgIGlmIChyZWxhdGlvbnNoaXAuY2xhc3NOYW1lKSB7XG4gICAgICBjb25zdCBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gb3JCYWNrZW5kUHJvamVjdE1vZGVsTmFtZSh7XG4gICAgICAgIGJhY2tlbmRQcm9qZWN0LFxuICAgICAgICBtb2RlbE5hbWU6IHJlbGF0aW9uc2hpcC5jbGFzc05hbWVcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXNvdXJjZU1vZGVsQ2xhc3MgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPyB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZU1vZGVsQ2xhc3MoZnJvbnRlbmRNb2RlbFJlc291cmNlKSA6IG51bGxcblxuICAgICAgaWYgKHJlc291cmNlTW9kZWxDbGFzcykgcmV0dXJuIHJlc291cmNlTW9kZWxDbGFzc1xuXG4gICAgICBjb25zdCByZWdpc3RlcmVkTW9kZWxDbGFzcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3NlcygpW3JlbGF0aW9uc2hpcC5jbGFzc05hbWVdXG5cbiAgICAgIGlmIChyZWdpc3RlcmVkTW9kZWxDbGFzcykgcmV0dXJuIHJlZ2lzdGVyZWRNb2RlbENsYXNzXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgIHJldHVybiB0YXJnZXRNb2RlbENsYXNzIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0gez99IHJlc291cmNlRGVmaW5pdGlvbiAtIFJlc291cmNlIGRlZmluaXRpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9ybWFsaXplZCByZXNvdXJjZSBwYXRoLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aChtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbikge1xuICAgIHJldHVybiBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoKG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgbWF0Y2hlcyBjb250cm9sbGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29udHJvbGxlck5hbWUgLSBDb250cm9sbGVyIG5hbWUgZnJvbSBwYXJhbXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlc291cmNlUGF0aCAtIFJlc291cmNlIHBhdGggZnJvbSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHJlc291cmNlIHBhdGggbWF0Y2hlcyBjdXJyZW50IGNvbnRyb2xsZXIuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUmVzb3VyY2VNYXRjaGVzQ29udHJvbGxlcih7Y29udHJvbGxlck5hbWUsIHJlc291cmNlUGF0aH0pIHtcbiAgICBjb25zdCBub3JtYWxpemVkQ29udHJvbGxlciA9IGNvbnRyb2xsZXJOYW1lLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpXG4gICAgY29uc3Qgbm9ybWFsaXplZFJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRSZXNvdXJjZVBhdGggPT09IG5vcm1hbGl6ZWRDb250cm9sbGVyKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRSZXNvdXJjZVBhdGguZW5kc1dpdGgoYC8ke25vcm1hbGl6ZWRDb250cm9sbGVyfWApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2V9IC0gQmFja2VuZCByZXNvdXJjZSBpbnN0YW5jZSBmb3IgY3VycmVudCBmcm9udGVuZC1tb2RlbCBhY3Rpb24uXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUmVzb3VyY2VJbnN0YW5jZSgpIHtcbiAgICBjb25zdCBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24oKVxuXG4gICAgaWYgKCFmcm9udGVuZE1vZGVsUmVzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgY29udHJvbGxlciAnJHt0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5jb250cm9sbGVyfSdgKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlQXJncyA9IHtcbiAgICAgIGFiaWxpdHk6IHRoaXMuY3VycmVudEFiaWxpdHkoKSxcbiAgICAgIGNvbnRyb2xsZXI6IHRoaXMsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIC4uLih0aGlzLmN1cnJlbnRBYmlsaXR5KCk/LmdldENvbnRleHQoKSB8fCB7fSksXG4gICAgICAgIHBhcmFtczogdGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCksXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCgpXG4gICAgICB9LFxuICAgICAgbG9jYWxzOiB0aGlzLmN1cnJlbnRBYmlsaXR5KCk/LmdldExvY2FscygpIHx8IHt9LFxuICAgICAgbW9kZWxDbGFzczogdGhpcy5mcm9udGVuZE1vZGVsQ2xhc3MoKSxcbiAgICAgIG1vZGVsTmFtZTogZnJvbnRlbmRNb2RlbFJlc291cmNlLm1vZGVsTmFtZSxcbiAgICAgIHBhcmFtczogdGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCksXG4gICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb246IGZyb250ZW5kTW9kZWxSZXNvdXJjZS5yZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IGZyb250ZW5kTW9kZWxSZXNvdXJjZS5yZXNvdXJjZUNsYXNzKHJlc291cmNlQXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHByaW1hcnkga2V5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZyb250ZW5kIG1vZGVsIHByaW1hcnkga2V5LlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFByaW1hcnlLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKCkucHJpbWFyeUtleSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBhYmlsaXR5IGFjdGlvbi5cbiAgICogQHBhcmFtIHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIn0gYWN0aW9uIC0gRnJvbnRlbmQgYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEFiaWxpdHkgYWN0aW9uIGNvbmZpZ3VyZWQgZm9yIHRoZSBmcm9udGVuZCBhY3Rpb24uXG4gICAqL1xuICBmcm9udGVuZE1vZGVsQWJpbGl0eUFjdGlvbihhY3Rpb24pIHtcbiAgICBjb25zdCBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24oKVxuXG4gICAgaWYgKCFmcm9udGVuZE1vZGVsUmVzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgY29udHJvbGxlciAnJHt0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5jb250cm9sbGVyfSdgKVxuICAgIH1cblxuICAgIGNvbnN0IGFiaWxpdGllcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZS5yZXNvdXJjZUNvbmZpZ3VyYXRpb24uYWJpbGl0aWVzXG5cbiAgICBpZiAoIWFiaWxpdGllcyB8fCB0eXBlb2YgYWJpbGl0aWVzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc291cmNlICcke2Zyb250ZW5kTW9kZWxSZXNvdXJjZS5tb2RlbE5hbWV9JyBtdXN0IGRlZmluZSBhbiAnYWJpbGl0aWVzJyBvYmplY3RgKVxuICAgIH1cblxuICAgIGNvbnN0IGFiaWxpdHlLZXkgPSBhY3Rpb24gPT09IFwiYXR0YWNoXCJcbiAgICAgID8gXCJ1cGRhdGVcIlxuICAgICAgOiAoKGFjdGlvbiA9PT0gXCJkb3dubG9hZFwiIHx8IGFjdGlvbiA9PT0gXCJ1cmxcIikgPyBcImZpbmRcIiA6IGFjdGlvbilcbiAgICBjb25zdCBhYmlsaXR5QWN0aW9uID0gYWJpbGl0aWVzW2FiaWxpdHlLZXldXG5cbiAgICBpZiAodHlwZW9mIGFiaWxpdHlBY3Rpb24gIT09IFwic3RyaW5nXCIgfHwgYWJpbGl0eUFjdGlvbi5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc291cmNlICcke2Zyb250ZW5kTW9kZWxSZXNvdXJjZS5tb2RlbE5hbWV9JyBtdXN0IGRlZmluZSBhYmlsaXRpZXMuJHthYmlsaXR5S2V5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGFiaWxpdHlBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGF1dGhvcml6ZWQgcXVlcnkuXG4gICAqIEBwYXJhbSB7XCJpbmRleFwiIHwgXCJmaW5kXCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCJ9IGFjdGlvbiAtIEZyb250ZW5kIGFjdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IC0gQXV0aG9yaXplZCBxdWVyeSBmb3IgdGhlIGFjdGlvbi5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoYWN0aW9uKSB7XG4gICAgY29uc3QgYWJpbGl0eUFjdGlvbiA9IHRoaXMuZnJvbnRlbmRNb2RlbEFiaWxpdHlBY3Rpb24oYWN0aW9uKVxuXG4gICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKCkuYWNjZXNzaWJsZUZvcihhYmlsaXR5QWN0aW9uLCB0aGlzLmN1cnJlbnRBYmlsaXR5KCkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBwcmltYXJ5IGtleSB2YWx1ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbCAtIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFByaW1hcnkga2V5IHZhbHVlIGFzIHN0cmluZy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5VmFsdWUobW9kZWwpIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5mcm9udGVuZE1vZGVsUHJpbWFyeUtleSgpXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZU1hcCA9IG1vZGVsLmdldE1vZGVsQ2xhc3MoKS5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwKClcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZU1hcFtjb2x1bW5OYW1lXSB8fCBjb2x1bW5OYW1lXG4gICAgY29uc3QgdmFsdWUgPSBtb2RlbC5yZWFkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgZmlsdGVyIGF1dGhvcml6ZWQgbW9kZWxzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIn0gYXJncy5hY3Rpb24gLSBGcm9udGVuZCBhY3Rpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSBhcmdzLm1vZGVscyAtIENhbmRpZGF0ZSBtb2RlbHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXT59IC0gQXV0aG9yaXplZCBtb2RlbHMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsRmlsdGVyQXV0aG9yaXplZE1vZGVscyh7YWN0aW9uLCBtb2RlbHN9KSB7XG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDApIHJldHVybiBtb2RlbHNcblxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5KClcbiAgICBjb25zdCBpZHMgPSBtb2RlbHMubWFwKChtb2RlbCkgPT4gdGhpcy5mcm9udGVuZE1vZGVsUHJpbWFyeUtleVZhbHVlKG1vZGVsKSlcbiAgICBjb25zdCBhdXRob3JpemVkUXVlcnkgPSB0aGlzLmZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoYWN0aW9uKS53aGVyZSh7W3ByaW1hcnlLZXldOiBpZHN9KVxuXG4gICAgY29uc3QgYXV0aG9yaXplZElkc1JhdyA9IGF3YWl0IGF1dGhvcml6ZWRRdWVyeS5wbHVjayhwcmltYXJ5S2V5KVxuXG4gICAgY29uc3QgYXV0aG9yaXplZElkcyA9IG5ldyBTZXQoYXV0aG9yaXplZElkc1Jhdy5tYXAoKGlkKSA9PiBTdHJpbmcoaWQpKSlcblxuICAgIHJldHVybiBtb2RlbHMuZmlsdGVyKChtb2RlbCkgPT4gYXV0aG9yaXplZElkcy5oYXModGhpcy5mcm9udGVuZE1vZGVsUHJpbWFyeUtleVZhbHVlKG1vZGVsKSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBydW4gZnJvbnRlbmQgbW9kZWwgYmVmb3JlIGFjdGlvbi5cbiAgICogQHBhcmFtIHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIn0gYWN0aW9uIC0gRnJvbnRlbmQgYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIGFjdGlvbiBzaG91bGQgY29udGludWUuXG4gICAqL1xuICBhc3luYyBydW5Gcm9udGVuZE1vZGVsQmVmb3JlQWN0aW9uKGFjdGlvbikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbFJlc291cmNlSW5zdGFuY2UoKS5iZWZvcmVBY3Rpb24oYWN0aW9uKVxuXG4gICAgcmV0dXJuIHJlc3VsdCAhPT0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGZpbmQgcmVjb3JkLlxuICAgKiBAcGFyYW0ge1wiZmluZFwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCJ9IGFjdGlvbiAtIEZyb250ZW5kIGFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gUmVjb3JkIGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbD59IC0gTG9jYXRlZCBtb2RlbCByZWNvcmQuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsRmluZFJlY29yZChhY3Rpb24sIGlkKSB7XG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKCkuZmluZChhY3Rpb24sIGlkKVxuXG4gICAgaWYgKCFtb2RlbCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGF1dGhvcml6ZWRNb2RlbHMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxGaWx0ZXJBdXRob3JpemVkTW9kZWxzKHthY3Rpb24sIG1vZGVsczogW21vZGVsXX0pXG5cbiAgICByZXR1cm4gYXV0aG9yaXplZE1vZGVsc1swXSB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBjcmVhdGUgcmVjb3JkLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhdHRyaWJ1dGVzIC0gQ3JlYXRlIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBbbmVzdGVkQXR0cmlidXRlc10gLSBPcHRpb25hbCBuZXN0ZWQtYXR0cmlidXRlIHBheWxvYWQgZm9yIGNhc2NhZGluZyB3cml0ZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsPn0gLSBDcmVhdGVkIG1vZGVsIHdoZW4gYXV0aG9yaXplZC5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kTW9kZWxDcmVhdGVSZWNvcmQoYXR0cmlidXRlcywgbmVzdGVkQXR0cmlidXRlcyA9IG51bGwpIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuZnJvbnRlbmRNb2RlbFJlc291cmNlSW5zdGFuY2UoKVxuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgcmVzb3VyY2UuY3JlYXRlKGF0dHJpYnV0ZXMsIHtuZXN0ZWRBdHRyaWJ1dGVzLCBjb250cm9sbGVyOiB0aGlzfSlcblxuICAgIGNvbnN0IGF1dGhvcml6ZWRNb2RlbHMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxGaWx0ZXJBdXRob3JpemVkTW9kZWxzKHthY3Rpb246IFwiY3JlYXRlXCIsIG1vZGVsczogW21vZGVsXX0pXG5cbiAgICBpZiAoYXV0aG9yaXplZE1vZGVscy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYXV0aG9yaXplZE1vZGVsc1swXVxuICAgIH1cblxuICAgIGF3YWl0IHJlc291cmNlLmhhbmRsZVVuYXV0aG9yaXplZENyZWF0ZWRNb2RlbChtb2RlbClcblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZWNvcmRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W10+fSAtIEZyb250ZW5kIG1vZGVsIHJlY29yZHMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsUmVjb3JkcygpIHtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKCkucmVjb3JkcygpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsRmlsdGVyQXV0aG9yaXplZE1vZGVscyh7YWN0aW9uOiBcImluZGV4XCIsIG1vZGVsc30pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBwcmVsb2FkLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkIHwgbnVsbH0gLSBGcm9udGVuZCBwcmVsb2FkIGRhdGEuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUHJlbG9hZCgpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFByZWxvYWQodGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCkucHJlbG9hZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHNlbGVjdC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IG51bGx9IC0gRnJvbnRlbmQgc2VsZWN0IGRhdGEuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsU2VsZWN0KCkge1xuICAgIHJldHVybiBub3JtYWxpemVGcm9udGVuZE1vZGVsU2VsZWN0KHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLnNlbGVjdCwgdGhpcy5mcm9udGVuZE1vZGVsQ2xhc3MoKS5nZXRNb2RlbE5hbWUoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHNlbGVjdHMgZXh0cmEuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCBudWxsfSAtIEZyb250ZW5kIGV4dHJhLXNlbGVjdCBkYXRhIChkZWZhdWx0cyBwbHVzIHRoZXNlKSwga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxTZWxlY3RzRXh0cmEoKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxTZWxlY3QodGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCkuc2VsZWN0c0V4dHJhLCB0aGlzLmZyb250ZW5kTW9kZWxDbGFzcygpLmdldE1vZGVsTmFtZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgc2VhcmNoZXMuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsU2VhcmNoW119IC0gRnJvbnRlbmQgc2VhcmNoIGZpbHRlcnMuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsU2VhcmNoZXMoKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxTZWFyY2hlcyh0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5zZWFyY2hlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHdoZXJlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSAtIEZyb250ZW5kIHdoZXJlIGZpbHRlcnMuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsV2hlcmUoKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxXaGVyZSh0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS53aGVyZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHJhbnNhY2suXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IC0gRnJvbnRlbmQgUmFuc2FjayBmaWx0ZXJzLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFJhbnNhY2soKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSYW5zYWNrKHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLnJhbnNhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBqb2lucy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gLSBGcm9udGVuZCBqb2lucyBkZXNjcmlwdG9ycy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxKb2lucygpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEpvaW5zKHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLmpvaW5zKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgc29ydC5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxTb3J0W119IC0gRnJvbnRlbmQgc29ydCBkZWZpbml0aW9ucy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxTb3J0KCkge1xuICAgIHJldHVybiBub3JtYWxpemVRdWVyeVNvcnQodGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCkuc29ydClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGdyb3VwLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbEdyb3VwW119IC0gRnJvbnRlbmQgZ3JvdXAgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsR3JvdXAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBub3JtYWxpemVRdWVyeUdyb3VwKHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLmdyb3VwKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yRm9yRXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcGFnaW5hdGlvbi5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxQYWdpbmF0aW9ufSAtIEZyb250ZW5kIHBhZ2luYXRpb24gcGFyYW1zLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFBhZ2luYXRpb24oKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKClcblxuICAgIHJldHVybiBub3JtYWxpemVGcm9udGVuZE1vZGVsUGFnaW5hdGlvbih7XG4gICAgICBsaW1pdDogcGFyYW1zLmxpbWl0LFxuICAgICAgb2Zmc2V0OiBwYXJhbXMub2Zmc2V0LFxuICAgICAgcGFnZTogcGFyYW1zLnBhZ2UsXG4gICAgICBwZXJQYWdlOiBwYXJhbXMucGVyUGFnZVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBkaXN0aW5jdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSAtIEZyb250ZW5kIGRpc3RpbmN0IGZsYWcgd2hlbiBwcm92aWRlZC5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxEaXN0aW5jdCgpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRnJvbnRlbmRNb2RlbERpc3RpbmN0KHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLmRpc3RpbmN0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcGx1Y2suXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUGx1Y2tbXX0gLSBGcm9udGVuZCBwbHVjayBkZWZpbml0aW9ucy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxQbHVjaygpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVF1ZXJ5UGx1Y2sodGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCkucGx1Y2spXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3JGb3JFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBjb3VudCByZXF1ZXN0ZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHJlcXVlc3QgYXNrcyBmb3IgYW4gYWdncmVnYXRlIGNvdW50LlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbENvdW50UmVxdWVzdGVkKCkge1xuICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5jb3VudCA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgd2l0aCBjb3VudC5cbiAgICogQHJldHVybnMge0FycmF5PHthdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0+fVxuICAgKiAgIEZyb250ZW5kIHdpdGhDb3VudCBlbnRyaWVzLiBFbXB0eSBhcnJheSB3aGVuIG5vdCByZXF1ZXN0ZWQuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsV2l0aENvdW50KCkge1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLndpdGhDb3VudFxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJhdykpIHJldHVybiBbXVxuXG4gICAgLyoqXG4gICAgICogRW50cmllcy5cbiAgICAgIEB0eXBlIHtBcnJheTx7YXR0cmlidXRlTmFtZTogc3RyaW5nLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgPz59Pn0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmF3KSB7XG4gICAgICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeSAhPT0gXCJvYmplY3RcIikgY29udGludWVcbiAgICAgIGlmICh0eXBlb2YgZW50cnkuYXR0cmlidXRlTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBlbnRyeS5hdHRyaWJ1dGVOYW1lLmxlbmd0aCA9PT0gMCkgY29udGludWVcbiAgICAgIGlmICh0eXBlb2YgZW50cnkucmVsYXRpb25zaGlwTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBlbnRyeS5yZWxhdGlvbnNoaXBOYW1lLmxlbmd0aCA9PT0gMCkgY29udGludWVcblxuICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgYXR0cmlidXRlTmFtZTogZW50cnkuYXR0cmlidXRlTmFtZSxcbiAgICAgICAgcmVsYXRpb25zaGlwTmFtZTogZW50cnkucmVsYXRpb25zaGlwTmFtZSxcbiAgICAgICAgd2hlcmU6IGVudHJ5LndoZXJlICYmIHR5cGVvZiBlbnRyeS53aGVyZSA9PT0gXCJvYmplY3RcIiA/IGVudHJ5LndoZXJlIDogdW5kZWZpbmVkXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhbiBlbnRyeSBmcm9tIHRoZSBmcm9udGVuZC1tb2RlbCBgYWJpbGl0aWVzYCBwYXlsb2FkIHRvXG4gICAqIGl0cyBiYWNrZW5kIG1vZGVsIGNsYXNzIGJ5IGxvb2tpbmcgdXAgdGhlIHJlc291cmNlIGJ5IG1vZGVsTmFtZVxuICAgKiBhY3Jvc3MgYWxsIGNvbmZpZ3VyZWQgYmFja2VuZCBwcm9qZWN0cy4gUmV0dXJucyBudWxsIHdoZW4gbm9cbiAgICogcmVzb3VyY2UgbWF0Y2hlcyDigJQgdGhlIHNwZWMgZW50cnkgaXMgdGhlbiBzaWxlbnRseSBpZ25vcmVkIHNvIGFcbiAgICogY2FsbGVyIHJlcXVlc3RpbmcgYWJpbGl0aWVzIGZvciBhIG1vZGVsIHRoZXkgY2Fubm90IHJlc29sdmUgZG9lc1xuICAgKiBub3QgY3Jhc2ggdGhlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH1cbiAgICovXG4gIF9mcm9udGVuZE1vZGVsQ2xhc3NGb3JBYmlsaXRpZXMobW9kZWxOYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBtb2RlbE5hbWUgIT09IFwic3RyaW5nXCIgfHwgbW9kZWxOYW1lLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24/LmdldEJhY2tlbmRQcm9qZWN0cz8uKCkgPz8gW11cblxuICAgIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgICBjb25zdCBmcm9udGVuZE1vZGVscyA9IGJhY2tlbmRQcm9qZWN0Py5mcm9udGVuZE1vZGVsc1xuICAgICAgaWYgKCFmcm9udGVuZE1vZGVscyB8fCB0eXBlb2YgZnJvbnRlbmRNb2RlbHMgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IGZyb250ZW5kTW9kZWxzW21vZGVsTmFtZV1cbiAgICAgIGlmICghcmVzb3VyY2VEZWZpbml0aW9uKSBjb250aW51ZVxuXG4gICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG4gICAgICBpZiAoIXJlc291cmNlQ2xhc3MpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0eXBlb2YgcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyByZXNvdXJjZUNsYXNzLm1vZGVsQ2xhc3MoKVxuICAgICAgICA6IHJlc291cmNlQ2xhc3MuTW9kZWxDbGFzc1xuXG4gICAgICBpZiAodHlwZW9mIG1vZGVsQ2xhc3MgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG1vZGVsQ2xhc3NcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgZXZlcnkgbG9hZGVkIHJlY29yZCB3aG9zZSBgZ2V0TW9kZWxOYW1lKClgIG1hdGNoZXMgdGhlXG4gICAqIHJlcXVlc3RlZCBuYW1lLCB3YWxraW5nIGFjcm9zcyB0aGUgcm9vdC1sZXZlbCBzbGljZSBwbHVzIGFueVxuICAgKiBwcmVsb2FkZWQgcmVsYXRpb25zaGlwcyBhdCBhbnkgZGVwdGguIFVzZWQgdG8gZXZhbHVhdGUgcGVyLXJlY29yZFxuICAgKiBhYmlsaXRpZXMgYWdhaW5zdCBuZXN0ZWQgcHJlbG9hZGVkIGNoaWxkcmVuIHdpdGggYSBzaW5nbGUgYmF0Y2hlZFxuICAgKiBxdWVyeSBwZXIgKG1vZGVsQ2xhc3MsIGFjdGlvbikgcGFpci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IHJvb3RNb2RlbHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfVxuICAgKi9cbiAgX2Zyb250ZW5kTW9kZWxDb2xsZWN0UmVjb3Jkc0Zvck5hbWUocm9vdE1vZGVscywgbW9kZWxOYW1lKSB7XG4gICAgLyoqXG4gICAgICogT3V0LlxuICAgICAgQHR5cGUge2ltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gKi9cbiAgICBjb25zdCBvdXQgPSBbXVxuICAgIC8qKlxuICAgICAqIFNlZW4uXG4gICAgICBAdHlwZSB7U2V0PGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KClcblxuICAgIC8qKlxuICAgICAqIFdhbGsuXG4gICAgICBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsIHwgdW5kZWZpbmVkfSByZWNvcmQgKi9cbiAgICBjb25zdCB3YWxrID0gKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKCFyZWNvcmQgfHwgdHlwZW9mIHJlY29yZCAhPT0gXCJvYmplY3RcIikgcmV0dXJuXG4gICAgICBpZiAoc2Vlbi5oYXMocmVjb3JkKSkgcmV0dXJuXG4gICAgICBzZWVuLmFkZChyZWNvcmQpXG5cbiAgICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSB0eXBlb2YgcmVjb3JkLmdldE1vZGVsQ2xhc3MgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IHJlY29yZC5nZXRNb2RlbENsYXNzKClcbiAgICAgICAgOiBudWxsXG4gICAgICBpZiAoTW9kZWxDbGFzcyAmJiB0eXBlb2YgTW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUgPT09IFwiZnVuY3Rpb25cIiAmJiBNb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpID09PSBtb2RlbE5hbWUpIHtcbiAgICAgICAgb3V0LnB1c2gocmVjb3JkKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBzTWFwID0gdHlwZW9mIE1vZGVsQ2xhc3M/LmdldFJlbGF0aW9uc2hpcHNNYXAgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IE1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwc01hcCgpXG4gICAgICAgIDogbnVsbFxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBzTWFwKSByZXR1cm5cblxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIE9iamVjdC5rZXlzKHJlbGF0aW9uc2hpcHNNYXApKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHR5cGVvZiByZWNvcmQuZ2V0UmVsYXRpb25zaGlwQnlOYW1lID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHJlY29yZC5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSlcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgaWYgKCFyZWxhdGlvbnNoaXAgfHwgdHlwZW9mIHJlbGF0aW9uc2hpcC5nZXRMb2FkZWRPclVuZGVmaW5lZCAhPT0gXCJmdW5jdGlvblwiKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IHJlbGF0aW9uc2hpcC5nZXRMb2FkZWRPclVuZGVmaW5lZCgpXG4gICAgICAgIGlmIChsb2FkZWQgPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsb2FkZWQpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBsb2FkZWQpIHdhbGsoY2hpbGQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2Fsayhsb2FkZWQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdE1vZGVscykgd2Fsayhyb290KVxuXG4gICAgcmV0dXJuIG91dFxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlIGV2ZXJ5IGFiaWxpdHkgcmVxdWVzdGVkIHZpYSB0aGUgZnJvbnRlbmQgYGFiaWxpdGllc2BcbiAgICogcGFyYW0gYWdhaW5zdCB0aGUgbG9hZGVkIG1vZGVsIGNvaG9ydCAocGx1cyBhbnkgcHJlbG9hZGVkXG4gICAqIGNoaWxkcmVuKSwgYXR0YWNoaW5nIHRoZSByZXN1bHRzIHRvIGVhY2ggcmVjb3JkIHZpYVxuICAgKiBgX3NldENvbXB1dGVkQWJpbGl0eWAuIFJ1bnMgb25lIGJhdGNoZWQgYGF1dGhvcml6ZWQgcXVlcnkgKyBwbHVja2BcbiAgICogcGVyIChtb2RlbENsYXNzLCBhY3Rpb24pIHBhaXIsIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgcmVjb3Jkc1xuICAgKiB3ZXJlIGxvYWRlZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IHJvb3RNb2RlbHNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsQ29tcHV0ZUFiaWxpdGllcyhyb290TW9kZWxzKSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMuZnJvbnRlbmRNb2RlbEFiaWxpdGllcygpXG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocm9vdE1vZGVscykgfHwgcm9vdE1vZGVscy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgYWJpbGl0eSA9IHRoaXMuY3VycmVudEFiaWxpdHkoKVxuICAgIGlmICghYWJpbGl0eSkgcmV0dXJuXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLl9mcm9udGVuZE1vZGVsQ2xhc3NGb3JBYmlsaXRpZXMoZW50cnkubW9kZWxOYW1lKVxuICAgICAgaWYgKCFtb2RlbENsYXNzKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gdGhpcy5fZnJvbnRlbmRNb2RlbENvbGxlY3RSZWNvcmRzRm9yTmFtZShyb290TW9kZWxzLCBlbnRyeS5tb2RlbE5hbWUpXG4gICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSBtb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICAgICAgY29uc3QgaWRzID0gY2FuZGlkYXRlc1xuICAgICAgICAubWFwKChyZWNvcmQpID0+IHJlY29yZC5yZWFkQXR0cmlidXRlKHByaW1hcnlLZXkpKVxuICAgICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSBjb250aW51ZVxuXG4gICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBlbnRyeS5hY3Rpb25zKSB7XG4gICAgICAgIGxldCBhbGxvd2VkSWRzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXV0aG9yaXplZFF1ZXJ5ID0gbW9kZWxDbGFzcy5hY2Nlc3NpYmxlRm9yKGFjdGlvbiwgYWJpbGl0eSkud2hlcmUoe1twcmltYXJ5S2V5XTogaWRzfSlcbiAgICAgICAgICBjb25zdCBwbHVja2VkID0gYXdhaXQgYXV0aG9yaXplZFF1ZXJ5LnBsdWNrKHByaW1hcnlLZXkpXG4gICAgICAgICAgYWxsb3dlZElkcyA9IG5ldyBTZXQocGx1Y2tlZC5tYXAoKHZhbHVlKSA9PiBTdHJpbmcodmFsdWUpKSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBBbiBhYmlsaXR5IHdpdGggbm8gYWxsb3cgcnVsZXMgZm9yIHRoZSBhY3Rpb24gdGhyb3dzIHZpYVxuICAgICAgICAgIC8vIGBhY2Nlc3NpYmxlRm9yYDsgdHJlYXQgYXMgYSB1bml2ZXJzYWwgZGVueSBzbyB0aGUgZnJvbnRlbmRcbiAgICAgICAgICAvLyBnZXRzIGBjYW4oYWN0aW9uKSA9PT0gZmFsc2VgIGZvciBldmVyeSBjYW5kaWRhdGUsIGluc3RlYWRcbiAgICAgICAgICAvLyBvZiBzdXJmYWNpbmcgYW4gZXJyb3IgdGhhdCB0aGUgVUkgY2FuJ3QgYWN0IG9uLlxuICAgICAgICAgIHZvaWQgZXJyb3JcbiAgICAgICAgICBhbGxvd2VkSWRzID0gbmV3IFNldCgpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgY29uc3QgaWRWYWx1ZSA9IHJlY29yZC5yZWFkQXR0cmlidXRlKHByaW1hcnlLZXkpXG4gICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGlkVmFsdWUgIT09IG51bGwgJiYgaWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGFsbG93ZWRJZHMuaGFzKFN0cmluZyhpZFZhbHVlKSlcbiAgICAgICAgICByZWNvcmQuX3NldENvbXB1dGVkQWJpbGl0eShhY3Rpb24sIGFsbG93ZWQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdGhlIGZyb250ZW5kLW1vZGVsIGBhYmlsaXRpZXNgIHBhcmFtIGludG8gYSBsaXN0IG9mXG4gICAqIGB7bW9kZWxOYW1lLCBhY3Rpb25zfWAgZW50cmllcyB0byBldmFsdWF0ZSBhZ2FpbnN0IGxvYWRlZCByZWNvcmRzLlxuICAgKiBVbmtub3duIGVudHJpZXMgYXJlIHNpbGVudGx5IHNraXBwZWQg4oCUIGRvd25zdHJlYW0gY29kZSByZXNvbHZlc1xuICAgKiBtb2RlbCBuYW1lcyB0byBjbGFzc2VzIHdoZW4gYXBwbHlpbmcgdGhlIGNoZWNrLCBzbyB1bnJlc29sdmVkXG4gICAqIG5hbWVzIG5hdHVyYWxseSBiZWNvbWUgbm8tb3BzLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8e21vZGVsTmFtZTogc3RyaW5nLCBhY3Rpb25zOiBzdHJpbmdbXX0+fVxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbEFiaWxpdGllcygpIHtcbiAgICBjb25zdCByYXcgPSB0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5hYmlsaXRpZXNcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShyYXcpKSByZXR1cm4gW11cblxuICAgIC8qKlxuICAgICAqIEVudHJpZXMuXG4gICAgICBAdHlwZSB7QXJyYXk8e21vZGVsTmFtZTogc3RyaW5nLCBhY3Rpb25zOiBzdHJpbmdbXX0+fSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiByYXcpIHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiKSBjb250aW51ZVxuICAgICAgaWYgKHR5cGVvZiBlbnRyeS5tb2RlbE5hbWUgIT09IFwic3RyaW5nXCIgfHwgZW50cnkubW9kZWxOYW1lLmxlbmd0aCA9PT0gMCkgY29udGludWVcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyeS5hY3Rpb25zKSkgY29udGludWVcblxuICAgICAgY29uc3QgYWN0aW9ucyA9IGVudHJ5LmFjdGlvbnMuZmlsdGVyKFxuICAgICAgICAoLyoqXG4gICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICBAdHlwZSB7P30gKi8gYWN0aW9uKSA9PiB0eXBlb2YgYWN0aW9uID09PSBcInN0cmluZ1wiICYmIGFjdGlvbi5sZW5ndGggPiAwXG4gICAgICApXG5cbiAgICAgIGlmIChhY3Rpb25zLmxlbmd0aCA9PT0gMCkgY29udGludWVcblxuICAgICAgZW50cmllcy5wdXNoKHthY3Rpb25zLCBtb2RlbE5hbWU6IGVudHJ5Lm1vZGVsTmFtZX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBmcm9udGVuZC1tb2RlbCBgcXVlcnlEYXRhYCBwYXJhbS4gVGhlIHdpcmUgZm9ybWF0IGNhcnJpZXNcbiAgICogb25seSAqKm5hbWVzKiogKHRoZSBrZXlzIHRoZSBmcm9udGVuZCB3YW50cyBhdHRhY2hlZCkgcGx1cyB0aGVcbiAgICogb3B0aW9uYWwgbmVzdGVkLXJlbGF0aW9uc2hpcCBjaGFpbiBsZWFkaW5nIHRvIHRoZW0g4oCUIHRoZSBhY3R1YWwgU1FMXG4gICAqIGZyYWdtZW50cyBsaXZlIG9uIHRoZSBiYWNrZW5kIG1vZGVsIGFzIGBNb2RlbC5xdWVyeURhdGEobmFtZSwgZm4pYFxuICAgKiByZWdpc3RyYXRpb25zLiBDYWxsZXJzIGNhbm5vdCBwdXNoIFNRTCB0aHJvdWdoIHRoaXMgZW5kcG9pbnQuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIHJhdyBuZXN0ZWQtcmVjb3JkIHNwZWMgKHNoYXBlIHZhbGlkYXRlZCBieSB0aGVcbiAgICogbm9ybWFsaXplciBpbnNpZGUgYFF1ZXJ5LnF1ZXJ5RGF0YWApIG9yIGBudWxsYCB3aGVuIG5vdCByZXF1ZXN0ZWQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L3F1ZXJ5LWRhdGEuanNcIikuUXVlcnlEYXRhU3BlYyB8IG51bGx9XG4gICAqL1xuICBmcm9udGVuZE1vZGVsUXVlcnlEYXRhKCkge1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLnF1ZXJ5RGF0YVxuXG4gICAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIpIHJldHVybiByYXdcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSByZXR1cm4gcmF3XG4gICAgaWYgKHR5cGVvZiByYXcgPT09IFwib2JqZWN0XCIpIHJldHVybiByYXdcblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBpbmRleCBxdWVyeS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gLSBGcm9udGVuZCBpbmRleCBxdWVyeSB3aXRoIG5vcm1hbGl6ZWQgcGFyYW1zIGFwcGxpZWQuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsSW5kZXhRdWVyeSgpIHtcbiAgICBsZXQgcXVlcnkgPSB0aGlzLmZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoXCJpbmRleFwiKVxuICAgIGNvbnN0IHByZWxvYWQgPSB0aGlzLmZyb250ZW5kTW9kZWxQcmVsb2FkKClcblxuICAgIGlmIChwcmVsb2FkKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LnByZWxvYWQocHJlbG9hZClcbiAgICB9XG5cbiAgICBjb25zdCBqb2lucyA9IHRoaXMuZnJvbnRlbmRNb2RlbEpvaW5zKClcbiAgICBjb25zdCB3aGVyZSA9IHRoaXMuZnJvbnRlbmRNb2RlbFdoZXJlKClcbiAgICBjb25zdCBwYWdpbmF0aW9uID0gdGhpcy5mcm9udGVuZE1vZGVsUGFnaW5hdGlvbigpXG4gICAgY29uc3QgZGlzdGluY3QgPSB0aGlzLmZyb250ZW5kTW9kZWxEaXN0aW5jdCgpXG5cbiAgICB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbFBhZ2luYXRpb24oe3BhZ2luYXRpb24sIHF1ZXJ5fSlcblxuICAgIGlmIChkaXN0aW5jdCAhPT0gbnVsbCkge1xuICAgICAgcXVlcnkuZGlzdGluY3QoZGlzdGluY3QpXG4gICAgfVxuXG4gICAgaWYgKHdoZXJlKSB7XG4gICAgICB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbFdoZXJlKHtxdWVyeSwgd2hlcmV9KVxuICAgIH1cblxuICAgIGNvbnN0IHJhbnNhY2sgPSB0aGlzLmZyb250ZW5kTW9kZWxSYW5zYWNrKClcblxuICAgIGlmIChyYW5zYWNrKSB7XG4gICAgICBxdWVyeS5yYW5zYWNrKHJhbnNhY2spXG4gICAgfVxuXG4gICAgaWYgKGpvaW5zKSB7XG4gICAgICB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbEpvaW5zKHtqb2lucywgcXVlcnl9KVxuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaGVzID0gdGhpcy5mcm9udGVuZE1vZGVsU2VhcmNoZXMoKVxuXG4gICAgZm9yIChjb25zdCBzZWFyY2ggb2Ygc2VhcmNoZXMpIHtcbiAgICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsU2VhcmNoKHtxdWVyeSwgc2VhcmNofSlcbiAgICB9XG5cbiAgICBjb25zdCBncm91cHMgPSB0aGlzLmZyb250ZW5kTW9kZWxHcm91cCgpXG5cbiAgICBpZiAoZ3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsUm9vdEdyb3VwQ29sdW1ucyh7cXVlcnl9KVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbEdyb3VwKHtncm91cCwgcXVlcnl9KVxuICAgIH1cblxuICAgIGNvbnN0IHNvcnRzID0gdGhpcy5mcm9udGVuZE1vZGVsU29ydCgpXG5cbiAgICBpZiAoc29ydHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBzb3J0IG9mIHNvcnRzKSB7XG4gICAgICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsU29ydCh7cXVlcnksIHNvcnR9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhDb3VudCA9IHRoaXMuZnJvbnRlbmRNb2RlbFdpdGhDb3VudCgpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHdpdGhDb3VudCkge1xuICAgICAgLyoqXG4gICAgICAgKiBTcGVjLlxuICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHtyZWxhdGlvbnNoaXA/OiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgPz59Pn0gKi9cbiAgICAgIGNvbnN0IHNwZWMgPSB7fVxuICAgICAgc3BlY1tlbnRyeS5hdHRyaWJ1dGVOYW1lXSA9IHtyZWxhdGlvbnNoaXA6IGVudHJ5LnJlbGF0aW9uc2hpcE5hbWUsIHdoZXJlOiBlbnRyeS53aGVyZX1cbiAgICAgIHF1ZXJ5LndpdGhDb3VudChzcGVjKVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5RGF0YSA9IHRoaXMuZnJvbnRlbmRNb2RlbFF1ZXJ5RGF0YSgpXG5cbiAgICBpZiAocXVlcnlEYXRhICE9IG51bGwpIHtcbiAgICAgIHF1ZXJ5LnF1ZXJ5RGF0YShxdWVyeURhdGEpXG4gICAgfVxuXG4gICAgcXVlcnkgPSB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbFRyYW5zbGF0ZWRBdHRyaWJ1dGVQcmVsb2Fkcyh7cXVlcnl9KVxuXG4gICAgaWYgKHF1ZXJ5Ll9kaXN0aW5jdCAmJiBxdWVyeS5kcml2ZXIuZ2V0VHlwZSgpID09PSBcIm1zc3FsXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxNc3NxbERpc3RpbmN0QnlQcmltYXJ5S2V5UXVlcnkoe3F1ZXJ5fSlcbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcnlcbiAgfVxuXG4gIC8qKlxuICAgKiBNU1NRTCBjYW5ub3QgYXBwbHkgRElTVElOQ1Qgb3ZlciBub24tY29tcGFyYWJsZSB0ZXh0IGNvbHVtbnMgaW4gdGFibGUuKiBzZWxlY3RzLlxuICAgKiBUaGlzIHJld3JpdGVzIGRpc3RpbmN0IGZyb250ZW5kLW1vZGVsIHF1ZXJpZXMgdG8gc2VsZWN0IHJvb3QgcmVjb3JkcyBieSBkaXN0aW5jdCBQSyBzdWJxdWVyeS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IHdpdGggZGlzdGluY3QgYW5kIGZpbHRlcnMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IC0gTVNTUUwtc2FmZSBkaXN0aW5jdCBxdWVyeS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxNc3NxbERpc3RpbmN0QnlQcmltYXJ5S2V5UXVlcnkoe3F1ZXJ5fSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLmZyb250ZW5kTW9kZWxDbGFzcygpXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgY29uc3Qgcm9vdFRhYmxlU3FsID0gcXVlcnkuZHJpdmVyLnF1b3RlVGFibGUobW9kZWxDbGFzcy50YWJsZU5hbWUoKSlcbiAgICBjb25zdCBwcmltYXJ5S2V5U3FsID0gYCR7cm9vdFRhYmxlU3FsfS4ke3F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihwcmltYXJ5S2V5KX1gXG4gICAgY29uc3QgZGlzdGluY3RJZHNRdWVyeSA9IHF1ZXJ5LmNsb25lKClcblxuICAgIGRpc3RpbmN0SWRzUXVlcnkuX3ByZWxvYWQgPSB7fVxuICAgIGRpc3RpbmN0SWRzUXVlcnkuX3NlbGVjdHMgPSBbXVxuICAgIGRpc3RpbmN0SWRzUXVlcnkuc2VsZWN0KHByaW1hcnlLZXlTcWwpXG4gICAgZGlzdGluY3RJZHNRdWVyeS5kaXN0aW5jdCh0cnVlKVxuXG4gICAgY29uc3QgZGlzdGluY3RSb290UXVlcnkgPSBtb2RlbENsYXNzLl9uZXdRdWVyeSgpXG5cbiAgICBkaXN0aW5jdFJvb3RRdWVyeS53aGVyZShgJHtwcmltYXJ5S2V5U3FsfSBJTiAoJHtkaXN0aW5jdElkc1F1ZXJ5LnRvU3FsKCl9KWApXG4gICAgZGlzdGluY3RSb290UXVlcnkuX3ByZWxvYWQgPSB7Li4ucXVlcnkuX3ByZWxvYWR9XG5cbiAgICByZXR1cm4gZGlzdGluY3RSb290UXVlcnlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHBsdWNrIHZhbHVlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBQbHVjayBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxQbHVja1tdfSBhcmdzLnBsdWNrIC0gUGx1Y2sgZGVzY3JpcHRvcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PD8+Pn0gLSBQbHVja2VkIHZhbHVlcy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kTW9kZWxQbHVja1ZhbHVlcyh7cXVlcnksIHBsdWNrfSkge1xuICAgIGlmIChwbHVjay5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb2x1bW5zIGdpdmVuIHRvIHBsdWNrXCIpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICBjb25zdCBwbHVja1F1ZXJ5ID0gcXVlcnkuY2xvbmUoKVxuICAgIC8qKlxuICAgICAqIEFsaWFzZXMuXG4gICAgICBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgY29uc3QgYWxpYXNlcyA9IFtdXG4gICAgY29uc3QgcXVlcnlNZXRhZGF0YSA9IGZyb250ZW5kTW9kZWxRdWVyeU1ldGFkYXRhKHF1ZXJ5KVxuICAgIGNvbnN0IHBsdWNrUXVlcnlNZXRhZGF0YSA9IGZyb250ZW5kTW9kZWxRdWVyeU1ldGFkYXRhKHBsdWNrUXVlcnkpXG4gICAgY29uc3Qgam9pbmVkUGF0aHMgPSBxdWVyeU1ldGFkYXRhW2Zyb250ZW5kTW9kZWxKb2luZWRQYXRoc1N5bWJvbF1cblxuICAgIHBsdWNrUXVlcnkuX3ByZWxvYWQgPSB7fVxuICAgIHBsdWNrUXVlcnkuX3NlbGVjdHMgPSBbXVxuICAgIHBsdWNrUXVlcnlNZXRhZGF0YVtmcm9udGVuZE1vZGVsSm9pbmVkUGF0aHNTeW1ib2xdID0gam9pbmVkUGF0aHMgPyBuZXcgU2V0KGpvaW5lZFBhdGhzKSA6IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBbcGx1Y2tJbmRleCwgcGx1Y2tFbnRyeV0gb2YgcGx1Y2suZW50cmllcygpKSB7XG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsU2VhcmNoVGFyZ2V0TW9kZWxDbGFzcyh7XG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIHBhdGg6IHBsdWNrRW50cnkucGF0aFxuICAgICAgfSlcbiAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVGcm9udGVuZE1vZGVsQ29sdW1uTmFtZSh0YXJnZXRNb2RlbENsYXNzLCBwbHVja0VudHJ5LmNvbHVtbilcblxuICAgICAgaWYgKCFjb2x1bW5OYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwbHVjayBjb2x1bW4gXCIke3BsdWNrRW50cnkuY29sdW1ufVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAocGx1Y2tFbnRyeS5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsSm9pblBhdGgoe3BhdGg6IHBsdWNrRW50cnkucGF0aCwgcXVlcnk6IHBsdWNrUXVlcnl9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YWJsZVJlZmVyZW5jZSA9IHBsdWNrUXVlcnkuZ2V0VGFibGVSZWZlcmVuY2VGb3JKb2luKC4uLnBsdWNrRW50cnkucGF0aClcbiAgICAgIGNvbnN0IGNvbHVtblNxbCA9IGAke3BsdWNrUXVlcnkuZHJpdmVyLnF1b3RlVGFibGUodGFibGVSZWZlcmVuY2UpfS4ke3BsdWNrUXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfWBcbiAgICAgIGNvbnN0IGFsaWFzID0gYGZyb250ZW5kX21vZGVsX3BsdWNrXyR7cGx1Y2tJbmRleH1gXG5cbiAgICAgIHBsdWNrUXVlcnkuc2VsZWN0KGAke2NvbHVtblNxbH0gQVMgJHtwbHVja1F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihhbGlhcyl9YClcbiAgICAgIGFsaWFzZXMucHVzaChhbGlhcylcbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gYXdhaXQgcGx1Y2tRdWVyeS5yZXN1bHRzKClcblxuICAgIGlmIChhbGlhc2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgW2FsaWFzXSA9IGFsaWFzZXNcblxuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChyb3cpW2FsaWFzXSlcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgY29uc3Qgcm93SGFzaCA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChyb3cpXG5cbiAgICAgIHJldHVybiBhbGlhc2VzLm1hcCgoYWxpYXMpID0+IHJvd0hhc2hbYWxpYXNdKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBzZWFyY2ggdGFyZ2V0IG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlYXJjaCBhcmdzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxTZWFyY2hUYXJnZXRNb2RlbENsYXNzKHttb2RlbENsYXNzLCBwYXRofSkge1xuICAgIGxldCB0YXJnZXRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIHBhdGgpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHRhcmdldE1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwc01hcCgpW3JlbGF0aW9uc2hpcE5hbWVdXG5cbiAgICAgIGlmICghcmVsYXRpb25zaGlwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWFyY2ggcmVsYXRpb25zaGlwIFwiJHtyZWxhdGlvbnNoaXBOYW1lfVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBUYXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcFRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXJnZXQgbW9kZWwgY2xhc3MgZm9yICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfSMke3JlbGF0aW9uc2hpcE5hbWV9YClcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcFRhcmdldE1vZGVsQ2xhc3NcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0TW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXBwbHkgZnJvbnRlbmQgbW9kZWwgc2VhcmNoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlYXJjaCBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxTZWFyY2h9IGFyZ3Muc2VhcmNoIC0gU2VhcmNoIGZpbHRlci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxTZWFyY2goe3F1ZXJ5LCBzZWFyY2h9KSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsU2VhcmNoVGFyZ2V0TW9kZWxDbGFzcyh7XG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgcGF0aDogc2VhcmNoLnBhdGhcbiAgICB9KVxuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVGcm9udGVuZE1vZGVsQ29sdW1uTmFtZSh0YXJnZXRNb2RlbENsYXNzLCBzZWFyY2guY29sdW1uKVxuXG4gICAgaWYgKCFjb2x1bW5OYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc2VhcmNoIGNvbHVtbiBcIiR7c2VhcmNoLmNvbHVtbn1cIiBmb3IgJHt0YXJnZXRNb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsSm9pblBhdGgoe3BhdGg6IHNlYXJjaC5wYXRoLCBxdWVyeX0pXG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVSZWZlcmVuY2UgPSBxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oLi4uc2VhcmNoLnBhdGgpXG4gICAgY29uc3QgY29sdW1uU3FsID0gYCR7cXVlcnkuZHJpdmVyLnF1b3RlVGFibGUodGFibGVSZWZlcmVuY2UpfS4ke3F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX1gXG4gICAgY29uc3Qgb3BlcmF0b3JNYXAgPSB7XG4gICAgICBlcTogXCI9XCIsXG4gICAgICBndDogXCI+XCIsXG4gICAgICBndGVxOiBcIj49XCIsXG4gICAgICBsaWtlOiBcIkxJS0VcIixcbiAgICAgIGx0OiBcIjxcIixcbiAgICAgIGx0ZXE6IFwiPD1cIixcbiAgICAgIG5vdEVxOiBcIiE9XCJcbiAgICB9XG4gICAgY29uc3Qgc3FsT3BlcmF0b3IgPSBvcGVyYXRvck1hcFtzZWFyY2gub3BlcmF0b3JdXG5cbiAgICBpZiAoc2VhcmNoLm9wZXJhdG9yID09PSBcImVxXCIpIHtcbiAgICAgIGlmICh0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbEFycmF5U2VhcmNoKHtlbXB0eVNxbDogXCIxPTBcIiwgb3BlcmF0b3JTcWw6IFwiSU5cIiwgcXVlcnksIHNlYXJjaCwgY29sdW1uU3FsfSkpIHJldHVyblxuXG4gICAgICBpZiAoc2VhcmNoLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGAke2NvbHVtblNxbH0gSVMgTlVMTGApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzZWFyY2gub3BlcmF0b3IgPT09IFwibm90RXFcIikge1xuICAgICAgaWYgKHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsQXJyYXlTZWFyY2goe2VtcHR5U3FsOiBcIjE9MVwiLCBvcGVyYXRvclNxbDogXCJOT1QgSU5cIiwgcXVlcnksIHNlYXJjaCwgY29sdW1uU3FsfSkpIHJldHVyblxuXG4gICAgICBpZiAoc2VhcmNoLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGAke2NvbHVtblNxbH0gSVMgTk9UIE5VTExgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBxdWVyeS53aGVyZShgJHtjb2x1bW5TcWx9ICR7c3FsT3BlcmF0b3J9ICR7cXVlcnkuZHJpdmVyLnF1b3RlKHNlYXJjaC52YWx1ZSl9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhcnJheS12YWx1ZWQgZXF1YWxpdHkgc2VhcmNoIGZpbHRlcnMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gU2VhcmNoIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29sdW1uU3FsIC0gU1FMIGZvciB0aGUgc2VhcmNoZWQgY29sdW1uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5lbXB0eVNxbCAtIFNRTCBwcmVkaWNhdGUgdXNlZCB3aGVuIHRoZSBhcnJheSBpcyBlbXB0eS5cbiAgICogQHBhcmFtIHtcIklOXCIgfCBcIk5PVCBJTlwifSBhcmdzLm9wZXJhdG9yU3FsIC0gU1FMIGFycmF5IG9wZXJhdG9yLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxTZWFyY2h9IGFyZ3Muc2VhcmNoIC0gU2VhcmNoIGRlc2NyaXB0b3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYW4gYXJyYXkgcHJlZGljYXRlIHdhcyBhcHBsaWVkLlxuICAgKi9cbiAgYXBwbHlGcm9udGVuZE1vZGVsQXJyYXlTZWFyY2goe2NvbHVtblNxbCwgZW1wdHlTcWwsIG9wZXJhdG9yU3FsLCBxdWVyeSwgc2VhcmNofSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzZWFyY2gudmFsdWUpKSByZXR1cm4gZmFsc2VcblxuICAgIGlmIChzZWFyY2gudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBxdWVyeS53aGVyZShlbXB0eVNxbClcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkud2hlcmUoYCR7Y29sdW1uU3FsfSAke29wZXJhdG9yU3FsfSAoJHtzZWFyY2gudmFsdWUubWFwKChlbnRyeSkgPT4gcXVlcnkuZHJpdmVyLnF1b3RlKGVudHJ5KSkuam9pbihcIiwgXCIpfSlgKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBseSBmcm9udGVuZCBtb2RlbCBwYWdpbmF0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFBhZ2luYXRpb24gYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUGFnaW5hdGlvbn0gYXJncy5wYWdpbmF0aW9uIC0gUGFnaW5hdGlvbiB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXBwbHlGcm9udGVuZE1vZGVsUGFnaW5hdGlvbih7cXVlcnksIHBhZ2luYXRpb259KSB7XG4gICAgaWYgKHBhZ2luYXRpb24ubGltaXQgIT09IG51bGwpIHtcbiAgICAgIHF1ZXJ5LmxpbWl0KHBhZ2luYXRpb24ubGltaXQpXG4gICAgfVxuXG4gICAgaWYgKHBhZ2luYXRpb24ub2Zmc2V0ICE9PSBudWxsKSB7XG4gICAgICBxdWVyeS5vZmZzZXQocGFnaW5hdGlvbi5vZmZzZXQpXG4gICAgfVxuXG4gICAgaWYgKHBhZ2luYXRpb24ucGVyUGFnZSAhPT0gbnVsbCkge1xuICAgICAgcXVlcnkucGVyUGFnZShwYWdpbmF0aW9uLnBlclBhZ2UpXG4gICAgfVxuXG4gICAgaWYgKHBhZ2luYXRpb24ucGFnZSAhPT0gbnVsbCkge1xuICAgICAgcXVlcnkucGFnZShwYWdpbmF0aW9uLnBhZ2UpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXBwbHkgZnJvbnRlbmQgbW9kZWwgd2hlcmUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gV2hlcmUgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy53aGVyZSAtIFJvb3QtbW9kZWwgd2hlcmUgY29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxXaGVyZSh7cXVlcnksIHdoZXJlfSkge1xuICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsV2hlcmVGb3JQYXRoKHtcbiAgICAgIG1vZGVsQ2xhc3M6IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKCksXG4gICAgICBwYXRoOiBbXSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgd2hlcmVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXBwbHkgZnJvbnRlbmQgbW9kZWwgam9pbnMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSm9pbnMgYXJncy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy5qb2lucyAtIFJlbGF0aW9uc2hpcC1vYmplY3Qgam9pbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXBwbHlGcm9udGVuZE1vZGVsSm9pbnMoe2pvaW5zLCBxdWVyeX0pIHtcbiAgICBjb25zdCBqb2luUGF0aEtleXMgPSBuZXcgU2V0KClcblxuICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsSm9pbnNGb3JQYXRoKHtcbiAgICAgIGpvaW5zLFxuICAgICAgam9pblBhdGhLZXlzLFxuICAgICAgbW9kZWxDbGFzczogdGhpcy5mcm9udGVuZE1vZGVsQ2xhc3MoKSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgcXVlcnlcbiAgICB9KVxuXG4gICAgcXVlcnkuam9pbnMoam9pbnMpXG5cbiAgICBjb25zdCBxdWVyeU1ldGFkYXRhID0gZnJvbnRlbmRNb2RlbFF1ZXJ5TWV0YWRhdGEocXVlcnkpXG4gICAgY29uc3Qgam9pbmVkUGF0aHMgPSBxdWVyeU1ldGFkYXRhW2Zyb250ZW5kTW9kZWxKb2luZWRQYXRoc1N5bWJvbF0gfHwgbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IGpvaW5QYXRoS2V5IG9mIGpvaW5QYXRoS2V5cykge1xuICAgICAgam9pbmVkUGF0aHMuYWRkKGpvaW5QYXRoS2V5KVxuICAgIH1cblxuICAgIHF1ZXJ5TWV0YWRhdGFbZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzU3ltYm9sXSA9IGpvaW5lZFBhdGhzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBseSBmcm9udGVuZCBtb2RlbCBqb2lucyBmb3IgcGF0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBKb2lucyBhcmdzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLmpvaW5zIC0gSm9pbnMgZm9yIGN1cnJlbnQgcGF0aC5cbiAgICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gYXJncy5qb2luUGF0aEtleXMgLSBKb2luZWQgcGF0aCBrZXlzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyBmb3IgY3VycmVudCBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxKb2luc0ZvclBhdGgoe2pvaW5zLCBqb2luUGF0aEtleXMsIG1vZGVsQ2xhc3MsIHBhdGgsIHF1ZXJ5fSkge1xuICAgIHZvaWQgcXVlcnlcblxuICAgIGZvciAoY29uc3QgW3JlbGF0aW9uc2hpcE5hbWUsIHJlbGF0aW9uc2hpcEpvaW5dIG9mIE9iamVjdC5lbnRyaWVzKGpvaW5zKSkge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBzTWFwKClbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGpvaW4gcmVsYXRpb25zaGlwIFwiJHtyZWxhdGlvbnNoaXBOYW1lfVwiIGZvciAke21vZGVsQ2xhc3MubmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXJnZXQgbW9kZWwgY2xhc3MgZm9yIGpvaW4gcmVsYXRpb25zaGlwIFwiJHtyZWxhdGlvbnNoaXBOYW1lfVwiIG9uICR7bW9kZWxDbGFzcy5uYW1lfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcFBhdGggPSBbLi4ucGF0aCwgcmVsYXRpb25zaGlwTmFtZV1cbiAgICAgIGpvaW5QYXRoS2V5cy5hZGQocmVsYXRpb25zaGlwUGF0aC5qb2luKFwiLlwiKSlcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcEpvaW4gPT09IHRydWUpIGNvbnRpbnVlXG5cbiAgICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsSm9pbnNGb3JQYXRoKHtcbiAgICAgICAgam9pbnM6IHJlbGF0aW9uc2hpcEpvaW4sXG4gICAgICAgIGpvaW5QYXRoS2V5cyxcbiAgICAgICAgbW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcyxcbiAgICAgICAgcGF0aDogcmVsYXRpb25zaGlwUGF0aCxcbiAgICAgICAgcXVlcnlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEga2V5IHRoYXQgbWF5IGJlIGVpdGhlciBhIGNhbWVsQ2FzZSBhdHRyaWJ1dGUgbmFtZSBvciBhIHJhdyBEQlxuICAgKiBjb2x1bW4gbmFtZSB0byBpdHMgY2Fub25pY2FsIGNvbHVtbiBuYW1lLiAgUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBrZXkgbWF0Y2hlcyBuZWl0aGVyIG1hcC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gQXR0cmlidXRlIG5hbWUgb3IgY29sdW1uIG5hbWUgdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBSZXNvbHZlZCBEQiBjb2x1bW4gbmFtZSwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICByZXNvbHZlRnJvbnRlbmRNb2RlbENvbHVtbk5hbWUobW9kZWxDbGFzcywga2V5KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShrZXkpXG5cbiAgICBpZiAocmVzb2x2ZWRBdHRyaWJ1dGVOYW1lKSByZXR1cm4gbW9kZWxDbGFzcy5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKClbcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lXVxuXG4gICAgLy8gRmFsbCBiYWNrOiB0aGUga2V5IG1heSBhbHJlYWR5IGJlIGEgcmF3IERCIGNvbHVtbiBuYW1lIG5vdCBwcmVzZW50IGluIHRoZSBhdHRyaWJ1dGUgbWFwLlxuICAgIGlmIChtb2RlbENsYXNzLmdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAoKVtrZXldKSByZXR1cm4ga2V5XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBseSBmcm9udGVuZCBtb2RlbCB3aGVyZSBmb3IgcGF0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBXaGVyZSBhcmdzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyBmb3IgY3VycmVudCB3aGVyZSBzY29wZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5wYXRoIC0gUmVsYXRpb25zaGlwIHBhdGggZnJvbSByb290LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLndoZXJlIC0gV2hlcmUgY29uZGl0aW9ucyBmb3IgY3VycmVudCBzY29wZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxXaGVyZUZvclBhdGgoe21vZGVsQ2xhc3MsIHBhdGgsIHF1ZXJ5LCB3aGVyZX0pIHtcbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMod2hlcmUpKSB7XG4gICAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5yZXNvbHZlRnJvbnRlbmRNb2RlbENvbHVtbk5hbWUobW9kZWxDbGFzcywgYXR0cmlidXRlTmFtZSlcblxuICAgICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsSm9pblBhdGgoe3BhdGgsIHF1ZXJ5fSlcblxuICAgICAgICBjb25zdCB0YWJsZVJlZmVyZW5jZSA9IHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbiguLi5wYXRoKVxuICAgICAgICBjb25zdCBjb2x1bW5TcWwgPSBgJHtxdWVyeS5kcml2ZXIucXVvdGVUYWJsZSh0YWJsZVJlZmVyZW5jZSl9LiR7cXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfWBcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBxdWVyeS53aGVyZShcIjE9MFwiKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkVmFsdWVzID0gdmFsdWUubWFwKChlbnRyeSkgPT4gdGhpcy5ub3JtYWxpemVGcm9udGVuZE1vZGVsV2hlcmVDb2x1bW5WYWx1ZSh7Y29sdW1uTmFtZSwgbW9kZWxDbGFzcywgdmFsdWU6IGVudHJ5fSkpXG5cbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmFsdWVzLmluY2x1ZGVzKGZyb250ZW5kTW9kZWxXaGVyZU5vTWF0Y2hTeW1ib2wpKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5LndoZXJlKFwiMT0wXCIpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBxdWVyeS53aGVyZShgJHtjb2x1bW5TcWx9IElOICgke25vcm1hbGl6ZWRWYWx1ZXMubWFwKChlbnRyeSkgPT4gcXVlcnkuZHJpdmVyLnF1b3RlKGVudHJ5KSkuam9pbihcIiwgXCIpfSlgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKGAke2NvbHVtblNxbH0gSVMgTlVMTGApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdGhpcy5ub3JtYWxpemVGcm9udGVuZE1vZGVsV2hlcmVDb2x1bW5WYWx1ZSh7Y29sdW1uTmFtZSwgbW9kZWxDbGFzcywgdmFsdWV9KVxuXG4gICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSA9PT0gZnJvbnRlbmRNb2RlbFdoZXJlTm9NYXRjaFN5bWJvbCkge1xuICAgICAgICAgICAgcXVlcnkud2hlcmUoXCIxPTBcIilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkud2hlcmUoYCR7Y29sdW1uU3FsfSA9ICR7cXVlcnkuZHJpdmVyLnF1b3RlKG5vcm1hbGl6ZWRWYWx1ZSl9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBzTWFwKClbYXR0cmlidXRlTmFtZV1cblxuICAgICAgICBpZiAoIXJlbGF0aW9uc2hpcCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB3aGVyZSByZWxhdGlvbnNoaXAgXCIke2F0dHJpYnV0ZU5hbWV9XCIgZm9yICR7bW9kZWxDbGFzcy5uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdGFyZ2V0IG1vZGVsIGNsYXNzIGZvciB3aGVyZSByZWxhdGlvbnNoaXAgXCIke2F0dHJpYnV0ZU5hbWV9XCIgb24gJHttb2RlbENsYXNzLm5hbWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcFBhdGggPSBbLi4ucGF0aCwgYXR0cmlidXRlTmFtZV1cblxuICAgICAgICB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbFdoZXJlRm9yUGF0aCh7XG4gICAgICAgICAgbW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcyxcbiAgICAgICAgICBwYXRoOiByZWxhdGlvbnNoaXBQYXRoLFxuICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgIHdoZXJlOiB2YWx1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB3aGVyZSBjb2x1bW4gXCIke2F0dHJpYnV0ZU5hbWV9XCIgZm9yICR7bW9kZWxDbGFzcy5uYW1lfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIHdoZXJlIGNvbHVtbiB2YWx1ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0gez99IGFyZ3MudmFsdWUgLSBXaGVyZSB2YWx1ZS5cbiAgICogQHJldHVybnMgez8gfCBzeW1ib2x9IC0gU1FMLXNhZmUgd2hlcmUgdmFsdWUuXG4gICAqL1xuICBub3JtYWxpemVGcm9udGVuZE1vZGVsV2hlcmVDb2x1bW5WYWx1ZSh7Y29sdW1uTmFtZSwgbW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgY29sdW1uVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZShjb2x1bW5OYW1lKT8udG9Mb3dlckNhc2UoKVxuICAgICAgY29uc3QgaXNEYXRlVGltZUNvbHVtbiA9IHR5cGVvZiBjb2x1bW5UeXBlID09PSBcInN0cmluZ1wiICYmIFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcInRpbWVzdGFtcFwiXS5zb21lKCh0eXBlKSA9PiBjb2x1bW5UeXBlLmluY2x1ZGVzKHR5cGUpKVxuXG4gICAgICBpZiAoaXNEYXRlVGltZUNvbHVtbikge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRlID0gbmV3IERhdGUodmFsdWUpXG5cbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkRGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZERhdGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgY29sdW1uVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbHVtblR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGZyb250ZW5kTW9kZWxXaGVyZU5vTWF0Y2hTeW1ib2xcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSBjb2x1bW5UeXBlLnRvTG93ZXJDYXNlKClcbiAgICAgIGNvbnN0IG9iamVjdFZhbHVlVHlwZXMgPSBuZXcgU2V0KFtcImNoYXJcIiwgXCJ2YXJjaGFyXCIsIFwibnZhcmNoYXJcIiwgXCJzdHJpbmdcIiwgXCJlbnVtXCIsIFwianNvblwiLCBcImpzb25iXCIsIFwiY2l0ZXh0XCIsIFwiYmluYXJ5XCIsIFwidmFyYmluYXJ5XCJdKVxuICAgICAgY29uc3Qgc3VwcG9ydHNPYmplY3RWYWx1ZXMgPSBub3JtYWxpemVkVHlwZS5pbmNsdWRlcyhcInRleHRcIikgfHwgb2JqZWN0VmFsdWVUeXBlcy5oYXMobm9ybWFsaXplZFR5cGUpXG5cbiAgICAgIGlmICghc3VwcG9ydHNPYmplY3RWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyb250ZW5kTW9kZWxXaGVyZU5vTWF0Y2hTeW1ib2xcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXBwbHkgZnJvbnRlbmQgbW9kZWwgZ3JvdXAuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gR3JvdXAgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsR3JvdXB9IGFyZ3MuZ3JvdXAgLSBHcm91cCBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5RnJvbnRlbmRNb2RlbEdyb3VwKHtxdWVyeSwgZ3JvdXB9KSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsU2VhcmNoVGFyZ2V0TW9kZWxDbGFzcyh7XG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgcGF0aDogZ3JvdXAucGF0aFxuICAgIH0pXG4gICAgY29uc3QgY29sdW1uTmFtZSA9IHRoaXMucmVzb2x2ZUZyb250ZW5kTW9kZWxDb2x1bW5OYW1lKHRhcmdldE1vZGVsQ2xhc3MsIGdyb3VwLmNvbHVtbilcblxuICAgIGlmICghY29sdW1uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGdyb3VwIGNvbHVtbiBcIiR7Z3JvdXAuY29sdW1ufVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIHRoaXMuZW5zdXJlRnJvbnRlbmRNb2RlbEpvaW5QYXRoKHtwYXRoOiBncm91cC5wYXRoLCBxdWVyeX0pXG5cbiAgICBjb25zdCB0YWJsZVJlZmVyZW5jZSA9IHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbiguLi5ncm91cC5wYXRoKVxuICAgIGNvbnN0IGNvbHVtblNxbCA9IGAke3F1ZXJ5LmRyaXZlci5xdW90ZVRhYmxlKHRhYmxlUmVmZXJlbmNlKX0uJHtxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9YFxuXG4gICAgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsR3JvdXBDb2x1bW4oe2NvbHVtblNxbCwgcXVlcnl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcm9vdC1tb2RlbCBjb2x1bW5zIHRvIEdST1VQIEJZIHNvIHN0cmljdCBTUUwgZW5naW5lcyBhY2NlcHQgZGVmYXVsdCByb290LXRhYmxlIHNlbGVjdHMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxSb290R3JvdXBDb2x1bW5zKHtxdWVyeX0pIHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAgPSBtb2RlbENsYXNzLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVxuICAgIGNvbnN0IHJvb3RUYWJsZVJlZmVyZW5jZSA9IHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbigpXG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbk5hbWUgb2YgT2JqZWN0LnZhbHVlcyhhdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKSkge1xuICAgICAgY29uc3QgY29sdW1uU3FsID0gYCR7cXVlcnkuZHJpdmVyLnF1b3RlVGFibGUocm9vdFRhYmxlUmVmZXJlbmNlKX0uJHtxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9YFxuXG4gICAgICB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxHcm91cENvbHVtbih7Y29sdW1uU3FsLCBxdWVyeX0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYSBncm91cC1ieSBTUUwgY29sdW1uIGlzIG9ubHkgYXBwZW5kZWQgb25jZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb2x1bW5TcWwgLSBGdWxseS1xdWFsaWZpZWQgY29sdW1uIFNRTC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbnN1cmVGcm9udGVuZE1vZGVsR3JvdXBDb2x1bW4oe2NvbHVtblNxbCwgcXVlcnl9KSB7XG4gICAgY29uc3QgcXVlcnlNZXRhZGF0YSA9IGZyb250ZW5kTW9kZWxRdWVyeU1ldGFkYXRhKHF1ZXJ5KVxuICAgIGNvbnN0IGdyb3VwZWRDb2x1bW5zID0gcXVlcnlNZXRhZGF0YVtmcm9udGVuZE1vZGVsR3JvdXBlZENvbHVtbnNTeW1ib2xdIHx8IG5ldyBTZXQoKVxuXG4gICAgaWYgKGdyb3VwZWRDb2x1bW5zLmhhcyhjb2x1bW5TcWwpKSByZXR1cm5cblxuICAgIHF1ZXJ5Lmdyb3VwKGNvbHVtblNxbClcbiAgICBncm91cGVkQ29sdW1ucy5hZGQoY29sdW1uU3FsKVxuICAgIHF1ZXJ5TWV0YWRhdGFbZnJvbnRlbmRNb2RlbEdyb3VwZWRDb2x1bW5zU3ltYm9sXSA9IGdyb3VwZWRDb2x1bW5zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBseSBmcm9udGVuZCBtb2RlbCB0cmFuc2xhdGVkIGF0dHJpYnV0ZSBwcmVsb2Fkcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IC0gUXVlcnkgd2l0aCB0cmFuc2xhdGlvbnMgcHJlbG9hZGVkIGlmIG5lZWRlZC5cbiAgICovXG4gIGFwcGx5RnJvbnRlbmRNb2RlbFRyYW5zbGF0ZWRBdHRyaWJ1dGVQcmVsb2Fkcyh7cXVlcnl9KSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXMgPSB0aGlzLmZyb250ZW5kTW9kZWxFZmZlY3RpdmVTZWxlY3RlZEF0dHJpYnV0ZXNGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIHRoaXMuZnJvbnRlbmRNb2RlbERlZmF1bHRBdHRyaWJ1dGVzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKSB8fCBbXSlcbiAgICAgIHx8IHRoaXMuZnJvbnRlbmRNb2RlbERlZmF1bHRBdHRyaWJ1dGVzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKVxuXG4gICAgaWYgKCFzZWxlY3RlZEF0dHJpYnV0ZXMpIHJldHVybiBxdWVyeVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKClcbiAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gKi8gKHJlc291cmNlLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IHRyYW5zbGF0ZWRTZXQgPSBuZXcgU2V0KHJlc291cmNlQ2xhc3MudHJhbnNsYXRlZEF0dHJpYnV0ZXMgfHwgW10pXG4gICAgbGV0IG5lZWRzVHJhbnNsYXRpb25zID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBzZWxlY3RlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGhvb2tOYW1lID0gYCR7YXR0cmlidXRlTmFtZX1BdHRyaWJ1dGVTZWxlY3RlZGBcbiAgICAgIGNvbnN0IGR5bmFtaWNSZXNvdXJjZSA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUgez99ICovIChyZXNvdXJjZSkpXG5cbiAgICAgIGlmICh0eXBlb2YgZHluYW1pY1Jlc291cmNlW2hvb2tOYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGR5bmFtaWNSZXNvdXJjZVtob29rTmFtZV0oe3F1ZXJ5fSlcblxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcXVlcnkgPSByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmFuc2xhdGVkU2V0LmhhcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICBuZWVkc1RyYW5zbGF0aW9ucyA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVlZHNUcmFuc2xhdGlvbnMpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkucHJlbG9hZCh7dHJhbnNsYXRpb25zOiB7fX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBseSBmcm9udGVuZCBtb2RlbCBzb3J0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNvcnQgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsU29ydH0gYXJncy5zb3J0IC0gU29ydCBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5RnJvbnRlbmRNb2RlbFNvcnQoe3F1ZXJ5LCBzb3J0fSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLmZyb250ZW5kTW9kZWxDbGFzcygpXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbFNlYXJjaFRhcmdldE1vZGVsQ2xhc3Moe1xuICAgICAgbW9kZWxDbGFzcyxcbiAgICAgIHBhdGg6IHNvcnQucGF0aFxuICAgIH0pXG4gICAgY29uc3QgdHJhbnNsYXRlZEF0dHJpYnV0ZXNNYXAgPSB0YXJnZXRNb2RlbENsYXNzLmdldFRyYW5zbGF0aW9uc01hcCgpXG4gICAgY29uc3QgdHJhbnNsYXRlZEF0dHJpYnV0ZU5hbWVzID0gT2JqZWN0LmtleXModHJhbnNsYXRlZEF0dHJpYnV0ZXNNYXApXG4gICAgY29uc3QgaXNUcmFuc2xhdGVkU29ydEF0dHJpYnV0ZSA9IHRyYW5zbGF0ZWRBdHRyaWJ1dGVOYW1lcy5pbmNsdWRlcyhzb3J0LmNvbHVtbilcblxuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVGcm9udGVuZE1vZGVsQ29sdW1uTmFtZSh0YXJnZXRNb2RlbENsYXNzLCBzb3J0LmNvbHVtbilcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBzb3J0LmRpcmVjdGlvbi50b1VwcGVyQ2FzZSgpXG5cbiAgICBpZiAoaXNUcmFuc2xhdGVkU29ydEF0dHJpYnV0ZSkge1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25Nb2RlbENsYXNzID0gdGFyZ2V0TW9kZWxDbGFzcy5nZXRUcmFuc2xhdGlvbkNsYXNzKClcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uQXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCA9IHRyYW5zbGF0aW9uTW9kZWxDbGFzcy5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKClcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uQ29sdW1uTmFtZSA9IHRyYW5zbGF0aW9uQXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcFtzb3J0LmNvbHVtbl1cbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUGF0aCA9IHNvcnQucGF0aC5jb25jYXQoW1wiY3VycmVudFRyYW5zbGF0aW9uXCJdKVxuXG4gICAgICBpZiAoIXRyYW5zbGF0aW9uQ29sdW1uTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHJhbnNsYXRlZCBzb3J0IGNvbHVtbiBcIiR7c29ydC5jb2x1bW59XCIgZm9yICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfWApXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW5zdXJlRnJvbnRlbmRNb2RlbFNvcnRKb2luUGF0aCh7cGF0aDogdHJhbnNsYXRpb25QYXRoLCBxdWVyeX0pXG5cbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uVGFibGVSZWZlcmVuY2UgPSBxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oLi4udHJhbnNsYXRpb25QYXRoKVxuICAgICAgY29uc3QgdHJhbnNsYXRpb25Db2x1bW5TcWwgPSBgJHtxdWVyeS5kcml2ZXIucXVvdGVUYWJsZSh0cmFuc2xhdGlvblRhYmxlUmVmZXJlbmNlKX0uJHtxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4odHJhbnNsYXRpb25Db2x1bW5OYW1lKX1gXG5cbiAgICAgIHF1ZXJ5Lm9yZGVyKGAke3RyYW5zbGF0aW9uQ29sdW1uU3FsfSAke2RpcmVjdGlvbn1gKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWNvbHVtbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzb3J0IGNvbHVtbiBcIiR7c29ydC5jb2x1bW59XCIgZm9yICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfWApXG4gICAgfVxuXG4gICAgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsU29ydEpvaW5QYXRoKHtwYXRoOiBzb3J0LnBhdGgsIHF1ZXJ5fSlcblxuICAgIGNvbnN0IHRhYmxlUmVmZXJlbmNlID0gcXVlcnkuZ2V0VGFibGVSZWZlcmVuY2VGb3JKb2luKC4uLnNvcnQucGF0aClcbiAgICBjb25zdCBjb2x1bW5TcWwgPSBgJHtxdWVyeS5kcml2ZXIucXVvdGVUYWJsZSh0YWJsZVJlZmVyZW5jZSl9LiR7cXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfWBcblxuICAgIHF1ZXJ5Lm9yZGVyKGAke2NvbHVtblNxbH0gJHtkaXJlY3Rpb259YClcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIGEgc29ydCBqb2luIHBhdGggaGFzIGJlZW4gam9pbmVkIG9uIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEpvaW4gYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5wYXRoIC0gUmVsYXRpb25zaGlwIGpvaW4gcGF0aC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbnN1cmVGcm9udGVuZE1vZGVsU29ydEpvaW5QYXRoKHtwYXRoLCBxdWVyeX0pIHtcbiAgICB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxKb2luUGF0aCh7cGF0aCwgcXVlcnl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYSByZWxhdGlvbnNoaXAgcGF0aCBoYXMgZXhhY3RseSBvbmUgU1FMIGpvaW4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSm9pbiBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnBhdGggLSBSZWxhdGlvbnNoaXAgam9pbiBwYXRoLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGVuc3VyZUZyb250ZW5kTW9kZWxKb2luUGF0aCh7cGF0aCwgcXVlcnl9KSB7XG4gICAgaWYgKHBhdGgubGVuZ3RoIDwgMSkgcmV0dXJuXG5cbiAgICBjb25zdCBxdWVyeU1ldGFkYXRhID0gZnJvbnRlbmRNb2RlbFF1ZXJ5TWV0YWRhdGEocXVlcnkpXG4gICAgY29uc3Qgam9pbmVkUGF0aHMgPSBxdWVyeU1ldGFkYXRhW2Zyb250ZW5kTW9kZWxKb2luZWRQYXRoc1N5bWJvbF0gfHwgbmV3IFNldCgpXG4gICAgY29uc3QgcGF0aEtleSA9IHBhdGguam9pbihcIi5cIilcblxuICAgIGlmIChqb2luZWRQYXRocy5oYXMocGF0aEtleSkpIHJldHVyblxuXG4gICAgcXVlcnkuam9pbnMoYnVpbGRGcm9udGVuZE1vZGVsSm9pbk9iamVjdEZyb21QYXRoKHBhdGgpKVxuICAgIGpvaW5lZFBhdGhzLmFkZChwYXRoS2V5KVxuICAgIHF1ZXJ5TWV0YWRhdGFbZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzU3ltYm9sXSA9IGpvaW5lZFBhdGhzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBzZWxlY3RlZCBhdHRyaWJ1dGVzIGZvciBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW10gfCBudWxsfSAtIFNlbGVjdGVkIGF0dHJpYnV0ZXMgZm9yIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFNlbGVjdGVkQXR0cmlidXRlc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcykge1xuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMuZnJvbnRlbmRNb2RlbFNlbGVjdCgpXG5cbiAgICBpZiAoIXNlbGVjdCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBzZWxlY3RbbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKV0gfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgc2VsZWN0cyBleHRyYSBmb3IgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gLSBFeHRyYSBhdHRyaWJ1dGVzIChsb2FkZWQgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHRzKSBmb3IgdGhlIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFNlbGVjdHNFeHRyYUZvck1vZGVsQ2xhc3MobW9kZWxDbGFzcykge1xuICAgIGNvbnN0IHNlbGVjdHNFeHRyYSA9IHRoaXMuZnJvbnRlbmRNb2RlbFNlbGVjdHNFeHRyYSgpXG5cbiAgICBpZiAoIXNlbGVjdHNFeHRyYSkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBzZWxlY3RzRXh0cmFbbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKV0gfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBmaW5hbCBzZXQgb2YgYXR0cmlidXRlIG5hbWVzIHRvIHNlcmlhbGl6ZSBmb3IgYSBtb2RlbCBjbGFzczpcbiAgICogYW4gZXhwbGljaXQgbmFycm93aW5nIGBzZWxlY3RgIHdpbnM7IG90aGVyd2lzZSwgd2hlbiBgc2VsZWN0c0V4dHJhYCBpcyBnaXZlbixcbiAgICogdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBwbHVzIHRoZSBleHRyYXM7IG90aGVyd2lzZSBudWxsIChkZWZhdWx0IGJlaGF2aW9yKS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmYWxsYmFja0F0dHJpYnV0ZU5hbWVzIC0gQXR0cmlidXRlIG5hbWVzIHRvIHRyZWF0IGFzIHRoZSBkZWZhdWx0cyB3aGVuIHRoZSByZXNvdXJjZSBkZWNsYXJlcyBub25lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW10gfCBudWxsfSAtIEVmZmVjdGl2ZSBzZWxlY3RlZCBhdHRyaWJ1dGUgbmFtZXMsIG9yIG51bGwgZm9yIGRlZmF1bHQgc2VyaWFsaXphdGlvbi5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxFZmZlY3RpdmVTZWxlY3RlZEF0dHJpYnV0ZXNGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIGZhbGxiYWNrQXR0cmlidXRlTmFtZXMpIHtcbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXMgPSB0aGlzLmZyb250ZW5kTW9kZWxTZWxlY3RlZEF0dHJpYnV0ZXNGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpXG5cbiAgICBpZiAoc2VsZWN0ZWRBdHRyaWJ1dGVzKSByZXR1cm4gc2VsZWN0ZWRBdHRyaWJ1dGVzXG5cbiAgICBjb25zdCBleHRyYUF0dHJpYnV0ZXMgPSB0aGlzLmZyb250ZW5kTW9kZWxTZWxlY3RzRXh0cmFGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpXG5cbiAgICBpZiAoIWV4dHJhQXR0cmlidXRlcykgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGRlZmF1bHRBdHRyaWJ1dGVzID0gdGhpcy5mcm9udGVuZE1vZGVsRGVmYXVsdEF0dHJpYnV0ZXNGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpIHx8IGZhbGxiYWNrQXR0cmlidXRlTmFtZXNcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmRlZmF1bHRBdHRyaWJ1dGVzLCAuLi5leHRyYUF0dHJpYnV0ZXNdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gLSBEZWZhdWx0IGZyb250ZW5kLW1vZGVsIGF0dHJpYnV0ZXMgZGVjbGFyZWQgb24gdGhlIHJlc291cmNlLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbERlZmF1bHRBdHRyaWJ1dGVzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKSB7XG4gICAgY29uc3QgZnJvbnRlbmRNb2RlbFJlc291cmNlID0gdGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2U/LnJlc291cmNlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVzXG5cbiAgICBpZiAoIWF0dHJpYnV0ZXMpIHJldHVybiBudWxsXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVzKSkge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiKSByZXR1cm4gdHJ1ZVxuXG4gICAgICAgICAgY29uc3QgY29uZmlnID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKGVudHJ5KVxuXG4gICAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuc2VsZWN0ZWRCeURlZmF1bHQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2VcblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgPyBlbnRyeSA6IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoZW50cnkpLm5hbWUpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcylcbiAgICAgICAgLmZpbHRlcigoWywgY29uZmlnXSkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcgIT09IFwib2JqZWN0XCIpIHJldHVybiB0cnVlXG5cbiAgICAgICAgICByZXR1cm4gLyoqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS4gQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoY29uZmlnKS5zZWxlY3RlZEJ5RGVmYXVsdCAhPT0gZmFsc2VcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBub24gZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gQXR0cmlidXRlIG5hbWVzIGV4cGxpY2l0bHkgbWFya2VkIHNlbGVjdGVkQnlEZWZhdWx0OiBmYWxzZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxOb25EZWZhdWx0QXR0cmlidXRlc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcykge1xuICAgIGNvbnN0IGZyb250ZW5kTW9kZWxSZXNvdXJjZSA9IHRoaXMuZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZvck1vZGVsQ2xhc3MobW9kZWxDbGFzcylcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlPy5yZXNvdXJjZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlc1xuXG4gICAgaWYgKCFhdHRyaWJ1dGVzKSByZXR1cm4gW11cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgIT09IFwib2JqZWN0XCIgfHwgIWVudHJ5KSByZXR1cm4gZmFsc2VcblxuICAgICAgICAgIHJldHVybiAvKiogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChlbnRyeSkuc2VsZWN0ZWRCeURlZmF1bHQgPT09IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHs/fSAqLyAoZW50cnkpKS5uYW1lKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpXG4gICAgICAgIC5maWx0ZXIoKFssIGNvbmZpZ10pID0+IHR5cGVvZiBjb25maWcgPT09IFwib2JqZWN0XCIgJiYgY29uZmlnICYmIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoY29uZmlnKS5zZWxlY3RlZEJ5RGVmYXVsdCA9PT0gZmFsc2UpXG4gICAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSlcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlcmlhbGl6ZSBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsIC0gTW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gLSBTZXJpYWxpemVkIGF0dHJpYnV0ZXMgZmlsdGVyZWQgYnkgc2VsZWN0IG1hcC5cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxBdHRyaWJ1dGVzKG1vZGVsKSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKG1vZGVsLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IG1vZGVsQXR0cmlidXRlcyA9IG1vZGVsLmF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IHNlbGVjdGVkQXR0cmlidXRlcyA9IHRoaXMuZnJvbnRlbmRNb2RlbEVmZmVjdGl2ZVNlbGVjdGVkQXR0cmlidXRlc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcywgT2JqZWN0LmtleXMobW9kZWxBdHRyaWJ1dGVzKSlcbiAgICBjb25zdCBkZWZhdWx0QXR0cmlidXRlcyA9IHRoaXMuZnJvbnRlbmRNb2RlbERlZmF1bHRBdHRyaWJ1dGVzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKVxuICAgIGNvbnN0IHJlc291cmNlSW5zdGFuY2UgPSB0aGlzLl9zZXJpYWxpemF0aW9uUmVzb3VyY2VJbnN0YW5jZUZvck1vZGVsKG1vZGVsKVxuXG4gICAgLyoqXG4gICAgICogUmVzb3VyY2UgYXR0cmlidXRlIG1ldGhvZCBuYW1lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gICAgICovXG4gICAgY29uc3QgcmVzb3VyY2VBdHRyaWJ1dGVNZXRob2ROYW1lID0gKGF0dHJpYnV0ZU5hbWUpID0+IGAke2F0dHJpYnV0ZU5hbWV9QXR0cmlidXRlYFxuXG4gICAgLyoqXG4gICAgICogUmVzb3VyY2UgaGFzIGF0dHJpYnV0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgICAqL1xuICAgIGNvbnN0IHJlc291cmNlSGFzQXR0cmlidXRlID0gKGF0dHJpYnV0ZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSByZXNvdXJjZUF0dHJpYnV0ZU1ldGhvZE5hbWUoYXR0cmlidXRlTmFtZSlcblxuICAgICAgcmV0dXJuIHJlc291cmNlSW5zdGFuY2UgJiYgdHlwZW9mIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICgvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHs/fSAqLyAocmVzb3VyY2VJbnN0YW5jZSkpW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b3R5cGUgYXR0cmlidXRlIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgICAqL1xuICAgIGNvbnN0IHByb3RvdHlwZUF0dHJpYnV0ZU1ldGhvZCA9IChhdHRyaWJ1dGVOYW1lKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbClcblxuICAgICAgd2hpbGUgKGN1cnJlbnRQcm90b3R5cGUgJiYgY3VycmVudFByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN1cnJlbnRQcm90b3R5cGUsIGF0dHJpYnV0ZU5hbWUpPy52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWV0aG9kOiBjYW5kaWRhdGUsXG4gICAgICAgICAgICBvd25lck5hbWU6IGN1cnJlbnRQcm90b3R5cGUuY29uc3RydWN0b3I/Lm5hbWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnRQcm90b3R5cGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplZCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICAgKi9cbiAgICBjb25zdCBzZXJpYWxpemVkQXR0cmlidXRlVmFsdWUgPSBhc3luYyAoYXR0cmlidXRlTmFtZSkgPT4ge1xuICAgICAgLy8gQ2hlY2sgcmVzb3VyY2UgaW5zdGFuY2UgZmlyc3QgKHZpcnR1YWwvY29tcHV0ZWQgYXR0cmlidXRlcyB2aWEgJHtuYW1lfUF0dHJpYnV0ZSBjb252ZW50aW9uKVxuICAgICAgaWYgKHJlc291cmNlSGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSByZXNvdXJjZUF0dHJpYnV0ZU1ldGhvZE5hbWUoYXR0cmlidXRlTmFtZSlcblxuICAgICAgICByZXR1cm4gYXdhaXQgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgRnVuY3Rpb24+fSAqLyAoLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7P30gKi8gKHJlc291cmNlSW5zdGFuY2UpKVttZXRob2ROYW1lXShtb2RlbClcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbCBiYWNrIHRvIG1vZGVsIG1ldGhvZFxuICAgICAgY29uc3QgYXR0cmlidXRlTWV0aG9kTG9va3VwID0gcHJvdG90eXBlQXR0cmlidXRlTWV0aG9kKGF0dHJpYnV0ZU5hbWUpXG4gICAgICBjb25zdCBhdHRyaWJ1dGVNZXRob2QgPSBhdHRyaWJ1dGVNZXRob2RMb29rdXA/Lm1ldGhvZFxuXG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZU1ldGhvZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhdHRyaWJ1dGVNZXRob2QuY2FsbChtb2RlbClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1vZGVsQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dHJpYnV0ZSBleGlzdHMuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICAgKi9cbiAgICBjb25zdCBhdHRyaWJ1dGVFeGlzdHMgPSAoYXR0cmlidXRlTmFtZSkgPT4ge1xuICAgICAgcmV0dXJuIChhdHRyaWJ1dGVOYW1lIGluIG1vZGVsQXR0cmlidXRlcykgfHwgKGF0dHJpYnV0ZU5hbWUgaW4gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChtb2RlbCkpIHx8IHJlc291cmNlSGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpXG4gICAgfVxuXG4gICAgaWYgKCFzZWxlY3RlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICghZGVmYXVsdEF0dHJpYnV0ZXMgfHwgZGVmYXVsdEF0dHJpYnV0ZXMubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gbW9kZWxBdHRyaWJ1dGVzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4Y2x1ZGVkQXR0cmlidXRlcyA9IHRoaXMuZnJvbnRlbmRNb2RlbE5vbkRlZmF1bHRBdHRyaWJ1dGVzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKVxuICAgICAgY29uc3Qgc2VyaWFsaXplZEF0dHJpYnV0ZXMgPSB7Li4ubW9kZWxBdHRyaWJ1dGVzfVxuXG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVkTmFtZSBvZiBleGNsdWRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgZGVsZXRlIHNlcmlhbGl6ZWRBdHRyaWJ1dGVzW2V4Y2x1ZGVkTmFtZV1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGRlZmF1bHRBdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICghYXR0cmlidXRlRXhpc3RzKGF0dHJpYnV0ZU5hbWUpKSBjb250aW51ZVxuICAgICAgICBzZXJpYWxpemVkQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGF3YWl0IHNlcmlhbGl6ZWRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVOYW1lKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VyaWFsaXplZEF0dHJpYnV0ZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVkIGF0dHJpYnV0ZXMuXG4gICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgY29uc3Qgc2VyaWFsaXplZEF0dHJpYnV0ZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIHNlbGVjdGVkQXR0cmlidXRlcykge1xuICAgICAgaWYgKCFhdHRyaWJ1dGVFeGlzdHMoYXR0cmlidXRlTmFtZSkpIGNvbnRpbnVlXG4gICAgICBzZXJpYWxpemVkQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGF3YWl0IHNlcmlhbGl6ZWRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVOYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkQXR0cmlidXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VyaWFsaXphdGlvbiByZXNvdXJjZSBpbnN0YW5jZSBmb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWwgLSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gLSBSZXNvdXJjZSBpbnN0YW5jZSBvciBudWxsLlxuICAgKi9cbiAgX3NlcmlhbGl6YXRpb25SZXNvdXJjZUluc3RhbmNlRm9yTW9kZWwobW9kZWwpIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuZnJvbnRlbmRNb2RlbFJlc291cmNlSW5zdGFuY2UoKVxuXG4gICAgaWYgKHJlc291cmNlLm1vZGVsQ2xhc3MoKSA9PT0gbW9kZWwuY29uc3RydWN0b3IpIHtcbiAgICAgIHJldHVybiByZXNvdXJjZVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2VuZFByb2plY3RzPy4oKSB8fCBbXVxuICAgIGNvbnN0IG1vZGVsQ2xhc3NOYW1lID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChtb2RlbC5jb25zdHJ1Y3RvcikuZ2V0TW9kZWxOYW1lKClcblxuICAgIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdXG4gICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gcmVzb3VyY2VEZWZpbml0aW9uID8gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pIDogbnVsbFxuXG4gICAgICBpZiAocmVzb3VyY2VDbGFzcykge1xuICAgICAgICByZXR1cm4gbmV3IHJlc291cmNlQ2xhc3Moe1xuICAgICAgICAgIGFiaWxpdHk6IHRoaXMuY3VycmVudEFiaWxpdHkoKSxcbiAgICAgICAgICBjb250ZXh0OiB0aGlzLmN1cnJlbnRBYmlsaXR5KCk/LmdldENvbnRleHQoKSB8fCB7fSxcbiAgICAgICAgICBsb2NhbHM6IHRoaXMuY3VycmVudEFiaWxpdHkoKT8uZ2V0TG9jYWxzKCkgfHwge30sXG4gICAgICAgICAgbW9kZWxDbGFzczogLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKG1vZGVsLmNvbnN0cnVjdG9yKSxcbiAgICAgICAgICBtb2RlbE5hbWU6IG1vZGVsQ2xhc3NOYW1lLFxuICAgICAgICAgIHBhcmFtczoge30sXG4gICAgICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uOiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZH0gKi8gKHR5cGVvZiByZXNvdXJjZUNsYXNzLnJlc291cmNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCIgPyByZXNvdXJjZUNsYXNzLnJlc291cmNlQ29uZmlnKCkgOiB1bmRlZmluZWQpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGZpbHRlciBzZXJpYWxpemFibGUgcmVsYXRlZCBtb2RlbHMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5tb2RlbHMgLSBGcm9udGVuZCBtb2RlbCByZWNvcmRzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3MucmVsYXRpb25zaGlwSXNDb2xsZWN0aW9uIC0gV2hldGhlciByZWxhdGlvbiBpcyBoYXMtbWFueS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdPn0gLSBTZXJpYWxpemFibGUgcmVsYXRlZCBtb2RlbHMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsRmlsdGVyU2VyaWFsaXphYmxlUmVsYXRlZE1vZGVscyh7bW9kZWxzLCByZWxhdGlvbnNoaXBJc0NvbGxlY3Rpb259KSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRBYmlsaXR5KCkpIHJldHVybiBtb2RlbHNcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1vZGVsc1xuXG4gICAgLyoqXG4gICAgICogTW9kZWxzIGJ5IGNsYXNzLlxuICAgICAgQHR5cGUge01hcDx0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdPn0gKi9cbiAgICBjb25zdCBtb2RlbHNCeUNsYXNzID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVscykge1xuICAgICAgY29uc3QgcmVsYXRlZE1vZGVsQ2xhc3MgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChtb2RlbC5jb25zdHJ1Y3RvcilcbiAgICAgIGNvbnN0IGV4aXN0aW5nTW9kZWxzRm9yQ2xhc3MgPSBtb2RlbHNCeUNsYXNzLmdldChyZWxhdGVkTW9kZWxDbGFzcykgfHwgW11cblxuICAgICAgZXhpc3RpbmdNb2RlbHNGb3JDbGFzcy5wdXNoKG1vZGVsKVxuICAgICAgbW9kZWxzQnlDbGFzcy5zZXQocmVsYXRlZE1vZGVsQ2xhc3MsIGV4aXN0aW5nTW9kZWxzRm9yQ2xhc3MpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXV0aG9yaXplZCBpZHMgYnkgY2xhc3MuXG4gICAgICBAdHlwZSB7TWFwPHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBTZXQ8c3RyaW5nPj59ICovXG4gICAgY29uc3QgYXV0aG9yaXplZElkc0J5Q2xhc3MgPSBuZXcgTWFwKClcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IGtleXMgYnkgY2xhc3MuXG4gICAgICBAdHlwZSB7TWFwPHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IHByaW1hcnlLZXlzQnlDbGFzcyA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBbcmVsYXRlZE1vZGVsQ2xhc3MsIHJlbGF0ZWRNb2RlbHNdIG9mIG1vZGVsc0J5Q2xhc3MuZW50cmllcygpKSB7XG4gICAgICBjb25zdCByZWxhdGVkUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gb3JNb2RlbENsYXNzKHJlbGF0ZWRNb2RlbENsYXNzKVxuXG4gICAgICBpZiAoIXJlbGF0ZWRSZXNvdXJjZSkge1xuICAgICAgICBhdXRob3JpemVkSWRzQnlDbGFzcy5zZXQocmVsYXRlZE1vZGVsQ2xhc3MsIG5ldyBTZXQoKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWJpbGl0eUFjdGlvbiA9IHJlbGF0aW9uc2hpcElzQ29sbGVjdGlvblxuICAgICAgICA/IHJlbGF0ZWRSZXNvdXJjZS5yZXNvdXJjZUNvbmZpZ3VyYXRpb24uYWJpbGl0aWVzPy5pbmRleFxuICAgICAgICA6IHJlbGF0ZWRSZXNvdXJjZS5yZXNvdXJjZUNvbmZpZ3VyYXRpb24uYWJpbGl0aWVzPy5maW5kXG5cbiAgICAgIGlmICh0eXBlb2YgYWJpbGl0eUFjdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBhYmlsaXR5QWN0aW9uLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgYXV0aG9yaXplZElkc0J5Q2xhc3Muc2V0KHJlbGF0ZWRNb2RlbENsYXNzLCBuZXcgU2V0KCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSByZWxhdGVkTW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgICAgIGNvbnN0IGlkcyA9IHJlbGF0ZWRNb2RlbHNcbiAgICAgICAgLm1hcCgobW9kZWwpID0+IG1vZGVsLmF0dHJpYnV0ZXMoKVtwcmltYXJ5S2V5XSlcbiAgICAgICAgLmZpbHRlcigoaWQpID0+IGlkICE9PSB1bmRlZmluZWQgJiYgaWQgIT09IG51bGwpXG5cbiAgICAgIGlmIChpZHMubGVuZ3RoIDwgMSkge1xuICAgICAgICBhdXRob3JpemVkSWRzQnlDbGFzcy5zZXQocmVsYXRlZE1vZGVsQ2xhc3MsIG5ldyBTZXQoKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aG9yaXplZElkc1JhdyA9IGF3YWl0IHJlbGF0ZWRNb2RlbENsYXNzXG4gICAgICAgIC5hY2Nlc3NpYmxlRm9yKGFiaWxpdHlBY3Rpb24pXG4gICAgICAgIC53aGVyZSh7W3ByaW1hcnlLZXldOiBpZHN9KVxuICAgICAgICAucGx1Y2socHJpbWFyeUtleSlcblxuICAgICAgcHJpbWFyeUtleXNCeUNsYXNzLnNldChyZWxhdGVkTW9kZWxDbGFzcywgcHJpbWFyeUtleSlcbiAgICAgIGF1dGhvcml6ZWRJZHNCeUNsYXNzLnNldChyZWxhdGVkTW9kZWxDbGFzcywgbmV3IFNldChhdXRob3JpemVkSWRzUmF3Lm1hcCgoaWQpID0+IFN0cmluZyhpZCkpKSlcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kZWxzLmZpbHRlcigobW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IHJlbGF0ZWRNb2RlbENsYXNzID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAobW9kZWwuY29uc3RydWN0b3IpXG4gICAgICBjb25zdCBhdXRob3JpemVkSWRzID0gYXV0aG9yaXplZElkc0J5Q2xhc3MuZ2V0KHJlbGF0ZWRNb2RlbENsYXNzKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IHByaW1hcnlLZXlzQnlDbGFzcy5nZXQocmVsYXRlZE1vZGVsQ2xhc3MpXG5cbiAgICAgIGlmICghYXV0aG9yaXplZElkcyB8fCAhcHJpbWFyeUtleSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNvbnN0IHByaW1hcnlLZXlWYWx1ZSA9IG1vZGVsLmF0dHJpYnV0ZXMoKVtwcmltYXJ5S2V5XVxuXG4gICAgICBpZiAocHJpbWFyeUtleVZhbHVlID09PSB1bmRlZmluZWQgfHwgcHJpbWFyeUtleVZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2VcblxuICAgICAgcmV0dXJuIGF1dGhvcml6ZWRJZHMuaGFzKFN0cmluZyhwcmltYXJ5S2V5VmFsdWUpKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBzZXJpYWxpemFibGUgZnJvbnRlbmQgbW9kZWwuXG4gICAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgcHJlbG9hZGVkIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gLSBXaGV0aGVyIHZhbHVlIGJlaGF2ZXMgbGlrZSBhIG1vZGVsLlxuICAgKi9cbiAgaXNTZXJpYWxpemFibGVGcm9udGVuZE1vZGVsKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUgez99ICovICh2YWx1ZSkuYXR0cmlidXRlcyA9PT0gXCJmdW5jdGlvblwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VyaWFsaXplIGZyb250ZW5kIG1vZGVscy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IG1vZGVscyAtIE1vZGVscyB0byBzZXJpYWxpemUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+W10+fSAtIFNlcmlhbGl6ZWQgbW9kZWwgcGF5bG9hZHMuXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVGcm9udGVuZE1vZGVscyhtb2RlbHMpIHtcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA8IDEpIHJldHVybiBbXVxuXG4gICAgLyoqXG4gICAgICogUHJlbG9hZGVkIHJlbGF0aW9uc2hpcHMgcGVyIG1vZGVsLlxuICAgICAgQHR5cGUge0FycmF5PFJlY29yZDxzdHJpbmcsID8+Pn0gKi9cbiAgICBjb25zdCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWwgPSBBcnJheS5mcm9tKHtsZW5ndGg6IG1vZGVscy5sZW5ndGh9LCAoKSA9PiAoe30pKVxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdGlvbiByZWxhdGlvbnNoaXAgZW50cmllcy5cbiAgICAgIEB0eXBlIHtBcnJheTx7bG9hZGVkTW9kZWxzOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W10sIG1vZGVsSW5kZXg6IG51bWJlciwgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nfT59ICovXG4gICAgY29uc3QgY29sbGVjdGlvblJlbGF0aW9uc2hpcEVudHJpZXMgPSBbXVxuICAgIC8qKlxuICAgICAqIFNpbmd1bGFyIHJlbGF0aW9uc2hpcCBlbnRyaWVzLlxuICAgICAgQHR5cGUge0FycmF5PHtsb2FkZWRNb2RlbDogaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbW9kZWxJbmRleDogbnVtYmVyLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmd9Pn0gKi9cbiAgICBjb25zdCBzaW5ndWxhclJlbGF0aW9uc2hpcEVudHJpZXMgPSBbXVxuXG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsLCBtb2RlbEluZGV4KSA9PiB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKG1vZGVsLmNvbnN0cnVjdG9yKVxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwc01hcCA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwc01hcCgpXG5cbiAgICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBpbiByZWxhdGlvbnNoaXBzTWFwKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICAgIGlmICghcmVsYXRpb25zaGlwLmdldFByZWxvYWRlZCgpKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcC5sb2FkZWQoKVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxvYWRlZFJlbGF0aW9uc2hpcCkpIHtcbiAgICAgICAgICBjb2xsZWN0aW9uUmVsYXRpb25zaGlwRW50cmllcy5wdXNoKHtsb2FkZWRNb2RlbHM6IGxvYWRlZFJlbGF0aW9uc2hpcCwgbW9kZWxJbmRleCwgcmVsYXRpb25zaGlwTmFtZX0pXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2VyaWFsaXphYmxlRnJvbnRlbmRNb2RlbChsb2FkZWRSZWxhdGlvbnNoaXApKSB7XG4gICAgICAgICAgc2luZ3VsYXJSZWxhdGlvbnNoaXBFbnRyaWVzLnB1c2goe2xvYWRlZE1vZGVsOiBsb2FkZWRSZWxhdGlvbnNoaXAsIG1vZGVsSW5kZXgsIHJlbGF0aW9uc2hpcE5hbWV9KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWxbbW9kZWxJbmRleF1bcmVsYXRpb25zaGlwTmFtZV0gPSBsb2FkZWRSZWxhdGlvbnNoaXAgPT0gdW5kZWZpbmVkID8gbnVsbCA6IGxvYWRlZFJlbGF0aW9uc2hpcFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoY29sbGVjdGlvblJlbGF0aW9uc2hpcEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYWxsQ29sbGVjdGlvbk1vZGVscyA9IGNvbGxlY3Rpb25SZWxhdGlvbnNoaXBFbnRyaWVzLmZsYXRNYXAoKGVudHJ5KSA9PiBlbnRyeS5sb2FkZWRNb2RlbHMpXG4gICAgICBjb25zdCBzZXJpYWxpemFibGVDb2xsZWN0aW9uTW9kZWxzID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsRmlsdGVyU2VyaWFsaXphYmxlUmVsYXRlZE1vZGVscyh7XG4gICAgICAgIG1vZGVsczogYWxsQ29sbGVjdGlvbk1vZGVscyxcbiAgICAgICAgcmVsYXRpb25zaGlwSXNDb2xsZWN0aW9uOiB0cnVlXG4gICAgICB9KVxuICAgICAgY29uc3Qgc2VyaWFsaXphYmxlQ29sbGVjdGlvbk1vZGVsc1NldCA9IG5ldyBTZXQoc2VyaWFsaXphYmxlQ29sbGVjdGlvbk1vZGVscylcblxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBFbnRyeSBvZiBjb2xsZWN0aW9uUmVsYXRpb25zaGlwRW50cmllcykge1xuICAgICAgICBjb25zdCBhbGxvd2VkTW9kZWxzID0gcmVsYXRpb25zaGlwRW50cnkubG9hZGVkTW9kZWxzLmZpbHRlcigocmVsYXRlZE1vZGVsKSA9PiBzZXJpYWxpemFibGVDb2xsZWN0aW9uTW9kZWxzU2V0LmhhcyhyZWxhdGVkTW9kZWwpKVxuICAgICAgICBjb25zdCBzZXJpYWxpemVkUmVsYXRlZE1vZGVscyA9IGF3YWl0IHRoaXMuc2VyaWFsaXplRnJvbnRlbmRNb2RlbHMoYWxsb3dlZE1vZGVscylcblxuICAgICAgICBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWxbcmVsYXRpb25zaGlwRW50cnkubW9kZWxJbmRleF1bcmVsYXRpb25zaGlwRW50cnkucmVsYXRpb25zaGlwTmFtZV0gPSBzZXJpYWxpemVkUmVsYXRlZE1vZGVsc1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaW5ndWxhclJlbGF0aW9uc2hpcEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYWxsU2luZ3VsYXJNb2RlbHMgPSBzaW5ndWxhclJlbGF0aW9uc2hpcEVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkubG9hZGVkTW9kZWwpXG4gICAgICBjb25zdCBzZXJpYWxpemFibGVTaW5ndWxhck1vZGVscyA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbEZpbHRlclNlcmlhbGl6YWJsZVJlbGF0ZWRNb2RlbHMoe1xuICAgICAgICBtb2RlbHM6IGFsbFNpbmd1bGFyTW9kZWxzLFxuICAgICAgICByZWxhdGlvbnNoaXBJc0NvbGxlY3Rpb246IGZhbHNlXG4gICAgICB9KVxuICAgICAgY29uc3Qgc2VyaWFsaXphYmxlU2luZ3VsYXJNb2RlbHNTZXQgPSBuZXcgU2V0KHNlcmlhbGl6YWJsZVNpbmd1bGFyTW9kZWxzKVxuXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcEVudHJ5IG9mIHNpbmd1bGFyUmVsYXRpb25zaGlwRW50cmllcykge1xuICAgICAgICBpZiAoIXNlcmlhbGl6YWJsZVNpbmd1bGFyTW9kZWxzU2V0LmhhcyhyZWxhdGlvbnNoaXBFbnRyeS5sb2FkZWRNb2RlbCkpIHtcbiAgICAgICAgICBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWxbcmVsYXRpb25zaGlwRW50cnkubW9kZWxJbmRleF1bcmVsYXRpb25zaGlwRW50cnkucmVsYXRpb25zaGlwTmFtZV0gPSBudWxsXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRNb2RlbCA9IChhd2FpdCB0aGlzLnNlcmlhbGl6ZUZyb250ZW5kTW9kZWxzKFtyZWxhdGlvbnNoaXBFbnRyeS5sb2FkZWRNb2RlbF0pKVswXVxuICAgICAgICBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWxbcmVsYXRpb25zaGlwRW50cnkubW9kZWxJbmRleF1bcmVsYXRpb25zaGlwRW50cnkucmVsYXRpb25zaGlwTmFtZV0gPSBzZXJpYWxpemVkTW9kZWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVkIG1vZGVscy5cbiAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/PltdfSAqL1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRNb2RlbHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBbbW9kZWxJbmRleCwgbW9kZWxdIG9mIG1vZGVscy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRBdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5zZXJpYWxpemVGcm9udGVuZE1vZGVsQXR0cmlidXRlcyhtb2RlbClcbiAgICAgIGNvbnN0IHByZWxvYWRlZFJlbGF0aW9uc2hpcHMgPSBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWxbbW9kZWxJbmRleF1cbiAgICAgIGNvbnN0IGFzc29jaWF0aW9uQ291bnRzID0gdHlwZW9mIG1vZGVsLmFzc29jaWF0aW9uQ291bnRzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBtb2RlbC5hc3NvY2lhdGlvbkNvdW50cygpXG4gICAgICAgIDoge31cbiAgICAgIGNvbnN0IHF1ZXJ5RGF0YVZhbHVlcyA9IHR5cGVvZiBtb2RlbC5xdWVyeURhdGFWYWx1ZXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG1vZGVsLnF1ZXJ5RGF0YVZhbHVlcygpXG4gICAgICAgIDoge31cbiAgICAgIGNvbnN0IGNvbXB1dGVkQWJpbGl0aWVzID0gdHlwZW9mIG1vZGVsLmNvbXB1dGVkQWJpbGl0aWVzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBtb2RlbC5jb21wdXRlZEFiaWxpdGllcygpXG4gICAgICAgIDoge31cbiAgICAgIGNvbnN0IGhhc0NvdW50cyA9IE9iamVjdC5rZXlzKGFzc29jaWF0aW9uQ291bnRzKS5sZW5ndGggPiAwXG4gICAgICBjb25zdCBoYXNRdWVyeURhdGEgPSBPYmplY3Qua2V5cyhxdWVyeURhdGFWYWx1ZXMpLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IGhhc0FiaWxpdGllcyA9IE9iamVjdC5rZXlzKGNvbXB1dGVkQWJpbGl0aWVzKS5sZW5ndGggPiAwXG4gICAgICBjb25zdCBoYXNQcmVsb2FkZWQgPSBPYmplY3Qua2V5cyhwcmVsb2FkZWRSZWxhdGlvbnNoaXBzKS5sZW5ndGggPiAwXG5cbiAgICAgIGlmICghaGFzUHJlbG9hZGVkICYmICFoYXNDb3VudHMgJiYgIWhhc1F1ZXJ5RGF0YSAmJiAhaGFzQWJpbGl0aWVzKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRNb2RlbHMucHVzaChzZXJpYWxpemVkQXR0cmlidXRlcylcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBTZXJpYWxpemVkLlxuICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgICBjb25zdCBzZXJpYWxpemVkID0gey4uLnNlcmlhbGl6ZWRBdHRyaWJ1dGVzfVxuXG4gICAgICBpZiAoaGFzUHJlbG9hZGVkKSBzZXJpYWxpemVkLl9fcHJlbG9hZGVkUmVsYXRpb25zaGlwcyA9IHByZWxvYWRlZFJlbGF0aW9uc2hpcHNcbiAgICAgIGlmIChoYXNDb3VudHMpIHNlcmlhbGl6ZWQuX19hc3NvY2lhdGlvbkNvdW50cyA9IGFzc29jaWF0aW9uQ291bnRzXG4gICAgICBpZiAoaGFzUXVlcnlEYXRhKSBzZXJpYWxpemVkLl9fcXVlcnlEYXRhID0gcXVlcnlEYXRhVmFsdWVzXG4gICAgICBpZiAoaGFzQWJpbGl0aWVzKSBzZXJpYWxpemVkLl9fYWJpbGl0aWVzID0gY29tcHV0ZWRBYmlsaXRpZXNcblxuICAgICAgc2VyaWFsaXplZE1vZGVscy5wdXNoKHNlcmlhbGl6ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRNb2RlbHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlcmlhbGl6ZSBmcm9udGVuZCBtb2RlbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbCAtIEZyb250ZW5kIG1vZGVsIHJlY29yZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSAtIFNlcmlhbGl6ZWQgZnJvbnRlbmQgbW9kZWwgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZUZyb250ZW5kTW9kZWwobW9kZWwpIHtcbiAgICBjb25zdCBzZXJpYWxpemVkTW9kZWxzID0gYXdhaXQgdGhpcy5zZXJpYWxpemVGcm9udGVuZE1vZGVscyhbbW9kZWxdKVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRNb2RlbHNbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHJlbmRlciBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZXJyb3IgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsUmVuZGVyRXJyb3IoZXJyb3JNZXNzYWdlKSB7XG4gICAgYXdhaXQgdGhpcy5sb2dnZXIuZXJyb3IoYEZyb250ZW5kIG1vZGVsIHJlcXVlc3QgZmFpbGVkOiAke2Vycm9yTWVzc2FnZX1gKVxuXG4gICAgY29uc3QgcmVuZGVyRXJyb3IgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHsoKGVycm9yTWVzc2FnZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZH0gKi8gKFxuICAgICAgLyoqXG4gICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICBAdHlwZSB7P30gKi8gKHRoaXMpLnJlbmRlckVycm9yXG4gICAgKVxuXG4gICAgaWYgKHR5cGVvZiByZW5kZXJFcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCByZW5kZXJFcnJvci5jYWxsKHRoaXMsIGZyb250ZW5kTW9kZWxDbGllbnRTYWZlRXJyb3JNZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZW5kZXIoe1xuICAgICAganNvbjogLyoqXG4gICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoe1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGZyb250ZW5kTW9kZWxDbGllbnRTYWZlRXJyb3JNZXNzYWdlLFxuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIlxuICAgICAgfSkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGVycm9yIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz59IC0gRXJyb3IgcGF5bG9hZC5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoZXJyb3JNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgIHN0YXR1czogXCJlcnJvclwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY2xpZW50IHNhZmUgZXJyb3IgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSAtIENsaWVudC1zYWZlIGVycm9yIHBheWxvYWQuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsQ2xpZW50U2FmZUVycm9yUGF5bG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKGZyb250ZW5kTW9kZWxDbGllbnRTYWZlRXJyb3JNZXNzYWdlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY2xpZW50IGVycm9yIHBheWxvYWQgZm9yIGVycm9yLlxuICAgKiBAcGFyYW0gez99IGVycm9yIC0gQ2F1Z2h0IGVycm9yLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IC0gQ2xpZW50IHBheWxvYWQgZm9yIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRNb2RlbENsaWVudEVycm9yUGF5bG9hZEZvckVycm9yKGVycm9yKSB7XG4gICAgY29uc3QgdmVsb2Npb3VzTWV0YWRhdGEgPSBmcm9udGVuZE1vZGVsVmVsb2Npb3VzTWV0YWRhdGFGb3JFcnJvcihlcnJvcilcbiAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSlcblxuICAgIGxldCB2YWxpZGF0aW9uRXJyb3JzUGF5bG9hZCA9IHt9XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSBlcnJvci5nZXRWYWxpZGF0aW9uRXJyb3JzKClcbiAgICAgIGNvbnN0IG1vZGVsID0gZXJyb3IuZ2V0TW9kZWwoKVxuICAgICAgLyoqXG4gICAgICAgKiBTdHJ1Y3R1cmVkIGVycm9ycy5cbiAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsIHt0eXBlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZnVsbE1lc3NhZ2U6IHN0cmluZ31bXT59ICovXG4gICAgICBjb25zdCBzdHJ1Y3R1cmVkRXJyb3JzID0ge31cblxuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIGluIHZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICAgICAgc3RydWN0dXJlZEVycm9yc1thdHRyaWJ1dGVOYW1lXSA9IHZhbGlkYXRpb25FcnJvcnNbYXR0cmlidXRlTmFtZV0ubWFwKGVyciA9PiAoe1xuICAgICAgICAgIHR5cGU6IGVyci50eXBlLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIGZ1bGxNZXNzYWdlOiBgJHttb2RlbC5nZXRNb2RlbENsYXNzKCkuaHVtYW5BdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpfSAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgfSkpXG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRpb25FcnJvcnNQYXlsb2FkID0ge1xuICAgICAgICBlcnJvclR5cGU6IFwidmFsaWRhdGlvbl9lcnJvclwiLFxuICAgICAgICB2YWxpZGF0aW9uRXJyb3JzOiBzdHJ1Y3R1cmVkRXJyb3JzXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChmcm9udGVuZE1vZGVsQ2xpZW50TWVzc2FnZUZvckVycm9yKGVycm9yKSksXG4gICAgICAuLi5mcm9udGVuZE1vZGVsRGVidWdQYXlsb2FkRm9yRXJyb3Ioe1xuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldEVudmlyb25tZW50KCksXG4gICAgICAgIGVycm9yXG4gICAgICB9KSxcbiAgICAgIC4uLih2ZWxvY2lvdXNNZXRhZGF0YSA/IHt2ZWxvY2lvdXM6IHZlbG9jaW91c01ldGFkYXRhfSA6IHt9KSxcbiAgICAgIC4uLnZhbGlkYXRpb25FcnJvcnNQYXlsb2FkLFxuICAgICAgLi4uKGF3YWl0IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmNsaWVudEVycm9yUGF5bG9hZEZvckVycm9yKHtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGNvbnRyb2xsZXI6IHRoaXMuY29uc3RydWN0b3IubmFtZVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbm9ybWFsaXplZEVycm9yLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLmdldFJlcXVlc3QoKVxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgbG9nIGVuZHBvaW50IGVycm9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEVycm9yIGxvZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hY3Rpb24gLSBFbmRwb2ludC9hY3Rpb24gbGFiZWwuXG4gICAqIEBwYXJhbSB7P30gYXJncy5lcnJvciAtIENhdWdodCBlcnJvci5cbiAgICogQHBhcmFtIHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIiB8IFwiY3VzdG9tLWNvbW1hbmRcIn0gW2FyZ3MuY29tbWFuZFR5cGVdIC0gRnJvbnRlbmQtbW9kZWwgY29tbWFuZCB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2FyZ3MubW9kZWxdIC0gUmVxdWVzdCBtb2RlbCBuYW1lIHdoZW4gYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2FyZ3MucmVxdWVzdElkXSAtIEJhdGNoIHJlcXVlc3QgaWQgd2hlbiBhdmFpbGFibGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIGxvZ2dpbmcuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsTG9nRW5kcG9pbnRFcnJvcih7YWN0aW9uLCBlcnJvciwgY29tbWFuZFR5cGUsIG1vZGVsLCByZXF1ZXN0SWR9KSB7XG4gICAgLy8gRXJyb3JzIGFubm90YXRlZCB3aXRoIGBlcnJvci52ZWxvY2lvdXMgPSB7Li4ufWAgYXJlIHVzZXItZmxvd1xuICAgIC8vIGZhaWx1cmVzIHRoZSBkZXZlbG9wZXIgaGFzIG1hcmtlZCBhcyBleHBlY3RlZCAoYmFkIHBhc3N3b3JkLFxuICAgIC8vIHZhbGlkYXRpb24gbWVzc2FnZSwgZXRjLikuIFN1cmZhY2UgdGhlIG1lc3NhZ2UgKyBtZXRhZGF0YSB0b1xuICAgIC8vIHRoZSBjbGllbnQgKGhhbmRsZWQgYnkgZnJvbnRlbmRNb2RlbENsaWVudEVycm9yUGF5bG9hZEZvckVycm9yKSxcbiAgICAvLyBidXQgc2tpcCB0aGUgZXJyb3IgbG9nIHNvIG1vbml0b3Jpbmcgc3RheXMgZm9jdXNlZCBvbiByZWFsXG4gICAgLy8gYmFja2VuZCBmYWlsdXJlcy5cbiAgICBpZiAoZnJvbnRlbmRNb2RlbEVycm9ySGFzVmVsb2Npb3VzTWV0YWRhdGEoZXJyb3IpKSByZXR1cm5cblxuICAgIGxldCByZXNvbHZlZE1vZGVsID0gbW9kZWxcblxuICAgIGlmICghcmVzb2x2ZWRNb2RlbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWRNb2RlbCA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLm1vZGVsXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmVzb2x2ZWRNb2RlbCA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgID8gYCR7ZXJyb3IubWVzc2FnZX1cXG4ke2Vycm9yLnN0YWNrIHx8IFwiXCJ9YFxuICAgICAgOiBTdHJpbmcoZXJyb3IpXG5cbiAgICBhd2FpdCB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGcm9udGVuZCBtb2RlbCBlbmRwb2ludCByZXF1ZXN0IGZhaWxlZFwiLCB7XG4gICAgICBhY3Rpb24sXG4gICAgICBjb21tYW5kVHlwZSxcbiAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICBtb2RlbDogcmVzb2x2ZWRNb2RlbCxcbiAgICAgIHJlcXVlc3RJZFxuICAgIH1dKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcmVuZGVyIGNvbW1hbmQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSB7XCJpbmRleFwiIHwgXCJmaW5kXCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCJ9IGFjdGlvbiAtIEZyb250ZW5kIGFjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiByZXNwb25zZSBoYXMgYmVlbiByZW5kZXJlZC5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kTW9kZWxSZW5kZXJDb21tYW5kUmVzcG9uc2UoYWN0aW9uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlUGF5bG9hZCA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbENvbW1hbmRQYXlsb2FkKGFjdGlvbilcbiAgICAgIGlmICghcmVzcG9uc2VQYXlsb2FkKSByZXR1cm5cblxuICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoe1xuICAgICAgICBqc29uOiAvKipcbiAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUocmVzcG9uc2VQYXlsb2FkKSlcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbExvZ0VuZHBvaW50RXJyb3Ioe2FjdGlvbiwgY29tbWFuZFR5cGU6IGFjdGlvbiwgZXJyb3J9KVxuXG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcih7XG4gICAgICAgIGpzb246IC8qKlxuICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxDbGllbnRFcnJvclBheWxvYWRGb3JFcnJvcihlcnJvcikpKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBjb21tYW5kIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7XCJpbmRleFwiIHwgXCJmaW5kXCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCJ9IGFjdGlvbiAtIEZyb250ZW5kIGFjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4gfCBudWxsPn0gLSBSZXNwb25zZSBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRNb2RlbENvbW1hbmRQYXlsb2FkKGFjdGlvbikge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlRnJvbnRlbmRNb2RlbENsYXNzSW5pdGlhbGl6ZWQoKVxuXG4gICAgaWYgKCEoYXdhaXQgdGhpcy5ydW5Gcm9udGVuZE1vZGVsQmVmb3JlQWN0aW9uKGFjdGlvbikpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VJbnN0YW5jZSgpXG5cbiAgICBpZiAoYWN0aW9uID09PSBcImluZGV4XCIpIHtcbiAgICAgIGlmICh0aGlzLmZyb250ZW5kTW9kZWxDb3VudFJlcXVlc3RlZCgpKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHJlc291cmNlLnN1cHBvcnRzQ291bnQoXCJpbmRleFwiKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb3VudCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gcmVzb3VyY2UgcmVjb3JkcyBhcmUgY3VzdG9taXplZFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb3VudDogYXdhaXQgcmVzb3VyY2UuY291bnQoKSxcbiAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGx1Y2sgPSB0aGlzLmZyb250ZW5kTW9kZWxQbHVjaygpXG5cbiAgICAgIGlmIChwbHVjay5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHJlc291cmNlLnN1cHBvcnRzUGx1Y2soXCJpbmRleFwiKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwbHVjayBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gcmVzb3VyY2UgcmVjb3JkcyBhcmUgY3VzdG9taXplZFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsUGx1Y2tWYWx1ZXMoe1xuICAgICAgICAgIHBsdWNrLFxuICAgICAgICAgIHF1ZXJ5OiB0aGlzLmZyb250ZW5kTW9kZWxJbmRleFF1ZXJ5KClcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgdmFsdWVzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kZWxzID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsUmVjb3JkcygpXG4gICAgICBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxDb21wdXRlQWJpbGl0aWVzKG1vZGVscylcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRNb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChtb2RlbHMubWFwKGFzeW5jIChtb2RlbCkgPT4gYXdhaXQgcmVzb3VyY2Uuc2VyaWFsaXplKG1vZGVsLCBcImluZGV4XCIpKSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZWxzOiBzZXJpYWxpemVkTW9kZWxzLFxuICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKClcbiAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IGlkID0gcGFyYW1zLmlkXG5cbiAgICBpZiAoYWN0aW9uID09PSBcImNyZWF0ZVwiKSB7XG4gICAgICBjb25zdCBtdXRhdGlvbkF0dHJpYnV0ZXMgPSBmcm9udGVuZE1vZGVsTXV0YXRpb25BdHRyaWJ1dGVzKHBhcmFtcylcbiAgICAgIGlmICh0eXBlb2YgbXV0YXRpb25BdHRyaWJ1dGVzID09PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKG11dGF0aW9uQXR0cmlidXRlcylcblxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxDcmVhdGVSZWNvcmQobXV0YXRpb25BdHRyaWJ1dGVzLmF0dHJpYnV0ZXMsIG11dGF0aW9uQXR0cmlidXRlcy5uZXN0ZWRBdHRyaWJ1dGVzKVxuXG4gICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoYCR7bW9kZWxDbGFzcy5uYW1lfSBub3QgZm91bmQuYClcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VyaWFsaXplZE1vZGVsID0gYXdhaXQgcmVzb3VyY2Uuc2VyaWFsaXplKG1vZGVsLCBcImNyZWF0ZVwiKVxuXG4gICAgICByZXR1cm4gZnJvbnRlbmRNb2RlbFNlcmlhbGl6ZWRNb2RlbFN1Y2Nlc3Moc2VyaWFsaXplZE1vZGVsKVxuICAgIH1cblxuICAgIGlmICgodHlwZW9mIGlkICE9PSBcInN0cmluZ1wiICYmIHR5cGVvZiBpZCAhPT0gXCJudW1iZXJcIikgfHwgYCR7aWR9YC5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKFwiRXhwZWN0ZWQgbW9kZWwgaWQuXCIpXG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gXCJhdHRhY2hcIikge1xuICAgICAgY29uc3QgYXR0YWNobWVudE5hbWUgPSBwYXJhbXMuYXR0YWNobWVudE5hbWVcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRJbnB1dCA9IHBhcmFtcy5hdHRhY2htZW50XG5cbiAgICAgIGlmICh0eXBlb2YgYXR0YWNobWVudE5hbWUgIT09IFwic3RyaW5nXCIgfHwgYXR0YWNobWVudE5hbWUubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKFwiRXhwZWN0ZWQgYXR0YWNobWVudE5hbWUuXCIpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgYXR0YWNobWVudElucHV0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoXCJFeHBlY3RlZCBhdHRhY2htZW50IGlucHV0LlwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbEZpbmRSZWNvcmQoXCJhdHRhY2hcIiwgaWQpXG5cbiAgICAgIGlmICghbW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChgJHttb2RlbENsYXNzLm5hbWV9IG5vdCBmb3VuZC5gKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBtb2RlbC5nZXRBdHRhY2htZW50QnlOYW1lKGF0dGFjaG1lbnROYW1lKS5hdHRhY2goYXR0YWNobWVudElucHV0KVxuICAgICAgY29uc3Qgc2VyaWFsaXplZE1vZGVsID0gYXdhaXQgdGhpcy5zZXJpYWxpemVGcm9udGVuZE1vZGVsKG1vZGVsKVxuXG4gICAgICByZXR1cm4gZnJvbnRlbmRNb2RlbFNlcmlhbGl6ZWRNb2RlbFN1Y2Nlc3Moc2VyaWFsaXplZE1vZGVsKVxuICAgIH1cblxuICAgIGlmIChhY3Rpb24gPT09IFwiZG93bmxvYWRcIikge1xuICAgICAgY29uc3QgYXR0YWNobWVudFBhcmFtcyA9IGZyb250ZW5kTW9kZWxBdHRhY2htZW50UGFyYW1zKHBhcmFtcylcbiAgICAgIGlmICh0eXBlb2YgYXR0YWNobWVudFBhcmFtcyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChhdHRhY2htZW50UGFyYW1zKVxuXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbEZpbmRSZWNvcmQoXCJkb3dubG9hZFwiLCBpZClcblxuICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKGAke21vZGVsQ2xhc3MubmFtZX0gbm90IGZvdW5kLmApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRvd25sb2FkZWRBdHRhY2htZW50ID0gYXdhaXQgbW9kZWwuZ2V0QXR0YWNobWVudEJ5TmFtZShhdHRhY2htZW50UGFyYW1zLmF0dGFjaG1lbnROYW1lKS5kb3dubG9hZChhdHRhY2htZW50UGFyYW1zLmF0dGFjaG1lbnRJZClcblxuICAgICAgaWYgKCFkb3dubG9hZGVkQXR0YWNobWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKFwiQXR0YWNobWVudCBub3QgZm91bmQuXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGF0dGFjaG1lbnQ6IHtcbiAgICAgICAgICBieXRlU2l6ZTogZG93bmxvYWRlZEF0dGFjaG1lbnQuYnl0ZVNpemUoKSxcbiAgICAgICAgICBjb250ZW50QmFzZTY0OiBkb3dubG9hZGVkQXR0YWNobWVudC5jb250ZW50KCkudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICAgICAgY29udGVudFR5cGU6IGRvd25sb2FkZWRBdHRhY2htZW50LmNvbnRlbnRUeXBlKCksXG4gICAgICAgICAgZmlsZW5hbWU6IGRvd25sb2FkZWRBdHRhY2htZW50LmZpbGVuYW1lKCksXG4gICAgICAgICAgaWQ6IGRvd25sb2FkZWRBdHRhY2htZW50LmlkKCksXG4gICAgICAgICAgdXJsOiBkb3dubG9hZGVkQXR0YWNobWVudC51cmwoKVxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gXCJ1cmxcIikge1xuICAgICAgY29uc3QgYXR0YWNobWVudFBhcmFtcyA9IGZyb250ZW5kTW9kZWxBdHRhY2htZW50UGFyYW1zKHBhcmFtcylcbiAgICAgIGlmICh0eXBlb2YgYXR0YWNobWVudFBhcmFtcyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChhdHRhY2htZW50UGFyYW1zKVxuXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbEZpbmRSZWNvcmQoXCJ1cmxcIiwgaWQpXG5cbiAgICAgIGlmICghbW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChgJHttb2RlbENsYXNzLm5hbWV9IG5vdCBmb3VuZC5gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB1cmwgPSBhd2FpdCBtb2RlbC5nZXRBdHRhY2htZW50QnlOYW1lKGF0dGFjaG1lbnRQYXJhbXMuYXR0YWNobWVudE5hbWUpLnVybChhdHRhY2htZW50UGFyYW1zLmF0dGFjaG1lbnRJZClcblxuICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChcIkF0dGFjaG1lbnQgVVJMIG5vdCBhdmFpbGFibGUuXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgIHVybFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY3Rpb24gPT09IFwiZmluZFwiKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbEZpbmRSZWNvcmQoXCJmaW5kXCIsIGlkKVxuXG4gICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoYCR7bW9kZWxDbGFzcy5uYW1lfSBub3QgZm91bmQuYClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsQ29tcHV0ZUFiaWxpdGllcyhbbW9kZWxdKVxuICAgICAgY29uc3Qgc2VyaWFsaXplZE1vZGVsID0gYXdhaXQgcmVzb3VyY2Uuc2VyaWFsaXplKG1vZGVsLCBcImZpbmRcIilcblxuICAgICAgcmV0dXJuIGZyb250ZW5kTW9kZWxTZXJpYWxpemVkTW9kZWxTdWNjZXNzKHNlcmlhbGl6ZWRNb2RlbClcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uID09PSBcInVwZGF0ZVwiKSB7XG4gICAgICBjb25zdCBtdXRhdGlvbkF0dHJpYnV0ZXMgPSBmcm9udGVuZE1vZGVsTXV0YXRpb25BdHRyaWJ1dGVzKHBhcmFtcylcbiAgICAgIGlmICh0eXBlb2YgbXV0YXRpb25BdHRyaWJ1dGVzID09PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKG11dGF0aW9uQXR0cmlidXRlcylcblxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxGaW5kUmVjb3JkKFwidXBkYXRlXCIsIGlkKVxuXG4gICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoYCR7bW9kZWxDbGFzcy5uYW1lfSBub3QgZm91bmQuYClcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZE1vZGVsID0gYXdhaXQgcmVzb3VyY2UudXBkYXRlKG1vZGVsLCBtdXRhdGlvbkF0dHJpYnV0ZXMuYXR0cmlidXRlcywge25lc3RlZEF0dHJpYnV0ZXM6IG11dGF0aW9uQXR0cmlidXRlcy5uZXN0ZWRBdHRyaWJ1dGVzLCBjb250cm9sbGVyOiB0aGlzfSlcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRNb2RlbCA9IGF3YWl0IHJlc291cmNlLnNlcmlhbGl6ZSh1cGRhdGVkTW9kZWwsIFwidXBkYXRlXCIpXG5cbiAgICAgIHJldHVybiBmcm9udGVuZE1vZGVsU2VyaWFsaXplZE1vZGVsU3VjY2VzcyhzZXJpYWxpemVkTW9kZWwpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxGaW5kUmVjb3JkKFwiZGVzdHJveVwiLCBpZClcblxuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoYCR7bW9kZWxDbGFzcy5uYW1lfSBub3QgZm91bmQuYClcbiAgICB9XG5cbiAgICBhd2FpdCByZXNvdXJjZS5kZXN0cm95KG1vZGVsKVxuXG4gICAgcmV0dXJuIHtzdGF0dXM6IFwic3VjY2Vzc1wifVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXBpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBTaGFyZWQgZnJvbnRlbmQgbW9kZWwgQVBJIGFjdGlvbiB3aXRoIGJhdGNoIHN1cHBvcnQuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZEFwaSgpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0KCkuaHR0cE1ldGhvZCgpID09PSBcIk9QVElPTlNcIikge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoe3N0YXR1czogMjA0LCBqc29uOiB7fX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUodGhpcy5wYXJhbXMoKSkpXG4gICAgY29uc3QgcmVxdWVzdHMgPSBBcnJheS5pc0FycmF5KHBhcmFtcy5yZXF1ZXN0cykgPyBwYXJhbXMucmVxdWVzdHMgOiBbcGFyYW1zXVxuICAgIC8qKlxuICAgICAqIFJlc3BvbnNlcy5cbiAgICAgIEB0eXBlIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCA/Pj59ICovXG4gICAgY29uc3QgcmVzcG9uc2VzID0gW11cblxuICAgIGZvciAoY29uc3QgcmVxdWVzdEVudHJ5IG9mIHJlcXVlc3RzKSB7XG4gICAgICBjb25zdCBjb21tYW5kVHlwZSA9IHJlcXVlc3RFbnRyeT8uY29tbWFuZFR5cGVcbiAgICAgIGNvbnN0IGN1c3RvbVBhdGggPSByZXF1ZXN0RW50cnk/LmN1c3RvbVBhdGhcbiAgICAgIGNvbnN0IG1vZGVsID0gcmVxdWVzdEVudHJ5Py5tb2RlbFxuICAgICAgY29uc3QgcGF5bG9hZCA9IHJlcXVlc3RFbnRyeT8ucGF5bG9hZFxuICAgICAgY29uc3QgcmVxdWVzdElkID0gcmVxdWVzdEVudHJ5Py5yZXF1ZXN0SWRcblxuICAgICAgaWYgKHR5cGVvZiBtb2RlbCAhPT0gXCJzdHJpbmdcIiB8fCBtb2RlbC5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgcmVzcG9uc2U6IHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChcIkV4cGVjdGVkIHJlcXVlc3QgbW9kZWwuXCIpXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQnVpbHRJbkNvbW1hbmQgPSBbXCJpbmRleFwiLCBcImZpbmRcIiwgXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIiwgXCJkZXN0cm95XCIsIFwiYXR0YWNoXCIsIFwiZG93bmxvYWRcIiwgXCJ1cmxcIl0uaW5jbHVkZXMoY29tbWFuZFR5cGUpXG5cbiAgICAgIGlmICghaXNCdWlsdEluQ29tbWFuZCAmJiAodHlwZW9mIGN1c3RvbVBhdGggIT09IFwic3RyaW5nXCIgfHwgIWN1c3RvbVBhdGguc3RhcnRzV2l0aChcIi9cIikpKSB7XG4gICAgICAgIHJlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgcmVzcG9uc2U6IHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChcIkV4cGVjdGVkIHJlcXVlc3QgY3VzdG9tUGF0aC5cIilcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHJlc3BvbnNlUGF5bG9hZFxuXG4gICAgICAgIGlmIChpc0J1aWx0SW5Db21tYW5kKSB7XG4gICAgICAgICAgY29uc3QgY29tbWFuZFBhcmFtcyA9IHtcbiAgICAgICAgICAgIC4uLihwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkID09PSBcIm9iamVjdFwiID8gcGF5bG9hZCA6IHt9KSxcbiAgICAgICAgICAgIG1vZGVsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzcG9uc2VQYXlsb2FkID0gYXdhaXQgdGhpcy53aXRoRnJvbnRlbmRNb2RlbFBhcmFtcyhjb21tYW5kUGFyYW1zLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy53aXRoRnJvbnRlbmRNb2RlbFJlcXVlc3RDb250ZXh0KGNvbW1hbmRQYXJhbXMsIHRoaXMucmVzcG9uc2UoKSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsQ29tbWFuZFBheWxvYWQoY29tbWFuZFR5cGUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzcG9uc2VQYXlsb2FkID0gYXdhaXQgdGhpcy5mcm9udGVuZEFwaUN1c3RvbUNvbW1hbmRQYXlsb2FkKHtcbiAgICAgICAgICAgIGN1c3RvbVBhdGgsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlUGF5bG9hZCB8fCB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoXCJBY3Rpb24gaGFsdGVkIGJ5IGJlZm9yZUFjdGlvbi5cIilcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbExvZ0VuZHBvaW50RXJyb3Ioe1xuICAgICAgICAgIGFjdGlvbjogXCJmcm9udGVuZEFwaVwiLFxuICAgICAgICAgIGNvbW1hbmRUeXBlLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIHJlcXVlc3RJZFxuICAgICAgICB9KVxuXG4gICAgICAgIHJlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgcmVzcG9uc2U6IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbENsaWVudEVycm9yUGF5bG9hZEZvckVycm9yKGVycm9yKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVuZGVyKHtcbiAgICAgIGpzb246IC8qKlxuICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHtcbiAgICAgICAgcmVzcG9uc2VzLFxuICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiXG4gICAgICB9KSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYSBjdXN0b20gZnJvbnRlbmQtbW9kZWwgY29tbWFuZCB0aHJvdWdoIHRoZSBzaGFyZWQgZnJvbnRlbmQtbW9kZWwgQVBJIGVuZHBvaW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY3VzdG9tUGF0aCAtIEN1c3RvbSBiYWNrZW5kIHJvdXRlIHBhdGguXG4gICAqIEBwYXJhbSB7P30gYXJncy5wYXlsb2FkIC0gUmVxdWVzdCBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IC0gUGFyc2VkIEpTT04gcmVzcG9uc2UgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kQXBpQ3VzdG9tQ29tbWFuZFBheWxvYWQoe2N1c3RvbVBhdGgsIHBheWxvYWR9KSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2Uoe2NvbmZpZ3VyYXRpb259KVxuICAgIGNvbnN0IHJlc29sdmVyID0gbmV3IFJvdXRlc1Jlc29sdmVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICByZXF1ZXN0OiB0aGlzLmdldFJlcXVlc3QoKSxcbiAgICAgIHJlc3BvbnNlXG4gICAgfSlcbiAgICByZXNvbHZlci5wYXJhbXMgPSB7fVxuICAgIGNvbnN0IHJvdXRlSG9va01hdGNoID0gYXdhaXQgcmVzb2x2ZXIucmVzb2x2ZVJvdXRlUmVzb2x2ZXJIb29rcyhjdXN0b21QYXRoKVxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Sb3V0ZXMgPSBjb25maWd1cmF0aW9uLmdldFJvdXRlcygpXG4gICAgY29uc3Qgcm91dGVNYXRjaCA9IHJvdXRlSG9va01hdGNoIHx8ICFjb25maWd1cmF0aW9uUm91dGVzPy5yb290Um91dGUgPyB1bmRlZmluZWQgOiByZXNvbHZlci5tYXRjaFBhdGhXaXRoUm91dGVzKGNvbmZpZ3VyYXRpb25Sb3V0ZXMucm9vdFJvdXRlLCBjdXN0b21QYXRoKVxuXG4gICAgaWYgKCFyb3V0ZUhvb2tNYXRjaCAmJiAhcm91dGVNYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjdXN0b20gZnJvbnRlbmQgbW9kZWwgcm91dGUgbWF0Y2hlZCAnJHtjdXN0b21QYXRofSdgKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvblBhcmFtID0gcm91dGVIb29rTWF0Y2g/LmFjdGlvbiB8fCByZXNvbHZlci5wYXJhbXMuYWN0aW9uXG4gICAgY29uc3QgY29udHJvbGxlclBhcmFtID0gcm91dGVIb29rTWF0Y2g/LmNvbnRyb2xsZXIgfHwgcmVzb2x2ZXIucGFyYW1zLmNvbnRyb2xsZXJcbiAgICBjb25zdCBhY3Rpb25WYWx1ZSA9IHR5cGVvZiBhY3Rpb25QYXJhbSA9PT0gXCJzdHJpbmdcIiA/IGFjdGlvblBhcmFtIDogKEFycmF5LmlzQXJyYXkoYWN0aW9uUGFyYW0pID8gYWN0aW9uUGFyYW1bMF0gOiB1bmRlZmluZWQpXG4gICAgY29uc3QgY29udHJvbGxlclZhbHVlID0gdHlwZW9mIGNvbnRyb2xsZXJQYXJhbSA9PT0gXCJzdHJpbmdcIiA/IGNvbnRyb2xsZXJQYXJhbSA6IChBcnJheS5pc0FycmF5KGNvbnRyb2xsZXJQYXJhbSkgPyBjb250cm9sbGVyUGFyYW1bMF0gOiB1bmRlZmluZWQpXG5cbiAgICBpZiAodHlwZW9mIGFjdGlvblZhbHVlICE9PSBcInN0cmluZ1wiIHx8IGFjdGlvblZhbHVlLmxlbmd0aCA8IDEgfHwgdHlwZW9mIGNvbnRyb2xsZXJWYWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCBjb250cm9sbGVyVmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDdXN0b20gZnJvbnRlbmQgbW9kZWwgcm91dGUgbWF0Y2hlZCAnJHtjdXN0b21QYXRofScgd2l0aG91dCBjb250cm9sbGVyL2FjdGlvbiBwYXJhbXNgKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbiA9IGluZmxlY3Rpb24uY2FtZWxpemUoYWN0aW9uVmFsdWUucmVwbGFjZUFsbChcIi1cIiwgXCJfXCIpLnJlcGxhY2VBbGwoXCIvXCIsIFwiX1wiKSwgdHJ1ZSlcbiAgICBjb25zdCBjb250cm9sbGVyID0gY29udHJvbGxlclZhbHVlXG4gICAgY29uc3QgY29udHJvbGxlclBhdGggPSByb3V0ZUhvb2tNYXRjaD8uY29udHJvbGxlclBhdGggfHwgYCR7Y29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9L2NvbnRyb2xsZXIuanNgXG4gICAgY29uc3Qgdmlld1BhdGggPSByb3V0ZUhvb2tNYXRjaD8udmlld1BhdGggfHwgYCR7Y29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9YFxuICAgIHJlc29sdmVyLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHJvdXRlSG9va01hdGNoPy5jb250cm9sbGVyQ2xhc3NcbiAgICBjb25zdCBjb250cm9sbGVyQ2xhc3MgPSBhd2FpdCByZXNvbHZlci5yZXNvbHZlQ29udHJvbGxlckNsYXNzKHtjb250cm9sbGVyUGF0aH0pXG4gICAgY29uc3QgY29udHJvbGxlclBhcmFtcyA9IHtcbiAgICAgIC4uLigocGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gXCJvYmplY3RcIikgPyBwYXlsb2FkIDoge30pLFxuICAgICAgLi4ucmVzb2x2ZXIucGFyYW1zXG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyQ2xhc3Moe1xuICAgICAgYWN0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBwYXJhbXM6IGNvbnRyb2xsZXJQYXJhbXMsXG4gICAgICByZXF1ZXN0OiAvKipcbiAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgIEB0eXBlIHtpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9ICovICh0aGlzLmdldFJlcXVlc3QoKSksXG4gICAgICByZXNwb25zZSxcbiAgICAgIHZpZXdQYXRoXG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMud2l0aEZyb250ZW5kTW9kZWxSZXF1ZXN0Q29udGV4dChjb250cm9sbGVyUGFyYW1zLCByZXNwb25zZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgY29udHJvbGxlckluc3RhbmNlLl9ydW5CZWZvcmVDYWxsYmFja3MoKVxuICAgICAgY29uc3QgY29udHJvbGxlck1ldGhvZHMgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+fSAqLyAoLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUgez99ICovIChjb250cm9sbGVySW5zdGFuY2UpKVxuXG4gICAgICBhd2FpdCBjb250cm9sbGVyTWV0aG9kc1thY3Rpb25dKClcbiAgICB9KVxuXG4gICAgY29uc3Qgc2V0Q29va2llSGVhZGVycyA9IHJlc3BvbnNlLmhlYWRlcnNbXCJTZXQtQ29va2llXCJdIHx8IFtdXG5cbiAgICBmb3IgKGNvbnN0IHNldENvb2tpZUhlYWRlciBvZiBzZXRDb29raWVIZWFkZXJzKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlKCkuYWRkSGVhZGVyKFwiU2V0LUNvb2tpZVwiLCBzZXRDb29raWVIZWFkZXIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gcmVzcG9uc2UuZ2V0Qm9keSgpXG5cbiAgICBpZiAodHlwZW9mIHJlc3BvbnNlQm9keSAhPT0gXCJzdHJpbmdcIiB8fCByZXNwb25zZUJvZHkubGVuZ3RoIDwgMSkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgLy8gUHJlc2VydmUgbmVzdGVkIHRyYW5zcG9ydCBtYXJrZXJzIHNvIHRoZSBvdXRlciBzaGFyZWQgZnJvbnRlbmQtbW9kZWwgQVBJXG4gICAgLy8gY2FuIHJldHVybiB0aGVtIHVuY2hhbmdlZCBhbmQgbGV0IHRoZSBjbGllbnQgaHlkcmF0ZSBvbmNlIGF0IHRoZSBlZGdlLlxuICAgIHJldHVybiAvKiogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChKU09OLnBhcnNlKHJlc3BvbnNlQm9keSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBpbmRleC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gQ29sbGVjdGlvbiBhY3Rpb24gZm9yIGZyb250ZW5kIG1vZGVsIHJlc291cmNlcy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kSW5kZXgoKSB7XG4gICAgaWYgKHRoaXMucmVxdWVzdCgpLmh0dHBNZXRob2QoKSA9PT0gXCJPUFRJT05TXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHtzdGF0dXM6IDIwNCwganNvbjoge319KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsUmVuZGVyQ29tbWFuZFJlc3BvbnNlKFwiaW5kZXhcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGZpbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIE1lbWJlciBmaW5kIGFjdGlvbiBmb3IgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRGaW5kKCkge1xuICAgIGlmICh0aGlzLnJlcXVlc3QoKS5odHRwTWV0aG9kKCkgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcih7c3RhdHVzOiAyMDQsIGpzb246IHt9fSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbFJlbmRlckNvbW1hbmRSZXNwb25zZShcImZpbmRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIHVwZGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gTWVtYmVyIHVwZGF0ZSBhY3Rpb24gZm9yIGZyb250ZW5kIG1vZGVsIHJlc291cmNlcy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kVXBkYXRlKCkge1xuICAgIGlmICh0aGlzLnJlcXVlc3QoKS5odHRwTWV0aG9kKCkgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcih7c3RhdHVzOiAyMDQsIGpzb246IHt9fSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbFJlbmRlckNvbW1hbmRSZXNwb25zZShcInVwZGF0ZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgYXR0YWNoLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBNZW1iZXIgYXR0YWNoIGFjdGlvbiBmb3IgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRBdHRhY2goKSB7XG4gICAgaWYgKHRoaXMucmVxdWVzdCgpLmh0dHBNZXRob2QoKSA9PT0gXCJPUFRJT05TXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHtzdGF0dXM6IDIwNCwganNvbjoge319KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsUmVuZGVyQ29tbWFuZFJlc3BvbnNlKFwiYXR0YWNoXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBkb3dubG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gTWVtYmVyIGRvd25sb2FkIGFjdGlvbiBmb3IgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmREb3dubG9hZCgpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0KCkuaHR0cE1ldGhvZCgpID09PSBcIk9QVElPTlNcIikge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoe3N0YXR1czogMjA0LCBqc29uOiB7fX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxSZW5kZXJDb21tYW5kUmVzcG9uc2UoXCJkb3dubG9hZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgdXJsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBNZW1iZXIgVVJMIGFjdGlvbiBmb3IgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRVcmwoKSB7XG4gICAgaWYgKHRoaXMucmVxdWVzdCgpLmh0dHBNZXRob2QoKSA9PT0gXCJPUFRJT05TXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHtzdGF0dXM6IDIwNCwganNvbjoge319KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsUmVuZGVyQ29tbWFuZFJlc3BvbnNlKFwidXJsXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBjcmVhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIE1lbWJlciBjcmVhdGUgYWN0aW9uIGZvciBmcm9udGVuZCBtb2RlbCByZXNvdXJjZXMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZENyZWF0ZSgpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0KCkuaHR0cE1ldGhvZCgpID09PSBcIk9QVElPTlNcIikge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoe3N0YXR1czogMjA0LCBqc29uOiB7fX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxSZW5kZXJDb21tYW5kUmVzcG9uc2UoXCJjcmVhdGVcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGRlc3Ryb3kuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIE1lbWJlciBkZXN0cm95IGFjdGlvbiBmb3IgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmREZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJlcXVlc3QoKS5odHRwTWV0aG9kKCkgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcih7c3RhdHVzOiAyMDQsIGpzb246IHt9fSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbFJlbmRlckNvbW1hbmRSZXNwb25zZShcImRlc3Ryb3lcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGN1c3RvbSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBDdXN0b20gY29sbGVjdGlvbi9tZW1iZXIgY29tbWFuZCBhY3Rpb24gZm9yIGZyb250ZW5kLW1vZGVsIHJlc291cmNlcy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kQ3VzdG9tQ29tbWFuZCgpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0KCkuaHR0cE1ldGhvZCgpID09PSBcIk9QVElPTlNcIikge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoe3N0YXR1czogMjA0LCBqc29uOiB7fX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2VQYXlsb2FkID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZFBheWxvYWQoKVxuXG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcih7XG4gICAgICAgIGpzb246IC8qKlxuICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShyZXNwb25zZVBheWxvYWQpKVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsTG9nRW5kcG9pbnRFcnJvcih7YWN0aW9uOiBcImZyb250ZW5kQ3VzdG9tQ29tbWFuZFwiLCBjb21tYW5kVHlwZTogXCJjdXN0b20tY29tbWFuZFwiLCBlcnJvcn0pXG5cbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHtcbiAgICAgICAganNvbjogLyoqXG4gICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbENsaWVudEVycm9yUGF5bG9hZEZvckVycm9yKGVycm9yKSkpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGN1c3RvbSBjb21tYW5kIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gLSBSZXNwb25zZSBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRQYXlsb2FkKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpXG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHBhcmFtcy5mcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZE1ldGhvZE5hbWVcbiAgICBjb25zdCBzY29wZSA9IHBhcmFtcy5mcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZFNjb3BlXG5cbiAgICBpZiAodHlwZW9mIG1ldGhvZE5hbWUgIT09IFwic3RyaW5nXCIgfHwgbWV0aG9kTmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKFwiRXhwZWN0ZWQgZnJvbnRlbmQtbW9kZWwgY3VzdG9tIGNvbW1hbmQgbWV0aG9kIG5hbWUuXCIpXG4gICAgfVxuXG4gICAgaWYgKHNjb3BlICE9PSBcImNvbGxlY3Rpb25cIiAmJiBzY29wZSAhPT0gXCJtZW1iZXJcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChcIkV4cGVjdGVkIGZyb250ZW5kLW1vZGVsIGN1c3RvbSBjb21tYW5kIHNjb3BlLlwiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKCkpXG4gICAgY29uc3QgY29tbWFuZE1ldGhvZCA9IHJlc291cmNlW21ldGhvZE5hbWVdXG5cbiAgICBpZiAodHlwZW9mIGNvbW1hbmRNZXRob2QgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChgTWlzc2luZyBmcm9udGVuZC1tb2RlbCBjdXN0b20gY29tbWFuZCAnJHttZXRob2ROYW1lfScuYClcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZVBheWxvYWQgPSBhd2FpdCBjb21tYW5kTWV0aG9kLmNhbGwocmVzb3VyY2UpXG5cbiAgICBpZiAoIXJlc3BvbnNlUGF5bG9hZCB8fCB0eXBlb2YgcmVzcG9uc2VQYXlsb2FkICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4ge3N0YXR1czogXCJzdWNjZXNzXCJ9XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKFxuICAgICAgYXdhaXQgdGhpcy5hdXRvU2VyaWFsaXplRnJvbnRlbmRNb2RlbHNJblBheWxvYWQoXG4gICAgICAgIHJlc3BvbnNlUGF5bG9hZCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgQHR5cGUge3tzZXJpYWxpemU6IChtb2RlbDogPywgYWN0aW9uOiBzdHJpbmcpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fX0gKi8gKHJlc291cmNlKSxcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWxrcyBhIGN1c3RvbS1jb21tYW5kIHJlc3BvbnNlIHBheWxvYWQgYW5kIHJlcGxhY2VzIGFueSBiYWNrZW5kIGBSZWNvcmRgXG4gICAqIGluc3RhbmNlIHdpdGggdGhlIHJlc291cmNlJ3MgcGVyLWFjdGlvbiBzZXJpYWxpemVkIGZvcm0gc28gaGFuZGxlcnMgY2FuXG4gICAqIHJldHVybiBge3JlY29yZCwgc3RhdHVzOiBcIm9rXCJ9YCBpbnN0ZWFkIG9mIGV4cGxpY2l0bHkgY2FsbGluZ1xuICAgKiBgYXdhaXQgdGhpcy5zZXJpYWxpemUocmVjb3JkLCBhY3Rpb24pYC4gUGxhaW4gb2JqZWN0cywgYXJyYXlzLCBhbmRcbiAgICogcHJpbWl0aXZlIHZhbHVlcyBwYXNzIHRocm91Z2ggYW5kIGFyZSBsYXRlciBlbmNvZGVkIGJ5XG4gICAqIGBzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVgLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gUGF5bG9hZCB2YWx1ZS5cbiAgICogQHBhcmFtIHt7c2VyaWFsaXplOiAobW9kZWw6ID8sIGFjdGlvbjogc3RyaW5nKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn19IHJlc291cmNlIC0gUmVzb3VyY2UgaW5zdGFuY2UgcHJvdmlkaW5nIGBzZXJpYWxpemVgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gQ3VzdG9tIGNvbW1hbmQgbWV0aG9kIG5hbWUgcGFzc2VkIHRvIGByZXNvdXJjZS5zZXJpYWxpemVgIGZvciBwZXItYWN0aW9uIGF1dGhvcml6YXRpb24gZmlsdGVyaW5nLlxuICAgKiBAcGFyYW0ge1dlYWtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gUmVjdXJzaW9uIHN0YWNrIG9mIHBsYWluLW9iamVjdCBjb250YWluZXJzIGN1cnJlbnRseSBiZWluZyB3YWxrZWQuIE1lbWJlcnNoaXAgaXMgYWRkZWQgb24gZW50cnkgYW5kIHJlbW92ZWQgb24gZXhpdCBzbyBhIGNvbnRhaW5lciBzaGFyZWQgYmV0d2VlbiBzaWJsaW5ncyAoaS5lLiByZWZlcmVuY2VkIHR3aWNlIGJ1dCBub3QgY3ljbGljYWxseSkgaXMgd2Fsa2VkIG9uIGVhY2ggcmVmZXJlbmNlIGluc3RlYWQgb2YgYmVpbmcgc2hvcnQtY2lyY3VpdGVkIHRoZSBzZWNvbmQgdGltZSwgd2hpY2ggd291bGQgbGV0IGJhY2tlbmQgYFJlY29yZGAgaW5zdGFuY2VzIGluc2lkZSBpdCBieXBhc3MgYHJlc291cmNlLnNlcmlhbGl6ZWAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIFBheWxvYWQgd2l0aCBiYWNrZW5kIGBSZWNvcmRgIGluc3RhbmNlcyByZXBsYWNlZCBieSBzZXJpYWxpemVkIG1hcmtlcnMuXG4gICAqL1xuICBhc3luYyBhdXRvU2VyaWFsaXplRnJvbnRlbmRNb2RlbHNJblBheWxvYWQodmFsdWUsIHJlc291cmNlLCBhY3Rpb24sIHNlZW4gPSBuZXcgV2Vha1NldCgpKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGlmIChpc0JhY2tlbmRNb2RlbEluc3RhbmNlKHZhbHVlKSkge1xuICAgICAgY29uc3QgcmljaFNlcmlhbGl6ZWQgPSBhd2FpdCByZXNvdXJjZS5zZXJpYWxpemUodmFsdWUsIGFjdGlvbilcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge3tjb25zdHJ1Y3Rvcjoge2dldE1vZGVsTmFtZT86ICgpID0+IHN0cmluZywgbmFtZT86IHN0cmluZ319fSAqLyAodmFsdWUpLmNvbnN0cnVjdG9yXG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSB0eXBlb2YgbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCkgOiAobW9kZWxDbGFzcy5uYW1lIHx8IFwiXCIpXG5cbiAgICAgIC8vIFdyYXAgdGhlIHJlc291cmNlLXNlcmlhbGl6ZWQgcGF5bG9hZCBpbiB0aGUgZnJvbnRlbmRfbW9kZWwgdHJhbnNwb3J0XG4gICAgICAvLyBtYXJrZXIuIE1hcmtlci1iYXNlZCBkZWNvZGluZyByb3V0ZXMgdGhyb3VnaCBgaW5zdGFudGlhdGVGcm9tUmVzcG9uc2VgLFxuICAgICAgLy8gc28gYWJpbGl0aWVzIC8gcXVlcnlEYXRhIC8gYXNzb2NpYXRpb25Db3VudHMgLyBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzXG4gICAgICAvLyBiYWtlZCBpbnRvIHRoZSByaWNoIGF0dHJpYnV0ZXMgYnkgYHJlc291cmNlLnNlcmlhbGl6ZWAgYXJlIHJlc3RvcmVkIG9uXG4gICAgICAvLyB0aGUgY2xpZW50IHdpdGhvdXQgY2FsbGVycyBuZWVkaW5nIHRvIHdyYXAgbW9kZWxzIG1hbnVhbGx5LlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX192ZWxvY2lvdXNfdHlwZTogXCJmcm9udGVuZF9tb2RlbFwiLFxuICAgICAgICBhdHRyaWJ1dGVzOiByaWNoU2VyaWFsaXplZCxcbiAgICAgICAgbW9kZWxOYW1lXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvKipcbiAgICAgICAqIFJlc3VsdC5cbiAgICAgICAgQHR5cGUge0FycmF5PD8+fSAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB2YWx1ZSkge1xuICAgICAgICByZXN1bHQucHVzaChhd2FpdCB0aGlzLmF1dG9TZXJpYWxpemVGcm9udGVuZE1vZGVsc0luUGF5bG9hZChlbnRyeSwgcmVzb3VyY2UsIGFjdGlvbiwgc2VlbikpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAodmFsdWUpXG5cbiAgICAgIGlmIChzZWVuLmhhcyhjb250YWluZXIpKSB7XG4gICAgICAgIC8vIEN5Y2xpYyBiYWNrLXJlZmVyZW5jZSBhbG9uZyB0aGUgY3VycmVudCByZWN1cnNpb24gcGF0aDsgdGhlXG4gICAgICAgIC8vIGFuY2VzdG9yIGZyYW1lIGlzIHN0aWxsIHdhbGtpbmcgdGhpcyBjb250YWluZXIgYW5kIHdpbGwgcHJvZHVjZVxuICAgICAgICAvLyBpdHMgc2VyaWFsaXplZCBmb3JtLiBSZXR1cm5pbmcgdGhlIG9yaWdpbmFsIGNvbnRhaW5lciBoZXJlXG4gICAgICAgIC8vIGJyZWFrcyB0aGUgY3ljbGUgd2l0aG91dCBieXBhc3NpbmcgdGhlIHdhbGtlciBmb3Igc2libGluZ3MgdGhhdFxuICAgICAgICAvLyBzaGFyZSBhIG5vbi1jeWNsaWMgcmVmZXJlbmNlICh0aG9zZSByZS1lbnRlciB0aGUgYnJhbmNoIGJlbG93XG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIGNvbnRhaW5lciBpcyByZW1vdmVkIGZyb20gYHNlZW5gIG9uIHN0YWNrIGV4aXQpLlxuICAgICAgICByZXR1cm4gY29udGFpbmVyXG4gICAgICB9XG5cbiAgICAgIHNlZW4uYWRkKGNvbnRhaW5lcilcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJlc3VsdC5cbiAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBuZXN0ZWRdIG9mIE9iamVjdC5lbnRyaWVzKGNvbnRhaW5lcikpIHtcbiAgICAgICAgICAvLyBgYXNzaWduU2FmZVByb3BlcnR5YCBzdG9yZXMga2V5cyBsaWtlIGBfX3Byb3RvX19gIGFzIG93blxuICAgICAgICAgIC8vIGRhdGEgcHJvcGVydGllcyBpbnN0ZWFkIG9mIGludm9raW5nIHRoZSBwcm90b3R5cGUgc2V0dGVyLFxuICAgICAgICAgIC8vIHNvIGEgY3VzdG9tLWNvbW1hbmQgcmVzcG9uc2UgdGhhdCBlY2hvZXMgcGFyc2VkIGNsaWVudFxuICAgICAgICAgIC8vIGlucHV0IGNhbm5vdCBwb2xsdXRlIGBPYmplY3QucHJvdG90eXBlYCBoZXJlLiBUaGUgdHJhbnNwb3J0XG4gICAgICAgICAgLy8gc2VyaWFsaXplciBhcHBsaWVzIHRoZSBzYW1lIHByb3RlY3Rpb24gb24gaXRzIG93biBwYXNzOyB3ZVxuICAgICAgICAgIC8vIGp1c3QgcHJlc2VydmUgaXQgYWNyb3NzIHRoZSBhdXRvLXNlcmlhbGl6ZSB3YWxrLlxuICAgICAgICAgIGFzc2lnblNhZmVQcm9wZXJ0eShyZXN1bHQsIGtleSwgYXdhaXQgdGhpcy5hdXRvU2VyaWFsaXplRnJvbnRlbmRNb2RlbHNJblBheWxvYWQobmVzdGVkLCByZXNvdXJjZSwgYWN0aW9uLCBzZWVuKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNlZW4uZGVsZXRlKGNvbnRhaW5lcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG59XG4iXX0=
3020
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLFFBQVEsTUFBTSxrQ0FBa0MsQ0FBQTtBQUN2RCxPQUFPLHlCQUF5QixNQUFNLDRDQUE0QyxDQUFBO0FBQ2xGLE9BQU8sRUFBQyx3Q0FBd0MsRUFBRSxnREFBZ0QsRUFBRSx5QkFBeUIsRUFBRSx1Q0FBdUMsRUFBQyxNQUFNLDBDQUEwQyxDQUFBO0FBQ3ZOLE9BQU8sRUFBQyxjQUFjLElBQUksbUJBQW1CLEVBQUUsY0FBYyxJQUFJLG1CQUFtQixFQUFFLGNBQWMsSUFBSSxtQkFBbUIsRUFBRSxnQkFBZ0IsSUFBSSxxQkFBcUIsRUFBRSx1QkFBdUIsSUFBSSw0QkFBNEIsRUFBRSxhQUFhLElBQUksa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUN2UyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsc0NBQXNDLEVBQUUsc0JBQXNCLEVBQUUsb0NBQW9DLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQTtBQUNyTCxPQUFPLGNBQWMsTUFBTSxzQkFBc0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFDMUQsT0FBTyxjQUFjLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxhQUFhLE1BQU0seUJBQXlCLENBQUE7QUFFbkQ7Ozs7R0FJRztBQUNILFNBQVMsNkJBQTZCLENBQUMsT0FBTztJQUM1QyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRXpCLE9BQU8scUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDdkMsQ0FBQztBQUVEOzs7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ZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBDb250cm9sbGVyIGZyb20gXCIuL2NvbnRyb2xsZXIuanNcIlxuaW1wb3J0IFJlc3BvbnNlIGZyb20gXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiXG5pbXBvcnQgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBmcm9tIFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbiwgZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uLCBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoLCBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3R9IGZyb20gXCIuL2Zyb250ZW5kLW1vZGVscy9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcbmltcG9ydCB7bm9ybWFsaXplR3JvdXAgYXMgbm9ybWFsaXplUXVlcnlHcm91cCwgbm9ybWFsaXplSm9pbnMgYXMgbm9ybWFsaXplUXVlcnlKb2lucywgbm9ybWFsaXplUGx1Y2sgYXMgbm9ybWFsaXplUXVlcnlQbHVjaywgbm9ybWFsaXplUHJlbG9hZCBhcyBub3JtYWxpemVRdWVyeVByZWxvYWQsIG5vcm1hbGl6ZVNlYXJjaE9wZXJhdG9yIGFzIG5vcm1hbGl6ZVF1ZXJ5U2VhcmNoT3BlcmF0b3IsIG5vcm1hbGl6ZVNvcnQgYXMgbm9ybWFsaXplUXVlcnlTb3J0fSBmcm9tIFwiLi9mcm9udGVuZC1tb2RlbHMvcXVlcnkuanNcIlxuaW1wb3J0IHthc3NpZ25TYWZlUHJvcGVydHksIGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlLCBpc0JhY2tlbmRNb2RlbEluc3RhbmNlLCBzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWV9IGZyb20gXCIuL2Zyb250ZW5kLW1vZGVscy90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5pbXBvcnQgUm91dGVzUmVzb2x2ZXIgZnJvbSBcIi4vcm91dGVzL3Jlc29sdmVyLmpzXCJcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yfSBmcm9tIFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuaW1wb3J0IFZlbG9jaW91c0Vycm9yIGZyb20gXCIuL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tIFwiLi91dGlscy9wbGFpbi1vYmplY3QuanNcIlxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIHByZWxvYWQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvaW5kZXguanNcIikuTmVzdGVkUHJlbG9hZFJlY29yZCB8IHN0cmluZyB8IHN0cmluZ1tdIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGx9IHByZWxvYWQgLSBQcmVsb2FkIHNob3J0aGFuZC5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQgfCBudWxsfSAtIE5vcm1hbGl6ZWQgcHJlbG9hZC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFByZWxvYWQocHJlbG9hZCkge1xuICBpZiAoIXByZWxvYWQpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZVF1ZXJ5UHJlbG9hZChwcmVsb2FkKVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIGpvaW5zLlxuICogQHBhcmFtIHs/fSBqb2lucyAtIEpvaW5zIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSAtIE5vcm1hbGl6ZWQgcmVsYXRpb25zaGlwLW9iamVjdCBqb2lucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEpvaW5zKGpvaW5zKSB7XG4gIGlmICgham9pbnMpIHJldHVybiBudWxsXG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbm9ybWFsaXplUXVlcnlKb2lucyhqb2lucylcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yRm9yRXJyb3IoZXJyb3IpXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBzZWxlY3QuXG4gKiBAcGFyYW0gez99IHNlbGVjdCAtIFNlbGVjdCBwYXlsb2FkLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBbcm9vdE1vZGVsTmFtZV0gLSBPcHRpb25hbCByb290IG1vZGVsIG5hbWUgZm9yIHNob3J0aGFuZCBwYXlsb2Fkcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCBudWxsfSAtIE5vcm1hbGl6ZWQgbW9kZWwtbmFtZSBrZXllZCBzZWxlY3QgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsU2VsZWN0KHNlbGVjdCwgcm9vdE1vZGVsTmFtZSA9IG51bGwpIHtcbiAgaWYgKCFzZWxlY3QpIHJldHVybiBudWxsXG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAoIXJvb3RNb2RlbE5hbWUpIHtcbiAgICAgIHRocm93IGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IoXCJJbnZhbGlkIHNlbGVjdCBzaG9ydGhhbmQgd2l0aG91dCByb290IG1vZGVsIG5hbWVcIilcbiAgICB9XG5cbiAgICByZXR1cm4ge1tyb290TW9kZWxOYW1lXTogW3NlbGVjdF19XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3QpKSB7XG4gICAgaWYgKCFyb290TW9kZWxOYW1lKSB7XG4gICAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKFwiSW52YWxpZCBzZWxlY3Qgc2hvcnRoYW5kIHdpdGhvdXQgcm9vdCBtb2RlbCBuYW1lXCIpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIHNlbGVjdCkge1xuICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVOYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgc2VsZWN0IGF0dHJpYnV0ZSBmb3IgJHtyb290TW9kZWxOYW1lfTogJHt0eXBlb2YgYXR0cmlidXRlTmFtZX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7W3Jvb3RNb2RlbE5hbWVdOiBBcnJheS5mcm9tKG5ldyBTZXQoc2VsZWN0KSl9XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3Qoc2VsZWN0KSkge1xuICAgIHRocm93IGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgc2VsZWN0IHR5cGU6ICR7dHlwZW9mIHNlbGVjdH1gKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZWQuXG4gICAgQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgZm9yIChjb25zdCBbbW9kZWxOYW1lLCBzZWxlY3RWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VsZWN0KSkge1xuICAgIGlmICh0eXBlb2Ygc2VsZWN0VmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG5vcm1hbGl6ZWRbbW9kZWxOYW1lXSA9IFtzZWxlY3RWYWx1ZV1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdFZhbHVlKSkge1xuICAgICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCBzZWxlY3QgdmFsdWUgZm9yICR7bW9kZWxOYW1lfTogJHt0eXBlb2Ygc2VsZWN0VmFsdWV9YClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2Ygc2VsZWN0VmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIHNlbGVjdCBhdHRyaWJ1dGUgZm9yICR7bW9kZWxOYW1lfTogJHt0eXBlb2YgYXR0cmlidXRlTmFtZX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vcm1hbGl6ZWRbbW9kZWxOYW1lXSA9IEFycmF5LmZyb20obmV3IFNldChzZWxlY3RWYWx1ZSkpXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIEZyb250ZW5kTW9kZWxTZWFyY2ggdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxTZWFyY2hcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2x1bW4gLSBDb2x1bW4gb3IgYXR0cmlidXRlIG5hbWUuXG4gKiBAcHJvcGVydHkge1wiZXFcIiB8IFwibGlrZVwiIHwgXCJub3RFcVwiIHwgXCJndFwiIHwgXCJndGVxXCIgfCBcImx0XCIgfCBcImx0ZXFcIn0gb3BlcmF0b3IgLSBTZWFyY2ggb3BlcmF0b3IuXG4gKiBAcHJvcGVydHkgez99IHZhbHVlIC0gU2VhcmNoIHZhbHVlLlxuICovXG5cbi8qKlxuICogRnJvbnRlbmRNb2RlbFNvcnQgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxTb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sdW1uIC0gQXR0cmlidXRlIG5hbWUgdG8gc29ydCBieS5cbiAqIEBwcm9wZXJ0eSB7XCJhc2NcIiB8IFwiZGVzY1wifSBkaXJlY3Rpb24gLSBTb3J0IGRpcmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aCBmcm9tIHJvb3QgbW9kZWwuXG4gKi9cblxuLyoqXG4gKiBGcm9udGVuZE1vZGVsR3JvdXAgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxHcm91cFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbHVtbiAtIEF0dHJpYnV0ZSBuYW1lIHRvIGdyb3VwIGJ5LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gcGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoIGZyb20gcm9vdCBtb2RlbC5cbiAqL1xuXG4vKipcbiAqIEZyb250ZW5kTW9kZWxQbHVjayB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFBsdWNrXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sdW1uIC0gQXR0cmlidXRlIG5hbWUgdG8gcGx1Y2suXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBwYXRoIC0gUmVsYXRpb25zaGlwIHBhdGggZnJvbSByb290IG1vZGVsLlxuICovXG5cbi8qKlxuICogRnJvbnRlbmRNb2RlbFBhZ2luYXRpb24gdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxQYWdpbmF0aW9uXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGxpbWl0IC0gTWF4aW11bSBudW1iZXIgb2YgcmVjb3Jkcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gb2Zmc2V0IC0gTnVtYmVyIG9mIHJlY29yZHMgdG8gc2tpcC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gcGFnZSAtIDEtYmFzZWQgcGFnZSBudW1iZXIuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHBlclBhZ2UgLSBQYWdlIHNpemUuXG4gKi9cblxuY29uc3QgZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzU3ltYm9sID0gU3ltYm9sKFwiZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzXCIpXG5jb25zdCBmcm9udGVuZE1vZGVsR3JvdXBlZENvbHVtbnNTeW1ib2wgPSBTeW1ib2woXCJmcm9udGVuZE1vZGVsR3JvdXBlZENvbHVtbnNcIilcbmNvbnN0IGZyb250ZW5kTW9kZWxXaGVyZU5vTWF0Y2hTeW1ib2wgPSBTeW1ib2woXCJmcm9udGVuZE1vZGVsV2hlcmVOb01hdGNoXCIpXG5jb25zdCBmcm9udGVuZE1vZGVsQ2xpZW50U2FmZUVycm9yTWVzc2FnZSA9IFwiUmVxdWVzdCBmYWlsZWQuXCJcbmNvbnN0IGZyb250ZW5kTW9kZWxEZWJ1Z0Vycm9yRW52aXJvbm1lbnRzID0gbmV3IFNldChbXCJkZXZlbG9wbWVudFwiLCBcInRlc3RcIl0pXG5cbi8qKlxuICogUnVucyBmcm9udGVuZCBtb2RlbCBxdWVyeSBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBxdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCAmIHtbZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzU3ltYm9sXT86IFNldDxzdHJpbmc+LCBbZnJvbnRlbmRNb2RlbEdyb3VwZWRDb2x1bW5zU3ltYm9sXT86IFNldDxzdHJpbmc+fX0gLSBRdWVyeSBtZXRhZGF0YSBhY2Nlc3MgaGVscGVyLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsUXVlcnlNZXRhZGF0YShxdWVyeSkge1xuICByZXR1cm4gLyoqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS4gQHR5cGUge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCAmIHtbZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzU3ltYm9sXT86IFNldDxzdHJpbmc+LCBbZnJvbnRlbmRNb2RlbEdyb3VwZWRDb2x1bW5zU3ltYm9sXT86IFNldDxzdHJpbmc+fX0gKi8gKHF1ZXJ5KVxufVxuXG4vKipcbiAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgdmFsaWRhdGlvbiBlcnJvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlLlxuICogQHJldHVybnMge1ZlbG9jaW91c0Vycm9yfSAtIENsaWVudC1zYWZlIHZhbGlkYXRpb24gZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IobWVzc2FnZSkge1xuICByZXR1cm4gVmVsb2Npb3VzRXJyb3Iuc2FmZShtZXNzYWdlLCB7Y29kZTogXCJmcm9udGVuZC1tb2RlbC12YWxpZGF0aW9uXCJ9KVxufVxuXG4vKipcbiAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgdmFsaWRhdGlvbiBlcnJvciBmb3IgZXJyb3IuXG4gKiBAcGFyYW0gez99IGVycm9yIC0gRXJyb3IgcmFpc2VkIHdoaWxlIG5vcm1hbGl6aW5nIGNsaWVudCBxdWVyeSBwYXJhbXMuXG4gKiBAcmV0dXJucyB7VmVsb2Npb3VzRXJyb3J9IC0gQ2xpZW50LXNhZmUgdmFsaWRhdGlvbiBlcnJvciBwcmVzZXJ2aW5nIHRoZSBub3JtYWxpemVyIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3JGb3JFcnJvcihlcnJvcikge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNFcnJvciAmJiBlcnJvci5zYWZlVG9FeHBvc2UpIHJldHVybiBlcnJvclxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgPyBlcnJvci5tZXNzYWdlXG4gICAgOiBTdHJpbmcoZXJyb3IpXG5cbiAgcmV0dXJuIGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBlcnJvciBjYXJyaWVzIGFuIGBlcnJvci52ZWxvY2lvdXNgIG1ldGFkYXRhIGJhZy4gVGhlXG4gKiBwcmVzZW5jZSBvZiBhbnkgc3VjaCBiYWcgbWFya3MgdGhlIGVycm9yIGFzIFwiYW5ub3RhdGVkIGJ5IHRoZVxuICogZGV2ZWxvcGVyIGZvciB0aGUgZnJvbnRlbmRcIiDigJQgdGhlIGZyYW1ld29yayB0cmVhdHMgaXQgYXNcbiAqIHVzZXItZmFjaW5nOiBzdXJmYWNlIHRoZSBtZXNzYWdlLCBmb3J3YXJkIHRoZSBtZXRhZGF0YSwgYW5kIHNraXBcbiAqIHRoZSBub2lzeSBlbmRwb2ludC1lcnJvciBsb2cuXG4gKiBAcGFyYW0gez99IGVycm9yIC0gQ2F1Z2h0IGVycm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxFcnJvckhhc1ZlbG9jaW91c01ldGFkYXRhKGVycm9yKSB7XG4gIHJldHVybiBCb29sZWFuKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUgez99ICovIChlcnJvcikudmVsb2Npb3VzICYmIHR5cGVvZiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7P30gKi8gKGVycm9yKS52ZWxvY2lvdXMgPT09IFwib2JqZWN0XCIpXG59XG5cbi8qKlxuICogUnVucyBmcm9udGVuZCBtb2RlbCB2ZWxvY2lvdXMgbWV0YWRhdGEgZm9yIGVycm9yLlxuICogQHBhcmFtIHs/fSBlcnJvciAtIENhdWdodCBlcnJvci5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxWZWxvY2lvdXNNZXRhZGF0YUZvckVycm9yKGVycm9yKSB7XG4gIGlmICghZnJvbnRlbmRNb2RlbEVycm9ySGFzVmVsb2Npb3VzTWV0YWRhdGEoZXJyb3IpKSByZXR1cm4gbnVsbFxuICByZXR1cm4gLyoqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS4gQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7P30gKi8gKGVycm9yKS52ZWxvY2lvdXMpXG59XG5cbi8qKlxuICogUnVucyBmcm9udGVuZCBtb2RlbCBjbGllbnQgbWVzc2FnZSBmb3IgZXJyb3IuXG4gKiBAcGFyYW0gez99IGVycm9yIC0gQ2F1Z2h0IGVycm9yLlxuICogQHJldHVybnMge3N0cmluZ30gLSBNZXNzYWdlIHNhZmUgdG8gcmV0dXJuIHRvIEFQSSBjbGllbnRzLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsQ2xpZW50TWVzc2FnZUZvckVycm9yKGVycm9yKSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFZlbG9jaW91c0Vycm9yICYmIGVycm9yLnNhZmVUb0V4cG9zZSkge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlXG4gIH1cblxuICAvLyBWYWxpZGF0aW9uIGZhaWx1cmVzIGFyZSBleHBlY3RlZCB1c2VyLWZsb3cgZXJyb3JzLiBBbHdheXMgZm9yd2FyZCB0aGVcbiAgLy8gdmFsaWRhdGlvbiBzdW1tYXJ5IHNvIHRoZSBjbGllbnQgc2hvd3MgdGhlIHJlYWwgcmVhc29uIChlLmcuIFwiTmFtZSBjYW4ndFxuICAvLyBiZSBibGFua1wiKSBpbnN0ZWFkIG9mIHRoZSBnZW5lcmljIFwiUmVxdWVzdCBmYWlsZWQuXCIgbWVzc2FnZSwgcmVnYXJkbGVzcyBvZlxuICAvLyB3aGV0aGVyIHRoZSByYWlzaW5nIGNvZGUgYWxzbyBhdHRhY2hlZCBlcnJvci52ZWxvY2lvdXMgbWV0YWRhdGEuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlXG4gIH1cblxuICBpZiAoZnJvbnRlbmRNb2RlbEVycm9ySGFzVmVsb2Npb3VzTWV0YWRhdGEoZXJyb3IpICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZVxuICB9XG5cbiAgcmV0dXJuIGZyb250ZW5kTW9kZWxDbGllbnRTYWZlRXJyb3JNZXNzYWdlXG59XG5cbi8qKlxuICogUnVucyBmcm9udGVuZCBtb2RlbCBkZWJ1ZyBwYXlsb2FkIGZvciBlcnJvci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ3VycmVudCBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZW52aXJvbm1lbnQgLSBDdXJyZW50IGVudmlyb25tZW50LlxuICogQHBhcmFtIHs/fSBhcmdzLmVycm9yIC0gQ2F1Z2h0IGVycm9yLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSAtIE9wdGlvbmFsIGRlYnVnIHBheWxvYWQgZm9yIG5vbi1wcm9kdWN0aW9uIGVudmlyb25tZW50cy5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbERlYnVnUGF5bG9hZEZvckVycm9yKHtjb25maWd1cmF0aW9uLCBlbnZpcm9ubWVudCwgZXJyb3J9KSB7XG4gIGNvbnN0IGRlYnVnQWxsb3dlZCA9IGZyb250ZW5kTW9kZWxEZWJ1Z0Vycm9yRW52aXJvbm1lbnRzLmhhcyhlbnZpcm9ubWVudCkgfHwgZW52aXJvbm1lbnQgIT09IFwicHJvZHVjdGlvblwiICYmIGNvbmZpZ3VyYXRpb24uZ2V0RXhwb3NlSW50ZXJuYWxFcnJvcnNUb0NsaWVudHMoKVxuXG4gIGlmICghZGVidWdBbGxvd2VkKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWZWxvY2lvdXNFcnJvciAmJiBlcnJvci5zYWZlVG9FeHBvc2UpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIGlmIChmcm9udGVuZE1vZGVsRXJyb3JIYXNWZWxvY2lvdXNNZXRhZGF0YShlcnJvcikpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIGNvbnN0IGRlYnVnRXJyb3JDbGFzcyA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZVxuICAgID8gZXJyb3IubmFtZVxuICAgIDogdHlwZW9mIGVycm9yXG4gIGNvbnN0IGRlYnVnRXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgID8gZXJyb3IubWVzc2FnZVxuICAgIDogU3RyaW5nKGVycm9yKVxuICBjb25zdCBkZWJ1Z0JhY2t0cmFjZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgdHlwZW9mIGVycm9yLnN0YWNrID09PSBcInN0cmluZ1wiICYmIGVycm9yLnN0YWNrLmxlbmd0aCA+IDBcbiAgICA/IGVycm9yLnN0YWNrLnNwbGl0KFwiXFxuXCIpXG4gICAgOiB1bmRlZmluZWRcblxuICByZXR1cm4ge1xuICAgIGRlYnVnRXJyb3JDbGFzcyxcbiAgICBkZWJ1Z0Vycm9yTWVzc2FnZSxcbiAgICAuLi4oZGVidWdCYWNrdHJhY2UgPyB7ZGVidWdCYWNrdHJhY2V9IDoge30pXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBzZWFyY2hlcy5cbiAqIEBwYXJhbSB7P30gc2VhcmNoZXMgLSBTZWFyY2ggcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsU2VhcmNoW119IC0gTm9ybWFsaXplZCBzZWFyY2hlcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFNlYXJjaGVzKHNlYXJjaGVzKSB7XG4gIGlmICghc2VhcmNoZXMpIHJldHVybiBbXVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShzZWFyY2hlcykpIHtcbiAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIHNlYXJjaGVzIHR5cGU6ICR7dHlwZW9mIHNlYXJjaGVzfWApXG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplZC5cbiAgICBAdHlwZSB7RnJvbnRlbmRNb2RlbFNlYXJjaFtdfSAqL1xuICBjb25zdCBub3JtYWxpemVkID0gW11cblxuICBmb3IgKGNvbnN0IHNlYXJjaCBvZiBzZWFyY2hlcykge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChzZWFyY2gpKSB7XG4gICAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIHNlYXJjaCBlbnRyeSB0eXBlOiAke3R5cGVvZiBzZWFyY2h9YClcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gc2VhcmNoLnBhdGhcbiAgICBjb25zdCBjb2x1bW4gPSBzZWFyY2guY29sdW1uXG4gICAgY29uc3Qgb3BlcmF0b3IgPSBzZWFyY2gub3BlcmF0b3JcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihcIkludmFsaWQgc2VhcmNoIHBhdGg6IGV4cGVjdGVkIGFuIGFycmF5XCIpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXRoRW50cnkgb2YgcGF0aCkge1xuICAgICAgaWYgKHR5cGVvZiBwYXRoRW50cnkgIT09IFwic3RyaW5nXCIgfHwgcGF0aEVudHJ5Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihcIkludmFsaWQgc2VhcmNoIHBhdGggZW50cnk6IGV4cGVjdGVkIG5vbi1lbXB0eSBzdHJpbmdcIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbHVtbiAhPT0gXCJzdHJpbmdcIiB8fCBjb2x1bW4ubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihcIkludmFsaWQgc2VhcmNoIGNvbHVtbjogZXhwZWN0ZWQgbm9uLWVtcHR5IHN0cmluZ1wiKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3BlcmF0b3IgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgc2VhcmNoIG9wZXJhdG9yOiAke29wZXJhdG9yfWApXG4gICAgfVxuXG4gICAgbm9ybWFsaXplZC5wdXNoKHtcbiAgICAgIGNvbHVtbixcbiAgICAgIG9wZXJhdG9yOiBub3JtYWxpemVRdWVyeVNlYXJjaE9wZXJhdG9yKG9wZXJhdG9yKSxcbiAgICAgIHBhdGg6IFsuLi5wYXRoXSxcbiAgICAgIHZhbHVlOiBzZWFyY2gudmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCB3aGVyZS5cbiAqIEBwYXJhbSB7P30gd2hlcmUgLSBXaGVyZSBwYXlsb2FkLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gLSBOb3JtYWxpemVkIHdoZXJlIGhhc2guXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxXaGVyZSh3aGVyZSkge1xuICBpZiAoIXdoZXJlKSByZXR1cm4gbnVsbFxuXG4gIGlmICghaXNQbGFpbk9iamVjdCh3aGVyZSkpIHtcbiAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIHdoZXJlIHR5cGU6ICR7dHlwZW9mIHdoZXJlfWApXG4gIH1cblxuICByZXR1cm4gd2hlcmVcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCByYW5zYWNrLlxuICogQHBhcmFtIHs/fSByYW5zYWNrIC0gUmFuc2FjayBwYXlsb2FkLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gLSBOb3JtYWxpemVkIFJhbnNhY2sgaGFzaC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJhbnNhY2socmFuc2Fjaykge1xuICBpZiAoIXJhbnNhY2spIHJldHVybiBudWxsXG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KHJhbnNhY2spKSB7XG4gICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCByYW5zYWNrIHR5cGU6ICR7dHlwZW9mIHJhbnNhY2t9YClcbiAgfVxuXG4gIHJldHVybiByYW5zYWNrXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgZnJvbnRlbmQgbW9kZWwgaW50ZWdlciBwYXJhbS5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgaW50ZWdlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gUGFyYW0gbmFtZSBmb3IgZXJyb3JzLlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiAtIE1pbmltdW0gYWxsb3dlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSAtIE5vcm1hbGl6ZWQgaW50ZWdlci5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEludGVnZXJQYXJhbSh2YWx1ZSwgbmFtZSwgbWluKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgdGhyb3cgZnJvbnRlbmRNb2RlbFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCAke25hbWV9OiBleHBlY3RlZCBpbnRlZ2VyIG51bWJlcmApXG4gIH1cblxuICBpZiAodmFsdWUgPCBtaW4pIHtcbiAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkICR7bmFtZX06IGV4cGVjdGVkIHZhbHVlID49ICR7bWlufWApXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBwYWdpbmF0aW9uLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBQYWdpbmF0aW9uIGFyZ3MuXG4gKiBAcGFyYW0gez99IGFyZ3MubGltaXQgLSBMaW1pdCBwYXlsb2FkLlxuICogQHBhcmFtIHs/fSBhcmdzLm9mZnNldCAtIE9mZnNldCBwYXlsb2FkLlxuICogQHBhcmFtIHs/fSBhcmdzLnBhZ2UgLSBQYWdlIHBheWxvYWQuXG4gKiBAcGFyYW0gez99IGFyZ3MucGVyUGFnZSAtIFBlci1wYWdlIHBheWxvYWQuXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFBhZ2luYXRpb259IC0gTm9ybWFsaXplZCBwYWdpbmF0aW9uIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxQYWdpbmF0aW9uKHtsaW1pdCwgb2Zmc2V0LCBwYWdlLCBwZXJQYWdlfSkge1xuICByZXR1cm4ge1xuICAgIGxpbWl0OiBub3JtYWxpemVGcm9udGVuZE1vZGVsSW50ZWdlclBhcmFtKGxpbWl0LCBcImxpbWl0XCIsIDApLFxuICAgIG9mZnNldDogbm9ybWFsaXplRnJvbnRlbmRNb2RlbEludGVnZXJQYXJhbShvZmZzZXQsIFwib2Zmc2V0XCIsIDApLFxuICAgIHBhZ2U6IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxJbnRlZ2VyUGFyYW0ocGFnZSwgXCJwYWdlXCIsIDEpLFxuICAgIHBlclBhZ2U6IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxJbnRlZ2VyUGFyYW0ocGVyUGFnZSwgXCJwZXJQYWdlXCIsIDEpXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBkaXN0aW5jdC5cbiAqIEBwYXJhbSB7P30gZGlzdGluY3QgLSBEaXN0aW5jdCBwYXlsb2FkLlxuICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSAtIE5vcm1hbGl6ZWQgZGlzdGluY3QgZmxhZyB3aGVuIHByb3ZpZGVkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsRGlzdGluY3QoZGlzdGluY3QpIHtcbiAgaWYgKGRpc3RpbmN0ID09IG51bGwpIHJldHVybiBudWxsXG5cbiAgaWYgKHR5cGVvZiBkaXN0aW5jdCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkIGRpc3RpbmN0OiBleHBlY3RlZCBib29sZWFuYClcbiAgfVxuXG4gIHJldHVybiBkaXN0aW5jdFxufVxuXG4vKipcbiAqIFJ1bnMgYnVpbGQgZnJvbnRlbmQgbW9kZWwgam9pbiBvYmplY3QgZnJvbSBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSAtIEpvaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBidWlsZEZyb250ZW5kTW9kZWxKb2luT2JqZWN0RnJvbVBhdGgocGF0aCkge1xuICAvKipcbiAgICogSm9pbiBvYmplY3QuXG4gICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICBjb25zdCBqb2luT2JqZWN0ID0ge31cbiAgLyoqXG4gICAqIEN1cnJlbnQgbm9kZS5cbiAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gIGxldCBjdXJyZW50Tm9kZSA9IGpvaW5PYmplY3RcblxuICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgcGF0aCkge1xuICAgIGN1cnJlbnROb2RlW3JlbGF0aW9uc2hpcE5hbWVdID0ge31cbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlW3JlbGF0aW9uc2hpcE5hbWVdXG4gIH1cblxuICByZXR1cm4gam9pbk9iamVjdFxufVxuXG4vKipcbiAqIEJ1aWxkIGEgc3VjY2Vzc2Z1bCBzaW5nbGUtbW9kZWwgZnJvbnRlbmQtbW9kZWwgcmVzcG9uc2UgcGF5bG9hZC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG1vZGVsIC0gU2VyaWFsaXplZCBtb2RlbCBwYXlsb2FkLlxuICogQHJldHVybnMge3ttb2RlbDogUmVjb3JkPHN0cmluZywgPz4sIHN0YXR1czogXCJzdWNjZXNzXCJ9fSAtIFN1Y2Nlc3MgcmVzcG9uc2UgcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFNlcmlhbGl6ZWRNb2RlbFN1Y2Nlc3MobW9kZWwpIHtcbiAgcmV0dXJuIHttb2RlbCwgc3RhdHVzOiBcInN1Y2Nlc3NcIn1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuZCB2YWxpZGF0ZSBhdHRhY2htZW50IHBhcmFtcyBzaGFyZWQgYnkgYXR0YWNobWVudCBjb21tYW5kcy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIEZyb250ZW5kLW1vZGVsIHJlcXVlc3QgcGFyYW1zLlxuICogQHJldHVybnMge3thdHRhY2htZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgYXR0YWNobWVudE5hbWU6IHN0cmluZ30gfCBzdHJpbmd9IC0gQXR0YWNobWVudCBwYXJhbXMgb3IgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsQXR0YWNobWVudFBhcmFtcyhwYXJhbXMpIHtcbiAgY29uc3QgYXR0YWNobWVudE5hbWUgPSBwYXJhbXMuYXR0YWNobWVudE5hbWVcblxuICBpZiAodHlwZW9mIGF0dGFjaG1lbnROYW1lICE9PSBcInN0cmluZ1wiIHx8IGF0dGFjaG1lbnROYW1lLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4gXCJFeHBlY3RlZCBhdHRhY2htZW50TmFtZS5cIlxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdHRhY2htZW50SWQ6IHR5cGVvZiBwYXJhbXMuYXR0YWNobWVudElkID09PSBcInN0cmluZ1wiID8gcGFyYW1zLmF0dGFjaG1lbnRJZCA6IHVuZGVmaW5lZCxcbiAgICBhdHRhY2htZW50TmFtZVxuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCBtdXRhdGlvbiBhdHRyaWJ1dGVzIHNoYXJlZCBieSBjcmVhdGUgYW5kIHVwZGF0ZSBjb21tYW5kcy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIEZyb250ZW5kLW1vZGVsIHJlcXVlc3QgcGFyYW1zLlxuICogQHJldHVybnMge3thdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbmVzdGVkQXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSB8IHN0cmluZ30gLSBNdXRhdGlvbiBhdHRyaWJ1dGVzIG9yIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZnJvbnRlbmRNb2RlbE11dGF0aW9uQXR0cmlidXRlcyhwYXJhbXMpIHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IHBhcmFtcy5hdHRyaWJ1dGVzXG5cbiAgaWYgKCFhdHRyaWJ1dGVzIHx8IHR5cGVvZiBhdHRyaWJ1dGVzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFwiRXhwZWN0ZWQgbW9kZWwgYXR0cmlidXRlcy5cIlxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVzLFxuICAgIG5lc3RlZEF0dHJpYnV0ZXM6IHBhcmFtcy5uZXN0ZWRBdHRyaWJ1dGVzICYmIHR5cGVvZiBwYXJhbXMubmVzdGVkQXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIlxuICAgICAgPyAvKipcbiAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChwYXJhbXMubmVzdGVkQXR0cmlidXRlcylcbiAgICAgIDogbnVsbFxuICB9XG59XG5cbi8qKiBDb250cm9sbGVyIHdpdGggYnVpbHQtaW4gZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgYWN0aW9ucy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyb250ZW5kTW9kZWxDb250cm9sbGVyIGV4dGVuZHMgQ29udHJvbGxlciB7XG4gIC8qKlxuICAgKiBGcm9udGVuZCBtb2RlbCBwYXJhbXMuXG4gICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+IHwgdW5kZWZpbmVkfSAqL1xuICBfZnJvbnRlbmRNb2RlbFBhcmFtcyA9IHVuZGVmaW5lZFxuICAvKipcbiAgICogRnJvbnRlbmQgbW9kZWwgcGFyYW1zIG92ZXJyaWRlLlxuICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IHVuZGVmaW5lZH0gKi9cbiAgX2Zyb250ZW5kTW9kZWxQYXJhbXNPdmVycmlkZSA9IHVuZGVmaW5lZFxuICAvKipcbiAgICogRnJvbnRlbmQgbW9kZWwgYWJpbGl0eSBvdmVycmlkZS5cbiAgICBAdHlwZSB7aW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gKi9cbiAgX2Zyb250ZW5kTW9kZWxBYmlsaXR5T3ZlcnJpZGUgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gLSBEZWNvZGVkIHJlcXVlc3QgcGFyYW1zLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFBhcmFtcygpIHtcbiAgICBpZiAodGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtc092ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtc092ZXJyaWRlXG4gICAgfVxuXG4gICAgdGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtcyB8fD0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHRoaXMucGFyYW1zKCkpKVxuXG4gICAgcmV0dXJuIHRoaXMuX2Zyb250ZW5kTW9kZWxQYXJhbXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggZnJvbnRlbmQgbW9kZWwgcGFyYW1zLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBUZW1wb3JhcnkgZnJvbnRlbmQgbW9kZWwgcGFyYW1zLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZXhlY3V0ZWQgd2l0aCB0ZW1wb3JhcnkgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhc3luYyB3aXRoRnJvbnRlbmRNb2RlbFBhcmFtcyhwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcHJldmlvdXNPdmVycmlkZSA9IHRoaXMuX2Zyb250ZW5kTW9kZWxQYXJhbXNPdmVycmlkZVxuICAgIGNvbnN0IHByZXZpb3VzUGFyYW1zID0gdGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtc1xuXG4gICAgdGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtc092ZXJyaWRlID0gcGFyYW1zXG4gICAgdGhpcy5fZnJvbnRlbmRNb2RlbFBhcmFtcyA9IHVuZGVmaW5lZFxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2Zyb250ZW5kTW9kZWxQYXJhbXNPdmVycmlkZSA9IHByZXZpb3VzT3ZlcnJpZGVcbiAgICAgIHRoaXMuX2Zyb250ZW5kTW9kZWxQYXJhbXMgPSBwcmV2aW91c1BhcmFtc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggZnJvbnRlbmQgbW9kZWwgcmVxdWVzdCBjb250ZXh0LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBSZXF1ZXN0LXNjb3BlZCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIikuZGVmYXVsdH0gcmVzcG9uc2UgLSBSZXNwb25zZSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIENhbGxiYWNrIGV4ZWN1dGVkIGluc2lkZSByZXNvbHZlZCB0ZW5hbnQgYW5kIGFiaWxpdHkgY29udGV4dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgd2l0aEZyb250ZW5kTW9kZWxSZXF1ZXN0Q29udGV4dChwYXJhbXMsIHJlc3BvbnNlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZVRlbmFudCh7XG4gICAgICBwYXJhbXMsXG4gICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QoKSxcbiAgICAgIHJlc3BvbnNlXG4gICAgfSlcblxuICAgIHJldHVybiBhd2FpdCBjb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogXCJGcm9udGVuZCBtb2RlbCByZXF1ZXN0XCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFiaWxpdHkgPSBhd2FpdCBjb25maWd1cmF0aW9uLnJlc29sdmVBYmlsaXR5KHtcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0KCksXG4gICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgfSlcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByZXZpb3VzIGFiaWxpdHkgb3ZlcnJpZGUuXG4gICAgICAgICAgQHR5cGUge2ltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9ICovXG4gICAgICAgIGNvbnN0IHByZXZpb3VzQWJpbGl0eU92ZXJyaWRlID0gdGhpcy5fZnJvbnRlbmRNb2RlbEFiaWxpdHlPdmVycmlkZVxuXG4gICAgICAgIHRoaXMuX2Zyb250ZW5kTW9kZWxBYmlsaXR5T3ZlcnJpZGUgPSBhYmlsaXR5XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgY29uZmlndXJhdGlvbi5ydW5XaXRoQWJpbGl0eShhYmlsaXR5LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5fZnJvbnRlbmRNb2RlbEFiaWxpdHlPdmVycmlkZSA9IHByZXZpb3VzQWJpbGl0eU92ZXJyaWRlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGN1cnJlbnQgYWJpbGl0eS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IC0gQ3VycmVudCBhYmlsaXR5IGZvciBmcm9udGVuZC1tb2RlbCByZXF1ZXN0IHNjb3BlLlxuICAgKi9cbiAgY3VycmVudEFiaWxpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb250ZW5kTW9kZWxBYmlsaXR5T3ZlcnJpZGUgfHwgc3VwZXIuY3VycmVudEFiaWxpdHkoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gLSBGcm9udGVuZCBtb2RlbCBjbGFzcyBmb3IgY29udHJvbGxlciByZXNvdXJjZSBhY3Rpb25zLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbENsYXNzKCkge1xuICAgIGNvbnN0IGZyb250ZW5kTW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzRnJvbUNvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpXG4gICAgY29uc3QgbW9kZWxOYW1lID0gdHlwZW9mIHBhcmFtcy5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHBhcmFtcy5tb2RlbCA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGNvbnRyb2xsZXJOYW1lID0gdHlwZW9mIHBhcmFtcy5jb250cm9sbGVyID09PSBcInN0cmluZ1wiID8gcGFyYW1zLmNvbnRyb2xsZXIgOiB1bmRlZmluZWRcblxuICAgIGlmIChmcm9udGVuZE1vZGVsQ2xhc3MpIHJldHVybiBmcm9udGVuZE1vZGVsQ2xhc3NcblxuICAgIHRocm93IG5ldyBFcnJvcihgTm8gZnJvbnRlbmQgbW9kZWwgY29uZmlndXJlZCBmb3IgbW9kZWwgJyR7bW9kZWxOYW1lIHx8IFwidW5rbm93blwifScgYW5kIGNvbnRyb2xsZXIgJyR7Y29udHJvbGxlck5hbWUgfHwgXCJ1bmtub3duXCJ9Jy4gRW5zdXJlIGEgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBzdWJjbGFzcyBleGlzdHMgaW4gc3JjL3Jlc291cmNlcy8gb3IgaXMgbGlzdGVkIGluIHRoZSBhYmlsaXR5IHJlc29sdmVyLmApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7e2JhY2tlbmRQcm9qZWN0OiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uLCBtb2RlbE5hbWU6IHN0cmluZywgcmVzb3VyY2VDbGFzczogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSwgcmVzb3VyY2VDb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IHwgbnVsbH0gLSBGcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGZvciBjdXJyZW50IGNvbnRyb2xsZXIuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpXG4gICAgY29uc3QgbW9kZWxOYW1lID0gdHlwZW9mIHBhcmFtcy5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHBhcmFtcy5tb2RlbCA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGNvbnRyb2xsZXJOYW1lID0gdHlwZW9mIHBhcmFtcy5jb250cm9sbGVyID09PSBcInN0cmluZ1wiID8gcGFyYW1zLmNvbnRyb2xsZXIgOiB1bmRlZmluZWRcbiAgICBjb25zdCBiYWNrZW5kUHJvamVjdHMgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRCYWNrZW5kUHJvamVjdHMoKVxuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgICAgaWYgKG1vZGVsTmFtZSAmJiBtb2RlbE5hbWUubGVuZ3RoID4gMCAmJiByZXNvdXJjZXNbbW9kZWxOYW1lXSkge1xuICAgICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbbW9kZWxOYW1lXVxuICAgICAgICBjb25zdCByZXNvdXJjZUNvbmZpZ3VyYXRpb24gPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuICAgICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICAgICAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24gfHwgIXJlc291cmNlQ2xhc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIG1vZGVsIHJlc291cmNlICcke21vZGVsTmFtZX0nIG11c3QgYmUgYSBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHN1YmNsYXNzYClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYmFja2VuZFByb2plY3QsXG4gICAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICAgIHJlc291cmNlQ2xhc3MsXG4gICAgICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFjb250cm9sbGVyTmFtZSB8fCBjb250cm9sbGVyTmFtZS5sZW5ndGggPCAxKSBjb250aW51ZVxuXG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlTW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbcmVzb3VyY2VNb2RlbE5hbWVdXG4gICAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG4gICAgICAgIGNvbnN0IHJlc291cmNlQ2xhc3MgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbiB8fCAhcmVzb3VyY2VDbGFzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgJyR7cmVzb3VyY2VNb2RlbE5hbWV9JyBtdXN0IGJlIGEgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSBzdWJjbGFzc2ApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvdXJjZVBhdGggPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGgocmVzb3VyY2VNb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgICBpZiAodGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VNYXRjaGVzQ29udHJvbGxlcih7Y29udHJvbGxlck5hbWUsIHJlc291cmNlUGF0aH0pKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJhY2tlbmRQcm9qZWN0LFxuICAgICAgICAgICAgbW9kZWxOYW1lOiByZXNvdXJjZU1vZGVsTmFtZSxcbiAgICAgICAgICAgIHJlc291cmNlQ2xhc3MsXG4gICAgICAgICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgYmFja2VuZCBwcm9qZWN0IG1vZGVsIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb259IGFyZ3MuYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubW9kZWxOYW1lIC0gTW9kZWwgbmFtZS5cbiAgICogQHJldHVybnMge3tiYWNrZW5kUHJvamVjdDogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbiwgbW9kZWxOYW1lOiBzdHJpbmcsIHJlc291cmNlQ2xhc3M6IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUsIHJlc291cmNlQ29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSB8IG51bGx9IC0gRnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgbW9kZWwgbmFtZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gb3JCYWNrZW5kUHJvamVjdE1vZGVsTmFtZSh7YmFja2VuZFByb2plY3QsIG1vZGVsTmFtZX0pIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gICAgY29uc3QgcmVzb3VyY2VEZWZpbml0aW9uID0gcmVzb3VyY2VzW21vZGVsTmFtZV1cblxuICAgIGlmICghcmVzb3VyY2VEZWZpbml0aW9uKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmVzb3VyY2VDb25maWd1cmF0aW9uID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcbiAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbiB8fCAhcmVzb3VyY2VDbGFzcykgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB7XG4gICAgICBiYWNrZW5kUHJvamVjdCxcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIHJlc291cmNlQ2xhc3MsXG4gICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGZvciBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7e2JhY2tlbmRQcm9qZWN0OiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uLCBtb2RlbE5hbWU6IHN0cmluZywgcmVzb3VyY2VDbGFzczogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSwgcmVzb3VyY2VDb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IHwgbnVsbH0gLSBGcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGZvciBtb2RlbCBjbGFzcy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpIHtcbiAgICBjb25zdCBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24oKVxuXG4gICAgaWYgKCFmcm9udGVuZE1vZGVsUmVzb3VyY2UpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRm9yQmFja2VuZFByb2plY3RNb2RlbE5hbWUoe1xuICAgICAgYmFja2VuZFByb2plY3Q6IGZyb250ZW5kTW9kZWxSZXNvdXJjZS5iYWNrZW5kUHJvamVjdCxcbiAgICAgIG1vZGVsTmFtZTogbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHt7bW9kZWxOYW1lOiBzdHJpbmcsIHJlc291cmNlQ2xhc3M6IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9fSBmcm9udGVuZE1vZGVsUmVzb3VyY2UgLSBGcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsfSAtIEJhY2tpbmcgcmVjb3JkIGNsYXNzLCB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxSZXNvdXJjZU1vZGVsQ2xhc3MoZnJvbnRlbmRNb2RlbFJlc291cmNlKSB7XG4gICAgY29uc3QgcmVzb3VyY2VNb2RlbENsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlLnJlc291cmNlQ2xhc3MuTW9kZWxDbGFzc1xuXG4gICAgaWYgKHJlc291cmNlTW9kZWxDbGFzcykgcmV0dXJuIHJlc291cmNlTW9kZWxDbGFzc1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3NlcygpW2Zyb250ZW5kTW9kZWxSZXNvdXJjZS5tb2RlbE5hbWVdIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGNsYXNzIGZyb20gY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gLSBGcm9udGVuZCBtb2RlbCBjbGFzcyByZXNvbHZlZCBmcm9tIGJhY2tlbmQgcHJvamVjdCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbENsYXNzRnJvbUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgY29uc3QgZnJvbnRlbmRNb2RlbFJlc291cmNlID0gdGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uKClcblxuICAgIGlmICghZnJvbnRlbmRNb2RlbFJlc291cmNlKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcmVzb3VyY2VNb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VNb2RlbENsYXNzKGZyb250ZW5kTW9kZWxSZXNvdXJjZSlcblxuICAgIGlmIChyZXNvdXJjZU1vZGVsQ2xhc3MpIHJldHVybiByZXNvdXJjZU1vZGVsQ2xhc3NcblxuICAgIGNvbnN0IG1vZGVsQ2xhc3NlcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3NlcygpXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3Nlc1tmcm9udGVuZE1vZGVsUmVzb3VyY2UubW9kZWxOYW1lXVxuXG4gICAgaWYgKCFtb2RlbENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIG1vZGVsICcke2Zyb250ZW5kTW9kZWxSZXNvdXJjZS5tb2RlbE5hbWV9JyBpcyBjb25maWd1cmVkIGZvciAnJHt0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5jb250cm9sbGVyfScsIGJ1dCBubyBtb2RlbCBjbGFzcyB3YXMgcmVnaXN0ZXJlZC4gUmVnaXN0ZXJlZCBtb2RlbHM6ICR7T2JqZWN0LmtleXMobW9kZWxDbGFzc2VzKS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIGZyb250ZW5kIG1vZGVsIGNsYXNzIGFuZCByZXF1ZXN0ZWQgcHJlbG9hZCB0YXJnZXQgY2xhc3NlcyBhcmUgaW5pdGlhbGl6ZWQuXG4gICAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBtb2RlbCBpbml0aWFsaXphdGlvbiB3YXMgc2tpcHBlZCBhdCBzdGFydHVwIChlLmcuLCBicm93c2VyIHRlc3RzKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgbW9kZWwgY2xhc3MgaXMgcmVhZHkuXG4gICAqL1xuICBhc3luYyBlbnN1cmVGcm9udGVuZE1vZGVsQ2xhc3NJbml0aWFsaXplZCgpIHtcbiAgICBjb25zdCBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLmZyb250ZW5kTW9kZWxDbGFzc0Zyb21Db25maWd1cmF0aW9uKClcblxuICAgIGlmICghbW9kZWxDbGFzcykgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxSZWNvcmRDbGFzc0luaXRpYWxpemVkKG1vZGVsQ2xhc3MpXG5cbiAgICBpZiAoIWZyb250ZW5kTW9kZWxSZXNvdXJjZSkgcmV0dXJuXG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxQcmVsb2FkQ2xhc3Nlc0luaXRpYWxpemVkKHtcbiAgICAgIGJhY2tlbmRQcm9qZWN0OiBmcm9udGVuZE1vZGVsUmVzb3VyY2UuYmFja2VuZFByb2plY3QsXG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgcHJlbG9hZDogdGhpcy5mcm9udGVuZE1vZGVsUHJlbG9hZCgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVuc3VyZSBmcm9udGVuZCBtb2RlbCByZWNvcmQgY2xhc3MgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byBpbml0aWFsaXplLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBtb2RlbCBjbGFzcyBpcyByZWFkeS5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUZyb250ZW5kTW9kZWxSZWNvcmRDbGFzc0luaXRpYWxpemVkKG1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MgfHwgbW9kZWxDbGFzcy5pc0luaXRpYWxpemVkKCkpIHJldHVyblxuXG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG5cbiAgICBpZiAodHlwZW9mIG1vZGVsQ2xhc3MuZW5zdXJlSW5pdGlhbGl6ZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXdhaXQgbW9kZWxDbGFzcy5lbnN1cmVJbml0aWFsaXplZCh7Y29uZmlndXJhdGlvbn0pXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kZWxDbGFzcy5pbml0aWFsaXplUmVjb3JkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGF3YWl0IG1vZGVsQ2xhc3MuaW5pdGlhbGl6ZVJlY29yZCh7Y29uZmlndXJhdGlvbn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5zdXJlIGZyb250ZW5kIG1vZGVsIHByZWxvYWQgY2xhc3NlcyBpbml0aWFsaXplZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYXJncy5iYWNrZW5kUHJvamVjdCAtIEJhY2tlbmQgcHJvamVjdCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB3aG9zZSBwcmVsb2FkIHRyZWUgaXMgYmVpbmcgcmVzb2x2ZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkIHwgbnVsbH0gYXJncy5wcmVsb2FkIC0gTm9ybWFsaXplZCBwcmVsb2FkIHRyZWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gcHJlbG9hZCB0YXJnZXQgY2xhc3NlcyBhcmUgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBhc3luYyBlbnN1cmVGcm9udGVuZE1vZGVsUHJlbG9hZENsYXNzZXNJbml0aWFsaXplZCh7YmFja2VuZFByb2plY3QsIG1vZGVsQ2xhc3MsIHByZWxvYWR9KSB7XG4gICAgaWYgKCFwcmVsb2FkKSByZXR1cm5cblxuICAgIGZvciAoY29uc3QgW3JlbGF0aW9uc2hpcE5hbWUsIHJlbGF0aW9uc2hpcFByZWxvYWRdIG9mIE9iamVjdC5lbnRyaWVzKHByZWxvYWQpKSB7XG4gICAgICBpZiAocmVsYXRpb25zaGlwUHJlbG9hZCA9PT0gZmFsc2UpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKHJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gYXdhaXQgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsUmVsYXRpb25zaGlwVGFyZ2V0Q2xhc3NJbml0aWFsaXplZCh7XG4gICAgICAgIGJhY2tlbmRQcm9qZWN0LFxuICAgICAgICByZWxhdGlvbnNoaXBcbiAgICAgIH0pXG5cbiAgICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcyB8fCAhaXNQbGFpbk9iamVjdChyZWxhdGlvbnNoaXBQcmVsb2FkKSkgY29udGludWVcblxuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsUHJlbG9hZENsYXNzZXNJbml0aWFsaXplZCh7XG4gICAgICAgIGJhY2tlbmRQcm9qZWN0LFxuICAgICAgICBtb2RlbENsYXNzOiB0YXJnZXRNb2RlbENsYXNzLFxuICAgICAgICBwcmVsb2FkOiAvKipcbiAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICBAdHlwZSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkfSAqLyAocmVsYXRpb25zaGlwUHJlbG9hZClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5zdXJlIGZyb250ZW5kIG1vZGVsIHJlbGF0aW9uc2hpcCB0YXJnZXQgY2xhc3MgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb259IGFyZ3MuYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9yZWxhdGlvbnNoaXBzL2Jhc2UuanNcIikuZGVmYXVsdH0gYXJncy5yZWxhdGlvbnNoaXAgLSBSZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsPn0gLSBUYXJnZXQgbW9kZWwgY2xhc3MsIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlRnJvbnRlbmRNb2RlbFJlbGF0aW9uc2hpcFRhcmdldENsYXNzSW5pdGlhbGl6ZWQoe2JhY2tlbmRQcm9qZWN0LCByZWxhdGlvbnNoaXB9KSB7XG4gICAgaWYgKHJlbGF0aW9uc2hpcC50aHJvdWdoKSB7XG4gICAgICBjb25zdCB0aHJvdWdoUmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwLmdldE1vZGVsQ2xhc3MoKS5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwLnRocm91Z2gpXG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxSZWxhdGlvbnNoaXBUYXJnZXRDbGFzc0luaXRpYWxpemVkKHtcbiAgICAgICAgYmFja2VuZFByb2plY3QsXG4gICAgICAgIHJlbGF0aW9uc2hpcDogdGhyb3VnaFJlbGF0aW9uc2hpcFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsUmVsYXRpb25zaGlwVGFyZ2V0TW9kZWxDbGFzcyh7XG4gICAgICBiYWNrZW5kUHJvamVjdCxcbiAgICAgIHJlbGF0aW9uc2hpcFxuICAgIH0pXG5cbiAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHJldHVybiBudWxsXG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxSZWNvcmRDbGFzc0luaXRpYWxpemVkKHRhcmdldE1vZGVsQ2xhc3MpXG5cbiAgICByZXR1cm4gdGFyZ2V0TW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcmVsYXRpb25zaGlwIHRhcmdldCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYXJncy5iYWNrZW5kUHJvamVjdCAtIEJhY2tlbmQgcHJvamVjdCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL3JlbGF0aW9uc2hpcHMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlbGF0aW9uc2hpcCAtIFJlbGF0aW9uc2hpcCBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsfSAtIFRhcmdldCBtb2RlbCBjbGFzcywgd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUmVsYXRpb25zaGlwVGFyZ2V0TW9kZWxDbGFzcyh7YmFja2VuZFByb2plY3QsIHJlbGF0aW9uc2hpcH0pIHtcbiAgICBpZiAocmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljKCkgJiYgcmVsYXRpb25zaGlwLmdldFR5cGUoKSA9PT0gXCJiZWxvbmdzVG9cIikgcmV0dXJuIG51bGxcblxuICAgIGlmIChyZWxhdGlvbnNoaXAua2xhc3MpIHJldHVybiByZWxhdGlvbnNoaXAua2xhc3NcblxuICAgIGlmIChyZWxhdGlvbnNoaXAuY2xhc3NOYW1lKSB7XG4gICAgICBjb25zdCBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gb3JCYWNrZW5kUHJvamVjdE1vZGVsTmFtZSh7XG4gICAgICAgIGJhY2tlbmRQcm9qZWN0LFxuICAgICAgICBtb2RlbE5hbWU6IHJlbGF0aW9uc2hpcC5jbGFzc05hbWVcbiAgICAgIH0pXG4gICAgICBjb25zdCByZXNvdXJjZU1vZGVsQ2xhc3MgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPyB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZU1vZGVsQ2xhc3MoZnJvbnRlbmRNb2RlbFJlc291cmNlKSA6IG51bGxcblxuICAgICAgaWYgKHJlc291cmNlTW9kZWxDbGFzcykgcmV0dXJuIHJlc291cmNlTW9kZWxDbGFzc1xuXG4gICAgICBjb25zdCByZWdpc3RlcmVkTW9kZWxDbGFzcyA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldE1vZGVsQ2xhc3NlcygpW3JlbGF0aW9uc2hpcC5jbGFzc05hbWVdXG5cbiAgICAgIGlmIChyZWdpc3RlcmVkTW9kZWxDbGFzcykgcmV0dXJuIHJlZ2lzdGVyZWRNb2RlbENsYXNzXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgIHJldHVybiB0YXJnZXRNb2RlbENsYXNzIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICAgKiBAcGFyYW0gez99IHJlc291cmNlRGVmaW5pdGlvbiAtIFJlc291cmNlIGRlZmluaXRpb24uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9ybWFsaXplZCByZXNvdXJjZSBwYXRoLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aChtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbikge1xuICAgIHJldHVybiBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoKG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgbWF0Y2hlcyBjb250cm9sbGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29udHJvbGxlck5hbWUgLSBDb250cm9sbGVyIG5hbWUgZnJvbSBwYXJhbXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlc291cmNlUGF0aCAtIFJlc291cmNlIHBhdGggZnJvbSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHJlc291cmNlIHBhdGggbWF0Y2hlcyBjdXJyZW50IGNvbnRyb2xsZXIuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUmVzb3VyY2VNYXRjaGVzQ29udHJvbGxlcih7Y29udHJvbGxlck5hbWUsIHJlc291cmNlUGF0aH0pIHtcbiAgICBjb25zdCBub3JtYWxpemVkQ29udHJvbGxlciA9IGNvbnRyb2xsZXJOYW1lLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpXG4gICAgY29uc3Qgbm9ybWFsaXplZFJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRSZXNvdXJjZVBhdGggPT09IG5vcm1hbGl6ZWRDb250cm9sbGVyKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRSZXNvdXJjZVBhdGguZW5kc1dpdGgoYC8ke25vcm1hbGl6ZWRDb250cm9sbGVyfWApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2V9IC0gQmFja2VuZCByZXNvdXJjZSBpbnN0YW5jZSBmb3IgY3VycmVudCBmcm9udGVuZC1tb2RlbCBhY3Rpb24uXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUmVzb3VyY2VJbnN0YW5jZSgpIHtcbiAgICBjb25zdCBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24oKVxuXG4gICAgaWYgKCFmcm9udGVuZE1vZGVsUmVzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgY29udHJvbGxlciAnJHt0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5jb250cm9sbGVyfSdgKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlQXJncyA9IHtcbiAgICAgIGFiaWxpdHk6IHRoaXMuY3VycmVudEFiaWxpdHkoKSxcbiAgICAgIGNvbnRyb2xsZXI6IHRoaXMsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIC4uLih0aGlzLmN1cnJlbnRBYmlsaXR5KCk/LmdldENvbnRleHQoKSB8fCB7fSksXG4gICAgICAgIHBhcmFtczogdGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCksXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCgpXG4gICAgICB9LFxuICAgICAgbG9jYWxzOiB0aGlzLmN1cnJlbnRBYmlsaXR5KCk/LmdldExvY2FscygpIHx8IHt9LFxuICAgICAgbW9kZWxDbGFzczogdGhpcy5mcm9udGVuZE1vZGVsQ2xhc3MoKSxcbiAgICAgIG1vZGVsTmFtZTogZnJvbnRlbmRNb2RlbFJlc291cmNlLm1vZGVsTmFtZSxcbiAgICAgIHBhcmFtczogdGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCksXG4gICAgICByZXNvdXJjZUNvbmZpZ3VyYXRpb246IGZyb250ZW5kTW9kZWxSZXNvdXJjZS5yZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IGZyb250ZW5kTW9kZWxSZXNvdXJjZS5yZXNvdXJjZUNsYXNzKHJlc291cmNlQXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHByaW1hcnkga2V5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZyb250ZW5kIG1vZGVsIHByaW1hcnkga2V5LlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFByaW1hcnlLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKCkucHJpbWFyeUtleSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBhYmlsaXR5IGFjdGlvbi5cbiAgICogQHBhcmFtIHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIn0gYWN0aW9uIC0gRnJvbnRlbmQgYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEFiaWxpdHkgYWN0aW9uIGNvbmZpZ3VyZWQgZm9yIHRoZSBmcm9udGVuZCBhY3Rpb24uXG4gICAqL1xuICBmcm9udGVuZE1vZGVsQWJpbGl0eUFjdGlvbihhY3Rpb24pIHtcbiAgICBjb25zdCBmcm9udGVuZE1vZGVsUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24oKVxuXG4gICAgaWYgKCFmcm9udGVuZE1vZGVsUmVzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgY29udHJvbGxlciAnJHt0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5jb250cm9sbGVyfSdgKVxuICAgIH1cblxuICAgIGNvbnN0IGFiaWxpdGllcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZS5yZXNvdXJjZUNvbmZpZ3VyYXRpb24uYWJpbGl0aWVzXG5cbiAgICBpZiAoIWFiaWxpdGllcyB8fCB0eXBlb2YgYWJpbGl0aWVzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc291cmNlICcke2Zyb250ZW5kTW9kZWxSZXNvdXJjZS5tb2RlbE5hbWV9JyBtdXN0IGRlZmluZSBhbiAnYWJpbGl0aWVzJyBvYmplY3RgKVxuICAgIH1cblxuICAgIGNvbnN0IGFiaWxpdHlLZXkgPSBhY3Rpb24gPT09IFwiYXR0YWNoXCJcbiAgICAgID8gXCJ1cGRhdGVcIlxuICAgICAgOiAoKGFjdGlvbiA9PT0gXCJkb3dubG9hZFwiIHx8IGFjdGlvbiA9PT0gXCJ1cmxcIikgPyBcImZpbmRcIiA6IGFjdGlvbilcbiAgICBjb25zdCBhYmlsaXR5QWN0aW9uID0gYWJpbGl0aWVzW2FiaWxpdHlLZXldXG5cbiAgICBpZiAodHlwZW9mIGFiaWxpdHlBY3Rpb24gIT09IFwic3RyaW5nXCIgfHwgYWJpbGl0eUFjdGlvbi5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc291cmNlICcke2Zyb250ZW5kTW9kZWxSZXNvdXJjZS5tb2RlbE5hbWV9JyBtdXN0IGRlZmluZSBhYmlsaXRpZXMuJHthYmlsaXR5S2V5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGFiaWxpdHlBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGF1dGhvcml6ZWQgcXVlcnkuXG4gICAqIEBwYXJhbSB7XCJpbmRleFwiIHwgXCJmaW5kXCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCJ9IGFjdGlvbiAtIEZyb250ZW5kIGFjdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IC0gQXV0aG9yaXplZCBxdWVyeSBmb3IgdGhlIGFjdGlvbi5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoYWN0aW9uKSB7XG4gICAgY29uc3QgYWJpbGl0eUFjdGlvbiA9IHRoaXMuZnJvbnRlbmRNb2RlbEFiaWxpdHlBY3Rpb24oYWN0aW9uKVxuXG4gICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKCkuYWNjZXNzaWJsZUZvcihhYmlsaXR5QWN0aW9uLCB0aGlzLmN1cnJlbnRBYmlsaXR5KCkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBwcmltYXJ5IGtleSB2YWx1ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbCAtIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFByaW1hcnkga2V5IHZhbHVlIGFzIHN0cmluZy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5VmFsdWUobW9kZWwpIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5mcm9udGVuZE1vZGVsUHJpbWFyeUtleSgpXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZU1hcCA9IG1vZGVsLmdldE1vZGVsQ2xhc3MoKS5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwKClcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZU1hcFtjb2x1bW5OYW1lXSB8fCBjb2x1bW5OYW1lXG4gICAgY29uc3QgdmFsdWUgPSBtb2RlbC5yZWFkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgZmlsdGVyIGF1dGhvcml6ZWQgbW9kZWxzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIn0gYXJncy5hY3Rpb24gLSBGcm9udGVuZCBhY3Rpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSBhcmdzLm1vZGVscyAtIENhbmRpZGF0ZSBtb2RlbHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXT59IC0gQXV0aG9yaXplZCBtb2RlbHMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsRmlsdGVyQXV0aG9yaXplZE1vZGVscyh7YWN0aW9uLCBtb2RlbHN9KSB7XG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDApIHJldHVybiBtb2RlbHNcblxuICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5KClcbiAgICBjb25zdCBpZHMgPSBtb2RlbHMubWFwKChtb2RlbCkgPT4gdGhpcy5mcm9udGVuZE1vZGVsUHJpbWFyeUtleVZhbHVlKG1vZGVsKSlcbiAgICBjb25zdCBhdXRob3JpemVkUXVlcnkgPSB0aGlzLmZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoYWN0aW9uKS53aGVyZSh7W3ByaW1hcnlLZXldOiBpZHN9KVxuXG4gICAgY29uc3QgYXV0aG9yaXplZElkc1JhdyA9IGF3YWl0IGF1dGhvcml6ZWRRdWVyeS5wbHVjayhwcmltYXJ5S2V5KVxuXG4gICAgY29uc3QgYXV0aG9yaXplZElkcyA9IG5ldyBTZXQoYXV0aG9yaXplZElkc1Jhdy5tYXAoKGlkKSA9PiBTdHJpbmcoaWQpKSlcblxuICAgIHJldHVybiBtb2RlbHMuZmlsdGVyKChtb2RlbCkgPT4gYXV0aG9yaXplZElkcy5oYXModGhpcy5mcm9udGVuZE1vZGVsUHJpbWFyeUtleVZhbHVlKG1vZGVsKSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBydW4gZnJvbnRlbmQgbW9kZWwgYmVmb3JlIGFjdGlvbi5cbiAgICogQHBhcmFtIHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIn0gYWN0aW9uIC0gRnJvbnRlbmQgYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIGFjdGlvbiBzaG91bGQgY29udGludWUuXG4gICAqL1xuICBhc3luYyBydW5Gcm9udGVuZE1vZGVsQmVmb3JlQWN0aW9uKGFjdGlvbikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbFJlc291cmNlSW5zdGFuY2UoKS5iZWZvcmVBY3Rpb24oYWN0aW9uKVxuXG4gICAgcmV0dXJuIHJlc3VsdCAhPT0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGZpbmQgcmVjb3JkLlxuICAgKiBAcGFyYW0ge1wiZmluZFwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCJ9IGFjdGlvbiAtIEZyb250ZW5kIGFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gUmVjb3JkIGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbD59IC0gTG9jYXRlZCBtb2RlbCByZWNvcmQuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsRmluZFJlY29yZChhY3Rpb24sIGlkKSB7XG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKCkuZmluZChhY3Rpb24sIGlkKVxuXG4gICAgaWYgKCFtb2RlbCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGF1dGhvcml6ZWRNb2RlbHMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxGaWx0ZXJBdXRob3JpemVkTW9kZWxzKHthY3Rpb24sIG1vZGVsczogW21vZGVsXX0pXG5cbiAgICByZXR1cm4gYXV0aG9yaXplZE1vZGVsc1swXSB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBjcmVhdGUgcmVjb3JkLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhdHRyaWJ1dGVzIC0gQ3JlYXRlIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBbbmVzdGVkQXR0cmlidXRlc10gLSBPcHRpb25hbCBuZXN0ZWQtYXR0cmlidXRlIHBheWxvYWQgZm9yIGNhc2NhZGluZyB3cml0ZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsPn0gLSBDcmVhdGVkIG1vZGVsIHdoZW4gYXV0aG9yaXplZC5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kTW9kZWxDcmVhdGVSZWNvcmQoYXR0cmlidXRlcywgbmVzdGVkQXR0cmlidXRlcyA9IG51bGwpIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuZnJvbnRlbmRNb2RlbFJlc291cmNlSW5zdGFuY2UoKVxuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgcmVzb3VyY2UuY3JlYXRlKGF0dHJpYnV0ZXMsIHtuZXN0ZWRBdHRyaWJ1dGVzLCBjb250cm9sbGVyOiB0aGlzfSlcblxuICAgIGNvbnN0IGF1dGhvcml6ZWRNb2RlbHMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxGaWx0ZXJBdXRob3JpemVkTW9kZWxzKHthY3Rpb246IFwiY3JlYXRlXCIsIG1vZGVsczogW21vZGVsXX0pXG5cbiAgICBpZiAoYXV0aG9yaXplZE1vZGVscy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYXV0aG9yaXplZE1vZGVsc1swXVxuICAgIH1cblxuICAgIGF3YWl0IHJlc291cmNlLmhhbmRsZVVuYXV0aG9yaXplZENyZWF0ZWRNb2RlbChtb2RlbClcblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZWNvcmRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W10+fSAtIEZyb250ZW5kIG1vZGVsIHJlY29yZHMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsUmVjb3JkcygpIHtcbiAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKCkucmVjb3JkcygpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsRmlsdGVyQXV0aG9yaXplZE1vZGVscyh7YWN0aW9uOiBcImluZGV4XCIsIG1vZGVsc30pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBwcmVsb2FkLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kYXRhYmFzZS9xdWVyeS9pbmRleC5qc1wiKS5OZXN0ZWRQcmVsb2FkUmVjb3JkIHwgbnVsbH0gLSBGcm9udGVuZCBwcmVsb2FkIGRhdGEuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsUHJlbG9hZCgpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFByZWxvYWQodGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCkucHJlbG9hZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHNlbGVjdC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IG51bGx9IC0gRnJvbnRlbmQgc2VsZWN0IGRhdGEuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsU2VsZWN0KCkge1xuICAgIHJldHVybiBub3JtYWxpemVGcm9udGVuZE1vZGVsU2VsZWN0KHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLnNlbGVjdCwgdGhpcy5mcm9udGVuZE1vZGVsQ2xhc3MoKS5nZXRNb2RlbE5hbWUoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHNlbGVjdHMgZXh0cmEuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCBudWxsfSAtIEZyb250ZW5kIGV4dHJhLXNlbGVjdCBkYXRhIChkZWZhdWx0cyBwbHVzIHRoZXNlKSwga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxTZWxlY3RzRXh0cmEoKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxTZWxlY3QodGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCkuc2VsZWN0c0V4dHJhLCB0aGlzLmZyb250ZW5kTW9kZWxDbGFzcygpLmdldE1vZGVsTmFtZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgc2VhcmNoZXMuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsU2VhcmNoW119IC0gRnJvbnRlbmQgc2VhcmNoIGZpbHRlcnMuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsU2VhcmNoZXMoKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxTZWFyY2hlcyh0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5zZWFyY2hlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHdoZXJlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSAtIEZyb250ZW5kIHdoZXJlIGZpbHRlcnMuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsV2hlcmUoKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxXaGVyZSh0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS53aGVyZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHJhbnNhY2suXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IC0gRnJvbnRlbmQgUmFuc2FjayBmaWx0ZXJzLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFJhbnNhY2soKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSYW5zYWNrKHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLnJhbnNhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBqb2lucy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gLSBGcm9udGVuZCBqb2lucyBkZXNjcmlwdG9ycy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxKb2lucygpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEpvaW5zKHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLmpvaW5zKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgc29ydC5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxTb3J0W119IC0gRnJvbnRlbmQgc29ydCBkZWZpbml0aW9ucy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxTb3J0KCkge1xuICAgIHJldHVybiBub3JtYWxpemVRdWVyeVNvcnQodGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCkuc29ydClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGdyb3VwLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbEdyb3VwW119IC0gRnJvbnRlbmQgZ3JvdXAgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsR3JvdXAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBub3JtYWxpemVRdWVyeUdyb3VwKHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLmdyb3VwKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBmcm9udGVuZE1vZGVsVmFsaWRhdGlvbkVycm9yRm9yRXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcGFnaW5hdGlvbi5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxQYWdpbmF0aW9ufSAtIEZyb250ZW5kIHBhZ2luYXRpb24gcGFyYW1zLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFBhZ2luYXRpb24oKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKClcblxuICAgIHJldHVybiBub3JtYWxpemVGcm9udGVuZE1vZGVsUGFnaW5hdGlvbih7XG4gICAgICBsaW1pdDogcGFyYW1zLmxpbWl0LFxuICAgICAgb2Zmc2V0OiBwYXJhbXMub2Zmc2V0LFxuICAgICAgcGFnZTogcGFyYW1zLnBhZ2UsXG4gICAgICBwZXJQYWdlOiBwYXJhbXMucGVyUGFnZVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBkaXN0aW5jdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSAtIEZyb250ZW5kIGRpc3RpbmN0IGZsYWcgd2hlbiBwcm92aWRlZC5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxEaXN0aW5jdCgpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRnJvbnRlbmRNb2RlbERpc3RpbmN0KHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLmRpc3RpbmN0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgcGx1Y2suXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUGx1Y2tbXX0gLSBGcm9udGVuZCBwbHVjayBkZWZpbml0aW9ucy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxQbHVjaygpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVF1ZXJ5UGx1Y2sodGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKCkucGx1Y2spXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGZyb250ZW5kTW9kZWxWYWxpZGF0aW9uRXJyb3JGb3JFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBjb3VudCByZXF1ZXN0ZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHJlcXVlc3QgYXNrcyBmb3IgYW4gYWdncmVnYXRlIGNvdW50LlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbENvdW50UmVxdWVzdGVkKCkge1xuICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5jb3VudCA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgd2l0aCBjb3VudC5cbiAgICogQHJldHVybnMge0FycmF5PHthdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHJlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0+fVxuICAgKiAgIEZyb250ZW5kIHdpdGhDb3VudCBlbnRyaWVzLiBFbXB0eSBhcnJheSB3aGVuIG5vdCByZXF1ZXN0ZWQuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsV2l0aENvdW50KCkge1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLndpdGhDb3VudFxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJhdykpIHJldHVybiBbXVxuXG4gICAgLyoqXG4gICAgICogRW50cmllcy5cbiAgICAgIEB0eXBlIHtBcnJheTx7YXR0cmlidXRlTmFtZTogc3RyaW5nLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgPz59Pn0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmF3KSB7XG4gICAgICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeSAhPT0gXCJvYmplY3RcIikgY29udGludWVcbiAgICAgIGlmICh0eXBlb2YgZW50cnkuYXR0cmlidXRlTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBlbnRyeS5hdHRyaWJ1dGVOYW1lLmxlbmd0aCA9PT0gMCkgY29udGludWVcbiAgICAgIGlmICh0eXBlb2YgZW50cnkucmVsYXRpb25zaGlwTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBlbnRyeS5yZWxhdGlvbnNoaXBOYW1lLmxlbmd0aCA9PT0gMCkgY29udGludWVcblxuICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgYXR0cmlidXRlTmFtZTogZW50cnkuYXR0cmlidXRlTmFtZSxcbiAgICAgICAgcmVsYXRpb25zaGlwTmFtZTogZW50cnkucmVsYXRpb25zaGlwTmFtZSxcbiAgICAgICAgd2hlcmU6IGVudHJ5LndoZXJlICYmIHR5cGVvZiBlbnRyeS53aGVyZSA9PT0gXCJvYmplY3RcIiA/IGVudHJ5LndoZXJlIDogdW5kZWZpbmVkXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhbiBlbnRyeSBmcm9tIHRoZSBmcm9udGVuZC1tb2RlbCBgYWJpbGl0aWVzYCBwYXlsb2FkIHRvXG4gICAqIGl0cyBiYWNrZW5kIG1vZGVsIGNsYXNzIGJ5IGxvb2tpbmcgdXAgdGhlIHJlc291cmNlIGJ5IG1vZGVsTmFtZVxuICAgKiBhY3Jvc3MgYWxsIGNvbmZpZ3VyZWQgYmFja2VuZCBwcm9qZWN0cy4gUmV0dXJucyBudWxsIHdoZW4gbm9cbiAgICogcmVzb3VyY2UgbWF0Y2hlcyDigJQgdGhlIHNwZWMgZW50cnkgaXMgdGhlbiBzaWxlbnRseSBpZ25vcmVkIHNvIGFcbiAgICogY2FsbGVyIHJlcXVlc3RpbmcgYWJpbGl0aWVzIGZvciBhIG1vZGVsIHRoZXkgY2Fubm90IHJlc29sdmUgZG9lc1xuICAgKiBub3QgY3Jhc2ggdGhlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgbnVsbH1cbiAgICovXG4gIF9mcm9udGVuZE1vZGVsQ2xhc3NGb3JBYmlsaXRpZXMobW9kZWxOYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBtb2RlbE5hbWUgIT09IFwic3RyaW5nXCIgfHwgbW9kZWxOYW1lLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24/LmdldEJhY2tlbmRQcm9qZWN0cz8uKCkgPz8gW11cblxuICAgIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgICBjb25zdCBmcm9udGVuZE1vZGVscyA9IGJhY2tlbmRQcm9qZWN0Py5mcm9udGVuZE1vZGVsc1xuICAgICAgaWYgKCFmcm9udGVuZE1vZGVscyB8fCB0eXBlb2YgZnJvbnRlbmRNb2RlbHMgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IGZyb250ZW5kTW9kZWxzW21vZGVsTmFtZV1cbiAgICAgIGlmICghcmVzb3VyY2VEZWZpbml0aW9uKSBjb250aW51ZVxuXG4gICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG4gICAgICBpZiAoIXJlc291cmNlQ2xhc3MpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0eXBlb2YgcmVzb3VyY2VDbGFzcy5tb2RlbENsYXNzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyByZXNvdXJjZUNsYXNzLm1vZGVsQ2xhc3MoKVxuICAgICAgICA6IHJlc291cmNlQ2xhc3MuTW9kZWxDbGFzc1xuXG4gICAgICBpZiAodHlwZW9mIG1vZGVsQ2xhc3MgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG1vZGVsQ2xhc3NcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgZXZlcnkgbG9hZGVkIHJlY29yZCB3aG9zZSBgZ2V0TW9kZWxOYW1lKClgIG1hdGNoZXMgdGhlXG4gICAqIHJlcXVlc3RlZCBuYW1lLCB3YWxraW5nIGFjcm9zcyB0aGUgcm9vdC1sZXZlbCBzbGljZSBwbHVzIGFueVxuICAgKiBwcmVsb2FkZWQgcmVsYXRpb25zaGlwcyBhdCBhbnkgZGVwdGguIFVzZWQgdG8gZXZhbHVhdGUgcGVyLXJlY29yZFxuICAgKiBhYmlsaXRpZXMgYWdhaW5zdCBuZXN0ZWQgcHJlbG9hZGVkIGNoaWxkcmVuIHdpdGggYSBzaW5nbGUgYmF0Y2hlZFxuICAgKiBxdWVyeSBwZXIgKG1vZGVsQ2xhc3MsIGFjdGlvbikgcGFpci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IHJvb3RNb2RlbHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfVxuICAgKi9cbiAgX2Zyb250ZW5kTW9kZWxDb2xsZWN0UmVjb3Jkc0Zvck5hbWUocm9vdE1vZGVscywgbW9kZWxOYW1lKSB7XG4gICAgLyoqXG4gICAgICogT3V0LlxuICAgICAgQHR5cGUge2ltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gKi9cbiAgICBjb25zdCBvdXQgPSBbXVxuICAgIC8qKlxuICAgICAqIFNlZW4uXG4gICAgICBAdHlwZSB7U2V0PGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KClcblxuICAgIC8qKlxuICAgICAqIFdhbGsuXG4gICAgICBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsIHwgdW5kZWZpbmVkfSByZWNvcmQgKi9cbiAgICBjb25zdCB3YWxrID0gKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKCFyZWNvcmQgfHwgdHlwZW9mIHJlY29yZCAhPT0gXCJvYmplY3RcIikgcmV0dXJuXG4gICAgICBpZiAoc2Vlbi5oYXMocmVjb3JkKSkgcmV0dXJuXG4gICAgICBzZWVuLmFkZChyZWNvcmQpXG5cbiAgICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSB0eXBlb2YgcmVjb3JkLmdldE1vZGVsQ2xhc3MgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IHJlY29yZC5nZXRNb2RlbENsYXNzKClcbiAgICAgICAgOiBudWxsXG4gICAgICBpZiAoTW9kZWxDbGFzcyAmJiB0eXBlb2YgTW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUgPT09IFwiZnVuY3Rpb25cIiAmJiBNb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpID09PSBtb2RlbE5hbWUpIHtcbiAgICAgICAgb3V0LnB1c2gocmVjb3JkKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBzTWFwID0gdHlwZW9mIE1vZGVsQ2xhc3M/LmdldFJlbGF0aW9uc2hpcHNNYXAgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IE1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwc01hcCgpXG4gICAgICAgIDogbnVsbFxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBzTWFwKSByZXR1cm5cblxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIE9iamVjdC5rZXlzKHJlbGF0aW9uc2hpcHNNYXApKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHR5cGVvZiByZWNvcmQuZ2V0UmVsYXRpb25zaGlwQnlOYW1lID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHJlY29yZC5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSlcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgaWYgKCFyZWxhdGlvbnNoaXAgfHwgdHlwZW9mIHJlbGF0aW9uc2hpcC5nZXRMb2FkZWRPclVuZGVmaW5lZCAhPT0gXCJmdW5jdGlvblwiKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IHJlbGF0aW9uc2hpcC5nZXRMb2FkZWRPclVuZGVmaW5lZCgpXG4gICAgICAgIGlmIChsb2FkZWQgPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsb2FkZWQpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBsb2FkZWQpIHdhbGsoY2hpbGQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2Fsayhsb2FkZWQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdE1vZGVscykgd2Fsayhyb290KVxuXG4gICAgcmV0dXJuIG91dFxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlIGV2ZXJ5IGFiaWxpdHkgcmVxdWVzdGVkIHZpYSB0aGUgZnJvbnRlbmQgYGFiaWxpdGllc2BcbiAgICogcGFyYW0gYWdhaW5zdCB0aGUgbG9hZGVkIG1vZGVsIGNvaG9ydCAocGx1cyBhbnkgcHJlbG9hZGVkXG4gICAqIGNoaWxkcmVuKSwgYXR0YWNoaW5nIHRoZSByZXN1bHRzIHRvIGVhY2ggcmVjb3JkIHZpYVxuICAgKiBgX3NldENvbXB1dGVkQWJpbGl0eWAuIFJ1bnMgb25lIGJhdGNoZWQgYGF1dGhvcml6ZWQgcXVlcnkgKyBwbHVja2BcbiAgICogcGVyIChtb2RlbENsYXNzLCBhY3Rpb24pIHBhaXIsIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgcmVjb3Jkc1xuICAgKiB3ZXJlIGxvYWRlZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IHJvb3RNb2RlbHNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsQ29tcHV0ZUFiaWxpdGllcyhyb290TW9kZWxzKSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMuZnJvbnRlbmRNb2RlbEFiaWxpdGllcygpXG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocm9vdE1vZGVscykgfHwgcm9vdE1vZGVscy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3QgYWJpbGl0eSA9IHRoaXMuY3VycmVudEFiaWxpdHkoKVxuICAgIGlmICghYWJpbGl0eSkgcmV0dXJuXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLl9mcm9udGVuZE1vZGVsQ2xhc3NGb3JBYmlsaXRpZXMoZW50cnkubW9kZWxOYW1lKVxuICAgICAgaWYgKCFtb2RlbENsYXNzKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gdGhpcy5fZnJvbnRlbmRNb2RlbENvbGxlY3RSZWNvcmRzRm9yTmFtZShyb290TW9kZWxzLCBlbnRyeS5tb2RlbE5hbWUpXG4gICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSBtb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICAgICAgY29uc3QgaWRzID0gY2FuZGlkYXRlc1xuICAgICAgICAubWFwKChyZWNvcmQpID0+IHJlY29yZC5yZWFkQXR0cmlidXRlKHByaW1hcnlLZXkpKVxuICAgICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSBjb250aW51ZVxuXG4gICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBlbnRyeS5hY3Rpb25zKSB7XG4gICAgICAgIGxldCBhbGxvd2VkSWRzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXV0aG9yaXplZFF1ZXJ5ID0gbW9kZWxDbGFzcy5hY2Nlc3NpYmxlRm9yKGFjdGlvbiwgYWJpbGl0eSkud2hlcmUoe1twcmltYXJ5S2V5XTogaWRzfSlcbiAgICAgICAgICBjb25zdCBwbHVja2VkID0gYXdhaXQgYXV0aG9yaXplZFF1ZXJ5LnBsdWNrKHByaW1hcnlLZXkpXG4gICAgICAgICAgYWxsb3dlZElkcyA9IG5ldyBTZXQocGx1Y2tlZC5tYXAoKHZhbHVlKSA9PiBTdHJpbmcodmFsdWUpKSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBBbiBhYmlsaXR5IHdpdGggbm8gYWxsb3cgcnVsZXMgZm9yIHRoZSBhY3Rpb24gdGhyb3dzIHZpYVxuICAgICAgICAgIC8vIGBhY2Nlc3NpYmxlRm9yYDsgdHJlYXQgYXMgYSB1bml2ZXJzYWwgZGVueSBzbyB0aGUgZnJvbnRlbmRcbiAgICAgICAgICAvLyBnZXRzIGBjYW4oYWN0aW9uKSA9PT0gZmFsc2VgIGZvciBldmVyeSBjYW5kaWRhdGUsIGluc3RlYWRcbiAgICAgICAgICAvLyBvZiBzdXJmYWNpbmcgYW4gZXJyb3IgdGhhdCB0aGUgVUkgY2FuJ3QgYWN0IG9uLlxuICAgICAgICAgIHZvaWQgZXJyb3JcbiAgICAgICAgICBhbGxvd2VkSWRzID0gbmV3IFNldCgpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgY29uc3QgaWRWYWx1ZSA9IHJlY29yZC5yZWFkQXR0cmlidXRlKHByaW1hcnlLZXkpXG4gICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGlkVmFsdWUgIT09IG51bGwgJiYgaWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGFsbG93ZWRJZHMuaGFzKFN0cmluZyhpZFZhbHVlKSlcbiAgICAgICAgICByZWNvcmQuX3NldENvbXB1dGVkQWJpbGl0eShhY3Rpb24sIGFsbG93ZWQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdGhlIGZyb250ZW5kLW1vZGVsIGBhYmlsaXRpZXNgIHBhcmFtIGludG8gYSBsaXN0IG9mXG4gICAqIGB7bW9kZWxOYW1lLCBhY3Rpb25zfWAgZW50cmllcyB0byBldmFsdWF0ZSBhZ2FpbnN0IGxvYWRlZCByZWNvcmRzLlxuICAgKiBVbmtub3duIGVudHJpZXMgYXJlIHNpbGVudGx5IHNraXBwZWQg4oCUIGRvd25zdHJlYW0gY29kZSByZXNvbHZlc1xuICAgKiBtb2RlbCBuYW1lcyB0byBjbGFzc2VzIHdoZW4gYXBwbHlpbmcgdGhlIGNoZWNrLCBzbyB1bnJlc29sdmVkXG4gICAqIG5hbWVzIG5hdHVyYWxseSBiZWNvbWUgbm8tb3BzLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8e21vZGVsTmFtZTogc3RyaW5nLCBhY3Rpb25zOiBzdHJpbmdbXX0+fVxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbEFiaWxpdGllcygpIHtcbiAgICBjb25zdCByYXcgPSB0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKS5hYmlsaXRpZXNcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShyYXcpKSByZXR1cm4gW11cblxuICAgIC8qKlxuICAgICAqIEVudHJpZXMuXG4gICAgICBAdHlwZSB7QXJyYXk8e21vZGVsTmFtZTogc3RyaW5nLCBhY3Rpb25zOiBzdHJpbmdbXX0+fSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiByYXcpIHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiKSBjb250aW51ZVxuICAgICAgaWYgKHR5cGVvZiBlbnRyeS5tb2RlbE5hbWUgIT09IFwic3RyaW5nXCIgfHwgZW50cnkubW9kZWxOYW1lLmxlbmd0aCA9PT0gMCkgY29udGludWVcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyeS5hY3Rpb25zKSkgY29udGludWVcblxuICAgICAgY29uc3QgYWN0aW9ucyA9IGVudHJ5LmFjdGlvbnMuZmlsdGVyKFxuICAgICAgICAoLyoqXG4gICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICBAdHlwZSB7P30gKi8gYWN0aW9uKSA9PiB0eXBlb2YgYWN0aW9uID09PSBcInN0cmluZ1wiICYmIGFjdGlvbi5sZW5ndGggPiAwXG4gICAgICApXG5cbiAgICAgIGlmIChhY3Rpb25zLmxlbmd0aCA9PT0gMCkgY29udGludWVcblxuICAgICAgZW50cmllcy5wdXNoKHthY3Rpb25zLCBtb2RlbE5hbWU6IGVudHJ5Lm1vZGVsTmFtZX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBmcm9udGVuZC1tb2RlbCBgcXVlcnlEYXRhYCBwYXJhbS4gVGhlIHdpcmUgZm9ybWF0IGNhcnJpZXNcbiAgICogb25seSAqKm5hbWVzKiogKHRoZSBrZXlzIHRoZSBmcm9udGVuZCB3YW50cyBhdHRhY2hlZCkgcGx1cyB0aGVcbiAgICogb3B0aW9uYWwgbmVzdGVkLXJlbGF0aW9uc2hpcCBjaGFpbiBsZWFkaW5nIHRvIHRoZW0g4oCUIHRoZSBhY3R1YWwgU1FMXG4gICAqIGZyYWdtZW50cyBsaXZlIG9uIHRoZSBiYWNrZW5kIG1vZGVsIGFzIGBNb2RlbC5xdWVyeURhdGEobmFtZSwgZm4pYFxuICAgKiByZWdpc3RyYXRpb25zLiBDYWxsZXJzIGNhbm5vdCBwdXNoIFNRTCB0aHJvdWdoIHRoaXMgZW5kcG9pbnQuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIHJhdyBuZXN0ZWQtcmVjb3JkIHNwZWMgKHNoYXBlIHZhbGlkYXRlZCBieSB0aGVcbiAgICogbm9ybWFsaXplciBpbnNpZGUgYFF1ZXJ5LnF1ZXJ5RGF0YWApIG9yIGBudWxsYCB3aGVuIG5vdCByZXF1ZXN0ZWQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L3F1ZXJ5LWRhdGEuanNcIikuUXVlcnlEYXRhU3BlYyB8IG51bGx9XG4gICAqL1xuICBmcm9udGVuZE1vZGVsUXVlcnlEYXRhKCkge1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLnF1ZXJ5RGF0YVxuXG4gICAgaWYgKHJhdyA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgaWYgKHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIpIHJldHVybiByYXdcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSByZXR1cm4gcmF3XG4gICAgaWYgKHR5cGVvZiByYXcgPT09IFwib2JqZWN0XCIpIHJldHVybiByYXdcblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBpbmRleCBxdWVyeS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gLSBGcm9udGVuZCBpbmRleCBxdWVyeSB3aXRoIG5vcm1hbGl6ZWQgcGFyYW1zIGFwcGxpZWQuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsSW5kZXhRdWVyeSgpIHtcbiAgICBsZXQgcXVlcnkgPSB0aGlzLmZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoXCJpbmRleFwiKVxuICAgIGNvbnN0IHByZWxvYWQgPSB0aGlzLmZyb250ZW5kTW9kZWxQcmVsb2FkKClcblxuICAgIGlmIChwcmVsb2FkKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LnByZWxvYWQocHJlbG9hZClcbiAgICB9XG5cbiAgICBjb25zdCBqb2lucyA9IHRoaXMuZnJvbnRlbmRNb2RlbEpvaW5zKClcbiAgICBjb25zdCB3aGVyZSA9IHRoaXMuZnJvbnRlbmRNb2RlbFdoZXJlKClcbiAgICBjb25zdCBwYWdpbmF0aW9uID0gdGhpcy5mcm9udGVuZE1vZGVsUGFnaW5hdGlvbigpXG4gICAgY29uc3QgZGlzdGluY3QgPSB0aGlzLmZyb250ZW5kTW9kZWxEaXN0aW5jdCgpXG5cbiAgICB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbFBhZ2luYXRpb24oe3BhZ2luYXRpb24sIHF1ZXJ5fSlcblxuICAgIGlmIChkaXN0aW5jdCAhPT0gbnVsbCkge1xuICAgICAgcXVlcnkuZGlzdGluY3QoZGlzdGluY3QpXG4gICAgfVxuXG4gICAgaWYgKHdoZXJlKSB7XG4gICAgICB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbFdoZXJlKHtxdWVyeSwgd2hlcmV9KVxuICAgIH1cblxuICAgIGNvbnN0IHJhbnNhY2sgPSB0aGlzLmZyb250ZW5kTW9kZWxSYW5zYWNrKClcblxuICAgIGlmIChyYW5zYWNrKSB7XG4gICAgICBxdWVyeS5yYW5zYWNrKHJhbnNhY2spXG4gICAgfVxuXG4gICAgaWYgKGpvaW5zKSB7XG4gICAgICB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbEpvaW5zKHtqb2lucywgcXVlcnl9KVxuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaGVzID0gdGhpcy5mcm9udGVuZE1vZGVsU2VhcmNoZXMoKVxuXG4gICAgZm9yIChjb25zdCBzZWFyY2ggb2Ygc2VhcmNoZXMpIHtcbiAgICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsU2VhcmNoKHtxdWVyeSwgc2VhcmNofSlcbiAgICB9XG5cbiAgICBjb25zdCBncm91cHMgPSB0aGlzLmZyb250ZW5kTW9kZWxHcm91cCgpXG5cbiAgICBpZiAoZ3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsUm9vdEdyb3VwQ29sdW1ucyh7cXVlcnl9KVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbEdyb3VwKHtncm91cCwgcXVlcnl9KVxuICAgIH1cblxuICAgIGNvbnN0IHNvcnRzID0gdGhpcy5mcm9udGVuZE1vZGVsU29ydCgpXG5cbiAgICBpZiAoc29ydHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBzb3J0IG9mIHNvcnRzKSB7XG4gICAgICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsU29ydCh7cXVlcnksIHNvcnR9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhDb3VudCA9IHRoaXMuZnJvbnRlbmRNb2RlbFdpdGhDb3VudCgpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHdpdGhDb3VudCkge1xuICAgICAgLyoqXG4gICAgICAgKiBTcGVjLlxuICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHtyZWxhdGlvbnNoaXA/OiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgPz59Pn0gKi9cbiAgICAgIGNvbnN0IHNwZWMgPSB7fVxuICAgICAgc3BlY1tlbnRyeS5hdHRyaWJ1dGVOYW1lXSA9IHtyZWxhdGlvbnNoaXA6IGVudHJ5LnJlbGF0aW9uc2hpcE5hbWUsIHdoZXJlOiBlbnRyeS53aGVyZX1cbiAgICAgIHF1ZXJ5LndpdGhDb3VudChzcGVjKVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5RGF0YSA9IHRoaXMuZnJvbnRlbmRNb2RlbFF1ZXJ5RGF0YSgpXG5cbiAgICBpZiAocXVlcnlEYXRhICE9IG51bGwpIHtcbiAgICAgIHF1ZXJ5LnF1ZXJ5RGF0YShxdWVyeURhdGEpXG4gICAgfVxuXG4gICAgcXVlcnkgPSB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbFRyYW5zbGF0ZWRBdHRyaWJ1dGVQcmVsb2Fkcyh7cXVlcnl9KVxuXG4gICAgaWYgKHF1ZXJ5Ll9kaXN0aW5jdCAmJiBxdWVyeS5kcml2ZXIuZ2V0VHlwZSgpID09PSBcIm1zc3FsXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxNc3NxbERpc3RpbmN0QnlQcmltYXJ5S2V5UXVlcnkoe3F1ZXJ5fSlcbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcnlcbiAgfVxuXG4gIC8qKlxuICAgKiBNU1NRTCBjYW5ub3QgYXBwbHkgRElTVElOQ1Qgb3ZlciBub24tY29tcGFyYWJsZSB0ZXh0IGNvbHVtbnMgaW4gdGFibGUuKiBzZWxlY3RzLlxuICAgKiBUaGlzIHJld3JpdGVzIGRpc3RpbmN0IGZyb250ZW5kLW1vZGVsIHF1ZXJpZXMgdG8gc2VsZWN0IHJvb3QgcmVjb3JkcyBieSBkaXN0aW5jdCBQSyBzdWJxdWVyeS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IHdpdGggZGlzdGluY3QgYW5kIGZpbHRlcnMuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IC0gTVNTUUwtc2FmZSBkaXN0aW5jdCBxdWVyeS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxNc3NxbERpc3RpbmN0QnlQcmltYXJ5S2V5UXVlcnkoe3F1ZXJ5fSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLmZyb250ZW5kTW9kZWxDbGFzcygpXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gICAgY29uc3Qgcm9vdFRhYmxlU3FsID0gcXVlcnkuZHJpdmVyLnF1b3RlVGFibGUobW9kZWxDbGFzcy50YWJsZU5hbWUoKSlcbiAgICBjb25zdCBwcmltYXJ5S2V5U3FsID0gYCR7cm9vdFRhYmxlU3FsfS4ke3F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihwcmltYXJ5S2V5KX1gXG4gICAgY29uc3QgZGlzdGluY3RJZHNRdWVyeSA9IHF1ZXJ5LmNsb25lKClcblxuICAgIGRpc3RpbmN0SWRzUXVlcnkuX3ByZWxvYWQgPSB7fVxuICAgIGRpc3RpbmN0SWRzUXVlcnkuX3NlbGVjdHMgPSBbXVxuICAgIGRpc3RpbmN0SWRzUXVlcnkuc2VsZWN0KHByaW1hcnlLZXlTcWwpXG4gICAgZGlzdGluY3RJZHNRdWVyeS5kaXN0aW5jdCh0cnVlKVxuXG4gICAgY29uc3QgZGlzdGluY3RSb290UXVlcnkgPSBtb2RlbENsYXNzLl9uZXdRdWVyeSgpXG5cbiAgICBkaXN0aW5jdFJvb3RRdWVyeS53aGVyZShgJHtwcmltYXJ5S2V5U3FsfSBJTiAoJHtkaXN0aW5jdElkc1F1ZXJ5LnRvU3FsKCl9KWApXG4gICAgZGlzdGluY3RSb290UXVlcnkuX3ByZWxvYWQgPSB7Li4ucXVlcnkuX3ByZWxvYWR9XG5cbiAgICByZXR1cm4gZGlzdGluY3RSb290UXVlcnlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHBsdWNrIHZhbHVlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBQbHVjayBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxQbHVja1tdfSBhcmdzLnBsdWNrIC0gUGx1Y2sgZGVzY3JpcHRvcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PD8+Pn0gLSBQbHVja2VkIHZhbHVlcy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kTW9kZWxQbHVja1ZhbHVlcyh7cXVlcnksIHBsdWNrfSkge1xuICAgIGlmIChwbHVjay5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb2x1bW5zIGdpdmVuIHRvIHBsdWNrXCIpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICBjb25zdCBwbHVja1F1ZXJ5ID0gcXVlcnkuY2xvbmUoKVxuICAgIC8qKlxuICAgICAqIEFsaWFzZXMuXG4gICAgICBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgY29uc3QgYWxpYXNlcyA9IFtdXG4gICAgY29uc3QgcXVlcnlNZXRhZGF0YSA9IGZyb250ZW5kTW9kZWxRdWVyeU1ldGFkYXRhKHF1ZXJ5KVxuICAgIGNvbnN0IHBsdWNrUXVlcnlNZXRhZGF0YSA9IGZyb250ZW5kTW9kZWxRdWVyeU1ldGFkYXRhKHBsdWNrUXVlcnkpXG4gICAgY29uc3Qgam9pbmVkUGF0aHMgPSBxdWVyeU1ldGFkYXRhW2Zyb250ZW5kTW9kZWxKb2luZWRQYXRoc1N5bWJvbF1cblxuICAgIHBsdWNrUXVlcnkuX3ByZWxvYWQgPSB7fVxuICAgIHBsdWNrUXVlcnkuX3NlbGVjdHMgPSBbXVxuICAgIHBsdWNrUXVlcnlNZXRhZGF0YVtmcm9udGVuZE1vZGVsSm9pbmVkUGF0aHNTeW1ib2xdID0gam9pbmVkUGF0aHMgPyBuZXcgU2V0KGpvaW5lZFBhdGhzKSA6IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCBbcGx1Y2tJbmRleCwgcGx1Y2tFbnRyeV0gb2YgcGx1Y2suZW50cmllcygpKSB7XG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsU2VhcmNoVGFyZ2V0TW9kZWxDbGFzcyh7XG4gICAgICAgIG1vZGVsQ2xhc3MsXG4gICAgICAgIHBhdGg6IHBsdWNrRW50cnkucGF0aFxuICAgICAgfSlcbiAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVGcm9udGVuZE1vZGVsQ29sdW1uTmFtZSh0YXJnZXRNb2RlbENsYXNzLCBwbHVja0VudHJ5LmNvbHVtbilcblxuICAgICAgaWYgKCFjb2x1bW5OYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwbHVjayBjb2x1bW4gXCIke3BsdWNrRW50cnkuY29sdW1ufVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAocGx1Y2tFbnRyeS5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsSm9pblBhdGgoe3BhdGg6IHBsdWNrRW50cnkucGF0aCwgcXVlcnk6IHBsdWNrUXVlcnl9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YWJsZVJlZmVyZW5jZSA9IHBsdWNrUXVlcnkuZ2V0VGFibGVSZWZlcmVuY2VGb3JKb2luKC4uLnBsdWNrRW50cnkucGF0aClcbiAgICAgIGNvbnN0IGNvbHVtblNxbCA9IGAke3BsdWNrUXVlcnkuZHJpdmVyLnF1b3RlVGFibGUodGFibGVSZWZlcmVuY2UpfS4ke3BsdWNrUXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfWBcbiAgICAgIGNvbnN0IGFsaWFzID0gYGZyb250ZW5kX21vZGVsX3BsdWNrXyR7cGx1Y2tJbmRleH1gXG5cbiAgICAgIHBsdWNrUXVlcnkuc2VsZWN0KGAke2NvbHVtblNxbH0gQVMgJHtwbHVja1F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihhbGlhcyl9YClcbiAgICAgIGFsaWFzZXMucHVzaChhbGlhcylcbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gYXdhaXQgcGx1Y2tRdWVyeS5yZXN1bHRzKClcblxuICAgIGlmIChhbGlhc2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgW2FsaWFzXSA9IGFsaWFzZXNcblxuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChyb3cpW2FsaWFzXSlcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgY29uc3Qgcm93SGFzaCA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChyb3cpXG5cbiAgICAgIHJldHVybiBhbGlhc2VzLm1hcCgoYWxpYXMpID0+IHJvd0hhc2hbYWxpYXNdKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBzZWFyY2ggdGFyZ2V0IG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlYXJjaCBhcmdzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxTZWFyY2hUYXJnZXRNb2RlbENsYXNzKHttb2RlbENsYXNzLCBwYXRofSkge1xuICAgIGxldCB0YXJnZXRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIHBhdGgpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHRhcmdldE1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwc01hcCgpW3JlbGF0aW9uc2hpcE5hbWVdXG5cbiAgICAgIGlmICghcmVsYXRpb25zaGlwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWFyY2ggcmVsYXRpb25zaGlwIFwiJHtyZWxhdGlvbnNoaXBOYW1lfVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBUYXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcFRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXJnZXQgbW9kZWwgY2xhc3MgZm9yICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfSMke3JlbGF0aW9uc2hpcE5hbWV9YClcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlbGF0aW9uc2hpcFRhcmdldE1vZGVsQ2xhc3NcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0TW9kZWxDbGFzc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXBwbHkgZnJvbnRlbmQgbW9kZWwgc2VhcmNoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlYXJjaCBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxTZWFyY2h9IGFyZ3Muc2VhcmNoIC0gU2VhcmNoIGZpbHRlci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxTZWFyY2goe3F1ZXJ5LCBzZWFyY2h9KSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsU2VhcmNoVGFyZ2V0TW9kZWxDbGFzcyh7XG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgcGF0aDogc2VhcmNoLnBhdGhcbiAgICB9KVxuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVGcm9udGVuZE1vZGVsQ29sdW1uTmFtZSh0YXJnZXRNb2RlbENsYXNzLCBzZWFyY2guY29sdW1uKVxuXG4gICAgaWYgKCFjb2x1bW5OYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc2VhcmNoIGNvbHVtbiBcIiR7c2VhcmNoLmNvbHVtbn1cIiBmb3IgJHt0YXJnZXRNb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsSm9pblBhdGgoe3BhdGg6IHNlYXJjaC5wYXRoLCBxdWVyeX0pXG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVSZWZlcmVuY2UgPSBxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oLi4uc2VhcmNoLnBhdGgpXG4gICAgY29uc3QgY29sdW1uU3FsID0gYCR7cXVlcnkuZHJpdmVyLnF1b3RlVGFibGUodGFibGVSZWZlcmVuY2UpfS4ke3F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX1gXG4gICAgY29uc3Qgb3BlcmF0b3JNYXAgPSB7XG4gICAgICBlcTogXCI9XCIsXG4gICAgICBndDogXCI+XCIsXG4gICAgICBndGVxOiBcIj49XCIsXG4gICAgICBsaWtlOiBcIkxJS0VcIixcbiAgICAgIGx0OiBcIjxcIixcbiAgICAgIGx0ZXE6IFwiPD1cIixcbiAgICAgIG5vdEVxOiBcIiE9XCJcbiAgICB9XG4gICAgY29uc3Qgc3FsT3BlcmF0b3IgPSBvcGVyYXRvck1hcFtzZWFyY2gub3BlcmF0b3JdXG5cbiAgICBpZiAoc2VhcmNoLm9wZXJhdG9yID09PSBcImVxXCIpIHtcbiAgICAgIGlmICh0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbEFycmF5U2VhcmNoKHtlbXB0eVNxbDogXCIxPTBcIiwgb3BlcmF0b3JTcWw6IFwiSU5cIiwgcXVlcnksIHNlYXJjaCwgY29sdW1uU3FsfSkpIHJldHVyblxuXG4gICAgICBpZiAoc2VhcmNoLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGAke2NvbHVtblNxbH0gSVMgTlVMTGApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzZWFyY2gub3BlcmF0b3IgPT09IFwibm90RXFcIikge1xuICAgICAgaWYgKHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsQXJyYXlTZWFyY2goe2VtcHR5U3FsOiBcIjE9MVwiLCBvcGVyYXRvclNxbDogXCJOT1QgSU5cIiwgcXVlcnksIHNlYXJjaCwgY29sdW1uU3FsfSkpIHJldHVyblxuXG4gICAgICBpZiAoc2VhcmNoLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGAke2NvbHVtblNxbH0gSVMgTk9UIE5VTExgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBxdWVyeS53aGVyZShgJHtjb2x1bW5TcWx9ICR7c3FsT3BlcmF0b3J9ICR7cXVlcnkuZHJpdmVyLnF1b3RlKHNlYXJjaC52YWx1ZSl9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhcnJheS12YWx1ZWQgZXF1YWxpdHkgc2VhcmNoIGZpbHRlcnMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gU2VhcmNoIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29sdW1uU3FsIC0gU1FMIGZvciB0aGUgc2VhcmNoZWQgY29sdW1uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5lbXB0eVNxbCAtIFNRTCBwcmVkaWNhdGUgdXNlZCB3aGVuIHRoZSBhcnJheSBpcyBlbXB0eS5cbiAgICogQHBhcmFtIHtcIklOXCIgfCBcIk5PVCBJTlwifSBhcmdzLm9wZXJhdG9yU3FsIC0gU1FMIGFycmF5IG9wZXJhdG9yLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxTZWFyY2h9IGFyZ3Muc2VhcmNoIC0gU2VhcmNoIGRlc2NyaXB0b3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYW4gYXJyYXkgcHJlZGljYXRlIHdhcyBhcHBsaWVkLlxuICAgKi9cbiAgYXBwbHlGcm9udGVuZE1vZGVsQXJyYXlTZWFyY2goe2NvbHVtblNxbCwgZW1wdHlTcWwsIG9wZXJhdG9yU3FsLCBxdWVyeSwgc2VhcmNofSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzZWFyY2gudmFsdWUpKSByZXR1cm4gZmFsc2VcblxuICAgIGlmIChzZWFyY2gudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBxdWVyeS53aGVyZShlbXB0eVNxbClcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkud2hlcmUoYCR7Y29sdW1uU3FsfSAke29wZXJhdG9yU3FsfSAoJHtzZWFyY2gudmFsdWUubWFwKChlbnRyeSkgPT4gcXVlcnkuZHJpdmVyLnF1b3RlKGVudHJ5KSkuam9pbihcIiwgXCIpfSlgKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBseSBmcm9udGVuZCBtb2RlbCBwYWdpbmF0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFBhZ2luYXRpb24gYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsUGFnaW5hdGlvbn0gYXJncy5wYWdpbmF0aW9uIC0gUGFnaW5hdGlvbiB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXBwbHlGcm9udGVuZE1vZGVsUGFnaW5hdGlvbih7cXVlcnksIHBhZ2luYXRpb259KSB7XG4gICAgaWYgKHBhZ2luYXRpb24ubGltaXQgIT09IG51bGwpIHtcbiAgICAgIHF1ZXJ5LmxpbWl0KHBhZ2luYXRpb24ubGltaXQpXG4gICAgfVxuXG4gICAgaWYgKHBhZ2luYXRpb24ub2Zmc2V0ICE9PSBudWxsKSB7XG4gICAgICBxdWVyeS5vZmZzZXQocGFnaW5hdGlvbi5vZmZzZXQpXG4gICAgfVxuXG4gICAgaWYgKHBhZ2luYXRpb24ucGVyUGFnZSAhPT0gbnVsbCkge1xuICAgICAgcXVlcnkucGVyUGFnZShwYWdpbmF0aW9uLnBlclBhZ2UpXG4gICAgfVxuXG4gICAgaWYgKHBhZ2luYXRpb24ucGFnZSAhPT0gbnVsbCkge1xuICAgICAgcXVlcnkucGFnZShwYWdpbmF0aW9uLnBhZ2UpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXBwbHkgZnJvbnRlbmQgbW9kZWwgd2hlcmUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gV2hlcmUgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy53aGVyZSAtIFJvb3QtbW9kZWwgd2hlcmUgY29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxXaGVyZSh7cXVlcnksIHdoZXJlfSkge1xuICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsV2hlcmVGb3JQYXRoKHtcbiAgICAgIG1vZGVsQ2xhc3M6IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKCksXG4gICAgICBwYXRoOiBbXSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgd2hlcmVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXBwbHkgZnJvbnRlbmQgbW9kZWwgam9pbnMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSm9pbnMgYXJncy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy5qb2lucyAtIFJlbGF0aW9uc2hpcC1vYmplY3Qgam9pbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXBwbHlGcm9udGVuZE1vZGVsSm9pbnMoe2pvaW5zLCBxdWVyeX0pIHtcbiAgICBjb25zdCBqb2luUGF0aEtleXMgPSBuZXcgU2V0KClcblxuICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsSm9pbnNGb3JQYXRoKHtcbiAgICAgIGpvaW5zLFxuICAgICAgam9pblBhdGhLZXlzLFxuICAgICAgbW9kZWxDbGFzczogdGhpcy5mcm9udGVuZE1vZGVsQ2xhc3MoKSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgcXVlcnlcbiAgICB9KVxuXG4gICAgcXVlcnkuam9pbnMoam9pbnMpXG5cbiAgICBjb25zdCBxdWVyeU1ldGFkYXRhID0gZnJvbnRlbmRNb2RlbFF1ZXJ5TWV0YWRhdGEocXVlcnkpXG4gICAgY29uc3Qgam9pbmVkUGF0aHMgPSBxdWVyeU1ldGFkYXRhW2Zyb250ZW5kTW9kZWxKb2luZWRQYXRoc1N5bWJvbF0gfHwgbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IGpvaW5QYXRoS2V5IG9mIGpvaW5QYXRoS2V5cykge1xuICAgICAgam9pbmVkUGF0aHMuYWRkKGpvaW5QYXRoS2V5KVxuICAgIH1cblxuICAgIHF1ZXJ5TWV0YWRhdGFbZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzU3ltYm9sXSA9IGpvaW5lZFBhdGhzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBseSBmcm9udGVuZCBtb2RlbCBqb2lucyBmb3IgcGF0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBKb2lucyBhcmdzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLmpvaW5zIC0gSm9pbnMgZm9yIGN1cnJlbnQgcGF0aC5cbiAgICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gYXJncy5qb2luUGF0aEtleXMgLSBKb2luZWQgcGF0aCBrZXlzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyBmb3IgY3VycmVudCBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnBhdGggLSBSZWxhdGlvbnNoaXAgcGF0aC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxKb2luc0ZvclBhdGgoe2pvaW5zLCBqb2luUGF0aEtleXMsIG1vZGVsQ2xhc3MsIHBhdGgsIHF1ZXJ5fSkge1xuICAgIHZvaWQgcXVlcnlcblxuICAgIGZvciAoY29uc3QgW3JlbGF0aW9uc2hpcE5hbWUsIHJlbGF0aW9uc2hpcEpvaW5dIG9mIE9iamVjdC5lbnRyaWVzKGpvaW5zKSkge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBzTWFwKClbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGpvaW4gcmVsYXRpb25zaGlwIFwiJHtyZWxhdGlvbnNoaXBOYW1lfVwiIGZvciAke21vZGVsQ2xhc3MubmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXJnZXQgbW9kZWwgY2xhc3MgZm9yIGpvaW4gcmVsYXRpb25zaGlwIFwiJHtyZWxhdGlvbnNoaXBOYW1lfVwiIG9uICR7bW9kZWxDbGFzcy5uYW1lfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcFBhdGggPSBbLi4ucGF0aCwgcmVsYXRpb25zaGlwTmFtZV1cbiAgICAgIGpvaW5QYXRoS2V5cy5hZGQocmVsYXRpb25zaGlwUGF0aC5qb2luKFwiLlwiKSlcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcEpvaW4gPT09IHRydWUpIGNvbnRpbnVlXG5cbiAgICAgIHRoaXMuYXBwbHlGcm9udGVuZE1vZGVsSm9pbnNGb3JQYXRoKHtcbiAgICAgICAgam9pbnM6IHJlbGF0aW9uc2hpcEpvaW4sXG4gICAgICAgIGpvaW5QYXRoS2V5cyxcbiAgICAgICAgbW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcyxcbiAgICAgICAgcGF0aDogcmVsYXRpb25zaGlwUGF0aCxcbiAgICAgICAgcXVlcnlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEga2V5IHRoYXQgbWF5IGJlIGVpdGhlciBhIGNhbWVsQ2FzZSBhdHRyaWJ1dGUgbmFtZSBvciBhIHJhdyBEQlxuICAgKiBjb2x1bW4gbmFtZSB0byBpdHMgY2Fub25pY2FsIGNvbHVtbiBuYW1lLiAgUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBrZXkgbWF0Y2hlcyBuZWl0aGVyIG1hcC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gQXR0cmlidXRlIG5hbWUgb3IgY29sdW1uIG5hbWUgdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBSZXNvbHZlZCBEQiBjb2x1bW4gbmFtZSwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICByZXNvbHZlRnJvbnRlbmRNb2RlbENvbHVtbk5hbWUobW9kZWxDbGFzcywga2V5KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lID0gbW9kZWxDbGFzcy5yZXNvbHZlQXR0cmlidXRlTmFtZShrZXkpXG5cbiAgICBpZiAocmVzb2x2ZWRBdHRyaWJ1dGVOYW1lKSByZXR1cm4gbW9kZWxDbGFzcy5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKClbcmVzb2x2ZWRBdHRyaWJ1dGVOYW1lXVxuXG4gICAgLy8gRmFsbCBiYWNrOiB0aGUga2V5IG1heSBhbHJlYWR5IGJlIGEgcmF3IERCIGNvbHVtbiBuYW1lIG5vdCBwcmVzZW50IGluIHRoZSBhdHRyaWJ1dGUgbWFwLlxuICAgIGlmIChtb2RlbENsYXNzLmdldENvbHVtbk5hbWVUb0F0dHJpYnV0ZU5hbWVNYXAoKVtrZXldKSByZXR1cm4ga2V5XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBseSBmcm9udGVuZCBtb2RlbCB3aGVyZSBmb3IgcGF0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBXaGVyZSBhcmdzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyBmb3IgY3VycmVudCB3aGVyZSBzY29wZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5wYXRoIC0gUmVsYXRpb25zaGlwIHBhdGggZnJvbSByb290LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLndoZXJlIC0gV2hlcmUgY29uZGl0aW9ucyBmb3IgY3VycmVudCBzY29wZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxXaGVyZUZvclBhdGgoe21vZGVsQ2xhc3MsIHBhdGgsIHF1ZXJ5LCB3aGVyZX0pIHtcbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMod2hlcmUpKSB7XG4gICAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5yZXNvbHZlRnJvbnRlbmRNb2RlbENvbHVtbk5hbWUobW9kZWxDbGFzcywgYXR0cmlidXRlTmFtZSlcblxuICAgICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsSm9pblBhdGgoe3BhdGgsIHF1ZXJ5fSlcblxuICAgICAgICBjb25zdCB0YWJsZVJlZmVyZW5jZSA9IHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbiguLi5wYXRoKVxuICAgICAgICBjb25zdCBjb2x1bW5TcWwgPSBgJHtxdWVyeS5kcml2ZXIucXVvdGVUYWJsZSh0YWJsZVJlZmVyZW5jZSl9LiR7cXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfWBcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBxdWVyeS53aGVyZShcIjE9MFwiKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkVmFsdWVzID0gdmFsdWUubWFwKChlbnRyeSkgPT4gdGhpcy5ub3JtYWxpemVGcm9udGVuZE1vZGVsV2hlcmVDb2x1bW5WYWx1ZSh7Y29sdW1uTmFtZSwgbW9kZWxDbGFzcywgdmFsdWU6IGVudHJ5fSkpXG5cbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkVmFsdWVzLmluY2x1ZGVzKGZyb250ZW5kTW9kZWxXaGVyZU5vTWF0Y2hTeW1ib2wpKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5LndoZXJlKFwiMT0wXCIpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBxdWVyeS53aGVyZShgJHtjb2x1bW5TcWx9IElOICgke25vcm1hbGl6ZWRWYWx1ZXMubWFwKChlbnRyeSkgPT4gcXVlcnkuZHJpdmVyLnF1b3RlKGVudHJ5KSkuam9pbihcIiwgXCIpfSlgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKGAke2NvbHVtblNxbH0gSVMgTlVMTGApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdGhpcy5ub3JtYWxpemVGcm9udGVuZE1vZGVsV2hlcmVDb2x1bW5WYWx1ZSh7Y29sdW1uTmFtZSwgbW9kZWxDbGFzcywgdmFsdWV9KVxuXG4gICAgICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSA9PT0gZnJvbnRlbmRNb2RlbFdoZXJlTm9NYXRjaFN5bWJvbCkge1xuICAgICAgICAgICAgcXVlcnkud2hlcmUoXCIxPTBcIilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkud2hlcmUoYCR7Y29sdW1uU3FsfSA9ICR7cXVlcnkuZHJpdmVyLnF1b3RlKG5vcm1hbGl6ZWRWYWx1ZSl9YClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBzTWFwKClbYXR0cmlidXRlTmFtZV1cblxuICAgICAgICBpZiAoIXJlbGF0aW9uc2hpcCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB3aGVyZSByZWxhdGlvbnNoaXAgXCIke2F0dHJpYnV0ZU5hbWV9XCIgZm9yICR7bW9kZWxDbGFzcy5uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdGFyZ2V0IG1vZGVsIGNsYXNzIGZvciB3aGVyZSByZWxhdGlvbnNoaXAgXCIke2F0dHJpYnV0ZU5hbWV9XCIgb24gJHttb2RlbENsYXNzLm5hbWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcFBhdGggPSBbLi4ucGF0aCwgYXR0cmlidXRlTmFtZV1cblxuICAgICAgICB0aGlzLmFwcGx5RnJvbnRlbmRNb2RlbFdoZXJlRm9yUGF0aCh7XG4gICAgICAgICAgbW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcyxcbiAgICAgICAgICBwYXRoOiByZWxhdGlvbnNoaXBQYXRoLFxuICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgIHdoZXJlOiB2YWx1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB3aGVyZSBjb2x1bW4gXCIke2F0dHJpYnV0ZU5hbWV9XCIgZm9yICR7bW9kZWxDbGFzcy5uYW1lfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIHdoZXJlIGNvbHVtbiB2YWx1ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0gez99IGFyZ3MudmFsdWUgLSBXaGVyZSB2YWx1ZS5cbiAgICogQHJldHVybnMgez8gfCBzeW1ib2x9IC0gU1FMLXNhZmUgd2hlcmUgdmFsdWUuXG4gICAqL1xuICBub3JtYWxpemVGcm9udGVuZE1vZGVsV2hlcmVDb2x1bW5WYWx1ZSh7Y29sdW1uTmFtZSwgbW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgY29sdW1uVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZShjb2x1bW5OYW1lKT8udG9Mb3dlckNhc2UoKVxuICAgICAgY29uc3QgaXNEYXRlVGltZUNvbHVtbiA9IHR5cGVvZiBjb2x1bW5UeXBlID09PSBcInN0cmluZ1wiICYmIFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcInRpbWVzdGFtcFwiXS5zb21lKCh0eXBlKSA9PiBjb2x1bW5UeXBlLmluY2x1ZGVzKHR5cGUpKVxuXG4gICAgICBpZiAoaXNEYXRlVGltZUNvbHVtbikge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRlID0gbmV3IERhdGUodmFsdWUpXG5cbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkRGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZERhdGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgY29sdW1uVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0Q29sdW1uVHlwZUJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbHVtblR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGZyb250ZW5kTW9kZWxXaGVyZU5vTWF0Y2hTeW1ib2xcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSBjb2x1bW5UeXBlLnRvTG93ZXJDYXNlKClcbiAgICAgIGNvbnN0IG9iamVjdFZhbHVlVHlwZXMgPSBuZXcgU2V0KFtcImNoYXJcIiwgXCJ2YXJjaGFyXCIsIFwibnZhcmNoYXJcIiwgXCJzdHJpbmdcIiwgXCJlbnVtXCIsIFwianNvblwiLCBcImpzb25iXCIsIFwiY2l0ZXh0XCIsIFwiYmluYXJ5XCIsIFwidmFyYmluYXJ5XCJdKVxuICAgICAgY29uc3Qgc3VwcG9ydHNPYmplY3RWYWx1ZXMgPSBub3JtYWxpemVkVHlwZS5pbmNsdWRlcyhcInRleHRcIikgfHwgb2JqZWN0VmFsdWVUeXBlcy5oYXMobm9ybWFsaXplZFR5cGUpXG5cbiAgICAgIGlmICghc3VwcG9ydHNPYmplY3RWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyb250ZW5kTW9kZWxXaGVyZU5vTWF0Y2hTeW1ib2xcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXBwbHkgZnJvbnRlbmQgbW9kZWwgZ3JvdXAuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gR3JvdXAgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsR3JvdXB9IGFyZ3MuZ3JvdXAgLSBHcm91cCBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5RnJvbnRlbmRNb2RlbEdyb3VwKHtxdWVyeSwgZ3JvdXB9KSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsU2VhcmNoVGFyZ2V0TW9kZWxDbGFzcyh7XG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgcGF0aDogZ3JvdXAucGF0aFxuICAgIH0pXG4gICAgY29uc3QgY29sdW1uTmFtZSA9IHRoaXMucmVzb2x2ZUZyb250ZW5kTW9kZWxDb2x1bW5OYW1lKHRhcmdldE1vZGVsQ2xhc3MsIGdyb3VwLmNvbHVtbilcblxuICAgIGlmICghY29sdW1uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGdyb3VwIGNvbHVtbiBcIiR7Z3JvdXAuY29sdW1ufVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIHRoaXMuZW5zdXJlRnJvbnRlbmRNb2RlbEpvaW5QYXRoKHtwYXRoOiBncm91cC5wYXRoLCBxdWVyeX0pXG5cbiAgICBjb25zdCB0YWJsZVJlZmVyZW5jZSA9IHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbiguLi5ncm91cC5wYXRoKVxuICAgIGNvbnN0IGNvbHVtblNxbCA9IGAke3F1ZXJ5LmRyaXZlci5xdW90ZVRhYmxlKHRhYmxlUmVmZXJlbmNlKX0uJHtxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9YFxuXG4gICAgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsR3JvdXBDb2x1bW4oe2NvbHVtblNxbCwgcXVlcnl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcm9vdC1tb2RlbCBjb2x1bW5zIHRvIEdST1VQIEJZIHNvIHN0cmljdCBTUUwgZW5naW5lcyBhY2NlcHQgZGVmYXVsdCByb290LXRhYmxlIHNlbGVjdHMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUZyb250ZW5kTW9kZWxSb290R3JvdXBDb2x1bW5zKHtxdWVyeX0pIHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAgPSBtb2RlbENsYXNzLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKVxuICAgIGNvbnN0IHJvb3RUYWJsZVJlZmVyZW5jZSA9IHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbigpXG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbk5hbWUgb2YgT2JqZWN0LnZhbHVlcyhhdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKSkge1xuICAgICAgY29uc3QgY29sdW1uU3FsID0gYCR7cXVlcnkuZHJpdmVyLnF1b3RlVGFibGUocm9vdFRhYmxlUmVmZXJlbmNlKX0uJHtxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9YFxuXG4gICAgICB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxHcm91cENvbHVtbih7Y29sdW1uU3FsLCBxdWVyeX0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYSBncm91cC1ieSBTUUwgY29sdW1uIGlzIG9ubHkgYXBwZW5kZWQgb25jZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb2x1bW5TcWwgLSBGdWxseS1xdWFsaWZpZWQgY29sdW1uIFNRTC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbnN1cmVGcm9udGVuZE1vZGVsR3JvdXBDb2x1bW4oe2NvbHVtblNxbCwgcXVlcnl9KSB7XG4gICAgY29uc3QgcXVlcnlNZXRhZGF0YSA9IGZyb250ZW5kTW9kZWxRdWVyeU1ldGFkYXRhKHF1ZXJ5KVxuICAgIGNvbnN0IGdyb3VwZWRDb2x1bW5zID0gcXVlcnlNZXRhZGF0YVtmcm9udGVuZE1vZGVsR3JvdXBlZENvbHVtbnNTeW1ib2xdIHx8IG5ldyBTZXQoKVxuXG4gICAgaWYgKGdyb3VwZWRDb2x1bW5zLmhhcyhjb2x1bW5TcWwpKSByZXR1cm5cblxuICAgIHF1ZXJ5Lmdyb3VwKGNvbHVtblNxbClcbiAgICBncm91cGVkQ29sdW1ucy5hZGQoY29sdW1uU3FsKVxuICAgIHF1ZXJ5TWV0YWRhdGFbZnJvbnRlbmRNb2RlbEdyb3VwZWRDb2x1bW5zU3ltYm9sXSA9IGdyb3VwZWRDb2x1bW5zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBseSBmcm9udGVuZCBtb2RlbCB0cmFuc2xhdGVkIGF0dHJpYnV0ZSBwcmVsb2Fkcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IC0gUXVlcnkgd2l0aCB0cmFuc2xhdGlvbnMgcHJlbG9hZGVkIGlmIG5lZWRlZC5cbiAgICovXG4gIGFwcGx5RnJvbnRlbmRNb2RlbFRyYW5zbGF0ZWRBdHRyaWJ1dGVQcmVsb2Fkcyh7cXVlcnl9KSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXMgPSB0aGlzLmZyb250ZW5kTW9kZWxFZmZlY3RpdmVTZWxlY3RlZEF0dHJpYnV0ZXNGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIHRoaXMuZnJvbnRlbmRNb2RlbERlZmF1bHRBdHRyaWJ1dGVzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKSB8fCBbXSlcbiAgICAgIHx8IHRoaXMuZnJvbnRlbmRNb2RlbERlZmF1bHRBdHRyaWJ1dGVzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKVxuXG4gICAgaWYgKCFzZWxlY3RlZEF0dHJpYnV0ZXMpIHJldHVybiBxdWVyeVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKClcbiAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gKi8gKHJlc291cmNlLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IHRyYW5zbGF0ZWRTZXQgPSBuZXcgU2V0KHJlc291cmNlQ2xhc3MudHJhbnNsYXRlZEF0dHJpYnV0ZXMgfHwgW10pXG4gICAgbGV0IG5lZWRzVHJhbnNsYXRpb25zID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBzZWxlY3RlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGhvb2tOYW1lID0gYCR7YXR0cmlidXRlTmFtZX1BdHRyaWJ1dGVTZWxlY3RlZGBcbiAgICAgIGNvbnN0IGR5bmFtaWNSZXNvdXJjZSA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUgez99ICovIChyZXNvdXJjZSkpXG5cbiAgICAgIGlmICh0eXBlb2YgZHluYW1pY1Jlc291cmNlW2hvb2tOYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGR5bmFtaWNSZXNvdXJjZVtob29rTmFtZV0oe3F1ZXJ5fSlcblxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcXVlcnkgPSByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmFuc2xhdGVkU2V0LmhhcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICBuZWVkc1RyYW5zbGF0aW9ucyA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVlZHNUcmFuc2xhdGlvbnMpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkucHJlbG9hZCh7dHJhbnNsYXRpb25zOiB7fX0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBseSBmcm9udGVuZCBtb2RlbCBzb3J0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNvcnQgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsU29ydH0gYXJncy5zb3J0IC0gU29ydCBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5RnJvbnRlbmRNb2RlbFNvcnQoe3F1ZXJ5LCBzb3J0fSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLmZyb250ZW5kTW9kZWxDbGFzcygpXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHRoaXMuZnJvbnRlbmRNb2RlbFNlYXJjaFRhcmdldE1vZGVsQ2xhc3Moe1xuICAgICAgbW9kZWxDbGFzcyxcbiAgICAgIHBhdGg6IHNvcnQucGF0aFxuICAgIH0pXG4gICAgY29uc3QgdHJhbnNsYXRlZEF0dHJpYnV0ZXNNYXAgPSB0YXJnZXRNb2RlbENsYXNzLmdldFRyYW5zbGF0aW9uc01hcCgpXG4gICAgY29uc3QgdHJhbnNsYXRlZEF0dHJpYnV0ZU5hbWVzID0gT2JqZWN0LmtleXModHJhbnNsYXRlZEF0dHJpYnV0ZXNNYXApXG4gICAgY29uc3QgaXNUcmFuc2xhdGVkU29ydEF0dHJpYnV0ZSA9IHRyYW5zbGF0ZWRBdHRyaWJ1dGVOYW1lcy5pbmNsdWRlcyhzb3J0LmNvbHVtbilcblxuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVGcm9udGVuZE1vZGVsQ29sdW1uTmFtZSh0YXJnZXRNb2RlbENsYXNzLCBzb3J0LmNvbHVtbilcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBzb3J0LmRpcmVjdGlvbi50b1VwcGVyQ2FzZSgpXG5cbiAgICBpZiAoaXNUcmFuc2xhdGVkU29ydEF0dHJpYnV0ZSkge1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25Nb2RlbENsYXNzID0gdGFyZ2V0TW9kZWxDbGFzcy5nZXRUcmFuc2xhdGlvbkNsYXNzKClcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uQXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCA9IHRyYW5zbGF0aW9uTW9kZWxDbGFzcy5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwKClcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uQ29sdW1uTmFtZSA9IHRyYW5zbGF0aW9uQXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcFtzb3J0LmNvbHVtbl1cbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uUGF0aCA9IHNvcnQucGF0aC5jb25jYXQoW1wiY3VycmVudFRyYW5zbGF0aW9uXCJdKVxuXG4gICAgICBpZiAoIXRyYW5zbGF0aW9uQ29sdW1uTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHJhbnNsYXRlZCBzb3J0IGNvbHVtbiBcIiR7c29ydC5jb2x1bW59XCIgZm9yICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfWApXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW5zdXJlRnJvbnRlbmRNb2RlbFNvcnRKb2luUGF0aCh7cGF0aDogdHJhbnNsYXRpb25QYXRoLCBxdWVyeX0pXG5cbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uVGFibGVSZWZlcmVuY2UgPSBxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oLi4udHJhbnNsYXRpb25QYXRoKVxuICAgICAgY29uc3QgdHJhbnNsYXRpb25Db2x1bW5TcWwgPSBgJHtxdWVyeS5kcml2ZXIucXVvdGVUYWJsZSh0cmFuc2xhdGlvblRhYmxlUmVmZXJlbmNlKX0uJHtxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4odHJhbnNsYXRpb25Db2x1bW5OYW1lKX1gXG5cbiAgICAgIHF1ZXJ5Lm9yZGVyKGAke3RyYW5zbGF0aW9uQ29sdW1uU3FsfSAke2RpcmVjdGlvbn1gKVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWNvbHVtbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzb3J0IGNvbHVtbiBcIiR7c29ydC5jb2x1bW59XCIgZm9yICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfWApXG4gICAgfVxuXG4gICAgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsU29ydEpvaW5QYXRoKHtwYXRoOiBzb3J0LnBhdGgsIHF1ZXJ5fSlcblxuICAgIGNvbnN0IHRhYmxlUmVmZXJlbmNlID0gcXVlcnkuZ2V0VGFibGVSZWZlcmVuY2VGb3JKb2luKC4uLnNvcnQucGF0aClcbiAgICBjb25zdCBjb2x1bW5TcWwgPSBgJHtxdWVyeS5kcml2ZXIucXVvdGVUYWJsZSh0YWJsZVJlZmVyZW5jZSl9LiR7cXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfWBcblxuICAgIHF1ZXJ5Lm9yZGVyKGAke2NvbHVtblNxbH0gJHtkaXJlY3Rpb259YClcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIGEgc29ydCBqb2luIHBhdGggaGFzIGJlZW4gam9pbmVkIG9uIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEpvaW4gYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5wYXRoIC0gUmVsYXRpb25zaGlwIGpvaW4gcGF0aC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbnN1cmVGcm9udGVuZE1vZGVsU29ydEpvaW5QYXRoKHtwYXRoLCBxdWVyeX0pIHtcbiAgICB0aGlzLmVuc3VyZUZyb250ZW5kTW9kZWxKb2luUGF0aCh7cGF0aCwgcXVlcnl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYSByZWxhdGlvbnNoaXAgcGF0aCBoYXMgZXhhY3RseSBvbmUgU1FMIGpvaW4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSm9pbiBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnBhdGggLSBSZWxhdGlvbnNoaXAgam9pbiBwYXRoLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGVuc3VyZUZyb250ZW5kTW9kZWxKb2luUGF0aCh7cGF0aCwgcXVlcnl9KSB7XG4gICAgaWYgKHBhdGgubGVuZ3RoIDwgMSkgcmV0dXJuXG5cbiAgICBjb25zdCBxdWVyeU1ldGFkYXRhID0gZnJvbnRlbmRNb2RlbFF1ZXJ5TWV0YWRhdGEocXVlcnkpXG4gICAgY29uc3Qgam9pbmVkUGF0aHMgPSBxdWVyeU1ldGFkYXRhW2Zyb250ZW5kTW9kZWxKb2luZWRQYXRoc1N5bWJvbF0gfHwgbmV3IFNldCgpXG4gICAgY29uc3QgcGF0aEtleSA9IHBhdGguam9pbihcIi5cIilcblxuICAgIGlmIChqb2luZWRQYXRocy5oYXMocGF0aEtleSkpIHJldHVyblxuXG4gICAgcXVlcnkuam9pbnMoYnVpbGRGcm9udGVuZE1vZGVsSm9pbk9iamVjdEZyb21QYXRoKHBhdGgpKVxuICAgIGpvaW5lZFBhdGhzLmFkZChwYXRoS2V5KVxuICAgIHF1ZXJ5TWV0YWRhdGFbZnJvbnRlbmRNb2RlbEpvaW5lZFBhdGhzU3ltYm9sXSA9IGpvaW5lZFBhdGhzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBzZWxlY3RlZCBhdHRyaWJ1dGVzIGZvciBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW10gfCBudWxsfSAtIFNlbGVjdGVkIGF0dHJpYnV0ZXMgZm9yIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFNlbGVjdGVkQXR0cmlidXRlc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcykge1xuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMuZnJvbnRlbmRNb2RlbFNlbGVjdCgpXG5cbiAgICBpZiAoIXNlbGVjdCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBzZWxlY3RbbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKV0gfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgc2VsZWN0cyBleHRyYSBmb3IgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gLSBFeHRyYSBhdHRyaWJ1dGVzIChsb2FkZWQgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHRzKSBmb3IgdGhlIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbFNlbGVjdHNFeHRyYUZvck1vZGVsQ2xhc3MobW9kZWxDbGFzcykge1xuICAgIGNvbnN0IHNlbGVjdHNFeHRyYSA9IHRoaXMuZnJvbnRlbmRNb2RlbFNlbGVjdHNFeHRyYSgpXG5cbiAgICBpZiAoIXNlbGVjdHNFeHRyYSkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiBzZWxlY3RzRXh0cmFbbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKV0gfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBmaW5hbCBzZXQgb2YgYXR0cmlidXRlIG5hbWVzIHRvIHNlcmlhbGl6ZSBmb3IgYSBtb2RlbCBjbGFzczpcbiAgICogYW4gZXhwbGljaXQgbmFycm93aW5nIGBzZWxlY3RgIHdpbnM7IG90aGVyd2lzZSwgd2hlbiBgc2VsZWN0c0V4dHJhYCBpcyBnaXZlbixcbiAgICogdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBwbHVzIHRoZSBleHRyYXM7IG90aGVyd2lzZSBudWxsIChkZWZhdWx0IGJlaGF2aW9yKS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmYWxsYmFja0F0dHJpYnV0ZU5hbWVzIC0gQXR0cmlidXRlIG5hbWVzIHRvIHRyZWF0IGFzIHRoZSBkZWZhdWx0cyB3aGVuIHRoZSByZXNvdXJjZSBkZWNsYXJlcyBub25lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW10gfCBudWxsfSAtIEVmZmVjdGl2ZSBzZWxlY3RlZCBhdHRyaWJ1dGUgbmFtZXMsIG9yIG51bGwgZm9yIGRlZmF1bHQgc2VyaWFsaXphdGlvbi5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxFZmZlY3RpdmVTZWxlY3RlZEF0dHJpYnV0ZXNGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MsIGZhbGxiYWNrQXR0cmlidXRlTmFtZXMpIHtcbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXMgPSB0aGlzLmZyb250ZW5kTW9kZWxTZWxlY3RlZEF0dHJpYnV0ZXNGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpXG5cbiAgICBpZiAoc2VsZWN0ZWRBdHRyaWJ1dGVzKSByZXR1cm4gc2VsZWN0ZWRBdHRyaWJ1dGVzXG5cbiAgICBjb25zdCBleHRyYUF0dHJpYnV0ZXMgPSB0aGlzLmZyb250ZW5kTW9kZWxTZWxlY3RzRXh0cmFGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpXG5cbiAgICBpZiAoIWV4dHJhQXR0cmlidXRlcykgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGRlZmF1bHRBdHRyaWJ1dGVzID0gdGhpcy5mcm9udGVuZE1vZGVsRGVmYXVsdEF0dHJpYnV0ZXNGb3JNb2RlbENsYXNzKG1vZGVsQ2xhc3MpIHx8IGZhbGxiYWNrQXR0cmlidXRlTmFtZXNcblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmRlZmF1bHRBdHRyaWJ1dGVzLCAuLi5leHRyYUF0dHJpYnV0ZXNdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gLSBEZWZhdWx0IGZyb250ZW5kLW1vZGVsIGF0dHJpYnV0ZXMgZGVjbGFyZWQgb24gdGhlIHJlc291cmNlLlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbERlZmF1bHRBdHRyaWJ1dGVzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKSB7XG4gICAgY29uc3QgZnJvbnRlbmRNb2RlbFJlc291cmNlID0gdGhpcy5mcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2U/LnJlc291cmNlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVzXG5cbiAgICBpZiAoIWF0dHJpYnV0ZXMpIHJldHVybiBudWxsXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVzKSkge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiKSByZXR1cm4gdHJ1ZVxuXG4gICAgICAgICAgY29uc3QgY29uZmlnID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKGVudHJ5KVxuXG4gICAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuc2VsZWN0ZWRCeURlZmF1bHQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2VcblxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgPyBlbnRyeSA6IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoZW50cnkpLm5hbWUpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcylcbiAgICAgICAgLmZpbHRlcigoWywgY29uZmlnXSkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcgIT09IFwib2JqZWN0XCIpIHJldHVybiB0cnVlXG5cbiAgICAgICAgICByZXR1cm4gLyoqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS4gQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoY29uZmlnKS5zZWxlY3RlZEJ5RGVmYXVsdCAhPT0gZmFsc2VcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBub24gZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gQXR0cmlidXRlIG5hbWVzIGV4cGxpY2l0bHkgbWFya2VkIHNlbGVjdGVkQnlEZWZhdWx0OiBmYWxzZS5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxOb25EZWZhdWx0QXR0cmlidXRlc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcykge1xuICAgIGNvbnN0IGZyb250ZW5kTW9kZWxSZXNvdXJjZSA9IHRoaXMuZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZvck1vZGVsQ2xhc3MobW9kZWxDbGFzcylcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlPy5yZXNvdXJjZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlc1xuXG4gICAgaWYgKCFhdHRyaWJ1dGVzKSByZXR1cm4gW11cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgIT09IFwib2JqZWN0XCIgfHwgIWVudHJ5KSByZXR1cm4gZmFsc2VcblxuICAgICAgICAgIHJldHVybiAvKiogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChlbnRyeSkuc2VsZWN0ZWRCeURlZmF1bHQgPT09IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHs/fSAqLyAoZW50cnkpKS5uYW1lKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpXG4gICAgICAgIC5maWx0ZXIoKFssIGNvbmZpZ10pID0+IHR5cGVvZiBjb25maWcgPT09IFwib2JqZWN0XCIgJiYgY29uZmlnICYmIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoY29uZmlnKS5zZWxlY3RlZEJ5RGVmYXVsdCA9PT0gZmFsc2UpXG4gICAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSlcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlcmlhbGl6ZSBmcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsIC0gTW9kZWwgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gLSBTZXJpYWxpemVkIGF0dHJpYnV0ZXMgZmlsdGVyZWQgYnkgc2VsZWN0IG1hcC5cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxBdHRyaWJ1dGVzKG1vZGVsKSB7XG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKG1vZGVsLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IG1vZGVsQXR0cmlidXRlcyA9IG1vZGVsLmF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IHNlbGVjdGVkQXR0cmlidXRlcyA9IHRoaXMuZnJvbnRlbmRNb2RlbEVmZmVjdGl2ZVNlbGVjdGVkQXR0cmlidXRlc0Zvck1vZGVsQ2xhc3MobW9kZWxDbGFzcywgT2JqZWN0LmtleXMobW9kZWxBdHRyaWJ1dGVzKSlcbiAgICBjb25zdCBkZWZhdWx0QXR0cmlidXRlcyA9IHRoaXMuZnJvbnRlbmRNb2RlbERlZmF1bHRBdHRyaWJ1dGVzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKVxuICAgIGNvbnN0IHJlc291cmNlSW5zdGFuY2UgPSB0aGlzLl9zZXJpYWxpemF0aW9uUmVzb3VyY2VJbnN0YW5jZUZvck1vZGVsKG1vZGVsKVxuXG4gICAgLyoqXG4gICAgICogUmVzb3VyY2UgYXR0cmlidXRlIG1ldGhvZCBuYW1lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gICAgICovXG4gICAgY29uc3QgcmVzb3VyY2VBdHRyaWJ1dGVNZXRob2ROYW1lID0gKGF0dHJpYnV0ZU5hbWUpID0+IGAke2F0dHJpYnV0ZU5hbWV9QXR0cmlidXRlYFxuXG4gICAgLyoqXG4gICAgICogUmVzb3VyY2UgaGFzIGF0dHJpYnV0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgICAqL1xuICAgIGNvbnN0IHJlc291cmNlSGFzQXR0cmlidXRlID0gKGF0dHJpYnV0ZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSByZXNvdXJjZUF0dHJpYnV0ZU1ldGhvZE5hbWUoYXR0cmlidXRlTmFtZSlcblxuICAgICAgcmV0dXJuIHJlc291cmNlSW5zdGFuY2UgJiYgdHlwZW9mIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICgvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHs/fSAqLyAocmVzb3VyY2VJbnN0YW5jZSkpW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b3R5cGUgYXR0cmlidXRlIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgICAqL1xuICAgIGNvbnN0IHByb3RvdHlwZUF0dHJpYnV0ZU1ldGhvZCA9IChhdHRyaWJ1dGVOYW1lKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2RlbClcblxuICAgICAgd2hpbGUgKGN1cnJlbnRQcm90b3R5cGUgJiYgY3VycmVudFByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN1cnJlbnRQcm90b3R5cGUsIGF0dHJpYnV0ZU5hbWUpPy52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWV0aG9kOiBjYW5kaWRhdGUsXG4gICAgICAgICAgICBvd25lck5hbWU6IGN1cnJlbnRQcm90b3R5cGUuY29uc3RydWN0b3I/Lm5hbWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnRQcm90b3R5cGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplZCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICAgKi9cbiAgICBjb25zdCBzZXJpYWxpemVkQXR0cmlidXRlVmFsdWUgPSBhc3luYyAoYXR0cmlidXRlTmFtZSkgPT4ge1xuICAgICAgLy8gQ2hlY2sgcmVzb3VyY2UgaW5zdGFuY2UgZmlyc3QgKHZpcnR1YWwvY29tcHV0ZWQgYXR0cmlidXRlcyB2aWEgJHtuYW1lfUF0dHJpYnV0ZSBjb252ZW50aW9uKVxuICAgICAgaWYgKHJlc291cmNlSGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSByZXNvdXJjZUF0dHJpYnV0ZU1ldGhvZE5hbWUoYXR0cmlidXRlTmFtZSlcblxuICAgICAgICByZXR1cm4gYXdhaXQgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgRnVuY3Rpb24+fSAqLyAoLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7P30gKi8gKHJlc291cmNlSW5zdGFuY2UpKVttZXRob2ROYW1lXShtb2RlbClcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbCBiYWNrIHRvIG1vZGVsIG1ldGhvZFxuICAgICAgY29uc3QgYXR0cmlidXRlTWV0aG9kTG9va3VwID0gcHJvdG90eXBlQXR0cmlidXRlTWV0aG9kKGF0dHJpYnV0ZU5hbWUpXG4gICAgICBjb25zdCBhdHRyaWJ1dGVNZXRob2QgPSBhdHRyaWJ1dGVNZXRob2RMb29rdXA/Lm1ldGhvZFxuXG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZU1ldGhvZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhdHRyaWJ1dGVNZXRob2QuY2FsbChtb2RlbClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1vZGVsQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dHJpYnV0ZSBleGlzdHMuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAgICAgKi9cbiAgICBjb25zdCBhdHRyaWJ1dGVFeGlzdHMgPSAoYXR0cmlidXRlTmFtZSkgPT4ge1xuICAgICAgcmV0dXJuIChhdHRyaWJ1dGVOYW1lIGluIG1vZGVsQXR0cmlidXRlcykgfHwgKGF0dHJpYnV0ZU5hbWUgaW4gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChtb2RlbCkpIHx8IHJlc291cmNlSGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpXG4gICAgfVxuXG4gICAgaWYgKCFzZWxlY3RlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICghZGVmYXVsdEF0dHJpYnV0ZXMgfHwgZGVmYXVsdEF0dHJpYnV0ZXMubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gbW9kZWxBdHRyaWJ1dGVzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4Y2x1ZGVkQXR0cmlidXRlcyA9IHRoaXMuZnJvbnRlbmRNb2RlbE5vbkRlZmF1bHRBdHRyaWJ1dGVzRm9yTW9kZWxDbGFzcyhtb2RlbENsYXNzKVxuICAgICAgY29uc3Qgc2VyaWFsaXplZEF0dHJpYnV0ZXMgPSB7Li4ubW9kZWxBdHRyaWJ1dGVzfVxuXG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVkTmFtZSBvZiBleGNsdWRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgZGVsZXRlIHNlcmlhbGl6ZWRBdHRyaWJ1dGVzW2V4Y2x1ZGVkTmFtZV1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGRlZmF1bHRBdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICghYXR0cmlidXRlRXhpc3RzKGF0dHJpYnV0ZU5hbWUpKSBjb250aW51ZVxuICAgICAgICBzZXJpYWxpemVkQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGF3YWl0IHNlcmlhbGl6ZWRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVOYW1lKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VyaWFsaXplZEF0dHJpYnV0ZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVkIGF0dHJpYnV0ZXMuXG4gICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgY29uc3Qgc2VyaWFsaXplZEF0dHJpYnV0ZXMgPSB7fVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIHNlbGVjdGVkQXR0cmlidXRlcykge1xuICAgICAgaWYgKCFhdHRyaWJ1dGVFeGlzdHMoYXR0cmlidXRlTmFtZSkpIGNvbnRpbnVlXG4gICAgICBzZXJpYWxpemVkQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGF3YWl0IHNlcmlhbGl6ZWRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVOYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkQXR0cmlidXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VyaWFsaXphdGlvbiByZXNvdXJjZSBpbnN0YW5jZSBmb3IgbW9kZWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWwgLSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gLSBSZXNvdXJjZSBpbnN0YW5jZSBvciBudWxsLlxuICAgKi9cbiAgX3NlcmlhbGl6YXRpb25SZXNvdXJjZUluc3RhbmNlRm9yTW9kZWwobW9kZWwpIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuZnJvbnRlbmRNb2RlbFJlc291cmNlSW5zdGFuY2UoKVxuXG4gICAgaWYgKHJlc291cmNlLm1vZGVsQ2xhc3MoKSA9PT0gbW9kZWwuY29uc3RydWN0b3IpIHtcbiAgICAgIHJldHVybiByZXNvdXJjZVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2VuZFByb2plY3RzPy4oKSB8fCBbXVxuICAgIGNvbnN0IG1vZGVsQ2xhc3NOYW1lID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChtb2RlbC5jb25zdHJ1Y3RvcikuZ2V0TW9kZWxOYW1lKClcblxuICAgIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdXG4gICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gcmVzb3VyY2VEZWZpbml0aW9uID8gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pIDogbnVsbFxuXG4gICAgICBpZiAocmVzb3VyY2VDbGFzcykge1xuICAgICAgICByZXR1cm4gbmV3IHJlc291cmNlQ2xhc3Moe1xuICAgICAgICAgIGFiaWxpdHk6IHRoaXMuY3VycmVudEFiaWxpdHkoKSxcbiAgICAgICAgICBjb250ZXh0OiB0aGlzLmN1cnJlbnRBYmlsaXR5KCk/LmdldENvbnRleHQoKSB8fCB7fSxcbiAgICAgICAgICBsb2NhbHM6IHRoaXMuY3VycmVudEFiaWxpdHkoKT8uZ2V0TG9jYWxzKCkgfHwge30sXG4gICAgICAgICAgbW9kZWxDbGFzczogLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKG1vZGVsLmNvbnN0cnVjdG9yKSxcbiAgICAgICAgICBtb2RlbE5hbWU6IG1vZGVsQ2xhc3NOYW1lLFxuICAgICAgICAgIHBhcmFtczoge30sXG4gICAgICAgICAgcmVzb3VyY2VDb25maWd1cmF0aW9uOiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZH0gKi8gKHR5cGVvZiByZXNvdXJjZUNsYXNzLnJlc291cmNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCIgPyByZXNvdXJjZUNsYXNzLnJlc291cmNlQ29uZmlnKCkgOiB1bmRlZmluZWQpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGZpbHRlciBzZXJpYWxpemFibGUgcmVsYXRlZCBtb2RlbHMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5tb2RlbHMgLSBGcm9udGVuZCBtb2RlbCByZWNvcmRzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3MucmVsYXRpb25zaGlwSXNDb2xsZWN0aW9uIC0gV2hldGhlciByZWxhdGlvbiBpcyBoYXMtbWFueS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdPn0gLSBTZXJpYWxpemFibGUgcmVsYXRlZCBtb2RlbHMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsRmlsdGVyU2VyaWFsaXphYmxlUmVsYXRlZE1vZGVscyh7bW9kZWxzLCByZWxhdGlvbnNoaXBJc0NvbGxlY3Rpb259KSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRBYmlsaXR5KCkpIHJldHVybiBtb2RlbHNcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1vZGVsc1xuXG4gICAgLyoqXG4gICAgICogTW9kZWxzIGJ5IGNsYXNzLlxuICAgICAgQHR5cGUge01hcDx0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdPn0gKi9cbiAgICBjb25zdCBtb2RlbHNCeUNsYXNzID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVscykge1xuICAgICAgY29uc3QgcmVsYXRlZE1vZGVsQ2xhc3MgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIChtb2RlbC5jb25zdHJ1Y3RvcilcbiAgICAgIGNvbnN0IGV4aXN0aW5nTW9kZWxzRm9yQ2xhc3MgPSBtb2RlbHNCeUNsYXNzLmdldChyZWxhdGVkTW9kZWxDbGFzcykgfHwgW11cblxuICAgICAgZXhpc3RpbmdNb2RlbHNGb3JDbGFzcy5wdXNoKG1vZGVsKVxuICAgICAgbW9kZWxzQnlDbGFzcy5zZXQocmVsYXRlZE1vZGVsQ2xhc3MsIGV4aXN0aW5nTW9kZWxzRm9yQ2xhc3MpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXV0aG9yaXplZCBpZHMgYnkgY2xhc3MuXG4gICAgICBAdHlwZSB7TWFwPHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBTZXQ8c3RyaW5nPj59ICovXG4gICAgY29uc3QgYXV0aG9yaXplZElkc0J5Q2xhc3MgPSBuZXcgTWFwKClcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IGtleXMgYnkgY2xhc3MuXG4gICAgICBAdHlwZSB7TWFwPHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IHByaW1hcnlLZXlzQnlDbGFzcyA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBbcmVsYXRlZE1vZGVsQ2xhc3MsIHJlbGF0ZWRNb2RlbHNdIG9mIG1vZGVsc0J5Q2xhc3MuZW50cmllcygpKSB7XG4gICAgICBjb25zdCByZWxhdGVkUmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gb3JNb2RlbENsYXNzKHJlbGF0ZWRNb2RlbENsYXNzKVxuXG4gICAgICBpZiAoIXJlbGF0ZWRSZXNvdXJjZSkge1xuICAgICAgICBhdXRob3JpemVkSWRzQnlDbGFzcy5zZXQocmVsYXRlZE1vZGVsQ2xhc3MsIG5ldyBTZXQoKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWJpbGl0eUFjdGlvbiA9IHJlbGF0aW9uc2hpcElzQ29sbGVjdGlvblxuICAgICAgICA/IHJlbGF0ZWRSZXNvdXJjZS5yZXNvdXJjZUNvbmZpZ3VyYXRpb24uYWJpbGl0aWVzPy5pbmRleFxuICAgICAgICA6IHJlbGF0ZWRSZXNvdXJjZS5yZXNvdXJjZUNvbmZpZ3VyYXRpb24uYWJpbGl0aWVzPy5maW5kXG5cbiAgICAgIGlmICh0eXBlb2YgYWJpbGl0eUFjdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBhYmlsaXR5QWN0aW9uLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgYXV0aG9yaXplZElkc0J5Q2xhc3Muc2V0KHJlbGF0ZWRNb2RlbENsYXNzLCBuZXcgU2V0KCkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSByZWxhdGVkTW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgICAgIGNvbnN0IGlkcyA9IHJlbGF0ZWRNb2RlbHNcbiAgICAgICAgLm1hcCgobW9kZWwpID0+IG1vZGVsLmF0dHJpYnV0ZXMoKVtwcmltYXJ5S2V5XSlcbiAgICAgICAgLmZpbHRlcigoaWQpID0+IGlkICE9PSB1bmRlZmluZWQgJiYgaWQgIT09IG51bGwpXG5cbiAgICAgIGlmIChpZHMubGVuZ3RoIDwgMSkge1xuICAgICAgICBhdXRob3JpemVkSWRzQnlDbGFzcy5zZXQocmVsYXRlZE1vZGVsQ2xhc3MsIG5ldyBTZXQoKSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aG9yaXplZElkc1JhdyA9IGF3YWl0IHJlbGF0ZWRNb2RlbENsYXNzXG4gICAgICAgIC5hY2Nlc3NpYmxlRm9yKGFiaWxpdHlBY3Rpb24pXG4gICAgICAgIC53aGVyZSh7W3ByaW1hcnlLZXldOiBpZHN9KVxuICAgICAgICAucGx1Y2socHJpbWFyeUtleSlcblxuICAgICAgcHJpbWFyeUtleXNCeUNsYXNzLnNldChyZWxhdGVkTW9kZWxDbGFzcywgcHJpbWFyeUtleSlcbiAgICAgIGF1dGhvcml6ZWRJZHNCeUNsYXNzLnNldChyZWxhdGVkTW9kZWxDbGFzcywgbmV3IFNldChhdXRob3JpemVkSWRzUmF3Lm1hcCgoaWQpID0+IFN0cmluZyhpZCkpKSlcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kZWxzLmZpbHRlcigobW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IHJlbGF0ZWRNb2RlbENsYXNzID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSAqLyAobW9kZWwuY29uc3RydWN0b3IpXG4gICAgICBjb25zdCBhdXRob3JpemVkSWRzID0gYXV0aG9yaXplZElkc0J5Q2xhc3MuZ2V0KHJlbGF0ZWRNb2RlbENsYXNzKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IHByaW1hcnlLZXlzQnlDbGFzcy5nZXQocmVsYXRlZE1vZGVsQ2xhc3MpXG5cbiAgICAgIGlmICghYXV0aG9yaXplZElkcyB8fCAhcHJpbWFyeUtleSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNvbnN0IHByaW1hcnlLZXlWYWx1ZSA9IG1vZGVsLmF0dHJpYnV0ZXMoKVtwcmltYXJ5S2V5XVxuXG4gICAgICBpZiAocHJpbWFyeUtleVZhbHVlID09PSB1bmRlZmluZWQgfHwgcHJpbWFyeUtleVZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2VcblxuICAgICAgcmV0dXJuIGF1dGhvcml6ZWRJZHMuaGFzKFN0cmluZyhwcmltYXJ5S2V5VmFsdWUpKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBzZXJpYWxpemFibGUgZnJvbnRlbmQgbW9kZWwuXG4gICAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgcHJlbG9hZGVkIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gLSBXaGV0aGVyIHZhbHVlIGJlaGF2ZXMgbGlrZSBhIG1vZGVsLlxuICAgKi9cbiAgaXNTZXJpYWxpemFibGVGcm9udGVuZE1vZGVsKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUgez99ICovICh2YWx1ZSkuYXR0cmlidXRlcyA9PT0gXCJmdW5jdGlvblwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2VyaWFsaXplIGZyb250ZW5kIG1vZGVscy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IG1vZGVscyAtIE1vZGVscyB0byBzZXJpYWxpemUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+W10+fSAtIFNlcmlhbGl6ZWQgbW9kZWwgcGF5bG9hZHMuXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVGcm9udGVuZE1vZGVscyhtb2RlbHMpIHtcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA8IDEpIHJldHVybiBbXVxuXG4gICAgLyoqXG4gICAgICogUHJlbG9hZGVkIHJlbGF0aW9uc2hpcHMgcGVyIG1vZGVsLlxuICAgICAgQHR5cGUge0FycmF5PFJlY29yZDxzdHJpbmcsID8+Pn0gKi9cbiAgICBjb25zdCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWwgPSBBcnJheS5mcm9tKHtsZW5ndGg6IG1vZGVscy5sZW5ndGh9LCAoKSA9PiAoe30pKVxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdGlvbiByZWxhdGlvbnNoaXAgZW50cmllcy5cbiAgICAgIEB0eXBlIHtBcnJheTx7bG9hZGVkTW9kZWxzOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W10sIG1vZGVsSW5kZXg6IG51bWJlciwgcmVsYXRpb25zaGlwTmFtZTogc3RyaW5nfT59ICovXG4gICAgY29uc3QgY29sbGVjdGlvblJlbGF0aW9uc2hpcEVudHJpZXMgPSBbXVxuICAgIC8qKlxuICAgICAqIFNpbmd1bGFyIHJlbGF0aW9uc2hpcCBlbnRyaWVzLlxuICAgICAgQHR5cGUge0FycmF5PHtsb2FkZWRNb2RlbDogaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbW9kZWxJbmRleDogbnVtYmVyLCByZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmd9Pn0gKi9cbiAgICBjb25zdCBzaW5ndWxhclJlbGF0aW9uc2hpcEVudHJpZXMgPSBbXVxuXG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsLCBtb2RlbEluZGV4KSA9PiB7XG4gICAgICBjb25zdCBtb2RlbENsYXNzID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gKi8gKG1vZGVsLmNvbnN0cnVjdG9yKVxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwc01hcCA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwc01hcCgpXG5cbiAgICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBpbiByZWxhdGlvbnNoaXBzTWFwKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICAgIGlmICghcmVsYXRpb25zaGlwLmdldFByZWxvYWRlZCgpKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcC5sb2FkZWQoKVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxvYWRlZFJlbGF0aW9uc2hpcCkpIHtcbiAgICAgICAgICBjb2xsZWN0aW9uUmVsYXRpb25zaGlwRW50cmllcy5wdXNoKHtsb2FkZWRNb2RlbHM6IGxvYWRlZFJlbGF0aW9uc2hpcCwgbW9kZWxJbmRleCwgcmVsYXRpb25zaGlwTmFtZX0pXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2VyaWFsaXphYmxlRnJvbnRlbmRNb2RlbChsb2FkZWRSZWxhdGlvbnNoaXApKSB7XG4gICAgICAgICAgc2luZ3VsYXJSZWxhdGlvbnNoaXBFbnRyaWVzLnB1c2goe2xvYWRlZE1vZGVsOiBsb2FkZWRSZWxhdGlvbnNoaXAsIG1vZGVsSW5kZXgsIHJlbGF0aW9uc2hpcE5hbWV9KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWxbbW9kZWxJbmRleF1bcmVsYXRpb25zaGlwTmFtZV0gPSBsb2FkZWRSZWxhdGlvbnNoaXAgPT0gdW5kZWZpbmVkID8gbnVsbCA6IGxvYWRlZFJlbGF0aW9uc2hpcFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoY29sbGVjdGlvblJlbGF0aW9uc2hpcEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYWxsQ29sbGVjdGlvbk1vZGVscyA9IGNvbGxlY3Rpb25SZWxhdGlvbnNoaXBFbnRyaWVzLmZsYXRNYXAoKGVudHJ5KSA9PiBlbnRyeS5sb2FkZWRNb2RlbHMpXG4gICAgICBjb25zdCBzZXJpYWxpemFibGVDb2xsZWN0aW9uTW9kZWxzID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsRmlsdGVyU2VyaWFsaXphYmxlUmVsYXRlZE1vZGVscyh7XG4gICAgICAgIG1vZGVsczogYWxsQ29sbGVjdGlvbk1vZGVscyxcbiAgICAgICAgcmVsYXRpb25zaGlwSXNDb2xsZWN0aW9uOiB0cnVlXG4gICAgICB9KVxuICAgICAgY29uc3Qgc2VyaWFsaXphYmxlQ29sbGVjdGlvbk1vZGVsc1NldCA9IG5ldyBTZXQoc2VyaWFsaXphYmxlQ29sbGVjdGlvbk1vZGVscylcblxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBFbnRyeSBvZiBjb2xsZWN0aW9uUmVsYXRpb25zaGlwRW50cmllcykge1xuICAgICAgICBjb25zdCBhbGxvd2VkTW9kZWxzID0gcmVsYXRpb25zaGlwRW50cnkubG9hZGVkTW9kZWxzLmZpbHRlcigocmVsYXRlZE1vZGVsKSA9PiBzZXJpYWxpemFibGVDb2xsZWN0aW9uTW9kZWxzU2V0LmhhcyhyZWxhdGVkTW9kZWwpKVxuICAgICAgICBjb25zdCBzZXJpYWxpemVkUmVsYXRlZE1vZGVscyA9IGF3YWl0IHRoaXMuc2VyaWFsaXplRnJvbnRlbmRNb2RlbHMoYWxsb3dlZE1vZGVscylcblxuICAgICAgICBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWxbcmVsYXRpb25zaGlwRW50cnkubW9kZWxJbmRleF1bcmVsYXRpb25zaGlwRW50cnkucmVsYXRpb25zaGlwTmFtZV0gPSBzZXJpYWxpemVkUmVsYXRlZE1vZGVsc1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaW5ndWxhclJlbGF0aW9uc2hpcEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYWxsU2luZ3VsYXJNb2RlbHMgPSBzaW5ndWxhclJlbGF0aW9uc2hpcEVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkubG9hZGVkTW9kZWwpXG4gICAgICBjb25zdCBzZXJpYWxpemFibGVTaW5ndWxhck1vZGVscyA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbEZpbHRlclNlcmlhbGl6YWJsZVJlbGF0ZWRNb2RlbHMoe1xuICAgICAgICBtb2RlbHM6IGFsbFNpbmd1bGFyTW9kZWxzLFxuICAgICAgICByZWxhdGlvbnNoaXBJc0NvbGxlY3Rpb246IGZhbHNlXG4gICAgICB9KVxuICAgICAgY29uc3Qgc2VyaWFsaXphYmxlU2luZ3VsYXJNb2RlbHNTZXQgPSBuZXcgU2V0KHNlcmlhbGl6YWJsZVNpbmd1bGFyTW9kZWxzKVxuXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcEVudHJ5IG9mIHNpbmd1bGFyUmVsYXRpb25zaGlwRW50cmllcykge1xuICAgICAgICBpZiAoIXNlcmlhbGl6YWJsZVNpbmd1bGFyTW9kZWxzU2V0LmhhcyhyZWxhdGlvbnNoaXBFbnRyeS5sb2FkZWRNb2RlbCkpIHtcbiAgICAgICAgICBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWxbcmVsYXRpb25zaGlwRW50cnkubW9kZWxJbmRleF1bcmVsYXRpb25zaGlwRW50cnkucmVsYXRpb25zaGlwTmFtZV0gPSBudWxsXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRNb2RlbCA9IChhd2FpdCB0aGlzLnNlcmlhbGl6ZUZyb250ZW5kTW9kZWxzKFtyZWxhdGlvbnNoaXBFbnRyeS5sb2FkZWRNb2RlbF0pKVswXVxuICAgICAgICBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWxbcmVsYXRpb25zaGlwRW50cnkubW9kZWxJbmRleF1bcmVsYXRpb25zaGlwRW50cnkucmVsYXRpb25zaGlwTmFtZV0gPSBzZXJpYWxpemVkTW9kZWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVkIG1vZGVscy5cbiAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/PltdfSAqL1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRNb2RlbHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBbbW9kZWxJbmRleCwgbW9kZWxdIG9mIG1vZGVscy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRBdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5zZXJpYWxpemVGcm9udGVuZE1vZGVsQXR0cmlidXRlcyhtb2RlbClcbiAgICAgIGNvbnN0IHByZWxvYWRlZFJlbGF0aW9uc2hpcHMgPSBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzUGVyTW9kZWxbbW9kZWxJbmRleF1cbiAgICAgIGNvbnN0IGFzc29jaWF0aW9uQ291bnRzID0gdHlwZW9mIG1vZGVsLmFzc29jaWF0aW9uQ291bnRzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBtb2RlbC5hc3NvY2lhdGlvbkNvdW50cygpXG4gICAgICAgIDoge31cbiAgICAgIGNvbnN0IHF1ZXJ5RGF0YVZhbHVlcyA9IHR5cGVvZiBtb2RlbC5xdWVyeURhdGFWYWx1ZXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG1vZGVsLnF1ZXJ5RGF0YVZhbHVlcygpXG4gICAgICAgIDoge31cbiAgICAgIGNvbnN0IGNvbXB1dGVkQWJpbGl0aWVzID0gdHlwZW9mIG1vZGVsLmNvbXB1dGVkQWJpbGl0aWVzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBtb2RlbC5jb21wdXRlZEFiaWxpdGllcygpXG4gICAgICAgIDoge31cbiAgICAgIGNvbnN0IGhhc0NvdW50cyA9IE9iamVjdC5rZXlzKGFzc29jaWF0aW9uQ291bnRzKS5sZW5ndGggPiAwXG4gICAgICBjb25zdCBoYXNRdWVyeURhdGEgPSBPYmplY3Qua2V5cyhxdWVyeURhdGFWYWx1ZXMpLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IGhhc0FiaWxpdGllcyA9IE9iamVjdC5rZXlzKGNvbXB1dGVkQWJpbGl0aWVzKS5sZW5ndGggPiAwXG4gICAgICBjb25zdCBoYXNQcmVsb2FkZWQgPSBPYmplY3Qua2V5cyhwcmVsb2FkZWRSZWxhdGlvbnNoaXBzKS5sZW5ndGggPiAwXG5cbiAgICAgIGlmICghaGFzUHJlbG9hZGVkICYmICFoYXNDb3VudHMgJiYgIWhhc1F1ZXJ5RGF0YSAmJiAhaGFzQWJpbGl0aWVzKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRNb2RlbHMucHVzaChzZXJpYWxpemVkQXR0cmlidXRlcylcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBTZXJpYWxpemVkLlxuICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgICBjb25zdCBzZXJpYWxpemVkID0gey4uLnNlcmlhbGl6ZWRBdHRyaWJ1dGVzfVxuXG4gICAgICBpZiAoaGFzUHJlbG9hZGVkKSBzZXJpYWxpemVkLl9fcHJlbG9hZGVkUmVsYXRpb25zaGlwcyA9IHByZWxvYWRlZFJlbGF0aW9uc2hpcHNcbiAgICAgIGlmIChoYXNDb3VudHMpIHNlcmlhbGl6ZWQuX19hc3NvY2lhdGlvbkNvdW50cyA9IGFzc29jaWF0aW9uQ291bnRzXG4gICAgICBpZiAoaGFzUXVlcnlEYXRhKSBzZXJpYWxpemVkLl9fcXVlcnlEYXRhID0gcXVlcnlEYXRhVmFsdWVzXG4gICAgICBpZiAoaGFzQWJpbGl0aWVzKSBzZXJpYWxpemVkLl9fYWJpbGl0aWVzID0gY29tcHV0ZWRBYmlsaXRpZXNcblxuICAgICAgc2VyaWFsaXplZE1vZGVscy5wdXNoKHNlcmlhbGl6ZWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRNb2RlbHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNlcmlhbGl6ZSBmcm9udGVuZCBtb2RlbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbCAtIEZyb250ZW5kIG1vZGVsIHJlY29yZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSAtIFNlcmlhbGl6ZWQgZnJvbnRlbmQgbW9kZWwgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZUZyb250ZW5kTW9kZWwobW9kZWwpIHtcbiAgICBjb25zdCBzZXJpYWxpemVkTW9kZWxzID0gYXdhaXQgdGhpcy5zZXJpYWxpemVGcm9udGVuZE1vZGVscyhbbW9kZWxdKVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRNb2RlbHNbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIHJlbmRlciBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZXJyb3IgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsUmVuZGVyRXJyb3IoZXJyb3JNZXNzYWdlKSB7XG4gICAgYXdhaXQgdGhpcy5sb2dnZXIuZXJyb3IoYEZyb250ZW5kIG1vZGVsIHJlcXVlc3QgZmFpbGVkOiAke2Vycm9yTWVzc2FnZX1gKVxuXG4gICAgY29uc3QgcmVuZGVyRXJyb3IgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHsoKGVycm9yTWVzc2FnZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZH0gKi8gKFxuICAgICAgLyoqXG4gICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICBAdHlwZSB7P30gKi8gKHRoaXMpLnJlbmRlckVycm9yXG4gICAgKVxuXG4gICAgaWYgKHR5cGVvZiByZW5kZXJFcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhd2FpdCByZW5kZXJFcnJvci5jYWxsKHRoaXMsIGZyb250ZW5kTW9kZWxDbGllbnRTYWZlRXJyb3JNZXNzYWdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZW5kZXIoe1xuICAgICAganNvbjogLyoqXG4gICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoe1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGZyb250ZW5kTW9kZWxDbGllbnRTYWZlRXJyb3JNZXNzYWdlLFxuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIlxuICAgICAgfSkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGVycm9yIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgPz59IC0gRXJyb3IgcGF5bG9hZC5cbiAgICovXG4gIGZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoZXJyb3JNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgIHN0YXR1czogXCJlcnJvclwiXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY2xpZW50IHNhZmUgZXJyb3IgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSAtIENsaWVudC1zYWZlIGVycm9yIHBheWxvYWQuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsQ2xpZW50U2FmZUVycm9yUGF5bG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKGZyb250ZW5kTW9kZWxDbGllbnRTYWZlRXJyb3JNZXNzYWdlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY2xpZW50IGVycm9yIHBheWxvYWQgZm9yIGVycm9yLlxuICAgKiBAcGFyYW0gez99IGVycm9yIC0gQ2F1Z2h0IGVycm9yLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IC0gQ2xpZW50IHBheWxvYWQgZm9yIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRNb2RlbENsaWVudEVycm9yUGF5bG9hZEZvckVycm9yKGVycm9yKSB7XG4gICAgY29uc3QgdmVsb2Npb3VzTWV0YWRhdGEgPSBmcm9udGVuZE1vZGVsVmVsb2Npb3VzTWV0YWRhdGFGb3JFcnJvcihlcnJvcilcbiAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSlcblxuICAgIGxldCB2YWxpZGF0aW9uRXJyb3JzUGF5bG9hZCA9IHt9XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSBlcnJvci5nZXRWYWxpZGF0aW9uRXJyb3JzKClcbiAgICAgIGNvbnN0IG1vZGVsID0gZXJyb3IuZ2V0TW9kZWwoKVxuICAgICAgLyoqXG4gICAgICAgKiBTdHJ1Y3R1cmVkIGVycm9ycy5cbiAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsIHt0eXBlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZnVsbE1lc3NhZ2U6IHN0cmluZ31bXT59ICovXG4gICAgICBjb25zdCBzdHJ1Y3R1cmVkRXJyb3JzID0ge31cblxuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIGluIHZhbGlkYXRpb25FcnJvcnMpIHtcbiAgICAgICAgc3RydWN0dXJlZEVycm9yc1thdHRyaWJ1dGVOYW1lXSA9IHZhbGlkYXRpb25FcnJvcnNbYXR0cmlidXRlTmFtZV0ubWFwKGVyciA9PiAoe1xuICAgICAgICAgIHR5cGU6IGVyci50eXBlLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIGZ1bGxNZXNzYWdlOiBgJHttb2RlbC5nZXRNb2RlbENsYXNzKCkuaHVtYW5BdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpfSAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgfSkpXG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRpb25FcnJvcnNQYXlsb2FkID0ge1xuICAgICAgICBlcnJvclR5cGU6IFwidmFsaWRhdGlvbl9lcnJvclwiLFxuICAgICAgICB2YWxpZGF0aW9uRXJyb3JzOiBzdHJ1Y3R1cmVkRXJyb3JzXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChmcm9udGVuZE1vZGVsQ2xpZW50TWVzc2FnZUZvckVycm9yKGVycm9yKSksXG4gICAgICAuLi5mcm9udGVuZE1vZGVsRGVidWdQYXlsb2FkRm9yRXJyb3Ioe1xuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldEVudmlyb25tZW50KCksXG4gICAgICAgIGVycm9yXG4gICAgICB9KSxcbiAgICAgIC4uLih2ZWxvY2lvdXNNZXRhZGF0YSA/IHt2ZWxvY2lvdXM6IHZlbG9jaW91c01ldGFkYXRhfSA6IHt9KSxcbiAgICAgIC4uLnZhbGlkYXRpb25FcnJvcnNQYXlsb2FkLFxuICAgICAgLi4uKGF3YWl0IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmNsaWVudEVycm9yUGF5bG9hZEZvckVycm9yKHtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGNvbnRyb2xsZXI6IHRoaXMuY29uc3RydWN0b3IubmFtZVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbm9ybWFsaXplZEVycm9yLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLmdldFJlcXVlc3QoKVxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgbG9nIGVuZHBvaW50IGVycm9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEVycm9yIGxvZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hY3Rpb24gLSBFbmRwb2ludC9hY3Rpb24gbGFiZWwuXG4gICAqIEBwYXJhbSB7P30gYXJncy5lcnJvciAtIENhdWdodCBlcnJvci5cbiAgICogQHBhcmFtIHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIiB8IFwiY3VzdG9tLWNvbW1hbmRcIn0gW2FyZ3MuY29tbWFuZFR5cGVdIC0gRnJvbnRlbmQtbW9kZWwgY29tbWFuZCB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2FyZ3MubW9kZWxdIC0gUmVxdWVzdCBtb2RlbCBuYW1lIHdoZW4gYXZhaWxhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2FyZ3MucmVxdWVzdElkXSAtIEJhdGNoIHJlcXVlc3QgaWQgd2hlbiBhdmFpbGFibGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIGxvZ2dpbmcuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsTG9nRW5kcG9pbnRFcnJvcih7YWN0aW9uLCBlcnJvciwgY29tbWFuZFR5cGUsIG1vZGVsLCByZXF1ZXN0SWR9KSB7XG4gICAgLy8gRXJyb3JzIGFubm90YXRlZCB3aXRoIGBlcnJvci52ZWxvY2lvdXMgPSB7Li4ufWAgYXJlIHVzZXItZmxvd1xuICAgIC8vIGZhaWx1cmVzIHRoZSBkZXZlbG9wZXIgaGFzIG1hcmtlZCBhcyBleHBlY3RlZCAoYmFkIHBhc3N3b3JkLFxuICAgIC8vIHZhbGlkYXRpb24gbWVzc2FnZSwgZXRjLikuIFN1cmZhY2UgdGhlIG1lc3NhZ2UgKyBtZXRhZGF0YSB0b1xuICAgIC8vIHRoZSBjbGllbnQgKGhhbmRsZWQgYnkgZnJvbnRlbmRNb2RlbENsaWVudEVycm9yUGF5bG9hZEZvckVycm9yKSxcbiAgICAvLyBidXQgc2tpcCB0aGUgZXJyb3IgbG9nIHNvIG1vbml0b3Jpbmcgc3RheXMgZm9jdXNlZCBvbiByZWFsXG4gICAgLy8gYmFja2VuZCBmYWlsdXJlcy5cbiAgICBpZiAoZnJvbnRlbmRNb2RlbEVycm9ySGFzVmVsb2Npb3VzTWV0YWRhdGEoZXJyb3IpKSByZXR1cm5cblxuICAgIGxldCByZXNvbHZlZE1vZGVsID0gbW9kZWxcblxuICAgIGlmICghcmVzb2x2ZWRNb2RlbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWRNb2RlbCA9IHRoaXMuZnJvbnRlbmRNb2RlbFBhcmFtcygpLm1vZGVsXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmVzb2x2ZWRNb2RlbCA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgID8gYCR7ZXJyb3IubWVzc2FnZX1cXG4ke2Vycm9yLnN0YWNrIHx8IFwiXCJ9YFxuICAgICAgOiBTdHJpbmcoZXJyb3IpXG5cbiAgICBhd2FpdCB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGcm9udGVuZCBtb2RlbCBlbmRwb2ludCByZXF1ZXN0IGZhaWxlZFwiLCB7XG4gICAgICBhY3Rpb24sXG4gICAgICBjb21tYW5kVHlwZSxcbiAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICBtb2RlbDogcmVzb2x2ZWRNb2RlbCxcbiAgICAgIHJlcXVlc3RJZFxuICAgIH1dKVxuXG4gICAgLy8gU3VyZmFjZSBnZW51aW5lbHkgdW5leHBlY3RlZCBiYWNrZW5kIGZhaWx1cmVzIG9uIHRoZSBmcmFtZXdvcmstZXJyb3JcbiAgICAvLyBjaGFubmVsIHNvIHByb2Nlc3MtbGV2ZWwgYnVnIHJlcG9ydGVycyBjYXB0dXJlIHRoZW0sIGluc3RlYWQgb2YgdGhlXG4gICAgLy8gY29udHJvbGxlciBzaWxlbnRseSBzd2FsbG93aW5nIHRoZW0gYmVoaW5kIHRoZSBnZW5lcmljIFwiUmVxdWVzdFxuICAgIC8vIGZhaWxlZC5cIiBjbGllbnQgbWVzc2FnZS4gRGV2ZWxvcGVyLWFubm90YXRlZCB1c2VyLWZsb3cgZXJyb3JzXG4gICAgLy8gKGBlcnJvci52ZWxvY2lvdXNgIG1ldGFkYXRhIOKAlCBoYW5kbGVkIGJ5IHRoZSBlYXJseSByZXR1cm4gYWJvdmUpLFxuICAgIC8vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgZGVsaWJlcmF0ZWx5IGNsaWVudC1zYWZlIFZlbG9jaW91c0Vycm9ycyBhcmVcbiAgICAvLyBleHBlY3RlZCBhbmQgbXVzdCBOT1QgYmUgcmVwb3J0ZWQgYXMgZnJhbWV3b3JrIGVycm9ycy5cbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikgJiYgIShlcnJvciBpbnN0YW5jZW9mIFZlbG9jaW91c0Vycm9yICYmIGVycm9yLnNhZmVUb0V4cG9zZSkpIHtcbiAgICAgIGNvbnN0IGVycm9yUGF5bG9hZCA9IHtcbiAgICAgICAgY29udGV4dDoge2FjdGlvbiwgY29tbWFuZFR5cGUsIGZyb250ZW5kTW9kZWxFbmRwb2ludDogdHJ1ZSwgbW9kZWw6IHJlc29sdmVkTW9kZWwsIHJlcXVlc3RJZH0sXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMuZ2V0UmVxdWVzdCgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImZyYW1ld29yay1lcnJvclwiLCBlcnJvclBheWxvYWQpXG4gICAgICB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRFcnJvckV2ZW50cygpLmVtaXQoXCJhbGwtZXJyb3JcIiwgey4uLmVycm9yUGF5bG9hZCwgZXJyb3JUeXBlOiBcImZyYW1ld29yay1lcnJvclwifSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCByZW5kZXIgY29tbWFuZCByZXNwb25zZS5cbiAgICogQHBhcmFtIHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIn0gYWN0aW9uIC0gRnJvbnRlbmQgYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlc3BvbnNlIGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRNb2RlbFJlbmRlckNvbW1hbmRSZXNwb25zZShhY3Rpb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2VQYXlsb2FkID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsQ29tbWFuZFBheWxvYWQoYWN0aW9uKVxuICAgICAgaWYgKCFyZXNwb25zZVBheWxvYWQpIHJldHVyblxuXG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcih7XG4gICAgICAgIGpzb246IC8qKlxuICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShyZXNwb25zZVBheWxvYWQpKVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsTG9nRW5kcG9pbnRFcnJvcih7YWN0aW9uLCBjb21tYW5kVHlwZTogYWN0aW9uLCBlcnJvcn0pXG5cbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHtcbiAgICAgICAganNvbjogLyoqXG4gICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbENsaWVudEVycm9yUGF5bG9hZEZvckVycm9yKGVycm9yKSkpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGNvbW1hbmQgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIn0gYWN0aW9uIC0gRnJvbnRlbmQgYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGw+fSAtIFJlc3BvbnNlIHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsQ29tbWFuZFBheWxvYWQoYWN0aW9uKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVGcm9udGVuZE1vZGVsQ2xhc3NJbml0aWFsaXplZCgpXG5cbiAgICBpZiAoIShhd2FpdCB0aGlzLnJ1bkZyb250ZW5kTW9kZWxCZWZvcmVBY3Rpb24oYWN0aW9uKSkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKClcblxuICAgIGlmIChhY3Rpb24gPT09IFwiaW5kZXhcIikge1xuICAgICAgaWYgKHRoaXMuZnJvbnRlbmRNb2RlbENvdW50UmVxdWVzdGVkKCkpIHtcbiAgICAgICAgaWYgKCEoYXdhaXQgcmVzb3VyY2Uuc3VwcG9ydHNDb3VudChcImluZGV4XCIpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNvdW50IGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiByZXNvdXJjZSByZWNvcmRzIGFyZSBjdXN0b21pemVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvdW50OiBhd2FpdCByZXNvdXJjZS5jb3VudCgpLFxuICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCJcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwbHVjayA9IHRoaXMuZnJvbnRlbmRNb2RlbFBsdWNrKClcblxuICAgICAgaWYgKHBsdWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKCEoYXdhaXQgcmVzb3VyY2Uuc3VwcG9ydHNQbHVjayhcImluZGV4XCIpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInBsdWNrIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiByZXNvdXJjZSByZWNvcmRzIGFyZSBjdXN0b21pemVkXCIpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxQbHVja1ZhbHVlcyh7XG4gICAgICAgICAgcGx1Y2ssXG4gICAgICAgICAgcXVlcnk6IHRoaXMuZnJvbnRlbmRNb2RlbEluZGV4UXVlcnkoKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhdHVzOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICB2YWx1ZXNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxSZWNvcmRzKClcbiAgICAgIGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbENvbXB1dGVBYmlsaXRpZXMobW9kZWxzKVxuICAgICAgY29uc3Qgc2VyaWFsaXplZE1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKG1vZGVscy5tYXAoYXN5bmMgKG1vZGVsKSA9PiBhd2FpdCByZXNvdXJjZS5zZXJpYWxpemUobW9kZWwsIFwiaW5kZXhcIikpKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2RlbHM6IHNlcmlhbGl6ZWRNb2RlbHMsXG4gICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmZyb250ZW5kTW9kZWxQYXJhbXMoKVxuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLmZyb250ZW5kTW9kZWxDbGFzcygpXG4gICAgY29uc3QgaWQgPSBwYXJhbXMuaWRcblxuICAgIGlmIChhY3Rpb24gPT09IFwiY3JlYXRlXCIpIHtcbiAgICAgIGNvbnN0IG11dGF0aW9uQXR0cmlidXRlcyA9IGZyb250ZW5kTW9kZWxNdXRhdGlvbkF0dHJpYnV0ZXMocGFyYW1zKVxuICAgICAgaWYgKHR5cGVvZiBtdXRhdGlvbkF0dHJpYnV0ZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQobXV0YXRpb25BdHRyaWJ1dGVzKVxuXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbENyZWF0ZVJlY29yZChtdXRhdGlvbkF0dHJpYnV0ZXMuYXR0cmlidXRlcywgbXV0YXRpb25BdHRyaWJ1dGVzLm5lc3RlZEF0dHJpYnV0ZXMpXG5cbiAgICAgIGlmICghbW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChgJHttb2RlbENsYXNzLm5hbWV9IG5vdCBmb3VuZC5gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXJpYWxpemVkTW9kZWwgPSBhd2FpdCByZXNvdXJjZS5zZXJpYWxpemUobW9kZWwsIFwiY3JlYXRlXCIpXG5cbiAgICAgIHJldHVybiBmcm9udGVuZE1vZGVsU2VyaWFsaXplZE1vZGVsU3VjY2VzcyhzZXJpYWxpemVkTW9kZWwpXG4gICAgfVxuXG4gICAgaWYgKCh0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGlkICE9PSBcIm51bWJlclwiKSB8fCBgJHtpZH1gLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoXCJFeHBlY3RlZCBtb2RlbCBpZC5cIilcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uID09PSBcImF0dGFjaFwiKSB7XG4gICAgICBjb25zdCBhdHRhY2htZW50TmFtZSA9IHBhcmFtcy5hdHRhY2htZW50TmFtZVxuICAgICAgY29uc3QgYXR0YWNobWVudElucHV0ID0gcGFyYW1zLmF0dGFjaG1lbnRcblxuICAgICAgaWYgKHR5cGVvZiBhdHRhY2htZW50TmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBhdHRhY2htZW50TmFtZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoXCJFeHBlY3RlZCBhdHRhY2htZW50TmFtZS5cIilcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBhdHRhY2htZW50SW5wdXQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChcIkV4cGVjdGVkIGF0dGFjaG1lbnQgaW5wdXQuXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsRmluZFJlY29yZChcImF0dGFjaFwiLCBpZClcblxuICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKGAke21vZGVsQ2xhc3MubmFtZX0gbm90IGZvdW5kLmApXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG1vZGVsLmdldEF0dGFjaG1lbnRCeU5hbWUoYXR0YWNobWVudE5hbWUpLmF0dGFjaChhdHRhY2htZW50SW5wdXQpXG4gICAgICBjb25zdCBzZXJpYWxpemVkTW9kZWwgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUZyb250ZW5kTW9kZWwobW9kZWwpXG5cbiAgICAgIHJldHVybiBmcm9udGVuZE1vZGVsU2VyaWFsaXplZE1vZGVsU3VjY2VzcyhzZXJpYWxpemVkTW9kZWwpXG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gXCJkb3dubG9hZFwiKSB7XG4gICAgICBjb25zdCBhdHRhY2htZW50UGFyYW1zID0gZnJvbnRlbmRNb2RlbEF0dGFjaG1lbnRQYXJhbXMocGFyYW1zKVxuICAgICAgaWYgKHR5cGVvZiBhdHRhY2htZW50UGFyYW1zID09PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKGF0dGFjaG1lbnRQYXJhbXMpXG5cbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsRmluZFJlY29yZChcImRvd25sb2FkXCIsIGlkKVxuXG4gICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoYCR7bW9kZWxDbGFzcy5uYW1lfSBub3QgZm91bmQuYClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZG93bmxvYWRlZEF0dGFjaG1lbnQgPSBhd2FpdCBtb2RlbC5nZXRBdHRhY2htZW50QnlOYW1lKGF0dGFjaG1lbnRQYXJhbXMuYXR0YWNobWVudE5hbWUpLmRvd25sb2FkKGF0dGFjaG1lbnRQYXJhbXMuYXR0YWNobWVudElkKVxuXG4gICAgICBpZiAoIWRvd25sb2FkZWRBdHRhY2htZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoXCJBdHRhY2htZW50IG5vdCBmb3VuZC5cIilcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXR0YWNobWVudDoge1xuICAgICAgICAgIGJ5dGVTaXplOiBkb3dubG9hZGVkQXR0YWNobWVudC5ieXRlU2l6ZSgpLFxuICAgICAgICAgIGNvbnRlbnRCYXNlNjQ6IGRvd25sb2FkZWRBdHRhY2htZW50LmNvbnRlbnQoKS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgICAgICBjb250ZW50VHlwZTogZG93bmxvYWRlZEF0dGFjaG1lbnQuY29udGVudFR5cGUoKSxcbiAgICAgICAgICBmaWxlbmFtZTogZG93bmxvYWRlZEF0dGFjaG1lbnQuZmlsZW5hbWUoKSxcbiAgICAgICAgICBpZDogZG93bmxvYWRlZEF0dGFjaG1lbnQuaWQoKSxcbiAgICAgICAgICB1cmw6IGRvd25sb2FkZWRBdHRhY2htZW50LnVybCgpXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uID09PSBcInVybFwiKSB7XG4gICAgICBjb25zdCBhdHRhY2htZW50UGFyYW1zID0gZnJvbnRlbmRNb2RlbEF0dGFjaG1lbnRQYXJhbXMocGFyYW1zKVxuICAgICAgaWYgKHR5cGVvZiBhdHRhY2htZW50UGFyYW1zID09PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKGF0dGFjaG1lbnRQYXJhbXMpXG5cbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsRmluZFJlY29yZChcInVybFwiLCBpZClcblxuICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKGAke21vZGVsQ2xhc3MubmFtZX0gbm90IGZvdW5kLmApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IG1vZGVsLmdldEF0dGFjaG1lbnRCeU5hbWUoYXR0YWNobWVudFBhcmFtcy5hdHRhY2htZW50TmFtZSkudXJsKGF0dGFjaG1lbnRQYXJhbXMuYXR0YWNobWVudElkKVxuXG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKFwiQXR0YWNobWVudCBVUkwgbm90IGF2YWlsYWJsZS5cIilcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgdXJsXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gXCJmaW5kXCIpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsRmluZFJlY29yZChcImZpbmRcIiwgaWQpXG5cbiAgICAgIGlmICghbW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChgJHttb2RlbENsYXNzLm5hbWV9IG5vdCBmb3VuZC5gKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxDb21wdXRlQWJpbGl0aWVzKFttb2RlbF0pXG4gICAgICBjb25zdCBzZXJpYWxpemVkTW9kZWwgPSBhd2FpdCByZXNvdXJjZS5zZXJpYWxpemUobW9kZWwsIFwiZmluZFwiKVxuXG4gICAgICByZXR1cm4gZnJvbnRlbmRNb2RlbFNlcmlhbGl6ZWRNb2RlbFN1Y2Nlc3Moc2VyaWFsaXplZE1vZGVsKVxuICAgIH1cblxuICAgIGlmIChhY3Rpb24gPT09IFwidXBkYXRlXCIpIHtcbiAgICAgIGNvbnN0IG11dGF0aW9uQXR0cmlidXRlcyA9IGZyb250ZW5kTW9kZWxNdXRhdGlvbkF0dHJpYnV0ZXMocGFyYW1zKVxuICAgICAgaWYgKHR5cGVvZiBtdXRhdGlvbkF0dHJpYnV0ZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQobXV0YXRpb25BdHRyaWJ1dGVzKVxuXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbEZpbmRSZWNvcmQoXCJ1cGRhdGVcIiwgaWQpXG5cbiAgICAgIGlmICghbW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChgJHttb2RlbENsYXNzLm5hbWV9IG5vdCBmb3VuZC5gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB1cGRhdGVkTW9kZWwgPSBhd2FpdCByZXNvdXJjZS51cGRhdGUobW9kZWwsIG11dGF0aW9uQXR0cmlidXRlcy5hdHRyaWJ1dGVzLCB7bmVzdGVkQXR0cmlidXRlczogbXV0YXRpb25BdHRyaWJ1dGVzLm5lc3RlZEF0dHJpYnV0ZXMsIGNvbnRyb2xsZXI6IHRoaXN9KVxuICAgICAgY29uc3Qgc2VyaWFsaXplZE1vZGVsID0gYXdhaXQgcmVzb3VyY2Uuc2VyaWFsaXplKHVwZGF0ZWRNb2RlbCwgXCJ1cGRhdGVcIilcblxuICAgICAgcmV0dXJuIGZyb250ZW5kTW9kZWxTZXJpYWxpemVkTW9kZWxTdWNjZXNzKHNlcmlhbGl6ZWRNb2RlbClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbEZpbmRSZWNvcmQoXCJkZXN0cm95XCIsIGlkKVxuXG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChgJHttb2RlbENsYXNzLm5hbWV9IG5vdCBmb3VuZC5gKVxuICAgIH1cblxuICAgIGF3YWl0IHJlc291cmNlLmRlc3Ryb3kobW9kZWwpXG5cbiAgICByZXR1cm4ge3N0YXR1czogXCJzdWNjZXNzXCJ9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhcGkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFNoYXJlZCBmcm9udGVuZCBtb2RlbCBBUEkgYWN0aW9uIHdpdGggYmF0Y2ggc3VwcG9ydC5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kQXBpKCkge1xuICAgIGlmICh0aGlzLnJlcXVlc3QoKS5odHRwTWV0aG9kKCkgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcih7c3RhdHVzOiAyMDQsIGpzb246IHt9fSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtcyA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSh0aGlzLnBhcmFtcygpKSlcbiAgICBjb25zdCByZXF1ZXN0cyA9IEFycmF5LmlzQXJyYXkocGFyYW1zLnJlcXVlc3RzKSA/IHBhcmFtcy5yZXF1ZXN0cyA6IFtwYXJhbXNdXG4gICAgLyoqXG4gICAgICogUmVzcG9uc2VzLlxuICAgICAgQHR5cGUge0FycmF5PFJlY29yZDxzdHJpbmcsID8+Pn0gKi9cbiAgICBjb25zdCByZXNwb25zZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0RW50cnkgb2YgcmVxdWVzdHMpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmRUeXBlID0gcmVxdWVzdEVudHJ5Py5jb21tYW5kVHlwZVxuICAgICAgY29uc3QgY3VzdG9tUGF0aCA9IHJlcXVlc3RFbnRyeT8uY3VzdG9tUGF0aFxuICAgICAgY29uc3QgbW9kZWwgPSByZXF1ZXN0RW50cnk/Lm1vZGVsXG4gICAgICBjb25zdCBwYXlsb2FkID0gcmVxdWVzdEVudHJ5Py5wYXlsb2FkXG4gICAgICBjb25zdCByZXF1ZXN0SWQgPSByZXF1ZXN0RW50cnk/LnJlcXVlc3RJZFxuXG4gICAgICBpZiAodHlwZW9mIG1vZGVsICE9PSBcInN0cmluZ1wiIHx8IG1vZGVsLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICByZXNwb25zZTogdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKFwiRXhwZWN0ZWQgcmVxdWVzdCBtb2RlbC5cIilcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNCdWlsdEluQ29tbWFuZCA9IFtcImluZGV4XCIsIFwiZmluZFwiLCBcImNyZWF0ZVwiLCBcInVwZGF0ZVwiLCBcImRlc3Ryb3lcIiwgXCJhdHRhY2hcIiwgXCJkb3dubG9hZFwiLCBcInVybFwiXS5pbmNsdWRlcyhjb21tYW5kVHlwZSlcblxuICAgICAgaWYgKCFpc0J1aWx0SW5Db21tYW5kICYmICh0eXBlb2YgY3VzdG9tUGF0aCAhPT0gXCJzdHJpbmdcIiB8fCAhY3VzdG9tUGF0aC5zdGFydHNXaXRoKFwiL1wiKSkpIHtcbiAgICAgICAgcmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICByZXNwb25zZTogdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKFwiRXhwZWN0ZWQgcmVxdWVzdCBjdXN0b21QYXRoLlwiKVxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgcmVzcG9uc2VQYXlsb2FkXG5cbiAgICAgICAgaWYgKGlzQnVpbHRJbkNvbW1hbmQpIHtcbiAgICAgICAgICBjb25zdCBjb21tYW5kUGFyYW1zID0ge1xuICAgICAgICAgICAgLi4uKHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQgPT09IFwib2JqZWN0XCIgPyBwYXlsb2FkIDoge30pLFxuICAgICAgICAgICAgbW9kZWxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNwb25zZVBheWxvYWQgPSBhd2FpdCB0aGlzLndpdGhGcm9udGVuZE1vZGVsUGFyYW1zKGNvbW1hbmRQYXJhbXMsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhGcm9udGVuZE1vZGVsUmVxdWVzdENvbnRleHQoY29tbWFuZFBhcmFtcywgdGhpcy5yZXNwb25zZSgpLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxDb21tYW5kUGF5bG9hZChjb21tYW5kVHlwZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25zZVBheWxvYWQgPSBhd2FpdCB0aGlzLmZyb250ZW5kQXBpQ3VzdG9tQ29tbWFuZFBheWxvYWQoe1xuICAgICAgICAgICAgY3VzdG9tUGF0aCxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2VQYXlsb2FkIHx8IHRoaXMuZnJvbnRlbmRNb2RlbEVycm9yUGF5bG9hZChcIkFjdGlvbiBoYWx0ZWQgYnkgYmVmb3JlQWN0aW9uLlwiKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsTG9nRW5kcG9pbnRFcnJvcih7XG4gICAgICAgICAgYWN0aW9uOiBcImZyb250ZW5kQXBpXCIsXG4gICAgICAgICAgY29tbWFuZFR5cGUsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgcmVxdWVzdElkXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICByZXNwb25zZTogYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsQ2xpZW50RXJyb3JQYXlsb2FkRm9yRXJyb3IoZXJyb3IpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZW5kZXIoe1xuICAgICAganNvbjogLyoqXG4gICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoe1xuICAgICAgICByZXNwb25zZXMsXG4gICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCJcbiAgICAgIH0pKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhIGN1c3RvbSBmcm9udGVuZC1tb2RlbCBjb21tYW5kIHRocm91Z2ggdGhlIHNoYXJlZCBmcm9udGVuZC1tb2RlbCBBUEkgZW5kcG9pbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jdXN0b21QYXRoIC0gQ3VzdG9tIGJhY2tlbmQgcm91dGUgcGF0aC5cbiAgICogQHBhcmFtIHs/fSBhcmdzLnBheWxvYWQgLSBSZXF1ZXN0IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gLSBQYXJzZWQgSlNPTiByZXNwb25zZSBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRBcGlDdXN0b21Db21tYW5kUGF5bG9hZCh7Y3VzdG9tUGF0aCwgcGF5bG9hZH0pIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcbiAgICBjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZSh7Y29uZmlndXJhdGlvbn0pXG4gICAgY29uc3QgcmVzb2x2ZXIgPSBuZXcgUm91dGVzUmVzb2x2ZXIoe1xuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIHJlcXVlc3Q6IHRoaXMuZ2V0UmVxdWVzdCgpLFxuICAgICAgcmVzcG9uc2VcbiAgICB9KVxuICAgIHJlc29sdmVyLnBhcmFtcyA9IHt9XG4gICAgY29uc3Qgcm91dGVIb29rTWF0Y2ggPSBhd2FpdCByZXNvbHZlci5yZXNvbHZlUm91dGVSZXNvbHZlckhvb2tzKGN1c3RvbVBhdGgpXG4gICAgY29uc3QgY29uZmlndXJhdGlvblJvdXRlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Um91dGVzKClcbiAgICBjb25zdCByb3V0ZU1hdGNoID0gcm91dGVIb29rTWF0Y2ggfHwgIWNvbmZpZ3VyYXRpb25Sb3V0ZXM/LnJvb3RSb3V0ZSA/IHVuZGVmaW5lZCA6IHJlc29sdmVyLm1hdGNoUGF0aFdpdGhSb3V0ZXMoY29uZmlndXJhdGlvblJvdXRlcy5yb290Um91dGUsIGN1c3RvbVBhdGgpXG5cbiAgICBpZiAoIXJvdXRlSG9va01hdGNoICYmICFyb3V0ZU1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGN1c3RvbSBmcm9udGVuZCBtb2RlbCByb3V0ZSBtYXRjaGVkICcke2N1c3RvbVBhdGh9J2ApXG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uUGFyYW0gPSByb3V0ZUhvb2tNYXRjaD8uYWN0aW9uIHx8IHJlc29sdmVyLnBhcmFtcy5hY3Rpb25cbiAgICBjb25zdCBjb250cm9sbGVyUGFyYW0gPSByb3V0ZUhvb2tNYXRjaD8uY29udHJvbGxlciB8fCByZXNvbHZlci5wYXJhbXMuY29udHJvbGxlclxuICAgIGNvbnN0IGFjdGlvblZhbHVlID0gdHlwZW9mIGFjdGlvblBhcmFtID09PSBcInN0cmluZ1wiID8gYWN0aW9uUGFyYW0gOiAoQXJyYXkuaXNBcnJheShhY3Rpb25QYXJhbSkgPyBhY3Rpb25QYXJhbVswXSA6IHVuZGVmaW5lZClcbiAgICBjb25zdCBjb250cm9sbGVyVmFsdWUgPSB0eXBlb2YgY29udHJvbGxlclBhcmFtID09PSBcInN0cmluZ1wiID8gY29udHJvbGxlclBhcmFtIDogKEFycmF5LmlzQXJyYXkoY29udHJvbGxlclBhcmFtKSA/IGNvbnRyb2xsZXJQYXJhbVswXSA6IHVuZGVmaW5lZClcblxuICAgIGlmICh0eXBlb2YgYWN0aW9uVmFsdWUgIT09IFwic3RyaW5nXCIgfHwgYWN0aW9uVmFsdWUubGVuZ3RoIDwgMSB8fCB0eXBlb2YgY29udHJvbGxlclZhbHVlICE9PSBcInN0cmluZ1wiIHx8IGNvbnRyb2xsZXJWYWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEN1c3RvbSBmcm9udGVuZCBtb2RlbCByb3V0ZSBtYXRjaGVkICcke2N1c3RvbVBhdGh9JyB3aXRob3V0IGNvbnRyb2xsZXIvYWN0aW9uIHBhcmFtc2ApXG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhY3Rpb25WYWx1ZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikucmVwbGFjZUFsbChcIi9cIiwgXCJfXCIpLCB0cnVlKVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBjb250cm9sbGVyVmFsdWVcbiAgICBjb25zdCBjb250cm9sbGVyUGF0aCA9IHJvdXRlSG9va01hdGNoPy5jb250cm9sbGVyUGF0aCB8fCBgJHtjb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn0vY29udHJvbGxlci5qc2BcbiAgICBjb25zdCB2aWV3UGF0aCA9IHJvdXRlSG9va01hdGNoPy52aWV3UGF0aCB8fCBgJHtjb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn1gXG4gICAgcmVzb2x2ZXIucm91dGVIb29rQ29udHJvbGxlckNsYXNzID0gcm91dGVIb29rTWF0Y2g/LmNvbnRyb2xsZXJDbGFzc1xuICAgIGNvbnN0IGNvbnRyb2xsZXJDbGFzcyA9IGF3YWl0IHJlc29sdmVyLnJlc29sdmVDb250cm9sbGVyQ2xhc3Moe2NvbnRyb2xsZXJQYXRofSlcbiAgICBjb25zdCBjb250cm9sbGVyUGFyYW1zID0ge1xuICAgICAgLi4uKChwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkID09PSBcIm9iamVjdFwiKSA/IHBheWxvYWQgOiB7fSksXG4gICAgICAuLi5yZXNvbHZlci5wYXJhbXNcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlckluc3RhbmNlID0gbmV3IGNvbnRyb2xsZXJDbGFzcyh7XG4gICAgICBhY3Rpb24sXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHBhcmFtczogY29udHJvbGxlclBhcmFtcyxcbiAgICAgIHJlcXVlc3Q6IC8qKlxuICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgQHR5cGUge2ltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdH0gKi8gKHRoaXMuZ2V0UmVxdWVzdCgpKSxcbiAgICAgIHJlc3BvbnNlLFxuICAgICAgdmlld1BhdGhcbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy53aXRoRnJvbnRlbmRNb2RlbFJlcXVlc3RDb250ZXh0KGNvbnRyb2xsZXJQYXJhbXMsIHJlc3BvbnNlLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBjb250cm9sbGVySW5zdGFuY2UuX3J1bkJlZm9yZUNhbGxiYWNrcygpXG4gICAgICBjb25zdCBjb250cm9sbGVyTWV0aG9kcyA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZD59ICovICgvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7P30gKi8gKGNvbnRyb2xsZXJJbnN0YW5jZSkpXG5cbiAgICAgIGF3YWl0IGNvbnRyb2xsZXJNZXRob2RzW2FjdGlvbl0oKVxuICAgIH0pXG5cbiAgICBjb25zdCBzZXRDb29raWVIZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVyc1tcIlNldC1Db29raWVcIl0gfHwgW11cblxuICAgIGZvciAoY29uc3Qgc2V0Q29va2llSGVhZGVyIG9mIHNldENvb2tpZUhlYWRlcnMpIHtcbiAgICAgIHRoaXMucmVzcG9uc2UoKS5hZGRIZWFkZXIoXCJTZXQtQ29va2llXCIsIHNldENvb2tpZUhlYWRlcilcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZUJvZHkgPSByZXNwb25zZS5nZXRCb2R5KClcblxuICAgIGlmICh0eXBlb2YgcmVzcG9uc2VCb2R5ICE9PSBcInN0cmluZ1wiIHx8IHJlc3BvbnNlQm9keS5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICAvLyBQcmVzZXJ2ZSBuZXN0ZWQgdHJhbnNwb3J0IG1hcmtlcnMgc28gdGhlIG91dGVyIHNoYXJlZCBmcm9udGVuZC1tb2RlbCBBUElcbiAgICAvLyBjYW4gcmV0dXJuIHRoZW0gdW5jaGFuZ2VkIGFuZCBsZXQgdGhlIGNsaWVudCBoeWRyYXRlIG9uY2UgYXQgdGhlIGVkZ2UuXG4gICAgcmV0dXJuIC8qKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKEpTT04ucGFyc2UocmVzcG9uc2VCb2R5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGluZGV4LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBDb2xsZWN0aW9uIGFjdGlvbiBmb3IgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRJbmRleCgpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0KCkuaHR0cE1ldGhvZCgpID09PSBcIk9QVElPTlNcIikge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoe3N0YXR1czogMjA0LCBqc29uOiB7fX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxSZW5kZXJDb21tYW5kUmVzcG9uc2UoXCJpbmRleFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgZmluZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gTWVtYmVyIGZpbmQgYWN0aW9uIGZvciBmcm9udGVuZCBtb2RlbCByZXNvdXJjZXMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZEZpbmQoKSB7XG4gICAgaWYgKHRoaXMucmVxdWVzdCgpLmh0dHBNZXRob2QoKSA9PT0gXCJPUFRJT05TXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHtzdGF0dXM6IDIwNCwganNvbjoge319KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsUmVuZGVyQ29tbWFuZFJlc3BvbnNlKFwiZmluZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgdXBkYXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBNZW1iZXIgdXBkYXRlIGFjdGlvbiBmb3IgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRVcGRhdGUoKSB7XG4gICAgaWYgKHRoaXMucmVxdWVzdCgpLmh0dHBNZXRob2QoKSA9PT0gXCJPUFRJT05TXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHtzdGF0dXM6IDIwNCwganNvbjoge319KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsUmVuZGVyQ29tbWFuZFJlc3BvbnNlKFwidXBkYXRlXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBhdHRhY2guXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIE1lbWJlciBhdHRhY2ggYWN0aW9uIGZvciBmcm9udGVuZCBtb2RlbCByZXNvdXJjZXMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZEF0dGFjaCgpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0KCkuaHR0cE1ldGhvZCgpID09PSBcIk9QVElPTlNcIikge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoe3N0YXR1czogMjA0LCBqc29uOiB7fX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxSZW5kZXJDb21tYW5kUmVzcG9uc2UoXCJhdHRhY2hcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGRvd25sb2FkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBNZW1iZXIgZG93bmxvYWQgYWN0aW9uIGZvciBmcm9udGVuZCBtb2RlbCByZXNvdXJjZXMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZERvd25sb2FkKCkge1xuICAgIGlmICh0aGlzLnJlcXVlc3QoKS5odHRwTWV0aG9kKCkgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcih7c3RhdHVzOiAyMDQsIGpzb246IHt9fSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbFJlbmRlckNvbW1hbmRSZXNwb25zZShcImRvd25sb2FkXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCB1cmwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIE1lbWJlciBVUkwgYWN0aW9uIGZvciBmcm9udGVuZCBtb2RlbCByZXNvdXJjZXMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZFVybCgpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0KCkuaHR0cE1ldGhvZCgpID09PSBcIk9QVElPTlNcIikge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoe3N0YXR1czogMjA0LCBqc29uOiB7fX0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxSZW5kZXJDb21tYW5kUmVzcG9uc2UoXCJ1cmxcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIGNyZWF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gTWVtYmVyIGNyZWF0ZSBhY3Rpb24gZm9yIGZyb250ZW5kIG1vZGVsIHJlc291cmNlcy5cbiAgICovXG4gIGFzeW5jIGZyb250ZW5kQ3JlYXRlKCkge1xuICAgIGlmICh0aGlzLnJlcXVlc3QoKS5odHRwTWV0aG9kKCkgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcih7c3RhdHVzOiAyMDQsIGpzb246IHt9fSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZnJvbnRlbmRNb2RlbFJlbmRlckNvbW1hbmRSZXNwb25zZShcImNyZWF0ZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgZGVzdHJveS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gTWVtYmVyIGRlc3Ryb3kgYWN0aW9uIGZvciBmcm9udGVuZCBtb2RlbCByZXNvdXJjZXMuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZERlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucmVxdWVzdCgpLmh0dHBNZXRob2QoKSA9PT0gXCJPUFRJT05TXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHtzdGF0dXM6IDIwNCwganNvbjoge319KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsUmVuZGVyQ29tbWFuZFJlc3BvbnNlKFwiZGVzdHJveVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgY3VzdG9tIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIEN1c3RvbSBjb2xsZWN0aW9uL21lbWJlciBjb21tYW5kIGFjdGlvbiBmb3IgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzLlxuICAgKi9cbiAgYXN5bmMgZnJvbnRlbmRDdXN0b21Db21tYW5kKCkge1xuICAgIGlmICh0aGlzLnJlcXVlc3QoKS5odHRwTWV0aG9kKCkgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlcih7c3RhdHVzOiAyMDQsIGpzb246IHt9fSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZVBheWxvYWQgPSBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kUGF5bG9hZCgpXG5cbiAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHtcbiAgICAgICAganNvbjogLyoqXG4gICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHJlc3BvbnNlUGF5bG9hZCkpXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmZyb250ZW5kTW9kZWxMb2dFbmRwb2ludEVycm9yKHthY3Rpb246IFwiZnJvbnRlbmRDdXN0b21Db21tYW5kXCIsIGNvbW1hbmRUeXBlOiBcImN1c3RvbS1jb21tYW5kXCIsIGVycm9yfSlcblxuICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoe1xuICAgICAgICBqc29uOiAvKipcbiAgICAgICAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoYXdhaXQgdGhpcy5mcm9udGVuZE1vZGVsQ2xpZW50RXJyb3JQYXlsb2FkRm9yRXJyb3IoZXJyb3IpKSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY3VzdG9tIGNvbW1hbmQgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSAtIFJlc3BvbnNlIHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZFBheWxvYWQoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5mcm9udGVuZE1vZGVsUGFyYW1zKClcbiAgICBjb25zdCBtZXRob2ROYW1lID0gcGFyYW1zLmZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kTWV0aG9kTmFtZVxuICAgIGNvbnN0IHNjb3BlID0gcGFyYW1zLmZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kU2NvcGVcblxuICAgIGlmICh0eXBlb2YgbWV0aG9kTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBtZXRob2ROYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLmZyb250ZW5kTW9kZWxFcnJvclBheWxvYWQoXCJFeHBlY3RlZCBmcm9udGVuZC1tb2RlbCBjdXN0b20gY29tbWFuZCBtZXRob2QgbmFtZS5cIilcbiAgICB9XG5cbiAgICBpZiAoc2NvcGUgIT09IFwiY29sbGVjdGlvblwiICYmIHNjb3BlICE9PSBcIm1lbWJlclwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKFwiRXhwZWN0ZWQgZnJvbnRlbmQtbW9kZWwgY3VzdG9tIGNvbW1hbmQgc2NvcGUuXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi8gKHRoaXMuZnJvbnRlbmRNb2RlbFJlc291cmNlSW5zdGFuY2UoKSlcbiAgICBjb25zdCBjb21tYW5kTWV0aG9kID0gcmVzb3VyY2VbbWV0aG9kTmFtZV1cblxuICAgIGlmICh0eXBlb2YgY29tbWFuZE1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9udGVuZE1vZGVsRXJyb3JQYXlsb2FkKGBNaXNzaW5nIGZyb250ZW5kLW1vZGVsIGN1c3RvbSBjb21tYW5kICcke21ldGhvZE5hbWV9Jy5gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlUGF5bG9hZCA9IGF3YWl0IGNvbW1hbmRNZXRob2QuY2FsbChyZXNvdXJjZSlcblxuICAgIGlmICghcmVzcG9uc2VQYXlsb2FkIHx8IHR5cGVvZiByZXNwb25zZVBheWxvYWQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB7c3RhdHVzOiBcInN1Y2Nlc3NcIn1cbiAgICB9XG5cbiAgICByZXR1cm4gLyoqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS4gQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoXG4gICAgICBhd2FpdCB0aGlzLmF1dG9TZXJpYWxpemVGcm9udGVuZE1vZGVsc0luUGF5bG9hZChcbiAgICAgICAgcmVzcG9uc2VQYXlsb2FkLFxuICAgICAgICAvKipcbiAgICAgICAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICAgICAgICBAdHlwZSB7e3NlcmlhbGl6ZTogKG1vZGVsOiA/LCBhY3Rpb246IHN0cmluZykgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59fSAqLyAocmVzb3VyY2UpLFxuICAgICAgICBtZXRob2ROYW1lXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFdhbGtzIGEgY3VzdG9tLWNvbW1hbmQgcmVzcG9uc2UgcGF5bG9hZCBhbmQgcmVwbGFjZXMgYW55IGJhY2tlbmQgYFJlY29yZGBcbiAgICogaW5zdGFuY2Ugd2l0aCB0aGUgcmVzb3VyY2UncyBwZXItYWN0aW9uIHNlcmlhbGl6ZWQgZm9ybSBzbyBoYW5kbGVycyBjYW5cbiAgICogcmV0dXJuIGB7cmVjb3JkLCBzdGF0dXM6IFwib2tcIn1gIGluc3RlYWQgb2YgZXhwbGljaXRseSBjYWxsaW5nXG4gICAqIGBhd2FpdCB0aGlzLnNlcmlhbGl6ZShyZWNvcmQsIGFjdGlvbilgLiBQbGFpbiBvYmplY3RzLCBhcnJheXMsIGFuZFxuICAgKiBwcmltaXRpdmUgdmFsdWVzIHBhc3MgdGhyb3VnaCBhbmQgYXJlIGxhdGVyIGVuY29kZWQgYnlcbiAgICogYHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZWAuXG4gICAqIEBwYXJhbSB7P30gdmFsdWUgLSBQYXlsb2FkIHZhbHVlLlxuICAgKiBAcGFyYW0ge3tzZXJpYWxpemU6IChtb2RlbDogPywgYWN0aW9uOiBzdHJpbmcpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fX0gcmVzb3VyY2UgLSBSZXNvdXJjZSBpbnN0YW5jZSBwcm92aWRpbmcgYHNlcmlhbGl6ZWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gLSBDdXN0b20gY29tbWFuZCBtZXRob2QgbmFtZSBwYXNzZWQgdG8gYHJlc291cmNlLnNlcmlhbGl6ZWAgZm9yIHBlci1hY3Rpb24gYXV0aG9yaXphdGlvbiBmaWx0ZXJpbmcuXG4gICAqIEBwYXJhbSB7V2Vha1NldDxvYmplY3Q+fSBbc2Vlbl0gLSBSZWN1cnNpb24gc3RhY2sgb2YgcGxhaW4tb2JqZWN0IGNvbnRhaW5lcnMgY3VycmVudGx5IGJlaW5nIHdhbGtlZC4gTWVtYmVyc2hpcCBpcyBhZGRlZCBvbiBlbnRyeSBhbmQgcmVtb3ZlZCBvbiBleGl0IHNvIGEgY29udGFpbmVyIHNoYXJlZCBiZXR3ZWVuIHNpYmxpbmdzIChpLmUuIHJlZmVyZW5jZWQgdHdpY2UgYnV0IG5vdCBjeWNsaWNhbGx5KSBpcyB3YWxrZWQgb24gZWFjaCByZWZlcmVuY2UgaW5zdGVhZCBvZiBiZWluZyBzaG9ydC1jaXJjdWl0ZWQgdGhlIHNlY29uZCB0aW1lLCB3aGljaCB3b3VsZCBsZXQgYmFja2VuZCBgUmVjb3JkYCBpbnN0YW5jZXMgaW5zaWRlIGl0IGJ5cGFzcyBgcmVzb3VyY2Uuc2VyaWFsaXplYC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gUGF5bG9hZCB3aXRoIGJhY2tlbmQgYFJlY29yZGAgaW5zdGFuY2VzIHJlcGxhY2VkIGJ5IHNlcmlhbGl6ZWQgbWFya2Vycy5cbiAgICovXG4gIGFzeW5jIGF1dG9TZXJpYWxpemVGcm9udGVuZE1vZGVsc0luUGF5bG9hZCh2YWx1ZSwgcmVzb3VyY2UsIGFjdGlvbiwgc2VlbiA9IG5ldyBXZWFrU2V0KCkpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKGlzQmFja2VuZE1vZGVsSW5zdGFuY2UodmFsdWUpKSB7XG4gICAgICBjb25zdCByaWNoU2VyaWFsaXplZCA9IGF3YWl0IHJlc291cmNlLnNlcmlhbGl6ZSh2YWx1ZSwgYWN0aW9uKVxuICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7e2NvbnN0cnVjdG9yOiB7Z2V0TW9kZWxOYW1lPzogKCkgPT4gc3RyaW5nLCBuYW1lPzogc3RyaW5nfX19ICovICh2YWx1ZSkuY29uc3RydWN0b3JcbiAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IHR5cGVvZiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKSA6IChtb2RlbENsYXNzLm5hbWUgfHwgXCJcIilcblxuICAgICAgLy8gV3JhcCB0aGUgcmVzb3VyY2Utc2VyaWFsaXplZCBwYXlsb2FkIGluIHRoZSBmcm9udGVuZF9tb2RlbCB0cmFuc3BvcnRcbiAgICAgIC8vIG1hcmtlci4gTWFya2VyLWJhc2VkIGRlY29kaW5nIHJvdXRlcyB0aHJvdWdoIGBpbnN0YW50aWF0ZUZyb21SZXNwb25zZWAsXG4gICAgICAvLyBzbyBhYmlsaXRpZXMgLyBxdWVyeURhdGEgLyBhc3NvY2lhdGlvbkNvdW50cyAvIHByZWxvYWRlZFJlbGF0aW9uc2hpcHNcbiAgICAgIC8vIGJha2VkIGludG8gdGhlIHJpY2ggYXR0cmlidXRlcyBieSBgcmVzb3VyY2Uuc2VyaWFsaXplYCBhcmUgcmVzdG9yZWQgb25cbiAgICAgIC8vIHRoZSBjbGllbnQgd2l0aG91dCBjYWxsZXJzIG5lZWRpbmcgdG8gd3JhcCBtb2RlbHMgbWFudWFsbHkuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3ZlbG9jaW91c190eXBlOiBcImZyb250ZW5kX21vZGVsXCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHJpY2hTZXJpYWxpemVkLFxuICAgICAgICBtb2RlbE5hbWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8qKlxuICAgICAgICogUmVzdWx0LlxuICAgICAgICBAdHlwZSB7QXJyYXk8Pz59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGF3YWl0IHRoaXMuYXV0b1NlcmlhbGl6ZUZyb250ZW5kTW9kZWxzSW5QYXlsb2FkKGVudHJ5LCByZXNvdXJjZSwgYWN0aW9uLCBzZWVuKSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh2YWx1ZSlcblxuICAgICAgaWYgKHNlZW4uaGFzKGNvbnRhaW5lcikpIHtcbiAgICAgICAgLy8gQ3ljbGljIGJhY2stcmVmZXJlbmNlIGFsb25nIHRoZSBjdXJyZW50IHJlY3Vyc2lvbiBwYXRoOyB0aGVcbiAgICAgICAgLy8gYW5jZXN0b3IgZnJhbWUgaXMgc3RpbGwgd2Fsa2luZyB0aGlzIGNvbnRhaW5lciBhbmQgd2lsbCBwcm9kdWNlXG4gICAgICAgIC8vIGl0cyBzZXJpYWxpemVkIGZvcm0uIFJldHVybmluZyB0aGUgb3JpZ2luYWwgY29udGFpbmVyIGhlcmVcbiAgICAgICAgLy8gYnJlYWtzIHRoZSBjeWNsZSB3aXRob3V0IGJ5cGFzc2luZyB0aGUgd2Fsa2VyIGZvciBzaWJsaW5ncyB0aGF0XG4gICAgICAgIC8vIHNoYXJlIGEgbm9uLWN5Y2xpYyByZWZlcmVuY2UgKHRob3NlIHJlLWVudGVyIHRoZSBicmFuY2ggYmVsb3dcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29udGFpbmVyIGlzIHJlbW92ZWQgZnJvbSBgc2VlbmAgb24gc3RhY2sgZXhpdCkuXG4gICAgICAgIHJldHVybiBjb250YWluZXJcbiAgICAgIH1cblxuICAgICAgc2Vlbi5hZGQoY29udGFpbmVyKVxuXG4gICAgICB0cnkge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVzdWx0LlxuICAgICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIG5lc3RlZF0gb2YgT2JqZWN0LmVudHJpZXMoY29udGFpbmVyKSkge1xuICAgICAgICAgIC8vIGBhc3NpZ25TYWZlUHJvcGVydHlgIHN0b3JlcyBrZXlzIGxpa2UgYF9fcHJvdG9fX2AgYXMgb3duXG4gICAgICAgICAgLy8gZGF0YSBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgaW52b2tpbmcgdGhlIHByb3RvdHlwZSBzZXR0ZXIsXG4gICAgICAgICAgLy8gc28gYSBjdXN0b20tY29tbWFuZCByZXNwb25zZSB0aGF0IGVjaG9lcyBwYXJzZWQgY2xpZW50XG4gICAgICAgICAgLy8gaW5wdXQgY2Fubm90IHBvbGx1dGUgYE9iamVjdC5wcm90b3R5cGVgIGhlcmUuIFRoZSB0cmFuc3BvcnRcbiAgICAgICAgICAvLyBzZXJpYWxpemVyIGFwcGxpZXMgdGhlIHNhbWUgcHJvdGVjdGlvbiBvbiBpdHMgb3duIHBhc3M7IHdlXG4gICAgICAgICAgLy8ganVzdCBwcmVzZXJ2ZSBpdCBhY3Jvc3MgdGhlIGF1dG8tc2VyaWFsaXplIHdhbGsuXG4gICAgICAgICAgYXNzaWduU2FmZVByb3BlcnR5KHJlc3VsdCwga2V5LCBhd2FpdCB0aGlzLmF1dG9TZXJpYWxpemVGcm9udGVuZE1vZGVsc0luUGF5bG9hZChuZXN0ZWQsIHJlc291cmNlLCBhY3Rpb24sIHNlZW4pKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vlbi5kZWxldGUoY29udGFpbmVyKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbn1cbiJdfQ==