@decaf-ts/utils 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/utils.cjs CHANGED
@@ -3368,7 +3368,7 @@
3368
3368
  }
3369
3369
  }
3370
3370
 
3371
- const VERSION_STRING = "0.2.0";
3371
+ const VERSION_STRING = "0.2.1";
3372
3372
  var Modes;
3373
3373
  (function (Modes) {
3374
3374
  Modes["CJS"] = "commonjs";
@@ -3468,6 +3468,9 @@
3468
3468
  async buildCommands() {
3469
3469
  for (const cmd of Commands) {
3470
3470
  await this.bundle(Modes.CJS, true, true, `src/bin/${cmd}.ts`, cmd);
3471
+ let data = readFile(`bin/${cmd}.cjs`);
3472
+ data = "#!/usr/bin/env node\n" + data;
3473
+ writeFile(`bin/${cmd}.cjs`, data);
3471
3474
  }
3472
3475
  }
3473
3476
  async bundle(mode, isDev, isLib, entryFile = "src/index.ts", nameOverride = this.pkgName, externals, include = ["prompts", "styled-string-builder"]) {
@@ -4406,12 +4409,12 @@
4406
4409
  * @description Represents the current version of the module.
4407
4410
  * @summary This constant stores the version number of the @asdasdasd/utils module.
4408
4411
  * The actual version number is replaced during the build process,
4409
- * with the placeholder "0.2.0" being substituted with the current version.
4412
+ * with the placeholder "0.2.1" being substituted with the current version.
4410
4413
  *
4411
4414
  * @const VERSION
4412
4415
  * @memberOf module:@decaf-ts/utils
4413
4416
  */
4414
- const VERSION = "0.2.0";
4417
+ const VERSION = "0.2.1";
4415
4418
 
4416
4419
  exports.AbortCode = AbortCode;
4417
4420
  exports.BuildScripts = BuildScripts;
@@ -4468,4 +4471,4 @@
4468
4471
  exports.writeFile = writeFile;
4469
4472
 
4470
4473
  }));
4471
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL291dHB1dC9sb2dnaW5nLnRzIiwiLi4vc3JjL2lucHV0L2lucHV0LnRzIiwiLi4vc3JjL2NsaS9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvdGV4dC50cyIsIi4uL3NyYy93cml0ZXJzL1N0YW5kYXJkT3V0cHV0V3JpdGVyLnRzIiwiLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwiLi4vc3JjL3V0aWxzL2ZzLnRzIiwiLi4vc3JjL291dHB1dC9jb21tb24udHMiLCIuLi9zcmMvdXRpbHMvYWNjdW11bGF0b3IudHMiLCIuLi9zcmMvdXRpbHMvd2ViLnRzIiwiLi4vc3JjL3V0aWxzL2Vudmlyb25tZW50LnRzIiwiLi4vc3JjL2NsaS9jb21tYW5kLnRzIiwiLi4vc3JjL3V0aWxzL2h0dHAudHMiLCIuLi9zcmMvY2xpL2NvbW1hbmRzL2J1aWxkLXNjcmlwdHMudHMiLCIuLi9zcmMvY2xpL2NvbW1hbmRzL3RhZy1yZWxlYXNlLnRzIiwiLi4vc3JjL2NsaS9jb21tYW5kcy91cGRhdGUtc2NyaXB0cy50cyIsIi4uL3NyYy93cml0ZXJzL1JlZ2V4cE91dHB1dFdyaXRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnaW5nQ29uZmlnLCBUaGVtZSB9IGZyb20gXCIuLi9vdXRwdXQvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBlbmNvZGluZyBmb3IgdGV4dCBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgVGhlIHN0YW5kYXJkIFVURi04IGVuY29kaW5nIHVzZWQgZm9yIHRleHQgcHJvY2Vzc2luZy5cbiAqIEBjb25zdCB7c3RyaW5nfSBFbmNvZGluZ1xuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgRW5jb2RpbmcgPSBcInV0Zi04XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc2VtYW50aWMgdmVyc2lvbmluZy5cbiAqIEBzdW1tYXJ5IEEgcmVnZXggcGF0dGVybiB0byBtYXRjaCBhbmQgcGFyc2Ugc2VtYW50aWMgdmVyc2lvbiBzdHJpbmdzLlxuICogQGNvbnN0IHtSZWdFeHB9IFNlbVZlcnNpb25SZWdleFxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgU2VtVmVyc2lvblJlZ2V4ID1cbiAgL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKykoPzotKFswLTlBLVphLXotXSsoPzpcXC5bMC05QS1aYS16XSkpKS9nO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciBzZW1hbnRpYyB2ZXJzaW9uIGNvbXBvbmVudHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSB0aHJlZSBsZXZlbHMgb2Ygc2VtYW50aWMgdmVyc2lvbmluZzogUEFUQ0gsIE1JTk9SLCBhbmQgTUFKT1IuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgZW51bSBTZW1WZXJzaW9uIHtcbiAgLyoqIFBhdGNoIHZlcnNpb24gZm9yIGJhY2t3YXJkcy1jb21wYXRpYmxlIGJ1ZyBmaXhlcy4gKi9cbiAgUEFUQ0ggPSBcInBhdGNoXCIsXG4gIC8qKiBNaW5vciB2ZXJzaW9uIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSBuZXcgZmVhdHVyZXMuICovXG4gIE1JTk9SID0gXCJtaW5vclwiLFxuICAvKiogTWFqb3IgdmVyc2lvbiBmb3IgY2hhbmdlcyB0aGF0IGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqL1xuICBNQUpPUiA9IFwibWFqb3JcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmxhZyB0byBpbmRpY2F0ZSBub24tQ0kgZW52aXJvbm1lbnQuXG4gKiBAc3VtbWFyeSBVc2VkIHRvIHNwZWNpZnkgdGhhdCBhIGNvbW1hbmQgc2hvdWxkIHJ1biBvdXRzaWRlIG9mIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBlbnZpcm9ubWVudC5cbiAqIEBjb25zdCB7c3RyaW5nfSBOb0NJRkxhZ1xuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgTm9DSUZMYWcgPSBcIi1uby1jaVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHRoZSBzZXR1cCBzY3JpcHQgaW4gcGFja2FnZS5qc29uLlxuICogQHN1bW1hcnkgSWRlbnRpZmllcyB0aGUgc2NyaXB0IHRoYXQgcnVucyBhZnRlciBwYWNrYWdlIGluc3RhbGxhdGlvbi5cbiAqIEBjb25zdCB7c3RyaW5nfSBTZXR1cFNjcmlwdEtleVxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgU2V0dXBTY3JpcHRLZXkgPSBcInBvc3RpbnN0YWxsXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gZm9yIHZhcmlvdXMgYXV0aGVudGljYXRpb24gdG9rZW5zLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZmlsZSBuYW1lcyBmb3Igc3RvcmluZyBkaWZmZXJlbnQgdHlwZXMgb2YgYXV0aGVudGljYXRpb24gdG9rZW5zLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGVudW0gVG9rZW5zIHtcbiAgLyoqIEdpdCBhdXRoZW50aWNhdGlvbiB0b2tlbiBmaWxlIG5hbWUuICovXG4gIEdJVCA9IFwiLnRva2VuXCIsXG4gIC8qKiBOUE0gYXV0aGVudGljYXRpb24gdG9rZW4gZmlsZSBuYW1lLiAqL1xuICBOUE0gPSBcIi5ucG10b2tlblwiLFxuICAvKiogRG9ja2VyIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgRE9DS0VSID0gXCIuZG9ja2VydG9rZW5cIixcbiAgLyoqIENvbmZsdWVuY2UgYXV0aGVudGljYXRpb24gdG9rZW4gZmlsZSBuYW1lLiAqL1xuICBDT05GTFVFTkNFID0gXCIuY29uZmx1ZW5jZS10b2tlblwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciBsb2cgbGV2ZWxzLlxuICogQHN1bW1hcnkgRGVmaW5lcyBkaWZmZXJlbnQgbGV2ZWxzIG9mIGxvZ2dpbmcgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgLyoqIEVycm9yIGV2ZW50cyB0aGF0IGFyZSBsaWtlbHkgdG8gY2F1c2UgcHJvYmxlbXMuICovXG4gIGVycm9yID0gXCJlcnJvclwiLFxuICAvKiogUm91dGluZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBvbmdvaW5nIHN0YXR1cyBvciBwZXJmb3JtYW5jZS4gKi9cbiAgaW5mbyA9IFwiaW5mb1wiLFxuICAvKiogQWRkaXRpb25hbCByZWxldmFudCBpbmZvcm1hdGlvbi4gKi9cbiAgdmVyYm9zZSA9IFwidmVyYm9zZVwiLFxuICAvKiogRGVidWcgb3IgdHJhY2UgaW5mb3JtYXRpb24uICovXG4gIGRlYnVnID0gXCJkZWJ1Z1wiLFxuICAvKiogd2F5IHRvbyB2ZXJib3NlIG9yIHNpbGx5IGluZm9ybWF0aW9uLiAqL1xuICBzaWxseSA9IFwic2lsbHlcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTnVtZXJpYyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgbG9nIGxldmVscyBmb3IgY29tcGFyaXNvbiBhbmQgZmlsdGVyaW5nLlxuICogQGNvbnN0IHtPYmplY3R9IE51bWVyaWNMb2dMZXZlbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlcnJvciAtIE51bWVyaWMgdmFsdWUgZm9yIGVycm9yIGxldmVsICgwKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmZvIC0gTnVtZXJpYyB2YWx1ZSBmb3IgaW5mbyBsZXZlbCAoMikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIE51bWVyaWMgdmFsdWUgZm9yIHZlcmJvc2UgbGV2ZWwgKDQpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlYnVnIC0gTnVtZXJpYyB2YWx1ZSBmb3IgZGVidWcgbGV2ZWwgKDUpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNpbGx5IC0gTnVtZXJpYyB2YWx1ZSBmb3Igc2lsbHkgbGV2ZWwgKDgpLlxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgTnVtZXJpY0xvZ0xldmVscyA9IHtcbiAgZXJyb3I6IDIsXG4gIGluZm86IDQsXG4gIHZlcmJvc2U6IDYsXG4gIGRlYnVnOiA3LFxuICBzaWxseTogOSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgdGhlbWUgZm9yIHN0eWxpbmcgbG9nIG91dHB1dC5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgY29sb3IgYW5kIHN0eWxlIHNldHRpbmdzIGZvciB2YXJpb3VzIGNvbXBvbmVudHMgb2YgbG9nIG1lc3NhZ2VzLlxuICogQGNvbnN0IERlZmF1bHRUaGVtZVxuICogQHR5cGVkZWYge1RoZW1lfSBEZWZhdWx0VGhlbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjbGFzcyAtIFN0eWxpbmcgZm9yIGNsYXNzIG5hbWVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNsYXNzLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBjbGFzcyBuYW1lcyAoNCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gaWQgLSBTdHlsaW5nIGZvciBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZC5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgaWRlbnRpZmllcnMgKDM2KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzdGFjayAtIFN0eWxpbmcgZm9yIHN0YWNrIHRyYWNlcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0aW1lc3RhbXAgLSBTdHlsaW5nIGZvciB0aW1lc3RhbXBzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1lc3NhZ2UgLSBTdHlsaW5nIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWVzc2FnZS5lcnJvciAtIFN0eWxpbmcgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1lc3NhZ2UuZXJyb3IuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGVycm9yIG1lc3NhZ2VzICgzNCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWV0aG9kIC0gU3R5bGluZyBmb3IgbWV0aG9kIG5hbWVzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsIC0gU3R5bGluZyBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuZXJyb3IgLSBTdHlsaW5nIGZvciBlcnJvciBsZXZlbCBsb2dzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvZ0xldmVsLmVycm9yLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBlcnJvciBsZXZlbCBsb2dzICg2KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC5pbmZvIC0gU3R5bGluZyBmb3IgaW5mbyBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLnZlcmJvc2UgLSBTdHlsaW5nIGZvciB2ZXJib3NlIGxldmVsIGxvZ3MgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuZGVidWcgLSBTdHlsaW5nIGZvciBkZWJ1ZyBsZXZlbCBsb2dzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvZ0xldmVsLmRlYnVnLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBkZWJ1ZyBsZXZlbCBsb2dzICg3KS5cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRUaGVtZTogVGhlbWUgPSB7XG4gIGNsYXNzOiB7XG4gICAgZmc6IDM0LFxuICB9LFxuICBpZDoge1xuICAgIGZnOiAzNixcbiAgfSxcbiAgc3RhY2s6IHt9LFxuICB0aW1lc3RhbXA6IHt9LFxuICBtZXNzYWdlOiB7XG4gICAgZXJyb3I6IHtcbiAgICAgIGZnOiAzMSxcbiAgICB9LFxuICB9LFxuICBtZXRob2Q6IHt9LFxuICBsb2dMZXZlbDoge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICAgIGluZm86IHt9LFxuICAgIHZlcmJvc2U6IHt9LFxuICAgIGRlYnVnOiB7XG4gICAgICBmZzogMzMsXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgbG9nZ2luZy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBsb2dnaW5nIHN5c3RlbSwgaW5jbHVkaW5nIHZlcmJvc2l0eSwgbG9nIGxldmVsLCBzdHlsaW5nLCBhbmQgdGltZXN0YW1wIGZvcm1hdC5cbiAqIEBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZ1xuICogQHR5cGVkZWYge0xvZ2dpbmdDb25maWd9IERlZmF1bHRMb2dnaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIFZlcmJvc2l0eSBsZXZlbCAoMCkuXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsfSBsZXZlbCAtIERlZmF1bHQgbG9nIGxldmVsIChMb2dMZXZlbC5pbmZvKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3R5bGUgLSBXaGV0aGVyIHRvIGFwcGx5IHN0eWxpbmcgdG8gbG9nIG91dHB1dCAoZmFsc2UpLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0aW1lc3RhbXAgLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGltZXN0YW1wcyBpbiBsb2cgbWVzc2FnZXMgKHRydWUpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVzdGFtcEZvcm1hdCAtIEZvcm1hdCBmb3IgdGltZXN0YW1wcyAoXCJISDptbTpzcy5TU1NcIikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNvbnRleHQgLSBXaGV0aGVyIHRvIGluY2x1ZGUgY29udGV4dCBpbmZvcm1hdGlvbiBpbiBsb2cgbWVzc2FnZXMgKHRydWUpLlxuICogQHByb3BlcnR5IHtUaGVtZX0gdGhlbWUgLSBUaGUgdGhlbWUgdG8gdXNlIGZvciBzdHlsaW5nIGxvZyBtZXNzYWdlcyAoRGVmYXVsdFRoZW1lKS5cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRMb2dnaW5nQ29uZmlnOiBMb2dnaW5nQ29uZmlnID0ge1xuICB2ZXJib3NlOiAwLFxuICBsZXZlbDogTG9nTGV2ZWwuaW5mbyxcbiAgbG9nTGV2ZWw6IHRydWUsXG4gIHN0eWxlOiBmYWxzZSxcbiAgc2VwYXJhdG9yOiBcIiAtIFwiLFxuICB0aW1lc3RhbXA6IHRydWUsXG4gIHRpbWVzdGFtcEZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgY29udGV4dDogdHJ1ZSxcbiAgdGhlbWU6IERlZmF1bHRUaGVtZSxcbn07XG5cbmV4cG9ydCBjb25zdCBBYm9ydENvZGUgPSBcIkFib3J0ZWRcIjtcbiIsImltcG9ydCB7XG4gIERlZmF1bHRMb2dnaW5nQ29uZmlnLFxuICBEZWZhdWx0VGhlbWUsXG4gIExvZ0xldmVsLFxuICBOdW1lcmljTG9nTGV2ZWxzLFxufSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBMb2dnaW5nQ29uZmlnLFxuICBMb2dnaW5nQ29udGV4dCxcbiAgU3RyaW5nTGlrZSxcbiAgVGhlbWUsXG4gIFRoZW1lT3B0aW9uLFxuICBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwsXG4gIFZlcmJvc2l0eUxvZ2dlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbG9yaXplT3B0aW9ucywgc3R5bGUsIFN0eWxlZFN0cmluZyB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBtaW5pbWFsIGxvZ2dlciBpbXBsZW1lbnRhdGlvbi5cbiAqIEBzdW1tYXJ5IE1pbmlMb2dnZXIgaXMgYSBsaWdodHdlaWdodCBsb2dnaW5nIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgVmVyYm9zaXR5TG9nZ2VyIGludGVyZmFjZS5cbiAqIEl0IHByb3ZpZGVzIGJhc2ljIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eSB3aXRoIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBsb2cgbGV2ZWxzIGFuZCB2ZXJib3NpdHkuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBNaW5pTG9nZ2VyIGltcGxlbWVudHMgVmVyYm9zaXR5TG9nZ2VyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IE1pbmlMb2dnZXIgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgTWluaUxvZ2dlciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLCBvcHRpb25hbCBjb25maWd1cmF0aW9uLCBhbmQgbWV0aG9kIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHVzaW5nIHRoaXMgbG9nZ2VyLlxuICAgKiBAcGFyYW0gW2NvbmZdIC0gT3B0aW9uYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBJbmZvIGxldmVsIGFuZCB2ZXJib3NpdHkgMC5cbiAgICogQHBhcmFtIFtpZF0gLSBPcHRpb25hbCB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb250ZXh0OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGNvbmY/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIHByb3RlY3RlZCBpZD86IHN0cmluZ1xuICApIHt9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZyhcbiAgICBrZXk6IGtleW9mIExvZ2dpbmdDb25maWdcbiAgKTogTG9nZ2luZ0NvbmZpZ1trZXlvZiBMb2dnaW5nQ29uZmlnXSB7XG4gICAgaWYgKHRoaXMuY29uZiAmJiBrZXkgaW4gdGhpcy5jb25mKSByZXR1cm4gdGhpcy5jb25mW2tleV07XG4gICAgcmV0dXJuIExvZ2dpbmcuZ2V0Q29uZmlnKClba2V5XTtcbiAgfVxuXG4gIGZvcihcbiAgICBtZXRob2Q/OiBzdHJpbmcgfCAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpLFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz5cbiAgKTogVmVyYm9zaXR5TG9nZ2VyIHtcbiAgICBtZXRob2QgPSBtZXRob2RcbiAgICAgID8gdHlwZW9mIG1ldGhvZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1ldGhvZFxuICAgICAgICA6IG1ldGhvZC5uYW1lXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiBMb2dnaW5nLmZvcihbdGhpcy5jb250ZXh0LCBtZXRob2RdLmpvaW4oXCIuXCIpLCB0aGlzLmlkLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZm9ybWF0dGVkIGxvZyBzdHJpbmcuXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGxvZyBzdHJpbmcgd2l0aCB0aW1lc3RhbXAsIGNvbG9yZWQgbG9nIGxldmVsLCBhbmQgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIGxldmVsIC0gVGhlIGxvZyBsZXZlbCBhcyBhIHN0cmluZy5cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHN0YWNrXG4gICAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9nIHN0cmluZy5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVMb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1lc3NhZ2U6IFN0cmluZ0xpa2UgfCBFcnJvcixcbiAgICBzdGFjaz86IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvZzogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuY29uZmlnKFwic3R5bGVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnKFwidGltZXN0YW1wXCIpKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gc3R5bGUgPyBMb2dnaW5nLnRoZW1lKGRhdGUsIFwidGltZXN0YW1wXCIsIGxldmVsKSA6IGRhdGU7XG4gICAgICBsb2cucHVzaCh0aW1lc3RhbXApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZyhcImxvZ0xldmVsXCIpKSB7XG4gICAgICBjb25zdCBsdmw6IHN0cmluZyA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShsZXZlbCwgXCJsb2dMZXZlbFwiLCBsZXZlbClcbiAgICAgICAgOiBsZXZlbDtcbiAgICAgIGxvZy5wdXNoKGx2bCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwiY29udGV4dFwiKSkge1xuICAgICAgY29uc3QgY29udGV4dDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKHRoaXMuY29udGV4dCwgXCJjbGFzc1wiLCBsZXZlbClcbiAgICAgICAgOiB0aGlzLmNvbnRleHQ7XG4gICAgICBsb2cucHVzaChjb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBtc2c6IHN0cmluZyA9IHN0eWxlXG4gICAgICA/IExvZ2dpbmcudGhlbWUoXG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogKG1lc3NhZ2UgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgbGV2ZWxcbiAgICAgICAgKVxuICAgICAgOiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1lc3NhZ2VcbiAgICAgICAgOiAobWVzc2FnZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICBsb2cucHVzaChtc2cpO1xuICAgIGlmIChzdGFjayB8fCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHN0YWNrID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKFxuICAgICAgICAgICAgKHN0YWNrIHx8IChtZXNzYWdlIGFzIEVycm9yKS5zdGFjaykgYXMgc3RyaW5nLFxuICAgICAgICAgICAgXCJzdGFja1wiLFxuICAgICAgICAgICAgbGV2ZWxcbiAgICAgICAgICApXG4gICAgICAgIDogc3RhY2s7XG4gICAgICBsb2cucHVzaChgXFxuU3RhY2sgdHJhY2U6XFxuJHtzdGFja31gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nLmpvaW4odGhpcy5jb25maWcoXCJzZXBhcmF0b3JcIikgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIG1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGxvZyBsZXZlbC5cbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBsb2dnZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9nIGxldmVsLFxuICAgKiB0aGVuIHVzZXMgdGhlIGFwcHJvcHJpYXRlIGNvbnNvbGUgbWV0aG9kIHRvIG91dHB1dCB0aGUgbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gc3RhY2tcbiAgICovXG4gIHByb3RlY3RlZCBsb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1zZzogU3RyaW5nTGlrZSB8IEVycm9yLFxuICAgIHN0YWNrPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIE51bWVyaWNMb2dMZXZlbHNbdGhpcy5jb25maWcoXCJsZXZlbFwiKSBhcyBMb2dMZXZlbF0gPFxuICAgICAgTnVtZXJpY0xvZ0xldmVsc1tsZXZlbF1cbiAgICApXG4gICAgICByZXR1cm47XG4gICAgbGV0IG1ldGhvZDtcbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlIExvZ0xldmVsLmluZm86XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUubG9nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwudmVyYm9zZTpcbiAgICAgIGNhc2UgTG9nTGV2ZWwuZGVidWc6XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUuZGVidWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC5lcnJvcjpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5lcnJvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZyBsZXZlbFwiKTtcbiAgICB9XG4gICAgbWV0aG9kKHRoaXMuY3JlYXRlTG9nKGxldmVsLCBtc2csIHN0YWNrKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExMb2dzIGEgYHdheSB0b28gdmVyYm9zZWAgb3IgYSBzaWxseSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgU2lsbHkgbGV2ZWwgaWYgdGhlIGN1cnJlbnQgdmVyYm9zaXR5IGFsbG93cyBpdC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgc2lsbHkobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSB2ZXJib3NlIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBWZXJib3NlIGxldmVsIGlmIHRoZSBjdXJyZW50IHZlcmJvc2l0eSBhbGxvd3MgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChkZWZhdWx0OiAwKS5cbiAgICovXG4gIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gaW5mbyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgSW5mbyBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGluZm8obXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuaW5mbywgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIGRlYnVnIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBEZWJ1ZyBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmRlYnVnLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBFcnJvciBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGVycm9yKG1zZzogU3RyaW5nTGlrZSB8IEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuZXJyb3IsIG1zZyk7XG4gIH1cblxuICBzZXRDb25maWcoY29uZmlnOiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+KSB7XG4gICAgdGhpcy5jb25mID0geyAuLi4odGhpcy5jb25mIHx8IHt9KSwgLi4uY29uZmlnIH07XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzdGF0aWMgY2xhc3MgZm9yIG1hbmFnaW5nIGxvZ2dpbmcgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoZSBMb2dnaW5nIGNsYXNzIHByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgbG9nZ2luZyBtZWNoYW5pc20gd2l0aCBzdXBwb3J0IGZvclxuICogZGlmZmVyZW50IGxvZyBsZXZlbHMgYW5kIHZlcmJvc2l0eS4gSXQgdXNlcyBhIHNpbmdsZXRvbiBwYXR0ZXJuIHRvIG1haW50YWluIGEgZ2xvYmFsXG4gKiBsb2dnZXIgaW5zdGFuY2UgYW5kIGFsbG93cyBjcmVhdGluZyBzcGVjaWZpYyBsb2dnZXJzIGZvciBkaWZmZXJlbnQgY2xhc3NlcyBhbmQgbWV0aG9kcy5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dpbmcge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBWZXJib3NpdHlMb2dnZXIgdXNlZCBmb3IgZ2xvYmFsIGxvZ2dpbmcuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnbG9iYWw/OiBWZXJib3NpdHlMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBsb2dnZXIgaW5zdGFuY2VzLlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBuZXcgVmVyYm9zaXR5TG9nZ2VyIGluc3RhbmNlcy4gQnkgZGVmYXVsdCwgaXQgY3JlYXRlcyBhIE1pbmlMb2dnZXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfZmFjdG9yeTogKFxuICAgIG9iamVjdDogc3RyaW5nLFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgaWQ/OiBzdHJpbmdcbiAgKSA9PiBWZXJib3NpdHlMb2dnZXIgPSAoXG4gICAgb2JqZWN0OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgICBpZD86IHN0cmluZ1xuICApID0+IHtcbiAgICByZXR1cm4gbmV3IE1pbmlMb2dnZXIob2JqZWN0LCBjb25maWcsIGlkKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZvciB0aGUgbG9nZ2luZyBzeXN0ZW0uXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgZ2xvYmFsIHZlcmJvc2l0eSBsZXZlbCBhbmQgbG9nIGxldmVsIHNldHRpbmdzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2NvbmZpZzogTG9nZ2luZ0NvbmZpZyA9IERlZmF1bHRMb2dnaW5nQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluc3RhbnRpYXRpb24uXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgdGhhdCB0aGUgTG9nZ2luZyBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGFzIGl0J3MgZGVzaWduZWQgdG8gYmUgdXNlZCBzdGF0aWNhbGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXR0ZXIgZm9yIHRoZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBzdW1tYXJ5IEFsbG93cyB1cGRhdGluZyB0aGUgZ2xvYmFsIGxvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFuIG9iamVjdCBjb250YWluaW5nIHZlcmJvc2l0eSBhbmQgbG9nIGxldmVsIHNldHRpbmdzLlxuICAgKi9cbiAgc3RhdGljIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NvbmZpZywgY29uZmlnKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDb25maWcoKTogTG9nZ2luZ0NvbmZpZyB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2NvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBjcmVhdGVzIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBleGlzdGluZyBnbG9iYWwgbG9nZ2VyIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAqXG4gICAqIEByZXR1cm4gVGhlIGdsb2JhbCBWZXJib3NpdHlMb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0KCk6IFZlcmJvc2l0eUxvZ2dlciB7XG4gICAgdGhpcy5nbG9iYWwgPSB0aGlzLmdsb2JhbCA/IHRoaXMuZ2xvYmFsIDogdGhpcy5fZmFjdG9yeShcIkxvZ2dpbmdcIik7XG4gICAgcmV0dXJuIHRoaXMuZ2xvYmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgdmVyYm9zZSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIHZlcmJvc2UgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgc3RhdGljIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS52ZXJib3NlKG1zZywgdmVyYm9zaXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBpbmZvIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgaW5mbyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGluZm8obXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuaW5mbyhtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgZGVidWcgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBkZWJ1ZyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmRlYnVnKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBzaWxseSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGRlYnVnIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgc2lsbHkobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuc2lsbHkobXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGVycm9yIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgZXJyb3IobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuZXJyb3IobXNnKTtcbiAgfVxuXG4gIHN0YXRpYyBmb3IoXG4gICAgb2JqZWN0OiBMb2dnaW5nQ29udGV4dCxcbiAgICBpZD86IHN0cmluZyB8IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPlxuICApOiBWZXJib3NpdHlMb2dnZXIge1xuICAgIG9iamVjdCA9IHR5cGVvZiBvYmplY3QgPT09IFwic3RyaW5nXCIgPyBvYmplY3QgOiBvYmplY3QubmFtZTtcbiAgICBpZCA9IHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIiA/IGlkIDogdW5kZWZpbmVkO1xuICAgIGNvbmZpZyA9IHR5cGVvZiBpZCA9PT0gXCJvYmplY3RcIiA/IChpZCBhcyBQYXJ0aWFsPExvZ2dpbmdDb25maWc+KSA6IGNvbmZpZztcbiAgICByZXR1cm4gdGhpcy5fZmFjdG9yeShvYmplY3QsIGNvbmZpZywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9nZ2VyIGZvciBhIHNwZWNpZmljIHJlYXNvbiBvciBjb250ZXh0LlxuICAgKlxuICAgKiBAc3VtbWFyeSBUaGlzIHN0YXRpYyBtZXRob2QgY3JlYXRlcyBhIG5ldyBsb2dnZXIgaW5zdGFuY2UgdXNpbmcgdGhlIGZhY3RvcnkgZnVuY3Rpb24sXG4gICAqIGJhc2VkIG9uIGEgZ2l2ZW4gcmVhc29uIG9yIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSByZWFzb24gb3IgY29udGV4dCBmb3IgY3JlYXRpbmcgdGhpcyBsb2dnZXIuXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcmV0dXJucyBBIG5ldyBWZXJib3NpdHlMb2dnZXIgb3IgQ2xhc3NMb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgYmVjYXVzZShyZWFzb246IHN0cmluZywgaWQ/OiBzdHJpbmcpOiBWZXJib3NpdHlMb2dnZXIge1xuICAgIHJldHVybiB0aGlzLl9mYWN0b3J5KHJlYXNvbiwgdGhpcy5fY29uZmlnLCBpZCk7XG4gIH1cblxuICBzdGF0aWMgdGhlbWUoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHR5cGU6IGtleW9mIFRoZW1lIHwga2V5b2YgTG9nTGV2ZWwsXG4gICAgbG9nZ2VyTGV2ZWw6IExvZ0xldmVsLFxuICAgIHRlbXBsYXRlOiBUaGVtZSA9IERlZmF1bHRUaGVtZVxuICApIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zdHlsZSkgcmV0dXJuIHRleHQ7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5nZXQoKS5mb3IodGhpcy50aGVtZSk7XG5cbiAgICBmdW5jdGlvbiBhcHBseShcbiAgICAgIHR4dDogc3RyaW5nLFxuICAgICAgb3B0aW9uOiBrZXlvZiBUaGVtZU9wdGlvbixcbiAgICAgIHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IG51bWJlcltdIHwgc3RyaW5nW11cbiAgICApOiBzdHJpbmcge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdDogc3RyaW5nIHwgU3R5bGVkU3RyaW5nID0gdHh0O1xuICAgICAgICBsZXQgYyA9IHN0eWxlKHQpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5Q29sb3IoXG4gICAgICAgICAgdmFsOiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICBpc0JnID0gZmFsc2VcbiAgICAgICAgKTogU3R5bGVkU3RyaW5nIHtcbiAgICAgICAgICBsZXQgZjpcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuYmFja2dyb3VuZFxuICAgICAgICAgICAgfCB0eXBlb2YgYy5mb3JlZ3JvdW5kXG4gICAgICAgICAgICB8IHR5cGVvZiBjLnJnYlxuICAgICAgICAgICAgfCB0eXBlb2YgYy5jb2xvcjI1NiA9IGlzQmcgPyBjLmJhY2tncm91bmQgOiBjLmZvcmVncm91bmQ7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiAoZiBhcyB0eXBlb2YgYy5iYWNrZ3JvdW5kIHwgdHlwZW9mIGMuZm9yZWdyb3VuZCkuY2FsbChcbiAgICAgICAgICAgICAgYyxcbiAgICAgICAgICAgICAgdmFsdWUgYXMgbnVtYmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKHZhbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgZiA9IGlzQmcgPyBjLmJnQ29sb3IyNTYgOiBjLmNvbG9yMjU2O1xuICAgICAgICAgICAgICByZXR1cm4gKGYgYXMgdHlwZW9mIGMuYmdDb2xvcjI1NiB8IHR5cGVvZiBjLmNvbG9yMjU2KSh2YWxbMF0pO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBmID0gaXNCZyA/IGMuYmdSZ2IgOiBjLnJnYjtcbiAgICAgICAgICAgICAgcmV0dXJuIGMucmdiKHZhbFswXSwgdmFsWzFdLCB2YWxbMl0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3QgYSB2YWxpZCBjb2xvciBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgICByZXR1cm4gc3R5bGUodCBhcyBzdHJpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5U3R5bGUodjogbnVtYmVyIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBjID0gYy5zdHlsZSh2KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyA9IGNbdiBhcyBrZXlvZiBDb2xvcml6ZU9wdGlvbnNdIGFzIFN0eWxlZFN0cmluZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgIGNhc2UgXCJiZ1wiOlxuICAgICAgICAgIGNhc2UgXCJmZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIGFwcGx5Q29sb3IodmFsdWUgYXMgbnVtYmVyKS50ZXh0O1xuICAgICAgICAgIGNhc2UgXCJzdHlsZVwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goYXBwbHlTdHlsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhcHBseVN0eWxlKHZhbHVlIGFzIG51bWJlciB8IHN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYy50ZXh0O1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdCBhIHZhbGlkIHRoZW1lIG9wdGlvbjogJHtvcHRpb259YCk7XG4gICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3IgYXBwbHlpbmcgc3R5bGU6ICR7b3B0aW9ufSB3aXRoIHZhbHVlICR7dmFsdWV9YCk7XG4gICAgICAgIHJldHVybiB0eHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5kaXZpZHVhbFRoZW1lID0gdGVtcGxhdGVbdHlwZSBhcyBrZXlvZiBUaGVtZV07XG4gICAgaWYgKCFpbmRpdmlkdWFsVGhlbWUgfHwgIU9iamVjdC5rZXlzKGluZGl2aWR1YWxUaGVtZSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBsZXQgYWN0dWFsVGhlbWU6IFRoZW1lT3B0aW9uID0gaW5kaXZpZHVhbFRoZW1lIGFzIFRoZW1lT3B0aW9uO1xuXG4gICAgY29uc3QgbG9nTGV2ZWxzID0gT2JqZWN0LmFzc2lnbih7fSwgTG9nTGV2ZWwpO1xuICAgIGlmIChPYmplY3Qua2V5cyhpbmRpdmlkdWFsVGhlbWUpWzBdIGluIGxvZ0xldmVscylcbiAgICAgIGFjdHVhbFRoZW1lID1cbiAgICAgICAgKGluZGl2aWR1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwpW2xvZ2dlckxldmVsXSB8fCB7fTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhhY3R1YWxUaGVtZSkucmVkdWNlKChhY2M6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IChhY3R1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbilba2V5IGFzIGtleW9mIFRoZW1lT3B0aW9uXTtcbiAgICAgIGlmICh2YWwpXG4gICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICBhY2MsXG4gICAgICAgICAga2V5IGFzIGtleW9mIFRoZW1lT3B0aW9uLFxuICAgICAgICAgIHZhbCBhc1xuICAgICAgICAgICAgfCBudW1iZXJcbiAgICAgICAgICAgIHwgW251bWJlcl1cbiAgICAgICAgICAgIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gICAgICAgICAgICB8IG51bWJlcltdXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBbnN3ZXJzLFxuICBDaG9pY2UsXG4gIEZhbHN5LFxuICBJbml0aWFsUmV0dXJuVmFsdWUsXG4gIFByZXZDYWxsZXIsXG4gIFByb21wdE9iamVjdCxcbiAgUHJvbXB0VHlwZSxcbiAgVmFsdWVPckZ1bmMsXG59IGZyb20gXCJwcm9tcHRzXCI7XG5pbXBvcnQgcHJvbXB0cyBmcm9tIFwicHJvbXB0c1wiO1xuaW1wb3J0IHsgcGFyc2VBcmdzLCBQYXJzZUFyZ3NDb25maWcgfSBmcm9tIFwidXRpbFwiO1xuaW1wb3J0IHsgV3JpdGFibGUsIFJlYWRhYmxlIH0gZnJvbSBcInN0cmVhbVwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCIuLi9vdXRwdXQvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgS2xldXIgfSBmcm9tIFwiLi4vb3V0cHV0L3R5cGVzXCI7XG5pbXBvcnQgeyBQYXJzZUFyZ3NPcHRpb25zQ29uZmlnLCBQYXJzZUFyZ3NSZXN1bHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIGEgdXNlciBpbnB1dCBwcm9tcHQgd2l0aCB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBmbGV4aWJsZSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyB1c2VyIGlucHV0IHByb21wdHMuXG4gKiBJdCBpbXBsZW1lbnRzIHRoZSBQcm9tcHRPYmplY3QgaW50ZXJmYWNlIGZyb20gdGhlICdwcm9tcHRzJyBsaWJyYXJ5IGFuZCBvZmZlcnMgbWV0aG9kcyB0byBzZXRcbiAqIHZhcmlvdXMgcHJvcGVydGllcyBvZiB0aGUgcHJvbXB0LiBUaGUgY2xhc3MgYWxzbyBpbmNsdWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgY29tbW9uIGlucHV0IHNjZW5hcmlvc1xuICogYW5kIGFyZ3VtZW50IHBhcnNpbmcuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0IG5hbWUsIGV4dGVuZGluZyBzdHJpbmcuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgVXNlcklucHV0PFIgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IGltcGxlbWVudHMgUHJvbXB0T2JqZWN0PFI+IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nZ2VyID0gTG9nZ2luZy5mb3IoVXNlcklucHV0KTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBpbnB1dCBtZXRob2QgKGUuZy4sIHRleHQsIG51bWJlciwgY29uZmlybSkuXG4gICAqL1xuICB0eXBlOiBQcm9tcHRUeXBlIHwgRmFsc3kgfCBQcmV2Q2FsbGVyPFIsIFByb21wdFR5cGUgfCBGYWxzeT4gPSBcInRleHRcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqL1xuICBuYW1lOiBWYWx1ZU9yRnVuYzxSPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHN1bW1hcnkgVGhlIHF1ZXN0aW9uIG9yIGluc3RydWN0aW9uIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICovXG4gIG1lc3NhZ2U/OiBWYWx1ZU9yRnVuYzxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgVGhlIGRlZmF1bHQgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgaW5pdGlhbD86XG4gICAgfCBJbml0aWFsUmV0dXJuVmFsdWVcbiAgICB8IFByZXZDYWxsZXI8UiwgSW5pdGlhbFJldHVyblZhbHVlIHwgUHJvbWlzZTxJbml0aWFsUmV0dXJuVmFsdWU+PlxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0eWxlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKi9cbiAgc3R5bGU/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmb3JtYXQgZnVuY3Rpb24gZm9yIHRoZSBpbnB1dC5cbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0byBmb3JtYXQgdGhlIHVzZXIncyBpbnB1dCBiZWZvcmUgaXQncyByZXR1cm5lZC5cbiAgICovXG4gIGZvcm1hdD86IFByZXZDYWxsZXI8Uiwgdm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGlucHV0LlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqL1xuICB2YWxpZGF0ZT86XG4gICAgfCBQcmV2Q2FsbGVyPFIsIGJvb2xlYW4gfCBzdHJpbmcgfCBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+PlxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG9uU3RhdGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEBzdW1tYXJ5IEEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBwcm9tcHQgY2hhbmdlcy5cbiAgICovXG4gIG9uU3RhdGU/OiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIG9uUmVuZGVyPzogKChrbGV1cjogS2xldXIpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1pbmltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBsb3dlc3QgbnVtYmVyIHRoZSB1c2VyIGNhbiBpbnB1dC5cbiAgICovXG4gIG1pbj86IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1heGltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBoaWdoZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqL1xuICBtYXg/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdG8gYWxsb3cgZmxvYXQgdmFsdWVzIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBJZiB0cnVlLCBhbGxvd3MgZGVjaW1hbCBudW1iZXJzLlxuICAgKi9cbiAgZmxvYXQ/OiBib29sZWFuIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0byBmb3IgZmxvYXQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBwcmVjaXNpb24gb2YgZmxvYXQgaW5wdXRzLlxuICAgKi9cbiAgcm91bmQ/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluc3RydWN0aW9ucyBmb3IgdGhlIHVzZXIuXG4gICAqIEBzdW1tYXJ5IEFkZGl0aW9uYWwgZ3VpZGFuY2UgcHJvdmlkZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluY3JlbWVudCB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0ZXAgc2l6ZSB3aGVuIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgbnVtYmVyLlxuICAgKi9cbiAgaW5jcmVtZW50PzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2VwYXJhdG9yIGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIGNoYXJhY3RlciB1c2VkIHRvIHNlcGFyYXRlIGxpc3QgaXRlbXMuXG4gICAqL1xuICBzZXBhcmF0b3I/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBhY3RpdmUgb3B0aW9uIHN0eWxlIGZvciBzZWxlY3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgc3R5bGUgYXBwbGllZCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbi5cbiAgICovXG4gIGFjdGl2ZT86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0eWxlIGFwcGxpZWQgdG8gbm9uLXNlbGVjdGVkIG9wdGlvbnMuXG4gICAqL1xuICBpbmFjdGl2ZT86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIGNob2ljZXM/OiBDaG9pY2VbXSB8IFByZXZDYWxsZXI8UiwgQ2hvaWNlW10gfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgaGludCB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICovXG4gIGhpbnQ/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB3YXJuaW5nIHRleHQgZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IEEgd2FybmluZyBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICovXG4gIHdhcm4/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICBzdWdnZXN0PzogKChpbnB1dDogYW55LCBjaG9pY2VzOiBDaG9pY2VbXSkgPT4gUHJvbWlzZTxhbnk+KSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBsaW1pdCBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBzZWxlY3RlZC5cbiAgICovXG4gIGxpbWl0PzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWFzayBmb3IgcGFzc3dvcmQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gaGlkZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKi9cbiAgbWFzaz86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0ZG91dCBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFRoZSBvdXRwdXQgc3RyZWFtIHVzZWQgYnkgdGhlIHByb21wdC5cbiAgICovXG4gIHN0ZG91dD86IFdyaXRhYmxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0ZGluIHN0cmVhbSBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgVGhlIGlucHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQuXG4gICAqL1xuICBzdGRpbj86IFJlYWRhYmxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBVc2VySW5wdXQgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IFVzZXJJbnB1dCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LlxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZTogVmFsdWVPckZ1bmM8Uj4pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSB0eXBlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGlucHV0IG1ldGhvZCBmb3IgdGhlIHByb21wdC5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0VHlwZSh0eXBlOiBQcm9tcHRUeXBlIHwgRmFsc3kgfCBQcmV2Q2FsbGVyPFIsIFByb21wdFR5cGUgfCBGYWxzeT4pOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgdHlwZSB0bzogJHt0eXBlfWApO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1lc3NhZ2Ugb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgcXVlc3Rpb24gb3IgaW5zdHJ1Y3Rpb24gcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRNZXNzYWdlKHZhbHVlOiBWYWx1ZU9yRnVuYzxzdHJpbmc+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1lc3NhZ2UgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tZXNzYWdlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZGVmYXVsdCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5pdGlhbChcbiAgICB2YWx1ZTpcbiAgICAgIHwgSW5pdGlhbFJldHVyblZhbHVlXG4gICAgICB8IFByZXZDYWxsZXI8UiwgSW5pdGlhbFJldHVyblZhbHVlIHwgUHJvbWlzZTxJbml0aWFsUmV0dXJuVmFsdWU+PlxuICAgICAgfCB1bmRlZmluZWRcbiAgKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluaXRpYWwgdmFsdWUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbml0aWFsID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHN0eWxlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3R5bGUgdG8gYmUgYXBwbGllZC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFN0eWxlKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBzdHlsZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLnN0eWxlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGZvcm1hdCBmdW5jdGlvbiBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSB1c2VyJ3MgaW5wdXQgYmVmb3JlIGl0J3MgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBmb3JtYXQgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRGb3JtYXQodmFsdWU6IFByZXZDYWxsZXI8Uiwgdm9pZD4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgZm9ybWF0IGZ1bmN0aW9uYCk7XG4gICAgdGhpcy5mb3JtYXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRWYWxpZGF0ZShcbiAgICB2YWx1ZTpcbiAgICAgIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgc3RyaW5nIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPj5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyB2YWxpZGF0ZSBmdW5jdGlvbmApO1xuICAgIHRoaXMudmFsaWRhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgb25TdGF0ZSBjYWxsYmFjayBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBwcm9tcHQgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG9uU3RhdGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRPblN0YXRlKHZhbHVlOiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG9uU3RhdGUgY2FsbGJhY2tgKTtcbiAgICB0aGlzLm9uU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgb25SZW5kZXIgY2FsbGJhY2sgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBwcm9tcHQgaXMgcmVuZGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvblJlbmRlciBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE9uUmVuZGVyKHZhbHVlOiAoKGtsZXVyOiBLbGV1cikgPT4gdm9pZCkgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgb25SZW5kZXIgY2FsbGJhY2tgKTtcbiAgICB0aGlzLm9uUmVuZGVyID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1pbmltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGxvd2VzdCBudW1iZXIgdGhlIHVzZXIgY2FuIGlucHV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWluaW11bSB2YWx1ZS5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE1pbih2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbWluIHZhbHVlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMubWluID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1heGltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGhpZ2hlc3QgbnVtYmVyIHRoZSB1c2VyIGNhbiBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1heGltdW0gdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRNYXgodmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1heCB2YWx1ZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLm1heCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHdoZXRoZXIgdG8gYWxsb3cgZmxvYXQgdmFsdWVzIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHdoZXRoZXIgZGVjaW1hbCBudW1iZXJzIGFyZSBhbGxvd2VkLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBXaGV0aGVyIHRvIGFsbG93IGZsb2F0IHZhbHVlcy5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEZsb2F0KHZhbHVlOiBib29sZWFuIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGZsb2F0IHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuZmxvYXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHJvdW5kIHRvIGZvciBmbG9hdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHByZWNpc2lvbiBvZiBmbG9hdCBpbnB1dHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRSb3VuZCh2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgcm91bmQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5yb3VuZCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSB1c2VyLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGFkZGl0aW9uYWwgZ3VpZGFuY2UgcHJvdmlkZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbnN0cnVjdGlvbnMuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRJbnN0cnVjdGlvbnModmFsdWU6IHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaW5zdHJ1Y3Rpb25zIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGluY3JlbWVudCB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgc3RlcCBzaXplIHdoZW4gaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nIHRoZSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbmNyZW1lbnQgdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRJbmNyZW1lbnQoXG4gICAgdmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBpbmNyZW1lbnQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbmNyZW1lbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgc2VwYXJhdG9yIGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gc2VwYXJhdGUgbGlzdCBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTZXBhcmF0b3IoXG4gICAgdmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBzZXBhcmF0b3IgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5zZXBhcmF0b3IgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgc3R5bGUgYXBwbGllZCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFjdGl2ZSBvcHRpb24gc3R5bGUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRBY3RpdmUodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGFjdGl2ZSBzdHlsZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmFjdGl2ZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbmFjdGl2ZSBvcHRpb24gc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHN0eWxlIGFwcGxpZWQgdG8gbm9uLXNlbGVjdGVkIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbmFjdGl2ZSBvcHRpb24gc3R5bGUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRJbmFjdGl2ZSh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaW5hY3RpdmUgc3R5bGUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbmFjdGl2ZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q2hvaWNlcyhcbiAgICB2YWx1ZTogQ2hvaWNlW10gfCBQcmV2Q2FsbGVyPFIsIENob2ljZVtdIHwgRmFsc3k+IHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBjaG9pY2VzOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICB0aGlzLmNob2ljZXMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaGludCB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaGludCB0ZXh0LlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SGludCh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaGludCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmhpbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgd2FybmluZyB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgd2FybmluZyBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHdhcm5pbmcgdGV4dC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFdhcm4odmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHdhcm4gdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy53YXJuID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRTdWdnZXN0KFxuICAgIHZhbHVlOiAoKGlucHV0OiBhbnksIGNob2ljZXM6IENob2ljZVtdKSA9PiBQcm9taXNlPGFueT4pIHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBzdWdnZXN0IGZ1bmN0aW9uYCk7XG4gICAgdGhpcy5zdWdnZXN0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGxpbWl0IGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgaW4gbGlzdC10eXBlIHByb21wdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQsIG9yIGEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoaXMgdmFsdWUuXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldExpbWl0KHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBsaW1pdCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmxpbWl0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1hc2sgZm9yIHBhc3N3b3JkIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gaGlkZSB0aGUgdXNlcidzIGlucHV0IGluIHBhc3N3b3JkLXR5cGUgcHJvbXB0cy5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0IG5hbWUsIGV4dGVuZGluZyBzdHJpbmcuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBjaGFyYWN0ZXIgdXNlZCB0byBtYXNrIHRoZSBpbnB1dCwgb3IgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhpcyB2YWx1ZS5cbiAgICogQHJldHVybiBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0TWFzayh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbWFzayB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLm1hc2sgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgc3Rkb3V0IHN0cmVhbSBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgb3V0cHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQgZm9yIGRpc3BsYXlpbmcgbWVzc2FnZXMgYW5kIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBXcml0YWJsZSBzdHJlYW0gdG8gYmUgdXNlZCBhcyBzdGRvdXQuXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFN0ZG91dCh2YWx1ZTogV3JpdGFibGUgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc3Rkb3V0IHN0cmVhbWApO1xuICAgIHRoaXMuc3Rkb3V0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBzdGRpbiBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGlucHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQgZm9yIHJlY2VpdmluZyB1c2VyIGlucHV0LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgUmVhZGFibGUgc3RyZWFtIHRvIGJlIHVzZWQgYXMgc3RkaW4uXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFN0ZGluKHZhbHVlOiBSZWFkYWJsZSB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIHRoaXMuc3RkaW4gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBmb3IgaW5wdXQgYmFzZWQgb24gdGhlIGN1cnJlbnQgVXNlcklucHV0IGNvbmZpZ3VyYXRpb24uXG4gICAqIEBzdW1tYXJ5IFByb21wdHMgdGhlIHVzZXIgYW5kIHJldHVybnMgdGhlaXIgcmVzcG9uc2UgYXMgYSBzaW5nbGUgdmFsdWUuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1c2VyJ3MgYW5zd2VyLlxuICAgKi9cbiAgYXN5bmMgYXNrKCkge1xuICAgIHJldHVybiAoYXdhaXQgVXNlcklucHV0LmFzayh0aGlzKSlbdGhpcy5uYW1lIGFzIGtleW9mIEFuc3dlcnM8Uj5dO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIG9uZSBvciBtb3JlIHF1ZXN0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgVXNlcklucHV0IGNvbmZpZ3VyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHdpdGggb25lIG9yIG1vcmUgcXVlc3Rpb25zIGFuZCByZXR1cm5zIHRoZWlyIGFuc3dlcnMgYXMgYW4gb2JqZWN0LlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gQSBzaW5nbGUgVXNlcklucHV0IGluc3RhbmNlIG9yIGFuIGFycmF5IG9mIFVzZXJJbnB1dCBpbnN0YW5jZXMuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHVzZXIncyBhbnN3ZXJzLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIGFzayBtZXRob2RcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIHByb21wdHMgbGlicmFyeVxuICAgKiAgIEEtPj5QOiBDYWxsIHByb21wdHMgd2l0aCBxdWVzdGlvbihzKVxuICAgKiAgIFAtPj5VOiBEaXNwbGF5IHByb21wdChzKVxuICAgKiAgIFUtPj5QOiBQcm92aWRlIGlucHV0XG4gICAqICAgUC0+PkE6IFJldHVybiBhbnN3ZXJzXG4gICAqICAgQS0+PkE6IFByb2Nlc3MgYW5zd2Vyc1xuICAgKiAgIEEtLT4+Q2FsbGVyOiBSZXR1cm4gcHJvY2Vzc2VkIGFuc3dlcnNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2s8UiBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gICAgcXVlc3Rpb246IFVzZXJJbnB1dDxSPiB8IFVzZXJJbnB1dDxSPltdXG4gICkge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuYXNrKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocXVlc3Rpb24pKSB7XG4gICAgICBxdWVzdGlvbiA9IFtxdWVzdGlvbl07XG4gICAgfVxuICAgIGxldCBhbnN3ZXJzOiBBbnN3ZXJzPFI+O1xuICAgIHRyeSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYEFza2luZyBxdWVzdGlvbnM6ICR7cXVlc3Rpb24ubWFwKChxKSA9PiBxLm5hbWUpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgYW5zd2VycyA9IGF3YWl0IHByb21wdHMocXVlc3Rpb24pO1xuICAgICAgbG9nLnZlcmJvc2UoYFJlY2VpdmVkIGFuc3dlcnM6ICR7SlNPTi5zdHJpbmdpZnkoYW5zd2VycywgbnVsbCwgMil9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgZ2V0dGluZyBpbnB1dDogJHtlcnJvcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGFuc3dlcnM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFza3MgdGhlIHVzZXIgZm9yIGEgbnVtYmVyIGlucHV0LlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIGEgbnVtYmVyLCB3aXRoIG9wdGlvbmFsIG1pbmltdW0sIG1heGltdW0sIGFuZCBpbml0aWFsIHZhbHVlcy5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBtaW4gLSBUaGUgbWluaW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBtYXggLSBUaGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBpbml0aWFsIC0gVGhlIGluaXRpYWwgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChvcHRpb25hbCkuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG51bWJlciBlbnRlcmVkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFza051bWJlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb246IHN0cmluZyxcbiAgICBtaW4/OiBudW1iZXIsXG4gICAgbWF4PzogbnVtYmVyLFxuICAgIGluaXRpYWw/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFza051bWJlcik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgQXNraW5nIG51bWJlciBpbnB1dDogdW5kZWZpbmVkLCBxdWVzdGlvbjogJHtxdWVzdGlvbn0sIG1pbjogJHttaW59LCBtYXg6ICR7bWF4fSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSlcbiAgICAgIC5zZXRNZXNzYWdlKHF1ZXN0aW9uKVxuICAgICAgLnNldFR5cGUoXCJudW1iZXJcIik7XG5cbiAgICBpZiAodHlwZW9mIG1pbiA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldE1pbihtaW4pO1xuXG4gICAgaWYgKHR5cGVvZiBtYXggPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNYXgobWF4KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbCA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldEluaXRpYWwoaW5pdGlhbCk7XG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIHRleHQgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IFByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgdGV4dCwgd2l0aCBvcHRpb25hbCBtYXNraW5nIGFuZCBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQsIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIG1hc2sgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gbWFzayB0aGUgaW5wdXQgKG9wdGlvbmFsLCBmb3IgcGFzc3dvcmQtbGlrZSBpbnB1dHMpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB0ZXh0IGVudGVyZWQgYnkgdGhlIHVzZXIuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrVGV4dChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb246IHN0cmluZyxcbiAgICBtYXNrOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgaW5pdGlhbD86IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuYXNrVGV4dCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgQXNraW5nIHRleHQgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCBtYXNrOiAke21hc2t9LCBpbml0aWFsOiAke2luaXRpYWx9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKS5zZXRNZXNzYWdlKHF1ZXN0aW9uKTtcblxuICAgIGlmIChtYXNrKSB1c2VySW5wdXQuc2V0TWFzayhtYXNrKTtcbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwic3RyaW5nXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hc2sodXNlcklucHV0KSlbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFza3MgdGhlIHVzZXIgZm9yIGEgY29uZmlybWF0aW9uICh5ZXMvbm8pLlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHdpdGggYSB5ZXMvbm8gcXVlc3Rpb24gYW5kIHJldHVybnMgYSBib29sZWFuIHJlc3VsdC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBpbml0aWFsIC0gVGhlIGluaXRpYWwgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChvcHRpb25hbCkuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgdXNlcidzIGFuc3dlci5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2tDb25maXJtYXRpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgaW5pdGlhbD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5hc2tDb25maXJtYXRpb24pO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyBjb25maXJtYXRpb24gaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCBpbml0aWFsOiAke2luaXRpYWx9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKVxuICAgICAgLnNldE1lc3NhZ2UocXVlc3Rpb24pXG4gICAgICAuc2V0VHlwZShcImNvbmZpcm1cIik7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWwgIT09IFwidW5kZWZpbmVkXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hc2sodXNlcklucHV0KSlbbmFtZV07XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBlYXRlZGx5IGFza3MgZm9yIGlucHV0IHVudGlsIGEgdmFsaWQgcmVzcG9uc2UgaXMgZ2l2ZW4gb3IgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGluc2lzdHMgb24gZ2V0dGluZyBhIHZhbGlkIGlucHV0IGZyb20gdGhlIHVzZXIsIGFsbG93aW5nIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIHJlc3VsdC5cbiAgICogQHBhcmFtIGlucHV0IC0gVGhlIFVzZXJJbnB1dCBpbnN0YW5jZSB0byB1c2UgZm9yIHByb21wdGluZy5cbiAgICogQHBhcmFtIHRlc3QgLSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqIEBwYXJhbSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBhbGxvd2VkIChkZWZhdWx0IGlzIDEpLlxuICAgKiBAcGFyYW0gZGVmYXVsdENvbmZpcm1hdGlvblxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZCBpbnB1dCBvciB1bmRlZmluZWQgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IEkgYXMgaW5zaXN0IG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgYXNrIG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IFQgYXMgdGVzdCBmdW5jdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgYXNrQ29uZmlybWF0aW9uIG1ldGhvZFxuICAgKiAgIGxvb3AgVW50aWwgdmFsaWQgaW5wdXQgb3IgbGltaXQgcmVhY2hlZFxuICAgKiAgICAgSS0+PkE6IENhbGwgYXNrIHdpdGggaW5wdXRcbiAgICogICAgIEEtPj5VOiBQcm9tcHQgdXNlclxuICAgKiAgICAgVS0+PkE6IFByb3ZpZGUgaW5wdXRcbiAgICogICAgIEEtPj5JOiBSZXR1cm4gcmVzdWx0XG4gICAqICAgICBJLT4+VDogVGVzdCByZXN1bHRcbiAgICogICAgIGFsdCBUZXN0IHBhc3Nlc1xuICAgKiAgICAgICBJLT4+QzogQXNrIGZvciBjb25maXJtYXRpb25cbiAgICogICAgICAgQy0+PlU6IENvbmZpcm0gaW5wdXRcbiAgICogICAgICAgVS0+PkM6IFByb3ZpZGUgY29uZmlybWF0aW9uXG4gICAqICAgICAgIEMtPj5JOiBSZXR1cm4gY29uZmlybWF0aW9uXG4gICAqICAgICAgIGFsdCBDb25maXJtZWRcbiAgICogICAgICAgICBJLS0+PkNhbGxlcjogUmV0dXJuIHZhbGlkIHJlc3VsdFxuICAgKiAgICAgICBlbHNlIE5vdCBjb25maXJtZWRcbiAgICogICAgICAgICBJLT4+STogQ29udGludWUgbG9vcFxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2UgVGVzdCBmYWlsc1xuICAgKiAgICAgICBJLT4+STogQ29udGludWUgbG9vcFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgSS0tPj5DYWxsZXI6IFJldHVybiB1bmRlZmluZWQgaWYgbGltaXQgcmVhY2hlZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluc2lzdDxSPihcbiAgICBpbnB1dDogVXNlcklucHV0LFxuICAgIHRlc3Q6IChyZXM6IHN0cmluZyB8IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICBkZWZhdWx0Q29uZmlybWF0aW9uOiBib29sZWFuLFxuICAgIGxpbWl0ID0gMVxuICApOiBQcm9taXNlPFIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmluc2lzdCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgSW5zaXN0aW5nIG9uIGlucHV0OiAke2lucHV0Lm5hbWV9LCB0ZXN0OiAke3Rlc3QudG9TdHJpbmcoKX0sIGRlZmF1bHRDb25maXJtYXRpb246ICR7ZGVmYXVsdENvbmZpcm1hdGlvbn0sIGxpbWl0OiAke2xpbWl0fWBcbiAgICApO1xuICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBjb25maXJtYXRpb246IGJvb2xlYW47XG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gKGF3YWl0IFVzZXJJbnB1dC5hc2soaW5wdXQpKVtcbiAgICAgICAgICBpbnB1dC5uYW1lIGFzIGtleW9mIEFuc3dlcnM8c3RyaW5nPlxuICAgICAgICBdIGFzIHN0cmluZztcbiAgICAgICAgaWYgKCF0ZXN0KHJlc3VsdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlybWF0aW9uID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgICBgJHtpbnB1dC5uYW1lfS1jb25maXJtYCxcbiAgICAgICAgICBgSXMgdGhlICR7aW5wdXQudHlwZX0gY29ycmVjdD9gLFxuICAgICAgICAgIGRlZmF1bHRDb25maXJtYXRpb25cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjb25maXJtYXRpb24pIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gd2hpbGUgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIgJiYgbGltaXQgPiAxICYmIGNvdW50KysgPCBsaW1pdCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBFcnJvciB3aGlsZSBpbnNpc3Rpbmc6ICR7ZX1gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIGxvZy5pbmZvKFwibm8gc2VsZWN0aW9uLi4uXCIpO1xuICAgIHJldHVybiByZXN1bHQgYXMgUiB8IHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcGVhdGVkbHkgYXNrcyBmb3IgdGV4dCBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCB0ZXh0IGlucHV0IGZyb20gdGhlIHVzZXIsIGFsbG93aW5nIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gdGVzdCAtIEEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICogQHBhcmFtIG1hc2sgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gbWFzayB0aGUgaW5wdXQgKG9wdGlvbmFsLCBmb3IgcGFzc3dvcmQtbGlrZSBpbnB1dHMpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZGVmYXVsdENvbmZpcm1hdGlvblxuICAgKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgYWxsb3dlZCAoZGVmYXVsdCBpcyAtMSwgbWVhbmluZyB1bmxpbWl0ZWQpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZCBpbnB1dCBvciB1bmRlZmluZWQgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5zaXN0Rm9yVGV4dChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb246IHN0cmluZyxcbiAgICB0ZXN0OiAocmVzOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4gICAgbWFzazogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGluaXRpYWw/OiBzdHJpbmcsXG4gICAgZGVmYXVsdENvbmZpcm1hdGlvbiA9IGZhbHNlLFxuICAgIGxpbWl0ID0gLTFcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmluc2lzdEZvclRleHQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEluc2lzdGluZyBmb3IgdGV4dCBpbnB1dDogdW5kZWZpbmVkLCBxdWVzdGlvbjogJHtxdWVzdGlvbn0sIHRlc3Q6ICR7dGVzdC50b1N0cmluZygpfSwgbWFzazogJHttYXNrfSwgaW5pdGlhbDogJHtpbml0aWFsfSwgZGVmYXVsdENvbmZpcm1hdGlvbjogJHtkZWZhdWx0Q29uZmlybWF0aW9ufSwgbGltaXQ6ICR7bGltaXR9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKS5zZXRNZXNzYWdlKHF1ZXN0aW9uKTtcblxuICAgIGlmIChtYXNrKSB1c2VySW5wdXQuc2V0TWFzayhtYXNrKTtcbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwic3RyaW5nXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5pbnNpc3QoXG4gICAgICB1c2VySW5wdXQsXG4gICAgICB0ZXN0IGFzIChyZXM6IHN0cmluZyB8IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICAgIGRlZmF1bHRDb25maXJtYXRpb24sXG4gICAgICBsaW1pdFxuICAgICkpIGFzIHN0cmluZztcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcGVhdGVkbHkgYXNrcyBmb3IgbnVtYmVyIGlucHV0IHVudGlsIGEgdmFsaWQgcmVzcG9uc2UgaXMgZ2l2ZW4gb3IgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGluc2lzdHMgb24gZ2V0dGluZyBhIHZhbGlkIG51bWJlciBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQsIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIHRlc3QgLSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqIEBwYXJhbSBtaW4gLSBUaGUgbWluaW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBtYXggLSBUaGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBpbml0aWFsIC0gVGhlIGluaXRpYWwgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBkZWZhdWx0Q29uZmlybWF0aW9uXG4gICAqIEBwYXJhbSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBhbGxvd2VkIChkZWZhdWx0IGlzIC0xLCBtZWFuaW5nIHVubGltaXRlZCkuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkIGlucHV0IG9yIHVuZGVmaW5lZCBpZiB0aGUgbGltaXQgaXMgcmVhY2hlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbnNpc3RGb3JOdW1iZXIoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgdGVzdDogKHJlczogbnVtYmVyKSA9PiBib29sZWFuLFxuICAgIG1pbj86IG51bWJlcixcbiAgICBtYXg/OiBudW1iZXIsXG4gICAgaW5pdGlhbD86IG51bWJlcixcbiAgICBkZWZhdWx0Q29uZmlybWF0aW9uID0gZmFsc2UsXG4gICAgbGltaXQgPSAtMVxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuaW5zaXN0Rm9yTnVtYmVyKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBJbnNpc3RpbmcgZm9yIG51bWJlciBpbnB1dDogdW5kZWZpbmVkLCBxdWVzdGlvbjogJHtxdWVzdGlvbn0sIHRlc3Q6ICR7dGVzdC50b1N0cmluZygpfSwgbWluOiAke21pbn0sIG1heDogJHttYXh9LCBpbml0aWFsOiAke2luaXRpYWx9LCBkZWZhdWx0Q29uZmlybWF0aW9uOiAke2RlZmF1bHRDb25maXJtYXRpb259LCBsaW1pdDogJHtsaW1pdH1gXG4gICAgKTtcbiAgICBjb25zdCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KG5hbWUpXG4gICAgICAuc2V0TWVzc2FnZShxdWVzdGlvbilcbiAgICAgIC5zZXRUeXBlKFwibnVtYmVyXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNaW4obWluKTtcblxuICAgIGlmICh0eXBlb2YgbWF4ID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0TWF4KG1heCk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5pbnNpc3QoXG4gICAgICB1c2VySW5wdXQsXG4gICAgICB0ZXN0IGFzIChyZXM6IHN0cmluZyB8IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICAgIGRlZmF1bHRDb25maXJtYXRpb24sXG4gICAgICBsaW1pdFxuICAgICkpIGFzIG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFVzZXMgTm9kZS5qcydzIHV0aWwucGFyc2VBcmdzIHRvIHBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYW5kIHJldHVybiB0aGUgcmVzdWx0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgcGFyc2luZyBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcnNlZCBhcmd1bWVudHMuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBwYXJzZUFyZ3MgbWV0aG9kXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyB1dGlsLnBhcnNlQXJnc1xuICAgKiAgIEMtPj5QOiBDYWxsIHdpdGggb3B0aW9uc1xuICAgKiAgIFAtPj5QOiBQcmVwYXJlIGFyZ3Mgb2JqZWN0XG4gICAqICAgUC0+PlU6IENhbGwgcGFyc2VBcmdzIHdpdGggcHJlcGFyZWQgYXJnc1xuICAgKiAgIFUtPj5QOiBSZXR1cm4gcGFyc2VkIHJlc3VsdFxuICAgKiAgIFAtLT4+QzogUmV0dXJuIFBhcnNlQXJnc1Jlc3VsdFxuICAgKi9cbiAgc3RhdGljIHBhcnNlQXJncyhvcHRpb25zOiBQYXJzZUFyZ3NPcHRpb25zQ29uZmlnKTogUGFyc2VBcmdzUmVzdWx0IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLnBhcnNlQXJncyk7XG4gICAgY29uc3QgYXJnczogUGFyc2VBcmdzQ29uZmlnID0ge1xuICAgICAgYXJnczogcHJvY2Vzcy5hcmd2LnNsaWNlKDIpLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9O1xuICAgIGxvZy5kZWJ1ZyhgUGFyc2luZyBhcmd1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncywgbnVsbCwgMil9YCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYEVycm9yIHdoaWxlIHBhcnNpbmcgYXJndW1lbnRzOlxcbiR7SlNPTi5zdHJpbmdpZnkoYXJncywgbnVsbCwgMil9XFxuIHwgb3B0aW9uc1xcbiR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucywgbnVsbCwgMil9XFxuIHwgJHtlcnJvcn1gXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBwYXJzaW5nIGFyZ3VtZW50czogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29tbWFuZCBvcHRpb25zIGZvciBDTEkgY29tbWFuZHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciBjb21tb24gY29tbWFuZC1saW5lIG9wdGlvbnMgdXNlZCBhY3Jvc3MgdmFyaW91cyBDTEkgY29tbWFuZHMuXG4gKiBAY29uc3QgRGVmYXVsdENvbW1hbmRPcHRpb25zXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWZhdWx0Q29tbWFuZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB2ZXJib3NlIC0gVmVyYm9zaXR5IGxldmVsIG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJib3NlLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgdmVyYm9zZSBvcHRpb24gKG51bWJlcikuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyYm9zZS5zaG9ydCAtIFRoZSBzaG9ydCBmbGFnIGZvciB0aGUgdmVyYm9zZSBvcHRpb24gKFYpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcmJvc2UuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB2ZXJib3NpdHkgKDApLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHZlcnNpb24gLSBWZXJzaW9uIGRpc3BsYXkgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24udHlwZSAtIFRoZSB0eXBlIG9mIHRoZSB2ZXJzaW9uIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbi5zaG9ydCAtIFRoZSBzaG9ydCBmbGFnIGZvciB0aGUgdmVyc2lvbiBvcHRpb24gKHYpLlxuICogQHByb3BlcnR5IHt1bmRlZmluZWR9IHZlcnNpb24uZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB2ZXJzaW9uIGRpc3BsYXkgKHVuZGVmaW5lZCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gaGVscCAtIEhlbHAgZGlzcGxheSBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGVscC50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGhlbHAgb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBoZWxwLnNob3J0IC0gVGhlIHNob3J0IGZsYWcgZm9yIHRoZSBoZWxwIG9wdGlvbiAoaCkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhlbHAuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBoZWxwIGRpc3BsYXkgKGZhbHNlKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbCAtIExvZyBsZXZlbCBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9nTGV2ZWwudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBsb2dMZXZlbCBvcHRpb24gKHN0cmluZykuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9nTGV2ZWwuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBsb2cgbGV2ZWwgKFwiaW5mb1wiKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dTdHlsZSAtIExvZyBzdHlsaW5nIG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsb2dTdHlsZS50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGxvZ1N0eWxlIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGxvZ1N0eWxlLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbG9nIHN0eWxpbmcgKHRydWUpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHRpbWVzdGFtcCAtIFRpbWVzdGFtcCBkaXNwbGF5IG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lc3RhbXAudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSB0aW1lc3RhbXAgb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGltZXN0YW1wLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGltZXN0YW1wIGRpc3BsYXkgKHRydWUpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGJhbm5lciAtIEJhbm5lciBkaXNwbGF5IG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBiYW5uZXIudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBiYW5uZXIgb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmFubmVyLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgYmFubmVyIGRpc3BsYXkgKGZhbHNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDb21tYW5kT3B0aW9ucyA9IHtcbiAgdmVyYm9zZToge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcIlZcIixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gIH0sXG4gIHZlcnNpb246IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJ2XCIsXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICB9LFxuICBoZWxwOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwiaFwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBsb2dMZXZlbDoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgZGVmYXVsdDogXCJpbmZvXCIsXG4gIH0sXG4gIGxvZ1N0eWxlOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgdGltZXN0YW1wOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgYmFubmVyOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29tbWFuZCB2YWx1ZXMgZGVyaXZlZCBmcm9tIERlZmF1bHRDb21tYW5kT3B0aW9ucy5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzIG9mIGFsbCBvcHRpb25zIGRlZmluZWQgaW4gRGVmYXVsdENvbW1hbmRPcHRpb25zLlxuICogQGNvbnN0IERlZmF1bHRDb21tYW5kVmFsdWVzXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWZhdWx0Q29tbWFuZFZhbHVlc1xuICogQHByb3BlcnR5IHt1bmtub3dufSBba2V5OiBzdHJpbmddIC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggb3B0aW9uIGluIERlZmF1bHRDb21tYW5kT3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDb21tYW5kVmFsdWVzOiB7XG4gIFtrIGluIGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZE9wdGlvbnNdOiB1bmtub3duO1xufSA9IE9iamVjdC5rZXlzKERlZmF1bHRDb21tYW5kT3B0aW9ucykucmVkdWNlKFxuICAoYWNjOiBSZWNvcmQ8a2V5b2YgdHlwZW9mIERlZmF1bHRDb21tYW5kT3B0aW9ucywgdW5rbm93bj4sIGtleTogc3RyaW5nKSA9PiB7XG4gICAgYWNjW2tleSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRPcHRpb25zXSA9XG4gICAgICBEZWZhdWx0Q29tbWFuZE9wdGlvbnNba2V5IGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZE9wdGlvbnNdLmRlZmF1bHQ7XG4gICAgcmV0dXJuIGFjYztcbiAgfSxcbiAge30gYXMgUmVjb3JkPGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZFZhbHVlcywgdW5rbm93bj5cbik7XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBQYWRzIHRoZSBlbmQgb2YgYSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZCBjaGFyYWN0ZXIuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBpbnB1dCBzdHJpbmcgdG8gYSBzcGVjaWZpZWQgbGVuZ3RoIGJ5IGFkZGluZyBhIHBhZGRpbmcgY2hhcmFjdGVyIHRvIHRoZSBlbmQuXG4gKiBJZiB0aGUgaW5wdXQgc3RyaW5nIGlzIGFscmVhZHkgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBwYWRkZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIGRlc2lyZWQgdG90YWwgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGFyPVwiIFwiXSAtIFRoZSBjaGFyYWN0ZXIgdG8gdXNlIGZvciBwYWRkaW5nLiBEZWZhdWx0cyB0byBhIHNwYWNlLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGFkZGVkIHN0cmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcGFkZGluZyBjaGFyYWN0ZXIgaXMgbm90IGV4YWN0bHkgb25lIGNoYXJhY3RlciBsb25nLlxuICpcbiAqIEBmdW5jdGlvbiBwYWRFbmRcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFkRW5kKFxuICBzdHI6IHN0cmluZyxcbiAgbGVuZ3RoOiBudW1iZXIsXG4gIGNoYXI6IHN0cmluZyA9IFwiIFwiXG4pOiBzdHJpbmcge1xuICBpZiAoY2hhci5sZW5ndGggIT09IDEpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXIgbGVuZ3RoIGZvciBwYWRkaW5nLiBtdXN0IGJlIG9uZSFcIik7XG4gIHJldHVybiBzdHIucGFkRW5kKGxlbmd0aCwgY2hhcik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcGxhY2VzIHBsYWNlaG9sZGVycyBpbiBhIHN0cmluZyB3aXRoIHByb3ZpZGVkIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IEludGVycG9sYXRlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgcGxhY2Vob2xkZXJzIG9mIHRoZSBmb3JtICR7dmFyaWFibGVOYW1lfVxuICogd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcyBmcm9tIHRoZSBwcm92aWRlZCBvYmplY3QuIElmIGEgcGxhY2Vob2xkZXIgZG9lc24ndCBoYXZlXG4gKiBhIGNvcnJlc3BvbmRpbmcgdmFsdWUsIGl0IGlzIGxlZnQgdW5jaGFuZ2VkIGluIHRoZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gVGhlIGlucHV0IHN0cmluZyBjb250YWluaW5nIHBsYWNlaG9sZGVycyB0byBiZSByZXBsYWNlZC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPn0gdmFsdWVzIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciByZXBsYWNlbWVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGludGVycG9sYXRlZCBzdHJpbmcgd2l0aCBwbGFjZWhvbGRlcnMgcmVwbGFjZWQgYnkgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gKlxuICogQGZ1bmN0aW9uIHBhdGNoUGxhY2Vob2xkZXJzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcGF0Y2hTdHJpbmdcbiAqICAgcGFydGljaXBhbnQgU3RyaW5nLnJlcGxhY2VcbiAqICAgQ2FsbGVyLT4+cGF0Y2hTdHJpbmc6IENhbGwgd2l0aCBpbnB1dCBhbmQgdmFsdWVzXG4gKiAgIHBhdGNoU3RyaW5nLT4+U3RyaW5nLnJlcGxhY2U6IENhbGwgd2l0aCByZWdleCBhbmQgcmVwbGFjZW1lbnQgZnVuY3Rpb25cbiAqICAgU3RyaW5nLnJlcGxhY2UtPj5wYXRjaFN0cmluZzogUmV0dXJuIHJlcGxhY2VkIHN0cmluZ1xuICogICBwYXRjaFN0cmluZy0tPj5DYWxsZXI6IFJldHVybiBwYXRjaGVkIHN0cmluZ1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFBsYWNlaG9sZGVycyhcbiAgaW5wdXQ6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+XG4pOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXQucmVwbGFjZShcbiAgICAvXFwkXFx7KFthLXpBLVowLTlfXSspXFx9L2csXG4gICAgKG1hdGNoLCB2YXJpYWJsZSkgPT4gKHZhbHVlc1t2YXJpYWJsZSBhcyBzdHJpbmddIGFzIHN0cmluZykgfHwgbWF0Y2hcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoU3RyaW5nKFxuICBpbnB1dDogc3RyaW5nLFxuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4sXG4gIGZsYWdzOiBzdHJpbmcgPSBcImdcIlxuKTogc3RyaW5nIHtcbiAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgY29uc3QgcmVnZXhwID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAoa2V5KSwgZmxhZ3MpO1xuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZShyZWdleHAsIHZhbCBhcyBzdHJpbmcpO1xuICB9KTtcbiAgcmV0dXJuIGlucHV0O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBjYW1lbENhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBjYW1lbENhc2UgZm9ybWF0LCB3aGVyZSB3b3JkcyBhcmUgam9pbmVkIHdpdGhvdXQgc3BhY2VzXG4gKiBhbmQgZWFjaCB3b3JkIGFmdGVyIHRoZSBmaXJzdCBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9DYW1lbENhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbENhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKD86Xlxcd3xbQS1aXXxcXGJcXHcpL2csICh3b3JkLCBpbmRleCkgPT5cbiAgICAgIGluZGV4ID09PSAwID8gd29yZC50b0xvd2VyQ2FzZSgpIDogd29yZC50b1VwcGVyQ2FzZSgpXG4gICAgKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBFTlZJUk9OTUVOVF9WQVJJQUJMRSBmb3JtYXQuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byB1cHBlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMsXG4gKiB0eXBpY2FsbHkgdXNlZCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gRU5WSVJPTk1FTlRfVkFSSUFCTEUgZm9ybWF0LlxuICpcbiAqIEBmdW5jdGlvbiB0b0VOVkZvcm1hdFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0VOVkZvcm1hdCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9TbmFrZUNhc2UodGV4dCkudG9VcHBlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8gc25ha2VfY2FzZS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIGxvd2VyY2FzZSB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSB1bmRlcnNjb3Jlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBzbmFrZV9jYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b1NuYWtlQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NuYWtlQ2FzZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxXyQyXCIpXG4gICAgLnJlcGxhY2UoL1tcXHMtXSsvZywgXCJfXCIpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIGtlYmFiLWNhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBsb3dlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgaHlwaGVucy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBrZWJhYi1jYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b0tlYmFiQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0tlYmFiQ2FzZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxLSQyXCIpXG4gICAgLnJlcGxhY2UoL1tcXHNfXSsvZywgXCItXCIpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIFBhc2NhbENhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBQYXNjYWxDYXNlIGZvcm1hdCwgd2hlcmUgd29yZHMgYXJlIGpvaW5lZCB3aXRob3V0IHNwYWNlc1xuICogYW5kIGVhY2ggd29yZCBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIFBhc2NhbENhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvUGFzY2FsQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1Bhc2NhbENhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKD86Xlxcd3xbQS1aXXxcXGJcXHcpL2csICh3b3JkKSA9PiB3b3JkLnRvVXBwZXJDYXNlKCkpXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7IC8vICQmIG1lYW5zIHRoZSB3aG9sZSBtYXRjaGVkIHN0cmluZ1xufVxuIiwiaW1wb3J0IHsgRW5jb2RpbmcgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPdXRwdXRXcml0ZXIgfSBmcm9tIFwiLi9PdXRwdXRXcml0ZXJcIjtcbmltcG9ydCB7IFByb21pc2VFeGVjdXRvciB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiO1xuaW1wb3J0IHsgT3V0cHV0VHlwZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4uL291dHB1dC9sb2dnaW5nXCI7XG5pbXBvcnQgeyBWZXJib3NpdHlMb2dnZXIgfSBmcm9tIFwiLi4vb3V0cHV0L3R5cGVzXCI7XG5pbXBvcnQgeyBzdHlsZSB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzdGFuZGFyZCBvdXRwdXQgd3JpdGVyIGZvciBoYW5kbGluZyBjb21tYW5kIGV4ZWN1dGlvbiBvdXRwdXQuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIE91dHB1dFdyaXRlciBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yXG4gKiBoYW5kbGluZyB2YXJpb3VzIHR5cGVzIG9mIG91dHB1dCBmcm9tIGNvbW1hbmQgZXhlY3V0aW9uLCBpbmNsdWRpbmcgc3RhbmRhcmQgb3V0cHV0LFxuICogZXJyb3Igb3V0cHV0LCBhbmQgZXhpdCBjb2Rlcy4gSXQgYWxzbyBpbmNsdWRlcyB1dGlsaXR5IG1ldGhvZHMgZm9yIHBhcnNpbmcgY29tbWFuZHNcbiAqIGFuZCByZXNvbHZpbmcgb3IgcmVqZWN0aW5nIHByb21pc2VzIGJhc2VkIG9uIGV4ZWN1dGlvbiByZXN1bHRzLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHJlc29sdmVkIHZhbHVlLCBkZWZhdWx0aW5nIHRvIG51bWJlci5cbiAqXG4gKiBAcGFyYW0gbG9jayAtIEEgUHJvbWlzZUV4ZWN1dG9yIHRvIGNvbnRyb2wgdGhlIGFzeW5jaHJvbm91cyBmbG93LlxuICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyAodW51c2VkIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uKS5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YW5kYXJkT3V0cHV0V3JpdGVyPFIgPSBzdHJpbmc+IGltcGxlbWVudHMgT3V0cHV0V3JpdGVyIHtcbiAgcHJvdGVjdGVkIGxvZ2dlcjogVmVyYm9zaXR5TG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgU3RhbmRhcmRPdXRwdXRXcml0ZXIuXG4gICAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgdGhlIFN0YW5kYXJkT3V0cHV0V3JpdGVyIHdpdGggYSBsb2NrIG1lY2hhbmlzbSBhbmQgb3B0aW9uYWwgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gY21kXG4gICAqIEBwYXJhbSBsb2NrIC0gQSBQcm9taXNlRXhlY3V0b3IgdG8gY29udHJvbCB0aGUgYXN5bmNocm9ub3VzIGZsb3cuXG4gICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgKGN1cnJlbnRseSB1bnVzZWQpLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNtZDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBsb2NrOiBQcm9taXNlRXhlY3V0b3I8Uj4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IHVua25vd25bXVxuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMuY21kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBvdXRwdXQgdG8gdGhlIGNvbnNvbGUuXG4gICAqIEBzdW1tYXJ5IEZvcm1hdHMgYW5kIGxvZ3MgdGhlIGdpdmVuIGRhdGEgd2l0aCBhIHRpbWVzdGFtcCBhbmQgdHlwZSBpbmRpY2F0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2Ygb3V0cHV0IChzdGRvdXQgb3Igc3RkZXJyKS5cbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgbG9nKHR5cGU6IE91dHB1dFR5cGUsIGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikge1xuICAgIGRhdGEgPSBCdWZmZXIuaXNCdWZmZXIoZGF0YSkgPyBkYXRhLnRvU3RyaW5nKEVuY29kaW5nKSA6IGRhdGE7XG4gICAgY29uc3QgbG9nID0gdHlwZSA9PT0gXCJzdGRlcnJcIiA/IHN0eWxlKGRhdGEpLnJlZC50ZXh0IDogZGF0YTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKGxvZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc3RhbmRhcmQgb3V0cHV0IGRhdGEuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGdpdmVuIGNodW5rIGFzIHN0YW5kYXJkIG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIGNodW5rIC0gVGhlIGRhdGEgY2h1bmsgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZGF0YShjaHVuazogYW55KSB7XG4gICAgdGhpcy5sb2coXCJzdGRvdXRcIiwgU3RyaW5nKGNodW5rKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZXJyb3Igb3V0cHV0IGRhdGEuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGdpdmVuIGNodW5rIGFzIGVycm9yIG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIGNodW5rIC0gVGhlIGVycm9yIGRhdGEgY2h1bmsgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZXJyb3IoY2h1bms6IGFueSkge1xuICAgIHRoaXMubG9nKFwic3RkZXJyXCIsIFN0cmluZyhjaHVuaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGVycm9yIG9iamVjdHMuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgZ2l2ZW4gRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIC0gVGhlIEVycm9yIG9iamVjdCB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBlcnJvcnMoZXJyOiBFcnJvcikge1xuICAgIHRoaXMubG9nKFwic3RkZXJyXCIsIGBFcnJvciBleGVjdXRpbmcgY29tbWFuZCBleGl0ZWQgOiAke2Vycn1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB0aGUgZXhpdCBvZiBhIGNvbW1hbmQuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGV4aXQgY29kZSBhbmQgcmVzb2x2ZXMgb3IgcmVqZWN0cyB0aGUgcHJvbWlzZSBiYXNlZCBvbiB0aGUgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIGNvZGUgLSBUaGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gbG9nc1xuICAgKi9cbiAgZXhpdChjb2RlOiBudW1iZXIgfCBzdHJpbmcsIGxvZ3M6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5sb2coXG4gICAgICBcInN0ZG91dFwiLFxuICAgICAgYGNvbW1hbmQgZXhpdGVkIGNvZGUgOiAke2NvZGUgPT09IDAgPyBzdHlsZShjb2RlLnRvU3RyaW5nKCkpLmdyZWVuLnRleHQgOiBzdHlsZShjb2RlID09PSBudWxsID8gXCJudWxsXCIgOiBjb2RlLnRvU3RyaW5nKCkpLnJlZC50ZXh0fWBcbiAgICApO1xuICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICB0aGlzLnJlc29sdmUobG9ncy5tYXAoKGwpID0+IGwudHJpbSgpKS5qb2luKFwiXFxuXCIpIGFzIFIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlamVjdChuZXcgRXJyb3IobG9ncy5sZW5ndGggPyBsb2dzLmpvaW4oXCJcXG5cIikgOiBjb2RlLnRvU3RyaW5nKCkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbW1hbmQgc3RyaW5nIG9yIGFycmF5IGludG8gY29tcG9uZW50cy5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIGNvbW1hbmQgaW50byBhIGNvbnNpc3RlbnQgZm9ybWF0IGFuZCBzdG9yZXMgaXQsIHRoZW4gcmV0dXJucyBpdCBzcGxpdCBpbnRvIGNvbW1hbmQgYW5kIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCBhcyBhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzLlxuICAgKiBAcmV0dXJuIEEgdHVwbGUgY29udGFpbmluZyB0aGUgY29tbWFuZCBhbmQgaXRzIGFyZ3VtZW50cyBhcyBzZXBhcmF0ZSBlbGVtZW50cy5cbiAgICovXG4gIHBhcnNlQ29tbWFuZChjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFtzdHJpbmcsIHN0cmluZ1tdXSB7XG4gICAgY29tbWFuZCA9IHR5cGVvZiBjb21tYW5kID09PSBcInN0cmluZ1wiID8gY29tbWFuZC5zcGxpdChcIiBcIikgOiBjb21tYW5kO1xuICAgIHRoaXMuY21kID0gY29tbWFuZC5qb2luKFwiIFwiKTtcbiAgICByZXR1cm4gW2NvbW1hbmRbMF0sIGNvbW1hbmQuc2xpY2UoMSldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyB0aGUgcHJvbWlzZSB3aXRoIGEgc3VjY2VzcyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgc3VjY2VzcyBtZXNzYWdlIGFuZCByZXNvbHZlcyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBnaXZlbiByZWFzb24uXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBUaGUgcmVhc29uIGZvciByZXNvbHZpbmcgdGhlIHByb21pc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZShyZWFzb246IFIpIHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIFwic3Rkb3V0XCIsXG4gICAgICBgJHt0aGlzLmNtZH0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5OiAke3N0eWxlKHJlYXNvbiA/IFwicmFuIHRvIGNvbXBsZXRpb25cIiA6IChyZWFzb24gYXMgc3RyaW5nKSkuZ3JlZW59YFxuICAgICk7XG4gICAgdGhpcy5sb2NrLnJlc29sdmUocmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVqZWN0cyB0aGUgcHJvbWlzZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYW4gZXJyb3IgbWVzc2FnZSBhbmQgcmVqZWN0cyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBnaXZlbiByZWFzb24uXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBUaGUgcmVhc29uIGZvciByZWplY3RpbmcgdGhlIHByb21pc2UsIGVpdGhlciBhIG51bWJlciAoZXhpdCBjb2RlKSBvciBhIHN0cmluZy5cbiAgICovXG4gIHByb3RlY3RlZCByZWplY3QocmVhc29uOiBudW1iZXIgfCBzdHJpbmcgfCBFcnJvcikge1xuICAgIGlmICghKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgcmVhc29uID0gbmV3IEVycm9yKFxuICAgICAgICB0eXBlb2YgcmVhc29uID09PSBcIm51bWJlclwiID8gYEV4aXQgY29kZSAke3JlYXNvbn1gIDogcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmxvZyhcbiAgICAgIFwic3RkZXJyXCIsXG4gICAgICBgJHt0aGlzLmNtZH0gZmFpbGVkIHRvIGV4ZWN1dGU6ICR7c3R5bGUocmVhc29uLm1lc3NhZ2UpLnJlZH1gXG4gICAgKTtcbiAgICB0aGlzLmxvY2sucmVqZWN0KHJlYXNvbik7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENoaWxkUHJvY2Vzc1dpdGhvdXROdWxsU3RyZWFtcyxcbiAgc3Bhd24sXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbn0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IFN0YW5kYXJkT3V0cHV0V3JpdGVyIH0gZnJvbSBcIi4uL3dyaXRlcnMvU3RhbmRhcmRPdXRwdXRXcml0ZXJcIjtcbmltcG9ydCB7IENvbW1hbmRSZXN1bHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCIuLi9vdXRwdXQvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgT3V0cHV0V3JpdGVyQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vd3JpdGVycy90eXBlc1wiO1xuaW1wb3J0IHsgVmVyYm9zaXR5TG9nZ2VyIH0gZnJvbSBcIi4uL291dHB1dC90eXBlc1wiO1xuaW1wb3J0IHsgQWJvcnRDb2RlIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBsb2NrZWQgdmVyc2lvbiBvZiBhIGZ1bmN0aW9uLlxuICogQHN1bW1hcnkgVGhpcyBoaWdoZXItb3JkZXIgZnVuY3Rpb24gdGFrZXMgYSBmdW5jdGlvbiBhbmQgcmV0dXJucyBhIG5ldyBmdW5jdGlvbiB0aGF0IGVuc3VyZXNcbiAqIHNlcXVlbnRpYWwgZXhlY3V0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiwgZXZlbiB3aGVuIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBjb25jdXJyZW50bHkuXG4gKiBJdCB1c2VzIGEgUHJvbWlzZS1iYXNlZCBsb2NraW5nIG1lY2hhbmlzbSB0byBxdWV1ZSBmdW5jdGlvbiBjYWxscy5cbiAqXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaW5wdXQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGYgLSBUaGUgZnVuY3Rpb24gdG8gYmUgbG9ja2VkLiBJdCBjYW4gdGFrZSBhbnkgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIHJldHVybiBhIHZhbHVlIG9mIHR5cGUgUi5cbiAqIEByZXR1cm4gQSBuZXcgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYXMgdGhlIGlucHV0IGZ1bmN0aW9uLCBidXQgd2l0aCBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBndWFyYW50ZWVkLlxuICpcbiAqIEBmdW5jdGlvbiBsb2NraWZ5XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgTG9ja2VkRnVuY3Rpb25cbiAqICAgcGFydGljaXBhbnQgT3JpZ2luYWxGdW5jdGlvblxuICogICBDYWxsZXItPj5Mb2NrZWRGdW5jdGlvbjogQ2FsbCB3aXRoIHBhcmFtc1xuICogICBMb2NrZWRGdW5jdGlvbi0+PkxvY2tlZEZ1bmN0aW9uOiBDaGVjayBjdXJyZW50IGxvY2tcbiAqICAgYWx0IExvY2sgaXMgcmVzb2x2ZWRcbiAqICAgICBMb2NrZWRGdW5jdGlvbi0+Pk9yaWdpbmFsRnVuY3Rpb246IEV4ZWN1dGUgd2l0aCBwYXJhbXNcbiAqICAgICBPcmlnaW5hbEZ1bmN0aW9uLS0+PkxvY2tlZEZ1bmN0aW9uOiBSZXR1cm4gcmVzdWx0XG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tLT4+Q2FsbGVyOiBSZXR1cm4gcmVzdWx0XG4gKiAgIGVsc2UgTG9jayBpcyBwZW5kaW5nXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogUXVldWUgZXhlY3V0aW9uXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tLT4+Q2FsbGVyOiBSZXR1cm4gcHJvbWlzZVxuICogICAgIE5vdGUgb3ZlciBMb2NrZWRGdW5jdGlvbjogV2FpdCBmb3IgcHJldmlvdXMgZXhlY3V0aW9uXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tPj5PcmlnaW5hbEZ1bmN0aW9uOiBFeGVjdXRlIHdpdGggcGFyYW1zXG4gKiAgICAgT3JpZ2luYWxGdW5jdGlvbi0tPj5Mb2NrZWRGdW5jdGlvbjogUmV0dXJuIHJlc3VsdFxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmVzb2x2ZSBwcm9taXNlIHdpdGggcmVzdWx0XG4gKiAgIGVuZFxuICogICBMb2NrZWRGdW5jdGlvbi0+PkxvY2tlZEZ1bmN0aW9uOiBVcGRhdGUgbG9ja1xuICpcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tpZnk8Uj4oZjogKC4uLnBhcmFtczogdW5rbm93bltdKSA9PiBSKSB7XG4gIGxldCBsb2NrOiBQcm9taXNlPFIgfCB2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gKC4uLnBhcmFtczogdW5rbm93bltdKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gbG9jay50aGVuKCgpID0+IGYoLi4ucGFyYW1zKSk7XG4gICAgbG9jayA9IHJlc3VsdC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYWluQWJvcnRDb250cm9sbGVyKFxuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIsXG4gIC4uLnNpZ25hbHM6IEFib3J0U2lnbmFsW11cbik6IEFib3J0Q29udHJvbGxlcjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgLi4uc2lnbmFsczogQWJvcnRTaWduYWxbXVxuKTogQWJvcnRDb250cm9sbGVyO1xuZXhwb3J0IGZ1bmN0aW9uIGNoYWluQWJvcnRDb250cm9sbGVyKFxuICBhcmd1bWVudDA6IEFib3J0Q29udHJvbGxlciB8IEFib3J0U2lnbmFsLFxuICAuLi5yZW1haW5kZXI6IEFib3J0U2lnbmFsW11cbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGxldCBzaWduYWxzOiBBYm9ydFNpZ25hbFtdO1xuICBsZXQgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8vIG5vcm1hbGl6ZSBhcmdzXG4gIGlmIChhcmd1bWVudDAgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgc2lnbmFscyA9IFthcmd1bWVudDAsIC4uLnJlbWFpbmRlcl07XG4gIH0gZWxzZSB7XG4gICAgY29udHJvbGxlciA9IGFyZ3VtZW50MDtcbiAgICBzaWduYWxzID0gcmVtYWluZGVyO1xuICB9XG5cbiAgLy8gaWYgdGhlIGNvbnRyb2xsZXIgaXMgYWxyZWFkeSBhYm9ydGVkLCBleGl0IGVhcmx5XG4gIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXI7XG4gIH1cblxuICBjb25zdCBoYW5kbGVyID0gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHtcbiAgICAvLyBjaGVjayBiZWZvcmUgYWRkaW5nISAoYW5kIGFzc3VtZSB0aGVyZSBpcyBubyBwb3NzaWJsZSB3YXkgdGhhdCB0aGUgc2lnbmFsIGNvdWxkXG4gICAgLy8gYWJvcnQgYmV0d2VlbiB0aGUgYGlmYCBjaGVjayBhbmQgYWRkaW5nIHRoZSBldmVudCBsaXN0ZW5lcilcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGhhbmRsZXIsIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3bkNvbW1hbmQ8UiA9IHN0cmluZz4oXG4gIG91dHB1dDogU3RhbmRhcmRPdXRwdXRXcml0ZXI8Uj4sXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0czogU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBhYm9ydDogQWJvcnRDb250cm9sbGVyLFxuICBsb2dnZXI6IFZlcmJvc2l0eUxvZ2dlclxuKTogQ2hpbGRQcm9jZXNzV2l0aG91dE51bGxTdHJlYW1zIHtcbiAgZnVuY3Rpb24gc3Bhd25Jbm5lcihjb21tYW5kOiBzdHJpbmcsIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcikge1xuICAgIGNvbnN0IFtjbWQsIGFyZ3pdID0gb3V0cHV0LnBhcnNlQ29tbWFuZChjb21tYW5kKTtcbiAgICBsb2dnZXIuaW5mbyhgUnVubmluZyBjb21tYW5kOiAke2NtZH1gKTtcbiAgICBsb2dnZXIuZGVidWcoYHdpdGggYXJnczogJHthcmd6LmpvaW4oXCIgXCIpfWApO1xuICAgIGNvbnN0IGNoaWxkUHJvY2VzcyA9IHNwYXduKGNtZCwgYXJneiwge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGN3ZDogb3B0cy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgIGVudjogT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYsIG9wdHMuZW52LCB7IFBBVEg6IHByb2Nlc3MuZW52LlBBVEggfSksXG4gICAgICBzaGVsbDogb3B0cy5zaGVsbCB8fCBmYWxzZSxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgbG9nZ2VyLnZlcmJvc2UoYHBpZCA6ICR7Y2hpbGRQcm9jZXNzLnBpZH1gKTtcbiAgICByZXR1cm4gY2hpbGRQcm9jZXNzO1xuICB9XG5cbiAgY29uc3QgbSA9IGNvbW1hbmQubWF0Y2goL1s8PiQjXS9nKTtcbiAgaWYgKG0pXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgY29tbWFuZDogJHtjb21tYW5kfS4gY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzOiAke219YFxuICAgICk7XG4gIGlmIChjb21tYW5kLmluY2x1ZGVzKFwiIHwgXCIpKSB7XG4gICAgY29uc3QgY21kcyA9IGNvbW1hbmQuc3BsaXQoXCIgfCBcIik7XG4gICAgY29uc3Qgc3Bhd25zID0gW107XG4gICAgY29uc3QgY29udHJvbGxlcnMgPSBuZXcgQXJyYXkoY21kcy5sZW5ndGgpO1xuICAgIGNvbnRyb2xsZXJzWzBdID0gYWJvcnQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaSAhPT0gMClcbiAgICAgICAgY29udHJvbGxlcnNbaV0gPSBjaGFpbkFib3J0Q29udHJvbGxlcihjb250cm9sbGVyc1tpIC0gMV0uc2lnbmFsKTtcbiAgICAgIHNwYXducy5wdXNoKHNwYXduSW5uZXIoY21kc1tpXSwgY29udHJvbGxlcnNbaV0pKTtcbiAgICAgIGlmIChpID09PSAwKSBjb250aW51ZTtcbiAgICAgIHNwYXduc1tpIC0gMV0uc3Rkb3V0LnBpcGUoc3Bhd25zW2ldLnN0ZGluKTtcbiAgICB9XG4gICAgcmV0dXJuIHNwYXduc1tjbWRzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgcmV0dXJuIHNwYXduSW5uZXIoY29tbWFuZCwgYWJvcnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIGNvbW1hbmQgYXN5bmNocm9ub3VzbHkgd2l0aCBjdXN0b21pemFibGUgb3V0cHV0IGhhbmRsaW5nLlxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBydW5zIGEgc2hlbGwgY29tbWFuZCBhcyBhIGNoaWxkIHByb2Nlc3MsIHByb3ZpZGluZyBmaW5lLWdyYWluZWRcbiAqIGNvbnRyb2wgb3ZlciBpdHMgZXhlY3V0aW9uIGFuZCBvdXRwdXQgaGFuZGxpbmcuIEl0IHN1cHBvcnRzIGN1c3RvbSBvdXRwdXQgd3JpdGVycyxcbiAqIGFsbG93cyBmb3IgY29tbWFuZCBhYm9ydGlvbiwgYW5kIGNhcHR1cmVzIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcmVzb2x2ZWQgdmFsdWUgZnJvbSB0aGUgY29tbWFuZCBleGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW4sIGVpdGhlciBhcyBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdHMgLSBTcGF3biBvcHRpb25zIGZvciB0aGUgY2hpbGQgcHJvY2Vzcy4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuICogQHBhcmFtIG91dHB1dENvbnN0cnVjdG9yIC0gQ29uc3RydWN0b3IgZm9yIHRoZSBvdXRwdXQgd3JpdGVyLiBEZWZhdWx0cyB0byBTdGFuZGFyZE91dHB1dFdyaXRlci5cbiAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb3V0cHV0IGNvbnN0cnVjdG9yLlxuICogQHJldHVybiB7Q29tbWFuZFJlc3VsdH0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbW1hbmQgcmVzdWx0IG9mIHR5cGUgUi5cbiAqXG4gKiBAZnVuY3Rpb24gcnVuQ29tbWFuZFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHJ1bkNvbW1hbmRcbiAqICAgcGFydGljaXBhbnQgT3V0cHV0V3JpdGVyXG4gKiAgIHBhcnRpY2lwYW50IENoaWxkUHJvY2Vzc1xuICogICBDYWxsZXItPj5ydW5Db21tYW5kOiBDYWxsIHdpdGggY29tbWFuZCBhbmQgb3B0aW9uc1xuICogICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBDcmVhdGUgbmV3IGluc3RhbmNlXG4gKiAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IFBhcnNlIGNvbW1hbmRcbiAqICAgcnVuQ29tbWFuZC0+PkNoaWxkUHJvY2VzczogU3Bhd24gcHJvY2Vzc1xuICogICBDaGlsZFByb2Nlc3MtLT4+cnVuQ29tbWFuZDogUmV0dXJuIHByb2Nlc3Mgb2JqZWN0XG4gKiAgIHJ1bkNvbW1hbmQtPj5DaGlsZFByb2Nlc3M6IFNldCB1cCBldmVudCBsaXN0ZW5lcnNcbiAqICAgbG9vcCBGb3IgZWFjaCBzdGRvdXQgZGF0YVxuICogICAgIENoaWxkUHJvY2Vzcy0+PnJ1bkNvbW1hbmQ6IEVtaXQgc3Rkb3V0IGRhdGFcbiAqICAgICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBIYW5kbGUgc3Rkb3V0IGRhdGFcbiAqICAgZW5kXG4gKiAgIGxvb3AgRm9yIGVhY2ggc3RkZXJyIGRhdGFcbiAqICAgICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IHN0ZGVyciBkYXRhXG4gKiAgICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogSGFuZGxlIHN0ZGVyciBkYXRhXG4gKiAgIGVuZFxuICogICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IGVycm9yIChpZiBhbnkpXG4gKiAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IEhhbmRsZSBlcnJvclxuICogICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IGV4aXRcbiAqICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogSGFuZGxlIGV4aXRcbiAqICAgT3V0cHV0V3JpdGVyLS0+PnJ1bkNvbW1hbmQ6IFJlc29sdmUgb3IgcmVqZWN0IHByb21pc2VcbiAqICAgcnVuQ29tbWFuZC0tPj5DYWxsZXI6IFJldHVybiBDb21tYW5kUmVzdWx0XG4gKlxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29tbWFuZDxSID0gc3RyaW5nPihcbiAgY29tbWFuZDogc3RyaW5nLFxuICBvcHRzOiBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8gPSB7fSxcbiAgb3V0cHV0Q29uc3RydWN0b3I6IE91dHB1dFdyaXRlckNvbnN0cnVjdG9yPFxuICAgIFIsXG4gICAgU3RhbmRhcmRPdXRwdXRXcml0ZXI8Uj4sXG4gICAgRXJyb3JcbiAgPiA9IFN0YW5kYXJkT3V0cHV0V3JpdGVyPFI+LFxuICAuLi5hcmdzOiB1bmtub3duW11cbik6IENvbW1hbmRSZXN1bHQ8Uj4ge1xuICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihydW5Db21tYW5kKTtcbiAgY29uc3QgYWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgY29uc3QgcmVzdWx0OiBPbWl0PENvbW1hbmRSZXN1bHQsIFwicHJvbWlzZVwiIHwgXCJwaXBlXCI+ID0ge1xuICAgIGFib3J0OiBhYm9ydCxcbiAgICBjb21tYW5kOiBjb21tYW5kLFxuICAgIGxvZ3M6IFtdLFxuICAgIGVycnM6IFtdLFxuICB9O1xuXG4gIGNvbnN0IGxvY2sgPSBuZXcgUHJvbWlzZTxSPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IG91dHB1dDtcbiAgICB0cnkge1xuICAgICAgb3V0cHV0ID0gbmV3IG91dHB1dENvbnN0cnVjdG9yKFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3QsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG5cbiAgICAgIHJlc3VsdC5jbWQgPSBzcGF3bkNvbW1hbmQ8Uj4ob3V0cHV0LCBjb21tYW5kLCBvcHRzLCBhYm9ydCwgbG9nZ2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgRXJyb3IgcnVubmluZyBjb21tYW5kICR7Y29tbWFuZH06ICR7ZX1gKSk7XG4gICAgfVxuXG4gICAgcmVzdWx0LmNtZC5zdGRvdXQuc2V0RW5jb2RpbmcoXCJ1dGY4XCIpO1xuXG4gICAgcmVzdWx0LmNtZC5zdGRvdXQub24oXCJkYXRhXCIsIChjaHVuazogYW55KSA9PiB7XG4gICAgICBjaHVuayA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgICByZXN1bHQubG9ncy5wdXNoKGNodW5rKTtcbiAgICAgIG91dHB1dC5kYXRhKGNodW5rKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5jbWQuc3RkZXJyLm9uKFwiZGF0YVwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBkYXRhID0gZGF0YS50b1N0cmluZygpO1xuICAgICAgcmVzdWx0LmVycnMucHVzaChkYXRhKTtcbiAgICAgIG91dHB1dC5lcnJvcihkYXRhKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5jbWQub25jZShcImVycm9yXCIsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICBvdXRwdXQuZXhpdChlcnIubWVzc2FnZSwgcmVzdWx0LmVycnMpO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0LmNtZC5vbmNlKFwiZXhpdFwiLCAoY29kZTogbnVtYmVyID0gMCkgPT4ge1xuICAgICAgaWYgKGFib3J0LnNpZ25hbC5hYm9ydGVkICYmIGNvZGUgPT09IG51bGwpIGNvZGUgPSBBYm9ydENvZGUgYXMgYW55O1xuICAgICAgb3V0cHV0LmV4aXQoY29kZSwgY29kZSA9PT0gMCA/IHJlc3VsdC5sb2dzIDogcmVzdWx0LmVycnMpO1xuICAgIH0pO1xuICB9KTtcblxuICBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgIHByb21pc2U6IGxvY2ssXG4gICAgcGlwZTogYXN5bmMgPEU+KGNiOiAocjogUikgPT4gRSkgPT4ge1xuICAgICAgY29uc3QgbCA9IGxvZ2dlci5mb3IoXCJwaXBlXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbC52ZXJib3NlKGBFeGVjdXRpbmcgcGlwZSBmdW5jdGlvbiAke2NvbW1hbmR9Li4uYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUiA9IGF3YWl0IGxvY2s7XG4gICAgICAgIGwudmVyYm9zZShgUGlwaW5nIG91dHB1dCB0byAke2NiLm5hbWV9OiAke3Jlc3VsdH1gKTtcbiAgICAgICAgcmV0dXJuIGNiKHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGwuZXJyb3IoYEVycm9yIHBpcGluZyBjb21tYW5kIG91dHB1dDogJHtlfWApO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQgYXMgQ29tbWFuZFJlc3VsdDxSPjtcbn1cbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4uL291dHB1dC9sb2dnaW5nXCI7XG5pbXBvcnQgeyBwYXRjaFN0cmluZyB9IGZyb20gXCIuL3RleHRcIjtcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeU1hcCwgU2ltcGxlRGVwZW5kZW5jeU1hcCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKFwiZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhdGNoZXMgYSBmaWxlIHdpdGggZ2l2ZW4gdmFsdWVzLlxuICogQHN1bW1hcnkgUmVhZHMgYSBmaWxlLCBhcHBsaWVzIHBhdGNoZXMgdXNpbmcgVGV4dFV0aWxzLCBhbmQgd3JpdGVzIHRoZSByZXN1bHQgYmFjayB0byB0aGUgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIHBhdGNoZWQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz59IHZhbHVlcyAtIFRoZSB2YWx1ZXMgdG8gcGF0Y2ggaW50byB0aGUgZmlsZS5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHBhdGNoRmlsZVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHBhdGNoRmlsZVxuICogICBwYXJ0aWNpcGFudCBmc1xuICogICBwYXJ0aWNpcGFudCByZWFkRmlsZVxuICogICBwYXJ0aWNpcGFudCBUZXh0VXRpbHNcbiAqICAgcGFydGljaXBhbnQgd3JpdGVGaWxlXG4gKiAgIENhbGxlci0+PnBhdGNoRmlsZTogQ2FsbCB3aXRoIHBhdGggYW5kIHZhbHVlc1xuICogICBwYXRjaEZpbGUtPj5mczogQ2hlY2sgaWYgZmlsZSBleGlzdHNcbiAqICAgcGF0Y2hGaWxlLT4+cmVhZEZpbGU6IFJlYWQgZmlsZSBjb250ZW50XG4gKiAgIHJlYWRGaWxlLT4+ZnM6IFJlYWQgZmlsZVxuICogICBmcy0tPj5yZWFkRmlsZTogUmV0dXJuIGZpbGUgY29udGVudFxuICogICByZWFkRmlsZS0tPj5wYXRjaEZpbGU6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgcGF0Y2hGaWxlLT4+VGV4dFV0aWxzOiBQYXRjaCBzdHJpbmdcbiAqICAgVGV4dFV0aWxzLS0+PnBhdGNoRmlsZTogUmV0dXJuIHBhdGNoZWQgY29udGVudFxuICogICBwYXRjaEZpbGUtPj53cml0ZUZpbGU6IFdyaXRlIHBhdGNoZWQgY29udGVudFxuICogICB3cml0ZUZpbGUtPj5mczogV3JpdGUgdG8gZmlsZVxuICogICBmcy0tPj53cml0ZUZpbGU6IEZpbGUgd3JpdHRlblxuICogICB3cml0ZUZpbGUtLT4+cGF0Y2hGaWxlOiBGaWxlIHdyaXR0ZW5cbiAqICAgcGF0Y2hGaWxlLS0+PkNhbGxlcjogUGF0Y2hpbmcgY29tcGxldGVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZzLXV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaEZpbGUoXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+XG4pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihwYXRjaEZpbGUpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCBhdCBwYXRoIFwiJHtwYXRofVwiLmApO1xuICBsZXQgY29udGVudCA9IHJlYWRGaWxlKHBhdGgpO1xuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFBhdGNoaW5nIGZpbGUgXCIke3BhdGh9XCIuLi5gKTtcbiAgICBsb2cuZGVidWcoYHdpdGggdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWVzKX1gKTtcbiAgICBjb250ZW50ID0gcGF0Y2hTdHJpbmcoY29udGVudCwgdmFsdWVzKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHBhdGNoaW5nIGZpbGU6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgd3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIGZpbGUgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQuXG4gKiBAc3VtbWFyeSBSZWFkcyB0aGUgY29udGVudCBvZiBhIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGFuZCByZXR1cm5zIGl0IGFzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgcmVhZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuXG4gKlxuICogQGZ1bmN0aW9uIHJlYWRGaWxlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihyZWFkRmlsZSk7XG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFJlYWRpbmcgZmlsZSBcIiR7cGF0aH1cIi4uLmApO1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciByZWFkaW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciByZWFkaW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gV3JpdGVzIGRhdGEgdG8gYSBmaWxlLlxuICogQHN1bW1hcnkgV3JpdGVzIHRoZSBwcm92aWRlZCBkYXRhIHRvIGEgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSB3cml0dGVuLlxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IGRhdGEgLSBUaGUgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlLlxuICogQHJldHVybiB7dm9pZH1cbiAqXG4gKiBAZnVuY3Rpb24gd3JpdGVGaWxlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVGaWxlKHBhdGg6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKTogdm9pZCB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3Iod3JpdGVGaWxlKTtcbiAgdHJ5IHtcbiAgICBsb2cudmVyYm9zZShgV3JpdGluZyBmaWxlIFwiJHtwYXRofSB3aXRoICR7ZGF0YS5sZW5ndGh9IGJ5dGVzLi4uYCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLCBkYXRhLCBcInV0ZjhcIik7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoYEVycm9yIHdyaXRpbmcgZmlsZSBcIiR7cGF0aH1cIjogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdyaXRpbmcgZmlsZSBcIiR7cGF0aH1cIjogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIGZpbGVzIHJlY3Vyc2l2ZWx5IGZyb20gYSBkaXJlY3RvcnkuXG4gKiBAc3VtbWFyeSBUcmF2ZXJzZXMgdGhyb3VnaCBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMgdG8gY29sbGVjdCBhbGwgZmlsZSBwYXRocy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcCAtIFRoZSBwYXRoIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tLlxuICogQHBhcmFtIGZpbHRlclxuICogQHJldHVybiB7c3RyaW5nW119IEFycmF5IG9mIGZpbGUgcGF0aHMuXG4gKlxuICogQGZ1bmN0aW9uIGdldEFsbEZpbGVzXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsRmlsZXMoXG4gIHA6IHN0cmluZyxcbiAgZmlsdGVyPzogKGY6IHN0cmluZywgaT86IG51bWJlcikgPT4gYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKGdldEFsbEZpbGVzKTtcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgdHJ5IHtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBhbGwgZmlsZXMgZnJvbSBcIiR7cH1cIi4uLmApO1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhwKTtcblxuICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHAsIGVudHJ5KTtcbiAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aCk7XG5cbiAgICAgIGlmIChzdGF0LmlzRmlsZSgpKSB7XG4gICAgICAgIGZpbGVzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgZmlsZXMucHVzaCguLi5nZXRBbGxGaWxlcyhmdWxsUGF0aCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghZmlsdGVyKSByZXR1cm4gZmlsZXM7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmaWx0ZXIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciByZXRyaWV2aW5nIGZpbGVzIGZyb20gXCIke3B9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciByZXRyaWV2aW5nIGZpbGVzIGZyb20gXCIke3B9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmFtZUZpbGUoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHJlbmFtZUZpbGUpO1xuICBsZXQgZGVzY3JpcHRvclNvdXJjZSwgZGVzY3JpcHRvckRlc3Q7XG5cbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yU291cmNlID0gZnMuc3RhdFN5bmMoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGRlc2NyaXB0b3JEZXN0ID0gZnMuc3RhdFN5bmMoZGVzdCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgLy8gZG8gbm90aGluZy4gaXRzIG9rXG4gIH1cbiAgaWYgKGRlc2NyaXB0b3JEZXN0KSB7XG4gICAgbG9nLnZlcmJvc2UoYERlc3RpbmF0aW9uIHBhdGggXCIke2Rlc3R9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlc3RpbmF0aW9uIHBhdGggXCIke2Rlc3R9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgUmVuYW1pbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fS4uLmBcbiAgICApO1xuICAgIGZzLnJlbmFtZVN5bmMoc291cmNlLCBkZXN0KTtcbiAgICBsb2cudmVyYm9zZShgU3VjY2Vzc2Z1bGx5IHJlbmFtZWQgdG8gXCIke2Rlc3R9XCJgKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBFcnJvciByZW5hbWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9XCI6ICR7ZXJyb3J9YFxuICAgICk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVycm9yIHJlbmFtaW5nICR7ZGVzY3JpcHRvclNvdXJjZS5pc0ZpbGUoKSA/IFwiZmlsZVwiIDogXCJkaXJlY3RvcnlcIn0gXCIke3NvdXJjZX1cIiB0byBcIiR7ZGVzdH1cIjogJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weUZpbGUoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKGNvcHlGaWxlKTtcbiAgbGV0IGRlc2NyaXB0b3JTb3VyY2UsIGRlc2NyaXB0b3JEZXN0O1xuICB0cnkge1xuICAgIGRlc2NyaXB0b3JTb3VyY2UgPSBmcy5zdGF0U3luYyhzb3VyY2UpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBTb3VyY2UgcGF0aCBcIiR7c291cmNlfVwiIGRvZXMgbm90IGV4aXN0OiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZXNjcmlwdG9yRGVzdCA9IGZzLnN0YXRTeW5jKGRlc3QpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoZGVzY3JpcHRvclNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBsb2cudmVyYm9zZShgRGVzdCBwYXRoIFwiJHtkZXN0fVwiIGRvZXMgbm90IGV4aXN0LiBjcmVhdGluZ2ApO1xuICAgICAgZnMubWtkaXJTeW5jKGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgQ29weWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9Li4uYFxuICAgICk7XG4gICAgZnMuY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgRXJyb3IgY29weWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9OiAke2Vycm9yfWBcbiAgICApO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFcnJvciBjb3B5aW5nICR7ZGVzY3JpcHRvclNvdXJjZS5pc0ZpbGUoKSA/IFwiZmlsZVwiIDogXCJkaXJlY3RvcnlcIn0gXCIke3NvdXJjZX1cIiB0byBcIiR7ZGVzdH06ICR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZVBhdGgocDogc3RyaW5nKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoZGVsZXRlUGF0aCk7XG4gIHRyeSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGZzLnN0YXRTeW5jKHApO1xuICAgIGlmIChkZXNjcmlwdG9yLmlzRmlsZSgpKSB7XG4gICAgICBsb2cudmVyYm9zZShgRGVsZXRpbmcgZmlsZSBcIiR7cH0uLi5gKTtcbiAgICAgIGZzLnJtU3luYyhwLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yLmlzRGlyZWN0b3J5KCkpXG4gICAgICBmcy5ybVN5bmMocCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciBEZWxldGluZyBcIiR7cH1cIjogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIERlbGV0aW5nIFwiJHtwfVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBwYWNrYWdlIGluZm9ybWF0aW9uIGZyb20gcGFja2FnZS5qc29uLlxuICogQHN1bW1hcnkgTG9hZHMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGUgZnJvbSBhIHNwZWNpZmllZCBkaXJlY3Rvcnkgb3IgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIENhbiByZXR1cm4gdGhlIGVudGlyZSBwYWNrYWdlIG9iamVjdCBvciBhIHNwZWNpZmljIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtwPXByb2Nlc3MuY3dkKCldIC0gVGhlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBPcHRpb25hbC4gVGhlIHNwZWNpZmljIHByb3BlcnR5IHRvIHJldHJpZXZlIGZyb20gcGFja2FnZS5qc29uLlxuICogQHJldHVybiB7b2JqZWN0IHwgc3RyaW5nfSBUaGUgcGFyc2VkIGNvbnRlbnRzIG9mIHBhY2thZ2UuanNvbiBvciB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBmdW5jdGlvbiBnZXRQYWNrYWdlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZXRQYWNrYWdlXG4gKiAgIHBhcnRpY2lwYW50IHJlYWRGaWxlXG4gKiAgIHBhcnRpY2lwYW50IEpTT05cbiAqICAgQ2FsbGVyLT4+Z2V0UGFja2FnZTogQ2FsbCB3aXRoIHBhdGggYW5kIG9wdGlvbmFsIHByb3BlcnR5XG4gKiAgIGdldFBhY2thZ2UtPj5yZWFkRmlsZTogUmVhZCBwYWNrYWdlLmpzb25cbiAqICAgcmVhZEZpbGUtLT4+Z2V0UGFja2FnZTogUmV0dXJuIGZpbGUgY29udGVudFxuICogICBnZXRQYWNrYWdlLT4+SlNPTjogUGFyc2UgZmlsZSBjb250ZW50XG4gKiAgIEpTT04tLT4+Z2V0UGFja2FnZTogUmV0dXJuIHBhcnNlZCBvYmplY3RcbiAqICAgYWx0IHByb3BlcnR5IHNwZWNpZmllZFxuICogICAgIGdldFBhY2thZ2UtPj5nZXRQYWNrYWdlOiBDaGVjayBpZiBwcm9wZXJ0eSBleGlzdHNcbiAqICAgICBhbHQgcHJvcGVydHkgZXhpc3RzXG4gKiAgICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogUmV0dXJuIHByb3BlcnR5IHZhbHVlXG4gKiAgICAgZWxzZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0XG4gKiAgICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogVGhyb3cgRXJyb3JcbiAqICAgICBlbmRcbiAqICAgZWxzZSBubyBwcm9wZXJ0eSBzcGVjaWZpZWRcbiAqICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogUmV0dXJuIGVudGlyZSBwYWNrYWdlIG9iamVjdFxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2UoXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIHByb3BlcnR5Pzogc3RyaW5nXG4pOiBvYmplY3QgfCBzdHJpbmcge1xuICBsZXQgcGtnOiBhbnk7XG4gIHRyeSB7XG4gICAgcGtnID0gSlNPTi5wYXJzZShyZWFkRmlsZShwYXRoLmpvaW4ocCwgYHBhY2thZ2UuanNvbmApKSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgcGFja2FnZSBpbmZvcm1hdGlvblwiICR7ZXJyb3J9YCk7XG4gIH1cblxuICBpZiAocHJvcGVydHkpIHtcbiAgICBpZiAoIShwcm9wZXJ0eSBpbiBwa2cpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSBcIiR7cHJvcGVydHl9XCIgbm90IGZvdW5kIGluIHBhY2thZ2UuanNvbmApO1xuICAgIHJldHVybiBwa2dbcHJvcGVydHldIGFzIHN0cmluZztcbiAgfVxuICByZXR1cm4gcGtnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UGFja2FnZUF0dHJpYnV0ZShcbiAgYXR0cjogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpXG4pOiB2b2lkIHtcbiAgY29uc3QgcGtnID0gZ2V0UGFja2FnZShwKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwa2dbYXR0cl0gPSB2YWx1ZTtcbiAgd3JpdGVGaWxlKHBhdGguam9pbihwLCBgcGFja2FnZS5qc29uYCksIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHZlcnNpb24gZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAc3VtbWFyeSBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY2FsbHMgZ2V0UGFja2FnZSB0byByZXRyaWV2ZSB0aGUgXCJ2ZXJzaW9uXCIgcHJvcGVydHkgZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3A9cHJvY2Vzcy5jd2QoKV0gLSBUaGUgZGlyZWN0b3J5IHBhdGggd2hlcmUgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGlzIGxvY2F0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJzaW9uIHN0cmluZyBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEBmdW5jdGlvbiBnZXRQYWNrYWdlVmVyc2lvblxuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZVZlcnNpb24ocCA9IHByb2Nlc3MuY3dkKCkpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0UGFja2FnZShwLCBcInZlcnNpb25cIikgYXMgc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBwcm9qZWN0LlxuICogQHN1bW1hcnkgRXhlY3V0ZXMgJ25wbSBscyAtLWpzb24nIGNvbW1hbmQgdG8gZ2V0IGEgZGV0YWlsZWQgbGlzdCBvZiBhbGwgZGVwZW5kZW5jaWVzIChwcm9kdWN0aW9uLCBkZXZlbG9wbWVudCwgYW5kIHBlZXIpIGFuZCB0aGVpciB2ZXJzaW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aD1wcm9jZXNzLmN3ZCgpXSAtIFRoZSBkaXJlY3RvcnkgcGF0aCBvZiB0aGUgcHJvamVjdC5cbiAqIEByZXR1cm4ge1Byb21pc2U8e3Byb2Q6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ30+LCBkZXY6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ30+LCBwZWVyOiBBcnJheTx7bmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9Pn0+fSBBbiBvYmplY3QgY29udGFpbmluZyBhcnJheXMgb2YgcHJvZHVjdGlvbiwgZGV2ZWxvcG1lbnQsIGFuZCBwZWVyIGRlcGVuZGVuY2llcy5cbiAqIEBmdW5jdGlvbiBnZXREZXBlbmRlbmNpZXNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGdldERlcGVuZGVuY2llc1xuICogICBwYXJ0aWNpcGFudCBydW5Db21tYW5kXG4gKiAgIHBhcnRpY2lwYW50IEpTT05cbiAqICAgQ2FsbGVyLT4+Z2V0RGVwZW5kZW5jaWVzOiBDYWxsIHdpdGggb3B0aW9uYWwgcGF0aFxuICogICBnZXREZXBlbmRlbmNpZXMtPj5ydW5Db21tYW5kOiBFeGVjdXRlICducG0gbHMgLS1qc29uJ1xuICogICBydW5Db21tYW5kLS0+PmdldERlcGVuZGVuY2llczogUmV0dXJuIGNvbW1hbmQgb3V0cHV0XG4gKiAgIGdldERlcGVuZGVuY2llcy0+PkpTT046IFBhcnNlIGNvbW1hbmQgb3V0cHV0XG4gKiAgIEpTT04tLT4+Z2V0RGVwZW5kZW5jaWVzOiBSZXR1cm4gcGFyc2VkIG9iamVjdFxuICogICBnZXREZXBlbmRlbmNpZXMtPj5nZXREZXBlbmRlbmNpZXM6IFByb2Nlc3MgZGVwZW5kZW5jaWVzXG4gKiAgIGdldERlcGVuZGVuY2llcy0tPj5DYWxsZXI6IFJldHVybiBwcm9jZXNzZWQgZGVwZW5kZW5jaWVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZzLXV0aWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMoXG4gIHBhdGg6IHN0cmluZyA9IHByb2Nlc3MuY3dkKClcbik6IFByb21pc2U8RGVwZW5kZW5jeU1hcD4ge1xuICBsZXQgcGtnOiBhbnk7XG5cbiAgdHJ5IHtcbiAgICBwa2cgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBscyAtLWpzb25gLCB7IGN3ZDogcGF0aCB9KS5wcm9taXNlKTtcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJldHJpZXZlIGRlcGVuZGVuY2llczogJHtlfWApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBjb25zdCBtYXBwZXIgPSAoZW50cnk6IFtzdHJpbmcsIHVua25vd25dLCBpbmRleDogbnVtYmVyKSA9PiAoe1xuICAgIG5hbWU6IGVudHJ5WzBdLFxuICAgIHZlcnNpb246IChlbnRyeVsxXSBhcyBhbnkpLnZlcnNpb24sXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJvZDogT2JqZWN0LmVudHJpZXMocGtnLmRlcGVuZGVuY2llcyB8fCB7fSkubWFwKG1hcHBlciksXG4gICAgZGV2OiBPYmplY3QuZW50cmllcyhwa2cuZGV2RGVwZW5kZW5jaWVzIHx8IHt9KS5tYXAobWFwcGVyKSxcbiAgICBwZWVyOiBPYmplY3QuZW50cmllcyhwa2cucGVlckRlcGVuZGVuY2llcyB8fCB7fSkubWFwKG1hcHBlciksXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEZXBlbmRlbmNpZXMoKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IodXBkYXRlRGVwZW5kZW5jaWVzKTtcbiAgbG9nLmluZm8oXCJjaGVja2luZyBmb3IgdXBkYXRlcy4uLlwiKTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcIm5weCBucG0tY2hlY2stdXBkYXRlcyAtdVwiKS5wcm9taXNlO1xuICBsb2cuaW5mbyhcInVwZGF0aW5nLi4uXCIpO1xuICBhd2FpdCBydW5Db21tYW5kKFwibnB4IG5wbSBydW4gZG8taW5zdGFsbFwiKS5wcm9taXNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbElmTm90QXZhaWxhYmxlKFxuICBkZXBzOiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgZGVwZW5kZW5jaWVzPzogU2ltcGxlRGVwZW5kZW5jeU1hcFxuKSB7XG4gIGlmICghZGVwZW5kZW5jaWVzKSB7XG4gICAgY29uc3QgZDogRGVwZW5kZW5jeU1hcCA9IGF3YWl0IGdldERlcGVuZGVuY2llcygpO1xuICAgIGRlcGVuZGVuY2llcyA9IHtcbiAgICAgIHByb2Q6IGQucHJvZD8ubWFwKChwKSA9PiBwLm5hbWUpIHx8IFtdLFxuICAgICAgZGV2OiBkLmRldj8ubWFwKChkKSA9PiBkLm5hbWUpIHx8IFtdLFxuICAgICAgcGVlcjogZC5wZWVyPy5tYXAoKHApID0+IHAubmFtZSkgfHwgW10sXG4gICAgfTtcbiAgfVxuICBjb25zdCB7IHByb2QsIGRldiwgcGVlciB9ID0gZGVwZW5kZW5jaWVzO1xuICBjb25zdCBpbnN0YWxsZWQgPSBBcnJheS5mcm9tKFxuICAgIG5ldyBTZXQoWy4uLihwcm9kIHx8IFtdKSwgLi4uKGRldiB8fCBbXSksIC4uLihwZWVyIHx8IFtdKV0pXG4gICk7XG4gIGRlcHMgPSB0eXBlb2YgZGVwcyA9PT0gXCJzdHJpbmdcIiA/IFtkZXBzXSA6IGRlcHM7XG4gIGNvbnN0IHRvSW5zdGFsbCA9IGRlcHMuZmlsdGVyKChkKSA9PiAhaW5zdGFsbGVkLmluY2x1ZGVzKGQpKTtcblxuICBpZiAodG9JbnN0YWxsLmxlbmd0aCkgYXdhaXQgaW5zdGFsbERlcGVuZGVuY2llcyh7IGRldjogdG9JbnN0YWxsIH0pO1xuICBkZXBlbmRlbmNpZXMuZGV2ID0gZGVwZW5kZW5jaWVzLmRldiB8fCBbXTtcbiAgZGVwZW5kZW5jaWVzLmRldi5wdXNoKC4uLnRvSW5zdGFsbCk7XG4gIHJldHVybiBkZXBlbmRlbmNpZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdXNoVG9HaXQoKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocHVzaFRvR2l0KTtcbiAgY29uc3QgZ2l0VXNlciA9IGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgY29uZmlnIHVzZXIubmFtZVwiKS5wcm9taXNlO1xuICBjb25zdCBnaXRFbWFpbCA9IGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgY29uZmlnIHVzZXIuZW1haWxcIikucHJvbWlzZTtcbiAgbG9nLnZlcmJvc2UoYGNhY2hlZCBnaXQgaWQ6ICR7Z2l0VXNlcn0vJHtnaXRFbWFpbH0uIGNoYW5naW5nIHRvIGF1dG9tYXRpb25gKTtcbiAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0IGNvbmZpZyB1c2VyLmVtYWlsIFwiYXV0b21hdGlvbkBkZWNhZi50c1wiJykucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0IGNvbmZpZyB1c2VyLm5hbWUgXCJkZWNhZlwiJykucHJvbWlzZTtcbiAgbG9nLmluZm8oXCJQdXNoaW5nIGNoYW5nZXMgdG8gZ2l0Li4uXCIpO1xuICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IGFkZCAuXCIpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoYGdpdCBjb21taXQgLW0gXCJyZWZzICMxIC0gYWZ0ZXIgcmVwbyBzZXR1cFwiYCkucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBwdXNoXCIpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoYGdpdCBjb25maWcgdXNlci5lbWFpbCBcIiR7Z2l0RW1haWx9XCJgKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKGBnaXQgY29uZmlnIHVzZXIubmFtZSBcIiR7Z2l0VXNlcn1cImApLnByb21pc2U7XG4gIGxvZy52ZXJib3NlKGByZXZlcnRlZCB0byBnaXQgaWQ6ICR7Z2l0VXNlcn0vJHtnaXRFbWFpbH1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzOiB7XG4gIHByb2Q/OiBzdHJpbmdbXTtcbiAgZGV2Pzogc3RyaW5nW107XG4gIHBlZXI/OiBzdHJpbmdbXTtcbn0pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihpbnN0YWxsRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgcHJvZCA9IGRlcGVuZGVuY2llcy5wcm9kIHx8IFtdO1xuICBjb25zdCBkZXYgPSBkZXBlbmRlbmNpZXMuZGV2IHx8IFtdO1xuICBjb25zdCBwZWVyID0gZGVwZW5kZW5jaWVzLnBlZXIgfHwgW107XG4gIGlmIChwcm9kLmxlbmd0aCkge1xuICAgIGxvZy5pbmZvKGBJbnN0YWxsaW5nIGRlcGVuZGVuY2llcyAke3Byb2Quam9pbihcIiwgXCIpfS4uLmApO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBpbnN0YWxsICR7cHJvZC5qb2luKFwiIFwiKX1gLCB7IGN3ZDogcHJvY2Vzcy5jd2QoKSB9KVxuICAgICAgLnByb21pc2U7XG4gIH1cbiAgaWYgKGRldi5sZW5ndGgpIHtcbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBkZXZEZXBlbmRlbmNpZXMgJHtkZXYuam9pbihcIiwgXCIpfS4uLmApO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBpbnN0YWxsIC0tc2F2ZS1kZXYgJHtkZXYuam9pbihcIiBcIil9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnByb21pc2U7XG4gIH1cbiAgaWYgKHBlZXIubGVuZ3RoKSB7XG4gICAgbG9nLmluZm8oYEluc3RhbGxpbmcgcGVlckRlcGVuZGVuY2llcyAke3BlZXIuam9pbihcIiwgXCIpfS4uLmApO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBpbnN0YWxsIC0tc2F2ZS1wZWVyICR7cGVlci5qb2luKFwiIFwiKX1gLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSkucHJvbWlzZTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplSW1wb3J0PFQ+KFxuICBpbXBvcnRQcm9taXNlOiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgLy8gQ29tbW9uSlMncyBgbW9kdWxlLmV4cG9ydHNgIGlzIHdyYXBwZWQgYXMgYGRlZmF1bHRgIGluIEVTTW9kdWxlLlxuICByZXR1cm4gaW1wb3J0UHJvbWlzZS50aGVuKChtOiBhbnkpID0+IChtLmRlZmF1bHQgfHwgbSkgYXMgVCk7XG59XG4iLCJpbXBvcnQgeyBWZXJib3NpdHlMb2dnZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHNsb2dhbnMgZnJvbSBcIi4uL2Fzc2V0cy9zbG9nYW5zLmpzb25cIjtcbmltcG9ydCB7IHN0eWxlIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBBTlNJIGNvbG9yIGNvZGVzIGZvciBiYW5uZXIgc3R5bGluZy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBzZXQgb2YgQU5TSSBjb2xvciBjb2RlcyB1c2VkIHRvIHN0eWxlIHRoZSBiYW5uZXIgdGV4dC5cbiAqL1xuY29uc3QgY29sb3JzID0gW1xuICBcIlxceDFiWzM4OzU7MjE1bVwiLCAvLyBzb2Z0IG9yYW5nZVxuICBcIlxceDFiWzM4OzU7MjA5bVwiLCAvLyBjb3JhbFxuICBcIlxceDFiWzM4OzU7MjA1bVwiLCAvLyBwaW5rXG4gIFwiXFx4MWJbMzg7NTsyMTBtXCIsIC8vIHBlYWNoeVxuICBcIlxceDFiWzM4OzU7MjE3bVwiLCAvLyBzYWxtb25cbiAgXCJcXHgxYlszODs1OzIxNm1cIiwgLy8gbGlnaHQgY29yYWxcbiAgXCJcXHgxYlszODs1OzIyNG1cIiwgLy8gbGlnaHQgcGVhY2hcbiAgXCJcXHgxYlszODs1OzIzMG1cIiwgLy8gc29mdCBjcmVhbVxuICBcIlxceDFiWzM4OzU7MjMwbVwiLCAvLyBzb2Z0IGNyZWFtXG5dO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmludHMgYSBzdHlsZWQgYmFubmVyIHRvIHRoZSBjb25zb2xlLlxuICogQHN1bW1hcnkgR2VuZXJhdGVzIGFuZCBwcmludHMgYSBjb2xvcmZ1bCBBU0NJSSBhcnQgYmFubmVyIHdpdGggYSByYW5kb20gc2xvZ2FuLlxuICogQHBhcmFtIHtWZXJib3NpdHlMb2dnZXJ9IFtsb2dnZXJdIC0gT3B0aW9uYWwgbG9nZ2VyIGZvciB2ZXJib3NlIG91dHB1dC5cbiAqIEBmdW5jdGlvbiBwcmludEJhbm5lclxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBwcmludEJhbm5lclxuICogICBwYXJ0aWNpcGFudCBnZXRTbG9nYW5cbiAqICAgcGFydGljaXBhbnQgcGFkRW5kXG4gKiAgIHBhcnRpY2lwYW50IGNvbnNvbGVcbiAqICAgcHJpbnRCYW5uZXItPj5nZXRTbG9nYW46IENhbGwgZ2V0U2xvZ2FuKClcbiAqICAgZ2V0U2xvZ2FuLS0+PnByaW50QmFubmVyOiBSZXR1cm4gcmFuZG9tIHNsb2dhblxuICogICBwcmludEJhbm5lci0+PnByaW50QmFubmVyOiBDcmVhdGUgYmFubmVyIEFTQ0lJIGFydFxuICogICBwcmludEJhbm5lci0+PnByaW50QmFubmVyOiBTcGxpdCBiYW5uZXIgaW50byBsaW5lc1xuICogICBwcmludEJhbm5lci0+PnByaW50QmFubmVyOiBDYWxjdWxhdGUgbWF4IGxpbmUgbGVuZ3RoXG4gKiAgIHByaW50QmFubmVyLT4+cGFkRW5kOiBDYWxsIHBhZEVuZCB3aXRoIHNsb2dhblxuICogICBwYWRFbmQtLT4+cHJpbnRCYW5uZXI6IFJldHVybiBwYWRkZWQgc2xvZ2FuIGxpbmVcbiAqICAgbG9vcCBGb3IgZWFjaCBiYW5uZXIgbGluZVxuICogICAgIHByaW50QmFubmVyLT4+c3R5bGU6IENhbGwgc3R5bGUobGluZSlcbiAqICAgICBzdHlsZS0tPj5wcmludEJhbm5lcjogUmV0dXJuIHN0eWxlZCBsaW5lXG4gKiAgICAgcHJpbnRCYW5uZXItPj5jb25zb2xlOiBMb2cgc3R5bGVkIGxpbmVcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludEJhbm5lcihsb2dnZXI/OiBWZXJib3NpdHlMb2dnZXIpIHtcbiAgY29uc3QgbWVzc2FnZSA9IGdldFNsb2dhbigpO1xuICBjb25zdCBiYW5uZXI6IHN0cmluZyB8IHN0cmluZ1tdID1cbiAgICBgIyAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRIFxuIyAgICAgICggKCAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICBcbiMgICAgICAgKSApICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIFxuIyAgICBbPT09PT09PV0gICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgXG4jICAgICBcXGAtLS0tLcK0ICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSBcbiMgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgXG4jICAgICAgICAgICAgICAgICDilpHilpLilpPilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgXG4jYC5zcGxpdChcIlxcblwiKTtcbiAgY29uc3QgbWF4TGVuZ3RoID0gYmFubmVyLnJlZHVjZSgobWF4LCBsaW5lKSA9PiBNYXRoLm1heChtYXgsIGxpbmUubGVuZ3RoKSwgMCk7XG4gIGJhbm5lci5wdXNoKGAjICAke21lc3NhZ2UucGFkU3RhcnQobWF4TGVuZ3RoIC0gMyl9YCk7XG4gIGJhbm5lci5mb3JFYWNoKChsaW5lLCBpbmRleCkgPT4ge1xuICAgIChsb2dnZXIgPyBsb2dnZXIuaW5mby5iaW5kKGxvZ2dlcikgOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpKShcbiAgICAgIHN0eWxlKGxpbmUgfHwgXCJcIikucmF3KGNvbG9yc1tpbmRleF0pLnRleHRcbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc2xvZ2FuIGZyb20gdGhlIHByZWRlZmluZWQgbGlzdC5cbiAqIEBzdW1tYXJ5IEZldGNoZXMgYSByYW5kb20gc2xvZ2FuIG9yIGEgc3BlY2lmaWMgb25lIGJ5IGluZGV4IGZyb20gdGhlIHNsb2dhbnMgbGlzdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaV0gLSBPcHRpb25hbCBpbmRleCB0byByZXRyaWV2ZSBhIHNwZWNpZmljIHNsb2dhbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNlbGVjdGVkIHNsb2dhbi5cbiAqIEBmdW5jdGlvbiBnZXRTbG9nYW5cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgZ2V0U2xvZ2FuXG4gKiAgIHBhcnRpY2lwYW50IE1hdGgucmFuZG9tXG4gKiAgIHBhcnRpY2lwYW50IHNsb2dhbnNcbiAqICAgYWx0IGkgaXMgdW5kZWZpbmVkXG4gKiAgICAgZ2V0U2xvZ2FuLT4+TWF0aC5yYW5kb206IEdlbmVyYXRlIHJhbmRvbSBpbmRleFxuICogICAgIE1hdGgucmFuZG9tLS0+PmdldFNsb2dhbjogUmV0dXJuIHJhbmRvbSBpbmRleFxuICogICBlbHNlIGkgaXMgZGVmaW5lZFxuICogICAgIE5vdGUgb3ZlciBnZXRTbG9nYW46IFVzZSBwcm92aWRlZCBpbmRleFxuICogICBlbmRcbiAqICAgZ2V0U2xvZ2FuLT4+c2xvZ2FuczogQWNjZXNzIHNsb2dhbiBhdCBpbmRleFxuICogICBzbG9nYW5zLS0+PmdldFNsb2dhbjogUmV0dXJuIHNsb2dhblxuICogICBhbHQgRXJyb3Igb2NjdXJzXG4gKiAgICAgZ2V0U2xvZ2FuLT4+Z2V0U2xvZ2FuOiBUaHJvdyBlcnJvclxuICogICBlbmRcbiAqICAgZ2V0U2xvZ2FuLS0+PkNhbGxlcjogUmV0dXJuIHNsb2dhblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xvZ2FuKGk/OiBudW1iZXIpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGkgPVxuICAgICAgdHlwZW9mIGkgPT09IFwidW5kZWZpbmVkXCIgPyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzbG9nYW5zLmxlbmd0aCkgOiBpO1xuICAgIHJldHVybiBzbG9nYW5zW2ldLlNsb2dhbjtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXRyaWV2ZSBzbG9nYW5zOiAke2Vycm9yfWApO1xuICB9XG59XG4iLCIvKipcbiAqIEBjbGFzcyBPYmplY3RBY2N1bXVsYXRvclxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgYWNjdW11bGF0ZWQgb2JqZWN0LCBleHRlbmRzIG9iamVjdFxuICogQGRlc2NyaXB0aW9uIEEgY2xhc3MgdGhhdCBhY2N1bXVsYXRlcyBvYmplY3RzIGFuZCBwcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIHRoZWlyIHByb3BlcnRpZXMuXG4gKiBJdCBhbGxvd3MgZm9yIGR5bmFtaWMgYWRkaXRpb24gb2YgcHJvcGVydGllcyB3aGlsZSBtYWludGFpbmluZyB0eXBlIGluZm9ybWF0aW9uLlxuICogQHN1bW1hcnkgQWNjdW11bGF0ZXMgb2JqZWN0cyBhbmQgbWFpbnRhaW5zIHR5cGUgaW5mb3JtYXRpb24gZm9yIGFjY3VtdWxhdGVkIHByb3BlcnRpZXNcbiAqIEBtZW1iZXJPZiB1dGlsc1xuICovXG5leHBvcnQgY2xhc3MgT2JqZWN0QWNjdW11bGF0b3I8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaXplIG9mIHRoZSBhY2N1bXVsYXRlZCBvYmplY3RcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIHByaXZhdGUgX19zaXplITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9fc2l6ZVwiLCB7XG4gICAgICB2YWx1ZTogMCxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGRlc2NyaXB0aW9uIEV4cGFuZHMgdGhlIGFjY3VtdWxhdG9yIHdpdGggcHJvcGVydGllcyBmcm9tIGEgbmV3IG9iamVjdFxuICAgKiBAc3VtbWFyeSBBZGRzIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZSBhY2N1bXVsYXRvclxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgZXhwYW5kZWRcbiAgICogQHBhcmFtIHtWfSB2YWx1ZSAtIFRoZSBvYmplY3QgdG8gZXhwYW5kIHdpdGhcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwcm90ZWN0ZWQgZXhwYW5kPFYgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWKTogdm9pZCB7XG4gICAgT2JqZWN0LmVudHJpZXModmFsdWUpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGssIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB2LFxuICAgICAgICBzZXQ6ICh2YWw6IFZba2V5b2YgVl0pID0+IHtcbiAgICAgICAgICB2ID0gdmFsO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWNjdW11bGF0ZXMgYSBuZXcgb2JqZWN0IGludG8gdGhlIGFjY3VtdWxhdG9yXG4gICAqIEBzdW1tYXJ5IEFkZHMgcHJvcGVydGllcyBmcm9tIGEgbmV3IG9iamVjdCB0byB0aGUgYWNjdW11bGF0b3IsIG1haW50YWluaW5nIHR5cGUgaW5mb3JtYXRpb25cbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGFjY3VtdWxhdGVkXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBUaGUgb2JqZWN0IHRvIGFjY3VtdWxhdGVcbiAgICogQHJldHVybnMgQSBuZXcgT2JqZWN0QWNjdW11bGF0b3IgaW5zdGFuY2Ugd2l0aCB1cGRhdGVkIHR5cGUgaW5mb3JtYXRpb25cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBY2N1bXVsYXRvclxuICAgKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JqZWN0XG4gICAqICAgQS0+Pk86IEdldCBlbnRyaWVzXG4gICAqICAgbG9vcCBGb3IgZWFjaCBlbnRyeVxuICAgKiAgICAgQS0+PkE6IERlZmluZSBwcm9wZXJ0eVxuICAgKiAgIGVuZFxuICAgKiAgIEEtPj5BOiBVcGRhdGUgc2l6ZVxuICAgKiAgIEEtPj5BOiBSZXR1cm4gdXBkYXRlZCBhY2N1bXVsYXRvclxuICAgKi9cbiAgYWNjdW11bGF0ZTxWIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVik6IFQgJiBWICYgT2JqZWN0QWNjdW11bGF0b3I8VCAmIFY+IHtcbiAgICB0aGlzLmV4cGFuZCh2YWx1ZSk7XG4gICAgdGhpcy5fX3NpemUgPSB0aGlzLl9fc2l6ZSArIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUICYgViAmIE9iamVjdEFjY3VtdWxhdG9yPFQgJiBWPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgdmFsdWUgZnJvbSB0aGUgYWNjdW11bGF0b3IgYnkgaXRzIGtleVxuICAgKiBAc3VtbWFyeSBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgYWNjdW11bGF0ZWQgb2JqZWN0IHVzaW5nIGEgdHlwZS1zYWZlIGtleVxuICAgKiBAdGVtcGxhdGUgSyAtIFRoZSBrZXkgdHlwZSwgbXVzdCBiZSBhIGtleSBvZiB0aGlzXG4gICAqIEBwYXJhbSB7S30ga2V5IC0gVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMge2FueSB8IHVuZGVmaW5lZH0gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBnZXQ8SyBleHRlbmRzIGtleW9mIHRoaXM+KGtleTogSyk6IHRoaXNbS10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzW2tleV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIGtleSBleGlzdHMgaW4gdGhlIGFjY3VtdWxhdG9yXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciB0aGUgYWNjdW11bGF0b3IgY29udGFpbnMgYSBzcGVjaWZpYyBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUga2V5IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzW2tleSBhcyBrZXlvZiB0aGlzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGFjY3VtdWxhdG9yXG4gICAqIEBzdW1tYXJ5IERlbGV0ZXMgYSBwcm9wZXJ0eSBmcm9tIHRoZSBhY2N1bXVsYXRlZCBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7fSBUaGUgYWNjdW11bGF0b3IgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHJlbW92ZWRcbiAgICovXG4gIHJlbW92ZShcbiAgICBrZXk6IGtleW9mIHRoaXMgfCBzdHJpbmdcbiAgKTpcbiAgICB8IChPbWl0PHRoaXMsIHR5cGVvZiBrZXk+ICYgT2JqZWN0QWNjdW11bGF0b3I8T21pdDx0aGlzLCB0eXBlb2Yga2V5Pj4pXG4gICAgfCB0aGlzIHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcykpIHJldHVybiB0aGlzO1xuXG4gICAgZGVsZXRlIHRoaXNba2V5IGFzIGtleW9mIHRoaXNdO1xuICAgIHRoaXMuX19zaXplLS07XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBPbWl0PHRoaXMsIHR5cGVvZiBrZXk+ICZcbiAgICAgIE9iamVjdEFjY3VtdWxhdG9yPE9taXQ8dGhpcywgdHlwZW9mIGtleT4+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIGtleXMgZnJvbSB0aGUgYWNjdW11bGF0b3JcbiAgICogQHN1bW1hcnkgR2V0cyBhbiBhcnJheSBvZiBhbGwgYWNjdW11bGF0ZWQgcHJvcGVydHkga2V5c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFuIGFycmF5IG9mIGtleXMgYXMgc3RyaW5nc1xuICAgKi9cbiAga2V5cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIHZhbHVlcyBmcm9tIHRoZSBhY2N1bXVsYXRvclxuICAgKiBAc3VtbWFyeSBHZXRzIGFuIGFycmF5IG9mIGFsbCBhY2N1bXVsYXRlZCBwcm9wZXJ0eSB2YWx1ZXNcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdmFsdWVzXG4gICAqL1xuICB2YWx1ZXMoKTogVFtrZXlvZiBUXVtdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgYWNjdW11bGF0b3JcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY291bnQgb2YgYWNjdW11bGF0ZWQgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGtleS12YWx1ZSBwYWlyc1xuICAgKi9cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9fc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYXJzIGFsbCBhY2N1bXVsYXRlZCBrZXktdmFsdWUgcGFpcnNcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBhY2N1bXVsYXRvciBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSBpbnN0YW5jZVxuICAgKiBAcmV0dXJucyB7T2JqZWN0QWNjdW11bGF0b3I8bmV2ZXI+fSBBIG5ldyBlbXB0eSBPYmplY3RBY2N1bXVsYXRvciBpbnN0YW5jZVxuICAgKi9cbiAgY2xlYXIoKTogT2JqZWN0QWNjdW11bGF0b3I8bmV2ZXI+IHtcbiAgICByZXR1cm4gbmV3IE9iamVjdEFjY3VtdWxhdG9yKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgY2FsbGJhY2sgZm9yIGVhY2gga2V5LXZhbHVlIHBhaXIgaW4gdGhlIGFjY3VtdWxhdG9yXG4gICAqIEBzdW1tYXJ5IEl0ZXJhdGVzIG92ZXIgYWxsIGFjY3VtdWxhdGVkIHByb3BlcnRpZXMsIGNhbGxpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGFueSwgc3RyaW5nLCBudW1iZXIpOiB2b2lkfSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIGVudHJ5XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZm9yRWFjaChcbiAgICBjYWxsYmFjazogKHZhbHVlOiB0aGlzW2tleW9mIHRoaXNdLCBrZXk6IGtleW9mIHRoaXMsIGk6IG51bWJlcikgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyh0aGlzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0sIGkpID0+XG4gICAgICBjYWxsYmFjayh2YWx1ZSwga2V5IGFzIGtleW9mIHRoaXMsIGkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBhcnJheSB3aXRoIHRoZSByZXN1bHRzIG9mIGNhbGxpbmcgYSBwcm92aWRlZCBmdW5jdGlvbiBvbiBldmVyeSBlbGVtZW50IGluIHRoZSBhY2N1bXVsYXRvclxuICAgKiBAc3VtbWFyeSBNYXBzIGVhY2ggYWNjdW11bGF0ZWQgcHJvcGVydHkgdG8gYSBuZXcgdmFsdWUgdXNpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBtYXBwZWQgdmFsdWVzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oYW55LCBzdHJpbmcsbnVtYmVyKTogUn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGVsZW1lbnQgb2YgdGhlIG5ldyBhcnJheVxuICAgKiBAcmV0dXJucyB7UltdfSBBIG5ldyBhcnJheSB3aXRoIGVhY2ggZWxlbWVudCBiZWluZyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKi9cbiAgbWFwPFI+KFxuICAgIGNhbGxiYWNrOiAodmFsdWU6IHRoaXNba2V5b2YgdGhpc10sIGtleToga2V5b2YgdGhpcywgaTogbnVtYmVyKSA9PiBSXG4gICk6IFJbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMpLm1hcCgoW2tleSwgdmFsdWVdLCBpKSA9PlxuICAgICAgY2FsbGJhY2sodmFsdWUsIGtleSBhcyBrZXlvZiB0aGlzLCBpKVxuICAgICk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGZ1bmN0aW9uIGlzQnJvd3NlclxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBicm93c2VyIGJ5IGNoZWNraW5nIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgdGhlIGdsb2JhbCBvYmplY3QuXG4gKiBAc3VtbWFyeSBDaGVja3MgaWYgdGhlIGNvZGUgaXMgcnVubmluZyBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgYSBicm93c2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWxUaGlzKSkgIT09XG4gICAgT2JqZWN0LnByb3RvdHlwZVxuICApO1xufVxuIiwiaW1wb3J0IHsgdG9FTlZGb3JtYXQgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBPYmplY3RBY2N1bXVsYXRvciB9IGZyb20gXCIuL2FjY3VtdWxhdG9yXCI7XG5pbXBvcnQgeyBFbnZpcm9ubWVudEZhY3RvcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSBcIi4vd2ViXCI7XG5cbi8qKlxuICogQGNsYXNzIEVudmlyb25tZW50XG4gKiBAZXh0ZW5kcyB7T2JqZWN0QWNjdW11bGF0b3I8VD59XG4gKiBAdGVtcGxhdGUgVFxuICogQGRlc2NyaXB0aW9uIEEgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGVudmlyb25tZW50IHdpdGggYWNjdW11bGF0aW9uIGNhcGFiaWxpdGllcy5cbiAqIEBzdW1tYXJ5IE1hbmFnZXMgZW52aXJvbm1lbnQtcmVsYXRlZCBkYXRhIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBhY2N1bXVsYXRpb24gYW5kIGtleSByZXRyaWV2YWwuXG4gKiBAcGFyYW0ge1R9IFtpbml0aWFsRGF0YV0gLSBUaGUgaW5pdGlhbCBkYXRhIHRvIHBvcHVsYXRlIHRoZSBlbnZpcm9ubWVudCB3aXRoLlxuICovXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnQ8VCBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBPYmplY3RBY2N1bXVsYXRvcjxUPiB7XG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGRlc2NyaXB0aW9uIEEgZmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgRW52aXJvbm1lbnQgaW5zdGFuY2VzLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGhvdyBuZXcgaW5zdGFuY2VzIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcyBzaG91bGQgYmUgY3JlYXRlZC5cbiAgICogQHJldHVybiB7RW52aXJvbm1lbnQ8YW55Pn0gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBmYWN0b3J5OiBFbnZpcm9ubWVudEZhY3Rvcnk8YW55LCBhbnk+ID1cbiAgICAoKTogRW52aXJvbm1lbnQ8YW55PiA9PiBuZXcgRW52aXJvbm1lbnQoKTtcblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqIEB0eXBlIHtFbnZpcm9ubWVudDxhbnk+fVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBFbnZpcm9ubWVudDxhbnk+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZyb21FbnYoazogc3RyaW5nKSB7XG4gICAgbGV0IGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgICBlbnYgPSAoZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHsgRU5WOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0pW1xuICAgICAgICBcIkVOVlwiXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnYgPSBnbG9iYWxUaGlzLnByb2Nlc3MuZW52O1xuICAgICAgayA9IHRvRU5WRm9ybWF0KGspO1xuICAgIH1cbiAgICByZXR1cm4gZW52W2tdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGV4cGFuZDxWIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVik6IHZvaWQge1xuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZyb21FbnYgPSB0aGlzLmZyb21FbnYoayk7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBmcm9tRW52ID09PSBcInVuZGVmaW5lZFwiID8gdiA6IGZyb21FbnY7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKHZhbDogVltrZXlvZiBWXSkgPT4ge1xuICAgICAgICAgIHYgPSB2YWw7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGNyZWF0ZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzIGV4aXN0cy5cbiAgICogQHRlbXBsYXRlIEVcbiAgICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZmFjdG9yeSBmdW5jdGlvbiBpZiBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkLlxuICAgKiBAcmV0dXJuIHtFfSBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgaW5zdGFuY2U8RSBleHRlbmRzIEVudmlyb25tZW50PGFueT4+KC4uLmFyZ3M6IHVua25vd25bXSk6IEUge1xuICAgIEVudmlyb25tZW50Ll9pbnN0YW5jZSA9ICFFbnZpcm9ubWVudC5faW5zdGFuY2VcbiAgICAgID8gRW52aXJvbm1lbnQuZmFjdG9yeSguLi5hcmdzKVxuICAgICAgOiBFbnZpcm9ubWVudC5faW5zdGFuY2U7XG4gICAgcmV0dXJuIEVudmlyb25tZW50Ll9pbnN0YW5jZSBhcyBFO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIEFjY3VtdWxhdGVzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgQWRkcyBuZXcgcHJvcGVydGllcyB0byB0aGUgZW52aXJvbm1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICAgKiBAdGVtcGxhdGUgVlxuICAgKiBAcGFyYW0ge1Z9IHZhbHVlIC0gVGhlIG9iamVjdCB0byBhY2N1bXVsYXRlIGludG8gdGhlIGVudmlyb25tZW50LlxuICAgKiBAcmV0dXJuIHtWfSBUaGUgdXBkYXRlZCBlbnZpcm9ubWVudCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBhY2N1bXVsYXRlPFYgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHZhbHVlOiBWXG4gICk6IHR5cGVvZiBFbnZpcm9ubWVudC5faW5zdGFuY2UgJlxuICAgIFYgJlxuICAgIE9iamVjdEFjY3VtdWxhdG9yPHR5cGVvZiBFbnZpcm9ubWVudC5faW5zdGFuY2UgJiBWPiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBFbnZpcm9ubWVudC5pbnN0YW5jZSgpO1xuICAgIHJldHVybiBpbnN0YW5jZS5hY2N1bXVsYXRlKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGtleXMgb2YgdGhlIGVudmlyb25tZW50LCBvcHRpb25hbGx5IGNvbnZlcnRpbmcgdGhlbSB0byBFTlYgZm9ybWF0LlxuICAgKiBAc3VtbWFyeSBHZXRzIGFsbCBrZXlzIGluIHRoZSBlbnZpcm9ubWVudCwgd2l0aCBhbiBvcHRpb24gdG8gZm9ybWF0IHRoZW0gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbdG9FbnY9dHJ1ZV0gLSBXaGV0aGVyIHRvIGNvbnZlcnQgdGhlIGtleXMgdG8gRU5WIGZvcm1hdC5cbiAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIGtleXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICBzdGF0aWMga2V5cyh0b0VudjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50Lmluc3RhbmNlKClcbiAgICAgIC5rZXlzKClcbiAgICAgIC5tYXAoKGspID0+ICh0b0VudiA/IHRvRU5WRm9ybWF0KGspIDogaykpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQYXJzZUFyZ3NSZXN1bHQgfSBmcm9tIFwiLi4vaW5wdXQvdHlwZXNcIjtcbmltcG9ydCB7IExvZ2dpbmdDb25maWcsIFZlcmJvc2l0eUxvZ2dlciB9IGZyb20gXCIuLi9vdXRwdXQvdHlwZXNcIjtcbmltcG9ydCB7IENvbW1hbmRPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiLi4vb3V0cHV0L2xvZ2dpbmdcIjtcbmltcG9ydCB7IERlZmF1bHRMb2dnaW5nQ29uZmlnLCBMb2dMZXZlbCB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFVzZXJJbnB1dCB9IGZyb20gXCIuLi9pbnB1dC9pbnB1dFwiO1xuaW1wb3J0IHsgRGVmYXVsdENvbW1hbmRPcHRpb25zLCBEZWZhdWx0Q29tbWFuZFZhbHVlcyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVwZW5kZW5jaWVzLCBnZXRQYWNrYWdlVmVyc2lvbiB9IGZyb20gXCIuLi91dGlscy9mc1wiO1xuaW1wb3J0IHsgcHJpbnRCYW5uZXIgfSBmcm9tIFwiLi4vb3V0cHV0L2NvbW1vblwiO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvZW52aXJvbm1lbnRcIjtcblxuLyoqXG4gKiBAY2xhc3MgQ29tbWFuZFxuICogQGFic3RyYWN0XG4gKiBAdGVtcGxhdGUgSSAtIFRoZSB0eXBlIG9mIGlucHV0IG9wdGlvbnMgZm9yIHRoZSBjb21tYW5kLlxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICogQG1lbWJlck9mIHV0aWxzL2NsaVxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbW1hbmQgaW1wbGVtZW50YXRpb24uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIHN0cnVjdHVyZSBmb3IgY3JlYXRpbmcgY29tbWFuZC1saW5lIGludGVyZmFjZSBjb21tYW5kcyB3aXRoIGlucHV0IGhhbmRsaW5nLCBsb2dnaW5nLCBhbmQgZXhlY3V0aW9uIGZsb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZC5cbiAqIEBwYXJhbSB7Q29tbWFuZE9wdGlvbnM8ST59IFtpbnB1dHNdIC0gVGhlIGlucHV0IG9wdGlvbnMgZm9yIHRoZSBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW3JlcXVpcmVtZW50c10gLSBUaGUgbGlzdCBvZiByZXF1aXJlZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBjb21tYW5kLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbWFuZDxJLCBSPiB7XG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbG9nZ2VyIGZvciB0aGUgQ29tbWFuZCBjbGFzcy5cbiAgICogQHR5cGUge1ZlcmJvc2l0eUxvZ2dlcn1cbiAgICovXG4gIHN0YXRpYyBsb2c6IFZlcmJvc2l0eUxvZ2dlcjtcblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAZGVzY3JpcHRpb24gSW5zdGFuY2UgbG9nZ2VyIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHR5cGUge1ZlcmJvc2l0eUxvZ2dlcn1cbiAgICovXG4gIHByb3RlY3RlZCBsb2c6IFZlcmJvc2l0eUxvZ2dlcjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgaW5wdXRzOiBDb21tYW5kT3B0aW9uczxJPiA9IHt9IGFzIHVua25vd24gYXMgQ29tbWFuZE9wdGlvbnM8ST4sXG4gICAgcHJvdGVjdGVkIHJlcXVpcmVtZW50czogc3RyaW5nW10gPSBbXVxuICApIHtcbiAgICBpZiAoIUNvbW1hbmQubG9nKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tbWFuZCwgXCJsb2dcIiwge1xuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBMb2dnaW5nLmZvcihDb21tYW5kLm5hbWUpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvZyA9IENvbW1hbmQubG9nO1xuICAgIH1cbiAgICB0aGlzLmxvZyA9IENvbW1hbmQubG9nLmZvcih0aGlzLm5hbWUpO1xuICAgIHRoaXMuaW5wdXRzID0gT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdENvbW1hbmRPcHRpb25zLCBpbnB1dHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGFzeW5jXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBhcmUgcHJlc2VudC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBhbmQgY29tcGFyZXMgaXQgYWdhaW5zdCB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoZWNrIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqICAgcGFydGljaXBhbnQgZ2V0RGVwZW5kZW5jaWVzXG4gICAqICAgcGFydGljaXBhbnQgU2V0XG4gICAqICAgQ29tbWFuZC0+PmdldERlcGVuZGVuY2llczogQ2FsbFxuICAgKiAgIGdldERlcGVuZGVuY2llcy0tPj5Db21tYW5kOiBSZXR1cm4ge3Byb2QsIGRldiwgcGVlcn1cbiAgICogICBDb21tYW5kLT4+U2V0OiBDcmVhdGUgU2V0IGZyb20gcHJvZCwgZGV2LCBwZWVyXG4gICAqICAgU2V0LS0+PkNvbW1hbmQ6IFJldHVybiB1bmlxdWUgZGVwZW5kZW5jaWVzXG4gICAqICAgQ29tbWFuZC0+PkNvbW1hbmQ6IENvbXBhcmUgYWdhaW5zdCByZXF1aXJlbWVudHNcbiAgICogICBhbHQgTWlzc2luZyBkZXBlbmRlbmNpZXNcbiAgICogICAgIENvbW1hbmQtPj5Db21tYW5kOiBBZGQgdG8gbWlzc2luZyBsaXN0XG4gICAqICAgZW5kXG4gICAqICAgTm90ZSBvdmVyIENvbW1hbmQ6IElmIG1pc3NpbmcubGVuZ3RoID4gMCwgaGFuZGxlIG1pc3NpbmcgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tSZXF1aXJlbWVudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBwcm9kLCBkZXYsIHBlZXIgfSA9IGF3YWl0IGdldERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IG1pc3NpbmcgPSBbXTtcbiAgICBjb25zdCBmdWxsTGlzdCA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFsuLi5wcm9kLCAuLi5kZXYsIC4uLnBlZXJdKS52YWx1ZXMoKVxuICAgICkubWFwKChkKSA9PiBkLm5hbWUpO1xuICAgIGZvciAoY29uc3QgZGVwIG9mIHRoaXMucmVxdWlyZW1lbnRzKVxuICAgICAgaWYgKCFmdWxsTGlzdC5pbmNsdWRlcyhkZXApKSBtaXNzaW5nLnB1c2goZGVwKTtcblxuICAgIGlmICghbWlzc2luZy5sZW5ndGgpIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gZGVyaXZlZCBjbGFzc2VzIHRvIHByb3ZpZGUgc3BlY2lmaWMgaGVscCBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtQYXJzZUFyZ3NSZXN1bHR9IGFyZ3MgLSBUaGUgcGFyc2VkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgaGVscChhcmdzOiBQYXJzZUFyZ3NSZXN1bHQpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBUaGlzIGlzIGhlbHAuIEknbSBubyB1c2UgYmVjYXVzZSBJIHNob3VsZCBoYXZlIGJlZW4gb3ZlcnJpZGRlbi5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZGVzY3JpcHRpb24gUnVucyB0aGUgY29tbWFuZCB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZGVmaW5lIHRoZSBjb21tYW5kJ3MgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhbnN3ZXJzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSIHwgc3RyaW5nIHwgdm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQncyByZXN1bHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcnVuPFI+KFxuICAgIGFuc3dlcnM6IExvZ2dpbmdDb25maWcgJlxuICAgICAgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzICYgeyBbayBpbiBrZXlvZiBJXTogdW5rbm93biB9XG4gICk6IFByb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAYXN5bmNcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSBjb21tYW5kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBvdmVyYWxsIGV4ZWN1dGlvbiBmbG93IG9mIHRoZSBjb21tYW5kLCBpbmNsdWRpbmcgcGFyc2luZyBhcmd1bWVudHMsXG4gICAqIHNldHRpbmcgdXAgbG9nZ2luZywgY2hlY2tpbmcgZm9yIHZlcnNpb24gb3IgaGVscCByZXF1ZXN0cywgYW5kIHJ1bm5pbmcgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFIgfCBzdHJpbmcgfCB2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCdzIHJlc3VsdC5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ29tbWFuZFxuICAgKiAgIHBhcnRpY2lwYW50IFVzZXJJbnB1dFxuICAgKiAgIHBhcnRpY2lwYW50IExvZ2dpbmdcbiAgICogICBwYXJ0aWNpcGFudCBnZXRQYWNrYWdlVmVyc2lvblxuICAgKiAgIHBhcnRpY2lwYW50IHByaW50QmFubmVyXG4gICAqICAgQ29tbWFuZC0+PlVzZXJJbnB1dDogcGFyc2VBcmdzKGlucHV0cylcbiAgICogICBVc2VySW5wdXQtLT4+Q29tbWFuZDogUmV0dXJuIFBhcnNlQXJnc1Jlc3VsdFxuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBQcm9jZXNzIG9wdGlvbnNcbiAgICogICBDb21tYW5kLT4+TG9nZ2luZzogc2V0Q29uZmlnKG9wdGlvbnMpXG4gICAqICAgYWx0IHZlcnNpb24gcmVxdWVzdGVkXG4gICAqICAgICBDb21tYW5kLT4+Z2V0UGFja2FnZVZlcnNpb246IENhbGxcbiAgICogICAgIGdldFBhY2thZ2VWZXJzaW9uLS0+PkNvbW1hbmQ6IFJldHVybiB2ZXJzaW9uXG4gICAqICAgZWxzZSBoZWxwIHJlcXVlc3RlZFxuICAgKiAgICAgQ29tbWFuZC0+PkNvbW1hbmQ6IGhlbHAoYXJncylcbiAgICogICBlbHNlIGJhbm5lciByZXF1ZXN0ZWRcbiAgICogICAgIENvbW1hbmQtPj5wcmludEJhbm5lcjogQ2FsbFxuICAgKiAgIGVuZFxuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBydW4oYXJncylcbiAgICogICBhbHQgZXJyb3Igb2NjdXJzXG4gICAqICAgICBDb21tYW5kLT4+Q29tbWFuZDogTG9nIGVycm9yXG4gICAqICAgZW5kXG4gICAqICAgQ29tbWFuZC0tPj5Db21tYW5kOiBSZXR1cm4gcmVzdWx0XG4gICAqL1xuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzOiBQYXJzZUFyZ3NSZXN1bHQgPSBVc2VySW5wdXQucGFyc2VBcmdzKHRoaXMuaW5wdXRzKTtcbiAgICBjb25zdCBlbnYgPSBFbnZpcm9ubWVudC5hY2N1bXVsYXRlKERlZmF1bHRMb2dnaW5nQ29uZmlnKVxuICAgICAgLmFjY3VtdWxhdGUoRGVmYXVsdENvbW1hbmRWYWx1ZXMpXG4gICAgICAuYWNjdW11bGF0ZShhcmdzLnZhbHVlcyk7XG4gICAgY29uc3QgeyB0aW1lc3RhbXAsIHZlcmJvc2UsIHZlcnNpb24sIGhlbHAsIGxvZ0xldmVsLCBsb2dTdHlsZSwgYmFubmVyIH0gPVxuICAgICAgZW52O1xuXG4gICAgdGhpcy5sb2cuc2V0Q29uZmlnKHtcbiAgICAgIC4uLmVudixcbiAgICAgIHRpbWVzdGFtcDogISF0aW1lc3RhbXAsXG4gICAgICBsZXZlbDogbG9nTGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICBzdHlsZTogISFsb2dTdHlsZSxcbiAgICAgIHZlcmJvc2U6ICh2ZXJib3NlIGFzIG51bWJlcikgfHwgMCxcbiAgICB9KTtcblxuICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZ2V0UGFja2FnZVZlcnNpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoaGVscCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGVscChhcmdzKTtcbiAgICB9XG5cbiAgICBpZiAoYmFubmVyKVxuICAgICAgcHJpbnRCYW5uZXIoXG4gICAgICAgIHRoaXMubG9nLmZvcihwcmludEJhbm5lciwge1xuICAgICAgICAgIHRpbWVzdGFtcDogZmFsc2UsXG4gICAgICAgICAgc3R5bGU6IGZhbHNlLFxuICAgICAgICAgIGNvbnRleHQ6IGZhbHNlLFxuICAgICAgICAgIGxvZ0xldmVsOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bihlbnYpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBFcnJvciB3aGlsZSBydW5uaW5nIHByb3ZpZGVkIGNsaSBmdW5jdGlvbjogJHtlfWApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIFI7XG4gIH1cbn1cbiIsImltcG9ydCBodHRwcyBmcm9tIFwiaHR0cHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiLi4vb3V0cHV0L2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzaW1wbGUgSFRUUCBjbGllbnQgZm9yIGRvd25sb2FkaW5nIGZpbGVzLlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIGRvd25sb2FkIGZpbGVzIGZyb20gSFRUUFMgVVJMcy5cbiAqIEl0IHVzZXMgTm9kZS5qcyBidWlsdC1pbiBodHRwcyBtb2R1bGUgdG8gbWFrZSByZXF1ZXN0cy5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDbGllbnQge1xuICBwcm90ZWN0ZWQgc3RhdGljIGxvZyA9IExvZ2dpbmcuZm9yKEh0dHBDbGllbnQpO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBhIGZpbGUgZnJvbSBhIGdpdmVuIFVSTC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2VuZHMgYSBHRVQgcmVxdWVzdCB0byB0aGUgc3BlY2lmaWVkIFVSTCBhbmQgcmV0dXJucyB0aGUgcmVzcG9uc2UgYm9keSBhcyBhIHN0cmluZy5cbiAgICogSXQgaGFuZGxlcyBkaWZmZXJlbnQgc2NlbmFyaW9zIHN1Y2ggYXMgbm9uLTIwMCBzdGF0dXMgY29kZXMgYW5kIG5ldHdvcmsgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCBvZiB0aGUgZmlsZSB0byBkb3dubG9hZC5cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBmaWxlIGNvbnRlbnQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEh0dHBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBIVFRQU1xuICAgKiAgIHBhcnRpY2lwYW50IFNlcnZlclxuICAgKiAgIENsaWVudC0+Pkh0dHBDbGllbnQ6IGRvd25sb2FkRmlsZSh1cmwpXG4gICAqICAgSHR0cENsaWVudC0+PkhUVFBTOiBnZXQodXJsKVxuICAgKiAgIEhUVFBTLT4+U2VydmVyOiBHRVQgcmVxdWVzdFxuICAgKiAgIFNlcnZlci0tPj5IVFRQUzogUmVzcG9uc2VcbiAgICogICBIVFRQUy0tPj5IdHRwQ2xpZW50OiBSZXNwb25zZSBvYmplY3RcbiAgICogICBhbHQgU3RhdHVzIGNvZGUgaXMgMjAwXG4gICAqICAgICBsb29wIEZvciBlYWNoIGRhdGEgY2h1bmtcbiAgICogICAgICAgSFRUUFMtPj5IdHRwQ2xpZW50OiAnZGF0YScgZXZlbnRcbiAgICogICAgICAgSHR0cENsaWVudC0+Pkh0dHBDbGllbnQ6IEFjY3VtdWxhdGUgZGF0YVxuICAgKiAgICAgZW5kXG4gICAqICAgICBIVFRQUy0+Pkh0dHBDbGllbnQ6ICdlbmQnIGV2ZW50XG4gICAqICAgICBIdHRwQ2xpZW50LS0+PkNsaWVudDogUmVzb2x2ZSB3aXRoIGRhdGFcbiAgICogICBlbHNlIFN0YXR1cyBjb2RlIGlzIG5vdCAyMDBcbiAgICogICAgIEh0dHBDbGllbnQtLT4+Q2xpZW50OiBSZWplY3Qgd2l0aCBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRvd25sb2FkRmlsZSh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZnVuY3Rpb24gcmVxdWVzdCh1cmw6IHN0cmluZykge1xuICAgICAgICB1cmwgPSBlbmNvZGVVUkkodXJsKTtcbiAgICAgICAgaHR0cHMuZ2V0KHVybCwgKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMzAxIHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDcpXG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdChyZXMuaGVhZGVycy5sb2NhdGlvbiBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICAgIEh0dHBDbGllbnQubG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoICR7dXJsfSAoc3RhdHVzOiAke3Jlcy5zdGF0dXNDb2RlfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICAgICAgICByZXMub24oXCJkYXRhXCIsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXMub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXF1ZXN0KHVybCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IExvZ2dpbmdDb25maWcgfSBmcm9tIFwiLi4vLi4vb3V0cHV0XCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRcIjtcbmltcG9ydCB7IENvbW1hbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIERlZmF1bHRDb21tYW5kVmFsdWVzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgY29weUZpbGUsXG4gIGRlbGV0ZVBhdGgsXG4gIGdldEFsbEZpbGVzLFxuICBnZXRQYWNrYWdlLFxuICBwYXRjaEZpbGUsXG4gIHJlYWRGaWxlLFxuICByZW5hbWVGaWxlLFxuICBydW5Db21tYW5kLFxuICB3cml0ZUZpbGUsXG59IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHJvbGx1cCwgSW5wdXRPcHRpb25zLCBPdXRwdXRPcHRpb25zLCBSb2xsdXBCdWlsZCB9IGZyb20gXCJyb2xsdXBcIjtcbmltcG9ydCB0eXBlc2NyaXB0IGZyb20gXCJAcm9sbHVwL3BsdWdpbi10eXBlc2NyaXB0XCI7XG5pbXBvcnQgY29tbW9uanMgZnJvbSBcIkByb2xsdXAvcGx1Z2luLWNvbW1vbmpzXCI7XG5pbXBvcnQgeyBub2RlUmVzb2x2ZSB9IGZyb20gXCJAcm9sbHVwL3BsdWdpbi1ub2RlLXJlc29sdmVcIjtcbmltcG9ydCBqc29uIGZyb20gXCJAcm9sbHVwL3BsdWdpbi1qc29uXCI7XG5cbmNvbnN0IFZFUlNJT05fU1RSSU5HID0gXCIjI1ZFUlNJT04jI1wiO1xuXG5lbnVtIE1vZGVzIHtcbiAgQ0pTID0gXCJjb21tb25qc1wiLFxuICBFU00gPSBcImVzMjAyMlwiLFxufVxuXG5jb25zdCBDb21tYW5kcyA9IFtcInVwZGF0ZS1zY3JpcHRzXCIsIFwidGFnLXJlbGVhc2VcIiwgXCJidWlsZC1zY3JpcHRzXCJdO1xuXG5jb25zdCBvcHRpb25zID0ge1xuICBwcm9kOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIGRldjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBkb2NzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIGNvbW1hbmRzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIGJhbm5lcjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxufTtcblxuZXhwb3J0IGNsYXNzIEJ1aWxkU2NyaXB0cyBleHRlbmRzIENvbW1hbmQ8XG4gIENvbW1hbmRPcHRpb25zPHR5cGVvZiBvcHRpb25zPixcbiAgdm9pZFxuPiB7XG4gIHByaXZhdGUgcmVwbGFjZW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgcGtnVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHBrZ05hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgIFwiQnVpbGRTY3JpcHRzXCIsXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIG9wdGlvbnMpIGFzIENvbW1hbmRPcHRpb25zPFxuICAgICAgICB0eXBlb2Ygb3B0aW9uc1xuICAgICAgPlxuICAgICk7XG4gICAgY29uc3QgcGtnID0gZ2V0UGFja2FnZSgpIGFzIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfTtcbiAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IHBrZztcbiAgICB0aGlzLnBrZ05hbWUgPSBuYW1lLmluY2x1ZGVzKFwiQFwiKSA/IG5hbWUuc3BsaXQoXCIvXCIpWzFdIDogbmFtZTtcbiAgICB0aGlzLnBrZ1ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIHRoaXMucmVwbGFjZW1lbnRzW1ZFUlNJT05fU1RSSU5HXSA9IHRoaXMucGtnVmVyc2lvbjtcbiAgfVxuXG4gIHBhdGNoQ2pzSW1wb3J0cyhmaWxlOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWdleHAgPSAvKHJlcXVpcmVcXChbXCInXSkoXFwuLio/KShbXCInXVxcKVs7LF0pL2c7XG4gICAgbGV0IGRhdGEgPSByZWFkRmlsZShmaWxlKTtcbiAgICBkYXRhID0gZGF0YS5yZXBsYWNlKHJlZ2V4cCwgKG1hdGNoLCAuLi5ncm91cHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICBjb25zdCByZW5hbWVkRmlsZSA9IGdyb3Vwc1sxXSArIFwiLmNqc1wiO1xuICAgICAgY29uc3QgZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlKS5yZXBsYWNlKFwibGliXCIsIFwic3JjXCIpO1xuICAgICAgY29uc3QgZmlsZU5hbWUgPSBncm91cHNbMV0gKyBcIi50c1wiO1xuICAgICAgY29uc3Qgc291cmNlRmlsZVBhdGggPSBwYXRoLmpvaW4oZGlybmFtZSwgZmlsZU5hbWUpO1xuXG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHNvdXJjZUZpbGVQYXRoKSkge1xuICAgICAgICByZXN1bHQgPSBncm91cHNbMF0gKyBncm91cHNbMV0gKyBcIi9pbmRleC5janNcIiArIGdyb3Vwc1syXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGdyb3Vwc1swXSArIHJlbmFtZWRGaWxlICsgZ3JvdXBzWzJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICAgIHdyaXRlRmlsZShmaWxlLCBkYXRhKTtcbiAgfVxuXG4gIHBhdGNoRmlsZXMocDogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucGF0Y2hGaWxlcyk7XG4gICAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBnZXRQYWNrYWdlKCkgYXMgYW55O1xuICAgIGxvZy5pbmZvKGBQYXRjaGluZyAke25hbWV9ICR7dmVyc2lvbn0gbW9kdWxlIGluICR7cH0uLi5gKTtcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMocCk7XG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSlcbiAgICAgIGZzLnJlYWRkaXJTeW5jKHAsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIC5maWx0ZXIoKHApID0+IHAuaXNGaWxlKCkpXG4gICAgICAgIC5mb3JFYWNoKChmaWxlKSA9PlxuICAgICAgICAgIHBhdGNoRmlsZShwYXRoLmpvaW4oZmlsZS5wYXJlbnRQYXRoLCBmaWxlLm5hbWUpLCB0aGlzLnJlcGxhY2VtZW50cylcbiAgICAgICAgKTtcbiAgICBsb2cudmVyYm9zZShgTW9kdWxlICR7bmFtZX0gJHt2ZXJzaW9ufSBwYXRjaGVkIGluICR7cH0uLi5gKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGQoaXNEZXY6IGJvb2xlYW4sIG1vZGU6IE1vZGVzLCBidW5kbGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBsb2cuaW5mbyhcbiAgICAgIGBCdWlsZGluZyAke3RoaXMucGtnTmFtZX0gJHt0aGlzLnBrZ1ZlcnNpb259IG1vZHVsZSAoJHttb2RlfSkgaW4gJHtpc0RldiA/IFwiZGV2XCIgOiBcInByb2RcIn0gbW9kZS4uLmBcbiAgICApO1xuXG4gICAgYXdhaXQgcnVuQ29tbWFuZChcbiAgICAgIGBucHggdHNjIC0tbW9kdWxlICR7YnVuZGxlID8gXCJhbWRcIiA6IG1vZGV9JHtpc0RldiA/IFwiIC0taW5saW5lU291cmNlTWFwXCIgOiBcIiAtLXNvdXJjZU1hcCBmYWxzZVwifSAtLW91dERpciAke2J1bmRsZSA/IFwiZGlzdFwiIDogYGxpYiR7bW9kZSA9PT0gTW9kZXMuRVNNID8gXCIvZXNtXCIgOiBcIlwifWB9JHtidW5kbGUgPyBgIC0taXNvbGF0ZWRNb2R1bGVzIGZhbHNlIC0tb3V0RmlsZSAke3RoaXMucGtnTmFtZX1gIDogXCJcIn1gXG4gICAgKS5wcm9taXNlO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYE1vZHVsZSAke3RoaXMucGtnTmFtZX0gJHt0aGlzLnBrZ1ZlcnNpb259ICgke21vZGV9KSBidWlsdCBpbiAke2lzRGV2ID8gXCJkZXZcIiA6IFwicHJvZFwifSBtb2RlLi4uYFxuICAgICk7XG4gICAgaWYgKG1vZGUgPT09IE1vZGVzLkNKUyAmJiAhYnVuZGxlKSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGdldEFsbEZpbGVzKFxuICAgICAgICBcImxpYlwiLFxuICAgICAgICAoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aChcIi5qc1wiKSAmJiAhZmlsZS5pbmNsdWRlcyhcIi9lc20vXCIpXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgbG9nLnZlcmJvc2UoYFBhdGNoaW5nICR7ZmlsZX0ncyBjanMgaW1wb3J0cy4uLmApO1xuICAgICAgICBjb25zdCBmID0gZmlsZS5yZXBsYWNlKFwiLmpzXCIsIFwiLmNqc1wiKTtcbiAgICAgICAgYXdhaXQgcmVuYW1lRmlsZShmaWxlLCBmKTtcbiAgICAgICAgdGhpcy5wYXRjaENqc0ltcG9ydHMoZik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29weUFzc2V0cyhtb2RlOiBNb2Rlcykge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvcHlBc3NldHMpO1xuICAgIGxldCBoYXNBc3NldHMgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgaGFzQXNzZXRzID0gZnMuc3RhdFN5bmMoXCIuL3NyYy9hc3NldHNcIikuaXNEaXJlY3RvcnkoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gbG9nLnZlcmJvc2UoYE5vIGFzc2V0cyBmb3VuZCBpbiAuL3NyYy9hc3NldHMgdG8gY29weWApO1xuICAgIH1cbiAgICBpZiAoaGFzQXNzZXRzKVxuICAgICAgY29weUZpbGUoXG4gICAgICAgIFwiLi9zcmMvYXNzZXRzXCIsXG4gICAgICAgIGAuLyR7bW9kZSA9PT0gTW9kZXMuQ0pTID8gXCJsaWJcIiA6IFwiZGlzdFwifS9hc3NldHNgXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRDb21tYW5kcygpIHtcbiAgICBmb3IgKGNvbnN0IGNtZCBvZiBDb21tYW5kcykge1xuICAgICAgYXdhaXQgdGhpcy5idW5kbGUoTW9kZXMuQ0pTLCB0cnVlLCB0cnVlLCBgc3JjL2Jpbi8ke2NtZH0udHNgLCBjbWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJ1bmRsZShcbiAgICBtb2RlOiBNb2RlcyxcbiAgICBpc0RldjogYm9vbGVhbixcbiAgICBpc0xpYjogYm9vbGVhbixcbiAgICBlbnRyeUZpbGU6IHN0cmluZyA9IFwic3JjL2luZGV4LnRzXCIsXG4gICAgbmFtZU92ZXJyaWRlOiBzdHJpbmcgPSB0aGlzLnBrZ05hbWUsXG4gICAgZXh0ZXJuYWxzPzogc3RyaW5nW10sXG4gICAgaW5jbHVkZTogc3RyaW5nW10gPSBbXCJwcm9tcHRzXCIsIFwic3R5bGVkLXN0cmluZy1idWlsZGVyXCJdXG4gICkge1xuICAgIGNvbnN0IGlzRXNtID0gbW9kZSA9PT0gTW9kZXMuRVNNO1xuICAgIGNvbnN0IHBrZ05hbWUgPSB0aGlzLnBrZ05hbWU7XG5cbiAgICBjb25zdCBleHQgPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbXG4gICAgICAgIC4uLltcbiAgICAgICAgICBcImZzXCIsXG4gICAgICAgICAgXCJwYXRoXCIsXG4gICAgICAgICAgXCJwcm9jZXNzXCIsXG4gICAgICAgICAgXCJyb2xsdXBcIixcbiAgICAgICAgICBcIkByb2xsdXAvcGx1Z2luLXR5cGVzY3JpcHRcIixcbiAgICAgICAgICBcIkByb2xsdXAvcGx1Z2luLWpzb25cIixcbiAgICAgICAgICBcIkByb2xsdXAvcGx1Z2luLWNvbW1vbmpzXCIsXG4gICAgICAgICAgXCJAcm9sbHVwL3BsdWdpbi1ub2RlLXJlc29sdmVcIixcbiAgICAgICAgICBcImNoaWxkX3Byb2Nlc3NcIixcbiAgICAgICAgICBcInV0aWxcIixcbiAgICAgICAgICBcImh0dHBzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIC4uLihleHRlcm5hbHMgfHwgW10pLFxuICAgICAgXSlcbiAgICApO1xuXG4gICAgY29uc3QgcGx1Z2lucyA9IFtcbiAgICAgIHR5cGVzY3JpcHQoe1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICBtb2R1bGU6IFwiZXNuZXh0XCIsXG4gICAgICAgICAgZGVjbGFyYXRpb246IGZhbHNlLFxuICAgICAgICAgIG91dERpcjogaXNMaWIgPyBcImJpblwiIDogXCJkaXN0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGluY2x1ZGU6IFtcInNyYy8qKi8qLnRzXCJdLFxuICAgICAgICBleGNsdWRlOiBbXCJub2RlX21vZHVsZXNcIiwgXCIqKi8qLnNwZWMudHNcIl0sXG4gICAgICAgIHRzY29uZmlnOiBcIi4vdHNjb25maWcuanNvblwiLFxuICAgICAgfSksXG4gICAgICBqc29uKCksXG4gICAgXTtcblxuICAgIGlmIChpc0xpYikge1xuICAgICAgcGx1Z2lucy5wdXNoKFxuICAgICAgICBjb21tb25qcyh7XG4gICAgICAgICAgaW5jbHVkZTogW10sXG4gICAgICAgICAgZXhjbHVkZTogZXh0ZXJuYWxzLFxuICAgICAgICB9KSxcbiAgICAgICAgbm9kZVJlc29sdmUoe1xuICAgICAgICAgIHJlc29sdmVPbmx5OiBpbmNsdWRlLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dDogSW5wdXRPcHRpb25zID0ge1xuICAgICAgaW5wdXQ6IGVudHJ5RmlsZSxcbiAgICAgIHBsdWdpbnM6IHBsdWdpbnMsXG4gICAgICBleHRlcm5hbDogZXh0LFxuICAgIH07XG5cbiAgICBjb25zdCBvdXRwdXRzOiBPdXRwdXRPcHRpb25zW10gPSBbXG4gICAgICB7XG4gICAgICAgIGZpbGU6IGAke2lzTGliID8gXCJiaW4vXCIgOiBcImRpc3QvXCJ9JHtuYW1lT3ZlcnJpZGUgPyBuYW1lT3ZlcnJpZGUgOiBgLmJ1bmRsZS4keyFpc0RldiA/IFwibWluXCIgOiBcIlwifWB9JHtpc0VzbSA/IFwiLmVzbVwiIDogXCJcIn0uY2pzYCxcbiAgICAgICAgZm9ybWF0OiBpc0xpYiA/IFwiY2pzXCIgOiBpc0VzbSA/IFwiZXNtXCIgOiBcInVtZFwiLFxuICAgICAgICBuYW1lOiBwa2dOYW1lLFxuICAgICAgICBlc01vZHVsZTogaXNFc20sXG4gICAgICAgIHNvdXJjZW1hcDogaXNEZXYgPyBcImlubGluZVwiIDogZmFsc2UsXG4gICAgICAgIGdsb2JhbHM6IHt9LFxuICAgICAgICBleHBvcnRzOiBcImF1dG9cIixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBidW5kbGUgPSBhd2FpdCByb2xsdXAoaW5wdXQpO1xuICAgICAgY29uc29sZS5sb2coYnVuZGxlLndhdGNoRmlsZXMpO1xuICAgICAgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPdXRwdXRzKGJ1bmRsZTogUm9sbHVwQnVpbGQpIHtcbiAgICAgICAgZm9yIChjb25zdCBvdXRwdXRPcHRpb25zIG9mIG91dHB1dHMpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IGJ1bmRsZS53cml0ZShvdXRwdXRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBnZW5lcmF0ZU91dHB1dHMoYnVuZGxlKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBidW5kbGU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkQnlFbnYoaXNEZXY6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgZGVsZXRlUGF0aChcImxpYlwiKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBkZWxldGVQYXRoKFwiZGlzdFwiKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGZzLm1rZGlyU3luYyhcImxpYlwiKTtcbiAgICBmcy5ta2RpclN5bmMoXCJkaXN0XCIpO1xuICAgIGF3YWl0IHRoaXMuYnVpbGQoaXNEZXYsIE1vZGVzLkNKUyk7XG4gICAgYXdhaXQgdGhpcy5idWlsZChpc0RldiwgTW9kZXMuRVNNKTtcbiAgICBhd2FpdCB0aGlzLmJ1bmRsZShNb2Rlcy5DSlMsIHRydWUsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmJ1bmRsZShNb2Rlcy5FU00sIHRydWUsIGZhbHNlKTtcbiAgICB0aGlzLnBhdGNoRmlsZXMoXCJsaWJcIik7XG4gICAgdGhpcy5wYXRjaEZpbGVzKFwiZGlzdFwiKTtcbiAgICB0aGlzLmNvcHlBc3NldHMoTW9kZXMuQ0pTKTtcbiAgICB0aGlzLmNvcHlBc3NldHMoTW9kZXMuRVNNKTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkRGV2KCkge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQnlFbnYodHJ1ZSk7XG4gIH1cblxuICBhc3luYyBidWlsZFByb2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRCeUVudihmYWxzZSk7XG4gIH1cblxuICBhc3luYyBidWlsZERvY3MoKSB7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnBtIGluc3RhbGwgYmV0dGVyLWRvY3MgdGFmZnlkYmApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnB4IG1hcmtkb3duLWluY2x1ZGUgLi93b3JrZG9jcy9yZWFkbWUtbWQuanNvbmApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChcbiAgICAgIGBucHgganNkb2MgLWMgLi93b3JrZG9jcy9qc2RvY3MuanNvbiAtdCAuL25vZGVfbW9kdWxlcy9iZXR0ZXItZG9jc2BcbiAgICApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnBtIHJlbW92ZSBiZXR0ZXItZG9jcyB0YWZmeWRiYCkucHJvbWlzZTtcbiAgICBbXG4gICAgICB7XG4gICAgICAgIHNyYzogXCJ3b3JrZG9jcy9hc3NldHNcIixcbiAgICAgICAgZGVzdDogXCIuL2RvY3Mvd29ya2RvY3MvYXNzZXRzXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzcmM6IFwid29ya2RvY3MvcmVwb3J0cy9jb3ZlcmFnZVwiLFxuICAgICAgICBkZXN0OiBcIi4vZG9jcy93b3JrZG9jcy9yZXBvcnRzL2NvdmVyYWdlXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzcmM6IFwid29ya2RvY3MvcmVwb3J0cy9odG1sXCIsXG4gICAgICAgIGRlc3Q6IFwiLi9kb2NzL3dvcmtkb2NzL3JlcG9ydHMvaHRtbFwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3JjOiBcIndvcmtkb2NzL3Jlc291cmNlc1wiLFxuICAgICAgICBkZXN0OiBcIi4vZG9jcy93b3JrZG9jcy9yZXNvdXJjZXNcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNyYzogXCJMSUNFTlNFLm1kXCIsXG4gICAgICAgIGRlc3Q6IFwiLi9kb2NzL0xJQ0VOU0UubWRcIixcbiAgICAgIH0sXG4gICAgXS5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBjb25zdCB7IHNyYywgZGVzdCB9ID0gZjtcbiAgICAgIGNvcHlGaWxlKHNyYywgZGVzdCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcnVuPFI+KFxuICAgIGFuc3dlcnM6IExvZ2dpbmdDb25maWcgJlxuICAgICAgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzICYgeyBbayBpbiBrZXlvZiB0eXBlb2Ygb3B0aW9uc106IHVua25vd24gfVxuICApOiBQcm9taXNlPHN0cmluZyB8IHZvaWQgfCBSPiB7XG4gICAgY29uc3QgeyBkZXYsIHByb2QsIGRvY3MsIGNvbW1hbmRzIH0gPSBhbnN3ZXJzO1xuXG4gICAgaWYgKGNvbW1hbmRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkQ29tbWFuZHMoKTtcbiAgICB9XG5cbiAgICBpZiAoZGV2KSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5idWlsZERldigpO1xuICAgIH1cbiAgICBpZiAocHJvZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYnVpbGRQcm9kKCk7XG4gICAgfVxuICAgIGlmIChkb2NzKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5idWlsZERvY3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IE5vQ0lGTGFnLCBTZW1WZXJzaW9uLCBTZW1WZXJzaW9uUmVnZXggfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBVc2VySW5wdXQgfSBmcm9tIFwiLi4vLi4vaW5wdXQvaW5wdXRcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZFwiO1xuaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCIuLi8uLi9vdXRwdXRcIjtcbmltcG9ydCB7IERlZmF1bHRDb21tYW5kVmFsdWVzIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmNvbnN0IG9wdGlvbnMgPSB7XG4gIGNpOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgbWVzc2FnZToge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwibVwiLFxuICB9LFxuICB0YWc6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIHNob3J0OiBcInRcIixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gIH0sXG59O1xuXG4vKipcbiAqIEBjbGFzcyBSZWxlYXNlU2NyaXB0XG4gKiBAZXh0ZW5kcyB7Q29tbWFuZH1cbiAqIEBjYXZlZ29yeSBzY3JpcHRzXG4gKiBAZGVzY3JpcHRpb24gQSBjb21tYW5kLWxpbmUgc2NyaXB0IGZvciBtYW5hZ2luZyByZWxlYXNlcyBhbmQgdmVyc2lvbiB1cGRhdGVzLlxuICogQHN1bW1hcnkgVGhpcyBzY3JpcHQgYXV0b21hdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuZCBwdXNoaW5nIG5ldyByZWxlYXNlcy4gSXQgaGFuZGxlcyB2ZXJzaW9uIHVwZGF0ZXMsXG4gKiBjb21taXQgbWVzc2FnZXMsIGFuZCBvcHRpb25hbGx5IHB1Ymxpc2hlcyB0byBOUE0uIFRoZSBzY3JpcHQgc3VwcG9ydHMgc2VtYW50aWMgdmVyc2lvbmluZyBhbmQgY2FuIHdvcmsgaW4gYm90aCBDSSBhbmQgbm9uLUNJIGVudmlyb25tZW50cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNjcmlwdFxuICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmNpIC0gV2hldGhlciB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcgaW4gYSBDSSBlbnZpcm9ubWVudCAoZGVmYXVsdDogdHJ1ZSlcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm1lc3NhZ2UgLSBUaGUgcmVsZWFzZSBtZXNzYWdlIChzaG9ydDogJ20nKVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudGFnIC0gVGhlIHZlcnNpb24gdGFnIHRvIHVzZSAoc2hvcnQ6ICd0JywgZGVmYXVsdDogdW5kZWZpbmVkKVxuICovXG5leHBvcnQgY2xhc3MgUmVsZWFzZVNjcmlwdCBleHRlbmRzIENvbW1hbmQ8dHlwZW9mIG9wdGlvbnMsIHZvaWQ+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJSZWxlYXNlU2NyaXB0XCIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyB0aGUgdmVyc2lvbiBmb3IgdGhlIHJlbGVhc2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHZhbGlkYXRlcyB0aGUgcHJvdmlkZWQgdGFnIG9yIHByb21wdHMgdGhlIHVzZXIgZm9yIGEgbmV3IG9uZSBpZiBub3QgcHJvdmlkZWQgb3IgaW52YWxpZC5cbiAgICogSXQgYWxzbyBkaXNwbGF5cyB0aGUgbGF0ZXN0IGdpdCB0YWdzIGZvciByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgLSBUaGUgdmVyc2lvbiB0YWcgdG8gcHJlcGFyZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgcHJlcGFyZWQgdmVyc2lvbiB0YWdcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBSZWxlYXNlU2NyaXB0XG4gICAqICAgcGFydGljaXBhbnQgVCBhcyBUZXN0VmVyc2lvblxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlcklucHV0XG4gICAqICAgcGFydGljaXBhbnQgRyBhcyBHaXRcbiAgICogICBSLT4+VDogdGVzdFZlcnNpb24odGFnKVxuICAgKiAgIGFsdCB0YWcgaXMgdmFsaWRcbiAgICogICAgIFQtLT4+UjogcmV0dXJuIHRhZ1xuICAgKiAgIGVsc2UgdGFnIGlzIGludmFsaWQgb3Igbm90IHByb3ZpZGVkXG4gICAqICAgICBSLT4+RzogTGlzdCBsYXRlc3QgZ2l0IHRhZ3NcbiAgICogICAgIFItPj5VOiBQcm9tcHQgZm9yIG5ldyB0YWdcbiAgICogICAgIFUtLT4+UjogcmV0dXJuIG5ldyB0YWdcbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHByZXBhcmVWZXJzaW9uKHRhZz86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucHJlcGFyZVZlcnNpb24pO1xuICAgIHRhZyA9IHRoaXMudGVzdFZlcnNpb24oKHRhZyBhcyBzdHJpbmcpIHx8IFwiXCIpO1xuICAgIGlmICghdGFnKSB7XG4gICAgICBsb2cudmVyYm9zZShcIk5vIHJlbGVhc2UgbWVzc2FnZSBwcm92aWRlZC4gUHJvbXB0aW5nIGZvciBvbmU6XCIpO1xuICAgICAgbG9nLmluZm8oYExpc3RpbmcgbGF0ZXN0IGdpdCB0YWdzOmApO1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCB0YWcgLS1zb3J0PS10YWdnZXJkYXRlIHwgaGVhZCAtbiA1XCIpLnByb21pc2U7XG4gICAgICByZXR1cm4gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgIFwidGFnXCIsXG4gICAgICAgIFwiRW50ZXIgdGhlIG5ldyB0YWcgbnVtYmVyIChhY2NlcHRzIHYqLiouKlstLi4uXSlcIixcbiAgICAgICAgKHZhbCkgPT5cbiAgICAgICAgICAhIXZhbC50b1N0cmluZygpLm1hdGNoKC9edlswLTldK1xcLlswLTldKy5bMC05XSsoLVswLTlhLXpBLVotXSspPyQvKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGVzdHMgaWYgdGhlIHByb3ZpZGVkIHZlcnNpb24gaXMgdmFsaWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdmVyc2lvbiBpcyBhIHZhbGlkIHNlbWFudGljIHZlcnNpb24gb3IgYSBwcmVkZWZpbmVkIHVwZGF0ZSB0eXBlIChQQVRDSCwgTUlOT1IsIE1BSk9SKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBUaGUgdmVyc2lvbiB0byB0ZXN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSB2YWxpZGF0ZWQgdmVyc2lvbiBvciB1bmRlZmluZWQgaWYgaW52YWxpZFxuICAgKi9cbiAgdGVzdFZlcnNpb24odmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50ZXN0VmVyc2lvbik7XG4gICAgdmVyc2lvbiA9IHZlcnNpb24udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoICh2ZXJzaW9uKSB7XG4gICAgICBjYXNlIFNlbVZlcnNpb24uUEFUQ0g6XG4gICAgICBjYXNlIFNlbVZlcnNpb24uTUlOT1I6XG4gICAgICBjYXNlIFNlbVZlcnNpb24uTUFKT1I6XG4gICAgICAgIGxvZy52ZXJib3NlKGBVc2luZyBwcm92aWRlZCBTZW1WZXIgdXBkYXRlOiAke3ZlcnNpb259YCwgMSk7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgICAgYFRlc3RpbmcgcHJvdmlkZWQgdmVyc2lvbiBmb3IgU2VtVmVyIGNvbXBhdGliaWxpdHk6ICR7dmVyc2lvbn1gLFxuICAgICAgICAgIDFcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFuZXcgUmVnRXhwKFNlbVZlcnNpb25SZWdleCkudGVzdCh2ZXJzaW9uKSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgSW52YWxpZCB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9ufWApO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLnZlcmJvc2UoYHZlcnNpb24gYXBwcm92ZWQ6ICR7dmVyc2lvbn1gLCAxKTtcbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyB0aGUgcmVsZWFzZSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBlaXRoZXIgcmV0dXJucyB0aGUgcHJvdmlkZWQgbWVzc2FnZSBvciBwcm9tcHRzIHRoZSB1c2VyIGZvciBhIG5ldyBvbmUgaWYgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIHJlbGVhc2UgbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgcHJlcGFyZWQgcmVsZWFzZSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBwcmVwYXJlTWVzc2FnZShtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucHJlcGFyZU1lc3NhZ2UpO1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgbG9nLnZlcmJvc2UoXCJObyByZWxlYXNlIG1lc3NhZ2UgcHJvdmlkZWQuIFByb21wdGluZyBmb3Igb25lXCIpO1xuICAgICAgcmV0dXJuIGF3YWl0IFVzZXJJbnB1dC5pbnNpc3RGb3JUZXh0KFxuICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgXCJXaGF0IHNob3VsZCBiZSB0aGUgcmVsZWFzZSBtZXNzYWdlL3RpY2tldD9cIixcbiAgICAgICAgKHZhbCkgPT4gISF2YWwgJiYgdmFsLnRvU3RyaW5nKCkubGVuZ3RoID4gNVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJ1bnMgdGhlIHJlbGVhc2Ugc2NyaXB0LlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBvcmNoZXN0cmF0ZXMgdGhlIGVudGlyZSByZWxlYXNlIHByb2Nlc3MsIGluY2x1ZGluZyB2ZXJzaW9uIHByZXBhcmF0aW9uLCBtZXNzYWdlIGNyZWF0aW9uLFxuICAgKiBnaXQgb3BlcmF0aW9ucywgYW5kIG5wbSBwdWJsaXNoaW5nIChpZiBub3QgaW4gQ0kgZW52aXJvbm1lbnQpLlxuICAgKiBAcGFyYW0ge1BhcnNlQXJnc1Jlc3VsdH0gYXJncyAtIFRoZSBwYXJzZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBSZWxlYXNlU2NyaXB0XG4gICAqICAgcGFydGljaXBhbnQgViBhcyBQcmVwYXJlVmVyc2lvblxuICAgKiAgIHBhcnRpY2lwYW50IE0gYXMgUHJlcGFyZU1lc3NhZ2VcbiAgICogICBwYXJ0aWNpcGFudCBOIGFzIE5QTVxuICAgKiAgIHBhcnRpY2lwYW50IEcgYXMgR2l0XG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VySW5wdXRcbiAgICogICBSLT4+VjogcHJlcGFyZVZlcnNpb24odGFnKVxuICAgKiAgIFItPj5NOiBwcmVwYXJlTWVzc2FnZShtZXNzYWdlKVxuICAgKiAgIFItPj5OOiBSdW4gcHJlcGFyZS1yZWxlYXNlIHNjcmlwdFxuICAgKiAgIFItPj5HOiBDaGVjayBnaXQgc3RhdHVzXG4gICAqICAgYWx0IGNoYW5nZXMgZXhpc3RcbiAgICogICAgIFItPj5VOiBBc2sgZm9yIGNvbmZpcm1hdGlvblxuICAgKiAgICAgVS0tPj5SOiBDb25maXJtXG4gICAqICAgICBSLT4+RzogQWRkIGFuZCBjb21taXQgY2hhbmdlc1xuICAgKiAgIGVuZFxuICAgKiAgIFItPj5OOiBVcGRhdGUgbnBtIHZlcnNpb25cbiAgICogICBSLT4+RzogUHVzaCBjaGFuZ2VzIGFuZCB0YWdzXG4gICAqICAgYWx0IG5vdCBDSSBlbnZpcm9ubWVudFxuICAgKiAgICAgUi0+Pk46IFB1Ymxpc2ggdG8gbnBtXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyBydW4oXG4gICAgYXJnczogTG9nZ2luZ0NvbmZpZyAmXG4gICAgICB0eXBlb2YgRGVmYXVsdENvbW1hbmRWYWx1ZXMgJiB7IFtrIGluIGtleW9mIHR5cGVvZiBvcHRpb25zXTogdW5rbm93biB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCB7IGNpIH0gPSBhcmdzO1xuICAgIGxldCB7IHRhZywgbWVzc2FnZSB9ID0gYXJncztcbiAgICB0YWcgPSBhd2FpdCB0aGlzLnByZXBhcmVWZXJzaW9uKHRhZyBhcyBzdHJpbmcpO1xuICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UgYXMgc3RyaW5nKTtcbiAgICByZXN1bHQgPSBhd2FpdCBydW5Db21tYW5kKGBucG0gcnVuIHByZXBhcmUtcmVsZWFzZSAtLSAke3RhZ30gJHttZXNzYWdlfWAsIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KS5wcm9taXNlO1xuICAgIHJlc3VsdCA9IGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgc3RhdHVzIC0tcG9yY2VsYWluXCIpLnByb21pc2U7XG4gICAgYXdhaXQgcmVzdWx0O1xuICAgIGlmIChcbiAgICAgIHJlc3VsdC5sb2dzLmxlbmd0aCAmJlxuICAgICAgKGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwiZ2l0LWNoYW5nZXNcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBwdXNoIHRoZSBjaGFuZ2VzIHRvIHRoZSByZW1vdGUgcmVwb3NpdG9yeT9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKSlcbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgYWRkIC5cIikucHJvbWlzZTtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoXG4gICAgICAgIGBnaXQgY29tbWl0IC1tIFwiJHt0YWd9IC0gJHttZXNzYWdlfSAtIGFmdGVyIHJlbGVhc2UgcHJlcGFyYXRpb24ke2NpID8gXCJcIiA6IE5vQ0lGTGFnfVwiYFxuICAgICAgKS5wcm9taXNlO1xuICAgIH1cbiAgICBhd2FpdCBydW5Db21tYW5kKFxuICAgICAgYG5wbSB2ZXJzaW9uIFwiJHt0YWd9XCIgLW0gXCIke21lc3NhZ2V9JHtjaSA/IFwiXCIgOiBOb0NJRkxhZ31cImBcbiAgICApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBwdXNoIC0tZm9sbG93LXRhZ3NcIikucHJvbWlzZTtcbiAgICBpZiAoIWNpKSB7XG4gICAgICBhd2FpdCBydW5Db21tYW5kKFwiTlBNX1RPS0VOPSQoY2F0IC5ucG10b2tlbikgbnBtIHB1Ymxpc2ggLS1hY2Nlc3MgcHVibGljXCIpXG4gICAgICAgIC5wcm9taXNlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZFwiO1xuaW1wb3J0IHsgQ29tbWFuZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldFBhY2thZ2UsXG4gIEh0dHBDbGllbnQsXG4gIHBhdGNoRmlsZSxcbiAgcGF0Y2hTdHJpbmcsXG4gIHJ1bkNvbW1hbmQsXG4gIHNldFBhY2thZ2VBdHRyaWJ1dGUsXG4gIFNldHVwU2NyaXB0S2V5LFxuICBUb2tlbnMsXG4gIHdyaXRlRmlsZSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBMb2dnaW5nQ29uZmlnIH0gZnJvbSBcIi4uLy4uL291dHB1dFwiO1xuaW1wb3J0IHsgRGVmYXVsdENvbW1hbmRWYWx1ZXMgfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi9pbnB1dFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuXG5jb25zdCBiYXNlVXJsID1cbiAgXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZGVjYWYtdHMvdHMtd29ya3NwYWNlL21hc3RlclwiO1xuXG5jb25zdCBvcHRpb25zID0ge1xuICB0ZW1wbGF0ZXM6IFtcbiAgICBcIi5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZFwiLFxuICAgIFwiLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9mZWF0dXJlX3JlcXVlc3QubWRcIixcbiAgICBcIi5naXRodWIvRlVORElORy55bWxcIixcbiAgXSxcbiAgd29ya2Zsb3dzOiBbXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9jb2RlcWwtYW5hbHlzaXMueW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9qZXN0LWNvdmVyYWdlLnlhbWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL25vZGVqcy1idWlsZC1wcm9kLnlhbWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL3BhZ2VzLnlhbWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL3B1Ymxpc2gtb24tcmVsZWFzZS55YW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLW9uLXRhZy55YW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9zbnlrLWFuYWx5c2lzLnlhbWxcIixcbiAgXSxcbiAgaWRlOiBbXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9BbGwgVGVzdHMucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvYnVpbGQucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvYnVpbGRfcHJvZC5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9jb3ZlcmFnZS5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9kb2NzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2RyYXdpbmdzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2ZsYXNoLWZvcndhcmQucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvSW50ZWdyYXRpb25fVGVzdHMucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvQnVuZGxpbmdfVGVzdHMucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvbGludC1maXgucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvcmVsZWFzZS5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy90ZXN0X2NpcmN1bGFyLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL3VtbC5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9Vbml0IFRlc3RzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL3VwZGF0ZS1zY3JpcHRzLnJ1bi54bWxcIixcbiAgXSxcbiAgZG9jczogW1xuICAgIFwid29ya2RvY3MvdHV0b3JpYWxzL0NvbnRyaWJ1dGluZy5tZFwiLFxuICAgIFwid29ya2RvY3MvdHV0b3JpYWxzL0RvY3VtZW50YXRpb24ubWRcIixcbiAgICBcIndvcmtkb2NzL3R1dG9yaWFscy9Gb3IgRGV2ZWxvcGVycy5tZFwiLFxuICAgIFwid29ya2RvY3MvMi1CYWRnZXMubWRcIixcbiAgICBcIndvcmtkb2NzL2pzZG9jcy5qc29uXCIsXG4gICAgXCJ3b3JrZG9jcy9yZWFkbWUtbWQuanNvblwiLFxuICBdLFxuICBzdHlsZXM6IFtcIi5wcmV0dGllcnJjXCIsIFwiZXNsaW50LmNvbmZpZy5qc1wiXSxcbiAgc2NyaXB0czogW1xuICAgIFwiYmluL3VwZGF0ZS1zY3JpcHRzLmNqc1wiLFxuICAgIFwiYmluL3RhZy1yZWxlYXNlLmNqc1wiLFxuICAgIFwiYmluL2J1aWxkLXNjcmlwdHMuY2pzXCIsXG4gIF0sXG4gIHRlc3RzOiBbXCJqZXN0LmNvbmZpZy50c1wiLCBcIndvcmtkb2NzL3JlcG9ydHMvamVzdC5jb3ZlcmFnZS5jb25maWcudHNcIl0sXG4gIHR5cGVzY3JpcHQ6IFtcInRzY29uZmlnLmpzb25cIl0sXG4gIGRvY2tlcjogW1wiRG9ja2VyZmlsZVwiXSxcbiAgYXV0b21hdGlvbjogW1xuICAgIFwid29ya2RvY3MvY29uZmx1ZW5jZS9Db250aW51b3VzIEludGVncmF0aW9uLURlcGxveW1lbnQvR2l0SHViLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy9jb25mbHVlbmNlL0NvbnRpbnVvdXMgSW50ZWdyYXRpb24tRGVwbG95bWVudC9KaXJhLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy9jb25mbHVlbmNlL0NvbnRpbnVvdXMgSW50ZWdyYXRpb24tRGVwbG95bWVudC9UZWFtcy5tZFwiLFxuICBdLFxufTtcblxuY29uc3QgYXJnenogPSB7XG4gIC8vIGluaXQgYXR0cmlidXRlc1xuICBib290OiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIG9yZzoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwib1wiLFxuICB9LFxuICBuYW1lOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBzaG9ydDogXCJuXCIsXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICB9LFxuICBhdXRob3I6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIHNob3J0OiBcImFcIixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gIH0sXG4gIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzXG4gIGFsbDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBsaWNlbnNlOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBtZXNzYWdlOiBcIlBpY2sgdGhlIGxpY2Vuc2VcIixcbiAgfSxcbiAgc2NyaXB0czoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBzdHlsZXM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgZG9jczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBpZGU6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgd29ya2Zsb3dzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHRlbXBsYXRlczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICB0eXBlc2NyaXB0OiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGRvY2tlcjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBwa2c6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgZGVwZW5kZW5jaWVzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHRlc3RzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGF1dG9tYXRpb246IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbn07XG5cbi8qKlxuICogQGNsYXNzIFRlbXBsYXRlU3luY1xuICogQGV4dGVuZHMge0NvbW1hbmR9XG4gKiBAY2F0ZWdvcnkgc2NyaXB0c1xuICogQGRlc2NyaXB0aW9uIEEgY29tbWFuZC1saW5lIHRvb2wgZm9yIHN5bmNocm9uaXppbmcgcHJvamVjdCB0ZW1wbGF0ZXMgYW5kIGNvbmZpZ3VyYXRpb25zLlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIGRvd25sb2FkIGFuZCB1cGRhdGUgdmFyaW91cyBwcm9qZWN0IGZpbGVzIGFuZCBjb25maWd1cmF0aW9ucyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkuXG4gKiBJdCBzdXBwb3J0cyB1cGRhdGluZyBsaWNlbnNlcywgSURFIGNvbmZpZ3VyYXRpb25zLCBzY3JpcHRzLCBzdHlsZXMsIGRvY3VtZW50YXRpb24sIHdvcmtmbG93cywgYW5kIHRlbXBsYXRlcy5cbiAqXG4gKiBAcGFyYW0ge0NvbW1hbmRPcHRpb25zfSBhcmdzIC0gVGhlIGNvbW1hbmQgb3B0aW9ucyBmb3IgVGVtcGxhdGVTeW5jXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVN5bmMgZXh0ZW5kcyBDb21tYW5kPENvbW1hbmRPcHRpb25zPHR5cGVvZiBhcmd6ej4sIHZvaWQ+IHtcbiAgcHJpdmF0ZSByZXBsYWNlbWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlRlbXBsYXRlU3luY1wiLCBhcmd6eik7XG4gIH1cblxuICBwcml2YXRlIGxvYWRWYWx1ZXNGcm9tUGFja2FnZSgpIHtcbiAgICBjb25zdCBwID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBhdXRob3IgPSBnZXRQYWNrYWdlKHAsIFwiYXV0aG9yXCIpIGFzIHN0cmluZztcbiAgICBjb25zdCBzY29wZWROYW1lID0gZ2V0UGFja2FnZShwLCBcIm5hbWVcIik7XG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IHNjb3BlZE5hbWUgYXMgc3RyaW5nO1xuICAgIGxldCBvcmc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgICAgY29uc3Qgc3BsaXQgPSBuYW1lLnNwbGl0KFwiL1wiKTtcbiAgICAgIG5hbWUgPSBzcGxpdFsxXTtcbiAgICAgIG9yZyA9IHNwbGl0WzBdLnJlcGxhY2UoXCJAXCIsIFwiXCIpO1xuICAgIH1cbiAgICBbXCJUaWFnbyBWZW5jZXNsYXVcIiwgXCJUaWFnb1ZlbmNlc2xhdVwiLCBcIiR7YXV0aG9yfVwiXS5mb3JFYWNoKFxuICAgICAgKGVsKSA9PiAodGhpcy5yZXBsYWNlbWVudHNbZWxdID0gYXV0aG9yKVxuICAgICk7XG4gICAgW1wiVFMtV29ya3NwYWNlXCIsIFwidHMtd29ya3NwYWNlXCIsIFwiJHtuYW1lfVwiXS5mb3JFYWNoKFxuICAgICAgKGVsKSA9PiAodGhpcy5yZXBsYWNlbWVudHNbZWxdID0gbmFtZSlcbiAgICApO1xuICAgIFtcImRlY2FmLXRzXCIsIFwiJHtvcmd9XCJdLmZvckVhY2goXG4gICAgICAoZWwpID0+ICh0aGlzLnJlcGxhY2VtZW50c1tlbF0gPSAob3JnIGFzIHN0cmluZykgfHwgJ1wiXCInKVxuICAgICk7XG4gICAgdGhpcy5yZXBsYWNlbWVudHNbXCIke29yZ19vcl9vd25lcn1cIl0gPSBvcmcgfHwgbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGZpbGVzIGZvciBhIHNwZWNpZmljIG9wdGlvbiBjYXRlZ29yeS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgZG93bmxvYWRzIGFsbCBmaWxlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBvcHRpb24ga2V5IGZyb20gdGhlIHJlbW90ZSByZXBvc2l0b3J5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSByZXByZXNlbnRpbmcgdGhlIG9wdGlvbiBjYXRlZ29yeSB0byBkb3dubG9hZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBzcGVjaWZpZWQgb3B0aW9uIGtleSBpcyBub3QgZm91bmRcbiAgICovXG4gIGFzeW5jIGRvd25sb2FkT3B0aW9uKGtleToga2V5b2YgdHlwZW9mIG9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIShrZXkgaW4gb3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uIFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIG9wdGlvbnNgKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZXMgPSBvcHRpb25zW2tleSBhcyBrZXlvZiB0eXBlb2Ygb3B0aW9uc107XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYERvd25sb2FkaW5nICR7ZmlsZX1gKTtcblxuICAgICAgbGV0IGRhdGEgPSBhd2FpdCBIdHRwQ2xpZW50LmRvd25sb2FkRmlsZShgJHtiYXNlVXJsfS8ke2ZpbGV9YCk7XG4gICAgICBkYXRhID0gcGF0Y2hTdHJpbmcoZGF0YSwgdGhpcy5yZXBsYWNlbWVudHMpO1xuICAgICAgd3JpdGVGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBmaWxlKSwgZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgYW5kIHNldHMgdXAgdGhlIHNwZWNpZmllZCBsaWNlbnNlLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBkb3dubG9hZHMgdGhlIGNob3NlbiBsaWNlbnNlIGZpbGUsIHNhdmVzIGl0IHRvIHRoZSBwcm9qZWN0LCBhbmQgdXBkYXRlcyB0aGUgcGFja2FnZS5qc29uIGxpY2Vuc2UgZmllbGQuXG4gICAqIEBwYXJhbSB7XCJNSVRcIiB8IFwiR1BMXCIgfCBcIkFwYWNoZVwiIHwgXCJMR1BMXCIgfCBcIkFHUExcIn0gbGljZW5zZSAtIFRoZSBsaWNlbnNlIHRvIGRvd25sb2FkIGFuZCBzZXQgdXBcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBnZXRMaWNlbnNlKGxpY2Vuc2U6IFwiTUlUXCIgfCBcIkdQTFwiIHwgXCJBcGFjaGVcIiB8IFwiTEdQTFwiIHwgXCJBR1BMXCIpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBEb3dubG9hZGluZyAke2xpY2Vuc2V9IGxpY2Vuc2VgKTtcbiAgICBjb25zdCB1cmwgPSBgJHtiYXNlVXJsfS93b3JrZG9jcy9saWNlbnNlcy8ke2xpY2Vuc2V9Lm1kYDtcbiAgICBsZXQgZGF0YSA9IGF3YWl0IEh0dHBDbGllbnQuZG93bmxvYWRGaWxlKHVybCk7XG4gICAgZGF0YSA9IHBhdGNoU3RyaW5nKGRhdGEsIHRoaXMucmVwbGFjZW1lbnRzKTtcbiAgICB3cml0ZUZpbGUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiTElDRU5TRS5tZFwiKSwgZGF0YSk7XG4gICAgc2V0UGFja2FnZUF0dHJpYnV0ZShcImxpY2Vuc2VcIiwgbGljZW5zZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBJREUgY29uZmlndXJhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBnZXRJZGUoKSB7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi5pZGVhXCIsIFwicnVuQ29uZmlndXJhdGlvbnNcIiksIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLmRvd25sb2FkT3B0aW9uKFwiaWRlXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGUgbnBtIHNjcmlwdHNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBnZXRTY3JpcHRzKCkge1xuICAgIGF3YWl0IHRoaXMuZG93bmxvYWRPcHRpb24oXCJzY3JpcHRzXCIpO1xuICAgIHRoaXMubG9nLmluZm8oXCJwbGVhc2UgcmUtcnVuIHRoZSBjb21tYW5kXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIHN0eWxlIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0U3R5bGVzID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcInN0eWxlc1wiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyB0ZW1wbGF0ZSBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRUZW1wbGF0ZXMgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwidGVtcGxhdGVzXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIHdvcmtmbG93IGNvbmZpZ3VyYXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0V29ya2Zsb3dzID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcIndvcmtmbG93c1wiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBkb2N1bWVudGF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldERvY3MgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwiZG9jc1wiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyB0eXBlc2NyaXB0IGNvbmZpZyBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRUeXBlc2NyaXB0ID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcInR5cGVzY3JpcHRcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgYXV0b21hdGlvbiBkb2N1bWVudGF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldEF1dG9tYXRpb24gPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwiYXV0b21hdGlvblwiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBhdXRvbWF0aW9uIGRvY3VtZW50YXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0VGVzdHMgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwidGVzdHNcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgZG9ja2VyIGltYWdlIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldERvY2tlciA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJkb2NrZXJcIik7XG5cbiAgYXN5bmMgaW5pdFBhY2thZ2UocGtnTmFtZTogc3RyaW5nLCBhdXRob3I6IHN0cmluZywgbGljZW5zZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBrZyA9IGdldFBhY2thZ2UoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGRlbGV0ZSBwa2dbU2V0dXBTY3JpcHRLZXldO1xuICAgICAgcGtnLm5hbWUgPSBwa2dOYW1lO1xuICAgICAgcGtnLnZlcnNpb24gPSBcIjAuMC4xXCI7XG4gICAgICBwa2cuYXV0aG9yID0gYXV0aG9yO1xuICAgICAgcGtnLmxpY2Vuc2UgPSBsaWNlbnNlO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhcInBhY2thZ2UuanNvblwiLCBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGZpeGluZyBwYWNrYWdlLmpzb246ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVQYWNrYWdlU2NyaXBzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmlnaW5hbFBrZyA9IEpTT04ucGFyc2UoXG4gICAgICAgIGF3YWl0IEh0dHBDbGllbnQuZG93bmxvYWRGaWxlKGAke2Jhc2VVcmx9L3BhY2thZ2UuanNvbmApXG4gICAgICApO1xuICAgICAgY29uc3QgeyBzY3JpcHRzIH0gPSBvcmlnaW5hbFBrZztcblxuICAgICAgY29uc3QgcGtnOiB0eXBlb2Ygb3JpZ2luYWxQa2cgPSBnZXRQYWNrYWdlKCkgYXMge1xuICAgICAgICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgfTtcbiAgICAgIE9iamVjdC5rZXlzKHBrZy5zY3JpcHRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiBzY3JpcHRzKSB7XG4gICAgICAgICAgY29uc3QgcmVwbGFjZWQgPSBwYXRjaFN0cmluZyhzY3JpcHRzW2tleV0sIHRoaXMucmVwbGFjZW1lbnRzKTtcbiAgICAgICAgICBpZiAocmVwbGFjZWQgIT09IHNjcmlwdHNba2V5XSkge1xuICAgICAgICAgICAgcGtnLnNjcmlwdHNba2V5XSA9IHJlcGxhY2VkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHBrZ1tcImV4cG9ydHNcIl1bXCJyZXF1aXJlXCJdID0gb3JpZ2luYWxQa2dbXCJleHBvcnRzXCJdW1wicmVxdWlyZVwiXTtcbiAgICAgIHBrZ1tcImV4cG9ydHNcIl1bXCJpbXBvcnRcIl0gPSBvcmlnaW5hbFBrZ1tcImV4cG9ydHNcIl1bXCJpbXBvcnRcIl07XG4gICAgICBwa2dbXCJ0eXBlc1wiXSA9IG9yaWdpbmFsUGtnW1widHlwZXNcIl07XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXCJwYWNrYWdlLmpzb25cIiwgSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBmaXhpbmcgcGFja2FnZS5qc29uIHNjcmlwdHM6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVUb2tlbkZpbGVzKCkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZVRva2VuRmlsZXMpO1xuICAgIGNvbnN0IGdpdFRva2VuID0gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICBcInRva2VuXCIsXG4gICAgICBcInBsZWFzZSBpbnB1dCB5b3VyIGdpdGh1YiB0b2tlblwiLFxuICAgICAgKHJlczogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiAhIXJlcy5tYXRjaCgvXmdocF9bMC05YS16QS1aXXszNn0kL2cpO1xuICAgICAgfVxuICAgICk7XG4gICAgT2JqZWN0LnZhbHVlcyhUb2tlbnMpLmZvckVhY2goKHRva2VuKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgc3RhdHVzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0YXR1cyA9IGZzLmV4aXN0c1N5bmModG9rZW4pO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5pbmZvKGBUb2tlbiBmaWxlICR7dG9rZW59IG5vdCBmb3VuZC4gQ3JlYXRpbmcgYSBuZXcgb25lLi4uYCk7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0b2tlbiwgdG9rZW4gPT09IFwiLnRva2VuXCIgPyBnaXRUb2tlbiA6IFwiXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN0YXR1cykge1xuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModG9rZW4sIHRva2VuID09PSBcIi50b2tlblwiID8gZ2l0VG9rZW4gOiBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGNyZWF0aW5nIHRva2VuIGZpbGUgJHt0b2tlbn06ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdldE9yZygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG9yZyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tUZXh0KFxuICAgICAgXCJPcmdhbml6YXRpb25cIixcbiAgICAgIFwiRW50ZXIgdGhlIG9yZ2FuaXphdGlvbiBuYW1lICh3aWxsIGJlIHVzZWQgdG8gc2NvcGUgeW91ciBucG0gcHJvamVjdC4gbGVhdmUgYmxhbmsgdG8gY3JlYXRlIGEgdW5zY29wZWQgcHJvamVjdCk6XCJcbiAgICApO1xuICAgIGNvbnN0IGNvbmZpcm1hdGlvbiA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICBcIkNvbmZpcm0gb3JnYW5pemF0aW9uXCIsXG4gICAgICBcIklzIHRoaXMgb3JnYW5pemF0aW9uIGNvcnJlY3Q/XCIsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBpZiAoIWNvbmZpcm1hdGlvbikgcmV0dXJuIHRoaXMuZ2V0T3JnKCk7XG5cbiAgICByZXR1cm4gb3JnO1xuICB9XG5cbiAgYXN5bmMgYXVkaXRGaXgoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHJ1bkNvbW1hbmQoXCJucG0gYXVkaXQgZml4IC0tZm9yY2VcIikucHJvbWlzZTtcbiAgfVxuXG4gIHBhdGNoRmlsZXMoKSB7XG4gICAgY29uc3QgZmlsZXMgPSBbXG4gICAgICAuLi5mc1xuICAgICAgICAucmVhZGRpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwic3JjXCIpLCB7XG4gICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSlcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IHBhdGguam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKSksXG4gICAgICAuLi5mc1xuICAgICAgICAucmVhZGRpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwid29ya2RvY3NcIiksIHtcbiAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIubWRcIikpXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiBwYXRoLmpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLmdpdGxhYi1jaS55bWxcIiksXG4gICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJ3b3JrZG9jc1wiLCBcImpzZG9jcy5qc29uXCIpLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHBhdGNoRmlsZShmaWxlIGFzIHN0cmluZywgdGhpcy5yZXBsYWNlbWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZURlcGVuZGVuY2llcygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxQa2cgPSBKU09OLnBhcnNlKFxuICAgICAgICBhd2FpdCBIdHRwQ2xpZW50LmRvd25sb2FkRmlsZShgJHtiYXNlVXJsfS9wYWNrYWdlLmpzb25gKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgZGV2RGVwZW5kZW5jaWVzIH0gPSBvcmlnaW5hbFBrZztcblxuICAgICAgY29uc3QgcGtnOiB0eXBlb2Ygb3JpZ2luYWxQa2cgPSBnZXRQYWNrYWdlKCkgYXMge1xuICAgICAgICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgfTtcbiAgICAgIE9iamVjdC5rZXlzKHBrZy5zY3JpcHRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiBkZXZEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBjb25zdCByZXBsYWNlZCA9IGRldkRlcGVuZGVuY2llc1trZXldO1xuICAgICAgICAgIGlmIChyZXBsYWNlZCAhPT0gZGV2RGVwZW5kZW5jaWVzW2tleV0pIHtcbiAgICAgICAgICAgIChwa2cgYXMgYW55KVtcImRldkRlcGVuZGVuY2llc1wiXSA9XG4gICAgICAgICAgICAgIChwa2cgYXMgYW55KVtcImRldkRlcGVuZGVuY2llc1wiXSB8fCB7fTtcbiAgICAgICAgICAgIChwa2cgYXMgYW55KVtcImRldkRlcGVuZGVuY2llc1wiXVtrZXldID0gcmVwbGFjZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcInBhY2thZ2UuanNvblwiLCBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpKTtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoXCJucG0gaW5zdGFsbFwiKS5wcm9taXNlO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZml4aW5nIHBhY2thZ2UuanNvbiBkZXBlbmRlbmNpZXM6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJ1bnMgdGhlIHRlbXBsYXRlIHN5bmNocm9uaXphdGlvbiBwcm9jZXNzLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBvcmNoZXN0cmF0ZXMgdGhlIGRvd25sb2FkaW5nIG9mIHZhcmlvdXMgcHJvamVjdCBjb21wb25lbnRzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhcmdzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBUIGFzIFRlbXBsYXRlU3luY1xuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgZ2V0TGljZW5zZVxuICAgKiAgIHBhcnRpY2lwYW50IEkgYXMgZ2V0SWRlXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBnZXRTY3JpcHRzXG4gICAqICAgcGFydGljaXBhbnQgU3QgYXMgZ2V0U3R5bGVzXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBnZXREb2NzXG4gICAqICAgcGFydGljaXBhbnQgVyBhcyBnZXRXb3JrZmxvd3NcbiAgICogICBwYXJ0aWNpcGFudCBUZSBhcyBnZXRUZW1wbGF0ZXNcbiAgICogICBULT4+VDogUGFyc2UgYXJndW1lbnRzXG4gICAqICAgYWx0IGFsbCBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5UOiBTZXQgYWxsIGNvbXBvbmVudCBmbGFncyB0byB0cnVlXG4gICAqICAgZW5kXG4gICAqICAgYWx0IGxpY2Vuc2UgaXMgc3BlY2lmaWVkXG4gICAqICAgICBULT4+TDogZ2V0TGljZW5zZShsaWNlbnNlKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBpZGUgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+STogZ2V0SWRlKClcbiAgICogICBlbmRcbiAgICogICBhbHQgc2NyaXB0cyBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5TOiBnZXRTY3JpcHRzKClcbiAgICogICBlbmRcbiAgICogICBhbHQgc3R5bGVzIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+PlN0OiBnZXRTdHlsZXMoKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBkb2NzIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+PkQ6IGdldERvY3MoKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCB3b3JrZmxvd3MgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+VzogZ2V0V29ya2Zsb3dzKClcbiAgICogICBlbmRcbiAgICogICBhbHQgdGVtcGxhdGVzIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+PlRlOiBnZXRUZW1wbGF0ZXMoKVxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcnVuKFxuICAgIGFyZ3M6IExvZ2dpbmdDb25maWcgJlxuICAgICAgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzICYgeyBbayBpbiBrZXlvZiB0eXBlb2YgYXJnenpdOiB1bmtub3duIH1cbiAgKSB7XG4gICAgbGV0IHsgbGljZW5zZSB9ID0gYXJncztcbiAgICBjb25zdCB7IGJvb3QgfSA9IGFyZ3M7XG4gICAgbGV0IHtcbiAgICAgIGFsbCxcbiAgICAgIHNjcmlwdHMsXG4gICAgICBzdHlsZXMsXG4gICAgICBkb2NzLFxuICAgICAgaWRlLFxuICAgICAgd29ya2Zsb3dzLFxuICAgICAgdGVtcGxhdGVzLFxuICAgICAgZG9ja2VyLFxuICAgICAgdHlwZXNjcmlwdCxcbiAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgIHRlc3RzLFxuICAgICAgYXV0b21hdGlvbixcbiAgICAgIHBrZyxcbiAgICB9ID0gYXJncztcbiAgICBpZiAoXG4gICAgICBzY3JpcHRzIHx8XG4gICAgICBzdHlsZXMgfHxcbiAgICAgIGRvY3MgfHxcbiAgICAgIGlkZSB8fFxuICAgICAgd29ya2Zsb3dzIHx8XG4gICAgICB0ZW1wbGF0ZXMgfHxcbiAgICAgIGRvY2tlciB8fFxuICAgICAgdHlwZXNjcmlwdCB8fFxuICAgICAgYXV0b21hdGlvbiB8fFxuICAgICAgZGVwZW5kZW5jaWVzIHx8XG4gICAgICB0ZXN0cyB8fFxuICAgICAgcGtnXG4gICAgKVxuICAgICAgYWxsID0gZmFsc2U7XG5cbiAgICBpZiAoYm9vdCkge1xuICAgICAgY29uc3Qgb3JnID0gYXdhaXQgdGhpcy5nZXRPcmcoKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgICAgXCJQcm9qZWN0IG5hbWVcIixcbiAgICAgICAgXCJFbnRlciB0aGUgcHJvamVjdCBuYW1lOlwiLFxuICAgICAgICAocmVzOiBzdHJpbmcpID0+IHJlcy5sZW5ndGggPiAxXG4gICAgICApO1xuICAgICAgY29uc3QgYXV0aG9yID0gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgIFwiQXV0aG9yXCIsXG4gICAgICAgIFwiRW50ZXIgdGhlIGF1dGhvciBuYW1lOlwiLFxuICAgICAgICAocmVzOiBzdHJpbmcpID0+IHJlcy5sZW5ndGggPiAxXG4gICAgICApO1xuICAgICAgY29uc3QgcGtnTmFtZSA9IG9yZyA/IGBAJHtvcmd9LyR7bmFtZX1gIDogbmFtZTtcblxuICAgICAgYXdhaXQgdGhpcy5pbml0UGFja2FnZShwa2dOYW1lLCBhdXRob3IsIGxpY2Vuc2UgYXMgc3RyaW5nKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlVG9rZW5GaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5hdWRpdEZpeCgpO1xuICAgICAgdGhpcy5wYXRjaEZpbGVzKCk7XG4gICAgfVxuXG4gICAgaWYgKGFsbCkge1xuICAgICAgc2NyaXB0cyA9IGZhbHNlO1xuICAgICAgc3R5bGVzID0gdHJ1ZTtcbiAgICAgIGRvY3MgPSB0cnVlO1xuICAgICAgaWRlID0gdHJ1ZTtcbiAgICAgIHdvcmtmbG93cyA9IHRydWU7XG4gICAgICB0ZW1wbGF0ZXMgPSB0cnVlO1xuICAgICAgZG9ja2VyID0gdHJ1ZTtcbiAgICAgIHR5cGVzY3JpcHQgPSB0cnVlO1xuICAgICAgcGtnID0gdHJ1ZTtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHRydWU7XG4gICAgICB0ZXN0cyA9IHRydWU7XG4gICAgICBhdXRvbWF0aW9uID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzY3JpcHRzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgc2NyaXB0cyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwic2NyaXB0c1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBzY3JpcHRzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgaWYgKHNjcmlwdHMpIGF3YWl0IHRoaXMuZ2V0U2NyaXB0cygpO1xuXG4gICAgdGhpcy5sb2FkVmFsdWVzRnJvbVBhY2thZ2UoKTtcbiAgICBpZiAoIWFsbCAmJiB0eXBlb2YgbGljZW5zZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgY29uZmlybWF0aW9uID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJsaWNlbnNlXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gc2V0IGEgbGljZW5zZT9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlmIChjb25maXJtYXRpb24pXG4gICAgICAgIGxpY2Vuc2UgPSBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgICAgICBcImxpY2Vuc2VcIixcbiAgICAgICAgICBcIkVudGVyIHRoZSBkZXNpcmVkIExpY2Vuc2UgKE1JVHxHUEx8QXBhY2hlfExHUEx8QUdQTCk6XCIsXG4gICAgICAgICAgKHZhbCkgPT4gISF2YWwgJiYgISF2YWwubWF0Y2goL14oTUlUfEdQTHxBcGFjaGV8TEdQTHxBR1BMKSQvZylcbiAgICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBsaWNlbnNlICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgYXdhaXQgdGhpcy5nZXRMaWNlbnNlKFxuICAgICAgICBsaWNlbnNlIGFzIFwiTUlUXCIgfCBcIkdQTFwiIHwgXCJBcGFjaGVcIiB8IFwiTEdQTFwiIHwgXCJBR1BMXCJcbiAgICAgICk7XG5cbiAgICBpZiAodHlwZW9mIGlkZSA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGlkZSA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwiaWRlXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IGlkZSBjb25maWdzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgaWYgKGlkZSkgYXdhaXQgdGhpcy5nZXRJZGUoKTtcblxuICAgIGlmICh0eXBlb2YgdHlwZXNjcmlwdCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHR5cGVzY3JpcHQgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInR5cGVzY3JpcHRcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgdHlwZXNjcmlwdCBjb25maWdzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmICh0eXBlc2NyaXB0KSBhd2FpdCB0aGlzLmdldFR5cGVzY3JpcHQoKTtcblxuICAgIGlmICh0eXBlb2YgZG9ja2VyID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgZG9ja2VyID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJkb2NrZXJcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgZG9ja2VyIGNvbmZpZ3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICBpZiAoZG9ja2VyKSBhd2FpdCB0aGlzLmdldERvY2tlcigpO1xuICAgIGlmICh0eXBlb2YgYXV0b21hdGlvbiA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGF1dG9tYXRpb24gPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcImF1dG9tYXRpb25cIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgYXV0b21hdGlvbiBjb25maWdzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmIChhdXRvbWF0aW9uKSBhd2FpdCB0aGlzLmdldEF1dG9tYXRpb24oKTtcblxuICAgIGlmICh0eXBlb2Ygc3R5bGVzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgc3R5bGVzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJzdHlsZXNcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgc3R5bGVzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmIChzdHlsZXMpIGF3YWl0IHRoaXMuZ2V0U3R5bGVzKCk7XG5cbiAgICBpZiAodHlwZW9mIGRvY3MgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBkb2NzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJkb2NzXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IGRvY3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKGRvY3MpIGF3YWl0IHRoaXMuZ2V0RG9jcygpO1xuICAgIGlmICh0eXBlb2Ygd29ya2Zsb3dzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgd29ya2Zsb3dzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJ3b3JrZmxvd3NcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgd29ya2Zsb3dzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmICh3b3JrZmxvd3MpIGF3YWl0IHRoaXMuZ2V0V29ya2Zsb3dzKCk7XG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZXMgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0ZW1wbGF0ZXMgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInRlbXBsYXRlc1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCB0ZW1wbGF0ZXM/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHRlbXBsYXRlcykgYXdhaXQgdGhpcy5nZXRUZW1wbGF0ZXMoKTtcbiAgICBpZiAodHlwZW9mIHBrZyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHBrZyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwicGtnXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gdXBkYXRlIHlvdXIgcGFja2FnZS5qc29uIHNjcmlwdHM/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHBrZykgYXdhaXQgdGhpcy51cGRhdGVQYWNrYWdlU2NyaXBzKCk7XG5cbiAgICBpZiAodHlwZW9mIHRlc3RzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgdGVzdHMgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInBrZ1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHVwZGF0ZSB5b3VyIHRlc3QgY29uZmlncz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAodGVzdHMpIGF3YWl0IHRoaXMuZ2V0VGVzdHMoKTtcblxuICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jaWVzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgZGVwZW5kZW5jaWVzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJwa2dcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byB1cGRhdGUgZGV2IGRlcGVuZGVuY2llcz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAoZGVwZW5kZW5jaWVzKSBhd2FpdCB0aGlzLnVwZGF0ZURlcGVuZGVuY2llcygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTdGFuZGFyZE91dHB1dFdyaXRlciB9IGZyb20gXCIuL1N0YW5kYXJkT3V0cHV0V3JpdGVyXCI7XG5pbXBvcnQgeyBQcm9taXNlRXhlY3V0b3IgfSBmcm9tIFwiLi4vdXRpbHMvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzcGVjaWFsaXplZCBvdXRwdXQgd3JpdGVyIHRoYXQgdXNlcyByZWd1bGFyIGV4cHJlc3Npb25zIHRvIHByb2Nlc3Mgb3V0cHV0LlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBleHRlbmRzIFN0YW5kYXJkT3V0cHV0V3JpdGVyIHRvIHByb3ZpZGUgcmVnZXgtYmFzZWQgb3V0cHV0IHByb2Nlc3NpbmcuXG4gKiBJdCBhbGxvd3MgZm9yIHBhdHRlcm4gbWF0Y2hpbmcgaW4gdGhlIG91dHB1dCBzdHJlYW0gYW5kIGNhbiB0cmlnZ2VyIHNwZWNpZmljIGFjdGlvbnNcbiAqIGJhc2VkIG9uIG1hdGNoZWQgcGF0dGVybnMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgcmVzb2x2ZWQgdmFsdWUsIGRlZmF1bHRpbmcgdG8gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBsb2NrIC0gQSBQcm9taXNlRXhlY3V0b3IgdG8gY29udHJvbCB0aGUgYXN5bmNocm9ub3VzIGZsb3cuXG4gKiBAcGFyYW0gcmVnZXhwIC0gQSBzdHJpbmcgb3IgUmVnRXhwIHRvIG1hdGNoIGFnYWluc3QgdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBmbGFncyAtIE9wdGlvbmFsIGZsYWdzIGZvciB0aGUgUmVnRXhwIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgUmVnZXhwT3V0cHV0V3JpdGVyIGV4dGVuZHMgU3RhbmRhcmRPdXRwdXRXcml0ZXI8c3RyaW5nPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBtYXRjaGluZyBvdXRwdXQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgcmVhZG9ubHkgcHJvcGVydHkgc3RvcmVzIHRoZSBjb21waWxlZCBSZWdFeHAgdXNlZCBmb3IgcGF0dGVybiBtYXRjaGluZy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZWdleHA6IFJlZ0V4cDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIFJlZ2V4cE91dHB1dFdyaXRlci5cbiAgICogQHN1bW1hcnkgQ29uc3RydWN0cyB0aGUgUmVnZXhwT3V0cHV0V3JpdGVyIHdpdGggYSBsb2NrIG1lY2hhbmlzbSBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBjbWRcbiAgICogQHBhcmFtIGxvY2sgLSBBIFByb21pc2VFeGVjdXRvciB0byBjb250cm9sIHRoZSBhc3luY2hyb25vdXMgZmxvdy5cbiAgICogQHBhcmFtIHJlZ2V4cCAtIEEgc3RyaW5nIG9yIFJlZ0V4cCB0byBtYXRjaCBhZ2FpbnN0IHRoZSBvdXRwdXQuXG4gICAqIEBwYXJhbSBmbGFncyAtIE9wdGlvbmFsIGZsYWdzIGZvciB0aGUgUmVnRXhwIGNvbnN0cnVjdG9yLCBkZWZhdWx0cyB0byBcImdcIi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNtZDogc3RyaW5nLFxuICAgIGxvY2s6IFByb21pc2VFeGVjdXRvcjxzdHJpbmcsIEVycm9yPixcbiAgICByZWdleHA6IHN0cmluZyB8IFJlZ0V4cCxcbiAgICBmbGFncyA9IFwiZ1wiXG4gICkge1xuICAgIHN1cGVyKGNtZCwgbG9jayk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVnZXhwID1cbiAgICAgICAgdHlwZW9mIHJlZ2V4cCA9PT0gXCJzdHJpbmdcIiA/IG5ldyBSZWdFeHAocmVnZXhwLCBmbGFncykgOiByZWdleHA7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbjogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGVzdHMgdGhlIGlucHV0IGRhdGEgYWdhaW5zdCB0aGUgc3RvcmVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbiB0aGUgaW5wdXQgZGF0YSBhbmQgcmV0dXJucyB0aGUgbWF0Y2ggcmVzdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIGV4ZWN1dGlvbiwgb3IgdW5kZWZpbmVkIGlmIGFuIGVycm9yIG9jY3Vycy5cbiAgICovXG4gIHByaXZhdGUgdGVzdChkYXRhOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlZ2V4cC5sYXN0SW5kZXggPSAwO1xuICAgIGxldCBtYXRjaDtcbiAgICB0cnkge1xuICAgICAgbWF0Y2ggPSB0aGlzLnJlZ2V4cC5leGVjKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmRlYnVnKGBGYWlsZWQgdG8gcGFyc2UgY2h1bms6ICR7ZGF0YX1cXG5FcnJvcjogJHtlfSBgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyB0aGUgZGF0YSBhbmQgcmVzb2x2ZXMgdGhlIHByb21pc2UgaWYgYSBtYXRjaCBpcyBmb3VuZC5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHRlc3QgbWV0aG9kIGFuZCByZXNvbHZlcyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBmaXJzdCBtYXRjaCBncm91cCBpZiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgdGVzdEFuZFJlc29sdmUoZGF0YTogc3RyaW5nKSB7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLnRlc3QoZGF0YSk7XG4gICAgaWYgKG1hdGNoKSB0aGlzLnJlc29sdmUobWF0Y2hbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyB0aGUgZGF0YSBhbmQgcmVqZWN0cyB0aGUgcHJvbWlzZSBpZiBhIG1hdGNoIGlzIGZvdW5kLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgdGVzdCBtZXRob2QgYW5kIHJlamVjdHMgdGhlIHByb21pc2Ugd2l0aCB0aGUgZmlyc3QgbWF0Y2ggZ3JvdXAgaWYgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgc3RyaW5nIHRvIHRlc3QgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRlc3RBbmRSZWplY3QoZGF0YTogc3RyaW5nKSB7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLnRlc3QoZGF0YSk7XG4gICAgaWYgKG1hdGNoKSB0aGlzLnJlamVjdChtYXRjaFswXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBpbmNvbWluZyBkYXRhIGNodW5rcy5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIHBhcmVudCBjbGFzcyBkYXRhIG1ldGhvZCBhbmQgdGhlbiB0ZXN0cyB0aGUgZGF0YSBmb3IgYSBtYXRjaCB0byBwb3RlbnRpYWxseSByZXNvbHZlIHRoZSBwcm9taXNlLlxuICAgKlxuICAgKiBAcGFyYW0gY2h1bmsgLSBUaGUgZGF0YSBjaHVuayB0byBwcm9jZXNzLlxuICAgKi9cbiAgZGF0YShjaHVuazogYW55KSB7XG4gICAgc3VwZXIuZGF0YShjaHVuayk7XG4gICAgdGhpcy50ZXN0QW5kUmVzb2x2ZShTdHJpbmcoY2h1bmspKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGluY29taW5nIGVycm9yIGNodW5rcy5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIHBhcmVudCBjbGFzcyBlcnJvciBtZXRob2QgYW5kIHRoZW4gdGVzdHMgdGhlIGRhdGEgZm9yIGEgbWF0Y2ggdG8gcG90ZW50aWFsbHkgcmVqZWN0IHRoZSBwcm9taXNlLlxuICAgKlxuICAgKiBAcGFyYW0gY2h1bmsgLSBUaGUgZXJyb3IgY2h1bmsgdG8gcHJvY2Vzcy5cbiAgICovXG4gIGVycm9yKGNodW5rOiBhbnkpIHtcbiAgICBzdXBlci5lcnJvcihjaHVuayk7XG4gICAgdGhpcy50ZXN0QW5kUmVqZWN0KFN0cmluZyhjaHVuaykpO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jbGlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vdXRwdXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93cml0ZXJzXCI7XG5cbi8qKlxuICogQG1vZHVsZSBAZGVjYWYtdHMvdXRpbHNcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgc2VydmVzIGEgbGlnaHQgdmVyc2lvbiBvZiBEZWNhZiBDTEkgdG9vbCwgcHJvdmlkaW5nIGEgY29tcHJlaGVuc2l2ZSBzZXQgb2YgdXRpbGl0aWVzXG4gKiBhbmQgZnVuY3Rpb25hbGl0aWVzIGZvciBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIG9wZXJhdGlvbnMuIEl0IGVuY29tcGFzc2VzIHNldmVyYWwga2V5IGNvbXBvbmVudHM6XG4gKlxuICogMS4gSW5wdXQgSGFuZGxpbmc6IE1hbmFnZXMgdXNlciBpbnB1dCBhbmQgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBwcm9jZXNzaW5nLlxuICogMi4gVXRpbGl0eSBGdW5jdGlvbnM6IE9mZmVycyBhIGNvbGxlY3Rpb24gb2YgaGVscGVyIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMuXG4gKiAzLiBUeXBlIERlZmluaXRpb25zOiBEZWZpbmVzIGN1c3RvbSB0eXBlcyBhbmQgaW50ZXJmYWNlcyB1c2VkIHRocm91Z2hvdXQgdGhlIG1vZHVsZS5cbiAqIDQuIE91dHB1dCBNYW5hZ2VtZW50OiBQcm92aWRlcyBkaWZmZXJlbnQgb3V0cHV0IHdyaXRpbmcgc3RyYXRlZ2llcyBmb3IgZmxleGlibGUgY29uc29sZSBvdXRwdXQgaGFuZGxpbmcuXG4gKlxuICogVGhlIG1vZHVsZSBpcyBkZXNpZ25lZCB0byBmYWNpbGl0YXRlIHRoZSBjcmVhdGlvbiBvZiByb2J1c3QgQ0xJIGFwcGxpY2F0aW9ucyBieSBvZmZlcmluZzpcbiAqIC0gU3RhbmRhcmRpemVkIGlucHV0IHBhcnNpbmcgYW5kIHZhbGlkYXRpb25cbiAqIC0gQ29uc2lzdGVudCBvdXRwdXQgZm9ybWF0dGluZyBhbmQgaGFuZGxpbmdcbiAqIC0gUmV1c2FibGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGNvbW1vbiBDTEkgdGFza3NcbiAqIC0gRXh0ZW5zaWJsZSBhcmNoaXRlY3R1cmUgZm9yIGFkZGluZyBuZXcgY29tbWFuZHMgYW5kIGZlYXR1cmVzXG4gKlxuICogSXQgc3VwcG9ydHMgdmFyaW91cyBvdXRwdXQgbW9kZXMsIGluY2x1ZGluZyBzdGFuZGFyZCBjb25zb2xlIG91dHB1dCBhbmQgcmVndWxhciBleHByZXNzaW9uLWJhc2VkIG91dHB1dCxcbiAqIGFsbG93aW5nIGZvciB2ZXJzYXRpbGUgZGF0YSBwcmVzZW50YXRpb24gYW5kIHByb2Nlc3NpbmcuIFRoZSBtb2R1bGFyIHN0cnVjdHVyZSBlbmFibGVzIGVhc3kgbWFpbnRlbmFuY2VcbiAqIGFuZCBleHRlbnNpb24gb2YgdGhlIENMSSBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGRldmVsb3BlcnMgYnVpbGRpbmcgY29tcGxleCBjb21tYW5kLWxpbmUgdG9vbHMgdGhhdCByZXF1aXJlXG4gKiBzdHJ1Y3R1cmVkIGlucHV0IGhhbmRsaW5nLCBmbGV4aWJsZSBvdXRwdXQgZm9ybWF0dGluZywgYW5kIGEgcmljaCBzZXQgb2YgdXRpbGl0eSBmdW5jdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbnN0YW50IHN0b3JlcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEBhc2Rhc2Rhc2QvdXRpbHMgbW9kdWxlLlxuICogVGhlIGFjdHVhbCB2ZXJzaW9uIG51bWJlciBpcyByZXBsYWNlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MsXG4gKiB3aXRoIHRoZSBwbGFjZWhvbGRlciBcIiMjVkVSU0lPTiMjXCIgYmVpbmcgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uLlxuICpcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJTZW1WZXJzaW9uIiwiVG9rZW5zIiwiTG9nTGV2ZWwiLCJzdHlsZSIsInBhcnNlQXJncyIsInNwYXduIiwib3B0aW9ucyIsIm5vZGVSZXNvbHZlIiwicm9sbHVwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7SUFFQTs7Ozs7SUFLRztBQUNJLFVBQU0sUUFBUSxHQUFHO0lBRXhCOzs7OztJQUtHO0FBQ0ksVUFBTSxlQUFlLEdBQzFCO0lBRUY7Ozs7O0lBS0c7QUFDU0E7SUFBWixDQUFBLFVBQVksVUFBVSxFQUFBOztJQUVwQixJQUFBLFVBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztJQUVmLElBQUEsVUFB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
4474
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL291dHB1dC9sb2dnaW5nLnRzIiwiLi4vc3JjL2lucHV0L2lucHV0LnRzIiwiLi4vc3JjL2NsaS9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvdGV4dC50cyIsIi4uL3NyYy93cml0ZXJzL1N0YW5kYXJkT3V0cHV0V3JpdGVyLnRzIiwiLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwiLi4vc3JjL3V0aWxzL2ZzLnRzIiwiLi4vc3JjL291dHB1dC9jb21tb24udHMiLCIuLi9zcmMvdXRpbHMvYWNjdW11bGF0b3IudHMiLCIuLi9zcmMvdXRpbHMvd2ViLnRzIiwiLi4vc3JjL3V0aWxzL2Vudmlyb25tZW50LnRzIiwiLi4vc3JjL2NsaS9jb21tYW5kLnRzIiwiLi4vc3JjL3V0aWxzL2h0dHAudHMiLCIuLi9zcmMvY2xpL2NvbW1hbmRzL2J1aWxkLXNjcmlwdHMudHMiLCIuLi9zcmMvY2xpL2NvbW1hbmRzL3RhZy1yZWxlYXNlLnRzIiwiLi4vc3JjL2NsaS9jb21tYW5kcy91cGRhdGUtc2NyaXB0cy50cyIsIi4uL3NyYy93cml0ZXJzL1JlZ2V4cE91dHB1dFdyaXRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnaW5nQ29uZmlnLCBUaGVtZSB9IGZyb20gXCIuLi9vdXRwdXQvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBlbmNvZGluZyBmb3IgdGV4dCBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgVGhlIHN0YW5kYXJkIFVURi04IGVuY29kaW5nIHVzZWQgZm9yIHRleHQgcHJvY2Vzc2luZy5cbiAqIEBjb25zdCB7c3RyaW5nfSBFbmNvZGluZ1xuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgRW5jb2RpbmcgPSBcInV0Zi04XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc2VtYW50aWMgdmVyc2lvbmluZy5cbiAqIEBzdW1tYXJ5IEEgcmVnZXggcGF0dGVybiB0byBtYXRjaCBhbmQgcGFyc2Ugc2VtYW50aWMgdmVyc2lvbiBzdHJpbmdzLlxuICogQGNvbnN0IHtSZWdFeHB9IFNlbVZlcnNpb25SZWdleFxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgU2VtVmVyc2lvblJlZ2V4ID1cbiAgL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKykoPzotKFswLTlBLVphLXotXSsoPzpcXC5bMC05QS1aYS16XSkpKS9nO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciBzZW1hbnRpYyB2ZXJzaW9uIGNvbXBvbmVudHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSB0aHJlZSBsZXZlbHMgb2Ygc2VtYW50aWMgdmVyc2lvbmluZzogUEFUQ0gsIE1JTk9SLCBhbmQgTUFKT1IuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgZW51bSBTZW1WZXJzaW9uIHtcbiAgLyoqIFBhdGNoIHZlcnNpb24gZm9yIGJhY2t3YXJkcy1jb21wYXRpYmxlIGJ1ZyBmaXhlcy4gKi9cbiAgUEFUQ0ggPSBcInBhdGNoXCIsXG4gIC8qKiBNaW5vciB2ZXJzaW9uIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSBuZXcgZmVhdHVyZXMuICovXG4gIE1JTk9SID0gXCJtaW5vclwiLFxuICAvKiogTWFqb3IgdmVyc2lvbiBmb3IgY2hhbmdlcyB0aGF0IGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqL1xuICBNQUpPUiA9IFwibWFqb3JcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmxhZyB0byBpbmRpY2F0ZSBub24tQ0kgZW52aXJvbm1lbnQuXG4gKiBAc3VtbWFyeSBVc2VkIHRvIHNwZWNpZnkgdGhhdCBhIGNvbW1hbmQgc2hvdWxkIHJ1biBvdXRzaWRlIG9mIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBlbnZpcm9ubWVudC5cbiAqIEBjb25zdCB7c3RyaW5nfSBOb0NJRkxhZ1xuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgTm9DSUZMYWcgPSBcIi1uby1jaVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHRoZSBzZXR1cCBzY3JpcHQgaW4gcGFja2FnZS5qc29uLlxuICogQHN1bW1hcnkgSWRlbnRpZmllcyB0aGUgc2NyaXB0IHRoYXQgcnVucyBhZnRlciBwYWNrYWdlIGluc3RhbGxhdGlvbi5cbiAqIEBjb25zdCB7c3RyaW5nfSBTZXR1cFNjcmlwdEtleVxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgU2V0dXBTY3JpcHRLZXkgPSBcInBvc3RpbnN0YWxsXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gZm9yIHZhcmlvdXMgYXV0aGVudGljYXRpb24gdG9rZW5zLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZmlsZSBuYW1lcyBmb3Igc3RvcmluZyBkaWZmZXJlbnQgdHlwZXMgb2YgYXV0aGVudGljYXRpb24gdG9rZW5zLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGVudW0gVG9rZW5zIHtcbiAgLyoqIEdpdCBhdXRoZW50aWNhdGlvbiB0b2tlbiBmaWxlIG5hbWUuICovXG4gIEdJVCA9IFwiLnRva2VuXCIsXG4gIC8qKiBOUE0gYXV0aGVudGljYXRpb24gdG9rZW4gZmlsZSBuYW1lLiAqL1xuICBOUE0gPSBcIi5ucG10b2tlblwiLFxuICAvKiogRG9ja2VyIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgRE9DS0VSID0gXCIuZG9ja2VydG9rZW5cIixcbiAgLyoqIENvbmZsdWVuY2UgYXV0aGVudGljYXRpb24gdG9rZW4gZmlsZSBuYW1lLiAqL1xuICBDT05GTFVFTkNFID0gXCIuY29uZmx1ZW5jZS10b2tlblwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciBsb2cgbGV2ZWxzLlxuICogQHN1bW1hcnkgRGVmaW5lcyBkaWZmZXJlbnQgbGV2ZWxzIG9mIGxvZ2dpbmcgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgLyoqIEVycm9yIGV2ZW50cyB0aGF0IGFyZSBsaWtlbHkgdG8gY2F1c2UgcHJvYmxlbXMuICovXG4gIGVycm9yID0gXCJlcnJvclwiLFxuICAvKiogUm91dGluZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBvbmdvaW5nIHN0YXR1cyBvciBwZXJmb3JtYW5jZS4gKi9cbiAgaW5mbyA9IFwiaW5mb1wiLFxuICAvKiogQWRkaXRpb25hbCByZWxldmFudCBpbmZvcm1hdGlvbi4gKi9cbiAgdmVyYm9zZSA9IFwidmVyYm9zZVwiLFxuICAvKiogRGVidWcgb3IgdHJhY2UgaW5mb3JtYXRpb24uICovXG4gIGRlYnVnID0gXCJkZWJ1Z1wiLFxuICAvKiogd2F5IHRvbyB2ZXJib3NlIG9yIHNpbGx5IGluZm9ybWF0aW9uLiAqL1xuICBzaWxseSA9IFwic2lsbHlcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTnVtZXJpYyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgbG9nIGxldmVscyBmb3IgY29tcGFyaXNvbiBhbmQgZmlsdGVyaW5nLlxuICogQGNvbnN0IHtPYmplY3R9IE51bWVyaWNMb2dMZXZlbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlcnJvciAtIE51bWVyaWMgdmFsdWUgZm9yIGVycm9yIGxldmVsICgwKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmZvIC0gTnVtZXJpYyB2YWx1ZSBmb3IgaW5mbyBsZXZlbCAoMikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIE51bWVyaWMgdmFsdWUgZm9yIHZlcmJvc2UgbGV2ZWwgKDQpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlYnVnIC0gTnVtZXJpYyB2YWx1ZSBmb3IgZGVidWcgbGV2ZWwgKDUpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNpbGx5IC0gTnVtZXJpYyB2YWx1ZSBmb3Igc2lsbHkgbGV2ZWwgKDgpLlxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgTnVtZXJpY0xvZ0xldmVscyA9IHtcbiAgZXJyb3I6IDIsXG4gIGluZm86IDQsXG4gIHZlcmJvc2U6IDYsXG4gIGRlYnVnOiA3LFxuICBzaWxseTogOSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgdGhlbWUgZm9yIHN0eWxpbmcgbG9nIG91dHB1dC5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgY29sb3IgYW5kIHN0eWxlIHNldHRpbmdzIGZvciB2YXJpb3VzIGNvbXBvbmVudHMgb2YgbG9nIG1lc3NhZ2VzLlxuICogQGNvbnN0IERlZmF1bHRUaGVtZVxuICogQHR5cGVkZWYge1RoZW1lfSBEZWZhdWx0VGhlbWVcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjbGFzcyAtIFN0eWxpbmcgZm9yIGNsYXNzIG5hbWVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNsYXNzLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBjbGFzcyBuYW1lcyAoNCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gaWQgLSBTdHlsaW5nIGZvciBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZC5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgaWRlbnRpZmllcnMgKDM2KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzdGFjayAtIFN0eWxpbmcgZm9yIHN0YWNrIHRyYWNlcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0aW1lc3RhbXAgLSBTdHlsaW5nIGZvciB0aW1lc3RhbXBzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1lc3NhZ2UgLSBTdHlsaW5nIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWVzc2FnZS5lcnJvciAtIFN0eWxpbmcgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1lc3NhZ2UuZXJyb3IuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGVycm9yIG1lc3NhZ2VzICgzNCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWV0aG9kIC0gU3R5bGluZyBmb3IgbWV0aG9kIG5hbWVzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsIC0gU3R5bGluZyBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuZXJyb3IgLSBTdHlsaW5nIGZvciBlcnJvciBsZXZlbCBsb2dzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvZ0xldmVsLmVycm9yLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBlcnJvciBsZXZlbCBsb2dzICg2KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC5pbmZvIC0gU3R5bGluZyBmb3IgaW5mbyBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLnZlcmJvc2UgLSBTdHlsaW5nIGZvciB2ZXJib3NlIGxldmVsIGxvZ3MgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuZGVidWcgLSBTdHlsaW5nIGZvciBkZWJ1ZyBsZXZlbCBsb2dzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvZ0xldmVsLmRlYnVnLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBkZWJ1ZyBsZXZlbCBsb2dzICg3KS5cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRUaGVtZTogVGhlbWUgPSB7XG4gIGNsYXNzOiB7XG4gICAgZmc6IDM0LFxuICB9LFxuICBpZDoge1xuICAgIGZnOiAzNixcbiAgfSxcbiAgc3RhY2s6IHt9LFxuICB0aW1lc3RhbXA6IHt9LFxuICBtZXNzYWdlOiB7XG4gICAgZXJyb3I6IHtcbiAgICAgIGZnOiAzMSxcbiAgICB9LFxuICB9LFxuICBtZXRob2Q6IHt9LFxuICBsb2dMZXZlbDoge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICAgIGluZm86IHt9LFxuICAgIHZlcmJvc2U6IHt9LFxuICAgIGRlYnVnOiB7XG4gICAgICBmZzogMzMsXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgbG9nZ2luZy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBsb2dnaW5nIHN5c3RlbSwgaW5jbHVkaW5nIHZlcmJvc2l0eSwgbG9nIGxldmVsLCBzdHlsaW5nLCBhbmQgdGltZXN0YW1wIGZvcm1hdC5cbiAqIEBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZ1xuICogQHR5cGVkZWYge0xvZ2dpbmdDb25maWd9IERlZmF1bHRMb2dnaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIFZlcmJvc2l0eSBsZXZlbCAoMCkuXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsfSBsZXZlbCAtIERlZmF1bHQgbG9nIGxldmVsIChMb2dMZXZlbC5pbmZvKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3R5bGUgLSBXaGV0aGVyIHRvIGFwcGx5IHN0eWxpbmcgdG8gbG9nIG91dHB1dCAoZmFsc2UpLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0aW1lc3RhbXAgLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGltZXN0YW1wcyBpbiBsb2cgbWVzc2FnZXMgKHRydWUpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVzdGFtcEZvcm1hdCAtIEZvcm1hdCBmb3IgdGltZXN0YW1wcyAoXCJISDptbTpzcy5TU1NcIikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNvbnRleHQgLSBXaGV0aGVyIHRvIGluY2x1ZGUgY29udGV4dCBpbmZvcm1hdGlvbiBpbiBsb2cgbWVzc2FnZXMgKHRydWUpLlxuICogQHByb3BlcnR5IHtUaGVtZX0gdGhlbWUgLSBUaGUgdGhlbWUgdG8gdXNlIGZvciBzdHlsaW5nIGxvZyBtZXNzYWdlcyAoRGVmYXVsdFRoZW1lKS5cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRMb2dnaW5nQ29uZmlnOiBMb2dnaW5nQ29uZmlnID0ge1xuICB2ZXJib3NlOiAwLFxuICBsZXZlbDogTG9nTGV2ZWwuaW5mbyxcbiAgbG9nTGV2ZWw6IHRydWUsXG4gIHN0eWxlOiBmYWxzZSxcbiAgc2VwYXJhdG9yOiBcIiAtIFwiLFxuICB0aW1lc3RhbXA6IHRydWUsXG4gIHRpbWVzdGFtcEZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgY29udGV4dDogdHJ1ZSxcbiAgdGhlbWU6IERlZmF1bHRUaGVtZSxcbn07XG5cbmV4cG9ydCBjb25zdCBBYm9ydENvZGUgPSBcIkFib3J0ZWRcIjtcbiIsImltcG9ydCB7XG4gIERlZmF1bHRMb2dnaW5nQ29uZmlnLFxuICBEZWZhdWx0VGhlbWUsXG4gIExvZ0xldmVsLFxuICBOdW1lcmljTG9nTGV2ZWxzLFxufSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBMb2dnaW5nQ29uZmlnLFxuICBMb2dnaW5nQ29udGV4dCxcbiAgU3RyaW5nTGlrZSxcbiAgVGhlbWUsXG4gIFRoZW1lT3B0aW9uLFxuICBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwsXG4gIFZlcmJvc2l0eUxvZ2dlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbG9yaXplT3B0aW9ucywgc3R5bGUsIFN0eWxlZFN0cmluZyB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBtaW5pbWFsIGxvZ2dlciBpbXBsZW1lbnRhdGlvbi5cbiAqIEBzdW1tYXJ5IE1pbmlMb2dnZXIgaXMgYSBsaWdodHdlaWdodCBsb2dnaW5nIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgVmVyYm9zaXR5TG9nZ2VyIGludGVyZmFjZS5cbiAqIEl0IHByb3ZpZGVzIGJhc2ljIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eSB3aXRoIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBsb2cgbGV2ZWxzIGFuZCB2ZXJib3NpdHkuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBNaW5pTG9nZ2VyIGltcGxlbWVudHMgVmVyYm9zaXR5TG9nZ2VyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IE1pbmlMb2dnZXIgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgTWluaUxvZ2dlciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLCBvcHRpb25hbCBjb25maWd1cmF0aW9uLCBhbmQgbWV0aG9kIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHVzaW5nIHRoaXMgbG9nZ2VyLlxuICAgKiBAcGFyYW0gW2NvbmZdIC0gT3B0aW9uYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBJbmZvIGxldmVsIGFuZCB2ZXJib3NpdHkgMC5cbiAgICogQHBhcmFtIFtpZF0gLSBPcHRpb25hbCB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb250ZXh0OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGNvbmY/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIHByb3RlY3RlZCBpZD86IHN0cmluZ1xuICApIHt9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZyhcbiAgICBrZXk6IGtleW9mIExvZ2dpbmdDb25maWdcbiAgKTogTG9nZ2luZ0NvbmZpZ1trZXlvZiBMb2dnaW5nQ29uZmlnXSB7XG4gICAgaWYgKHRoaXMuY29uZiAmJiBrZXkgaW4gdGhpcy5jb25mKSByZXR1cm4gdGhpcy5jb25mW2tleV07XG4gICAgcmV0dXJuIExvZ2dpbmcuZ2V0Q29uZmlnKClba2V5XTtcbiAgfVxuXG4gIGZvcihcbiAgICBtZXRob2Q/OiBzdHJpbmcgfCAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpLFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz5cbiAgKTogVmVyYm9zaXR5TG9nZ2VyIHtcbiAgICBtZXRob2QgPSBtZXRob2RcbiAgICAgID8gdHlwZW9mIG1ldGhvZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1ldGhvZFxuICAgICAgICA6IG1ldGhvZC5uYW1lXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiBMb2dnaW5nLmZvcihbdGhpcy5jb250ZXh0LCBtZXRob2RdLmpvaW4oXCIuXCIpLCB0aGlzLmlkLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZm9ybWF0dGVkIGxvZyBzdHJpbmcuXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGxvZyBzdHJpbmcgd2l0aCB0aW1lc3RhbXAsIGNvbG9yZWQgbG9nIGxldmVsLCBhbmQgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIGxldmVsIC0gVGhlIGxvZyBsZXZlbCBhcyBhIHN0cmluZy5cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHN0YWNrXG4gICAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9nIHN0cmluZy5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVMb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1lc3NhZ2U6IFN0cmluZ0xpa2UgfCBFcnJvcixcbiAgICBzdGFjaz86IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvZzogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuY29uZmlnKFwic3R5bGVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnKFwidGltZXN0YW1wXCIpKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gc3R5bGUgPyBMb2dnaW5nLnRoZW1lKGRhdGUsIFwidGltZXN0YW1wXCIsIGxldmVsKSA6IGRhdGU7XG4gICAgICBsb2cucHVzaCh0aW1lc3RhbXApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZyhcImxvZ0xldmVsXCIpKSB7XG4gICAgICBjb25zdCBsdmw6IHN0cmluZyA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShsZXZlbCwgXCJsb2dMZXZlbFwiLCBsZXZlbClcbiAgICAgICAgOiBsZXZlbDtcbiAgICAgIGxvZy5wdXNoKGx2bCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwiY29udGV4dFwiKSkge1xuICAgICAgY29uc3QgY29udGV4dDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKHRoaXMuY29udGV4dCwgXCJjbGFzc1wiLCBsZXZlbClcbiAgICAgICAgOiB0aGlzLmNvbnRleHQ7XG4gICAgICBsb2cucHVzaChjb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBtc2c6IHN0cmluZyA9IHN0eWxlXG4gICAgICA/IExvZ2dpbmcudGhlbWUoXG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogKG1lc3NhZ2UgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgbGV2ZWxcbiAgICAgICAgKVxuICAgICAgOiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1lc3NhZ2VcbiAgICAgICAgOiAobWVzc2FnZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICBsb2cucHVzaChtc2cpO1xuICAgIGlmIChzdGFjayB8fCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHN0YWNrID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKFxuICAgICAgICAgICAgKHN0YWNrIHx8IChtZXNzYWdlIGFzIEVycm9yKS5zdGFjaykgYXMgc3RyaW5nLFxuICAgICAgICAgICAgXCJzdGFja1wiLFxuICAgICAgICAgICAgbGV2ZWxcbiAgICAgICAgICApXG4gICAgICAgIDogc3RhY2s7XG4gICAgICBsb2cucHVzaChgXFxuU3RhY2sgdHJhY2U6XFxuJHtzdGFja31gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nLmpvaW4odGhpcy5jb25maWcoXCJzZXBhcmF0b3JcIikgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIG1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGxvZyBsZXZlbC5cbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBsb2dnZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9nIGxldmVsLFxuICAgKiB0aGVuIHVzZXMgdGhlIGFwcHJvcHJpYXRlIGNvbnNvbGUgbWV0aG9kIHRvIG91dHB1dCB0aGUgbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gc3RhY2tcbiAgICovXG4gIHByb3RlY3RlZCBsb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1zZzogU3RyaW5nTGlrZSB8IEVycm9yLFxuICAgIHN0YWNrPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIE51bWVyaWNMb2dMZXZlbHNbdGhpcy5jb25maWcoXCJsZXZlbFwiKSBhcyBMb2dMZXZlbF0gPFxuICAgICAgTnVtZXJpY0xvZ0xldmVsc1tsZXZlbF1cbiAgICApXG4gICAgICByZXR1cm47XG4gICAgbGV0IG1ldGhvZDtcbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlIExvZ0xldmVsLmluZm86XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUubG9nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwudmVyYm9zZTpcbiAgICAgIGNhc2UgTG9nTGV2ZWwuZGVidWc6XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUuZGVidWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC5lcnJvcjpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5lcnJvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZyBsZXZlbFwiKTtcbiAgICB9XG4gICAgbWV0aG9kKHRoaXMuY3JlYXRlTG9nKGxldmVsLCBtc2csIHN0YWNrKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExMb2dzIGEgYHdheSB0b28gdmVyYm9zZWAgb3IgYSBzaWxseSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgU2lsbHkgbGV2ZWwgaWYgdGhlIGN1cnJlbnQgdmVyYm9zaXR5IGFsbG93cyBpdC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgc2lsbHkobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSB2ZXJib3NlIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBWZXJib3NlIGxldmVsIGlmIHRoZSBjdXJyZW50IHZlcmJvc2l0eSBhbGxvd3MgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChkZWZhdWx0OiAwKS5cbiAgICovXG4gIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gaW5mbyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgSW5mbyBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGluZm8obXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuaW5mbywgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIGRlYnVnIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBEZWJ1ZyBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmRlYnVnLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBFcnJvciBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGVycm9yKG1zZzogU3RyaW5nTGlrZSB8IEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuZXJyb3IsIG1zZyk7XG4gIH1cblxuICBzZXRDb25maWcoY29uZmlnOiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+KSB7XG4gICAgdGhpcy5jb25mID0geyAuLi4odGhpcy5jb25mIHx8IHt9KSwgLi4uY29uZmlnIH07XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzdGF0aWMgY2xhc3MgZm9yIG1hbmFnaW5nIGxvZ2dpbmcgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoZSBMb2dnaW5nIGNsYXNzIHByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgbG9nZ2luZyBtZWNoYW5pc20gd2l0aCBzdXBwb3J0IGZvclxuICogZGlmZmVyZW50IGxvZyBsZXZlbHMgYW5kIHZlcmJvc2l0eS4gSXQgdXNlcyBhIHNpbmdsZXRvbiBwYXR0ZXJuIHRvIG1haW50YWluIGEgZ2xvYmFsXG4gKiBsb2dnZXIgaW5zdGFuY2UgYW5kIGFsbG93cyBjcmVhdGluZyBzcGVjaWZpYyBsb2dnZXJzIGZvciBkaWZmZXJlbnQgY2xhc3NlcyBhbmQgbWV0aG9kcy5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dpbmcge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBWZXJib3NpdHlMb2dnZXIgdXNlZCBmb3IgZ2xvYmFsIGxvZ2dpbmcuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnbG9iYWw/OiBWZXJib3NpdHlMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBsb2dnZXIgaW5zdGFuY2VzLlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBuZXcgVmVyYm9zaXR5TG9nZ2VyIGluc3RhbmNlcy4gQnkgZGVmYXVsdCwgaXQgY3JlYXRlcyBhIE1pbmlMb2dnZXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfZmFjdG9yeTogKFxuICAgIG9iamVjdDogc3RyaW5nLFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgaWQ/OiBzdHJpbmdcbiAgKSA9PiBWZXJib3NpdHlMb2dnZXIgPSAoXG4gICAgb2JqZWN0OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgICBpZD86IHN0cmluZ1xuICApID0+IHtcbiAgICByZXR1cm4gbmV3IE1pbmlMb2dnZXIob2JqZWN0LCBjb25maWcsIGlkKTtcbiAgfTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZvciB0aGUgbG9nZ2luZyBzeXN0ZW0uXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgZ2xvYmFsIHZlcmJvc2l0eSBsZXZlbCBhbmQgbG9nIGxldmVsIHNldHRpbmdzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2NvbmZpZzogTG9nZ2luZ0NvbmZpZyA9IERlZmF1bHRMb2dnaW5nQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluc3RhbnRpYXRpb24uXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgdGhhdCB0aGUgTG9nZ2luZyBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGFzIGl0J3MgZGVzaWduZWQgdG8gYmUgdXNlZCBzdGF0aWNhbGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXR0ZXIgZm9yIHRoZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBzdW1tYXJ5IEFsbG93cyB1cGRhdGluZyB0aGUgZ2xvYmFsIGxvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFuIG9iamVjdCBjb250YWluaW5nIHZlcmJvc2l0eSBhbmQgbG9nIGxldmVsIHNldHRpbmdzLlxuICAgKi9cbiAgc3RhdGljIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NvbmZpZywgY29uZmlnKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDb25maWcoKTogTG9nZ2luZ0NvbmZpZyB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2NvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBjcmVhdGVzIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBleGlzdGluZyBnbG9iYWwgbG9nZ2VyIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAqXG4gICAqIEByZXR1cm4gVGhlIGdsb2JhbCBWZXJib3NpdHlMb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0KCk6IFZlcmJvc2l0eUxvZ2dlciB7XG4gICAgdGhpcy5nbG9iYWwgPSB0aGlzLmdsb2JhbCA/IHRoaXMuZ2xvYmFsIDogdGhpcy5fZmFjdG9yeShcIkxvZ2dpbmdcIik7XG4gICAgcmV0dXJuIHRoaXMuZ2xvYmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgdmVyYm9zZSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIHZlcmJvc2UgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgc3RhdGljIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS52ZXJib3NlKG1zZywgdmVyYm9zaXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBpbmZvIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgaW5mbyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGluZm8obXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuaW5mbyhtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgZGVidWcgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBkZWJ1ZyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmRlYnVnKG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBzaWxseSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGRlYnVnIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgc2lsbHkobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuc2lsbHkobXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGVycm9yIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBzdGF0aWMgZXJyb3IobXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkuZXJyb3IobXNnKTtcbiAgfVxuXG4gIHN0YXRpYyBmb3IoXG4gICAgb2JqZWN0OiBMb2dnaW5nQ29udGV4dCxcbiAgICBpZD86IHN0cmluZyB8IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPlxuICApOiBWZXJib3NpdHlMb2dnZXIge1xuICAgIG9iamVjdCA9IHR5cGVvZiBvYmplY3QgPT09IFwic3RyaW5nXCIgPyBvYmplY3QgOiBvYmplY3QubmFtZTtcbiAgICBpZCA9IHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIiA/IGlkIDogdW5kZWZpbmVkO1xuICAgIGNvbmZpZyA9IHR5cGVvZiBpZCA9PT0gXCJvYmplY3RcIiA/IChpZCBhcyBQYXJ0aWFsPExvZ2dpbmdDb25maWc+KSA6IGNvbmZpZztcbiAgICByZXR1cm4gdGhpcy5fZmFjdG9yeShvYmplY3QsIGNvbmZpZywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9nZ2VyIGZvciBhIHNwZWNpZmljIHJlYXNvbiBvciBjb250ZXh0LlxuICAgKlxuICAgKiBAc3VtbWFyeSBUaGlzIHN0YXRpYyBtZXRob2QgY3JlYXRlcyBhIG5ldyBsb2dnZXIgaW5zdGFuY2UgdXNpbmcgdGhlIGZhY3RvcnkgZnVuY3Rpb24sXG4gICAqIGJhc2VkIG9uIGEgZ2l2ZW4gcmVhc29uIG9yIGNvbnRleHQuXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSByZWFzb24gb3IgY29udGV4dCBmb3IgY3JlYXRpbmcgdGhpcyBsb2dnZXIuXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcmV0dXJucyBBIG5ldyBWZXJib3NpdHlMb2dnZXIgb3IgQ2xhc3NMb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgYmVjYXVzZShyZWFzb246IHN0cmluZywgaWQ/OiBzdHJpbmcpOiBWZXJib3NpdHlMb2dnZXIge1xuICAgIHJldHVybiB0aGlzLl9mYWN0b3J5KHJlYXNvbiwgdGhpcy5fY29uZmlnLCBpZCk7XG4gIH1cblxuICBzdGF0aWMgdGhlbWUoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHR5cGU6IGtleW9mIFRoZW1lIHwga2V5b2YgTG9nTGV2ZWwsXG4gICAgbG9nZ2VyTGV2ZWw6IExvZ0xldmVsLFxuICAgIHRlbXBsYXRlOiBUaGVtZSA9IERlZmF1bHRUaGVtZVxuICApIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zdHlsZSkgcmV0dXJuIHRleHQ7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5nZXQoKS5mb3IodGhpcy50aGVtZSk7XG5cbiAgICBmdW5jdGlvbiBhcHBseShcbiAgICAgIHR4dDogc3RyaW5nLFxuICAgICAgb3B0aW9uOiBrZXlvZiBUaGVtZU9wdGlvbixcbiAgICAgIHZhbHVlOiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IG51bWJlcltdIHwgc3RyaW5nW11cbiAgICApOiBzdHJpbmcge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdDogc3RyaW5nIHwgU3R5bGVkU3RyaW5nID0gdHh0O1xuICAgICAgICBsZXQgYyA9IHN0eWxlKHQpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5Q29sb3IoXG4gICAgICAgICAgdmFsOiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICBpc0JnID0gZmFsc2VcbiAgICAgICAgKTogU3R5bGVkU3RyaW5nIHtcbiAgICAgICAgICBsZXQgZjpcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuYmFja2dyb3VuZFxuICAgICAgICAgICAgfCB0eXBlb2YgYy5mb3JlZ3JvdW5kXG4gICAgICAgICAgICB8IHR5cGVvZiBjLnJnYlxuICAgICAgICAgICAgfCB0eXBlb2YgYy5jb2xvcjI1NiA9IGlzQmcgPyBjLmJhY2tncm91bmQgOiBjLmZvcmVncm91bmQ7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiAoZiBhcyB0eXBlb2YgYy5iYWNrZ3JvdW5kIHwgdHlwZW9mIGMuZm9yZWdyb3VuZCkuY2FsbChcbiAgICAgICAgICAgICAgYyxcbiAgICAgICAgICAgICAgdmFsdWUgYXMgbnVtYmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKHZhbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgZiA9IGlzQmcgPyBjLmJnQ29sb3IyNTYgOiBjLmNvbG9yMjU2O1xuICAgICAgICAgICAgICByZXR1cm4gKGYgYXMgdHlwZW9mIGMuYmdDb2xvcjI1NiB8IHR5cGVvZiBjLmNvbG9yMjU2KSh2YWxbMF0pO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBmID0gaXNCZyA/IGMuYmdSZ2IgOiBjLnJnYjtcbiAgICAgICAgICAgICAgcmV0dXJuIGMucmdiKHZhbFswXSwgdmFsWzFdLCB2YWxbMl0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3QgYSB2YWxpZCBjb2xvciBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgICByZXR1cm4gc3R5bGUodCBhcyBzdHJpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5U3R5bGUodjogbnVtYmVyIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBjID0gYy5zdHlsZSh2KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyA9IGNbdiBhcyBrZXlvZiBDb2xvcml6ZU9wdGlvbnNdIGFzIFN0eWxlZFN0cmluZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgIGNhc2UgXCJiZ1wiOlxuICAgICAgICAgIGNhc2UgXCJmZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIGFwcGx5Q29sb3IodmFsdWUgYXMgbnVtYmVyKS50ZXh0O1xuICAgICAgICAgIGNhc2UgXCJzdHlsZVwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goYXBwbHlTdHlsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhcHBseVN0eWxlKHZhbHVlIGFzIG51bWJlciB8IHN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYy50ZXh0O1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdCBhIHZhbGlkIHRoZW1lIG9wdGlvbjogJHtvcHRpb259YCk7XG4gICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3IgYXBwbHlpbmcgc3R5bGU6ICR7b3B0aW9ufSB3aXRoIHZhbHVlICR7dmFsdWV9YCk7XG4gICAgICAgIHJldHVybiB0eHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5kaXZpZHVhbFRoZW1lID0gdGVtcGxhdGVbdHlwZSBhcyBrZXlvZiBUaGVtZV07XG4gICAgaWYgKCFpbmRpdmlkdWFsVGhlbWUgfHwgIU9iamVjdC5rZXlzKGluZGl2aWR1YWxUaGVtZSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBsZXQgYWN0dWFsVGhlbWU6IFRoZW1lT3B0aW9uID0gaW5kaXZpZHVhbFRoZW1lIGFzIFRoZW1lT3B0aW9uO1xuXG4gICAgY29uc3QgbG9nTGV2ZWxzID0gT2JqZWN0LmFzc2lnbih7fSwgTG9nTGV2ZWwpO1xuICAgIGlmIChPYmplY3Qua2V5cyhpbmRpdmlkdWFsVGhlbWUpWzBdIGluIGxvZ0xldmVscylcbiAgICAgIGFjdHVhbFRoZW1lID1cbiAgICAgICAgKGluZGl2aWR1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwpW2xvZ2dlckxldmVsXSB8fCB7fTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhhY3R1YWxUaGVtZSkucmVkdWNlKChhY2M6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IChhY3R1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbilba2V5IGFzIGtleW9mIFRoZW1lT3B0aW9uXTtcbiAgICAgIGlmICh2YWwpXG4gICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICBhY2MsXG4gICAgICAgICAga2V5IGFzIGtleW9mIFRoZW1lT3B0aW9uLFxuICAgICAgICAgIHZhbCBhc1xuICAgICAgICAgICAgfCBudW1iZXJcbiAgICAgICAgICAgIHwgW251bWJlcl1cbiAgICAgICAgICAgIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gICAgICAgICAgICB8IG51bWJlcltdXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRleHQpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBbnN3ZXJzLFxuICBDaG9pY2UsXG4gIEZhbHN5LFxuICBJbml0aWFsUmV0dXJuVmFsdWUsXG4gIFByZXZDYWxsZXIsXG4gIFByb21wdE9iamVjdCxcbiAgUHJvbXB0VHlwZSxcbiAgVmFsdWVPckZ1bmMsXG59IGZyb20gXCJwcm9tcHRzXCI7XG5pbXBvcnQgcHJvbXB0cyBmcm9tIFwicHJvbXB0c1wiO1xuaW1wb3J0IHsgcGFyc2VBcmdzLCBQYXJzZUFyZ3NDb25maWcgfSBmcm9tIFwidXRpbFwiO1xuaW1wb3J0IHsgV3JpdGFibGUsIFJlYWRhYmxlIH0gZnJvbSBcInN0cmVhbVwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCIuLi9vdXRwdXQvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgS2xldXIgfSBmcm9tIFwiLi4vb3V0cHV0L3R5cGVzXCI7XG5pbXBvcnQgeyBQYXJzZUFyZ3NPcHRpb25zQ29uZmlnLCBQYXJzZUFyZ3NSZXN1bHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIGEgdXNlciBpbnB1dCBwcm9tcHQgd2l0aCB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBmbGV4aWJsZSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyB1c2VyIGlucHV0IHByb21wdHMuXG4gKiBJdCBpbXBsZW1lbnRzIHRoZSBQcm9tcHRPYmplY3QgaW50ZXJmYWNlIGZyb20gdGhlICdwcm9tcHRzJyBsaWJyYXJ5IGFuZCBvZmZlcnMgbWV0aG9kcyB0byBzZXRcbiAqIHZhcmlvdXMgcHJvcGVydGllcyBvZiB0aGUgcHJvbXB0LiBUaGUgY2xhc3MgYWxzbyBpbmNsdWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgY29tbW9uIGlucHV0IHNjZW5hcmlvc1xuICogYW5kIGFyZ3VtZW50IHBhcnNpbmcuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0IG5hbWUsIGV4dGVuZGluZyBzdHJpbmcuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgVXNlcklucHV0PFIgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IGltcGxlbWVudHMgUHJvbXB0T2JqZWN0PFI+IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nZ2VyID0gTG9nZ2luZy5mb3IoVXNlcklucHV0KTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBpbnB1dCBtZXRob2QgKGUuZy4sIHRleHQsIG51bWJlciwgY29uZmlybSkuXG4gICAqL1xuICB0eXBlOiBQcm9tcHRUeXBlIHwgRmFsc3kgfCBQcmV2Q2FsbGVyPFIsIFByb21wdFR5cGUgfCBGYWxzeT4gPSBcInRleHRcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqL1xuICBuYW1lOiBWYWx1ZU9yRnVuYzxSPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHN1bW1hcnkgVGhlIHF1ZXN0aW9uIG9yIGluc3RydWN0aW9uIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICovXG4gIG1lc3NhZ2U/OiBWYWx1ZU9yRnVuYzxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgVGhlIGRlZmF1bHQgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgaW5pdGlhbD86XG4gICAgfCBJbml0aWFsUmV0dXJuVmFsdWVcbiAgICB8IFByZXZDYWxsZXI8UiwgSW5pdGlhbFJldHVyblZhbHVlIHwgUHJvbWlzZTxJbml0aWFsUmV0dXJuVmFsdWU+PlxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0eWxlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKi9cbiAgc3R5bGU/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmb3JtYXQgZnVuY3Rpb24gZm9yIHRoZSBpbnB1dC5cbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0byBmb3JtYXQgdGhlIHVzZXIncyBpbnB1dCBiZWZvcmUgaXQncyByZXR1cm5lZC5cbiAgICovXG4gIGZvcm1hdD86IFByZXZDYWxsZXI8Uiwgdm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGlucHV0LlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqL1xuICB2YWxpZGF0ZT86XG4gICAgfCBQcmV2Q2FsbGVyPFIsIGJvb2xlYW4gfCBzdHJpbmcgfCBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+PlxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG9uU3RhdGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEBzdW1tYXJ5IEEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBwcm9tcHQgY2hhbmdlcy5cbiAgICovXG4gIG9uU3RhdGU/OiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIG9uUmVuZGVyPzogKChrbGV1cjogS2xldXIpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1pbmltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBsb3dlc3QgbnVtYmVyIHRoZSB1c2VyIGNhbiBpbnB1dC5cbiAgICovXG4gIG1pbj86IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1heGltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBoaWdoZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqL1xuICBtYXg/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdG8gYWxsb3cgZmxvYXQgdmFsdWVzIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBJZiB0cnVlLCBhbGxvd3MgZGVjaW1hbCBudW1iZXJzLlxuICAgKi9cbiAgZmxvYXQ/OiBib29sZWFuIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0byBmb3IgZmxvYXQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBwcmVjaXNpb24gb2YgZmxvYXQgaW5wdXRzLlxuICAgKi9cbiAgcm91bmQ/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluc3RydWN0aW9ucyBmb3IgdGhlIHVzZXIuXG4gICAqIEBzdW1tYXJ5IEFkZGl0aW9uYWwgZ3VpZGFuY2UgcHJvdmlkZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluY3JlbWVudCB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0ZXAgc2l6ZSB3aGVuIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgbnVtYmVyLlxuICAgKi9cbiAgaW5jcmVtZW50PzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2VwYXJhdG9yIGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIGNoYXJhY3RlciB1c2VkIHRvIHNlcGFyYXRlIGxpc3QgaXRlbXMuXG4gICAqL1xuICBzZXBhcmF0b3I/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBhY3RpdmUgb3B0aW9uIHN0eWxlIGZvciBzZWxlY3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgc3R5bGUgYXBwbGllZCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbi5cbiAgICovXG4gIGFjdGl2ZT86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0eWxlIGFwcGxpZWQgdG8gbm9uLXNlbGVjdGVkIG9wdGlvbnMuXG4gICAqL1xuICBpbmFjdGl2ZT86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIGNob2ljZXM/OiBDaG9pY2VbXSB8IFByZXZDYWxsZXI8UiwgQ2hvaWNlW10gfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgaGludCB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICovXG4gIGhpbnQ/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB3YXJuaW5nIHRleHQgZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IEEgd2FybmluZyBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICovXG4gIHdhcm4/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICBzdWdnZXN0PzogKChpbnB1dDogYW55LCBjaG9pY2VzOiBDaG9pY2VbXSkgPT4gUHJvbWlzZTxhbnk+KSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBsaW1pdCBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBzZWxlY3RlZC5cbiAgICovXG4gIGxpbWl0PzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWFzayBmb3IgcGFzc3dvcmQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gaGlkZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKi9cbiAgbWFzaz86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0ZG91dCBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFRoZSBvdXRwdXQgc3RyZWFtIHVzZWQgYnkgdGhlIHByb21wdC5cbiAgICovXG4gIHN0ZG91dD86IFdyaXRhYmxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0ZGluIHN0cmVhbSBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgVGhlIGlucHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQuXG4gICAqL1xuICBzdGRpbj86IFJlYWRhYmxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBVc2VySW5wdXQgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IFVzZXJJbnB1dCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LlxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZTogVmFsdWVPckZ1bmM8Uj4pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSB0eXBlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGlucHV0IG1ldGhvZCBmb3IgdGhlIHByb21wdC5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0VHlwZSh0eXBlOiBQcm9tcHRUeXBlIHwgRmFsc3kgfCBQcmV2Q2FsbGVyPFIsIFByb21wdFR5cGUgfCBGYWxzeT4pOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgdHlwZSB0bzogJHt0eXBlfWApO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1lc3NhZ2Ugb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgcXVlc3Rpb24gb3IgaW5zdHJ1Y3Rpb24gcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRNZXNzYWdlKHZhbHVlOiBWYWx1ZU9yRnVuYzxzdHJpbmc+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1lc3NhZ2UgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tZXNzYWdlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZGVmYXVsdCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5pdGlhbChcbiAgICB2YWx1ZTpcbiAgICAgIHwgSW5pdGlhbFJldHVyblZhbHVlXG4gICAgICB8IFByZXZDYWxsZXI8UiwgSW5pdGlhbFJldHVyblZhbHVlIHwgUHJvbWlzZTxJbml0aWFsUmV0dXJuVmFsdWU+PlxuICAgICAgfCB1bmRlZmluZWRcbiAgKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluaXRpYWwgdmFsdWUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbml0aWFsID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHN0eWxlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3R5bGUgdG8gYmUgYXBwbGllZC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFN0eWxlKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBzdHlsZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLnN0eWxlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGZvcm1hdCBmdW5jdGlvbiBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSB1c2VyJ3MgaW5wdXQgYmVmb3JlIGl0J3MgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBmb3JtYXQgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRGb3JtYXQodmFsdWU6IFByZXZDYWxsZXI8Uiwgdm9pZD4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgZm9ybWF0IGZ1bmN0aW9uYCk7XG4gICAgdGhpcy5mb3JtYXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRWYWxpZGF0ZShcbiAgICB2YWx1ZTpcbiAgICAgIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgc3RyaW5nIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPj5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyB2YWxpZGF0ZSBmdW5jdGlvbmApO1xuICAgIHRoaXMudmFsaWRhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgb25TdGF0ZSBjYWxsYmFjayBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBwcm9tcHQgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG9uU3RhdGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRPblN0YXRlKHZhbHVlOiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG9uU3RhdGUgY2FsbGJhY2tgKTtcbiAgICB0aGlzLm9uU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgb25SZW5kZXIgY2FsbGJhY2sgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBwcm9tcHQgaXMgcmVuZGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvblJlbmRlciBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE9uUmVuZGVyKHZhbHVlOiAoKGtsZXVyOiBLbGV1cikgPT4gdm9pZCkgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgb25SZW5kZXIgY2FsbGJhY2tgKTtcbiAgICB0aGlzLm9uUmVuZGVyID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1pbmltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGxvd2VzdCBudW1iZXIgdGhlIHVzZXIgY2FuIGlucHV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWluaW11bSB2YWx1ZS5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE1pbih2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbWluIHZhbHVlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMubWluID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1heGltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGhpZ2hlc3QgbnVtYmVyIHRoZSB1c2VyIGNhbiBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1heGltdW0gdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRNYXgodmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1heCB2YWx1ZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLm1heCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHdoZXRoZXIgdG8gYWxsb3cgZmxvYXQgdmFsdWVzIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHdoZXRoZXIgZGVjaW1hbCBudW1iZXJzIGFyZSBhbGxvd2VkLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBXaGV0aGVyIHRvIGFsbG93IGZsb2F0IHZhbHVlcy5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEZsb2F0KHZhbHVlOiBib29sZWFuIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGZsb2F0IHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuZmxvYXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHJvdW5kIHRvIGZvciBmbG9hdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHByZWNpc2lvbiBvZiBmbG9hdCBpbnB1dHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRSb3VuZCh2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgcm91bmQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5yb3VuZCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSB1c2VyLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGFkZGl0aW9uYWwgZ3VpZGFuY2UgcHJvdmlkZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbnN0cnVjdGlvbnMuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRJbnN0cnVjdGlvbnModmFsdWU6IHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaW5zdHJ1Y3Rpb25zIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGluY3JlbWVudCB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgc3RlcCBzaXplIHdoZW4gaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nIHRoZSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbmNyZW1lbnQgdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRJbmNyZW1lbnQoXG4gICAgdmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBpbmNyZW1lbnQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbmNyZW1lbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgc2VwYXJhdG9yIGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gc2VwYXJhdGUgbGlzdCBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTZXBhcmF0b3IoXG4gICAgdmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBzZXBhcmF0b3IgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5zZXBhcmF0b3IgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgc3R5bGUgYXBwbGllZCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFjdGl2ZSBvcHRpb24gc3R5bGUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRBY3RpdmUodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGFjdGl2ZSBzdHlsZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmFjdGl2ZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbmFjdGl2ZSBvcHRpb24gc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHN0eWxlIGFwcGxpZWQgdG8gbm9uLXNlbGVjdGVkIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbmFjdGl2ZSBvcHRpb24gc3R5bGUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRJbmFjdGl2ZSh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaW5hY3RpdmUgc3R5bGUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbmFjdGl2ZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q2hvaWNlcyhcbiAgICB2YWx1ZTogQ2hvaWNlW10gfCBQcmV2Q2FsbGVyPFIsIENob2ljZVtdIHwgRmFsc3k+IHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBjaG9pY2VzOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICB0aGlzLmNob2ljZXMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaGludCB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaGludCB0ZXh0LlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SGludCh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaGludCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmhpbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgd2FybmluZyB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgd2FybmluZyBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHdhcm5pbmcgdGV4dC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFdhcm4odmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHdhcm4gdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy53YXJuID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRTdWdnZXN0KFxuICAgIHZhbHVlOiAoKGlucHV0OiBhbnksIGNob2ljZXM6IENob2ljZVtdKSA9PiBQcm9taXNlPGFueT4pIHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBzdWdnZXN0IGZ1bmN0aW9uYCk7XG4gICAgdGhpcy5zdWdnZXN0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGxpbWl0IGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgaW4gbGlzdC10eXBlIHByb21wdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQsIG9yIGEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoaXMgdmFsdWUuXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldExpbWl0KHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBsaW1pdCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmxpbWl0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1hc2sgZm9yIHBhc3N3b3JkIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gaGlkZSB0aGUgdXNlcidzIGlucHV0IGluIHBhc3N3b3JkLXR5cGUgcHJvbXB0cy5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0IG5hbWUsIGV4dGVuZGluZyBzdHJpbmcuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBjaGFyYWN0ZXIgdXNlZCB0byBtYXNrIHRoZSBpbnB1dCwgb3IgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhpcyB2YWx1ZS5cbiAgICogQHJldHVybiBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0TWFzayh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbWFzayB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLm1hc2sgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgc3Rkb3V0IHN0cmVhbSBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgb3V0cHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQgZm9yIGRpc3BsYXlpbmcgbWVzc2FnZXMgYW5kIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBXcml0YWJsZSBzdHJlYW0gdG8gYmUgdXNlZCBhcyBzdGRvdXQuXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFN0ZG91dCh2YWx1ZTogV3JpdGFibGUgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc3Rkb3V0IHN0cmVhbWApO1xuICAgIHRoaXMuc3Rkb3V0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBzdGRpbiBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGlucHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQgZm9yIHJlY2VpdmluZyB1c2VyIGlucHV0LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgUmVhZGFibGUgc3RyZWFtIHRvIGJlIHVzZWQgYXMgc3RkaW4uXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFN0ZGluKHZhbHVlOiBSZWFkYWJsZSB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIHRoaXMuc3RkaW4gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBmb3IgaW5wdXQgYmFzZWQgb24gdGhlIGN1cnJlbnQgVXNlcklucHV0IGNvbmZpZ3VyYXRpb24uXG4gICAqIEBzdW1tYXJ5IFByb21wdHMgdGhlIHVzZXIgYW5kIHJldHVybnMgdGhlaXIgcmVzcG9uc2UgYXMgYSBzaW5nbGUgdmFsdWUuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1c2VyJ3MgYW5zd2VyLlxuICAgKi9cbiAgYXN5bmMgYXNrKCkge1xuICAgIHJldHVybiAoYXdhaXQgVXNlcklucHV0LmFzayh0aGlzKSlbdGhpcy5uYW1lIGFzIGtleW9mIEFuc3dlcnM8Uj5dO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIG9uZSBvciBtb3JlIHF1ZXN0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgVXNlcklucHV0IGNvbmZpZ3VyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHdpdGggb25lIG9yIG1vcmUgcXVlc3Rpb25zIGFuZCByZXR1cm5zIHRoZWlyIGFuc3dlcnMgYXMgYW4gb2JqZWN0LlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gQSBzaW5nbGUgVXNlcklucHV0IGluc3RhbmNlIG9yIGFuIGFycmF5IG9mIFVzZXJJbnB1dCBpbnN0YW5jZXMuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHVzZXIncyBhbnN3ZXJzLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIGFzayBtZXRob2RcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIHByb21wdHMgbGlicmFyeVxuICAgKiAgIEEtPj5QOiBDYWxsIHByb21wdHMgd2l0aCBxdWVzdGlvbihzKVxuICAgKiAgIFAtPj5VOiBEaXNwbGF5IHByb21wdChzKVxuICAgKiAgIFUtPj5QOiBQcm92aWRlIGlucHV0XG4gICAqICAgUC0+PkE6IFJldHVybiBhbnN3ZXJzXG4gICAqICAgQS0+PkE6IFByb2Nlc3MgYW5zd2Vyc1xuICAgKiAgIEEtLT4+Q2FsbGVyOiBSZXR1cm4gcHJvY2Vzc2VkIGFuc3dlcnNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2s8UiBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gICAgcXVlc3Rpb246IFVzZXJJbnB1dDxSPiB8IFVzZXJJbnB1dDxSPltdXG4gICkge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuYXNrKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocXVlc3Rpb24pKSB7XG4gICAgICBxdWVzdGlvbiA9IFtxdWVzdGlvbl07XG4gICAgfVxuICAgIGxldCBhbnN3ZXJzOiBBbnN3ZXJzPFI+O1xuICAgIHRyeSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYEFza2luZyBxdWVzdGlvbnM6ICR7cXVlc3Rpb24ubWFwKChxKSA9PiBxLm5hbWUpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgYW5zd2VycyA9IGF3YWl0IHByb21wdHMocXVlc3Rpb24pO1xuICAgICAgbG9nLnZlcmJvc2UoYFJlY2VpdmVkIGFuc3dlcnM6ICR7SlNPTi5zdHJpbmdpZnkoYW5zd2VycywgbnVsbCwgMil9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgZ2V0dGluZyBpbnB1dDogJHtlcnJvcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGFuc3dlcnM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFza3MgdGhlIHVzZXIgZm9yIGEgbnVtYmVyIGlucHV0LlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIGEgbnVtYmVyLCB3aXRoIG9wdGlvbmFsIG1pbmltdW0sIG1heGltdW0sIGFuZCBpbml0aWFsIHZhbHVlcy5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBtaW4gLSBUaGUgbWluaW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBtYXggLSBUaGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBpbml0aWFsIC0gVGhlIGluaXRpYWwgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChvcHRpb25hbCkuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG51bWJlciBlbnRlcmVkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFza051bWJlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb246IHN0cmluZyxcbiAgICBtaW4/OiBudW1iZXIsXG4gICAgbWF4PzogbnVtYmVyLFxuICAgIGluaXRpYWw/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFza051bWJlcik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgQXNraW5nIG51bWJlciBpbnB1dDogdW5kZWZpbmVkLCBxdWVzdGlvbjogJHtxdWVzdGlvbn0sIG1pbjogJHttaW59LCBtYXg6ICR7bWF4fSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSlcbiAgICAgIC5zZXRNZXNzYWdlKHF1ZXN0aW9uKVxuICAgICAgLnNldFR5cGUoXCJudW1iZXJcIik7XG5cbiAgICBpZiAodHlwZW9mIG1pbiA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldE1pbihtaW4pO1xuXG4gICAgaWYgKHR5cGVvZiBtYXggPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNYXgobWF4KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbCA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldEluaXRpYWwoaW5pdGlhbCk7XG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIHRleHQgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IFByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgdGV4dCwgd2l0aCBvcHRpb25hbCBtYXNraW5nIGFuZCBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQsIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIG1hc2sgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gbWFzayB0aGUgaW5wdXQgKG9wdGlvbmFsLCBmb3IgcGFzc3dvcmQtbGlrZSBpbnB1dHMpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB0ZXh0IGVudGVyZWQgYnkgdGhlIHVzZXIuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrVGV4dChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb246IHN0cmluZyxcbiAgICBtYXNrOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgaW5pdGlhbD86IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuYXNrVGV4dCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgQXNraW5nIHRleHQgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCBtYXNrOiAke21hc2t9LCBpbml0aWFsOiAke2luaXRpYWx9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKS5zZXRNZXNzYWdlKHF1ZXN0aW9uKTtcblxuICAgIGlmIChtYXNrKSB1c2VySW5wdXQuc2V0TWFzayhtYXNrKTtcbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwic3RyaW5nXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hc2sodXNlcklucHV0KSlbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFza3MgdGhlIHVzZXIgZm9yIGEgY29uZmlybWF0aW9uICh5ZXMvbm8pLlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHdpdGggYSB5ZXMvbm8gcXVlc3Rpb24gYW5kIHJldHVybnMgYSBib29sZWFuIHJlc3VsdC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBpbml0aWFsIC0gVGhlIGluaXRpYWwgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChvcHRpb25hbCkuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgdXNlcidzIGFuc3dlci5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2tDb25maXJtYXRpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgaW5pdGlhbD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5hc2tDb25maXJtYXRpb24pO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyBjb25maXJtYXRpb24gaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCBpbml0aWFsOiAke2luaXRpYWx9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKVxuICAgICAgLnNldE1lc3NhZ2UocXVlc3Rpb24pXG4gICAgICAuc2V0VHlwZShcImNvbmZpcm1cIik7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWwgIT09IFwidW5kZWZpbmVkXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hc2sodXNlcklucHV0KSlbbmFtZV07XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBlYXRlZGx5IGFza3MgZm9yIGlucHV0IHVudGlsIGEgdmFsaWQgcmVzcG9uc2UgaXMgZ2l2ZW4gb3IgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGluc2lzdHMgb24gZ2V0dGluZyBhIHZhbGlkIGlucHV0IGZyb20gdGhlIHVzZXIsIGFsbG93aW5nIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIHJlc3VsdC5cbiAgICogQHBhcmFtIGlucHV0IC0gVGhlIFVzZXJJbnB1dCBpbnN0YW5jZSB0byB1c2UgZm9yIHByb21wdGluZy5cbiAgICogQHBhcmFtIHRlc3QgLSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqIEBwYXJhbSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBhbGxvd2VkIChkZWZhdWx0IGlzIDEpLlxuICAgKiBAcGFyYW0gZGVmYXVsdENvbmZpcm1hdGlvblxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZCBpbnB1dCBvciB1bmRlZmluZWQgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IEkgYXMgaW5zaXN0IG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgYXNrIG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IFQgYXMgdGVzdCBmdW5jdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgYXNrQ29uZmlybWF0aW9uIG1ldGhvZFxuICAgKiAgIGxvb3AgVW50aWwgdmFsaWQgaW5wdXQgb3IgbGltaXQgcmVhY2hlZFxuICAgKiAgICAgSS0+PkE6IENhbGwgYXNrIHdpdGggaW5wdXRcbiAgICogICAgIEEtPj5VOiBQcm9tcHQgdXNlclxuICAgKiAgICAgVS0+PkE6IFByb3ZpZGUgaW5wdXRcbiAgICogICAgIEEtPj5JOiBSZXR1cm4gcmVzdWx0XG4gICAqICAgICBJLT4+VDogVGVzdCByZXN1bHRcbiAgICogICAgIGFsdCBUZXN0IHBhc3Nlc1xuICAgKiAgICAgICBJLT4+QzogQXNrIGZvciBjb25maXJtYXRpb25cbiAgICogICAgICAgQy0+PlU6IENvbmZpcm0gaW5wdXRcbiAgICogICAgICAgVS0+PkM6IFByb3ZpZGUgY29uZmlybWF0aW9uXG4gICAqICAgICAgIEMtPj5JOiBSZXR1cm4gY29uZmlybWF0aW9uXG4gICAqICAgICAgIGFsdCBDb25maXJtZWRcbiAgICogICAgICAgICBJLS0+PkNhbGxlcjogUmV0dXJuIHZhbGlkIHJlc3VsdFxuICAgKiAgICAgICBlbHNlIE5vdCBjb25maXJtZWRcbiAgICogICAgICAgICBJLT4+STogQ29udGludWUgbG9vcFxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2UgVGVzdCBmYWlsc1xuICAgKiAgICAgICBJLT4+STogQ29udGludWUgbG9vcFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgSS0tPj5DYWxsZXI6IFJldHVybiB1bmRlZmluZWQgaWYgbGltaXQgcmVhY2hlZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluc2lzdDxSPihcbiAgICBpbnB1dDogVXNlcklucHV0LFxuICAgIHRlc3Q6IChyZXM6IHN0cmluZyB8IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICBkZWZhdWx0Q29uZmlybWF0aW9uOiBib29sZWFuLFxuICAgIGxpbWl0ID0gMVxuICApOiBQcm9taXNlPFIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmluc2lzdCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgSW5zaXN0aW5nIG9uIGlucHV0OiAke2lucHV0Lm5hbWV9LCB0ZXN0OiAke3Rlc3QudG9TdHJpbmcoKX0sIGRlZmF1bHRDb25maXJtYXRpb246ICR7ZGVmYXVsdENvbmZpcm1hdGlvbn0sIGxpbWl0OiAke2xpbWl0fWBcbiAgICApO1xuICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBjb25maXJtYXRpb246IGJvb2xlYW47XG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gKGF3YWl0IFVzZXJJbnB1dC5hc2soaW5wdXQpKVtcbiAgICAgICAgICBpbnB1dC5uYW1lIGFzIGtleW9mIEFuc3dlcnM8c3RyaW5nPlxuICAgICAgICBdIGFzIHN0cmluZztcbiAgICAgICAgaWYgKCF0ZXN0KHJlc3VsdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlybWF0aW9uID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgICBgJHtpbnB1dC5uYW1lfS1jb25maXJtYCxcbiAgICAgICAgICBgSXMgdGhlICR7aW5wdXQudHlwZX0gY29ycmVjdD9gLFxuICAgICAgICAgIGRlZmF1bHRDb25maXJtYXRpb25cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjb25maXJtYXRpb24pIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gd2hpbGUgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIgJiYgbGltaXQgPiAxICYmIGNvdW50KysgPCBsaW1pdCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBFcnJvciB3aGlsZSBpbnNpc3Rpbmc6ICR7ZX1gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIGxvZy5pbmZvKFwibm8gc2VsZWN0aW9uLi4uXCIpO1xuICAgIHJldHVybiByZXN1bHQgYXMgUiB8IHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcGVhdGVkbHkgYXNrcyBmb3IgdGV4dCBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCB0ZXh0IGlucHV0IGZyb20gdGhlIHVzZXIsIGFsbG93aW5nIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gdGVzdCAtIEEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICogQHBhcmFtIG1hc2sgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gbWFzayB0aGUgaW5wdXQgKG9wdGlvbmFsLCBmb3IgcGFzc3dvcmQtbGlrZSBpbnB1dHMpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZGVmYXVsdENvbmZpcm1hdGlvblxuICAgKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgYWxsb3dlZCAoZGVmYXVsdCBpcyAtMSwgbWVhbmluZyB1bmxpbWl0ZWQpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZCBpbnB1dCBvciB1bmRlZmluZWQgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5zaXN0Rm9yVGV4dChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb246IHN0cmluZyxcbiAgICB0ZXN0OiAocmVzOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4gICAgbWFzazogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGluaXRpYWw/OiBzdHJpbmcsXG4gICAgZGVmYXVsdENvbmZpcm1hdGlvbiA9IGZhbHNlLFxuICAgIGxpbWl0ID0gLTFcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmluc2lzdEZvclRleHQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEluc2lzdGluZyBmb3IgdGV4dCBpbnB1dDogdW5kZWZpbmVkLCBxdWVzdGlvbjogJHtxdWVzdGlvbn0sIHRlc3Q6ICR7dGVzdC50b1N0cmluZygpfSwgbWFzazogJHttYXNrfSwgaW5pdGlhbDogJHtpbml0aWFsfSwgZGVmYXVsdENvbmZpcm1hdGlvbjogJHtkZWZhdWx0Q29uZmlybWF0aW9ufSwgbGltaXQ6ICR7bGltaXR9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKS5zZXRNZXNzYWdlKHF1ZXN0aW9uKTtcblxuICAgIGlmIChtYXNrKSB1c2VySW5wdXQuc2V0TWFzayhtYXNrKTtcbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwic3RyaW5nXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5pbnNpc3QoXG4gICAgICB1c2VySW5wdXQsXG4gICAgICB0ZXN0IGFzIChyZXM6IHN0cmluZyB8IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICAgIGRlZmF1bHRDb25maXJtYXRpb24sXG4gICAgICBsaW1pdFxuICAgICkpIGFzIHN0cmluZztcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcGVhdGVkbHkgYXNrcyBmb3IgbnVtYmVyIGlucHV0IHVudGlsIGEgdmFsaWQgcmVzcG9uc2UgaXMgZ2l2ZW4gb3IgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGluc2lzdHMgb24gZ2V0dGluZyBhIHZhbGlkIG51bWJlciBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQsIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIHRlc3QgLSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqIEBwYXJhbSBtaW4gLSBUaGUgbWluaW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBtYXggLSBUaGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBpbml0aWFsIC0gVGhlIGluaXRpYWwgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBkZWZhdWx0Q29uZmlybWF0aW9uXG4gICAqIEBwYXJhbSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBhbGxvd2VkIChkZWZhdWx0IGlzIC0xLCBtZWFuaW5nIHVubGltaXRlZCkuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkIGlucHV0IG9yIHVuZGVmaW5lZCBpZiB0aGUgbGltaXQgaXMgcmVhY2hlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbnNpc3RGb3JOdW1iZXIoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgdGVzdDogKHJlczogbnVtYmVyKSA9PiBib29sZWFuLFxuICAgIG1pbj86IG51bWJlcixcbiAgICBtYXg/OiBudW1iZXIsXG4gICAgaW5pdGlhbD86IG51bWJlcixcbiAgICBkZWZhdWx0Q29uZmlybWF0aW9uID0gZmFsc2UsXG4gICAgbGltaXQgPSAtMVxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuaW5zaXN0Rm9yTnVtYmVyKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBJbnNpc3RpbmcgZm9yIG51bWJlciBpbnB1dDogdW5kZWZpbmVkLCBxdWVzdGlvbjogJHtxdWVzdGlvbn0sIHRlc3Q6ICR7dGVzdC50b1N0cmluZygpfSwgbWluOiAke21pbn0sIG1heDogJHttYXh9LCBpbml0aWFsOiAke2luaXRpYWx9LCBkZWZhdWx0Q29uZmlybWF0aW9uOiAke2RlZmF1bHRDb25maXJtYXRpb259LCBsaW1pdDogJHtsaW1pdH1gXG4gICAgKTtcbiAgICBjb25zdCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KG5hbWUpXG4gICAgICAuc2V0TWVzc2FnZShxdWVzdGlvbilcbiAgICAgIC5zZXRUeXBlKFwibnVtYmVyXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNaW4obWluKTtcblxuICAgIGlmICh0eXBlb2YgbWF4ID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0TWF4KG1heCk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5pbnNpc3QoXG4gICAgICB1c2VySW5wdXQsXG4gICAgICB0ZXN0IGFzIChyZXM6IHN0cmluZyB8IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICAgIGRlZmF1bHRDb25maXJtYXRpb24sXG4gICAgICBsaW1pdFxuICAgICkpIGFzIG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFVzZXMgTm9kZS5qcydzIHV0aWwucGFyc2VBcmdzIHRvIHBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYW5kIHJldHVybiB0aGUgcmVzdWx0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgcGFyc2luZyBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcnNlZCBhcmd1bWVudHMuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBwYXJzZUFyZ3MgbWV0aG9kXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyB1dGlsLnBhcnNlQXJnc1xuICAgKiAgIEMtPj5QOiBDYWxsIHdpdGggb3B0aW9uc1xuICAgKiAgIFAtPj5QOiBQcmVwYXJlIGFyZ3Mgb2JqZWN0XG4gICAqICAgUC0+PlU6IENhbGwgcGFyc2VBcmdzIHdpdGggcHJlcGFyZWQgYXJnc1xuICAgKiAgIFUtPj5QOiBSZXR1cm4gcGFyc2VkIHJlc3VsdFxuICAgKiAgIFAtLT4+QzogUmV0dXJuIFBhcnNlQXJnc1Jlc3VsdFxuICAgKi9cbiAgc3RhdGljIHBhcnNlQXJncyhvcHRpb25zOiBQYXJzZUFyZ3NPcHRpb25zQ29uZmlnKTogUGFyc2VBcmdzUmVzdWx0IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLnBhcnNlQXJncyk7XG4gICAgY29uc3QgYXJnczogUGFyc2VBcmdzQ29uZmlnID0ge1xuICAgICAgYXJnczogcHJvY2Vzcy5hcmd2LnNsaWNlKDIpLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9O1xuICAgIGxvZy5kZWJ1ZyhgUGFyc2luZyBhcmd1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncywgbnVsbCwgMil9YCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYEVycm9yIHdoaWxlIHBhcnNpbmcgYXJndW1lbnRzOlxcbiR7SlNPTi5zdHJpbmdpZnkoYXJncywgbnVsbCwgMil9XFxuIHwgb3B0aW9uc1xcbiR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucywgbnVsbCwgMil9XFxuIHwgJHtlcnJvcn1gXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBwYXJzaW5nIGFyZ3VtZW50czogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29tbWFuZCBvcHRpb25zIGZvciBDTEkgY29tbWFuZHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciBjb21tb24gY29tbWFuZC1saW5lIG9wdGlvbnMgdXNlZCBhY3Jvc3MgdmFyaW91cyBDTEkgY29tbWFuZHMuXG4gKiBAY29uc3QgRGVmYXVsdENvbW1hbmRPcHRpb25zXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWZhdWx0Q29tbWFuZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB2ZXJib3NlIC0gVmVyYm9zaXR5IGxldmVsIG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJib3NlLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgdmVyYm9zZSBvcHRpb24gKG51bWJlcikuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyYm9zZS5zaG9ydCAtIFRoZSBzaG9ydCBmbGFnIGZvciB0aGUgdmVyYm9zZSBvcHRpb24gKFYpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcmJvc2UuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB2ZXJib3NpdHkgKDApLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHZlcnNpb24gLSBWZXJzaW9uIGRpc3BsYXkgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24udHlwZSAtIFRoZSB0eXBlIG9mIHRoZSB2ZXJzaW9uIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbi5zaG9ydCAtIFRoZSBzaG9ydCBmbGFnIGZvciB0aGUgdmVyc2lvbiBvcHRpb24gKHYpLlxuICogQHByb3BlcnR5IHt1bmRlZmluZWR9IHZlcnNpb24uZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB2ZXJzaW9uIGRpc3BsYXkgKHVuZGVmaW5lZCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gaGVscCAtIEhlbHAgZGlzcGxheSBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGVscC50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGhlbHAgb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBoZWxwLnNob3J0IC0gVGhlIHNob3J0IGZsYWcgZm9yIHRoZSBoZWxwIG9wdGlvbiAoaCkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhlbHAuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBoZWxwIGRpc3BsYXkgKGZhbHNlKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbCAtIExvZyBsZXZlbCBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9nTGV2ZWwudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBsb2dMZXZlbCBvcHRpb24gKHN0cmluZykuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9nTGV2ZWwuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBsb2cgbGV2ZWwgKFwiaW5mb1wiKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dTdHlsZSAtIExvZyBzdHlsaW5nIG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsb2dTdHlsZS50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGxvZ1N0eWxlIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGxvZ1N0eWxlLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbG9nIHN0eWxpbmcgKHRydWUpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHRpbWVzdGFtcCAtIFRpbWVzdGFtcCBkaXNwbGF5IG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lc3RhbXAudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSB0aW1lc3RhbXAgb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGltZXN0YW1wLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGltZXN0YW1wIGRpc3BsYXkgKHRydWUpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGJhbm5lciAtIEJhbm5lciBkaXNwbGF5IG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBiYW5uZXIudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBiYW5uZXIgb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmFubmVyLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgYmFubmVyIGRpc3BsYXkgKGZhbHNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDb21tYW5kT3B0aW9ucyA9IHtcbiAgdmVyYm9zZToge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcIlZcIixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gIH0sXG4gIHZlcnNpb246IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJ2XCIsXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICB9LFxuICBoZWxwOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwiaFwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBsb2dMZXZlbDoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgZGVmYXVsdDogXCJpbmZvXCIsXG4gIH0sXG4gIGxvZ1N0eWxlOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgdGltZXN0YW1wOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgYmFubmVyOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29tbWFuZCB2YWx1ZXMgZGVyaXZlZCBmcm9tIERlZmF1bHRDb21tYW5kT3B0aW9ucy5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzIG9mIGFsbCBvcHRpb25zIGRlZmluZWQgaW4gRGVmYXVsdENvbW1hbmRPcHRpb25zLlxuICogQGNvbnN0IERlZmF1bHRDb21tYW5kVmFsdWVzXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWZhdWx0Q29tbWFuZFZhbHVlc1xuICogQHByb3BlcnR5IHt1bmtub3dufSBba2V5OiBzdHJpbmddIC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggb3B0aW9uIGluIERlZmF1bHRDb21tYW5kT3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDb21tYW5kVmFsdWVzOiB7XG4gIFtrIGluIGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZE9wdGlvbnNdOiB1bmtub3duO1xufSA9IE9iamVjdC5rZXlzKERlZmF1bHRDb21tYW5kT3B0aW9ucykucmVkdWNlKFxuICAoYWNjOiBSZWNvcmQ8a2V5b2YgdHlwZW9mIERlZmF1bHRDb21tYW5kT3B0aW9ucywgdW5rbm93bj4sIGtleTogc3RyaW5nKSA9PiB7XG4gICAgYWNjW2tleSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRPcHRpb25zXSA9XG4gICAgICBEZWZhdWx0Q29tbWFuZE9wdGlvbnNba2V5IGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZE9wdGlvbnNdLmRlZmF1bHQ7XG4gICAgcmV0dXJuIGFjYztcbiAgfSxcbiAge30gYXMgUmVjb3JkPGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZFZhbHVlcywgdW5rbm93bj5cbik7XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBQYWRzIHRoZSBlbmQgb2YgYSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZCBjaGFyYWN0ZXIuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBpbnB1dCBzdHJpbmcgdG8gYSBzcGVjaWZpZWQgbGVuZ3RoIGJ5IGFkZGluZyBhIHBhZGRpbmcgY2hhcmFjdGVyIHRvIHRoZSBlbmQuXG4gKiBJZiB0aGUgaW5wdXQgc3RyaW5nIGlzIGFscmVhZHkgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBwYWRkZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIGRlc2lyZWQgdG90YWwgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGFyPVwiIFwiXSAtIFRoZSBjaGFyYWN0ZXIgdG8gdXNlIGZvciBwYWRkaW5nLiBEZWZhdWx0cyB0byBhIHNwYWNlLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGFkZGVkIHN0cmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcGFkZGluZyBjaGFyYWN0ZXIgaXMgbm90IGV4YWN0bHkgb25lIGNoYXJhY3RlciBsb25nLlxuICpcbiAqIEBmdW5jdGlvbiBwYWRFbmRcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFkRW5kKFxuICBzdHI6IHN0cmluZyxcbiAgbGVuZ3RoOiBudW1iZXIsXG4gIGNoYXI6IHN0cmluZyA9IFwiIFwiXG4pOiBzdHJpbmcge1xuICBpZiAoY2hhci5sZW5ndGggIT09IDEpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXIgbGVuZ3RoIGZvciBwYWRkaW5nLiBtdXN0IGJlIG9uZSFcIik7XG4gIHJldHVybiBzdHIucGFkRW5kKGxlbmd0aCwgY2hhcik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcGxhY2VzIHBsYWNlaG9sZGVycyBpbiBhIHN0cmluZyB3aXRoIHByb3ZpZGVkIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IEludGVycG9sYXRlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgcGxhY2Vob2xkZXJzIG9mIHRoZSBmb3JtICR7dmFyaWFibGVOYW1lfVxuICogd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcyBmcm9tIHRoZSBwcm92aWRlZCBvYmplY3QuIElmIGEgcGxhY2Vob2xkZXIgZG9lc24ndCBoYXZlXG4gKiBhIGNvcnJlc3BvbmRpbmcgdmFsdWUsIGl0IGlzIGxlZnQgdW5jaGFuZ2VkIGluIHRoZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gVGhlIGlucHV0IHN0cmluZyBjb250YWluaW5nIHBsYWNlaG9sZGVycyB0byBiZSByZXBsYWNlZC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPn0gdmFsdWVzIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciByZXBsYWNlbWVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGludGVycG9sYXRlZCBzdHJpbmcgd2l0aCBwbGFjZWhvbGRlcnMgcmVwbGFjZWQgYnkgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gKlxuICogQGZ1bmN0aW9uIHBhdGNoUGxhY2Vob2xkZXJzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcGF0Y2hTdHJpbmdcbiAqICAgcGFydGljaXBhbnQgU3RyaW5nLnJlcGxhY2VcbiAqICAgQ2FsbGVyLT4+cGF0Y2hTdHJpbmc6IENhbGwgd2l0aCBpbnB1dCBhbmQgdmFsdWVzXG4gKiAgIHBhdGNoU3RyaW5nLT4+U3RyaW5nLnJlcGxhY2U6IENhbGwgd2l0aCByZWdleCBhbmQgcmVwbGFjZW1lbnQgZnVuY3Rpb25cbiAqICAgU3RyaW5nLnJlcGxhY2UtPj5wYXRjaFN0cmluZzogUmV0dXJuIHJlcGxhY2VkIHN0cmluZ1xuICogICBwYXRjaFN0cmluZy0tPj5DYWxsZXI6IFJldHVybiBwYXRjaGVkIHN0cmluZ1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFBsYWNlaG9sZGVycyhcbiAgaW5wdXQ6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+XG4pOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXQucmVwbGFjZShcbiAgICAvXFwkXFx7KFthLXpBLVowLTlfXSspXFx9L2csXG4gICAgKG1hdGNoLCB2YXJpYWJsZSkgPT4gKHZhbHVlc1t2YXJpYWJsZSBhcyBzdHJpbmddIGFzIHN0cmluZykgfHwgbWF0Y2hcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoU3RyaW5nKFxuICBpbnB1dDogc3RyaW5nLFxuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4sXG4gIGZsYWdzOiBzdHJpbmcgPSBcImdcIlxuKTogc3RyaW5nIHtcbiAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgY29uc3QgcmVnZXhwID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAoa2V5KSwgZmxhZ3MpO1xuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZShyZWdleHAsIHZhbCBhcyBzdHJpbmcpO1xuICB9KTtcbiAgcmV0dXJuIGlucHV0O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBjYW1lbENhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBjYW1lbENhc2UgZm9ybWF0LCB3aGVyZSB3b3JkcyBhcmUgam9pbmVkIHdpdGhvdXQgc3BhY2VzXG4gKiBhbmQgZWFjaCB3b3JkIGFmdGVyIHRoZSBmaXJzdCBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9DYW1lbENhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbENhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKD86Xlxcd3xbQS1aXXxcXGJcXHcpL2csICh3b3JkLCBpbmRleCkgPT5cbiAgICAgIGluZGV4ID09PSAwID8gd29yZC50b0xvd2VyQ2FzZSgpIDogd29yZC50b1VwcGVyQ2FzZSgpXG4gICAgKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBFTlZJUk9OTUVOVF9WQVJJQUJMRSBmb3JtYXQuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byB1cHBlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMsXG4gKiB0eXBpY2FsbHkgdXNlZCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gRU5WSVJPTk1FTlRfVkFSSUFCTEUgZm9ybWF0LlxuICpcbiAqIEBmdW5jdGlvbiB0b0VOVkZvcm1hdFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0VOVkZvcm1hdCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9TbmFrZUNhc2UodGV4dCkudG9VcHBlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8gc25ha2VfY2FzZS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIGxvd2VyY2FzZSB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSB1bmRlcnNjb3Jlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBzbmFrZV9jYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b1NuYWtlQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NuYWtlQ2FzZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxXyQyXCIpXG4gICAgLnJlcGxhY2UoL1tcXHMtXSsvZywgXCJfXCIpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIGtlYmFiLWNhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBsb3dlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgaHlwaGVucy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBrZWJhYi1jYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b0tlYmFiQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0tlYmFiQ2FzZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxLSQyXCIpXG4gICAgLnJlcGxhY2UoL1tcXHNfXSsvZywgXCItXCIpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIFBhc2NhbENhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBQYXNjYWxDYXNlIGZvcm1hdCwgd2hlcmUgd29yZHMgYXJlIGpvaW5lZCB3aXRob3V0IHNwYWNlc1xuICogYW5kIGVhY2ggd29yZCBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIFBhc2NhbENhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvUGFzY2FsQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1Bhc2NhbENhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKD86Xlxcd3xbQS1aXXxcXGJcXHcpL2csICh3b3JkKSA9PiB3b3JkLnRvVXBwZXJDYXNlKCkpXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7IC8vICQmIG1lYW5zIHRoZSB3aG9sZSBtYXRjaGVkIHN0cmluZ1xufVxuIiwiaW1wb3J0IHsgRW5jb2RpbmcgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPdXRwdXRXcml0ZXIgfSBmcm9tIFwiLi9PdXRwdXRXcml0ZXJcIjtcbmltcG9ydCB7IFByb21pc2VFeGVjdXRvciB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiO1xuaW1wb3J0IHsgT3V0cHV0VHlwZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4uL291dHB1dC9sb2dnaW5nXCI7XG5pbXBvcnQgeyBWZXJib3NpdHlMb2dnZXIgfSBmcm9tIFwiLi4vb3V0cHV0L3R5cGVzXCI7XG5pbXBvcnQgeyBzdHlsZSB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzdGFuZGFyZCBvdXRwdXQgd3JpdGVyIGZvciBoYW5kbGluZyBjb21tYW5kIGV4ZWN1dGlvbiBvdXRwdXQuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIE91dHB1dFdyaXRlciBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yXG4gKiBoYW5kbGluZyB2YXJpb3VzIHR5cGVzIG9mIG91dHB1dCBmcm9tIGNvbW1hbmQgZXhlY3V0aW9uLCBpbmNsdWRpbmcgc3RhbmRhcmQgb3V0cHV0LFxuICogZXJyb3Igb3V0cHV0LCBhbmQgZXhpdCBjb2Rlcy4gSXQgYWxzbyBpbmNsdWRlcyB1dGlsaXR5IG1ldGhvZHMgZm9yIHBhcnNpbmcgY29tbWFuZHNcbiAqIGFuZCByZXNvbHZpbmcgb3IgcmVqZWN0aW5nIHByb21pc2VzIGJhc2VkIG9uIGV4ZWN1dGlvbiByZXN1bHRzLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHJlc29sdmVkIHZhbHVlLCBkZWZhdWx0aW5nIHRvIG51bWJlci5cbiAqXG4gKiBAcGFyYW0gbG9jayAtIEEgUHJvbWlzZUV4ZWN1dG9yIHRvIGNvbnRyb2wgdGhlIGFzeW5jaHJvbm91cyBmbG93LlxuICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyAodW51c2VkIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uKS5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YW5kYXJkT3V0cHV0V3JpdGVyPFIgPSBzdHJpbmc+IGltcGxlbWVudHMgT3V0cHV0V3JpdGVyIHtcbiAgcHJvdGVjdGVkIGxvZ2dlcjogVmVyYm9zaXR5TG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgU3RhbmRhcmRPdXRwdXRXcml0ZXIuXG4gICAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgdGhlIFN0YW5kYXJkT3V0cHV0V3JpdGVyIHdpdGggYSBsb2NrIG1lY2hhbmlzbSBhbmQgb3B0aW9uYWwgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gY21kXG4gICAqIEBwYXJhbSBsb2NrIC0gQSBQcm9taXNlRXhlY3V0b3IgdG8gY29udHJvbCB0aGUgYXN5bmNocm9ub3VzIGZsb3cuXG4gICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgKGN1cnJlbnRseSB1bnVzZWQpLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNtZDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBsb2NrOiBQcm9taXNlRXhlY3V0b3I8Uj4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IHVua25vd25bXVxuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMuY21kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBvdXRwdXQgdG8gdGhlIGNvbnNvbGUuXG4gICAqIEBzdW1tYXJ5IEZvcm1hdHMgYW5kIGxvZ3MgdGhlIGdpdmVuIGRhdGEgd2l0aCBhIHRpbWVzdGFtcCBhbmQgdHlwZSBpbmRpY2F0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2Ygb3V0cHV0IChzdGRvdXQgb3Igc3RkZXJyKS5cbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgbG9nKHR5cGU6IE91dHB1dFR5cGUsIGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikge1xuICAgIGRhdGEgPSBCdWZmZXIuaXNCdWZmZXIoZGF0YSkgPyBkYXRhLnRvU3RyaW5nKEVuY29kaW5nKSA6IGRhdGE7XG4gICAgY29uc3QgbG9nID0gdHlwZSA9PT0gXCJzdGRlcnJcIiA/IHN0eWxlKGRhdGEpLnJlZC50ZXh0IDogZGF0YTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKGxvZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc3RhbmRhcmQgb3V0cHV0IGRhdGEuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGdpdmVuIGNodW5rIGFzIHN0YW5kYXJkIG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIGNodW5rIC0gVGhlIGRhdGEgY2h1bmsgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZGF0YShjaHVuazogYW55KSB7XG4gICAgdGhpcy5sb2coXCJzdGRvdXRcIiwgU3RyaW5nKGNodW5rKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZXJyb3Igb3V0cHV0IGRhdGEuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGdpdmVuIGNodW5rIGFzIGVycm9yIG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIGNodW5rIC0gVGhlIGVycm9yIGRhdGEgY2h1bmsgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZXJyb3IoY2h1bms6IGFueSkge1xuICAgIHRoaXMubG9nKFwic3RkZXJyXCIsIFN0cmluZyhjaHVuaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGVycm9yIG9iamVjdHMuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgZ2l2ZW4gRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIC0gVGhlIEVycm9yIG9iamVjdCB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBlcnJvcnMoZXJyOiBFcnJvcikge1xuICAgIHRoaXMubG9nKFwic3RkZXJyXCIsIGBFcnJvciBleGVjdXRpbmcgY29tbWFuZCBleGl0ZWQgOiAke2Vycn1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB0aGUgZXhpdCBvZiBhIGNvbW1hbmQuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGV4aXQgY29kZSBhbmQgcmVzb2x2ZXMgb3IgcmVqZWN0cyB0aGUgcHJvbWlzZSBiYXNlZCBvbiB0aGUgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIGNvZGUgLSBUaGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gbG9nc1xuICAgKi9cbiAgZXhpdChjb2RlOiBudW1iZXIgfCBzdHJpbmcsIGxvZ3M6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5sb2coXG4gICAgICBcInN0ZG91dFwiLFxuICAgICAgYGNvbW1hbmQgZXhpdGVkIGNvZGUgOiAke2NvZGUgPT09IDAgPyBzdHlsZShjb2RlLnRvU3RyaW5nKCkpLmdyZWVuLnRleHQgOiBzdHlsZShjb2RlID09PSBudWxsID8gXCJudWxsXCIgOiBjb2RlLnRvU3RyaW5nKCkpLnJlZC50ZXh0fWBcbiAgICApO1xuICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICB0aGlzLnJlc29sdmUobG9ncy5tYXAoKGwpID0+IGwudHJpbSgpKS5qb2luKFwiXFxuXCIpIGFzIFIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlamVjdChuZXcgRXJyb3IobG9ncy5sZW5ndGggPyBsb2dzLmpvaW4oXCJcXG5cIikgOiBjb2RlLnRvU3RyaW5nKCkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbW1hbmQgc3RyaW5nIG9yIGFycmF5IGludG8gY29tcG9uZW50cy5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIGNvbW1hbmQgaW50byBhIGNvbnNpc3RlbnQgZm9ybWF0IGFuZCBzdG9yZXMgaXQsIHRoZW4gcmV0dXJucyBpdCBzcGxpdCBpbnRvIGNvbW1hbmQgYW5kIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCBhcyBhIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzLlxuICAgKiBAcmV0dXJuIEEgdHVwbGUgY29udGFpbmluZyB0aGUgY29tbWFuZCBhbmQgaXRzIGFyZ3VtZW50cyBhcyBzZXBhcmF0ZSBlbGVtZW50cy5cbiAgICovXG4gIHBhcnNlQ29tbWFuZChjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFtzdHJpbmcsIHN0cmluZ1tdXSB7XG4gICAgY29tbWFuZCA9IHR5cGVvZiBjb21tYW5kID09PSBcInN0cmluZ1wiID8gY29tbWFuZC5zcGxpdChcIiBcIikgOiBjb21tYW5kO1xuICAgIHRoaXMuY21kID0gY29tbWFuZC5qb2luKFwiIFwiKTtcbiAgICByZXR1cm4gW2NvbW1hbmRbMF0sIGNvbW1hbmQuc2xpY2UoMSldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyB0aGUgcHJvbWlzZSB3aXRoIGEgc3VjY2VzcyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgc3VjY2VzcyBtZXNzYWdlIGFuZCByZXNvbHZlcyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBnaXZlbiByZWFzb24uXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBUaGUgcmVhc29uIGZvciByZXNvbHZpbmcgdGhlIHByb21pc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZShyZWFzb246IFIpIHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIFwic3Rkb3V0XCIsXG4gICAgICBgJHt0aGlzLmNtZH0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5OiAke3N0eWxlKHJlYXNvbiA/IFwicmFuIHRvIGNvbXBsZXRpb25cIiA6IChyZWFzb24gYXMgc3RyaW5nKSkuZ3JlZW59YFxuICAgICk7XG4gICAgdGhpcy5sb2NrLnJlc29sdmUocmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVqZWN0cyB0aGUgcHJvbWlzZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYW4gZXJyb3IgbWVzc2FnZSBhbmQgcmVqZWN0cyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBnaXZlbiByZWFzb24uXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBUaGUgcmVhc29uIGZvciByZWplY3RpbmcgdGhlIHByb21pc2UsIGVpdGhlciBhIG51bWJlciAoZXhpdCBjb2RlKSBvciBhIHN0cmluZy5cbiAgICovXG4gIHByb3RlY3RlZCByZWplY3QocmVhc29uOiBudW1iZXIgfCBzdHJpbmcgfCBFcnJvcikge1xuICAgIGlmICghKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgcmVhc29uID0gbmV3IEVycm9yKFxuICAgICAgICB0eXBlb2YgcmVhc29uID09PSBcIm51bWJlclwiID8gYEV4aXQgY29kZSAke3JlYXNvbn1gIDogcmVhc29uXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmxvZyhcbiAgICAgIFwic3RkZXJyXCIsXG4gICAgICBgJHt0aGlzLmNtZH0gZmFpbGVkIHRvIGV4ZWN1dGU6ICR7c3R5bGUocmVhc29uLm1lc3NhZ2UpLnJlZH1gXG4gICAgKTtcbiAgICB0aGlzLmxvY2sucmVqZWN0KHJlYXNvbik7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENoaWxkUHJvY2Vzc1dpdGhvdXROdWxsU3RyZWFtcyxcbiAgc3Bhd24sXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbn0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IFN0YW5kYXJkT3V0cHV0V3JpdGVyIH0gZnJvbSBcIi4uL3dyaXRlcnMvU3RhbmRhcmRPdXRwdXRXcml0ZXJcIjtcbmltcG9ydCB7IENvbW1hbmRSZXN1bHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCIuLi9vdXRwdXQvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgT3V0cHV0V3JpdGVyQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vd3JpdGVycy90eXBlc1wiO1xuaW1wb3J0IHsgVmVyYm9zaXR5TG9nZ2VyIH0gZnJvbSBcIi4uL291dHB1dC90eXBlc1wiO1xuaW1wb3J0IHsgQWJvcnRDb2RlIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBsb2NrZWQgdmVyc2lvbiBvZiBhIGZ1bmN0aW9uLlxuICogQHN1bW1hcnkgVGhpcyBoaWdoZXItb3JkZXIgZnVuY3Rpb24gdGFrZXMgYSBmdW5jdGlvbiBhbmQgcmV0dXJucyBhIG5ldyBmdW5jdGlvbiB0aGF0IGVuc3VyZXNcbiAqIHNlcXVlbnRpYWwgZXhlY3V0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiwgZXZlbiB3aGVuIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBjb25jdXJyZW50bHkuXG4gKiBJdCB1c2VzIGEgUHJvbWlzZS1iYXNlZCBsb2NraW5nIG1lY2hhbmlzbSB0byBxdWV1ZSBmdW5jdGlvbiBjYWxscy5cbiAqXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaW5wdXQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGYgLSBUaGUgZnVuY3Rpb24gdG8gYmUgbG9ja2VkLiBJdCBjYW4gdGFrZSBhbnkgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIHJldHVybiBhIHZhbHVlIG9mIHR5cGUgUi5cbiAqIEByZXR1cm4gQSBuZXcgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYXMgdGhlIGlucHV0IGZ1bmN0aW9uLCBidXQgd2l0aCBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBndWFyYW50ZWVkLlxuICpcbiAqIEBmdW5jdGlvbiBsb2NraWZ5XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgTG9ja2VkRnVuY3Rpb25cbiAqICAgcGFydGljaXBhbnQgT3JpZ2luYWxGdW5jdGlvblxuICogICBDYWxsZXItPj5Mb2NrZWRGdW5jdGlvbjogQ2FsbCB3aXRoIHBhcmFtc1xuICogICBMb2NrZWRGdW5jdGlvbi0+PkxvY2tlZEZ1bmN0aW9uOiBDaGVjayBjdXJyZW50IGxvY2tcbiAqICAgYWx0IExvY2sgaXMgcmVzb2x2ZWRcbiAqICAgICBMb2NrZWRGdW5jdGlvbi0+Pk9yaWdpbmFsRnVuY3Rpb246IEV4ZWN1dGUgd2l0aCBwYXJhbXNcbiAqICAgICBPcmlnaW5hbEZ1bmN0aW9uLS0+PkxvY2tlZEZ1bmN0aW9uOiBSZXR1cm4gcmVzdWx0XG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tLT4+Q2FsbGVyOiBSZXR1cm4gcmVzdWx0XG4gKiAgIGVsc2UgTG9jayBpcyBwZW5kaW5nXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogUXVldWUgZXhlY3V0aW9uXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tLT4+Q2FsbGVyOiBSZXR1cm4gcHJvbWlzZVxuICogICAgIE5vdGUgb3ZlciBMb2NrZWRGdW5jdGlvbjogV2FpdCBmb3IgcHJldmlvdXMgZXhlY3V0aW9uXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tPj5PcmlnaW5hbEZ1bmN0aW9uOiBFeGVjdXRlIHdpdGggcGFyYW1zXG4gKiAgICAgT3JpZ2luYWxGdW5jdGlvbi0tPj5Mb2NrZWRGdW5jdGlvbjogUmV0dXJuIHJlc3VsdFxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmVzb2x2ZSBwcm9taXNlIHdpdGggcmVzdWx0XG4gKiAgIGVuZFxuICogICBMb2NrZWRGdW5jdGlvbi0+PkxvY2tlZEZ1bmN0aW9uOiBVcGRhdGUgbG9ja1xuICpcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tpZnk8Uj4oZjogKC4uLnBhcmFtczogdW5rbm93bltdKSA9PiBSKSB7XG4gIGxldCBsb2NrOiBQcm9taXNlPFIgfCB2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gKC4uLnBhcmFtczogdW5rbm93bltdKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gbG9jay50aGVuKCgpID0+IGYoLi4ucGFyYW1zKSk7XG4gICAgbG9jayA9IHJlc3VsdC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYWluQWJvcnRDb250cm9sbGVyKFxuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIsXG4gIC4uLnNpZ25hbHM6IEFib3J0U2lnbmFsW11cbik6IEFib3J0Q29udHJvbGxlcjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgLi4uc2lnbmFsczogQWJvcnRTaWduYWxbXVxuKTogQWJvcnRDb250cm9sbGVyO1xuZXhwb3J0IGZ1bmN0aW9uIGNoYWluQWJvcnRDb250cm9sbGVyKFxuICBhcmd1bWVudDA6IEFib3J0Q29udHJvbGxlciB8IEFib3J0U2lnbmFsLFxuICAuLi5yZW1haW5kZXI6IEFib3J0U2lnbmFsW11cbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGxldCBzaWduYWxzOiBBYm9ydFNpZ25hbFtdO1xuICBsZXQgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8vIG5vcm1hbGl6ZSBhcmdzXG4gIGlmIChhcmd1bWVudDAgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgc2lnbmFscyA9IFthcmd1bWVudDAsIC4uLnJlbWFpbmRlcl07XG4gIH0gZWxzZSB7XG4gICAgY29udHJvbGxlciA9IGFyZ3VtZW50MDtcbiAgICBzaWduYWxzID0gcmVtYWluZGVyO1xuICB9XG5cbiAgLy8gaWYgdGhlIGNvbnRyb2xsZXIgaXMgYWxyZWFkeSBhYm9ydGVkLCBleGl0IGVhcmx5XG4gIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXI7XG4gIH1cblxuICBjb25zdCBoYW5kbGVyID0gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHtcbiAgICAvLyBjaGVjayBiZWZvcmUgYWRkaW5nISAoYW5kIGFzc3VtZSB0aGVyZSBpcyBubyBwb3NzaWJsZSB3YXkgdGhhdCB0aGUgc2lnbmFsIGNvdWxkXG4gICAgLy8gYWJvcnQgYmV0d2VlbiB0aGUgYGlmYCBjaGVjayBhbmQgYWRkaW5nIHRoZSBldmVudCBsaXN0ZW5lcilcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGhhbmRsZXIsIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3bkNvbW1hbmQ8UiA9IHN0cmluZz4oXG4gIG91dHB1dDogU3RhbmRhcmRPdXRwdXRXcml0ZXI8Uj4sXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0czogU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBhYm9ydDogQWJvcnRDb250cm9sbGVyLFxuICBsb2dnZXI6IFZlcmJvc2l0eUxvZ2dlclxuKTogQ2hpbGRQcm9jZXNzV2l0aG91dE51bGxTdHJlYW1zIHtcbiAgZnVuY3Rpb24gc3Bhd25Jbm5lcihjb21tYW5kOiBzdHJpbmcsIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcikge1xuICAgIGNvbnN0IFtjbWQsIGFyZ3pdID0gb3V0cHV0LnBhcnNlQ29tbWFuZChjb21tYW5kKTtcbiAgICBsb2dnZXIuaW5mbyhgUnVubmluZyBjb21tYW5kOiAke2NtZH1gKTtcbiAgICBsb2dnZXIuZGVidWcoYHdpdGggYXJnczogJHthcmd6LmpvaW4oXCIgXCIpfWApO1xuICAgIGNvbnN0IGNoaWxkUHJvY2VzcyA9IHNwYXduKGNtZCwgYXJneiwge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGN3ZDogb3B0cy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgIGVudjogT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYsIG9wdHMuZW52LCB7IFBBVEg6IHByb2Nlc3MuZW52LlBBVEggfSksXG4gICAgICBzaGVsbDogb3B0cy5zaGVsbCB8fCBmYWxzZSxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgbG9nZ2VyLnZlcmJvc2UoYHBpZCA6ICR7Y2hpbGRQcm9jZXNzLnBpZH1gKTtcbiAgICByZXR1cm4gY2hpbGRQcm9jZXNzO1xuICB9XG5cbiAgY29uc3QgbSA9IGNvbW1hbmQubWF0Y2goL1s8PiQjXS9nKTtcbiAgaWYgKG0pXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgY29tbWFuZDogJHtjb21tYW5kfS4gY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzOiAke219YFxuICAgICk7XG4gIGlmIChjb21tYW5kLmluY2x1ZGVzKFwiIHwgXCIpKSB7XG4gICAgY29uc3QgY21kcyA9IGNvbW1hbmQuc3BsaXQoXCIgfCBcIik7XG4gICAgY29uc3Qgc3Bhd25zID0gW107XG4gICAgY29uc3QgY29udHJvbGxlcnMgPSBuZXcgQXJyYXkoY21kcy5sZW5ndGgpO1xuICAgIGNvbnRyb2xsZXJzWzBdID0gYWJvcnQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaSAhPT0gMClcbiAgICAgICAgY29udHJvbGxlcnNbaV0gPSBjaGFpbkFib3J0Q29udHJvbGxlcihjb250cm9sbGVyc1tpIC0gMV0uc2lnbmFsKTtcbiAgICAgIHNwYXducy5wdXNoKHNwYXduSW5uZXIoY21kc1tpXSwgY29udHJvbGxlcnNbaV0pKTtcbiAgICAgIGlmIChpID09PSAwKSBjb250aW51ZTtcbiAgICAgIHNwYXduc1tpIC0gMV0uc3Rkb3V0LnBpcGUoc3Bhd25zW2ldLnN0ZGluKTtcbiAgICB9XG4gICAgcmV0dXJuIHNwYXduc1tjbWRzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgcmV0dXJuIHNwYXduSW5uZXIoY29tbWFuZCwgYWJvcnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIGNvbW1hbmQgYXN5bmNocm9ub3VzbHkgd2l0aCBjdXN0b21pemFibGUgb3V0cHV0IGhhbmRsaW5nLlxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBydW5zIGEgc2hlbGwgY29tbWFuZCBhcyBhIGNoaWxkIHByb2Nlc3MsIHByb3ZpZGluZyBmaW5lLWdyYWluZWRcbiAqIGNvbnRyb2wgb3ZlciBpdHMgZXhlY3V0aW9uIGFuZCBvdXRwdXQgaGFuZGxpbmcuIEl0IHN1cHBvcnRzIGN1c3RvbSBvdXRwdXQgd3JpdGVycyxcbiAqIGFsbG93cyBmb3IgY29tbWFuZCBhYm9ydGlvbiwgYW5kIGNhcHR1cmVzIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcmVzb2x2ZWQgdmFsdWUgZnJvbSB0aGUgY29tbWFuZCBleGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW4sIGVpdGhlciBhcyBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdHMgLSBTcGF3biBvcHRpb25zIGZvciB0aGUgY2hpbGQgcHJvY2Vzcy4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuICogQHBhcmFtIG91dHB1dENvbnN0cnVjdG9yIC0gQ29uc3RydWN0b3IgZm9yIHRoZSBvdXRwdXQgd3JpdGVyLiBEZWZhdWx0cyB0byBTdGFuZGFyZE91dHB1dFdyaXRlci5cbiAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb3V0cHV0IGNvbnN0cnVjdG9yLlxuICogQHJldHVybiB7Q29tbWFuZFJlc3VsdH0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbW1hbmQgcmVzdWx0IG9mIHR5cGUgUi5cbiAqXG4gKiBAZnVuY3Rpb24gcnVuQ29tbWFuZFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHJ1bkNvbW1hbmRcbiAqICAgcGFydGljaXBhbnQgT3V0cHV0V3JpdGVyXG4gKiAgIHBhcnRpY2lwYW50IENoaWxkUHJvY2Vzc1xuICogICBDYWxsZXItPj5ydW5Db21tYW5kOiBDYWxsIHdpdGggY29tbWFuZCBhbmQgb3B0aW9uc1xuICogICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBDcmVhdGUgbmV3IGluc3RhbmNlXG4gKiAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IFBhcnNlIGNvbW1hbmRcbiAqICAgcnVuQ29tbWFuZC0+PkNoaWxkUHJvY2VzczogU3Bhd24gcHJvY2Vzc1xuICogICBDaGlsZFByb2Nlc3MtLT4+cnVuQ29tbWFuZDogUmV0dXJuIHByb2Nlc3Mgb2JqZWN0XG4gKiAgIHJ1bkNvbW1hbmQtPj5DaGlsZFByb2Nlc3M6IFNldCB1cCBldmVudCBsaXN0ZW5lcnNcbiAqICAgbG9vcCBGb3IgZWFjaCBzdGRvdXQgZGF0YVxuICogICAgIENoaWxkUHJvY2Vzcy0+PnJ1bkNvbW1hbmQ6IEVtaXQgc3Rkb3V0IGRhdGFcbiAqICAgICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBIYW5kbGUgc3Rkb3V0IGRhdGFcbiAqICAgZW5kXG4gKiAgIGxvb3AgRm9yIGVhY2ggc3RkZXJyIGRhdGFcbiAqICAgICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IHN0ZGVyciBkYXRhXG4gKiAgICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogSGFuZGxlIHN0ZGVyciBkYXRhXG4gKiAgIGVuZFxuICogICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IGVycm9yIChpZiBhbnkpXG4gKiAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IEhhbmRsZSBlcnJvclxuICogICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IGV4aXRcbiAqICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogSGFuZGxlIGV4aXRcbiAqICAgT3V0cHV0V3JpdGVyLS0+PnJ1bkNvbW1hbmQ6IFJlc29sdmUgb3IgcmVqZWN0IHByb21pc2VcbiAqICAgcnVuQ29tbWFuZC0tPj5DYWxsZXI6IFJldHVybiBDb21tYW5kUmVzdWx0XG4gKlxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29tbWFuZDxSID0gc3RyaW5nPihcbiAgY29tbWFuZDogc3RyaW5nLFxuICBvcHRzOiBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8gPSB7fSxcbiAgb3V0cHV0Q29uc3RydWN0b3I6IE91dHB1dFdyaXRlckNvbnN0cnVjdG9yPFxuICAgIFIsXG4gICAgU3RhbmRhcmRPdXRwdXRXcml0ZXI8Uj4sXG4gICAgRXJyb3JcbiAgPiA9IFN0YW5kYXJkT3V0cHV0V3JpdGVyPFI+LFxuICAuLi5hcmdzOiB1bmtub3duW11cbik6IENvbW1hbmRSZXN1bHQ8Uj4ge1xuICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihydW5Db21tYW5kKTtcbiAgY29uc3QgYWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgY29uc3QgcmVzdWx0OiBPbWl0PENvbW1hbmRSZXN1bHQsIFwicHJvbWlzZVwiIHwgXCJwaXBlXCI+ID0ge1xuICAgIGFib3J0OiBhYm9ydCxcbiAgICBjb21tYW5kOiBjb21tYW5kLFxuICAgIGxvZ3M6IFtdLFxuICAgIGVycnM6IFtdLFxuICB9O1xuXG4gIGNvbnN0IGxvY2sgPSBuZXcgUHJvbWlzZTxSPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IG91dHB1dDtcbiAgICB0cnkge1xuICAgICAgb3V0cHV0ID0gbmV3IG91dHB1dENvbnN0cnVjdG9yKFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3QsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG5cbiAgICAgIHJlc3VsdC5jbWQgPSBzcGF3bkNvbW1hbmQ8Uj4ob3V0cHV0LCBjb21tYW5kLCBvcHRzLCBhYm9ydCwgbG9nZ2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgRXJyb3IgcnVubmluZyBjb21tYW5kICR7Y29tbWFuZH06ICR7ZX1gKSk7XG4gICAgfVxuXG4gICAgcmVzdWx0LmNtZC5zdGRvdXQuc2V0RW5jb2RpbmcoXCJ1dGY4XCIpO1xuXG4gICAgcmVzdWx0LmNtZC5zdGRvdXQub24oXCJkYXRhXCIsIChjaHVuazogYW55KSA9PiB7XG4gICAgICBjaHVuayA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgICByZXN1bHQubG9ncy5wdXNoKGNodW5rKTtcbiAgICAgIG91dHB1dC5kYXRhKGNodW5rKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5jbWQuc3RkZXJyLm9uKFwiZGF0YVwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBkYXRhID0gZGF0YS50b1N0cmluZygpO1xuICAgICAgcmVzdWx0LmVycnMucHVzaChkYXRhKTtcbiAgICAgIG91dHB1dC5lcnJvcihkYXRhKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5jbWQub25jZShcImVycm9yXCIsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICBvdXRwdXQuZXhpdChlcnIubWVzc2FnZSwgcmVzdWx0LmVycnMpO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0LmNtZC5vbmNlKFwiZXhpdFwiLCAoY29kZTogbnVtYmVyID0gMCkgPT4ge1xuICAgICAgaWYgKGFib3J0LnNpZ25hbC5hYm9ydGVkICYmIGNvZGUgPT09IG51bGwpIGNvZGUgPSBBYm9ydENvZGUgYXMgYW55O1xuICAgICAgb3V0cHV0LmV4aXQoY29kZSwgY29kZSA9PT0gMCA/IHJlc3VsdC5sb2dzIDogcmVzdWx0LmVycnMpO1xuICAgIH0pO1xuICB9KTtcblxuICBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgIHByb21pc2U6IGxvY2ssXG4gICAgcGlwZTogYXN5bmMgPEU+KGNiOiAocjogUikgPT4gRSkgPT4ge1xuICAgICAgY29uc3QgbCA9IGxvZ2dlci5mb3IoXCJwaXBlXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbC52ZXJib3NlKGBFeGVjdXRpbmcgcGlwZSBmdW5jdGlvbiAke2NvbW1hbmR9Li4uYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUiA9IGF3YWl0IGxvY2s7XG4gICAgICAgIGwudmVyYm9zZShgUGlwaW5nIG91dHB1dCB0byAke2NiLm5hbWV9OiAke3Jlc3VsdH1gKTtcbiAgICAgICAgcmV0dXJuIGNiKHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGwuZXJyb3IoYEVycm9yIHBpcGluZyBjb21tYW5kIG91dHB1dDogJHtlfWApO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQgYXMgQ29tbWFuZFJlc3VsdDxSPjtcbn1cbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4uL291dHB1dC9sb2dnaW5nXCI7XG5pbXBvcnQgeyBwYXRjaFN0cmluZyB9IGZyb20gXCIuL3RleHRcIjtcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeU1hcCwgU2ltcGxlRGVwZW5kZW5jeU1hcCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKFwiZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhdGNoZXMgYSBmaWxlIHdpdGggZ2l2ZW4gdmFsdWVzLlxuICogQHN1bW1hcnkgUmVhZHMgYSBmaWxlLCBhcHBsaWVzIHBhdGNoZXMgdXNpbmcgVGV4dFV0aWxzLCBhbmQgd3JpdGVzIHRoZSByZXN1bHQgYmFjayB0byB0aGUgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIHBhdGNoZWQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz59IHZhbHVlcyAtIFRoZSB2YWx1ZXMgdG8gcGF0Y2ggaW50byB0aGUgZmlsZS5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHBhdGNoRmlsZVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHBhdGNoRmlsZVxuICogICBwYXJ0aWNpcGFudCBmc1xuICogICBwYXJ0aWNpcGFudCByZWFkRmlsZVxuICogICBwYXJ0aWNpcGFudCBUZXh0VXRpbHNcbiAqICAgcGFydGljaXBhbnQgd3JpdGVGaWxlXG4gKiAgIENhbGxlci0+PnBhdGNoRmlsZTogQ2FsbCB3aXRoIHBhdGggYW5kIHZhbHVlc1xuICogICBwYXRjaEZpbGUtPj5mczogQ2hlY2sgaWYgZmlsZSBleGlzdHNcbiAqICAgcGF0Y2hGaWxlLT4+cmVhZEZpbGU6IFJlYWQgZmlsZSBjb250ZW50XG4gKiAgIHJlYWRGaWxlLT4+ZnM6IFJlYWQgZmlsZVxuICogICBmcy0tPj5yZWFkRmlsZTogUmV0dXJuIGZpbGUgY29udGVudFxuICogICByZWFkRmlsZS0tPj5wYXRjaEZpbGU6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgcGF0Y2hGaWxlLT4+VGV4dFV0aWxzOiBQYXRjaCBzdHJpbmdcbiAqICAgVGV4dFV0aWxzLS0+PnBhdGNoRmlsZTogUmV0dXJuIHBhdGNoZWQgY29udGVudFxuICogICBwYXRjaEZpbGUtPj53cml0ZUZpbGU6IFdyaXRlIHBhdGNoZWQgY29udGVudFxuICogICB3cml0ZUZpbGUtPj5mczogV3JpdGUgdG8gZmlsZVxuICogICBmcy0tPj53cml0ZUZpbGU6IEZpbGUgd3JpdHRlblxuICogICB3cml0ZUZpbGUtLT4+cGF0Y2hGaWxlOiBGaWxlIHdyaXR0ZW5cbiAqICAgcGF0Y2hGaWxlLS0+PkNhbGxlcjogUGF0Y2hpbmcgY29tcGxldGVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZzLXV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaEZpbGUoXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+XG4pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihwYXRjaEZpbGUpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCBhdCBwYXRoIFwiJHtwYXRofVwiLmApO1xuICBsZXQgY29udGVudCA9IHJlYWRGaWxlKHBhdGgpO1xuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFBhdGNoaW5nIGZpbGUgXCIke3BhdGh9XCIuLi5gKTtcbiAgICBsb2cuZGVidWcoYHdpdGggdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWVzKX1gKTtcbiAgICBjb250ZW50ID0gcGF0Y2hTdHJpbmcoY29udGVudCwgdmFsdWVzKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHBhdGNoaW5nIGZpbGU6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgd3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIGZpbGUgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQuXG4gKiBAc3VtbWFyeSBSZWFkcyB0aGUgY29udGVudCBvZiBhIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGFuZCByZXR1cm5zIGl0IGFzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgcmVhZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuXG4gKlxuICogQGZ1bmN0aW9uIHJlYWRGaWxlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihyZWFkRmlsZSk7XG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFJlYWRpbmcgZmlsZSBcIiR7cGF0aH1cIi4uLmApO1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciByZWFkaW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciByZWFkaW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gV3JpdGVzIGRhdGEgdG8gYSBmaWxlLlxuICogQHN1bW1hcnkgV3JpdGVzIHRoZSBwcm92aWRlZCBkYXRhIHRvIGEgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSB3cml0dGVuLlxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IGRhdGEgLSBUaGUgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlLlxuICogQHJldHVybiB7dm9pZH1cbiAqXG4gKiBAZnVuY3Rpb24gd3JpdGVGaWxlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVGaWxlKHBhdGg6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKTogdm9pZCB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3Iod3JpdGVGaWxlKTtcbiAgdHJ5IHtcbiAgICBsb2cudmVyYm9zZShgV3JpdGluZyBmaWxlIFwiJHtwYXRofSB3aXRoICR7ZGF0YS5sZW5ndGh9IGJ5dGVzLi4uYCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLCBkYXRhLCBcInV0ZjhcIik7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoYEVycm9yIHdyaXRpbmcgZmlsZSBcIiR7cGF0aH1cIjogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdyaXRpbmcgZmlsZSBcIiR7cGF0aH1cIjogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIGZpbGVzIHJlY3Vyc2l2ZWx5IGZyb20gYSBkaXJlY3RvcnkuXG4gKiBAc3VtbWFyeSBUcmF2ZXJzZXMgdGhyb3VnaCBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMgdG8gY29sbGVjdCBhbGwgZmlsZSBwYXRocy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcCAtIFRoZSBwYXRoIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tLlxuICogQHBhcmFtIGZpbHRlclxuICogQHJldHVybiB7c3RyaW5nW119IEFycmF5IG9mIGZpbGUgcGF0aHMuXG4gKlxuICogQGZ1bmN0aW9uIGdldEFsbEZpbGVzXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsRmlsZXMoXG4gIHA6IHN0cmluZyxcbiAgZmlsdGVyPzogKGY6IHN0cmluZywgaT86IG51bWJlcikgPT4gYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKGdldEFsbEZpbGVzKTtcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgdHJ5IHtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBhbGwgZmlsZXMgZnJvbSBcIiR7cH1cIi4uLmApO1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhwKTtcblxuICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHAsIGVudHJ5KTtcbiAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aCk7XG5cbiAgICAgIGlmIChzdGF0LmlzRmlsZSgpKSB7XG4gICAgICAgIGZpbGVzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgZmlsZXMucHVzaCguLi5nZXRBbGxGaWxlcyhmdWxsUGF0aCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghZmlsdGVyKSByZXR1cm4gZmlsZXM7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmaWx0ZXIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciByZXRyaWV2aW5nIGZpbGVzIGZyb20gXCIke3B9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciByZXRyaWV2aW5nIGZpbGVzIGZyb20gXCIke3B9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmFtZUZpbGUoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHJlbmFtZUZpbGUpO1xuICBsZXQgZGVzY3JpcHRvclNvdXJjZSwgZGVzY3JpcHRvckRlc3Q7XG5cbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yU291cmNlID0gZnMuc3RhdFN5bmMoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGRlc2NyaXB0b3JEZXN0ID0gZnMuc3RhdFN5bmMoZGVzdCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgLy8gZG8gbm90aGluZy4gaXRzIG9rXG4gIH1cbiAgaWYgKGRlc2NyaXB0b3JEZXN0KSB7XG4gICAgbG9nLnZlcmJvc2UoYERlc3RpbmF0aW9uIHBhdGggXCIke2Rlc3R9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlc3RpbmF0aW9uIHBhdGggXCIke2Rlc3R9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgUmVuYW1pbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fS4uLmBcbiAgICApO1xuICAgIGZzLnJlbmFtZVN5bmMoc291cmNlLCBkZXN0KTtcbiAgICBsb2cudmVyYm9zZShgU3VjY2Vzc2Z1bGx5IHJlbmFtZWQgdG8gXCIke2Rlc3R9XCJgKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBFcnJvciByZW5hbWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9XCI6ICR7ZXJyb3J9YFxuICAgICk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVycm9yIHJlbmFtaW5nICR7ZGVzY3JpcHRvclNvdXJjZS5pc0ZpbGUoKSA/IFwiZmlsZVwiIDogXCJkaXJlY3RvcnlcIn0gXCIke3NvdXJjZX1cIiB0byBcIiR7ZGVzdH1cIjogJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weUZpbGUoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKGNvcHlGaWxlKTtcbiAgbGV0IGRlc2NyaXB0b3JTb3VyY2UsIGRlc2NyaXB0b3JEZXN0O1xuICB0cnkge1xuICAgIGRlc2NyaXB0b3JTb3VyY2UgPSBmcy5zdGF0U3luYyhzb3VyY2UpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBTb3VyY2UgcGF0aCBcIiR7c291cmNlfVwiIGRvZXMgbm90IGV4aXN0OiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZXNjcmlwdG9yRGVzdCA9IGZzLnN0YXRTeW5jKGRlc3QpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoZGVzY3JpcHRvclNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBsb2cudmVyYm9zZShgRGVzdCBwYXRoIFwiJHtkZXN0fVwiIGRvZXMgbm90IGV4aXN0LiBjcmVhdGluZ2ApO1xuICAgICAgZnMubWtkaXJTeW5jKGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgQ29weWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9Li4uYFxuICAgICk7XG4gICAgZnMuY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgRXJyb3IgY29weWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9OiAke2Vycm9yfWBcbiAgICApO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFcnJvciBjb3B5aW5nICR7ZGVzY3JpcHRvclNvdXJjZS5pc0ZpbGUoKSA/IFwiZmlsZVwiIDogXCJkaXJlY3RvcnlcIn0gXCIke3NvdXJjZX1cIiB0byBcIiR7ZGVzdH06ICR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZVBhdGgocDogc3RyaW5nKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoZGVsZXRlUGF0aCk7XG4gIHRyeSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGZzLnN0YXRTeW5jKHApO1xuICAgIGlmIChkZXNjcmlwdG9yLmlzRmlsZSgpKSB7XG4gICAgICBsb2cudmVyYm9zZShgRGVsZXRpbmcgZmlsZSBcIiR7cH0uLi5gKTtcbiAgICAgIGZzLnJtU3luYyhwLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yLmlzRGlyZWN0b3J5KCkpXG4gICAgICBmcy5ybVN5bmMocCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciBEZWxldGluZyBcIiR7cH1cIjogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIERlbGV0aW5nIFwiJHtwfVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBwYWNrYWdlIGluZm9ybWF0aW9uIGZyb20gcGFja2FnZS5qc29uLlxuICogQHN1bW1hcnkgTG9hZHMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGUgZnJvbSBhIHNwZWNpZmllZCBkaXJlY3Rvcnkgb3IgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIENhbiByZXR1cm4gdGhlIGVudGlyZSBwYWNrYWdlIG9iamVjdCBvciBhIHNwZWNpZmljIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtwPXByb2Nlc3MuY3dkKCldIC0gVGhlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBPcHRpb25hbC4gVGhlIHNwZWNpZmljIHByb3BlcnR5IHRvIHJldHJpZXZlIGZyb20gcGFja2FnZS5qc29uLlxuICogQHJldHVybiB7b2JqZWN0IHwgc3RyaW5nfSBUaGUgcGFyc2VkIGNvbnRlbnRzIG9mIHBhY2thZ2UuanNvbiBvciB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBmdW5jdGlvbiBnZXRQYWNrYWdlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZXRQYWNrYWdlXG4gKiAgIHBhcnRpY2lwYW50IHJlYWRGaWxlXG4gKiAgIHBhcnRpY2lwYW50IEpTT05cbiAqICAgQ2FsbGVyLT4+Z2V0UGFja2FnZTogQ2FsbCB3aXRoIHBhdGggYW5kIG9wdGlvbmFsIHByb3BlcnR5XG4gKiAgIGdldFBhY2thZ2UtPj5yZWFkRmlsZTogUmVhZCBwYWNrYWdlLmpzb25cbiAqICAgcmVhZEZpbGUtLT4+Z2V0UGFja2FnZTogUmV0dXJuIGZpbGUgY29udGVudFxuICogICBnZXRQYWNrYWdlLT4+SlNPTjogUGFyc2UgZmlsZSBjb250ZW50XG4gKiAgIEpTT04tLT4+Z2V0UGFja2FnZTogUmV0dXJuIHBhcnNlZCBvYmplY3RcbiAqICAgYWx0IHByb3BlcnR5IHNwZWNpZmllZFxuICogICAgIGdldFBhY2thZ2UtPj5nZXRQYWNrYWdlOiBDaGVjayBpZiBwcm9wZXJ0eSBleGlzdHNcbiAqICAgICBhbHQgcHJvcGVydHkgZXhpc3RzXG4gKiAgICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogUmV0dXJuIHByb3BlcnR5IHZhbHVlXG4gKiAgICAgZWxzZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0XG4gKiAgICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogVGhyb3cgRXJyb3JcbiAqICAgICBlbmRcbiAqICAgZWxzZSBubyBwcm9wZXJ0eSBzcGVjaWZpZWRcbiAqICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogUmV0dXJuIGVudGlyZSBwYWNrYWdlIG9iamVjdFxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2UoXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIHByb3BlcnR5Pzogc3RyaW5nXG4pOiBvYmplY3QgfCBzdHJpbmcge1xuICBsZXQgcGtnOiBhbnk7XG4gIHRyeSB7XG4gICAgcGtnID0gSlNPTi5wYXJzZShyZWFkRmlsZShwYXRoLmpvaW4ocCwgYHBhY2thZ2UuanNvbmApKSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgcGFja2FnZSBpbmZvcm1hdGlvblwiICR7ZXJyb3J9YCk7XG4gIH1cblxuICBpZiAocHJvcGVydHkpIHtcbiAgICBpZiAoIShwcm9wZXJ0eSBpbiBwa2cpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSBcIiR7cHJvcGVydHl9XCIgbm90IGZvdW5kIGluIHBhY2thZ2UuanNvbmApO1xuICAgIHJldHVybiBwa2dbcHJvcGVydHldIGFzIHN0cmluZztcbiAgfVxuICByZXR1cm4gcGtnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UGFja2FnZUF0dHJpYnV0ZShcbiAgYXR0cjogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpXG4pOiB2b2lkIHtcbiAgY29uc3QgcGtnID0gZ2V0UGFja2FnZShwKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwa2dbYXR0cl0gPSB2YWx1ZTtcbiAgd3JpdGVGaWxlKHBhdGguam9pbihwLCBgcGFja2FnZS5qc29uYCksIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHZlcnNpb24gZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAc3VtbWFyeSBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY2FsbHMgZ2V0UGFja2FnZSB0byByZXRyaWV2ZSB0aGUgXCJ2ZXJzaW9uXCIgcHJvcGVydHkgZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3A9cHJvY2Vzcy5jd2QoKV0gLSBUaGUgZGlyZWN0b3J5IHBhdGggd2hlcmUgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGlzIGxvY2F0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJzaW9uIHN0cmluZyBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEBmdW5jdGlvbiBnZXRQYWNrYWdlVmVyc2lvblxuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZVZlcnNpb24ocCA9IHByb2Nlc3MuY3dkKCkpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0UGFja2FnZShwLCBcInZlcnNpb25cIikgYXMgc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBwcm9qZWN0LlxuICogQHN1bW1hcnkgRXhlY3V0ZXMgJ25wbSBscyAtLWpzb24nIGNvbW1hbmQgdG8gZ2V0IGEgZGV0YWlsZWQgbGlzdCBvZiBhbGwgZGVwZW5kZW5jaWVzIChwcm9kdWN0aW9uLCBkZXZlbG9wbWVudCwgYW5kIHBlZXIpIGFuZCB0aGVpciB2ZXJzaW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aD1wcm9jZXNzLmN3ZCgpXSAtIFRoZSBkaXJlY3RvcnkgcGF0aCBvZiB0aGUgcHJvamVjdC5cbiAqIEByZXR1cm4ge1Byb21pc2U8e3Byb2Q6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ30+LCBkZXY6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ30+LCBwZWVyOiBBcnJheTx7bmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9Pn0+fSBBbiBvYmplY3QgY29udGFpbmluZyBhcnJheXMgb2YgcHJvZHVjdGlvbiwgZGV2ZWxvcG1lbnQsIGFuZCBwZWVyIGRlcGVuZGVuY2llcy5cbiAqIEBmdW5jdGlvbiBnZXREZXBlbmRlbmNpZXNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGdldERlcGVuZGVuY2llc1xuICogICBwYXJ0aWNpcGFudCBydW5Db21tYW5kXG4gKiAgIHBhcnRpY2lwYW50IEpTT05cbiAqICAgQ2FsbGVyLT4+Z2V0RGVwZW5kZW5jaWVzOiBDYWxsIHdpdGggb3B0aW9uYWwgcGF0aFxuICogICBnZXREZXBlbmRlbmNpZXMtPj5ydW5Db21tYW5kOiBFeGVjdXRlICducG0gbHMgLS1qc29uJ1xuICogICBydW5Db21tYW5kLS0+PmdldERlcGVuZGVuY2llczogUmV0dXJuIGNvbW1hbmQgb3V0cHV0XG4gKiAgIGdldERlcGVuZGVuY2llcy0+PkpTT046IFBhcnNlIGNvbW1hbmQgb3V0cHV0XG4gKiAgIEpTT04tLT4+Z2V0RGVwZW5kZW5jaWVzOiBSZXR1cm4gcGFyc2VkIG9iamVjdFxuICogICBnZXREZXBlbmRlbmNpZXMtPj5nZXREZXBlbmRlbmNpZXM6IFByb2Nlc3MgZGVwZW5kZW5jaWVzXG4gKiAgIGdldERlcGVuZGVuY2llcy0tPj5DYWxsZXI6IFJldHVybiBwcm9jZXNzZWQgZGVwZW5kZW5jaWVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZzLXV0aWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMoXG4gIHBhdGg6IHN0cmluZyA9IHByb2Nlc3MuY3dkKClcbik6IFByb21pc2U8RGVwZW5kZW5jeU1hcD4ge1xuICBsZXQgcGtnOiBhbnk7XG5cbiAgdHJ5IHtcbiAgICBwa2cgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBscyAtLWpzb25gLCB7IGN3ZDogcGF0aCB9KS5wcm9taXNlKTtcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJldHJpZXZlIGRlcGVuZGVuY2llczogJHtlfWApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBjb25zdCBtYXBwZXIgPSAoZW50cnk6IFtzdHJpbmcsIHVua25vd25dLCBpbmRleDogbnVtYmVyKSA9PiAoe1xuICAgIG5hbWU6IGVudHJ5WzBdLFxuICAgIHZlcnNpb246IChlbnRyeVsxXSBhcyBhbnkpLnZlcnNpb24sXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJvZDogT2JqZWN0LmVudHJpZXMocGtnLmRlcGVuZGVuY2llcyB8fCB7fSkubWFwKG1hcHBlciksXG4gICAgZGV2OiBPYmplY3QuZW50cmllcyhwa2cuZGV2RGVwZW5kZW5jaWVzIHx8IHt9KS5tYXAobWFwcGVyKSxcbiAgICBwZWVyOiBPYmplY3QuZW50cmllcyhwa2cucGVlckRlcGVuZGVuY2llcyB8fCB7fSkubWFwKG1hcHBlciksXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEZXBlbmRlbmNpZXMoKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IodXBkYXRlRGVwZW5kZW5jaWVzKTtcbiAgbG9nLmluZm8oXCJjaGVja2luZyBmb3IgdXBkYXRlcy4uLlwiKTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcIm5weCBucG0tY2hlY2stdXBkYXRlcyAtdVwiKS5wcm9taXNlO1xuICBsb2cuaW5mbyhcInVwZGF0aW5nLi4uXCIpO1xuICBhd2FpdCBydW5Db21tYW5kKFwibnB4IG5wbSBydW4gZG8taW5zdGFsbFwiKS5wcm9taXNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbElmTm90QXZhaWxhYmxlKFxuICBkZXBzOiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgZGVwZW5kZW5jaWVzPzogU2ltcGxlRGVwZW5kZW5jeU1hcFxuKSB7XG4gIGlmICghZGVwZW5kZW5jaWVzKSB7XG4gICAgY29uc3QgZDogRGVwZW5kZW5jeU1hcCA9IGF3YWl0IGdldERlcGVuZGVuY2llcygpO1xuICAgIGRlcGVuZGVuY2llcyA9IHtcbiAgICAgIHByb2Q6IGQucHJvZD8ubWFwKChwKSA9PiBwLm5hbWUpIHx8IFtdLFxuICAgICAgZGV2OiBkLmRldj8ubWFwKChkKSA9PiBkLm5hbWUpIHx8IFtdLFxuICAgICAgcGVlcjogZC5wZWVyPy5tYXAoKHApID0+IHAubmFtZSkgfHwgW10sXG4gICAgfTtcbiAgfVxuICBjb25zdCB7IHByb2QsIGRldiwgcGVlciB9ID0gZGVwZW5kZW5jaWVzO1xuICBjb25zdCBpbnN0YWxsZWQgPSBBcnJheS5mcm9tKFxuICAgIG5ldyBTZXQoWy4uLihwcm9kIHx8IFtdKSwgLi4uKGRldiB8fCBbXSksIC4uLihwZWVyIHx8IFtdKV0pXG4gICk7XG4gIGRlcHMgPSB0eXBlb2YgZGVwcyA9PT0gXCJzdHJpbmdcIiA/IFtkZXBzXSA6IGRlcHM7XG4gIGNvbnN0IHRvSW5zdGFsbCA9IGRlcHMuZmlsdGVyKChkKSA9PiAhaW5zdGFsbGVkLmluY2x1ZGVzKGQpKTtcblxuICBpZiAodG9JbnN0YWxsLmxlbmd0aCkgYXdhaXQgaW5zdGFsbERlcGVuZGVuY2llcyh7IGRldjogdG9JbnN0YWxsIH0pO1xuICBkZXBlbmRlbmNpZXMuZGV2ID0gZGVwZW5kZW5jaWVzLmRldiB8fCBbXTtcbiAgZGVwZW5kZW5jaWVzLmRldi5wdXNoKC4uLnRvSW5zdGFsbCk7XG4gIHJldHVybiBkZXBlbmRlbmNpZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdXNoVG9HaXQoKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocHVzaFRvR2l0KTtcbiAgY29uc3QgZ2l0VXNlciA9IGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgY29uZmlnIHVzZXIubmFtZVwiKS5wcm9taXNlO1xuICBjb25zdCBnaXRFbWFpbCA9IGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgY29uZmlnIHVzZXIuZW1haWxcIikucHJvbWlzZTtcbiAgbG9nLnZlcmJvc2UoYGNhY2hlZCBnaXQgaWQ6ICR7Z2l0VXNlcn0vJHtnaXRFbWFpbH0uIGNoYW5naW5nIHRvIGF1dG9tYXRpb25gKTtcbiAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0IGNvbmZpZyB1c2VyLmVtYWlsIFwiYXV0b21hdGlvbkBkZWNhZi50c1wiJykucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0IGNvbmZpZyB1c2VyLm5hbWUgXCJkZWNhZlwiJykucHJvbWlzZTtcbiAgbG9nLmluZm8oXCJQdXNoaW5nIGNoYW5nZXMgdG8gZ2l0Li4uXCIpO1xuICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IGFkZCAuXCIpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoYGdpdCBjb21taXQgLW0gXCJyZWZzICMxIC0gYWZ0ZXIgcmVwbyBzZXR1cFwiYCkucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBwdXNoXCIpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoYGdpdCBjb25maWcgdXNlci5lbWFpbCBcIiR7Z2l0RW1haWx9XCJgKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKGBnaXQgY29uZmlnIHVzZXIubmFtZSBcIiR7Z2l0VXNlcn1cImApLnByb21pc2U7XG4gIGxvZy52ZXJib3NlKGByZXZlcnRlZCB0byBnaXQgaWQ6ICR7Z2l0VXNlcn0vJHtnaXRFbWFpbH1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzOiB7XG4gIHByb2Q/OiBzdHJpbmdbXTtcbiAgZGV2Pzogc3RyaW5nW107XG4gIHBlZXI/OiBzdHJpbmdbXTtcbn0pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihpbnN0YWxsRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgcHJvZCA9IGRlcGVuZGVuY2llcy5wcm9kIHx8IFtdO1xuICBjb25zdCBkZXYgPSBkZXBlbmRlbmNpZXMuZGV2IHx8IFtdO1xuICBjb25zdCBwZWVyID0gZGVwZW5kZW5jaWVzLnBlZXIgfHwgW107XG4gIGlmIChwcm9kLmxlbmd0aCkge1xuICAgIGxvZy5pbmZvKGBJbnN0YWxsaW5nIGRlcGVuZGVuY2llcyAke3Byb2Quam9pbihcIiwgXCIpfS4uLmApO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBpbnN0YWxsICR7cHJvZC5qb2luKFwiIFwiKX1gLCB7IGN3ZDogcHJvY2Vzcy5jd2QoKSB9KVxuICAgICAgLnByb21pc2U7XG4gIH1cbiAgaWYgKGRldi5sZW5ndGgpIHtcbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBkZXZEZXBlbmRlbmNpZXMgJHtkZXYuam9pbihcIiwgXCIpfS4uLmApO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBpbnN0YWxsIC0tc2F2ZS1kZXYgJHtkZXYuam9pbihcIiBcIil9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnByb21pc2U7XG4gIH1cbiAgaWYgKHBlZXIubGVuZ3RoKSB7XG4gICAgbG9nLmluZm8oYEluc3RhbGxpbmcgcGVlckRlcGVuZGVuY2llcyAke3BlZXIuam9pbihcIiwgXCIpfS4uLmApO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBpbnN0YWxsIC0tc2F2ZS1wZWVyICR7cGVlci5qb2luKFwiIFwiKX1gLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSkucHJvbWlzZTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplSW1wb3J0PFQ+KFxuICBpbXBvcnRQcm9taXNlOiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgLy8gQ29tbW9uSlMncyBgbW9kdWxlLmV4cG9ydHNgIGlzIHdyYXBwZWQgYXMgYGRlZmF1bHRgIGluIEVTTW9kdWxlLlxuICByZXR1cm4gaW1wb3J0UHJvbWlzZS50aGVuKChtOiBhbnkpID0+IChtLmRlZmF1bHQgfHwgbSkgYXMgVCk7XG59XG4iLCJpbXBvcnQgeyBWZXJib3NpdHlMb2dnZXIgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHNsb2dhbnMgZnJvbSBcIi4uL2Fzc2V0cy9zbG9nYW5zLmpzb25cIjtcbmltcG9ydCB7IHN0eWxlIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBBTlNJIGNvbG9yIGNvZGVzIGZvciBiYW5uZXIgc3R5bGluZy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBzZXQgb2YgQU5TSSBjb2xvciBjb2RlcyB1c2VkIHRvIHN0eWxlIHRoZSBiYW5uZXIgdGV4dC5cbiAqL1xuY29uc3QgY29sb3JzID0gW1xuICBcIlxceDFiWzM4OzU7MjE1bVwiLCAvLyBzb2Z0IG9yYW5nZVxuICBcIlxceDFiWzM4OzU7MjA5bVwiLCAvLyBjb3JhbFxuICBcIlxceDFiWzM4OzU7MjA1bVwiLCAvLyBwaW5rXG4gIFwiXFx4MWJbMzg7NTsyMTBtXCIsIC8vIHBlYWNoeVxuICBcIlxceDFiWzM4OzU7MjE3bVwiLCAvLyBzYWxtb25cbiAgXCJcXHgxYlszODs1OzIxNm1cIiwgLy8gbGlnaHQgY29yYWxcbiAgXCJcXHgxYlszODs1OzIyNG1cIiwgLy8gbGlnaHQgcGVhY2hcbiAgXCJcXHgxYlszODs1OzIzMG1cIiwgLy8gc29mdCBjcmVhbVxuICBcIlxceDFiWzM4OzU7MjMwbVwiLCAvLyBzb2Z0IGNyZWFtXG5dO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcmludHMgYSBzdHlsZWQgYmFubmVyIHRvIHRoZSBjb25zb2xlLlxuICogQHN1bW1hcnkgR2VuZXJhdGVzIGFuZCBwcmludHMgYSBjb2xvcmZ1bCBBU0NJSSBhcnQgYmFubmVyIHdpdGggYSByYW5kb20gc2xvZ2FuLlxuICogQHBhcmFtIHtWZXJib3NpdHlMb2dnZXJ9IFtsb2dnZXJdIC0gT3B0aW9uYWwgbG9nZ2VyIGZvciB2ZXJib3NlIG91dHB1dC5cbiAqIEBmdW5jdGlvbiBwcmludEJhbm5lclxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBwcmludEJhbm5lclxuICogICBwYXJ0aWNpcGFudCBnZXRTbG9nYW5cbiAqICAgcGFydGljaXBhbnQgcGFkRW5kXG4gKiAgIHBhcnRpY2lwYW50IGNvbnNvbGVcbiAqICAgcHJpbnRCYW5uZXItPj5nZXRTbG9nYW46IENhbGwgZ2V0U2xvZ2FuKClcbiAqICAgZ2V0U2xvZ2FuLS0+PnByaW50QmFubmVyOiBSZXR1cm4gcmFuZG9tIHNsb2dhblxuICogICBwcmludEJhbm5lci0+PnByaW50QmFubmVyOiBDcmVhdGUgYmFubmVyIEFTQ0lJIGFydFxuICogICBwcmludEJhbm5lci0+PnByaW50QmFubmVyOiBTcGxpdCBiYW5uZXIgaW50byBsaW5lc1xuICogICBwcmludEJhbm5lci0+PnByaW50QmFubmVyOiBDYWxjdWxhdGUgbWF4IGxpbmUgbGVuZ3RoXG4gKiAgIHByaW50QmFubmVyLT4+cGFkRW5kOiBDYWxsIHBhZEVuZCB3aXRoIHNsb2dhblxuICogICBwYWRFbmQtLT4+cHJpbnRCYW5uZXI6IFJldHVybiBwYWRkZWQgc2xvZ2FuIGxpbmVcbiAqICAgbG9vcCBGb3IgZWFjaCBiYW5uZXIgbGluZVxuICogICAgIHByaW50QmFubmVyLT4+c3R5bGU6IENhbGwgc3R5bGUobGluZSlcbiAqICAgICBzdHlsZS0tPj5wcmludEJhbm5lcjogUmV0dXJuIHN0eWxlZCBsaW5lXG4gKiAgICAgcHJpbnRCYW5uZXItPj5jb25zb2xlOiBMb2cgc3R5bGVkIGxpbmVcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludEJhbm5lcihsb2dnZXI/OiBWZXJib3NpdHlMb2dnZXIpIHtcbiAgY29uc3QgbWVzc2FnZSA9IGdldFNsb2dhbigpO1xuICBjb25zdCBiYW5uZXI6IHN0cmluZyB8IHN0cmluZ1tdID1cbiAgICBgIyAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRIFxuIyAgICAgICggKCAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICBcbiMgICAgICAgKSApICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIFxuIyAgICBbPT09PT09PV0gICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgXG4jICAgICBcXGAtLS0tLcK0ICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSBcbiMgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgXG4jICAgICAgICAgICAgICAgICDilpHilpLilpPilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgXG4jYC5zcGxpdChcIlxcblwiKTtcbiAgY29uc3QgbWF4TGVuZ3RoID0gYmFubmVyLnJlZHVjZSgobWF4LCBsaW5lKSA9PiBNYXRoLm1heChtYXgsIGxpbmUubGVuZ3RoKSwgMCk7XG4gIGJhbm5lci5wdXNoKGAjICAke21lc3NhZ2UucGFkU3RhcnQobWF4TGVuZ3RoIC0gMyl9YCk7XG4gIGJhbm5lci5mb3JFYWNoKChsaW5lLCBpbmRleCkgPT4ge1xuICAgIChsb2dnZXIgPyBsb2dnZXIuaW5mby5iaW5kKGxvZ2dlcikgOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpKShcbiAgICAgIHN0eWxlKGxpbmUgfHwgXCJcIikucmF3KGNvbG9yc1tpbmRleF0pLnRleHRcbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc2xvZ2FuIGZyb20gdGhlIHByZWRlZmluZWQgbGlzdC5cbiAqIEBzdW1tYXJ5IEZldGNoZXMgYSByYW5kb20gc2xvZ2FuIG9yIGEgc3BlY2lmaWMgb25lIGJ5IGluZGV4IGZyb20gdGhlIHNsb2dhbnMgbGlzdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaV0gLSBPcHRpb25hbCBpbmRleCB0byByZXRyaWV2ZSBhIHNwZWNpZmljIHNsb2dhbi5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHNlbGVjdGVkIHNsb2dhbi5cbiAqIEBmdW5jdGlvbiBnZXRTbG9nYW5cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgZ2V0U2xvZ2FuXG4gKiAgIHBhcnRpY2lwYW50IE1hdGgucmFuZG9tXG4gKiAgIHBhcnRpY2lwYW50IHNsb2dhbnNcbiAqICAgYWx0IGkgaXMgdW5kZWZpbmVkXG4gKiAgICAgZ2V0U2xvZ2FuLT4+TWF0aC5yYW5kb206IEdlbmVyYXRlIHJhbmRvbSBpbmRleFxuICogICAgIE1hdGgucmFuZG9tLS0+PmdldFNsb2dhbjogUmV0dXJuIHJhbmRvbSBpbmRleFxuICogICBlbHNlIGkgaXMgZGVmaW5lZFxuICogICAgIE5vdGUgb3ZlciBnZXRTbG9nYW46IFVzZSBwcm92aWRlZCBpbmRleFxuICogICBlbmRcbiAqICAgZ2V0U2xvZ2FuLT4+c2xvZ2FuczogQWNjZXNzIHNsb2dhbiBhdCBpbmRleFxuICogICBzbG9nYW5zLS0+PmdldFNsb2dhbjogUmV0dXJuIHNsb2dhblxuICogICBhbHQgRXJyb3Igb2NjdXJzXG4gKiAgICAgZ2V0U2xvZ2FuLT4+Z2V0U2xvZ2FuOiBUaHJvdyBlcnJvclxuICogICBlbmRcbiAqICAgZ2V0U2xvZ2FuLS0+PkNhbGxlcjogUmV0dXJuIHNsb2dhblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xvZ2FuKGk/OiBudW1iZXIpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGkgPVxuICAgICAgdHlwZW9mIGkgPT09IFwidW5kZWZpbmVkXCIgPyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzbG9nYW5zLmxlbmd0aCkgOiBpO1xuICAgIHJldHVybiBzbG9nYW5zW2ldLlNsb2dhbjtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXRyaWV2ZSBzbG9nYW5zOiAke2Vycm9yfWApO1xuICB9XG59XG4iLCIvKipcbiAqIEBjbGFzcyBPYmplY3RBY2N1bXVsYXRvclxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgYWNjdW11bGF0ZWQgb2JqZWN0LCBleHRlbmRzIG9iamVjdFxuICogQGRlc2NyaXB0aW9uIEEgY2xhc3MgdGhhdCBhY2N1bXVsYXRlcyBvYmplY3RzIGFuZCBwcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIHRoZWlyIHByb3BlcnRpZXMuXG4gKiBJdCBhbGxvd3MgZm9yIGR5bmFtaWMgYWRkaXRpb24gb2YgcHJvcGVydGllcyB3aGlsZSBtYWludGFpbmluZyB0eXBlIGluZm9ybWF0aW9uLlxuICogQHN1bW1hcnkgQWNjdW11bGF0ZXMgb2JqZWN0cyBhbmQgbWFpbnRhaW5zIHR5cGUgaW5mb3JtYXRpb24gZm9yIGFjY3VtdWxhdGVkIHByb3BlcnRpZXNcbiAqIEBtZW1iZXJPZiB1dGlsc1xuICovXG5leHBvcnQgY2xhc3MgT2JqZWN0QWNjdW11bGF0b3I8VCBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaXplIG9mIHRoZSBhY2N1bXVsYXRlZCBvYmplY3RcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIHByaXZhdGUgX19zaXplITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIl9fc2l6ZVwiLCB7XG4gICAgICB2YWx1ZTogMCxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGRlc2NyaXB0aW9uIEV4cGFuZHMgdGhlIGFjY3VtdWxhdG9yIHdpdGggcHJvcGVydGllcyBmcm9tIGEgbmV3IG9iamVjdFxuICAgKiBAc3VtbWFyeSBBZGRzIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZSBhY2N1bXVsYXRvclxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgZXhwYW5kZWRcbiAgICogQHBhcmFtIHtWfSB2YWx1ZSAtIFRoZSBvYmplY3QgdG8gZXhwYW5kIHdpdGhcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwcm90ZWN0ZWQgZXhwYW5kPFYgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWKTogdm9pZCB7XG4gICAgT2JqZWN0LmVudHJpZXModmFsdWUpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGssIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB2LFxuICAgICAgICBzZXQ6ICh2YWw6IFZba2V5b2YgVl0pID0+IHtcbiAgICAgICAgICB2ID0gdmFsO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWNjdW11bGF0ZXMgYSBuZXcgb2JqZWN0IGludG8gdGhlIGFjY3VtdWxhdG9yXG4gICAqIEBzdW1tYXJ5IEFkZHMgcHJvcGVydGllcyBmcm9tIGEgbmV3IG9iamVjdCB0byB0aGUgYWNjdW11bGF0b3IsIG1haW50YWluaW5nIHR5cGUgaW5mb3JtYXRpb25cbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGFjY3VtdWxhdGVkXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBUaGUgb2JqZWN0IHRvIGFjY3VtdWxhdGVcbiAgICogQHJldHVybnMgQSBuZXcgT2JqZWN0QWNjdW11bGF0b3IgaW5zdGFuY2Ugd2l0aCB1cGRhdGVkIHR5cGUgaW5mb3JtYXRpb25cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBY2N1bXVsYXRvclxuICAgKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JqZWN0XG4gICAqICAgQS0+Pk86IEdldCBlbnRyaWVzXG4gICAqICAgbG9vcCBGb3IgZWFjaCBlbnRyeVxuICAgKiAgICAgQS0+PkE6IERlZmluZSBwcm9wZXJ0eVxuICAgKiAgIGVuZFxuICAgKiAgIEEtPj5BOiBVcGRhdGUgc2l6ZVxuICAgKiAgIEEtPj5BOiBSZXR1cm4gdXBkYXRlZCBhY2N1bXVsYXRvclxuICAgKi9cbiAgYWNjdW11bGF0ZTxWIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVik6IFQgJiBWICYgT2JqZWN0QWNjdW11bGF0b3I8VCAmIFY+IHtcbiAgICB0aGlzLmV4cGFuZCh2YWx1ZSk7XG4gICAgdGhpcy5fX3NpemUgPSB0aGlzLl9fc2l6ZSArIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBUICYgViAmIE9iamVjdEFjY3VtdWxhdG9yPFQgJiBWPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgdmFsdWUgZnJvbSB0aGUgYWNjdW11bGF0b3IgYnkgaXRzIGtleVxuICAgKiBAc3VtbWFyeSBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgYWNjdW11bGF0ZWQgb2JqZWN0IHVzaW5nIGEgdHlwZS1zYWZlIGtleVxuICAgKiBAdGVtcGxhdGUgSyAtIFRoZSBrZXkgdHlwZSwgbXVzdCBiZSBhIGtleSBvZiB0aGlzXG4gICAqIEBwYXJhbSB7S30ga2V5IC0gVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMge2FueSB8IHVuZGVmaW5lZH0gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBnZXQ8SyBleHRlbmRzIGtleW9mIHRoaXM+KGtleTogSyk6IHRoaXNbS10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzW2tleV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIGtleSBleGlzdHMgaW4gdGhlIGFjY3VtdWxhdG9yXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciB0aGUgYWNjdW11bGF0b3IgY29udGFpbnMgYSBzcGVjaWZpYyBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUga2V5IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzW2tleSBhcyBrZXlvZiB0aGlzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGFjY3VtdWxhdG9yXG4gICAqIEBzdW1tYXJ5IERlbGV0ZXMgYSBwcm9wZXJ0eSBmcm9tIHRoZSBhY2N1bXVsYXRlZCBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7fSBUaGUgYWNjdW11bGF0b3IgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHJlbW92ZWRcbiAgICovXG4gIHJlbW92ZShcbiAgICBrZXk6IGtleW9mIHRoaXMgfCBzdHJpbmdcbiAgKTpcbiAgICB8IChPbWl0PHRoaXMsIHR5cGVvZiBrZXk+ICYgT2JqZWN0QWNjdW11bGF0b3I8T21pdDx0aGlzLCB0eXBlb2Yga2V5Pj4pXG4gICAgfCB0aGlzIHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcykpIHJldHVybiB0aGlzO1xuXG4gICAgZGVsZXRlIHRoaXNba2V5IGFzIGtleW9mIHRoaXNdO1xuICAgIHRoaXMuX19zaXplLS07XG4gICAgcmV0dXJuIHRoaXMgYXMgdW5rbm93biBhcyBPbWl0PHRoaXMsIHR5cGVvZiBrZXk+ICZcbiAgICAgIE9iamVjdEFjY3VtdWxhdG9yPE9taXQ8dGhpcywgdHlwZW9mIGtleT4+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIGtleXMgZnJvbSB0aGUgYWNjdW11bGF0b3JcbiAgICogQHN1bW1hcnkgR2V0cyBhbiBhcnJheSBvZiBhbGwgYWNjdW11bGF0ZWQgcHJvcGVydHkga2V5c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFuIGFycmF5IG9mIGtleXMgYXMgc3RyaW5nc1xuICAgKi9cbiAga2V5cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIHZhbHVlcyBmcm9tIHRoZSBhY2N1bXVsYXRvclxuICAgKiBAc3VtbWFyeSBHZXRzIGFuIGFycmF5IG9mIGFsbCBhY2N1bXVsYXRlZCBwcm9wZXJ0eSB2YWx1ZXNcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdmFsdWVzXG4gICAqL1xuICB2YWx1ZXMoKTogVFtrZXlvZiBUXVtdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgYWNjdW11bGF0b3JcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY291bnQgb2YgYWNjdW11bGF0ZWQgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGtleS12YWx1ZSBwYWlyc1xuICAgKi9cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9fc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYXJzIGFsbCBhY2N1bXVsYXRlZCBrZXktdmFsdWUgcGFpcnNcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBhY2N1bXVsYXRvciBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSBpbnN0YW5jZVxuICAgKiBAcmV0dXJucyB7T2JqZWN0QWNjdW11bGF0b3I8bmV2ZXI+fSBBIG5ldyBlbXB0eSBPYmplY3RBY2N1bXVsYXRvciBpbnN0YW5jZVxuICAgKi9cbiAgY2xlYXIoKTogT2JqZWN0QWNjdW11bGF0b3I8bmV2ZXI+IHtcbiAgICByZXR1cm4gbmV3IE9iamVjdEFjY3VtdWxhdG9yKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgY2FsbGJhY2sgZm9yIGVhY2gga2V5LXZhbHVlIHBhaXIgaW4gdGhlIGFjY3VtdWxhdG9yXG4gICAqIEBzdW1tYXJ5IEl0ZXJhdGVzIG92ZXIgYWxsIGFjY3VtdWxhdGVkIHByb3BlcnRpZXMsIGNhbGxpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGFueSwgc3RyaW5nLCBudW1iZXIpOiB2b2lkfSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIGVudHJ5XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZm9yRWFjaChcbiAgICBjYWxsYmFjazogKHZhbHVlOiB0aGlzW2tleW9mIHRoaXNdLCBrZXk6IGtleW9mIHRoaXMsIGk6IG51bWJlcikgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyh0aGlzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0sIGkpID0+XG4gICAgICBjYWxsYmFjayh2YWx1ZSwga2V5IGFzIGtleW9mIHRoaXMsIGkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBhcnJheSB3aXRoIHRoZSByZXN1bHRzIG9mIGNhbGxpbmcgYSBwcm92aWRlZCBmdW5jdGlvbiBvbiBldmVyeSBlbGVtZW50IGluIHRoZSBhY2N1bXVsYXRvclxuICAgKiBAc3VtbWFyeSBNYXBzIGVhY2ggYWNjdW11bGF0ZWQgcHJvcGVydHkgdG8gYSBuZXcgdmFsdWUgdXNpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBtYXBwZWQgdmFsdWVzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oYW55LCBzdHJpbmcsbnVtYmVyKTogUn0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGVsZW1lbnQgb2YgdGhlIG5ldyBhcnJheVxuICAgKiBAcmV0dXJucyB7UltdfSBBIG5ldyBhcnJheSB3aXRoIGVhY2ggZWxlbWVudCBiZWluZyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKi9cbiAgbWFwPFI+KFxuICAgIGNhbGxiYWNrOiAodmFsdWU6IHRoaXNba2V5b2YgdGhpc10sIGtleToga2V5b2YgdGhpcywgaTogbnVtYmVyKSA9PiBSXG4gICk6IFJbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMpLm1hcCgoW2tleSwgdmFsdWVdLCBpKSA9PlxuICAgICAgY2FsbGJhY2sodmFsdWUsIGtleSBhcyBrZXlvZiB0aGlzLCBpKVxuICAgICk7XG4gIH1cbn1cbiIsIi8qKlxuICogQGZ1bmN0aW9uIGlzQnJvd3NlclxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBicm93c2VyIGJ5IGNoZWNraW5nIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgdGhlIGdsb2JhbCBvYmplY3QuXG4gKiBAc3VtbWFyeSBDaGVja3MgaWYgdGhlIGNvZGUgaXMgcnVubmluZyBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaXMgYSBicm93c2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWxUaGlzKSkgIT09XG4gICAgT2JqZWN0LnByb3RvdHlwZVxuICApO1xufVxuIiwiaW1wb3J0IHsgdG9FTlZGb3JtYXQgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBPYmplY3RBY2N1bXVsYXRvciB9IGZyb20gXCIuL2FjY3VtdWxhdG9yXCI7XG5pbXBvcnQgeyBFbnZpcm9ubWVudEZhY3RvcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSBcIi4vd2ViXCI7XG5cbi8qKlxuICogQGNsYXNzIEVudmlyb25tZW50XG4gKiBAZXh0ZW5kcyB7T2JqZWN0QWNjdW11bGF0b3I8VD59XG4gKiBAdGVtcGxhdGUgVFxuICogQGRlc2NyaXB0aW9uIEEgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGVudmlyb25tZW50IHdpdGggYWNjdW11bGF0aW9uIGNhcGFiaWxpdGllcy5cbiAqIEBzdW1tYXJ5IE1hbmFnZXMgZW52aXJvbm1lbnQtcmVsYXRlZCBkYXRhIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBhY2N1bXVsYXRpb24gYW5kIGtleSByZXRyaWV2YWwuXG4gKiBAcGFyYW0ge1R9IFtpbml0aWFsRGF0YV0gLSBUaGUgaW5pdGlhbCBkYXRhIHRvIHBvcHVsYXRlIHRoZSBlbnZpcm9ubWVudCB3aXRoLlxuICovXG5leHBvcnQgY2xhc3MgRW52aXJvbm1lbnQ8VCBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBPYmplY3RBY2N1bXVsYXRvcjxUPiB7XG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGRlc2NyaXB0aW9uIEEgZmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgRW52aXJvbm1lbnQgaW5zdGFuY2VzLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGhvdyBuZXcgaW5zdGFuY2VzIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcyBzaG91bGQgYmUgY3JlYXRlZC5cbiAgICogQHJldHVybiB7RW52aXJvbm1lbnQ8YW55Pn0gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBmYWN0b3J5OiBFbnZpcm9ubWVudEZhY3Rvcnk8YW55LCBhbnk+ID1cbiAgICAoKTogRW52aXJvbm1lbnQ8YW55PiA9PiBuZXcgRW52aXJvbm1lbnQoKTtcblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqIEB0eXBlIHtFbnZpcm9ubWVudDxhbnk+fVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBFbnZpcm9ubWVudDxhbnk+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZyb21FbnYoazogc3RyaW5nKSB7XG4gICAgbGV0IGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgICBlbnYgPSAoZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHsgRU5WOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0pW1xuICAgICAgICBcIkVOVlwiXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnYgPSBnbG9iYWxUaGlzLnByb2Nlc3MuZW52O1xuICAgICAgayA9IHRvRU5WRm9ybWF0KGspO1xuICAgIH1cbiAgICByZXR1cm4gZW52W2tdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGV4cGFuZDxWIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVik6IHZvaWQge1xuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZyb21FbnYgPSB0aGlzLmZyb21FbnYoayk7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBmcm9tRW52ID09PSBcInVuZGVmaW5lZFwiID8gdiA6IGZyb21FbnY7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKHZhbDogVltrZXlvZiBWXSkgPT4ge1xuICAgICAgICAgIHYgPSB2YWw7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGNyZWF0ZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzIGV4aXN0cy5cbiAgICogQHRlbXBsYXRlIEVcbiAgICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZmFjdG9yeSBmdW5jdGlvbiBpZiBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkLlxuICAgKiBAcmV0dXJuIHtFfSBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgaW5zdGFuY2U8RSBleHRlbmRzIEVudmlyb25tZW50PGFueT4+KC4uLmFyZ3M6IHVua25vd25bXSk6IEUge1xuICAgIEVudmlyb25tZW50Ll9pbnN0YW5jZSA9ICFFbnZpcm9ubWVudC5faW5zdGFuY2VcbiAgICAgID8gRW52aXJvbm1lbnQuZmFjdG9yeSguLi5hcmdzKVxuICAgICAgOiBFbnZpcm9ubWVudC5faW5zdGFuY2U7XG4gICAgcmV0dXJuIEVudmlyb25tZW50Ll9pbnN0YW5jZSBhcyBFO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIEFjY3VtdWxhdGVzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgQWRkcyBuZXcgcHJvcGVydGllcyB0byB0aGUgZW52aXJvbm1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICAgKiBAdGVtcGxhdGUgVlxuICAgKiBAcGFyYW0ge1Z9IHZhbHVlIC0gVGhlIG9iamVjdCB0byBhY2N1bXVsYXRlIGludG8gdGhlIGVudmlyb25tZW50LlxuICAgKiBAcmV0dXJuIHtWfSBUaGUgdXBkYXRlZCBlbnZpcm9ubWVudCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBhY2N1bXVsYXRlPFYgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHZhbHVlOiBWXG4gICk6IHR5cGVvZiBFbnZpcm9ubWVudC5faW5zdGFuY2UgJlxuICAgIFYgJlxuICAgIE9iamVjdEFjY3VtdWxhdG9yPHR5cGVvZiBFbnZpcm9ubWVudC5faW5zdGFuY2UgJiBWPiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBFbnZpcm9ubWVudC5pbnN0YW5jZSgpO1xuICAgIHJldHVybiBpbnN0YW5jZS5hY2N1bXVsYXRlKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGtleXMgb2YgdGhlIGVudmlyb25tZW50LCBvcHRpb25hbGx5IGNvbnZlcnRpbmcgdGhlbSB0byBFTlYgZm9ybWF0LlxuICAgKiBAc3VtbWFyeSBHZXRzIGFsbCBrZXlzIGluIHRoZSBlbnZpcm9ubWVudCwgd2l0aCBhbiBvcHRpb24gdG8gZm9ybWF0IHRoZW0gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbdG9FbnY9dHJ1ZV0gLSBXaGV0aGVyIHRvIGNvbnZlcnQgdGhlIGtleXMgdG8gRU5WIGZvcm1hdC5cbiAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIGtleXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICBzdGF0aWMga2V5cyh0b0VudjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50Lmluc3RhbmNlKClcbiAgICAgIC5rZXlzKClcbiAgICAgIC5tYXAoKGspID0+ICh0b0VudiA/IHRvRU5WRm9ybWF0KGspIDogaykpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQYXJzZUFyZ3NSZXN1bHQgfSBmcm9tIFwiLi4vaW5wdXQvdHlwZXNcIjtcbmltcG9ydCB7IExvZ2dpbmdDb25maWcsIFZlcmJvc2l0eUxvZ2dlciB9IGZyb20gXCIuLi9vdXRwdXQvdHlwZXNcIjtcbmltcG9ydCB7IENvbW1hbmRPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiLi4vb3V0cHV0L2xvZ2dpbmdcIjtcbmltcG9ydCB7IERlZmF1bHRMb2dnaW5nQ29uZmlnLCBMb2dMZXZlbCB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFVzZXJJbnB1dCB9IGZyb20gXCIuLi9pbnB1dC9pbnB1dFwiO1xuaW1wb3J0IHsgRGVmYXVsdENvbW1hbmRPcHRpb25zLCBEZWZhdWx0Q29tbWFuZFZhbHVlcyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVwZW5kZW5jaWVzLCBnZXRQYWNrYWdlVmVyc2lvbiB9IGZyb20gXCIuLi91dGlscy9mc1wiO1xuaW1wb3J0IHsgcHJpbnRCYW5uZXIgfSBmcm9tIFwiLi4vb3V0cHV0L2NvbW1vblwiO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vdXRpbHMvZW52aXJvbm1lbnRcIjtcblxuLyoqXG4gKiBAY2xhc3MgQ29tbWFuZFxuICogQGFic3RyYWN0XG4gKiBAdGVtcGxhdGUgSSAtIFRoZSB0eXBlIG9mIGlucHV0IG9wdGlvbnMgZm9yIHRoZSBjb21tYW5kLlxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICogQG1lbWJlck9mIHV0aWxzL2NsaVxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbW1hbmQgaW1wbGVtZW50YXRpb24uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIHN0cnVjdHVyZSBmb3IgY3JlYXRpbmcgY29tbWFuZC1saW5lIGludGVyZmFjZSBjb21tYW5kcyB3aXRoIGlucHV0IGhhbmRsaW5nLCBsb2dnaW5nLCBhbmQgZXhlY3V0aW9uIGZsb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZC5cbiAqIEBwYXJhbSB7Q29tbWFuZE9wdGlvbnM8ST59IFtpbnB1dHNdIC0gVGhlIGlucHV0IG9wdGlvbnMgZm9yIHRoZSBjb21tYW5kLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW3JlcXVpcmVtZW50c10gLSBUaGUgbGlzdCBvZiByZXF1aXJlZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBjb21tYW5kLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbWFuZDxJLCBSPiB7XG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbG9nZ2VyIGZvciB0aGUgQ29tbWFuZCBjbGFzcy5cbiAgICogQHR5cGUge1ZlcmJvc2l0eUxvZ2dlcn1cbiAgICovXG4gIHN0YXRpYyBsb2c6IFZlcmJvc2l0eUxvZ2dlcjtcblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAZGVzY3JpcHRpb24gSW5zdGFuY2UgbG9nZ2VyIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHR5cGUge1ZlcmJvc2l0eUxvZ2dlcn1cbiAgICovXG4gIHByb3RlY3RlZCBsb2c6IFZlcmJvc2l0eUxvZ2dlcjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgaW5wdXRzOiBDb21tYW5kT3B0aW9uczxJPiA9IHt9IGFzIHVua25vd24gYXMgQ29tbWFuZE9wdGlvbnM8ST4sXG4gICAgcHJvdGVjdGVkIHJlcXVpcmVtZW50czogc3RyaW5nW10gPSBbXVxuICApIHtcbiAgICBpZiAoIUNvbW1hbmQubG9nKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tbWFuZCwgXCJsb2dcIiwge1xuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBMb2dnaW5nLmZvcihDb21tYW5kLm5hbWUpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvZyA9IENvbW1hbmQubG9nO1xuICAgIH1cbiAgICB0aGlzLmxvZyA9IENvbW1hbmQubG9nLmZvcih0aGlzLm5hbWUpO1xuICAgIHRoaXMuaW5wdXRzID0gT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdENvbW1hbmRPcHRpb25zLCBpbnB1dHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGFzeW5jXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBhcmUgcHJlc2VudC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBhbmQgY29tcGFyZXMgaXQgYWdhaW5zdCB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoZWNrIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqICAgcGFydGljaXBhbnQgZ2V0RGVwZW5kZW5jaWVzXG4gICAqICAgcGFydGljaXBhbnQgU2V0XG4gICAqICAgQ29tbWFuZC0+PmdldERlcGVuZGVuY2llczogQ2FsbFxuICAgKiAgIGdldERlcGVuZGVuY2llcy0tPj5Db21tYW5kOiBSZXR1cm4ge3Byb2QsIGRldiwgcGVlcn1cbiAgICogICBDb21tYW5kLT4+U2V0OiBDcmVhdGUgU2V0IGZyb20gcHJvZCwgZGV2LCBwZWVyXG4gICAqICAgU2V0LS0+PkNvbW1hbmQ6IFJldHVybiB1bmlxdWUgZGVwZW5kZW5jaWVzXG4gICAqICAgQ29tbWFuZC0+PkNvbW1hbmQ6IENvbXBhcmUgYWdhaW5zdCByZXF1aXJlbWVudHNcbiAgICogICBhbHQgTWlzc2luZyBkZXBlbmRlbmNpZXNcbiAgICogICAgIENvbW1hbmQtPj5Db21tYW5kOiBBZGQgdG8gbWlzc2luZyBsaXN0XG4gICAqICAgZW5kXG4gICAqICAgTm90ZSBvdmVyIENvbW1hbmQ6IElmIG1pc3NpbmcubGVuZ3RoID4gMCwgaGFuZGxlIG1pc3NpbmcgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tSZXF1aXJlbWVudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBwcm9kLCBkZXYsIHBlZXIgfSA9IGF3YWl0IGdldERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IG1pc3NpbmcgPSBbXTtcbiAgICBjb25zdCBmdWxsTGlzdCA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFsuLi5wcm9kLCAuLi5kZXYsIC4uLnBlZXJdKS52YWx1ZXMoKVxuICAgICkubWFwKChkKSA9PiBkLm5hbWUpO1xuICAgIGZvciAoY29uc3QgZGVwIG9mIHRoaXMucmVxdWlyZW1lbnRzKVxuICAgICAgaWYgKCFmdWxsTGlzdC5pbmNsdWRlcyhkZXApKSBtaXNzaW5nLnB1c2goZGVwKTtcblxuICAgIGlmICghbWlzc2luZy5sZW5ndGgpIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gZGVyaXZlZCBjbGFzc2VzIHRvIHByb3ZpZGUgc3BlY2lmaWMgaGVscCBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtQYXJzZUFyZ3NSZXN1bHR9IGFyZ3MgLSBUaGUgcGFyc2VkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgaGVscChhcmdzOiBQYXJzZUFyZ3NSZXN1bHQpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBUaGlzIGlzIGhlbHAuIEknbSBubyB1c2UgYmVjYXVzZSBJIHNob3VsZCBoYXZlIGJlZW4gb3ZlcnJpZGRlbi5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZGVzY3JpcHRpb24gUnVucyB0aGUgY29tbWFuZCB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZGVmaW5lIHRoZSBjb21tYW5kJ3MgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhbnN3ZXJzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSIHwgc3RyaW5nIHwgdm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQncyByZXN1bHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcnVuPFI+KFxuICAgIGFuc3dlcnM6IExvZ2dpbmdDb25maWcgJlxuICAgICAgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzICYgeyBbayBpbiBrZXlvZiBJXTogdW5rbm93biB9XG4gICk6IFByb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAYXN5bmNcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSBjb21tYW5kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBvdmVyYWxsIGV4ZWN1dGlvbiBmbG93IG9mIHRoZSBjb21tYW5kLCBpbmNsdWRpbmcgcGFyc2luZyBhcmd1bWVudHMsXG4gICAqIHNldHRpbmcgdXAgbG9nZ2luZywgY2hlY2tpbmcgZm9yIHZlcnNpb24gb3IgaGVscCByZXF1ZXN0cywgYW5kIHJ1bm5pbmcgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFIgfCBzdHJpbmcgfCB2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCdzIHJlc3VsdC5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ29tbWFuZFxuICAgKiAgIHBhcnRpY2lwYW50IFVzZXJJbnB1dFxuICAgKiAgIHBhcnRpY2lwYW50IExvZ2dpbmdcbiAgICogICBwYXJ0aWNpcGFudCBnZXRQYWNrYWdlVmVyc2lvblxuICAgKiAgIHBhcnRpY2lwYW50IHByaW50QmFubmVyXG4gICAqICAgQ29tbWFuZC0+PlVzZXJJbnB1dDogcGFyc2VBcmdzKGlucHV0cylcbiAgICogICBVc2VySW5wdXQtLT4+Q29tbWFuZDogUmV0dXJuIFBhcnNlQXJnc1Jlc3VsdFxuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBQcm9jZXNzIG9wdGlvbnNcbiAgICogICBDb21tYW5kLT4+TG9nZ2luZzogc2V0Q29uZmlnKG9wdGlvbnMpXG4gICAqICAgYWx0IHZlcnNpb24gcmVxdWVzdGVkXG4gICAqICAgICBDb21tYW5kLT4+Z2V0UGFja2FnZVZlcnNpb246IENhbGxcbiAgICogICAgIGdldFBhY2thZ2VWZXJzaW9uLS0+PkNvbW1hbmQ6IFJldHVybiB2ZXJzaW9uXG4gICAqICAgZWxzZSBoZWxwIHJlcXVlc3RlZFxuICAgKiAgICAgQ29tbWFuZC0+PkNvbW1hbmQ6IGhlbHAoYXJncylcbiAgICogICBlbHNlIGJhbm5lciByZXF1ZXN0ZWRcbiAgICogICAgIENvbW1hbmQtPj5wcmludEJhbm5lcjogQ2FsbFxuICAgKiAgIGVuZFxuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBydW4oYXJncylcbiAgICogICBhbHQgZXJyb3Igb2NjdXJzXG4gICAqICAgICBDb21tYW5kLT4+Q29tbWFuZDogTG9nIGVycm9yXG4gICAqICAgZW5kXG4gICAqICAgQ29tbWFuZC0tPj5Db21tYW5kOiBSZXR1cm4gcmVzdWx0XG4gICAqL1xuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzOiBQYXJzZUFyZ3NSZXN1bHQgPSBVc2VySW5wdXQucGFyc2VBcmdzKHRoaXMuaW5wdXRzKTtcbiAgICBjb25zdCBlbnYgPSBFbnZpcm9ubWVudC5hY2N1bXVsYXRlKERlZmF1bHRMb2dnaW5nQ29uZmlnKVxuICAgICAgLmFjY3VtdWxhdGUoRGVmYXVsdENvbW1hbmRWYWx1ZXMpXG4gICAgICAuYWNjdW11bGF0ZShhcmdzLnZhbHVlcyk7XG4gICAgY29uc3QgeyB0aW1lc3RhbXAsIHZlcmJvc2UsIHZlcnNpb24sIGhlbHAsIGxvZ0xldmVsLCBsb2dTdHlsZSwgYmFubmVyIH0gPVxuICAgICAgZW52O1xuXG4gICAgdGhpcy5sb2cuc2V0Q29uZmlnKHtcbiAgICAgIC4uLmVudixcbiAgICAgIHRpbWVzdGFtcDogISF0aW1lc3RhbXAsXG4gICAgICBsZXZlbDogbG9nTGV2ZWwgYXMgTG9nTGV2ZWwsXG4gICAgICBzdHlsZTogISFsb2dTdHlsZSxcbiAgICAgIHZlcmJvc2U6ICh2ZXJib3NlIGFzIG51bWJlcikgfHwgMCxcbiAgICB9KTtcblxuICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZ2V0UGFja2FnZVZlcnNpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoaGVscCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGVscChhcmdzKTtcbiAgICB9XG5cbiAgICBpZiAoYmFubmVyKVxuICAgICAgcHJpbnRCYW5uZXIoXG4gICAgICAgIHRoaXMubG9nLmZvcihwcmludEJhbm5lciwge1xuICAgICAgICAgIHRpbWVzdGFtcDogZmFsc2UsXG4gICAgICAgICAgc3R5bGU6IGZhbHNlLFxuICAgICAgICAgIGNvbnRleHQ6IGZhbHNlLFxuICAgICAgICAgIGxvZ0xldmVsOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bihlbnYpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBFcnJvciB3aGlsZSBydW5uaW5nIHByb3ZpZGVkIGNsaSBmdW5jdGlvbjogJHtlfWApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIFI7XG4gIH1cbn1cbiIsImltcG9ydCBodHRwcyBmcm9tIFwiaHR0cHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiLi4vb3V0cHV0L2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzaW1wbGUgSFRUUCBjbGllbnQgZm9yIGRvd25sb2FkaW5nIGZpbGVzLlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIGRvd25sb2FkIGZpbGVzIGZyb20gSFRUUFMgVVJMcy5cbiAqIEl0IHVzZXMgTm9kZS5qcyBidWlsdC1pbiBodHRwcyBtb2R1bGUgdG8gbWFrZSByZXF1ZXN0cy5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBDbGllbnQge1xuICBwcm90ZWN0ZWQgc3RhdGljIGxvZyA9IExvZ2dpbmcuZm9yKEh0dHBDbGllbnQpO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBhIGZpbGUgZnJvbSBhIGdpdmVuIFVSTC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2VuZHMgYSBHRVQgcmVxdWVzdCB0byB0aGUgc3BlY2lmaWVkIFVSTCBhbmQgcmV0dXJucyB0aGUgcmVzcG9uc2UgYm9keSBhcyBhIHN0cmluZy5cbiAgICogSXQgaGFuZGxlcyBkaWZmZXJlbnQgc2NlbmFyaW9zIHN1Y2ggYXMgbm9uLTIwMCBzdGF0dXMgY29kZXMgYW5kIG5ldHdvcmsgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCBvZiB0aGUgZmlsZSB0byBkb3dubG9hZC5cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBmaWxlIGNvbnRlbnQgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEh0dHBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBIVFRQU1xuICAgKiAgIHBhcnRpY2lwYW50IFNlcnZlclxuICAgKiAgIENsaWVudC0+Pkh0dHBDbGllbnQ6IGRvd25sb2FkRmlsZSh1cmwpXG4gICAqICAgSHR0cENsaWVudC0+PkhUVFBTOiBnZXQodXJsKVxuICAgKiAgIEhUVFBTLT4+U2VydmVyOiBHRVQgcmVxdWVzdFxuICAgKiAgIFNlcnZlci0tPj5IVFRQUzogUmVzcG9uc2VcbiAgICogICBIVFRQUy0tPj5IdHRwQ2xpZW50OiBSZXNwb25zZSBvYmplY3RcbiAgICogICBhbHQgU3RhdHVzIGNvZGUgaXMgMjAwXG4gICAqICAgICBsb29wIEZvciBlYWNoIGRhdGEgY2h1bmtcbiAgICogICAgICAgSFRUUFMtPj5IdHRwQ2xpZW50OiAnZGF0YScgZXZlbnRcbiAgICogICAgICAgSHR0cENsaWVudC0+Pkh0dHBDbGllbnQ6IEFjY3VtdWxhdGUgZGF0YVxuICAgKiAgICAgZW5kXG4gICAqICAgICBIVFRQUy0+Pkh0dHBDbGllbnQ6ICdlbmQnIGV2ZW50XG4gICAqICAgICBIdHRwQ2xpZW50LS0+PkNsaWVudDogUmVzb2x2ZSB3aXRoIGRhdGFcbiAgICogICBlbHNlIFN0YXR1cyBjb2RlIGlzIG5vdCAyMDBcbiAgICogICAgIEh0dHBDbGllbnQtLT4+Q2xpZW50OiBSZWplY3Qgd2l0aCBlcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRvd25sb2FkRmlsZSh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZnVuY3Rpb24gcmVxdWVzdCh1cmw6IHN0cmluZykge1xuICAgICAgICB1cmwgPSBlbmNvZGVVUkkodXJsKTtcbiAgICAgICAgaHR0cHMuZ2V0KHVybCwgKHJlcykgPT4ge1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMzAxIHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDcpXG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdChyZXMuaGVhZGVycy5sb2NhdGlvbiBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICAgIEh0dHBDbGllbnQubG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoICR7dXJsfSAoc3RhdHVzOiAke3Jlcy5zdGF0dXNDb2RlfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICAgICAgICByZXMub24oXCJkYXRhXCIsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXMub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXF1ZXN0KHVybCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IExvZ2dpbmdDb25maWcgfSBmcm9tIFwiLi4vLi4vb3V0cHV0XCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRcIjtcbmltcG9ydCB7IENvbW1hbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIERlZmF1bHRDb21tYW5kVmFsdWVzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgY29weUZpbGUsXG4gIGRlbGV0ZVBhdGgsXG4gIGdldEFsbEZpbGVzLFxuICBnZXRQYWNrYWdlLFxuICBwYXRjaEZpbGUsXG4gIHJlYWRGaWxlLFxuICByZW5hbWVGaWxlLFxuICBydW5Db21tYW5kLFxuICB3cml0ZUZpbGUsXG59IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHJvbGx1cCwgSW5wdXRPcHRpb25zLCBPdXRwdXRPcHRpb25zLCBSb2xsdXBCdWlsZCB9IGZyb20gXCJyb2xsdXBcIjtcbmltcG9ydCB0eXBlc2NyaXB0IGZyb20gXCJAcm9sbHVwL3BsdWdpbi10eXBlc2NyaXB0XCI7XG5pbXBvcnQgY29tbW9uanMgZnJvbSBcIkByb2xsdXAvcGx1Z2luLWNvbW1vbmpzXCI7XG5pbXBvcnQgeyBub2RlUmVzb2x2ZSB9IGZyb20gXCJAcm9sbHVwL3BsdWdpbi1ub2RlLXJlc29sdmVcIjtcbmltcG9ydCBqc29uIGZyb20gXCJAcm9sbHVwL3BsdWdpbi1qc29uXCI7XG5cbmNvbnN0IFZFUlNJT05fU1RSSU5HID0gXCIjI1ZFUlNJT04jI1wiO1xuXG5lbnVtIE1vZGVzIHtcbiAgQ0pTID0gXCJjb21tb25qc1wiLFxuICBFU00gPSBcImVzMjAyMlwiLFxufVxuXG5jb25zdCBDb21tYW5kcyA9IFtcInVwZGF0ZS1zY3JpcHRzXCIsIFwidGFnLXJlbGVhc2VcIiwgXCJidWlsZC1zY3JpcHRzXCJdO1xuXG5jb25zdCBvcHRpb25zID0ge1xuICBwcm9kOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIGRldjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBkb2NzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIGNvbW1hbmRzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIGJhbm5lcjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxufTtcblxuZXhwb3J0IGNsYXNzIEJ1aWxkU2NyaXB0cyBleHRlbmRzIENvbW1hbmQ8XG4gIENvbW1hbmRPcHRpb25zPHR5cGVvZiBvcHRpb25zPixcbiAgdm9pZFxuPiB7XG4gIHByaXZhdGUgcmVwbGFjZW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgcGtnVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHBrZ05hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgIFwiQnVpbGRTY3JpcHRzXCIsXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIG9wdGlvbnMpIGFzIENvbW1hbmRPcHRpb25zPFxuICAgICAgICB0eXBlb2Ygb3B0aW9uc1xuICAgICAgPlxuICAgICk7XG4gICAgY29uc3QgcGtnID0gZ2V0UGFja2FnZSgpIGFzIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfTtcbiAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IHBrZztcbiAgICB0aGlzLnBrZ05hbWUgPSBuYW1lLmluY2x1ZGVzKFwiQFwiKSA/IG5hbWUuc3BsaXQoXCIvXCIpWzFdIDogbmFtZTtcbiAgICB0aGlzLnBrZ1ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIHRoaXMucmVwbGFjZW1lbnRzW1ZFUlNJT05fU1RSSU5HXSA9IHRoaXMucGtnVmVyc2lvbjtcbiAgfVxuXG4gIHBhdGNoQ2pzSW1wb3J0cyhmaWxlOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWdleHAgPSAvKHJlcXVpcmVcXChbXCInXSkoXFwuLio/KShbXCInXVxcKVs7LF0pL2c7XG4gICAgbGV0IGRhdGEgPSByZWFkRmlsZShmaWxlKTtcbiAgICBkYXRhID0gZGF0YS5yZXBsYWNlKHJlZ2V4cCwgKG1hdGNoLCAuLi5ncm91cHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICBjb25zdCByZW5hbWVkRmlsZSA9IGdyb3Vwc1sxXSArIFwiLmNqc1wiO1xuICAgICAgY29uc3QgZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlKS5yZXBsYWNlKFwibGliXCIsIFwic3JjXCIpO1xuICAgICAgY29uc3QgZmlsZU5hbWUgPSBncm91cHNbMV0gKyBcIi50c1wiO1xuICAgICAgY29uc3Qgc291cmNlRmlsZVBhdGggPSBwYXRoLmpvaW4oZGlybmFtZSwgZmlsZU5hbWUpO1xuXG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHNvdXJjZUZpbGVQYXRoKSkge1xuICAgICAgICByZXN1bHQgPSBncm91cHNbMF0gKyBncm91cHNbMV0gKyBcIi9pbmRleC5janNcIiArIGdyb3Vwc1syXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGdyb3Vwc1swXSArIHJlbmFtZWRGaWxlICsgZ3JvdXBzWzJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICAgIHdyaXRlRmlsZShmaWxlLCBkYXRhKTtcbiAgfVxuXG4gIHBhdGNoRmlsZXMocDogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucGF0Y2hGaWxlcyk7XG4gICAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBnZXRQYWNrYWdlKCkgYXMgYW55O1xuICAgIGxvZy5pbmZvKGBQYXRjaGluZyAke25hbWV9ICR7dmVyc2lvbn0gbW9kdWxlIGluICR7cH0uLi5gKTtcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMocCk7XG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSlcbiAgICAgIGZzLnJlYWRkaXJTeW5jKHAsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIC5maWx0ZXIoKHApID0+IHAuaXNGaWxlKCkpXG4gICAgICAgIC5mb3JFYWNoKChmaWxlKSA9PlxuICAgICAgICAgIHBhdGNoRmlsZShwYXRoLmpvaW4oZmlsZS5wYXJlbnRQYXRoLCBmaWxlLm5hbWUpLCB0aGlzLnJlcGxhY2VtZW50cylcbiAgICAgICAgKTtcbiAgICBsb2cudmVyYm9zZShgTW9kdWxlICR7bmFtZX0gJHt2ZXJzaW9ufSBwYXRjaGVkIGluICR7cH0uLi5gKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGQoaXNEZXY6IGJvb2xlYW4sIG1vZGU6IE1vZGVzLCBidW5kbGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBsb2cuaW5mbyhcbiAgICAgIGBCdWlsZGluZyAke3RoaXMucGtnTmFtZX0gJHt0aGlzLnBrZ1ZlcnNpb259IG1vZHVsZSAoJHttb2RlfSkgaW4gJHtpc0RldiA/IFwiZGV2XCIgOiBcInByb2RcIn0gbW9kZS4uLmBcbiAgICApO1xuXG4gICAgYXdhaXQgcnVuQ29tbWFuZChcbiAgICAgIGBucHggdHNjIC0tbW9kdWxlICR7YnVuZGxlID8gXCJhbWRcIiA6IG1vZGV9JHtpc0RldiA/IFwiIC0taW5saW5lU291cmNlTWFwXCIgOiBcIiAtLXNvdXJjZU1hcCBmYWxzZVwifSAtLW91dERpciAke2J1bmRsZSA/IFwiZGlzdFwiIDogYGxpYiR7bW9kZSA9PT0gTW9kZXMuRVNNID8gXCIvZXNtXCIgOiBcIlwifWB9JHtidW5kbGUgPyBgIC0taXNvbGF0ZWRNb2R1bGVzIGZhbHNlIC0tb3V0RmlsZSAke3RoaXMucGtnTmFtZX1gIDogXCJcIn1gXG4gICAgKS5wcm9taXNlO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYE1vZHVsZSAke3RoaXMucGtnTmFtZX0gJHt0aGlzLnBrZ1ZlcnNpb259ICgke21vZGV9KSBidWlsdCBpbiAke2lzRGV2ID8gXCJkZXZcIiA6IFwicHJvZFwifSBtb2RlLi4uYFxuICAgICk7XG4gICAgaWYgKG1vZGUgPT09IE1vZGVzLkNKUyAmJiAhYnVuZGxlKSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGdldEFsbEZpbGVzKFxuICAgICAgICBcImxpYlwiLFxuICAgICAgICAoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aChcIi5qc1wiKSAmJiAhZmlsZS5pbmNsdWRlcyhcIi9lc20vXCIpXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgbG9nLnZlcmJvc2UoYFBhdGNoaW5nICR7ZmlsZX0ncyBjanMgaW1wb3J0cy4uLmApO1xuICAgICAgICBjb25zdCBmID0gZmlsZS5yZXBsYWNlKFwiLmpzXCIsIFwiLmNqc1wiKTtcbiAgICAgICAgYXdhaXQgcmVuYW1lRmlsZShmaWxlLCBmKTtcbiAgICAgICAgdGhpcy5wYXRjaENqc0ltcG9ydHMoZik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29weUFzc2V0cyhtb2RlOiBNb2Rlcykge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvcHlBc3NldHMpO1xuICAgIGxldCBoYXNBc3NldHMgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgaGFzQXNzZXRzID0gZnMuc3RhdFN5bmMoXCIuL3NyYy9hc3NldHNcIikuaXNEaXJlY3RvcnkoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gbG9nLnZlcmJvc2UoYE5vIGFzc2V0cyBmb3VuZCBpbiAuL3NyYy9hc3NldHMgdG8gY29weWApO1xuICAgIH1cbiAgICBpZiAoaGFzQXNzZXRzKVxuICAgICAgY29weUZpbGUoXG4gICAgICAgIFwiLi9zcmMvYXNzZXRzXCIsXG4gICAgICAgIGAuLyR7bW9kZSA9PT0gTW9kZXMuQ0pTID8gXCJsaWJcIiA6IFwiZGlzdFwifS9hc3NldHNgXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRDb21tYW5kcygpIHtcbiAgICBmb3IgKGNvbnN0IGNtZCBvZiBDb21tYW5kcykge1xuICAgICAgYXdhaXQgdGhpcy5idW5kbGUoTW9kZXMuQ0pTLCB0cnVlLCB0cnVlLCBgc3JjL2Jpbi8ke2NtZH0udHNgLCBjbWQpO1xuICAgICAgbGV0IGRhdGEgPSByZWFkRmlsZShgYmluLyR7Y21kfS5janNgKTtcbiAgICAgIGRhdGEgPSBcIiMhL3Vzci9iaW4vZW52IG5vZGVcXG5cIiArIGRhdGE7XG4gICAgICB3cml0ZUZpbGUoYGJpbi8ke2NtZH0uY2pzYCwgZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnVuZGxlKFxuICAgIG1vZGU6IE1vZGVzLFxuICAgIGlzRGV2OiBib29sZWFuLFxuICAgIGlzTGliOiBib29sZWFuLFxuICAgIGVudHJ5RmlsZTogc3RyaW5nID0gXCJzcmMvaW5kZXgudHNcIixcbiAgICBuYW1lT3ZlcnJpZGU6IHN0cmluZyA9IHRoaXMucGtnTmFtZSxcbiAgICBleHRlcm5hbHM/OiBzdHJpbmdbXSxcbiAgICBpbmNsdWRlOiBzdHJpbmdbXSA9IFtcInByb21wdHNcIiwgXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIl1cbiAgKSB7XG4gICAgY29uc3QgaXNFc20gPSBtb2RlID09PSBNb2Rlcy5FU007XG4gICAgY29uc3QgcGtnTmFtZSA9IHRoaXMucGtnTmFtZTtcblxuICAgIGNvbnN0IGV4dCA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFtcbiAgICAgICAgLi4uW1xuICAgICAgICAgIFwiZnNcIixcbiAgICAgICAgICBcInBhdGhcIixcbiAgICAgICAgICBcInByb2Nlc3NcIixcbiAgICAgICAgICBcInJvbGx1cFwiLFxuICAgICAgICAgIFwiQHJvbGx1cC9wbHVnaW4tdHlwZXNjcmlwdFwiLFxuICAgICAgICAgIFwiQHJvbGx1cC9wbHVnaW4tanNvblwiLFxuICAgICAgICAgIFwiQHJvbGx1cC9wbHVnaW4tY29tbW9uanNcIixcbiAgICAgICAgICBcIkByb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZVwiLFxuICAgICAgICAgIFwiY2hpbGRfcHJvY2Vzc1wiLFxuICAgICAgICAgIFwidXRpbFwiLFxuICAgICAgICAgIFwiaHR0cHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgLi4uKGV4dGVybmFscyB8fCBbXSksXG4gICAgICBdKVxuICAgICk7XG5cbiAgICBjb25zdCBwbHVnaW5zID0gW1xuICAgICAgdHlwZXNjcmlwdCh7XG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgIG1vZHVsZTogXCJlc25leHRcIixcbiAgICAgICAgICBkZWNsYXJhdGlvbjogZmFsc2UsXG4gICAgICAgICAgb3V0RGlyOiBpc0xpYiA/IFwiYmluXCIgOiBcImRpc3RcIixcbiAgICAgICAgfSxcbiAgICAgICAgaW5jbHVkZTogW1wic3JjLyoqLyoudHNcIl0sXG4gICAgICAgIGV4Y2x1ZGU6IFtcIm5vZGVfbW9kdWxlc1wiLCBcIioqLyouc3BlYy50c1wiXSxcbiAgICAgICAgdHNjb25maWc6IFwiLi90c2NvbmZpZy5qc29uXCIsXG4gICAgICB9KSxcbiAgICAgIGpzb24oKSxcbiAgICBdO1xuXG4gICAgaWYgKGlzTGliKSB7XG4gICAgICBwbHVnaW5zLnB1c2goXG4gICAgICAgIGNvbW1vbmpzKHtcbiAgICAgICAgICBpbmNsdWRlOiBbXSxcbiAgICAgICAgICBleGNsdWRlOiBleHRlcm5hbHMsXG4gICAgICAgIH0pLFxuICAgICAgICBub2RlUmVzb2x2ZSh7XG4gICAgICAgICAgcmVzb2x2ZU9ubHk6IGluY2x1ZGUsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0OiBJbnB1dE9wdGlvbnMgPSB7XG4gICAgICBpbnB1dDogZW50cnlGaWxlLFxuICAgICAgcGx1Z2luczogcGx1Z2lucyxcbiAgICAgIGV4dGVybmFsOiBleHQsXG4gICAgfTtcblxuICAgIGNvbnN0IG91dHB1dHM6IE91dHB1dE9wdGlvbnNbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgZmlsZTogYCR7aXNMaWIgPyBcImJpbi9cIiA6IFwiZGlzdC9cIn0ke25hbWVPdmVycmlkZSA/IG5hbWVPdmVycmlkZSA6IGAuYnVuZGxlLiR7IWlzRGV2ID8gXCJtaW5cIiA6IFwiXCJ9YH0ke2lzRXNtID8gXCIuZXNtXCIgOiBcIlwifS5janNgLFxuICAgICAgICBmb3JtYXQ6IGlzTGliID8gXCJjanNcIiA6IGlzRXNtID8gXCJlc21cIiA6IFwidW1kXCIsXG4gICAgICAgIG5hbWU6IHBrZ05hbWUsXG4gICAgICAgIGVzTW9kdWxlOiBpc0VzbSxcbiAgICAgICAgc291cmNlbWFwOiBpc0RldiA/IFwiaW5saW5lXCIgOiBmYWxzZSxcbiAgICAgICAgZ2xvYmFsczoge30sXG4gICAgICAgIGV4cG9ydHM6IFwiYXV0b1wiLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IHJvbGx1cChpbnB1dCk7XG4gICAgICBjb25zb2xlLmxvZyhidW5kbGUud2F0Y2hGaWxlcyk7XG4gICAgICBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU91dHB1dHMoYnVuZGxlOiBSb2xsdXBCdWlsZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG91dHB1dE9wdGlvbnMgb2Ygb3V0cHV0cykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgYnVuZGxlLndyaXRlKG91dHB1dE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGdlbmVyYXRlT3V0cHV0cyhidW5kbGUpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGJ1bmRsZTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRCeUVudihpc0RldjogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICBkZWxldGVQYXRoKFwibGliXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGRlbGV0ZVBhdGgoXCJkaXN0XCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgZnMubWtkaXJTeW5jKFwibGliXCIpO1xuICAgIGZzLm1rZGlyU3luYyhcImRpc3RcIik7XG4gICAgYXdhaXQgdGhpcy5idWlsZChpc0RldiwgTW9kZXMuQ0pTKTtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkKGlzRGV2LCBNb2Rlcy5FU00pO1xuICAgIGF3YWl0IHRoaXMuYnVuZGxlKE1vZGVzLkNKUywgdHJ1ZSwgZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMuYnVuZGxlKE1vZGVzLkVTTSwgdHJ1ZSwgZmFsc2UpO1xuICAgIHRoaXMucGF0Y2hGaWxlcyhcImxpYlwiKTtcbiAgICB0aGlzLnBhdGNoRmlsZXMoXCJkaXN0XCIpO1xuICAgIHRoaXMuY29weUFzc2V0cyhNb2Rlcy5DSlMpO1xuICAgIHRoaXMuY29weUFzc2V0cyhNb2Rlcy5FU00pO1xuICB9XG5cbiAgYXN5bmMgYnVpbGREZXYoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRCeUVudih0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkUHJvZCgpIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZEJ5RW52KGZhbHNlKTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkRG9jcygpIHtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCBiZXR0ZXItZG9jcyB0YWZmeWRiYCkucHJvbWlzZTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucHggbWFya2Rvd24taW5jbHVkZSAuL3dvcmtkb2NzL3JlYWRtZS1tZC5qc29uYCkucHJvbWlzZTtcbiAgICBhd2FpdCBydW5Db21tYW5kKFxuICAgICAgYG5weCBqc2RvYyAtYyAuL3dvcmtkb2NzL2pzZG9jcy5qc29uIC10IC4vbm9kZV9tb2R1bGVzL2JldHRlci1kb2NzYFxuICAgICkucHJvbWlzZTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gcmVtb3ZlIGJldHRlci1kb2NzIHRhZmZ5ZGJgKS5wcm9taXNlO1xuICAgIFtcbiAgICAgIHtcbiAgICAgICAgc3JjOiBcIndvcmtkb2NzL2Fzc2V0c1wiLFxuICAgICAgICBkZXN0OiBcIi4vZG9jcy93b3JrZG9jcy9hc3NldHNcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNyYzogXCJ3b3JrZG9jcy9yZXBvcnRzL2NvdmVyYWdlXCIsXG4gICAgICAgIGRlc3Q6IFwiLi9kb2NzL3dvcmtkb2NzL3JlcG9ydHMvY292ZXJhZ2VcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNyYzogXCJ3b3JrZG9jcy9yZXBvcnRzL2h0bWxcIixcbiAgICAgICAgZGVzdDogXCIuL2RvY3Mvd29ya2RvY3MvcmVwb3J0cy9odG1sXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzcmM6IFwid29ya2RvY3MvcmVzb3VyY2VzXCIsXG4gICAgICAgIGRlc3Q6IFwiLi9kb2NzL3dvcmtkb2NzL3Jlc291cmNlc1wiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3JjOiBcIkxJQ0VOU0UubWRcIixcbiAgICAgICAgZGVzdDogXCIuL2RvY3MvTElDRU5TRS5tZFwiLFxuICAgICAgfSxcbiAgICBdLmZvckVhY2goKGYpID0+IHtcbiAgICAgIGNvbnN0IHsgc3JjLCBkZXN0IH0gPSBmO1xuICAgICAgY29weUZpbGUoc3JjLCBkZXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBydW48Uj4oXG4gICAgYW5zd2VyczogTG9nZ2luZ0NvbmZpZyAmXG4gICAgICB0eXBlb2YgRGVmYXVsdENvbW1hbmRWYWx1ZXMgJiB7IFtrIGluIGtleW9mIHR5cGVvZiBvcHRpb25zXTogdW5rbm93biB9XG4gICk6IFByb21pc2U8c3RyaW5nIHwgdm9pZCB8IFI+IHtcbiAgICBjb25zdCB7IGRldiwgcHJvZCwgZG9jcywgY29tbWFuZHMgfSA9IGFuc3dlcnM7XG5cbiAgICBpZiAoY29tbWFuZHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGRDb21tYW5kcygpO1xuICAgIH1cblxuICAgIGlmIChkZXYpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJ1aWxkRGV2KCk7XG4gICAgfVxuICAgIGlmIChwcm9kKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5idWlsZFByb2QoKTtcbiAgICB9XG4gICAgaWYgKGRvY3MpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJ1aWxkRG9jcygpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgcnVuQ29tbWFuZCB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgTm9DSUZMYWcsIFNlbVZlcnNpb24sIFNlbVZlcnNpb25SZWdleCB9IGZyb20gXCIuLi8uLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi9pbnB1dC9pbnB1dFwiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kXCI7XG5pbXBvcnQgeyBMb2dnaW5nQ29uZmlnIH0gZnJvbSBcIi4uLy4uL291dHB1dFwiO1xuaW1wb3J0IHsgRGVmYXVsdENvbW1hbmRWYWx1ZXMgfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuY29uc3Qgb3B0aW9ucyA9IHtcbiAgY2k6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBtZXNzYWdlOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBzaG9ydDogXCJtXCIsXG4gIH0sXG4gIHRhZzoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwidFwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbn07XG5cbi8qKlxuICogQGNsYXNzIFJlbGVhc2VTY3JpcHRcbiAqIEBleHRlbmRzIHtDb21tYW5kfVxuICogQGNhdmVnb3J5IHNjcmlwdHNcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbW1hbmQtbGluZSBzY3JpcHQgZm9yIG1hbmFnaW5nIHJlbGVhc2VzIGFuZCB2ZXJzaW9uIHVwZGF0ZXMuXG4gKiBAc3VtbWFyeSBUaGlzIHNjcmlwdCBhdXRvbWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW5kIHB1c2hpbmcgbmV3IHJlbGVhc2VzLiBJdCBoYW5kbGVzIHZlcnNpb24gdXBkYXRlcyxcbiAqIGNvbW1pdCBtZXNzYWdlcywgYW5kIG9wdGlvbmFsbHkgcHVibGlzaGVzIHRvIE5QTS4gVGhlIHNjcmlwdCBzdXBwb3J0cyBzZW1hbnRpYyB2ZXJzaW9uaW5nIGFuZCBjYW4gd29yayBpbiBib3RoIENJIGFuZCBub24tQ0kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2NyaXB0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuY2kgLSBXaGV0aGVyIHRoZSBzY3JpcHQgaXMgcnVubmluZyBpbiBhIENJIGVudmlyb25tZW50IChkZWZhdWx0OiB0cnVlKVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubWVzc2FnZSAtIFRoZSByZWxlYXNlIG1lc3NhZ2UgKHNob3J0OiAnbScpXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50YWcgLSBUaGUgdmVyc2lvbiB0YWcgdG8gdXNlIChzaG9ydDogJ3QnLCBkZWZhdWx0OiB1bmRlZmluZWQpXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWxlYXNlU2NyaXB0IGV4dGVuZHMgQ29tbWFuZDx0eXBlb2Ygb3B0aW9ucywgdm9pZD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlJlbGVhc2VTY3JpcHRcIiwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIHRoZSB2ZXJzaW9uIGZvciB0aGUgcmVsZWFzZS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgdmFsaWRhdGVzIHRoZSBwcm92aWRlZCB0YWcgb3IgcHJvbXB0cyB0aGUgdXNlciBmb3IgYSBuZXcgb25lIGlmIG5vdCBwcm92aWRlZCBvciBpbnZhbGlkLlxuICAgKiBJdCBhbHNvIGRpc3BsYXlzIHRoZSBsYXRlc3QgZ2l0IHRhZ3MgZm9yIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyAtIFRoZSB2ZXJzaW9uIHRhZyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRoZSBwcmVwYXJlZCB2ZXJzaW9uIHRhZ1xuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIFJlbGVhc2VTY3JpcHRcbiAgICogICBwYXJ0aWNpcGFudCBUIGFzIFRlc3RWZXJzaW9uXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VySW5wdXRcbiAgICogICBwYXJ0aWNpcGFudCBHIGFzIEdpdFxuICAgKiAgIFItPj5UOiB0ZXN0VmVyc2lvbih0YWcpXG4gICAqICAgYWx0IHRhZyBpcyB2YWxpZFxuICAgKiAgICAgVC0tPj5SOiByZXR1cm4gdGFnXG4gICAqICAgZWxzZSB0YWcgaXMgaW52YWxpZCBvciBub3QgcHJvdmlkZWRcbiAgICogICAgIFItPj5HOiBMaXN0IGxhdGVzdCBnaXQgdGFnc1xuICAgKiAgICAgUi0+PlU6IFByb21wdCBmb3IgbmV3IHRhZ1xuICAgKiAgICAgVS0tPj5SOiByZXR1cm4gbmV3IHRhZ1xuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZVZlcnNpb24odGFnPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5wcmVwYXJlVmVyc2lvbik7XG4gICAgdGFnID0gdGhpcy50ZXN0VmVyc2lvbigodGFnIGFzIHN0cmluZykgfHwgXCJcIik7XG4gICAgaWYgKCF0YWcpIHtcbiAgICAgIGxvZy52ZXJib3NlKFwiTm8gcmVsZWFzZSBtZXNzYWdlIHByb3ZpZGVkLiBQcm9tcHRpbmcgZm9yIG9uZTpcIik7XG4gICAgICBsb2cuaW5mbyhgTGlzdGluZyBsYXRlc3QgZ2l0IHRhZ3M6YCk7XG4gICAgICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IHRhZyAtLXNvcnQ9LXRhZ2dlcmRhdGUgfCBoZWFkIC1uIDVcIikucHJvbWlzZTtcbiAgICAgIHJldHVybiBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgICAgXCJ0YWdcIixcbiAgICAgICAgXCJFbnRlciB0aGUgbmV3IHRhZyBudW1iZXIgKGFjY2VwdHMgdiouKi4qWy0uLi5dKVwiLFxuICAgICAgICAodmFsKSA9PlxuICAgICAgICAgICEhdmFsLnRvU3RyaW5nKCkubWF0Y2goL152WzAtOV0rXFwuWzAtOV0rLlswLTldKygtWzAtOWEtekEtWi1dKyk/JC8pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyBpZiB0aGUgcHJvdmlkZWQgdmVyc2lvbiBpcyB2YWxpZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB2ZXJzaW9uIGlzIGEgdmFsaWQgc2VtYW50aWMgdmVyc2lvbiBvciBhIHByZWRlZmluZWQgdXBkYXRlIHR5cGUgKFBBVENILCBNSU5PUiwgTUFKT1IpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHRvIHRlc3RcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIHZhbGlkYXRlZCB2ZXJzaW9uIG9yIHVuZGVmaW5lZCBpZiBpbnZhbGlkXG4gICAqL1xuICB0ZXN0VmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnRlc3RWZXJzaW9uKTtcbiAgICB2ZXJzaW9uID0gdmVyc2lvbi50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgIGNhc2UgU2VtVmVyc2lvbi5QQVRDSDpcbiAgICAgIGNhc2UgU2VtVmVyc2lvbi5NSU5PUjpcbiAgICAgIGNhc2UgU2VtVmVyc2lvbi5NQUpPUjpcbiAgICAgICAgbG9nLnZlcmJvc2UoYFVzaW5nIHByb3ZpZGVkIFNlbVZlciB1cGRhdGU6ICR7dmVyc2lvbn1gLCAxKTtcbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgICBgVGVzdGluZyBwcm92aWRlZCB2ZXJzaW9uIGZvciBTZW1WZXIgY29tcGF0aWJpbGl0eTogJHt2ZXJzaW9ufWAsXG4gICAgICAgICAgMVxuICAgICAgICApO1xuICAgICAgICBpZiAoIW5ldyBSZWdFeHAoU2VtVmVyc2lvblJlZ2V4KS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBJbnZhbGlkIHZlcnNpb24gbnVtYmVyOiAke3ZlcnNpb259YCk7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsb2cudmVyYm9zZShgdmVyc2lvbiBhcHByb3ZlZDogJHt2ZXJzaW9ufWAsIDEpO1xuICAgICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIHRoZSByZWxlYXNlIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGVpdGhlciByZXR1cm5zIHRoZSBwcm92aWRlZCBtZXNzYWdlIG9yIHByb21wdHMgdGhlIHVzZXIgZm9yIGEgbmV3IG9uZSBpZiBub3QgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgcmVsZWFzZSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRoZSBwcmVwYXJlZCByZWxlYXNlIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIHByZXBhcmVNZXNzYWdlKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5wcmVwYXJlTWVzc2FnZSk7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICBsb2cudmVyYm9zZShcIk5vIHJlbGVhc2UgbWVzc2FnZSBwcm92aWRlZC4gUHJvbXB0aW5nIGZvciBvbmVcIik7XG4gICAgICByZXR1cm4gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICBcIldoYXQgc2hvdWxkIGJlIHRoZSByZWxlYXNlIG1lc3NhZ2UvdGlja2V0P1wiLFxuICAgICAgICAodmFsKSA9PiAhIXZhbCAmJiB2YWwudG9TdHJpbmcoKS5sZW5ndGggPiA1XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUnVucyB0aGUgcmVsZWFzZSBzY3JpcHQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIG9yY2hlc3RyYXRlcyB0aGUgZW50aXJlIHJlbGVhc2UgcHJvY2VzcywgaW5jbHVkaW5nIHZlcnNpb24gcHJlcGFyYXRpb24sIG1lc3NhZ2UgY3JlYXRpb24sXG4gICAqIGdpdCBvcGVyYXRpb25zLCBhbmQgbnBtIHB1Ymxpc2hpbmcgKGlmIG5vdCBpbiBDSSBlbnZpcm9ubWVudCkuXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhcmdzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIFJlbGVhc2VTY3JpcHRcbiAgICogICBwYXJ0aWNpcGFudCBWIGFzIFByZXBhcmVWZXJzaW9uXG4gICAqICAgcGFydGljaXBhbnQgTSBhcyBQcmVwYXJlTWVzc2FnZVxuICAgKiAgIHBhcnRpY2lwYW50IE4gYXMgTlBNXG4gICAqICAgcGFydGljaXBhbnQgRyBhcyBHaXRcbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJJbnB1dFxuICAgKiAgIFItPj5WOiBwcmVwYXJlVmVyc2lvbih0YWcpXG4gICAqICAgUi0+Pk06IHByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpXG4gICAqICAgUi0+Pk46IFJ1biBwcmVwYXJlLXJlbGVhc2Ugc2NyaXB0XG4gICAqICAgUi0+Pkc6IENoZWNrIGdpdCBzdGF0dXNcbiAgICogICBhbHQgY2hhbmdlcyBleGlzdFxuICAgKiAgICAgUi0+PlU6IEFzayBmb3IgY29uZmlybWF0aW9uXG4gICAqICAgICBVLS0+PlI6IENvbmZpcm1cbiAgICogICAgIFItPj5HOiBBZGQgYW5kIGNvbW1pdCBjaGFuZ2VzXG4gICAqICAgZW5kXG4gICAqICAgUi0+Pk46IFVwZGF0ZSBucG0gdmVyc2lvblxuICAgKiAgIFItPj5HOiBQdXNoIGNoYW5nZXMgYW5kIHRhZ3NcbiAgICogICBhbHQgbm90IENJIGVudmlyb25tZW50XG4gICAqICAgICBSLT4+TjogUHVibGlzaCB0byBucG1cbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHJ1bihcbiAgICBhcmdzOiBMb2dnaW5nQ29uZmlnICZcbiAgICAgIHR5cGVvZiBEZWZhdWx0Q29tbWFuZFZhbHVlcyAmIHsgW2sgaW4ga2V5b2YgdHlwZW9mIG9wdGlvbnNdOiB1bmtub3duIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHsgY2kgfSA9IGFyZ3M7XG4gICAgbGV0IHsgdGFnLCBtZXNzYWdlIH0gPSBhcmdzO1xuICAgIHRhZyA9IGF3YWl0IHRoaXMucHJlcGFyZVZlcnNpb24odGFnIGFzIHN0cmluZyk7XG4gICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSBhcyBzdHJpbmcpO1xuICAgIHJlc3VsdCA9IGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBydW4gcHJlcGFyZS1yZWxlYXNlIC0tICR7dGFnfSAke21lc3NhZ2V9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnByb21pc2U7XG4gICAgcmVzdWx0ID0gYXdhaXQgcnVuQ29tbWFuZChcImdpdCBzdGF0dXMgLS1wb3JjZWxhaW5cIikucHJvbWlzZTtcbiAgICBhd2FpdCByZXN1bHQ7XG4gICAgaWYgKFxuICAgICAgcmVzdWx0LmxvZ3MubGVuZ3RoICYmXG4gICAgICAoYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJnaXQtY2hhbmdlc1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHB1c2ggdGhlIGNoYW5nZXMgdG8gdGhlIHJlbW90ZSByZXBvc2l0b3J5P1wiLFxuICAgICAgICB0cnVlXG4gICAgICApKVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBhZGQgLlwiKS5wcm9taXNlO1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChcbiAgICAgICAgYGdpdCBjb21taXQgLW0gXCIke3RhZ30gLSAke21lc3NhZ2V9IC0gYWZ0ZXIgcmVsZWFzZSBwcmVwYXJhdGlvbiR7Y2kgPyBcIlwiIDogTm9DSUZMYWd9XCJgXG4gICAgICApLnByb21pc2U7XG4gICAgfVxuICAgIGF3YWl0IHJ1bkNvbW1hbmQoXG4gICAgICBgbnBtIHZlcnNpb24gXCIke3RhZ31cIiAtbSBcIiR7bWVzc2FnZX0ke2NpID8gXCJcIiA6IE5vQ0lGTGFnfVwiYFxuICAgICkucHJvbWlzZTtcbiAgICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IHB1c2ggLS1mb2xsb3ctdGFnc1wiKS5wcm9taXNlO1xuICAgIGlmICghY2kpIHtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoXCJOUE1fVE9LRU49JChjYXQgLm5wbXRva2VuKSBucG0gcHVibGlzaCAtLWFjY2VzcyBwdWJsaWNcIilcbiAgICAgICAgLnByb21pc2U7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kXCI7XG5pbXBvcnQgeyBDb21tYW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0UGFja2FnZSxcbiAgSHR0cENsaWVudCxcbiAgcGF0Y2hGaWxlLFxuICBwYXRjaFN0cmluZyxcbiAgcnVuQ29tbWFuZCxcbiAgc2V0UGFja2FnZUF0dHJpYnV0ZSxcbiAgU2V0dXBTY3JpcHRLZXksXG4gIFRva2VucyxcbiAgd3JpdGVGaWxlLFxufSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IExvZ2dpbmdDb25maWcgfSBmcm9tIFwiLi4vLi4vb3V0cHV0XCI7XG5pbXBvcnQgeyBEZWZhdWx0Q29tbWFuZFZhbHVlcyB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgVXNlcklucHV0IH0gZnJvbSBcIi4uLy4uL2lucHV0XCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5cbmNvbnN0IGJhc2VVcmwgPVxuICBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kZWNhZi10cy90cy13b3Jrc3BhY2UvbWFzdGVyXCI7XG5cbmNvbnN0IG9wdGlvbnMgPSB7XG4gIHRlbXBsYXRlczogW1xuICAgIFwiLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9idWdfcmVwb3J0Lm1kXCIsXG4gICAgXCIuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2ZlYXR1cmVfcmVxdWVzdC5tZFwiLFxuICAgIFwiLmdpdGh1Yi9GVU5ESU5HLnltbFwiLFxuICBdLFxuICB3b3JrZmxvd3M6IFtcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL2NvZGVxbC1hbmFseXNpcy55bWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL2plc3QtY292ZXJhZ2UueWFtbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3Mvbm9kZWpzLWJ1aWxkLXByb2QueWFtbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3MvcGFnZXMueWFtbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3MvcHVibGlzaC1vbi1yZWxlYXNlLnlhbWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2Utb24tdGFnLnlhbWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL3NueWstYW5hbHlzaXMueWFtbFwiLFxuICBdLFxuICBpZGU6IFtcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL0FsbCBUZXN0cy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9idWlsZC5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9idWlsZF9wcm9kLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2NvdmVyYWdlLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2RvY3MucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvZHJhd2luZ3MucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvZmxhc2gtZm9yd2FyZC5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9JbnRlZ3JhdGlvbl9UZXN0cy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9CdW5kbGluZ19UZXN0cy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9saW50LWZpeC5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9yZWxlYXNlLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL3Rlc3RfY2lyY3VsYXIucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvdW1sLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL1VuaXQgVGVzdHMucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvdXBkYXRlLXNjcmlwdHMucnVuLnhtbFwiLFxuICBdLFxuICBkb2NzOiBbXG4gICAgXCJ3b3JrZG9jcy90dXRvcmlhbHMvQ29udHJpYnV0aW5nLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy90dXRvcmlhbHMvRG9jdW1lbnRhdGlvbi5tZFwiLFxuICAgIFwid29ya2RvY3MvdHV0b3JpYWxzL0ZvciBEZXZlbG9wZXJzLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy8yLUJhZGdlcy5tZFwiLFxuICAgIFwid29ya2RvY3MvanNkb2NzLmpzb25cIixcbiAgICBcIndvcmtkb2NzL3JlYWRtZS1tZC5qc29uXCIsXG4gIF0sXG4gIHN0eWxlczogW1wiLnByZXR0aWVycmNcIiwgXCJlc2xpbnQuY29uZmlnLmpzXCJdLFxuICBzY3JpcHRzOiBbXG4gICAgXCJiaW4vdXBkYXRlLXNjcmlwdHMuY2pzXCIsXG4gICAgXCJiaW4vdGFnLXJlbGVhc2UuY2pzXCIsXG4gICAgXCJiaW4vYnVpbGQtc2NyaXB0cy5janNcIixcbiAgXSxcbiAgdGVzdHM6IFtcImplc3QuY29uZmlnLnRzXCIsIFwid29ya2RvY3MvcmVwb3J0cy9qZXN0LmNvdmVyYWdlLmNvbmZpZy50c1wiXSxcbiAgdHlwZXNjcmlwdDogW1widHNjb25maWcuanNvblwiXSxcbiAgZG9ja2VyOiBbXCJEb2NrZXJmaWxlXCJdLFxuICBhdXRvbWF0aW9uOiBbXG4gICAgXCJ3b3JrZG9jcy9jb25mbHVlbmNlL0NvbnRpbnVvdXMgSW50ZWdyYXRpb24tRGVwbG95bWVudC9HaXRIdWIubWRcIixcbiAgICBcIndvcmtkb2NzL2NvbmZsdWVuY2UvQ29udGludW91cyBJbnRlZ3JhdGlvbi1EZXBsb3ltZW50L0ppcmEubWRcIixcbiAgICBcIndvcmtkb2NzL2NvbmZsdWVuY2UvQ29udGludW91cyBJbnRlZ3JhdGlvbi1EZXBsb3ltZW50L1RlYW1zLm1kXCIsXG4gIF0sXG59O1xuXG5jb25zdCBhcmd6eiA9IHtcbiAgLy8gaW5pdCBhdHRyaWJ1dGVzXG4gIGJvb3Q6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgb3JnOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBzaG9ydDogXCJvXCIsXG4gIH0sXG4gIG5hbWU6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIHNob3J0OiBcIm5cIixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gIH0sXG4gIGF1dGhvcjoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwiYVwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbiAgLy8gdXBkYXRlIGF0dHJpYnV0ZXNcbiAgYWxsOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGxpY2Vuc2U6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIG1lc3NhZ2U6IFwiUGljayB0aGUgbGljZW5zZVwiLFxuICB9LFxuICBzY3JpcHRzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHN0eWxlczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBkb2NzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGlkZToge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICB3b3JrZmxvd3M6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgdGVtcGxhdGVzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHR5cGVzY3JpcHQ6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgZG9ja2VyOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHBrZzoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBkZXBlbmRlbmNpZXM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgdGVzdHM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgYXV0b21hdGlvbjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxufTtcblxuLyoqXG4gKiBAY2xhc3MgVGVtcGxhdGVTeW5jXG4gKiBAZXh0ZW5kcyB7Q29tbWFuZH1cbiAqIEBjYXRlZ29yeSBzY3JpcHRzXG4gKiBAZGVzY3JpcHRpb24gQSBjb21tYW5kLWxpbmUgdG9vbCBmb3Igc3luY2hyb25pemluZyBwcm9qZWN0IHRlbXBsYXRlcyBhbmQgY29uZmlndXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gZG93bmxvYWQgYW5kIHVwZGF0ZSB2YXJpb3VzIHByb2plY3QgZmlsZXMgYW5kIGNvbmZpZ3VyYXRpb25zIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeS5cbiAqIEl0IHN1cHBvcnRzIHVwZGF0aW5nIGxpY2Vuc2VzLCBJREUgY29uZmlndXJhdGlvbnMsIHNjcmlwdHMsIHN0eWxlcywgZG9jdW1lbnRhdGlvbiwgd29ya2Zsb3dzLCBhbmQgdGVtcGxhdGVzLlxuICpcbiAqIEBwYXJhbSB7Q29tbWFuZE9wdGlvbnN9IGFyZ3MgLSBUaGUgY29tbWFuZCBvcHRpb25zIGZvciBUZW1wbGF0ZVN5bmNcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlU3luYyBleHRlbmRzIENvbW1hbmQ8Q29tbWFuZE9wdGlvbnM8dHlwZW9mIGFyZ3p6Piwgdm9pZD4ge1xuICBwcml2YXRlIHJlcGxhY2VtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiVGVtcGxhdGVTeW5jXCIsIGFyZ3p6KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFZhbHVlc0Zyb21QYWNrYWdlKCkge1xuICAgIGNvbnN0IHAgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGF1dGhvciA9IGdldFBhY2thZ2UocCwgXCJhdXRob3JcIikgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHNjb3BlZE5hbWUgPSBnZXRQYWNrYWdlKHAsIFwibmFtZVwiKTtcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gc2NvcGVkTmFtZSBhcyBzdHJpbmc7XG4gICAgbGV0IG9yZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IG5hbWUuc3BsaXQoXCIvXCIpO1xuICAgICAgbmFtZSA9IHNwbGl0WzFdO1xuICAgICAgb3JnID0gc3BsaXRbMF0ucmVwbGFjZShcIkBcIiwgXCJcIik7XG4gICAgfVxuICAgIFtcIlRpYWdvIFZlbmNlc2xhdVwiLCBcIlRpYWdvVmVuY2VzbGF1XCIsIFwiJHthdXRob3J9XCJdLmZvckVhY2goXG4gICAgICAoZWwpID0+ICh0aGlzLnJlcGxhY2VtZW50c1tlbF0gPSBhdXRob3IpXG4gICAgKTtcbiAgICBbXCJUUy1Xb3Jrc3BhY2VcIiwgXCJ0cy13b3Jrc3BhY2VcIiwgXCIke25hbWV9XCJdLmZvckVhY2goXG4gICAgICAoZWwpID0+ICh0aGlzLnJlcGxhY2VtZW50c1tlbF0gPSBuYW1lKVxuICAgICk7XG4gICAgW1wiZGVjYWYtdHNcIiwgXCIke29yZ31cIl0uZm9yRWFjaChcbiAgICAgIChlbCkgPT4gKHRoaXMucmVwbGFjZW1lbnRzW2VsXSA9IChvcmcgYXMgc3RyaW5nKSB8fCAnXCJcIicpXG4gICAgKTtcbiAgICB0aGlzLnJlcGxhY2VtZW50c1tcIiR7b3JnX29yX293bmVyfVwiXSA9IG9yZyB8fCBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgZmlsZXMgZm9yIGEgc3BlY2lmaWMgb3B0aW9uIGNhdGVnb3J5LlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBkb3dubG9hZHMgYWxsIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIG9wdGlvbiBrZXkgZnJvbSB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHJlcHJlc2VudGluZyB0aGUgb3B0aW9uIGNhdGVnb3J5IHRvIGRvd25sb2FkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHNwZWNpZmllZCBvcHRpb24ga2V5IGlzIG5vdCBmb3VuZFxuICAgKi9cbiAgYXN5bmMgZG93bmxvYWRPcHRpb24oa2V5OiBrZXlvZiB0eXBlb2Ygb3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghKGtleSBpbiBvcHRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcHRpb24gXCIke2tleX1cIiBub3QgZm91bmQgaW4gb3B0aW9uc2ApO1xuICAgIH1cbiAgICBjb25zdCBmaWxlcyA9IG9wdGlvbnNba2V5IGFzIGtleW9mIHR5cGVvZiBvcHRpb25zXTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgRG93bmxvYWRpbmcgJHtmaWxlfWApO1xuXG4gICAgICBsZXQgZGF0YSA9IGF3YWl0IEh0dHBDbGllbnQuZG93bmxvYWRGaWxlKGAke2Jhc2VVcmx9LyR7ZmlsZX1gKTtcbiAgICAgIGRhdGEgPSBwYXRjaFN0cmluZyhkYXRhLCB0aGlzLnJlcGxhY2VtZW50cyk7XG4gICAgICB3cml0ZUZpbGUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGZpbGUpLCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBhbmQgc2V0cyB1cCB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGRvd25sb2FkcyB0aGUgY2hvc2VuIGxpY2Vuc2UgZmlsZSwgc2F2ZXMgaXQgdG8gdGhlIHByb2plY3QsIGFuZCB1cGRhdGVzIHRoZSBwYWNrYWdlLmpzb24gbGljZW5zZSBmaWVsZC5cbiAgICogQHBhcmFtIHtcIk1JVFwiIHwgXCJHUExcIiB8IFwiQXBhY2hlXCIgfCBcIkxHUExcIiB8IFwiQUdQTFwifSBsaWNlbnNlIC0gVGhlIGxpY2Vuc2UgdG8gZG93bmxvYWQgYW5kIHNldCB1cFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGdldExpY2Vuc2UobGljZW5zZTogXCJNSVRcIiB8IFwiR1BMXCIgfCBcIkFwYWNoZVwiIHwgXCJMR1BMXCIgfCBcIkFHUExcIikge1xuICAgIHRoaXMubG9nLmluZm8oYERvd25sb2FkaW5nICR7bGljZW5zZX0gbGljZW5zZWApO1xuICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3dvcmtkb2NzL2xpY2Vuc2VzLyR7bGljZW5zZX0ubWRgO1xuICAgIGxldCBkYXRhID0gYXdhaXQgSHR0cENsaWVudC5kb3dubG9hZEZpbGUodXJsKTtcbiAgICBkYXRhID0gcGF0Y2hTdHJpbmcoZGF0YSwgdGhpcy5yZXBsYWNlbWVudHMpO1xuICAgIHdyaXRlRmlsZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJMSUNFTlNFLm1kXCIpLCBkYXRhKTtcbiAgICBzZXRQYWNrYWdlQXR0cmlidXRlKFwibGljZW5zZVwiLCBsaWNlbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIElERSBjb25maWd1cmF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGdldElkZSgpIHtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLmlkZWFcIiwgXCJydW5Db25maWd1cmF0aW9uc1wiKSwge1xuICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuZG93bmxvYWRPcHRpb24oXCJpZGVcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSBucG0gc2NyaXB0c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGdldFNjcmlwdHMoKSB7XG4gICAgYXdhaXQgdGhpcy5kb3dubG9hZE9wdGlvbihcInNjcmlwdHNcIik7XG4gICAgdGhpcy5sb2cuaW5mbyhcInBsZWFzZSByZS1ydW4gdGhlIGNvbW1hbmRcIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgc3R5bGUgY29uZmlndXJhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRTdHlsZXMgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwic3R5bGVzXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIHRlbXBsYXRlIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldFRlbXBsYXRlcyA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJ0ZW1wbGF0ZXNcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgd29ya2Zsb3cgY29uZmlndXJhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRXb3JrZmxvd3MgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwid29ya2Zsb3dzXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGRvY3VtZW50YXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0RG9jcyA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJkb2NzXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIHR5cGVzY3JpcHQgY29uZmlnIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldFR5cGVzY3JpcHQgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwidHlwZXNjcmlwdFwiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBhdXRvbWF0aW9uIGRvY3VtZW50YXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0QXV0b21hdGlvbiA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJhdXRvbWF0aW9uXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGF1dG9tYXRpb24gZG9jdW1lbnRhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRUZXN0cyA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJ0ZXN0c1wiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBkb2NrZXIgaW1hZ2UgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0RG9ja2VyID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcImRvY2tlclwiKTtcblxuICBhc3luYyBpbml0UGFja2FnZShwa2dOYW1lOiBzdHJpbmcsIGF1dGhvcjogc3RyaW5nLCBsaWNlbnNlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnID0gZ2V0UGFja2FnZSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgZGVsZXRlIHBrZ1tTZXR1cFNjcmlwdEtleV07XG4gICAgICBwa2cubmFtZSA9IHBrZ05hbWU7XG4gICAgICBwa2cudmVyc2lvbiA9IFwiMC4wLjFcIjtcbiAgICAgIHBrZy5hdXRob3IgPSBhdXRob3I7XG4gICAgICBwa2cubGljZW5zZSA9IGxpY2Vuc2U7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFwicGFja2FnZS5qc29uXCIsIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZml4aW5nIHBhY2thZ2UuanNvbjogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVBhY2thZ2VTY3JpcHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsUGtnID0gSlNPTi5wYXJzZShcbiAgICAgICAgYXdhaXQgSHR0cENsaWVudC5kb3dubG9hZEZpbGUoYCR7YmFzZVVybH0vcGFja2FnZS5qc29uYClcbiAgICAgICk7XG4gICAgICBjb25zdCB7IHNjcmlwdHMgfSA9IG9yaWdpbmFsUGtnO1xuXG4gICAgICBjb25zdCBwa2c6IHR5cGVvZiBvcmlnaW5hbFBrZyA9IGdldFBhY2thZ2UoKSBhcyB7XG4gICAgICAgIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmtleXMocGtnLnNjcmlwdHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIHNjcmlwdHMpIHtcbiAgICAgICAgICBjb25zdCByZXBsYWNlZCA9IHBhdGNoU3RyaW5nKHNjcmlwdHNba2V5XSwgdGhpcy5yZXBsYWNlbWVudHMpO1xuICAgICAgICAgIGlmIChyZXBsYWNlZCAhPT0gc2NyaXB0c1trZXldKSB7XG4gICAgICAgICAgICBwa2cuc2NyaXB0c1trZXldID0gcmVwbGFjZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcGtnW1wiZXhwb3J0c1wiXVtcInJlcXVpcmVcIl0gPSBvcmlnaW5hbFBrZ1tcImV4cG9ydHNcIl1bXCJyZXF1aXJlXCJdO1xuICAgICAgcGtnW1wiZXhwb3J0c1wiXVtcImltcG9ydFwiXSA9IG9yaWdpbmFsUGtnW1wiZXhwb3J0c1wiXVtcImltcG9ydFwiXTtcbiAgICAgIHBrZ1tcInR5cGVzXCJdID0gb3JpZ2luYWxQa2dbXCJ0eXBlc1wiXTtcblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcInBhY2thZ2UuanNvblwiLCBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGZpeGluZyBwYWNrYWdlLmpzb24gc2NyaXB0czogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVRva2VuRmlsZXMoKSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlVG9rZW5GaWxlcyk7XG4gICAgY29uc3QgZ2l0VG9rZW4gPSBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgIFwidG9rZW5cIixcbiAgICAgIFwicGxlYXNlIGlucHV0IHlvdXIgZ2l0aHViIHRva2VuXCIsXG4gICAgICAocmVzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuICEhcmVzLm1hdGNoKC9eZ2hwX1swLTlhLXpBLVpdezM2fSQvZyk7XG4gICAgICB9XG4gICAgKTtcbiAgICBPYmplY3QudmFsdWVzKFRva2VucykuZm9yRWFjaCgodG9rZW4pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBzdGF0dXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RhdHVzID0gZnMuZXhpc3RzU3luYyh0b2tlbik7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFRva2VuIGZpbGUgJHt0b2tlbn0gbm90IGZvdW5kLiBDcmVhdGluZyBhIG5ldyBvbmUuLi5gKTtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRva2VuLCB0b2tlbiA9PT0gXCIudG9rZW5cIiA/IGdpdFRva2VuIDogXCJcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RhdHVzKSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0b2tlbiwgdG9rZW4gPT09IFwiLnRva2VuXCIgPyBnaXRUb2tlbiA6IFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgY3JlYXRpbmcgdG9rZW4gZmlsZSAke3Rva2VufTogJHtlfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0T3JnKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3JnID0gYXdhaXQgVXNlcklucHV0LmFza1RleHQoXG4gICAgICBcIk9yZ2FuaXphdGlvblwiLFxuICAgICAgXCJFbnRlciB0aGUgb3JnYW5pemF0aW9uIG5hbWUgKHdpbGwgYmUgdXNlZCB0byBzY29wZSB5b3VyIG5wbSBwcm9qZWN0LiBsZWF2ZSBibGFuayB0byBjcmVhdGUgYSB1bnNjb3BlZCBwcm9qZWN0KTpcIlxuICAgICk7XG4gICAgY29uc3QgY29uZmlybWF0aW9uID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgIFwiQ29uZmlybSBvcmdhbml6YXRpb25cIixcbiAgICAgIFwiSXMgdGhpcyBvcmdhbml6YXRpb24gY29ycmVjdD9cIixcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGlmICghY29uZmlybWF0aW9uKSByZXR1cm4gdGhpcy5nZXRPcmcoKTtcblxuICAgIHJldHVybiBvcmc7XG4gIH1cblxuICBhc3luYyBhdWRpdEZpeCgpIHtcbiAgICByZXR1cm4gYXdhaXQgcnVuQ29tbWFuZChcIm5wbSBhdWRpdCBmaXggLS1mb3JjZVwiKS5wcm9taXNlO1xuICB9XG5cbiAgcGF0Y2hGaWxlcygpIHtcbiAgICBjb25zdCBmaWxlcyA9IFtcbiAgICAgIC4uLmZzXG4gICAgICAgIC5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJzcmNcIiksIHtcbiAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4gcGF0aC5qb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKSxcbiAgICAgIC4uLmZzXG4gICAgICAgIC5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJ3b3JrZG9jc1wiKSwge1xuICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNGaWxlKCkgJiYgZW50cnkubmFtZS5lbmRzV2l0aChcIi5tZFwiKSlcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IHBhdGguam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKSksXG4gICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCIuZ2l0bGFiLWNpLnltbFwiKSxcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIndvcmtkb2NzXCIsIFwianNkb2NzLmpzb25cIiksXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgcGF0Y2hGaWxlKGZpbGUgYXMgc3RyaW5nLCB0aGlzLnJlcGxhY2VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGVwZW5kZW5jaWVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmlnaW5hbFBrZyA9IEpTT04ucGFyc2UoXG4gICAgICAgIGF3YWl0IEh0dHBDbGllbnQuZG93bmxvYWRGaWxlKGAke2Jhc2VVcmx9L3BhY2thZ2UuanNvbmApXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkZXZEZXBlbmRlbmNpZXMgfSA9IG9yaWdpbmFsUGtnO1xuXG4gICAgICBjb25zdCBwa2c6IHR5cGVvZiBvcmlnaW5hbFBrZyA9IGdldFBhY2thZ2UoKSBhcyB7XG4gICAgICAgIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmtleXMocGtnLnNjcmlwdHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIGRldkRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGNvbnN0IHJlcGxhY2VkID0gZGV2RGVwZW5kZW5jaWVzW2tleV07XG4gICAgICAgICAgaWYgKHJlcGxhY2VkICE9PSBkZXZEZXBlbmRlbmNpZXNba2V5XSkge1xuICAgICAgICAgICAgKHBrZyBhcyBhbnkpW1wiZGV2RGVwZW5kZW5jaWVzXCJdID1cbiAgICAgICAgICAgICAgKHBrZyBhcyBhbnkpW1wiZGV2RGVwZW5kZW5jaWVzXCJdIHx8IHt9O1xuICAgICAgICAgICAgKHBrZyBhcyBhbnkpW1wiZGV2RGVwZW5kZW5jaWVzXCJdW2tleV0gPSByZXBsYWNlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFwicGFja2FnZS5qc29uXCIsIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChcIm5wbSBpbnN0YWxsXCIpLnByb21pc2U7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBmaXhpbmcgcGFja2FnZS5qc29uIGRlcGVuZGVuY2llczogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUnVucyB0aGUgdGVtcGxhdGUgc3luY2hyb25pemF0aW9uIHByb2Nlc3MuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIG9yY2hlc3RyYXRlcyB0aGUgZG93bmxvYWRpbmcgb2YgdmFyaW91cyBwcm9qZWN0IGNvbXBvbmVudHMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtQYXJzZUFyZ3NSZXN1bHR9IGFyZ3MgLSBUaGUgcGFyc2VkIGNvbW1hbmQtbGluZSBhcmd1bWVudHNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFQgYXMgVGVtcGxhdGVTeW5jXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBnZXRMaWNlbnNlXG4gICAqICAgcGFydGljaXBhbnQgSSBhcyBnZXRJZGVcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIGdldFNjcmlwdHNcbiAgICogICBwYXJ0aWNpcGFudCBTdCBhcyBnZXRTdHlsZXNcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIGdldERvY3NcbiAgICogICBwYXJ0aWNpcGFudCBXIGFzIGdldFdvcmtmbG93c1xuICAgKiAgIHBhcnRpY2lwYW50IFRlIGFzIGdldFRlbXBsYXRlc1xuICAgKiAgIFQtPj5UOiBQYXJzZSBhcmd1bWVudHNcbiAgICogICBhbHQgYWxsIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+PlQ6IFNldCBhbGwgY29tcG9uZW50IGZsYWdzIHRvIHRydWVcbiAgICogICBlbmRcbiAgICogICBhbHQgbGljZW5zZSBpcyBzcGVjaWZpZWRcbiAgICogICAgIFQtPj5MOiBnZXRMaWNlbnNlKGxpY2Vuc2UpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IGlkZSBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5JOiBnZXRJZGUoKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBzY3JpcHRzIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+PlM6IGdldFNjcmlwdHMoKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBzdHlsZXMgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+U3Q6IGdldFN0eWxlcygpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IGRvY3MgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+RDogZ2V0RG9jcygpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IHdvcmtmbG93cyBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5XOiBnZXRXb3JrZmxvd3MoKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCB0ZW1wbGF0ZXMgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+VGU6IGdldFRlbXBsYXRlcygpXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyBydW4oXG4gICAgYXJnczogTG9nZ2luZ0NvbmZpZyAmXG4gICAgICB0eXBlb2YgRGVmYXVsdENvbW1hbmRWYWx1ZXMgJiB7IFtrIGluIGtleW9mIHR5cGVvZiBhcmd6el06IHVua25vd24gfVxuICApIHtcbiAgICBsZXQgeyBsaWNlbnNlIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYm9vdCB9ID0gYXJncztcbiAgICBsZXQge1xuICAgICAgYWxsLFxuICAgICAgc2NyaXB0cyxcbiAgICAgIHN0eWxlcyxcbiAgICAgIGRvY3MsXG4gICAgICBpZGUsXG4gICAgICB3b3JrZmxvd3MsXG4gICAgICB0ZW1wbGF0ZXMsXG4gICAgICBkb2NrZXIsXG4gICAgICB0eXBlc2NyaXB0LFxuICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgdGVzdHMsXG4gICAgICBhdXRvbWF0aW9uLFxuICAgICAgcGtnLFxuICAgIH0gPSBhcmdzO1xuICAgIGlmIChcbiAgICAgIHNjcmlwdHMgfHxcbiAgICAgIHN0eWxlcyB8fFxuICAgICAgZG9jcyB8fFxuICAgICAgaWRlIHx8XG4gICAgICB3b3JrZmxvd3MgfHxcbiAgICAgIHRlbXBsYXRlcyB8fFxuICAgICAgZG9ja2VyIHx8XG4gICAgICB0eXBlc2NyaXB0IHx8XG4gICAgICBhdXRvbWF0aW9uIHx8XG4gICAgICBkZXBlbmRlbmNpZXMgfHxcbiAgICAgIHRlc3RzIHx8XG4gICAgICBwa2dcbiAgICApXG4gICAgICBhbGwgPSBmYWxzZTtcblxuICAgIGlmIChib290KSB7XG4gICAgICBjb25zdCBvcmcgPSBhd2FpdCB0aGlzLmdldE9yZygpO1xuICAgICAgY29uc3QgbmFtZSA9IGF3YWl0IFVzZXJJbnB1dC5pbnNpc3RGb3JUZXh0KFxuICAgICAgICBcIlByb2plY3QgbmFtZVwiLFxuICAgICAgICBcIkVudGVyIHRoZSBwcm9qZWN0IG5hbWU6XCIsXG4gICAgICAgIChyZXM6IHN0cmluZykgPT4gcmVzLmxlbmd0aCA+IDFcbiAgICAgICk7XG4gICAgICBjb25zdCBhdXRob3IgPSBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgICAgXCJBdXRob3JcIixcbiAgICAgICAgXCJFbnRlciB0aGUgYXV0aG9yIG5hbWU6XCIsXG4gICAgICAgIChyZXM6IHN0cmluZykgPT4gcmVzLmxlbmd0aCA+IDFcbiAgICAgICk7XG4gICAgICBjb25zdCBwa2dOYW1lID0gb3JnID8gYEAke29yZ30vJHtuYW1lfWAgOiBuYW1lO1xuXG4gICAgICBhd2FpdCB0aGlzLmluaXRQYWNrYWdlKHBrZ05hbWUsIGF1dGhvciwgbGljZW5zZSBhcyBzdHJpbmcpO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVUb2tlbkZpbGVzKCk7XG4gICAgICBhd2FpdCB0aGlzLmF1ZGl0Rml4KCk7XG4gICAgICB0aGlzLnBhdGNoRmlsZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoYWxsKSB7XG4gICAgICBzY3JpcHRzID0gZmFsc2U7XG4gICAgICBzdHlsZXMgPSB0cnVlO1xuICAgICAgZG9jcyA9IHRydWU7XG4gICAgICBpZGUgPSB0cnVlO1xuICAgICAgd29ya2Zsb3dzID0gdHJ1ZTtcbiAgICAgIHRlbXBsYXRlcyA9IHRydWU7XG4gICAgICBkb2NrZXIgPSB0cnVlO1xuICAgICAgdHlwZXNjcmlwdCA9IHRydWU7XG4gICAgICBwa2cgPSB0cnVlO1xuICAgICAgZGVwZW5kZW5jaWVzID0gdHJ1ZTtcbiAgICAgIHRlc3RzID0gdHJ1ZTtcbiAgICAgIGF1dG9tYXRpb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNjcmlwdHMgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBzY3JpcHRzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJzY3JpcHRzXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IHNjcmlwdHM/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICBpZiAoc2NyaXB0cykgYXdhaXQgdGhpcy5nZXRTY3JpcHRzKCk7XG5cbiAgICB0aGlzLmxvYWRWYWx1ZXNGcm9tUGFja2FnZSgpO1xuICAgIGlmICghYWxsICYmIHR5cGVvZiBsaWNlbnNlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBjb25maXJtYXRpb24gPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcImxpY2Vuc2VcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBzZXQgYSBsaWNlbnNlP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgaWYgKGNvbmZpcm1hdGlvbilcbiAgICAgICAgbGljZW5zZSA9IGF3YWl0IFVzZXJJbnB1dC5pbnNpc3RGb3JUZXh0KFxuICAgICAgICAgIFwibGljZW5zZVwiLFxuICAgICAgICAgIFwiRW50ZXIgdGhlIGRlc2lyZWQgTGljZW5zZSAoTUlUfEdQTHxBcGFjaGV8TEdQTHxBR1BMKTpcIixcbiAgICAgICAgICAodmFsKSA9PiAhIXZhbCAmJiAhIXZhbC5tYXRjaCgvXihNSVR8R1BMfEFwYWNoZXxMR1BMfEFHUEwpJC9nKVxuICAgICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpY2Vuc2UgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBhd2FpdCB0aGlzLmdldExpY2Vuc2UoXG4gICAgICAgIGxpY2Vuc2UgYXMgXCJNSVRcIiB8IFwiR1BMXCIgfCBcIkFwYWNoZVwiIHwgXCJMR1BMXCIgfCBcIkFHUExcIlxuICAgICAgKTtcblxuICAgIGlmICh0eXBlb2YgaWRlID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgaWRlID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJpZGVcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgaWRlIGNvbmZpZ3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICBpZiAoaWRlKSBhd2FpdCB0aGlzLmdldElkZSgpO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlc2NyaXB0ID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgdHlwZXNjcmlwdCA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwidHlwZXNjcmlwdFwiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCB0eXBlc2NyaXB0IGNvbmZpZ3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHR5cGVzY3JpcHQpIGF3YWl0IHRoaXMuZ2V0VHlwZXNjcmlwdCgpO1xuXG4gICAgaWYgKHR5cGVvZiBkb2NrZXIgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBkb2NrZXIgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcImRvY2tlclwiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBkb2NrZXIgY29uZmlncz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgIGlmIChkb2NrZXIpIGF3YWl0IHRoaXMuZ2V0RG9ja2VyKCk7XG4gICAgaWYgKHR5cGVvZiBhdXRvbWF0aW9uID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgYXV0b21hdGlvbiA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwiYXV0b21hdGlvblwiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBhdXRvbWF0aW9uIGNvbmZpZ3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKGF1dG9tYXRpb24pIGF3YWl0IHRoaXMuZ2V0QXV0b21hdGlvbigpO1xuXG4gICAgaWYgKHR5cGVvZiBzdHlsZXMgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBzdHlsZXMgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInN0eWxlc1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBzdHlsZXM/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHN0eWxlcykgYXdhaXQgdGhpcy5nZXRTdHlsZXMoKTtcblxuICAgIGlmICh0eXBlb2YgZG9jcyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGRvY3MgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcImRvY3NcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgZG9jcz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAoZG9jcykgYXdhaXQgdGhpcy5nZXREb2NzKCk7XG4gICAgaWYgKHR5cGVvZiB3b3JrZmxvd3MgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB3b3JrZmxvd3MgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcIndvcmtmbG93c1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCB3b3JrZmxvd3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHdvcmtmbG93cykgYXdhaXQgdGhpcy5nZXRXb3JrZmxvd3MoKTtcbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlcyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHRlbXBsYXRlcyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwidGVtcGxhdGVzXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IHRlbXBsYXRlcz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAodGVtcGxhdGVzKSBhd2FpdCB0aGlzLmdldFRlbXBsYXRlcygpO1xuICAgIGlmICh0eXBlb2YgcGtnID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgcGtnID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJwa2dcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byB1cGRhdGUgeW91ciBwYWNrYWdlLmpzb24gc2NyaXB0cz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAocGtnKSBhd2FpdCB0aGlzLnVwZGF0ZVBhY2thZ2VTY3JpcHMoKTtcblxuICAgIGlmICh0eXBlb2YgdGVzdHMgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0ZXN0cyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwicGtnXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gdXBkYXRlIHlvdXIgdGVzdCBjb25maWdzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmICh0ZXN0cykgYXdhaXQgdGhpcy5nZXRUZXN0cygpO1xuXG4gICAgaWYgKHR5cGVvZiBkZXBlbmRlbmNpZXMgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBkZXBlbmRlbmNpZXMgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInBrZ1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHVwZGF0ZSBkZXYgZGVwZW5kZW5jaWVzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmIChkZXBlbmRlbmNpZXMpIGF3YWl0IHRoaXMudXBkYXRlRGVwZW5kZW5jaWVzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN0YW5kYXJkT3V0cHV0V3JpdGVyIH0gZnJvbSBcIi4vU3RhbmRhcmRPdXRwdXRXcml0ZXJcIjtcbmltcG9ydCB7IFByb21pc2VFeGVjdXRvciB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHNwZWNpYWxpemVkIG91dHB1dCB3cml0ZXIgdGhhdCB1c2VzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gcHJvY2VzcyBvdXRwdXQuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIGV4dGVuZHMgU3RhbmRhcmRPdXRwdXRXcml0ZXIgdG8gcHJvdmlkZSByZWdleC1iYXNlZCBvdXRwdXQgcHJvY2Vzc2luZy5cbiAqIEl0IGFsbG93cyBmb3IgcGF0dGVybiBtYXRjaGluZyBpbiB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgY2FuIHRyaWdnZXIgc3BlY2lmaWMgYWN0aW9uc1xuICogYmFzZWQgb24gbWF0Y2hlZCBwYXR0ZXJucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSByZXNvbHZlZCB2YWx1ZSwgZGVmYXVsdGluZyB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGxvY2sgLSBBIFByb21pc2VFeGVjdXRvciB0byBjb250cm9sIHRoZSBhc3luY2hyb25vdXMgZmxvdy5cbiAqIEBwYXJhbSByZWdleHAgLSBBIHN0cmluZyBvciBSZWdFeHAgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgb3V0cHV0LlxuICogQHBhcmFtIGZsYWdzIC0gT3B0aW9uYWwgZmxhZ3MgZm9yIHRoZSBSZWdFeHAgY29uc3RydWN0b3IuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdleHBPdXRwdXRXcml0ZXIgZXh0ZW5kcyBTdGFuZGFyZE91dHB1dFdyaXRlcjxzdHJpbmc+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgZm9yIG1hdGNoaW5nIG91dHB1dC5cbiAgICogQHN1bW1hcnkgVGhpcyByZWFkb25seSBwcm9wZXJ0eSBzdG9yZXMgdGhlIGNvbXBpbGVkIFJlZ0V4cCB1c2VkIGZvciBwYXR0ZXJuIG1hdGNoaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlZ2V4cDogUmVnRXhwO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVnZXhwT3V0cHV0V3JpdGVyLlxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIHRoZSBSZWdleHBPdXRwdXRXcml0ZXIgd2l0aCBhIGxvY2sgbWVjaGFuaXNtIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGNtZFxuICAgKiBAcGFyYW0gbG9jayAtIEEgUHJvbWlzZUV4ZWN1dG9yIHRvIGNvbnRyb2wgdGhlIGFzeW5jaHJvbm91cyBmbG93LlxuICAgKiBAcGFyYW0gcmVnZXhwIC0gQSBzdHJpbmcgb3IgUmVnRXhwIHRvIG1hdGNoIGFnYWluc3QgdGhlIG91dHB1dC5cbiAgICogQHBhcmFtIGZsYWdzIC0gT3B0aW9uYWwgZmxhZ3MgZm9yIHRoZSBSZWdFeHAgY29uc3RydWN0b3IsIGRlZmF1bHRzIHRvIFwiZ1wiLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgY21kOiBzdHJpbmcsXG4gICAgbG9jazogUHJvbWlzZUV4ZWN1dG9yPHN0cmluZywgRXJyb3I+LFxuICAgIHJlZ2V4cDogc3RyaW5nIHwgUmVnRXhwLFxuICAgIGZsYWdzID0gXCJnXCJcbiAgKSB7XG4gICAgc3VwZXIoY21kLCBsb2NrKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZWdleHAgPVxuICAgICAgICB0eXBlb2YgcmVnZXhwID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChyZWdleHAsIGZsYWdzKSA6IHJlZ2V4cDtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyB0aGUgaW5wdXQgZGF0YSBhZ2FpbnN0IHRoZSBzdG9yZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIG9uIHRoZSBpbnB1dCBkYXRhIGFuZCByZXR1cm5zIHRoZSBtYXRjaCByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHN0cmluZyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZXhlY3V0aW9uLCBvciB1bmRlZmluZWQgaWYgYW4gZXJyb3Igb2NjdXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB0ZXN0KGRhdGE6IHN0cmluZykge1xuICAgIHRoaXMucmVnZXhwLmxhc3RJbmRleCA9IDA7XG4gICAgbGV0IG1hdGNoO1xuICAgIHRyeSB7XG4gICAgICBtYXRjaCA9IHRoaXMucmVnZXhwLmV4ZWMoZGF0YSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZGVidWcoYEZhaWxlZCB0byBwYXJzZSBjaHVuazogJHtkYXRhfVxcbkVycm9yOiAke2V9IGApO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlc3RzIHRoZSBkYXRhIGFuZCByZXNvbHZlcyB0aGUgcHJvbWlzZSBpZiBhIG1hdGNoIGlzIGZvdW5kLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgdGVzdCBtZXRob2QgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggdGhlIGZpcnN0IG1hdGNoIGdyb3VwIGlmIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHN0cmluZyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICovXG4gIHByb3RlY3RlZCB0ZXN0QW5kUmVzb2x2ZShkYXRhOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMudGVzdChkYXRhKTtcbiAgICBpZiAobWF0Y2gpIHRoaXMucmVzb2x2ZShtYXRjaFswXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlc3RzIHRoZSBkYXRhIGFuZCByZWplY3RzIHRoZSBwcm9taXNlIGlmIGEgbWF0Y2ggaXMgZm91bmQuXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIHRoZSB0ZXN0IG1ldGhvZCBhbmQgcmVqZWN0cyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBmaXJzdCBtYXRjaCBncm91cCBpZiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgdGVzdEFuZFJlamVjdChkYXRhOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMudGVzdChkYXRhKTtcbiAgICBpZiAobWF0Y2gpIHRoaXMucmVqZWN0KG1hdGNoWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGluY29taW5nIGRhdGEgY2h1bmtzLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IGNsYXNzIGRhdGEgbWV0aG9kIGFuZCB0aGVuIHRlc3RzIHRoZSBkYXRhIGZvciBhIG1hdGNoIHRvIHBvdGVudGlhbGx5IHJlc29sdmUgdGhlIHByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBkYXRhIGNodW5rIHRvIHByb2Nlc3MuXG4gICAqL1xuICBkYXRhKGNodW5rOiBhbnkpIHtcbiAgICBzdXBlci5kYXRhKGNodW5rKTtcbiAgICB0aGlzLnRlc3RBbmRSZXNvbHZlKFN0cmluZyhjaHVuaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgZXJyb3IgY2h1bmtzLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IGNsYXNzIGVycm9yIG1ldGhvZCBhbmQgdGhlbiB0ZXN0cyB0aGUgZGF0YSBmb3IgYSBtYXRjaCB0byBwb3RlbnRpYWxseSByZWplY3QgdGhlIHByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBlcnJvciBjaHVuayB0byBwcm9jZXNzLlxuICAgKi9cbiAgZXJyb3IoY2h1bms6IGFueSkge1xuICAgIHN1cGVyLmVycm9yKGNodW5rKTtcbiAgICB0aGlzLnRlc3RBbmRSZWplY3QoU3RyaW5nKGNodW5rKSk7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2NsaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL291dHB1dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dyaXRlcnNcIjtcblxuLyoqXG4gKiBAbW9kdWxlIEBkZWNhZi10cy91dGlsc1xuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIG1vZHVsZSBzZXJ2ZXMgYSBsaWdodCB2ZXJzaW9uIG9mIERlY2FmIENMSSB0b29sLCBwcm92aWRpbmcgYSBjb21wcmVoZW5zaXZlIHNldCBvZiB1dGlsaXRpZXNcbiAqIGFuZCBmdW5jdGlvbmFsaXRpZXMgZm9yIGNvbW1hbmQtbGluZSBpbnRlcmZhY2Ugb3BlcmF0aW9ucy4gSXQgZW5jb21wYXNzZXMgc2V2ZXJhbCBrZXkgY29tcG9uZW50czpcbiAqXG4gKiAxLiBJbnB1dCBIYW5kbGluZzogTWFuYWdlcyB1c2VyIGlucHV0IGFuZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHByb2Nlc3NpbmcuXG4gKiAyLiBVdGlsaXR5IEZ1bmN0aW9uczogT2ZmZXJzIGEgY29sbGVjdGlvbiBvZiBoZWxwZXIgZnVuY3Rpb25zIGFuZCBjb25zdGFudHMgZm9yIHZhcmlvdXMgb3BlcmF0aW9ucy5cbiAqIDMuIFR5cGUgRGVmaW5pdGlvbnM6IERlZmluZXMgY3VzdG9tIHR5cGVzIGFuZCBpbnRlcmZhY2VzIHVzZWQgdGhyb3VnaG91dCB0aGUgbW9kdWxlLlxuICogNC4gT3V0cHV0IE1hbmFnZW1lbnQ6IFByb3ZpZGVzIGRpZmZlcmVudCBvdXRwdXQgd3JpdGluZyBzdHJhdGVnaWVzIGZvciBmbGV4aWJsZSBjb25zb2xlIG91dHB1dCBoYW5kbGluZy5cbiAqXG4gKiBUaGUgbW9kdWxlIGlzIGRlc2lnbmVkIHRvIGZhY2lsaXRhdGUgdGhlIGNyZWF0aW9uIG9mIHJvYnVzdCBDTEkgYXBwbGljYXRpb25zIGJ5IG9mZmVyaW5nOlxuICogLSBTdGFuZGFyZGl6ZWQgaW5wdXQgcGFyc2luZyBhbmQgdmFsaWRhdGlvblxuICogLSBDb25zaXN0ZW50IG91dHB1dCBmb3JtYXR0aW5nIGFuZCBoYW5kbGluZ1xuICogLSBSZXVzYWJsZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgY29tbW9uIENMSSB0YXNrc1xuICogLSBFeHRlbnNpYmxlIGFyY2hpdGVjdHVyZSBmb3IgYWRkaW5nIG5ldyBjb21tYW5kcyBhbmQgZmVhdHVyZXNcbiAqXG4gKiBJdCBzdXBwb3J0cyB2YXJpb3VzIG91dHB1dCBtb2RlcywgaW5jbHVkaW5nIHN0YW5kYXJkIGNvbnNvbGUgb3V0cHV0IGFuZCByZWd1bGFyIGV4cHJlc3Npb24tYmFzZWQgb3V0cHV0LFxuICogYWxsb3dpbmcgZm9yIHZlcnNhdGlsZSBkYXRhIHByZXNlbnRhdGlvbiBhbmQgcHJvY2Vzc2luZy4gVGhlIG1vZHVsYXIgc3RydWN0dXJlIGVuYWJsZXMgZWFzeSBtYWludGVuYW5jZVxuICogYW5kIGV4dGVuc2lvbiBvZiB0aGUgQ0xJIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZGV2ZWxvcGVycyBidWlsZGluZyBjb21wbGV4IGNvbW1hbmQtbGluZSB0b29scyB0aGF0IHJlcXVpcmVcbiAqIHN0cnVjdHVyZWQgaW5wdXQgaGFuZGxpbmcsIGZsZXhpYmxlIG91dHB1dCBmb3JtYXR0aW5nLCBhbmQgYSByaWNoIHNldCBvZiB1dGlsaXR5IGZ1bmN0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFRoaXMgY29uc3RhbnQgc3RvcmVzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgQGFzZGFzZGFzZC91dGlscyBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcyxcbiAqIHdpdGggdGhlIHBsYWNlaG9sZGVyIFwiIyNWRVJTSU9OIyNcIiBiZWluZyBzdWJzdGl0dXRlZCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24uXG4gKlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6QGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIlNlbVZlcnNpb24iLCJUb2tlbnMiLCJMb2dMZXZlbCIsInN0eWxlIiwicGFyc2VBcmdzIiwic3Bhd24iLCJvcHRpb25zIiwibm9kZVJlc29sdmUiLCJyb2xsdXAiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUVBOzs7OztJQUtHO0FBQ0ksVUFBTSxRQUFRLEdBQUc7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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQzlhQTs7O0lBR0c7SUFDSCxNQUFNLE1BQU0sR0FBRztJQUNiLElBQUEsZ0JBQWdCO0lBQ2hCLElBQUEsZ0JBQWdCO0lBQ2hCLElBQUEsZ0JBQWdCO0lBQ2hCLElBQUEsZ0JBQWdCO0lBQ2hCLElBQUEsZ0JBQWdCO0lBQ2hCLElBQUEsZ0JBQWdCO0lBQ2hCLElBQUEsZ0JBQWdCO0lBQ2hCLElBQUEsZ0JBQWdCO0lBQ2hCLElBQUEsZ0JBQWdCO0tBQ2pCO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBdUJHO0lBQ0csU0FBVSxXQUFXLENBQUMsTUFBd0IsRUFBQTtJQUNsRCxJQUFBLE1BQU0sT0FBTyxHQUFHLFNBQVMsRUFBRTtJQUMzQixJQUFBLE1BQU0sTUFBTSxHQUNWLENBQUE7Ozs7Ozs7QUFPRixDQUFBLENBQUEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ1osTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RSxJQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQSxHQUFBLEVBQU0sT0FBTyxDQUFDLFFBQVEs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