@aws-cdk/integ-runner 2.202.0 → 2.202.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.
@@ -1 +1 @@
1
- {"version":3,"file":"toolkit-lib.d.ts","sourceRoot":"","sources":["toolkit-lib.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAa,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG7J,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,IAAI;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8B;gBAExC,OAAO,EAAE,uBAAuB;IAyBnD;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;OAEG;IACU,KAAK,CAAC,OAAO,EAAE,YAAY;IAkCxC;;OAEG;IACU,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAU1D;;OAEG;IACU,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAiBrE;;OAEG;IACU,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW;IA0B9D;;OAEG;IACU,OAAO,CAAC,OAAO,EAAE,cAAc;IAU5C;;OAEG;YACW,EAAE;IAoChB;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;;;;;;;;;;;;;;;;;;;;;OAsBG;YACW,cAAc;CA4B7B"}
1
+ {"version":3,"file":"toolkit-lib.d.ts","sourceRoot":"","sources":["toolkit-lib.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAa,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG7J,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,IAAI;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8B;gBAExC,OAAO,EAAE,uBAAuB;IAyBnD;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;OAEG;IACU,KAAK,CAAC,OAAO,EAAE,YAAY;IAkCxC;;OAEG;IACU,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAU1D;;OAEG;IACU,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAiBrE;;OAEG;IACU,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW;IA0B9D;;OAEG;IACU,OAAO,CAAC,OAAO,EAAE,cAAc;IAU5C;;OAEG;YACW,EAAE;IA8ChB;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;;;;;;;;;;;;;;;;;;;;;OAsBG;YACW,cAAc;CA4B7B"}
@@ -286,6 +286,15 @@ class ToolkitLibRunnerEngine {
286
286
  if (options.output) {
287
287
  outdir = path.join(this.options.workingDirectory, options.output);
288
288
  }
289
+ // If the target directory already exists, we assume it's a pre-synthesized assembly and use it directly.
290
+ // This helps a lot with speed if we run `cdk list` on previously synth'ed directory, which happens
291
+ // a bunch in the integ-runner.
292
+ //
293
+ // Ideally we would represent a previously produced assembly with an object that we pass around, but
294
+ // that's a bigger API change.
295
+ if (outdir && fs.pathExistsSync(outdir) && fs.statSync(outdir).isDirectory()) {
296
+ return this.toolkit.fromAssemblyDirectory(outdir);
297
+ }
289
298
  return this.toolkit.fromCdkApp(options.app, {
290
299
  workingDirectory: this.options.workingDirectory,
291
300
  outdir,
@@ -404,4 +413,4 @@ class NoopIoHost {
404
413
  return msg.defaultResponse;
405
414
  }
406
415
  }
407
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC1saWIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0b29sa2l0LWxpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWtDO0FBQ2xDLG9FQUE2RDtBQUc3RCxzREFBbUo7QUFDbkosa0RBQTBCO0FBQzFCLDZDQUErQjtBQUUvQiwrQ0FBbUQ7QUF1RW5EOztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDaEIsT0FBTyxDQUFVO0lBQ2pCLE9BQU8sQ0FBMEI7SUFDakMsVUFBVSxDQUFVO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBRTNELFlBQW1CLE9BQWdDO1FBQ2pELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFFOUMsd0VBQXdFO1FBQ3hFLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUV0QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRXpDLG9FQUFvRTtRQUNwRSx1REFBdUQ7UUFDdkQsdUNBQXVDO1FBQ3ZDLEVBQUU7UUFDRixjQUFjO1FBQ2QsK0RBQStEO1FBQy9ELFVBQVU7UUFDVixtQkFBbUI7UUFFbkIsd0ZBQXdGO1FBQ3hGLG1CQUFtQjtRQUNuQixxQkFBcUI7UUFDckIsa0JBQWtCO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0JBQWtCLENBQUMsYUFBNkI7UUFDdEQsTUFBTSxPQUFPLEdBQUcsYUFBYSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9B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QUssRUFBRSxDQUFDO1lBQ2xCLEtBQUssT0FBTztnQkFBRSxLQUFLLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQztnQkFBQyxNQUFNO1lBQ3ZDLEtBQUssTUFBTTtnQkFBRSxLQUFLLEdBQUcsZUFBSyxDQUFDLE1BQU0sQ0FBQztnQkFBQyxNQUFNO1lBQ3pDLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDbEIsR0FBRyxHQUFHO1lBQ04sT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVO0lBQ1AsS0FBSyxDQUFDLE1BQU07SUFDbkIsQ0FBQztJQUNNLEtBQUssQ0FBQyxlQUFlLENBQUksR0FBMEI7UUFDeEQsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDO0lBQzdCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IFVOS05PV05fUkVHSU9OIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgRGVmYXVsdENka09wdGlvbnMgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEvbGliL2ludGVnLXRlc3RzJztcbmltcG9ydCB0eXBlIHsgSUNsb3VkQXNzZW1ibHlTb3VyY2UsIElJb0hvc3QsIElvTWVzc2FnZSwgSW9SZXF1ZXN0LCBJUmVhZGFibGVDbG91ZEFzc2VtYmx5LCBOb25JbnRlcmFjdGl2ZUlvSG9zdFByb3BzLCBTdGFja1NlbGVjdG9yIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHsgQmFzZUNyZWRlbnRpYWxzLCBFeHBhbmRTdGFja1NlbGVjdGlvbiwgTWVtb3J5Q29udGV4dCwgTm9uSW50ZXJhY3RpdmVJb0hvc3QsIFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3ksIFRvb2xraXQgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHR5cGUgeyBDZGtEZXBsb3lSZXN1bHQsIEN4T3B0aW9ucywgRGVwbG95T3B0aW9ucywgRGVzdHJveU9wdGlvbnMsIElDZGssIExpc3RPcHRpb25zLCBTeW50aE9wdGlvbnMsIFdhdGNoRXZlbnRzLCBXYXRjaE9wdGlvbnMgfSBmcm9tICcuL2Nkay1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUHJveHlBZ2VudFByb3ZpZGVyIH0gZnJvbSAnLi9wcm94eS1hZ2VudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbGtpdExpYkVuZ2luZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGRpcmVjdG9yeSB0byBydW4gdGhlIGNkayBjb21tYW5kcyBmcm9tXG4gICAqL1xuICByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldFxuICAgKiBpbiB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IHRoYXQgd2lsbCBiZSBydW5uaW5nXG4gICAqIHRoZSBjZGsgYXBwXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBlbnYgdmFyc1xuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgdGhlIENESyBDTElcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNob3dPdXRwdXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHRoZSBDREsgYXBwIHNob3VsZCBzeW50aGVzaXplIGl0c2VsZiBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIHByb2ZpbGUgdG8gdXNlIHdoZW4gYXV0aGVudGljYXRpbmdcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwcm9maWxlIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHQgcHJvZmlsZSBpcyB1c2VkXG4gICAqL1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGluZGljYXRlZCBwcm94eVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb3h5LCBQcm94eUFnZW50IGF1dG8tZGV0ZWN0cyBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcHJveHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gQ0EgY2VydGlmaWNhdGUgdG8gdXNlIHdoZW4gdmFsaWRhdGluZyBIVFRQUyByZXF1ZXN0c1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgQ0EgYnVuZGxlXG4gICAqL1xuICByZWFkb25seSBjYUJ1bmRsZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGVyLWFjdGlvbiBvcHRpb25zIHRoYXQgY2FuIG92ZXJyaWRlIHRoZSBlbmdpbmUgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgQVdTIHByb2ZpbGUgdG8gdXNlXG4gICAqL1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGluZGljYXRlZCBwcm94eVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gQ0EgY2VydGlmaWNhdGUgdG8gdXNlIHdoZW4gdmFsaWRhdGluZyBIVFRQUyByZXF1ZXN0c1xuICAgKi9cbiAgcmVhZG9ubHkgY2FCdW5kbGVQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcnVubmVyIGVuZ2luZSBwb3dlcmVkIGRpcmVjdGx5IGJ5IHRoZSB0b29sa2l0LWxpYlxuICovXG5leHBvcnQgY2xhc3MgVG9vbGtpdExpYlJ1bm5lckVuZ2luZSBpbXBsZW1lbnRzIElDZGsge1xuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xraXQ6IFRvb2xraXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogVG9vbGtpdExpYkVuZ2luZU9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd091dHB1dDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBpb0hvc3Q6IEludGVnUnVubmVySW9Ib3N0O1xuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xraXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUb29sa2l0PigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBUb29sa2l0TGliRW5naW5lT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zaG93T3V0cHV0ID0gb3B0aW9ucy5zaG93T3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgLy8gV2UgYWx3YXlzIGNyZWF0ZSB0aGlzIGZvciBvdXJzZWx2ZXMgdG8gZW1pdCB3YXJuaW5ncywgYnV0IHBvdGVudGlhbGx5XG4gICAgLy8gZG9uJ3QgcGFzcyBpdCB0byB0aGUgdG9vbGtpdC5cbiAgICB0aGlzLmlvSG9zdCA9IG5ldyBJbnRlZ1J1bm5lcklvSG9zdCgpO1xuXG4gICAgdGhpcy50b29sa2l0ID0gdGhpcy5nZXRPckNyZWF0ZVRvb2xraXQoKTtcblxuICAgIC8vIEBUT0RPIC0gdGhlc2Ugb3B0aW9ucyBhcmUgY3VycmVudGx5IGF2YWlsYWJsZSBvbiB0aGUgYWN0aW9uIGNhbGxzXG4gICAgLy8gYnV0IHRvb2xraXQtbGliIG5lZWRzIHRoZW0gYXQgdGhlIGNvbnN0cnVjdG9yIGxldmVsLlxuICAgIC8vIE5lZWQgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGVtLlxuICAgIC8vXG4gICAgLy8gVmFsaWRhdGlvbnNcbiAgICAvLyAgLSBhc3NlbWJseUZhaWx1cmVBdDogb3B0aW9ucy5zdHJpY3QgPz8gb3B0aW9ucy5pZ25vcmVFcnJvcnNcbiAgICAvLyBMb2dnaW5nXG4gICAgLy8gIC0gb3B0aW9ucy5jb2xvclxuXG4gICAgLy8gQFRPRE8gLSBzaW1pbGFyIHRvIHRoZSBhYm92ZSwgYnV0IGluIHRvb2xraXQtbGliIHRoZXNlIG9wdGlvbnMgd291bGQgZ28gb24gdGhlIElvSG9zdFxuICAgIC8vICAtIG9wdGlvbnMudHJhY2VcbiAgICAvLyAgLSBvcHRpb25zLnZlcmJvc2VcbiAgICAvLyAgLSBvcHRpb25zLmpzb25cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY3JlYXRlIGEgVG9vbGtpdCBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGFjdGlvbiBvcHRpb25zLlxuICAgKiBDYWNoZXMgaW5zdGFuY2VzIGJ5IHRoZWlyIHJlc29sdmVkIGNvbmZpZ3VyYXRpb24gdG8gYXZvaWQgY3JlYXRpbmdcbiAgICogZHVwbGljYXRlIFRvb2xraXQgaW5zdGFuY2VzIGZvciBpZGVudGljYWwgc2V0dGluZ3MuXG4gICAqL1xuICBwcml2YXRlIGdldE9yQ3JlYXRlVG9vbGtpdChhY3Rpb25PcHRpb25zPzogQWN0aW9uT3B0aW9ucyk6IFRvb2xraXQge1xuICAgIGNvbnN0IHByb2ZpbGUgPSBhY3Rpb25PcHRpb25zPy5wcm9maWxlID8/IHRoaXMub3B0aW9ucy5wcm9maWxlO1xuICAgIGNvbnN0IHByb3h5ID0gYWN0aW9uT3B0aW9ucz8ucHJveHkgPz8gdGhpcy5vcHRpb25zLnByb3h5O1xuICAgIGNvbnN0IGNhQnVuZGxlUGF0aCA9IGFjdGlvbk9wdGlvbnM/LmNhQnVuZGxlUGF0aCA/PyB0aGlzLm9wdGlvbnMuY2FCdW5kbGVQYXRoO1xuICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtwcm9maWxlLCBwcm94eSwgY2FCdW5kbGVQYXRoXSk7XG5cbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnRvb2xraXRDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHRvb2xraXQgPSBuZXcgVG9vbGtpdCh7XG4gICAgICBpb0hvc3Q6IHRoaXMuc2hvd091dHB1dCA/IHRoaXMuaW9Ib3N0IDogbmV3IE5vb3BJb0hvc3QoKSxcbiAgICAgIHNka0NvbmZpZzoge1xuICAgICAgICBiYXNlQ3JlZGVudGlhbHM6IEJhc2VDcmVkZW50aWFscy5hd3NDbGlDb21wYXRpYmxlKHtcbiAgICAgICAgICBwcm9maWxlLFxuICAgICAgICAgIGRlZmF1bHRSZWdpb246IHRoaXMub3B0aW9ucy5yZWdpb24sXG4gICAgICAgIH0pLFxuICAgICAgICBodHRwT3B0aW9uczoge1xuICAgICAgICAgIGFnZW50OiBQcm94eUFnZW50UHJvdmlkZXIuZ2V0T3JDcmVhdGUoeyBwcm94eUFkZHJlc3M6IHByb3h5LCBjYUJ1bmRsZVBhdGggfSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy50b29sa2l0Q2FjaGUuc2V0KGtleSwgdG9vbGtpdCk7XG4gICAgcmV0dXJuIHRvb2xraXQ7XG4gIH1cblxuICAvKipcbiAgICogU3ludGhlc2l6ZXMgdGhlIENESyBhcHBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW50aChvcHRpb25zOiBTeW50aE9wdGlvbnMpIHtcbiAgICBjb25zdCBjeCA9IGF3YWl0IHRoaXMuY3goe1xuICAgICAgYXBwOiBvcHRpb25zLmFwcCxcbiAgICAgIG91dHB1dDogb3B0aW9ucy5vdXRwdXQsXG4gICAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsXG4gICAgICBsb29rdXBzOiBmYWxzZSxcbiAgICAgIHJlc29sdmVEZWZhdWx0RW52aXJvbm1lbnQ6IGZhbHNlLFxuICAgICAgZW52OiBvcHRpb25zLmVudixcbiAgICAgIHZlcnNpb25SZXBvcnRpbmc6IGZhbHNlLFxuICAgICAgcGF0aE1ldGFkYXRhOiBmYWxzZSxcbiAgICAgIGFzc2V0TWV0YWRhdGE6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVzaW5nIGxvY2sgPSBhd2FpdCB0aGlzLnRvb2xraXQuc3ludGgoY3gsIHtcbiAgICAgICAgdmFsaWRhdGVTdGFja3M6IGZhbHNlLFxuICAgICAgICBzdGFja3M6IHtcbiAgICAgICAgICBzdHJhdGVneTogU3RhY2tTZWxlY3Rpb25TdHJhdGVneS5BTExfU1RBQ0tTLFxuICAgICAgICAgIGZhaWxPbkVtcHR5OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZVJlZ2lvbihsb2NrKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmIChlLm1lc3NhZ2UuaW5jbHVkZXMoJ01pc3NpbmcgY29udGV4dCBrZXlzJykpIHtcbiAgICAgICAgLy8gQFRPRE8gLSBzaWxlbnRseSBpZ25vcmUgbWlzc2luZyBjb250ZXh0XG4gICAgICAgIC8vIFRoaXMgaXMgYWN0dWFsbHkgYW4gdW5kZWZpbmVkIGNhc2UgaW4gdGhlIG9sZCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggZG9lc24ndCB1c2UgdGhlIHRvb2xraXQgY29kZVxuICAgICAgICAvLyBhbmQgd29uJ3QgZmFpbCBmb3IgbWlzc2luZyBjb250ZXh0LiBUbyBwcmVzZXJ2ZSBleGlzdGluZyBiZWhhdmlvciwgd2UgZG8gdGhlIHNhbWUgaGVyZS5cbiAgICAgICAgLy8gSG93ZXZlciBpbiBmdXR1cmUgd2UgbmVlZCB0byBmaW5kIGEgd2F5IGZvciBpbnRlZyB0ZXN0cyB0byBwcm92aWRlIGNvbnRleHQgdGhyb3VnaCBzbmFwc2hvdHMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSBzdGFja3MgaW4gdGhlIENESyBhcHBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0KG9wdGlvbnM6IExpc3RPcHRpb25zKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHRvb2xraXQgPSB0aGlzLmdldE9yQ3JlYXRlVG9vbGtpdChvcHRpb25zKTtcbiAgICBjb25zdCBjeCA9IGF3YWl0IHRoaXMuY3gob3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhY2tzID0gYXdhaXQgdG9vbGtpdC5saXN0KGN4LCB7XG4gICAgICBzdGFja3M6IHRoaXMuc3RhY2tTZWxlY3RvcihvcHRpb25zKSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdGFja3MubWFwKHMgPT4gcy5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXBsb3lzIHRoZSBDREsgYXBwXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVwbG95KG9wdGlvbnM6IERlcGxveU9wdGlvbnMpOiBQcm9taXNlPENka0RlcGxveVJlc3VsdD4ge1xuICAgIGNvbnN0IHRvb2xraXQgPSB0aGlzLmdldE9yQ3JlYXRlVG9vbGtpdChvcHRpb25zKTtcbiAgICBjb25zdCBjeCA9IGF3YWl0IHRoaXMuY3gob3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdG9vbGtpdC5kZXBsb3koY3gsIHtcbiAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgIHRyYWNlTG9nczogb3B0aW9ucy50cmFjZUxvZ3MsXG4gICAgICBzdGFja3M6IHRoaXMuc3RhY2tTZWxlY3RvcihvcHRpb25zKSxcbiAgICAgIGRlcGxveW1lbnRNZXRob2Q6IHtcbiAgICAgICAgbWV0aG9kOiAnY2hhbmdlLXNldCcsXG4gICAgICB9LFxuICAgICAgb3V0cHV0c0ZpbGU6IG9wdGlvbnMub3V0cHV0c0ZpbGUgPyBwYXRoLmpvaW4odGhpcy5vcHRpb25zLndvcmtpbmdEaXJlY3RvcnksIG9wdGlvbnMub3V0cHV0c0ZpbGUpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBkZWxldGVGYWlsdXJlczogcmVzdWx0LnN0YWNrcy5mbGF0TWFwKHMgPT4gcy5kZWxldGVGYWlsdXJlcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVzIHRoZSBDREsgYXBwIGZvciBjaGFuZ2VzIGFuZCBkZXBsb3lzIHRoZW0gYXV0b21hdGljYWxseVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdhdGNoKG9wdGlvbnM6IFdhdGNoT3B0aW9ucywgZXZlbnRzPzogV2F0Y2hFdmVudHMpIHtcbiAgICBjb25zdCB0b29sa2l0ID0gdGhpcy5nZXRPckNyZWF0ZVRvb2xraXQob3B0aW9ucyk7XG4gICAgY29uc3QgY3ggPSBhd2FpdCB0aGlzLmN4KG9wdGlvbnMpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YXRjaGVyID0gYXdhaXQgdG9vbGtpdC53YXRjaChjeCwge1xuICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgIHRyYWNlTG9nczogb3B0aW9ucy50cmFjZUxvZ3MsXG4gICAgICAgIHN0YWNrczogdGhpcy5zdGFja1NlbGVjdG9yKG9wdGlvbnMpLFxuICAgICAgICBkZXBsb3ltZW50TWV0aG9kOiBvcHRpb25zLmRlcGxveW1lbnRNZXRob2QsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHdhdGNoZXIud2FpdEZvckVuZCgpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChldmVudHM/Lm9uU3RkZXJyKSB7XG4gICAgICAgIGV2ZW50cy5vblN0ZGVycihTdHJpbmcoZSkpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50cz8ub25DbG9zZSkge1xuICAgICAgICBldmVudHMub25DbG9zZSgxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRzPy5vbkNsb3NlKSB7XG4gICAgICBldmVudHMub25DbG9zZSgwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIENESyBhcHBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95KG9wdGlvbnM6IERlc3Ryb3lPcHRpb25zKSB7XG4gICAgY29uc3QgdG9vbGtpdCA9IHRoaXMuZ2V0T3JDcmVhdGVUb29sa2l0KG9wdGlvbnMpO1xuICAgIGNvbnN0IGN4ID0gYXdhaXQgdGhpcy5jeChvcHRpb25zKTtcblxuICAgIGF3YWl0IHRvb2xraXQuZGVzdHJveShjeCwge1xuICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgc3RhY2tzOiB0aGlzLnN0YWNrU2VsZWN0b3Iob3B0aW9ucyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkIEFzc2VtYmx5IFNvdXJjZSBmcm9tIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjeChvcHRpb25zOiBDeE9wdGlvbnMpOiBQcm9taXNlPElDbG91ZEFzc2VtYmx5U291cmNlPiB7XG4gICAgaWYgKCFvcHRpb25zLmFwcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBhcHAgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgYXBwIGlzIGEgcGF0aCB0byBleGlzdGluZyBzbmFwc2hvdCBhbmQgdGhlbiB1c2UgaXQgYXMgYW4gYXNzZW1ibHkgZGlyZWN0b3J5XG4gICAgY29uc3QgcG90ZW50aWFsQ3hQYXRoID0gcGF0aC5qb2luKHRoaXMub3B0aW9ucy53b3JraW5nRGlyZWN0b3J5LCBvcHRpb25zLmFwcCk7XG4gICAgaWYgKGZzLnBhdGhFeGlzdHNTeW5jKHBvdGVudGlhbEN4UGF0aCkgJiYgZnMuc3RhdFN5bmMocG90ZW50aWFsQ3hQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b29sa2l0LmZyb21Bc3NlbWJseURpcmVjdG9yeShwb3RlbnRpYWxDeFBhdGgpO1xuICAgIH1cblxuICAgIGxldCBvdXRkaXI7XG4gICAgaWYgKG9wdGlvbnMub3V0cHV0KSB7XG4gICAgICBvdXRkaXIgPSBwYXRoLmpvaW4odGhpcy5vcHRpb25zLndvcmtpbmdEaXJlY3RvcnksIG9wdGlvbnMub3V0cHV0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b29sa2l0LmZyb21DZGtBcHAob3B0aW9ucy5hcHAsIHtcbiAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHRoaXMub3B0aW9ucy53b3JraW5nRGlyZWN0b3J5LFxuICAgICAgb3V0ZGlyLFxuICAgICAgbG9va3Vwczogb3B0aW9ucy5sb29rdXBzLFxuICAgICAgY29udGV4dFN0b3JlOiBuZXcgTWVtb3J5Q29udGV4dChvcHRpb25zLmNvbnRleHQpLFxuICAgICAgcmVzb2x2ZURlZmF1bHRFbnZpcm9ubWVudDogb3B0aW9ucy5yZXNvbHZlRGVmYXVsdEVudmlyb25tZW50LFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnRoaXMub3B0aW9ucy5lbnYsXG4gICAgICAgIC4uLm9wdGlvbnMuZW52LFxuICAgICAgfSxcbiAgICAgIHN5bnRoT3B0aW9uczoge1xuICAgICAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgICAgICAgdmVyc2lvblJlcG9ydGluZzogb3B0aW9ucy52ZXJzaW9uUmVwb3J0aW5nID8/IGZhbHNlLFxuICAgICAgICBwYXRoTWV0YWRhdGE6IG9wdGlvbnMucGF0aE1ldGFkYXRhID8/IGZhbHNlLFxuICAgICAgICBhc3NldE1ldGFkYXRhOiBvcHRpb25zLmFzc2V0TWV0YWRhdGEgPz8gZmFsc2UsXG4gICAgICAgIGFzc2V0U3RhZ2luZzogb3B0aW9ucy5zdGFnaW5nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgU3RhY2tTZWxlY3RvciBmcm9tIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFja1NlbGVjdG9yKG9wdGlvbnM6IERlZmF1bHRDZGtPcHRpb25zICYgeyByZWFkb25seSBleGNsdXNpdmVseT86IGJvb2xlYW4gfSk6IFN0YWNrU2VsZWN0b3Ige1xuICAgIHJldHVybiB7XG4gICAgICBzdHJhdGVneTogb3B0aW9ucy5hbGwgPyBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LkFMTF9TVEFDS1MgOiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSCxcbiAgICAgIHBhdHRlcm5zOiBvcHRpb25zLnN0YWNrcyA/PyBbJyoqJ10sXG4gICAgICBleHBhbmQ6IG9wdGlvbnMuZXhjbHVzaXZlbHkgPyBFeHBhbmRTdGFja1NlbGVjdGlvbi5OT05FIDogRXhwYW5kU3RhY2tTZWxlY3Rpb24uVVBTVFJFQU0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGF0IHRoZSByZWdpb25zIGZvciB0aGUgc3RhY2tzIGluIHRoZSBDbG91ZEFzc2VtYmx5IG1hdGNoIHRoZSByZWdpb25zIHJlcXVlc3RlZCBvbiB0aGUgZW5naW5lXG4gICAqXG4gICAqIFRoaXMgcHJldmVudHMgbWlzY29uZmlndXJhdGlvbiBvZiB0aGUgaW50ZWcgdGVzdCBhcHAuIFBlb3BsZSB0ZW5kIHRvIHB1dDpcbiAgICpcbiAgICogYGBgdHNcbiAgICogbmV3IFN0YWNrKGFwcCwgJ1N0YWNrJywge1xuICAgKiAgIGVudjoge1xuICAgKiAgICAgcmVnaW9uOiAnc29tZS1yZWdpb24tdGhhdC1zdWl0cy1tZScsXG4gICAqICAgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEludG8gdGhlaXIgaW50ZWcgdGVzdHMsIGluc3RlYWQgb2Y6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIHtcbiAgICogICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTixcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogVGhpcyBjYXRjaGVzIHRoYXQgbWlzY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVSZWdpb24oYXNtOiBJUmVhZGFibGVDbG91ZEFzc2VtYmx5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gdGhpcyBoYXBwZW5zIGZvciBleGlzdGluZyBzbmFwc2hvdHMsIGluIHRoYXQgY2FzZSBub3RoaW5nIHRvIGNoZWNrXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZWdpb24gPT09IFVOS05PV05fUkVHSU9OKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdGFjayBvZiBhc20uY2xvdWRBc3NlbWJseS5zdGFja3NSZWN1cnNpdmVseSkge1xuICAgICAgaWYgKHN0YWNrLmVudmlyb25tZW50LnJlZ2lvbiAhPT0gdGhpcy5vcHRpb25zLnJlZ2lvbiAmJiBzdGFjay5lbnZpcm9ubWVudC5yZWdpb24gIT09IFVOS05PV05fUkVHSU9OKSB7XG4gICAgICAgIHRoaXMuaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgICAgYWN0aW9uOiAnZGVwbG95JyxcbiAgICAgICAgICBjb2RlOiAnQ0RLX1JVTk5FUl9XMDAwMCcsXG4gICAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgICBsZXZlbDogJ3dhcm4nLFxuICAgICAgICAgIG1lc3NhZ2U6IGBTdGFjayAke3N0YWNrLmRpc3BsYXlOYW1lfSBzeW50aGVzaXplcyBmb3IgcmVnaW9uICR7c3RhY2suZW52aXJvbm1lbnQucmVnaW9ufSwgZXZlbiB0aG91Z2ggJHt0aGlzLm9wdGlvbnMucmVnaW9ufSB3YXMgcmVxdWVzdGVkLiBQbGVhc2UgY29uZmlndXJlIFxcYHsgZW52OiB7IHJlZ2lvbjogcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfUkVHSU9OLCBhY2NvdW50OiBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9BQ0NPVU5UIH0gfVxcYCwgb3IgdXNlIG5vIGVudiBhdCBhbGwuIERvIG5vdCBoYXJkY29kZSBhIHJlZ2lvbiBvciBhY2NvdW50LmAsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIHN0YWNrUmVnaW9uOiBzdGFjay5lbnZpcm9ubWVudC5yZWdpb24sXG4gICAgICAgICAgICByZXF1ZXN0ZWRSZWdpb246IHRoaXMub3B0aW9ucy5yZWdpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBJb0hvc3QgdXNlZCBpbiB0aGUgaW50ZWctcnVubmVyIHRvIHByb3ZpZGUgbm9uLWludGVyYWN0aXZlIG91dHB1dFxuICovXG5jbGFzcyBJbnRlZ1J1bm5lcklvSG9zdCBleHRlbmRzIE5vbkludGVyYWN0aXZlSW9Ib3N0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBOb25JbnRlcmFjdGl2ZUlvSG9zdFByb3BzID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGlzVFRZOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgYXN5bmMgbm90aWZ5KG1zZzogSW9NZXNzYWdlPHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNvbG9yO1xuICAgIHN3aXRjaCAobXNnLmxldmVsKSB7XG4gICAgICBjYXNlICdlcnJvcic6IGNvbG9yID0gY2hhbGsucmVkOyBicmVhaztcbiAgICAgIGNhc2UgJ3dhcm4nOiBjb2xvciA9IGNoYWxrLnllbGxvdzsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiBjb2xvciA9IGNoYWxrLmdyYXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLm5vdGlmeSh7XG4gICAgICAuLi5tc2csXG4gICAgICBtZXNzYWdlOiBjb2xvcihtc2cubWVzc2FnZSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBJb0hvc3QgdGhhdCBkb2Vzbid0IGRvIGFueXRoaW5nXG4gKi9cbmNsYXNzIE5vb3BJb0hvc3QgaW1wbGVtZW50cyBJSW9Ib3N0IHtcbiAgcHVibGljIGFzeW5jIG5vdGlmeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgfVxuICBwdWJsaWMgYXN5bmMgcmVxdWVzdFJlc3BvbnNlPFQ+KG1zZzogSW9SZXF1ZXN0PHVua25vd24sIFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gIH1cbn1cbiJdfQ==
416
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC1saWIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0b29sa2l0LWxpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWtDO0FBQ2xDLG9FQUE2RDtBQUc3RCxzREFBbUo7QUFDbkosa0RBQTBCO0FBQzFCLDZDQUErQjtBQUUvQiwrQ0FBbUQ7QUF1RW5EOztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7SUFDaEIsT0FBTyxDQUFVO0lBQ2pCLE9BQU8sQ0FBMEI7SUFDakMsVUFBVSxDQUFVO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBRTNELFlBQW1CLE9BQWdDO1FBQ2pELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFFOUMsd0VBQXdFO1FBQ3hFLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUV0QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRXpDLG9FQUFvRTtRQUNwRSx1REFBdUQ7UUFDdkQsdUNBQXVDO1FBQ3ZDLEVBQUU7UUFDRixjQUFjO1FBQ2QsK0RBQStEO1FBQy9ELFVBQVU7UUFDVixtQkFBbUI7UUFFbkIsd0ZBQXdGO1FBQ3hGLG1CQUFtQjtRQUNuQixxQkFBcUI7UUFDckIsa0JBQWtCO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0JBQWtCLENBQUMsYUFBNkI7UUFDdEQsTUFBTSxPQUFPLEdBQUcsYUFBYSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9B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QUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBaFNELHdEQWdTQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxpQkFBa0IsU0FBUSxrQ0FBb0I7SUFDbEQsWUFBbUIsUUFBbUMsRUFBRTtRQUN0RCxLQUFLLENBQUM7WUFDSixHQUFHLEtBQUs7WUFDUixLQUFLLEVBQUUsS0FBSztTQUNiLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDTSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQXVCO1FBQ3pDLElBQUksS0FBSyxDQUFDO1FBQ1YsUUFBUSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsS0FBSyxPQUFPO2dCQUFFLEtBQUssR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDO2dCQUFDLE1BQU07WUFDdkMsS0FBSyxNQUFNO2dCQUFFLEtBQUssR0FBRyxlQUFLLENBQUMsTUFBTSxDQUFDO2dCQUFDLE1BQU07WUFDekMsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNsQixHQUFHLEdBQUc7WUFDTixPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVU7SUFDUCxLQUFLLENBQUMsTUFBTTtJQUNuQixDQUFDO0lBQ00sS0FBSyxDQUFDLGVBQWUsQ0FBSSxHQUEwQjtRQUN4RCxPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgVU5LTk9XTl9SRUdJT04gfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0IHR5cGUgeyBEZWZhdWx0Q2RrT3B0aW9ucyB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYS9saWIvaW50ZWctdGVzdHMnO1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgSUlvSG9zdCwgSW9NZXNzYWdlLCBJb1JlcXVlc3QsIElSZWFkYWJsZUNsb3VkQXNzZW1ibHksIE5vbkludGVyYWN0aXZlSW9Ib3N0UHJvcHMsIFN0YWNrU2VsZWN0b3IgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgeyBCYXNlQ3JlZGVudGlhbHMsIEV4cGFuZFN0YWNrU2VsZWN0aW9uLCBNZW1vcnlDb250ZXh0LCBOb25JbnRlcmFjdGl2ZUlvSG9zdCwgU3RhY2tTZWxlY3Rpb25TdHJhdGVneSwgVG9vbGtpdCB9IGZyb20gJ0Bhd3MtY2RrL3Rvb2xraXQtbGliJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgdHlwZSB7IENka0RlcGxveVJlc3VsdCwgQ3hPcHRpb25zLCBEZXBsb3lPcHRpb25zLCBEZXN0cm95T3B0aW9ucywgSUNkaywgTGlzdE9wdGlvbnMsIFN5bnRoT3B0aW9ucywgV2F0Y2hFdmVudHMsIFdhdGNoT3B0aW9ucyB9IGZyb20gJy4vY2RrLWludGVyZmFjZSc7XG5pbXBvcnQgeyBQcm94eUFnZW50UHJvdmlkZXIgfSBmcm9tICcuL3Byb3h5LWFnZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sa2l0TGliRW5naW5lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHRvIHJ1biB0aGUgY2RrIGNvbW1hbmRzIGZyb21cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc2V0XG4gICAqIGluIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdGhhdCB3aWxsIGJlIHJ1bm5pbmdcbiAgICogdGhlIGNkayBhcHBcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIGVudiB2YXJzXG4gICAqL1xuICByZWFkb25seSBlbnY/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogU2hvdyB0aGUgb3V0cHV0IGZyb20gcnVubmluZyB0aGUgQ0RLIENMSVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd091dHB1dD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhlIENESyBhcHAgc2hvdWxkIHN5bnRoZXNpemUgaXRzZWxmIGZvclxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgcHJvZmlsZSB0byB1c2Ugd2hlbiBhdXRoZW50aWNhdGluZ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb2ZpbGUgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdCBwcm9maWxlIGlzIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgaW5kaWNhdGVkIHByb3h5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJveHksIFByb3h5QWdlbnQgYXV0by1kZXRlY3RzIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICByZWFkb25seSBwcm94eT86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBDQSBjZXJ0aWZpY2F0ZSB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nIEhUVFBTIHJlcXVlc3RzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBDQSBidW5kbGVcbiAgICovXG4gIHJlYWRvbmx5IGNhQnVuZGxlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXItYWN0aW9uIG9wdGlvbnMgdGhhdCBjYW4gb3ZlcnJpZGUgdGhlIGVuZ2luZSBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBBV1MgcHJvZmlsZSB0byB1c2VcbiAgICovXG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgaW5kaWNhdGVkIHByb3h5XG4gICAqL1xuICByZWFkb25seSBwcm94eT86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBDQSBjZXJ0aWZpY2F0ZSB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nIEhUVFBTIHJlcXVlc3RzXG4gICAqL1xuICByZWFkb25seSBjYUJ1bmRsZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBydW5uZXIgZW5naW5lIHBvd2VyZWQgZGlyZWN0bHkgYnkgdGhlIHRvb2xraXQtbGliXG4gKi9cbmV4cG9ydCBjbGFzcyBUb29sa2l0TGliUnVubmVyRW5naW5lIGltcGxlbWVudHMgSUNkayB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbGtpdDogVG9vbGtpdDtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBUb29sa2l0TGliRW5naW5lT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93T3V0cHV0OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGlvSG9zdDogSW50ZWdSdW5uZXJJb0hvc3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbGtpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFRvb2xraXQ+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRvb2xraXRMaWJFbmdpbmVPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnNob3dPdXRwdXQgPSBvcHRpb25zLnNob3dPdXRwdXQgPz8gZmFsc2U7XG5cbiAgICAvLyBXZSBhbHdheXMgY3JlYXRlIHRoaXMgZm9yIG91cnNlbHZlcyB0byBlbWl0IHdhcm5pbmdzLCBidXQgcG90ZW50aWFsbHlcbiAgICAvLyBkb24ndCBwYXNzIGl0IHRvIHRoZSB0b29sa2l0LlxuICAgIHRoaXMuaW9Ib3N0ID0gbmV3IEludGVnUnVubmVySW9Ib3N0KCk7XG5cbiAgICB0aGlzLnRvb2xraXQgPSB0aGlzLmdldE9yQ3JlYXRlVG9vbGtpdCgpO1xuXG4gICAgLy8gQFRPRE8gLSB0aGVzZSBvcHRpb25zIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlIG9uIHRoZSBhY3Rpb24gY2FsbHNcbiAgICAvLyBidXQgdG9vbGtpdC1saWIgbmVlZHMgdGhlbSBhdCB0aGUgY29uc3RydWN0b3IgbGV2ZWwuXG4gICAgLy8gTmVlZCB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZW0uXG4gICAgLy9cbiAgICAvLyBWYWxpZGF0aW9uc1xuICAgIC8vICAtIGFzc2VtYmx5RmFpbHVyZUF0OiBvcHRpb25zLnN0cmljdCA/PyBvcHRpb25zLmlnbm9yZUVycm9yc1xuICAgIC8vIExvZ2dpbmdcbiAgICAvLyAgLSBvcHRpb25zLmNvbG9yXG5cbiAgICAvLyBAVE9ETyAtIHNpbWlsYXIgdG8gdGhlIGFib3ZlLCBidXQgaW4gdG9vbGtpdC1saWIgdGhlc2Ugb3B0aW9ucyB3b3VsZCBnbyBvbiB0aGUgSW9Ib3N0XG4gICAgLy8gIC0gb3B0aW9ucy50cmFjZVxuICAgIC8vICAtIG9wdGlvbnMudmVyYm9zZVxuICAgIC8vICAtIG9wdGlvbnMuanNvblxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBjcmVhdGUgYSBUb29sa2l0IGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gYWN0aW9uIG9wdGlvbnMuXG4gICAqIENhY2hlcyBpbnN0YW5jZXMgYnkgdGhlaXIgcmVzb2x2ZWQgY29uZmlndXJhdGlvbiB0byBhdm9pZCBjcmVhdGluZ1xuICAgKiBkdXBsaWNhdGUgVG9vbGtpdCBpbnN0YW5jZXMgZm9yIGlkZW50aWNhbCBzZXR0aW5ncy5cbiAgICovXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVUb29sa2l0KGFjdGlvbk9wdGlvbnM/OiBBY3Rpb25PcHRpb25zKTogVG9vbGtpdCB7XG4gICAgY29uc3QgcHJvZmlsZSA9IGFjdGlvbk9wdGlvbnM/LnByb2ZpbGUgPz8gdGhpcy5vcHRpb25zLnByb2ZpbGU7XG4gICAgY29uc3QgcHJveHkgPSBhY3Rpb25PcHRpb25zPy5wcm94eSA/PyB0aGlzLm9wdGlvbnMucHJveHk7XG4gICAgY29uc3QgY2FCdW5kbGVQYXRoID0gYWN0aW9uT3B0aW9ucz8uY2FCdW5kbGVQYXRoID8/IHRoaXMub3B0aW9ucy5jYUJ1bmRsZVBhdGg7XG4gICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW3Byb2ZpbGUsIHByb3h5LCBjYUJ1bmRsZVBhdGhdKTtcblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMudG9vbGtpdENhY2hlLmdldChrZXkpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdG9vbGtpdCA9IG5ldyBUb29sa2l0KHtcbiAgICAgIGlvSG9zdDogdGhpcy5zaG93T3V0cHV0ID8gdGhpcy5pb0hvc3QgOiBuZXcgTm9vcElvSG9zdCgpLFxuICAgICAgc2RrQ29uZmlnOiB7XG4gICAgICAgIGJhc2VDcmVkZW50aWFsczogQmFzZUNyZWRlbnRpYWxzLmF3c0NsaUNvbXBhdGlibGUoe1xuICAgICAgICAgIHByb2ZpbGUsXG4gICAgICAgICAgZGVmYXVsdFJlZ2lvbjogdGhpcy5vcHRpb25zLnJlZ2lvbixcbiAgICAgICAgfSksXG4gICAgICAgIGh0dHBPcHRpb25zOiB7XG4gICAgICAgICAgYWdlbnQ6IFByb3h5QWdlbnRQcm92aWRlci5nZXRPckNyZWF0ZSh7IHByb3h5QWRkcmVzczogcHJveHksIGNhQnVuZGxlUGF0aCB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnRvb2xraXRDYWNoZS5zZXQoa2V5LCB0b29sa2l0KTtcbiAgICByZXR1cm4gdG9vbGtpdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW50aGVzaXplcyB0aGUgQ0RLIGFwcFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5bnRoKG9wdGlvbnM6IFN5bnRoT3B0aW9ucykge1xuICAgIGNvbnN0IGN4ID0gYXdhaXQgdGhpcy5jeCh7XG4gICAgICBhcHA6IG9wdGlvbnMuYXBwLFxuICAgICAgb3V0cHV0OiBvcHRpb25zLm91dHB1dCxcbiAgICAgIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dCxcbiAgICAgIGxvb2t1cHM6IGZhbHNlLFxuICAgICAgcmVzb2x2ZURlZmF1bHRFbnZpcm9ubWVudDogZmFsc2UsXG4gICAgICBlbnY6IG9wdGlvbnMuZW52LFxuICAgICAgdmVyc2lvblJlcG9ydGluZzogZmFsc2UsXG4gICAgICBwYXRoTWV0YWRhdGE6IGZhbHNlLFxuICAgICAgYXNzZXRNZXRhZGF0YTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdXNpbmcgbG9jayA9IGF3YWl0IHRoaXMudG9vbGtpdC5zeW50aChjeCwge1xuICAgICAgICB2YWxpZGF0ZVN0YWNrczogZmFsc2UsXG4gICAgICAgIHN0YWNrczoge1xuICAgICAgICAgIHN0cmF0ZWd5OiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LkFMTF9TVEFDS1MsXG4gICAgICAgICAgZmFpbE9uRW1wdHk6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlUmVnaW9uKGxvY2spO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcygnTWlzc2luZyBjb250ZXh0IGtleXMnKSkge1xuICAgICAgICAvLyBAVE9ETyAtIHNpbGVudGx5IGlnbm9yZSBtaXNzaW5nIGNvbnRleHRcbiAgICAgICAgLy8gVGhpcyBpcyBhY3R1YWxseSBhbiB1bmRlZmluZWQgY2FzZSBpbiB0aGUgb2xkIGltcGxlbWVudGF0aW9uLCB3aGljaCBkb2Vzbid0IHVzZSB0aGUgdG9vbGtpdCBjb2RlXG4gICAgICAgIC8vIGFuZCB3b24ndCBmYWlsIGZvciBtaXNzaW5nIGNvbnRleHQuIFRvIHByZXNlcnZlIGV4aXN0aW5nIGJlaGF2aW9yLCB3ZSBkbyB0aGUgc2FtZSBoZXJlLlxuICAgICAgICAvLyBIb3dldmVyIGluIGZ1dHVyZSB3ZSBuZWVkIHRvIGZpbmQgYSB3YXkgZm9yIGludGVnIHRlc3RzIHRvIHByb3ZpZGUgY29udGV4dCB0aHJvdWdoIHNuYXBzaG90cy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdGhlIHN0YWNrcyBpbiB0aGUgQ0RLIGFwcFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3Qob3B0aW9uczogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgdG9vbGtpdCA9IHRoaXMuZ2V0T3JDcmVhdGVUb29sa2l0KG9wdGlvbnMpO1xuICAgIGNvbnN0IGN4ID0gYXdhaXQgdGhpcy5jeChvcHRpb25zKTtcbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCB0b29sa2l0Lmxpc3QoY3gsIHtcbiAgICAgIHN0YWNrczogdGhpcy5zdGFja1NlbGVjdG9yKG9wdGlvbnMpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN0YWNrcy5tYXAocyA9PiBzLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveXMgdGhlIENESyBhcHBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXBsb3kob3B0aW9uczogRGVwbG95T3B0aW9ucyk6IFByb21pc2U8Q2RrRGVwbG95UmVzdWx0PiB7XG4gICAgY29uc3QgdG9vbGtpdCA9IHRoaXMuZ2V0T3JDcmVhdGVUb29sa2l0KG9wdGlvbnMpO1xuICAgIGNvbnN0IGN4ID0gYXdhaXQgdGhpcy5jeChvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b29sa2l0LmRlcGxveShjeCwge1xuICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgdHJhY2VMb2dzOiBvcHRpb25zLnRyYWNlTG9ncyxcbiAgICAgIHN0YWNrczogdGhpcy5zdGFja1NlbGVjdG9yKG9wdGlvbnMpLFxuICAgICAgZGVwbG95bWVudE1ldGhvZDoge1xuICAgICAgICBtZXRob2Q6ICdjaGFuZ2Utc2V0JyxcbiAgICAgIH0sXG4gICAgICBvdXRwdXRzRmlsZTogb3B0aW9ucy5vdXRwdXRzRmlsZSA/IHBhdGguam9pbih0aGlzLm9wdGlvbnMud29ya2luZ0RpcmVjdG9yeSwgb3B0aW9ucy5vdXRwdXRzRmlsZSkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlbGV0ZUZhaWx1cmVzOiByZXN1bHQuc3RhY2tzLmZsYXRNYXAocyA9PiBzLmRlbGV0ZUZhaWx1cmVzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXMgdGhlIENESyBhcHAgZm9yIGNoYW5nZXMgYW5kIGRlcGxveXMgdGhlbSBhdXRvbWF0aWNhbGx5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2F0Y2gob3B0aW9uczogV2F0Y2hPcHRpb25zLCBldmVudHM/OiBXYXRjaEV2ZW50cykge1xuICAgIGNvbnN0IHRvb2xraXQgPSB0aGlzLmdldE9yQ3JlYXRlVG9vbGtpdChvcHRpb25zKTtcbiAgICBjb25zdCBjeCA9IGF3YWl0IHRoaXMuY3gob3B0aW9ucyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdhdGNoZXIgPSBhd2FpdCB0b29sa2l0LndhdGNoKGN4LCB7XG4gICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgdHJhY2VMb2dzOiBvcHRpb25zLnRyYWNlTG9ncyxcbiAgICAgICAgc3RhY2tzOiB0aGlzLnN0YWNrU2VsZWN0b3Iob3B0aW9ucyksXG4gICAgICAgIGRlcGxveW1lbnRNZXRob2Q6IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgd2F0Y2hlci53YWl0Rm9yRW5kKCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKGV2ZW50cz8ub25TdGRlcnIpIHtcbiAgICAgICAgZXZlbnRzLm9uU3RkZXJyKFN0cmluZyhlKSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnRzPy5vbkNsb3NlKSB7XG4gICAgICAgIGV2ZW50cy5vbkNsb3NlKDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudHM/Lm9uQ2xvc2UpIHtcbiAgICAgIGV2ZW50cy5vbkNsb3NlKDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgQ0RLIGFwcFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3kob3B0aW9uczogRGVzdHJveU9wdGlvbnMpIHtcbiAgICBjb25zdCB0b29sa2l0ID0gdGhpcy5nZXRPckNyZWF0ZVRvb2xraXQob3B0aW9ucyk7XG4gICAgY29uc3QgY3ggPSBhd2FpdCB0aGlzLmN4KG9wdGlvbnMpO1xuXG4gICAgYXdhaXQgdG9vbGtpdC5kZXN0cm95KGN4LCB7XG4gICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICBzdGFja3M6IHRoaXMuc3RhY2tTZWxlY3RvcihvcHRpb25zKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ2xvdWQgQXNzZW1ibHkgU291cmNlIGZyb20gdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGN4KG9wdGlvbnM6IEN4T3B0aW9ucyk6IFByb21pc2U8SUNsb3VkQXNzZW1ibHlTb3VyY2U+IHtcbiAgICBpZiAoIW9wdGlvbnMuYXBwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGFwcCBwcm92aWRlZCcpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIHRoZSBhcHAgaXMgYSBwYXRoIHRvIGV4aXN0aW5nIHNuYXBzaG90IGFuZCB0aGVuIHVzZSBpdCBhcyBhbiBhc3NlbWJseSBkaXJlY3RvcnlcbiAgICBjb25zdCBwb3RlbnRpYWxDeFBhdGggPSBwYXRoLmpvaW4odGhpcy5vcHRpb25zLndvcmtpbmdEaXJlY3RvcnksIG9wdGlvbnMuYXBwKTtcbiAgICBpZiAoZnMucGF0aEV4aXN0c1N5bmMocG90ZW50aWFsQ3hQYXRoKSAmJiBmcy5zdGF0U3luYyhwb3RlbnRpYWxDeFBhdGgpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvb2xraXQuZnJvbUFzc2VtYmx5RGlyZWN0b3J5KHBvdGVudGlhbEN4UGF0aCk7XG4gICAgfVxuXG4gICAgbGV0IG91dGRpcjtcbiAgICBpZiAob3B0aW9ucy5vdXRwdXQpIHtcbiAgICAgIG91dGRpciA9IHBhdGguam9pbih0aGlzLm9wdGlvbnMud29ya2luZ0RpcmVjdG9yeSwgb3B0aW9ucy5vdXRwdXQpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCB3ZSBhc3N1bWUgaXQncyBhIHByZS1zeW50aGVzaXplZCBhc3NlbWJseSBhbmQgdXNlIGl0IGRpcmVjdGx5LlxuICAgIC8vIFRoaXMgaGVscHMgYSBsb3Qgd2l0aCBzcGVlZCBpZiB3ZSBydW4gYGNkayBsaXN0YCBvbiBwcmV2aW91c2x5IHN5bnRoJ2VkIGRpcmVjdG9yeSwgd2hpY2ggaGFwcGVuc1xuICAgIC8vIGEgYnVuY2ggaW4gdGhlIGludGVnLXJ1bm5lci5cbiAgICAvL1xuICAgIC8vIElkZWFsbHkgd2Ugd291bGQgcmVwcmVzZW50IGEgcHJldmlvdXNseSBwcm9kdWNlZCBhc3NlbWJseSB3aXRoIGFuIG9iamVjdCB0aGF0IHdlIHBhc3MgYXJvdW5kLCBidXRcbiAgICAvLyB0aGF0J3MgYSBiaWdnZXIgQVBJIGNoYW5nZS5cbiAgICBpZiAob3V0ZGlyICYmIGZzLnBhdGhFeGlzdHNTeW5jKG91dGRpcikgJiYgZnMuc3RhdFN5bmMob3V0ZGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b29sa2l0LmZyb21Bc3NlbWJseURpcmVjdG9yeShvdXRkaXIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvb2xraXQuZnJvbUNka0FwcChvcHRpb25zLmFwcCwge1xuICAgICAgd29ya2luZ0RpcmVjdG9yeTogdGhpcy5vcHRpb25zLndvcmtpbmdEaXJlY3RvcnksXG4gICAgICBvdXRkaXIsXG4gICAgICBsb29rdXBzOiBvcHRpb25zLmxvb2t1cHMsXG4gICAgICBjb250ZXh0U3RvcmU6IG5ldyBNZW1vcnlDb250ZXh0KG9wdGlvbnMuY29udGV4dCksXG4gICAgICByZXNvbHZlRGVmYXVsdEVudmlyb25tZW50OiBvcHRpb25zLnJlc29sdmVEZWZhdWx0RW52aXJvbm1lbnQsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLmVudixcbiAgICAgICAgLi4ub3B0aW9ucy5lbnYsXG4gICAgICB9LFxuICAgICAgc3ludGhPcHRpb25zOiB7XG4gICAgICAgIGRlYnVnOiBvcHRpb25zLmRlYnVnLFxuICAgICAgICB2ZXJzaW9uUmVwb3J0aW5nOiBvcHRpb25zLnZlcnNpb25SZXBvcnRpbmcgPz8gZmFsc2UsXG4gICAgICAgIHBhdGhNZXRhZGF0YTogb3B0aW9ucy5wYXRoTWV0YWRhdGEgPz8gZmFsc2UsXG4gICAgICAgIGFzc2V0TWV0YWRhdGE6IG9wdGlvbnMuYXNzZXRNZXRhZGF0YSA/PyBmYWxzZSxcbiAgICAgICAgYXNzZXRTdGFnaW5nOiBvcHRpb25zLnN0YWdpbmcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBTdGFja1NlbGVjdG9yIGZyb20gdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIHN0YWNrU2VsZWN0b3Iob3B0aW9uczogRGVmYXVsdENka09wdGlvbnMgJiB7IHJlYWRvbmx5IGV4Y2x1c2l2ZWx5PzogYm9vbGVhbiB9KTogU3RhY2tTZWxlY3RvciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmF0ZWd5OiBvcHRpb25zLmFsbCA/IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuQUxMX1NUQUNLUyA6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENILFxuICAgICAgcGF0dGVybnM6IG9wdGlvbnMuc3RhY2tzID8/IFsnKionXSxcbiAgICAgIGV4cGFuZDogb3B0aW9ucy5leGNsdXNpdmVseSA/IEV4cGFuZFN0YWNrU2VsZWN0aW9uLk5PTkUgOiBFeHBhbmRTdGFja1NlbGVjdGlvbi5VUFNUUkVBTSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoYXQgdGhlIHJlZ2lvbnMgZm9yIHRoZSBzdGFja3MgaW4gdGhlIENsb3VkQXNzZW1ibHkgbWF0Y2ggdGhlIHJlZ2lvbnMgcmVxdWVzdGVkIG9uIHRoZSBlbmdpbmVcbiAgICpcbiAgICogVGhpcyBwcmV2ZW50cyBtaXNjb25maWd1cmF0aW9uIG9mIHRoZSBpbnRlZyB0ZXN0IGFwcC4gUGVvcGxlIHRlbmQgdG8gcHV0OlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBuZXcgU3RhY2soYXBwLCAnU3RhY2snLCB7XG4gICAqICAgZW52OiB7XG4gICAqICAgICByZWdpb246ICdzb21lLXJlZ2lvbi10aGF0LXN1aXRzLW1lJyxcbiAgICogICB9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogSW50byB0aGVpciBpbnRlZyB0ZXN0cywgaW5zdGVhZCBvZjpcbiAgICpcbiAgICogYGBgdHNcbiAgICoge1xuICAgKiAgIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfUkVHSU9OLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBUaGlzIGNhdGNoZXMgdGhhdCBtaXNjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVJlZ2lvbihhc206IElSZWFkYWJsZUNsb3VkQXNzZW1ibHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyB0aGlzIGhhcHBlbnMgZm9yIGV4aXN0aW5nIHNuYXBzaG90cywgaW4gdGhhdCBjYXNlIG5vdGhpbmcgdG8gY2hlY2tcbiAgICBpZiAodGhpcy5vcHRpb25zLnJlZ2lvbiA9PT0gVU5LTk9XTl9SRUdJT04pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0YWNrIG9mIGFzbS5jbG91ZEFzc2VtYmx5LnN0YWNrc1JlY3Vyc2l2ZWx5KSB7XG4gICAgICBpZiAoc3RhY2suZW52aXJvbm1lbnQucmVnaW9uICE9PSB0aGlzLm9wdGlvbnMucmVnaW9uICYmIHN0YWNrLmVudmlyb25tZW50LnJlZ2lvbiAhPT0gVU5LTk9XTl9SRUdJT04pIHtcbiAgICAgICAgdGhpcy5pb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgICBhY3Rpb246ICdkZXBsb3knLFxuICAgICAgICAgIGNvZGU6ICdDREtfUlVOTkVSX1cwMDAwJyxcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnd2FybicsXG4gICAgICAgICAgbWVzc2FnZTogYFN0YWNrICR7c3RhY2suZGlzcGxheU5hbWV9IHN5bnRoZXNpemVzIGZvciByZWdpb24gJHtzdGFjay5lbnZpcm9ubWVudC5yZWdpb259LCBldmVuIHRob3VnaCAke3RoaXMub3B0aW9ucy5yZWdpb259IHdhcyByZXF1ZXN0ZWQuIFBsZWFzZSBjb25maWd1cmUgXFxgeyBlbnY6IHsgcmVnaW9uOiBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT04sIGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQgfSB9XFxgLCBvciB1c2Ugbm8gZW52IGF0IGFsbC4gRG8gbm90IGhhcmRjb2RlIGEgcmVnaW9uIG9yIGFjY291bnQuYCxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBzdGFja05hbWU6IHN0YWNrLmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgc3RhY2tSZWdpb246IHN0YWNrLmVudmlyb25tZW50LnJlZ2lvbixcbiAgICAgICAgICAgIHJlcXVlc3RlZFJlZ2lvbjogdGhpcy5vcHRpb25zLnJlZ2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFuIElvSG9zdCB1c2VkIGluIHRoZSBpbnRlZy1ydW5uZXIgdG8gcHJvdmlkZSBub24taW50ZXJhY3RpdmUgb3V0cHV0XG4gKi9cbmNsYXNzIEludGVnUnVubmVySW9Ib3N0IGV4dGVuZHMgTm9uSW50ZXJhY3RpdmVJb0hvc3Qge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IE5vbkludGVyYWN0aXZlSW9Ib3N0UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgaXNUVFk6IGZhbHNlLFxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBhc3luYyBub3RpZnkobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgY29sb3I7XG4gICAgc3dpdGNoIChtc2cubGV2ZWwpIHtcbiAgICAgIGNhc2UgJ2Vycm9yJzogY29sb3IgPSBjaGFsay5yZWQ7IGJyZWFrO1xuICAgICAgY2FzZSAnd2Fybic6IGNvbG9yID0gY2hhbGsueWVsbG93OyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IGNvbG9yID0gY2hhbGsuZ3JheTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIubm90aWZ5KHtcbiAgICAgIC4uLm1zZyxcbiAgICAgIG1lc3NhZ2U6IGNvbG9yKG1zZy5tZXNzYWdlKSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIElvSG9zdCB0aGF0IGRvZXNuJ3QgZG8gYW55dGhpbmdcbiAqL1xuY2xhc3MgTm9vcElvSG9zdCBpbXBsZW1lbnRzIElJb0hvc3Qge1xuICBwdWJsaWMgYXN5bmMgbm90aWZ5KCk6IFByb21pc2U8dm9pZD4ge1xuICB9XG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0UmVzcG9uc2U8VD4obXNnOiBJb1JlcXVlc3Q8dW5rbm93biwgVD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbXNnLmRlZmF1bHRSZXNwb25zZTtcbiAgfVxufVxuIl19
@@ -60,6 +60,13 @@ export interface CdkIntegHelperOptions {
60
60
  * @default - no additional CA bundle
61
61
  */
62
62
  readonly caBundlePath?: string;
63
+ /**
64
+ * In unit test mode, leave the synth output directories, don't clean them.
65
+ *
66
+ * Many of our tests use mocks and don't actually synth output directories, they are
67
+ * static and must not be deleted.
68
+ */
69
+ readonly testingUsingMocksLeaveDirectories?: boolean;
63
70
  }
64
71
  /**
65
72
  * Whether to synthesize the actual snapshot with lookups enabled or not.
@@ -129,7 +136,7 @@ export declare class CdkIntegHelper {
129
136
  *
130
137
  * Relative to cwd.
131
138
  */
132
- readonly cdkOutDir: string;
139
+ readonly temporarySnapshotDir: string;
133
140
  /**
134
141
  * The profile to use for the CDK CLI calls
135
142
  */
@@ -143,6 +150,7 @@ export declare class CdkIntegHelper {
143
150
  private _expectedTestSuite?;
144
151
  private _actualSnapshot?;
145
152
  private _legacyEnableLookups?;
153
+ private readonly deleteSynthDirectories;
146
154
  /**
147
155
  * Fields that require an async context to initialize.
148
156
  */
@@ -212,14 +220,6 @@ export declare class CdkIntegHelper {
212
220
  * The test suite from the new "actual" snapshot
213
221
  */
214
222
  private actualTestSuite;
215
- /**
216
- * Load the integ manifest which contains information
217
- * on how to execute the tests
218
- * First we try and load the manifest from the integ manifest (i.e. integ.json)
219
- * from the cloud assembly. If it doesn't exist, then we fallback to the
220
- * "legacy mode" and create a manifest from pragma
221
- */
222
- loadManifest(dir?: string): Promise<IntegTestSuite | LegacyIntegTestSuite>;
223
223
  cleanup(): void;
224
224
  /**
225
225
  * If there are any destructive changes to a stack then this will record
@@ -1 +1 @@
1
- {"version":3,"file":"cdk-integ-helper.d.ts","sourceRoot":"","sources":["cdk-integ-helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cdk-integ-helper.d.ts","sourceRoot":"","sources":["cdk-integ-helper.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAIrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAM3D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAEpB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAE9B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;;;;;OAKG;IACH,QAAQ,CAAC,iCAAiC,CAAC,EAAE,OAAO,CAAC;CACtD;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,GAAG,KAAK,GAAG,WAAW,CAAC;AAE7D;;;;;;;;;GASG;AACH,qBAAa,cAAc;IACzB;;;;OAIG;WACW,MAAM,CAAC,OAAO,EAAE,qBAAqB;IAInD;;OAEG;IACH,SAAgB,iBAAiB,EAAE,MAAM,CAAC;IAE1C;;OAEG;IACH,SAAgB,GAAG,EAAE,IAAI,CAAC;IAE1B;;OAEG;IACH,SAAgB,QAAQ,EAAE,MAAM,CAAC;IAEjC;;;;OAIG;IACH,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,SAAgB,cAAc,EAAE,MAAM,CAAC;IAEvC;;;OAGG;IACH,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IAEjC;;OAEG;IACH,SAAgB,WAAW,EAAE,iBAAiB,CAI5C;IAEF;;;;OAIG;IACH,SAAgB,oBAAoB,EAAE,MAAM,CAAC;IAE7C;;OAEG;IACH,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IAE9B,mBAAmB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACjD,OAAO,CAAC,aAAa,CAAC,CAAsB;IAC5C,OAAO,CAAC,kBAAkB,CAAC,CAAwC;IACnE,OAAO,CAAC,eAAe,CAAC,CAA4B;IACpD,OAAO,CAAC,oBAAoB,CAAC,CAAsB;IAEnD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAU;IAEjD;;OAEG;IACH,OAAO,CAAC,aAAa,CAAC,CAEpB;IAEF;;OAEG;IACH,OAAO;IAkBP;;;;;OAKG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7C,OAAO,KAAK,YAAY,GAKvB;IAED;;;;OAIG;IACI,4BAA4B,CAAC,aAAa,EAAE,mBAAmB,GAAG,IAAI;IAI7E;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,GAAG,SAAS,CAAC;IAKjF;;;;OAIG;YACW,sBAAsB;IASpC;;;;;;;;;;;;;;;;;;;OAmBG;YACW,mBAAmB;IAsB1B,uBAAuB;IAiB9B;;OAEG;IACI,WAAW,IAAI,OAAO;IAI7B;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,cAAc,GAAG,oBAAoB,GAAG,SAAS,CAAC;IAQ/E,cAAc,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAmBjE;;OAEG;YACW,eAAe;IAmDtB,OAAO,IAAI,IAAI;IAStB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAgBvB;;;;;;;;OAQG;YACW,wBAAwB;IAmBtC;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IAWrC;;;;;;;;;OASG;IACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5C;;;;OAIG;YACW,qBAAqB;IAmB5B,UAAU,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CA2BhF;AAID,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CjC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEjD;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,oBAAoB,CAAC;IAC/D,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC"}
@@ -111,7 +111,7 @@ class CdkIntegHelper {
111
111
  *
112
112
  * Relative to cwd.
113
113
  */
114
- cdkOutDir;
114
+ temporarySnapshotDir;
115
115
  /**
116
116
  * The profile to use for the CDK CLI calls
117
117
  */
@@ -125,6 +125,7 @@ class CdkIntegHelper {
125
125
  _expectedTestSuite;
126
126
  _actualSnapshot;
127
127
  _legacyEnableLookups;
128
+ deleteSynthDirectories;
128
129
  /**
129
130
  * Fields that require an async context to initialize.
130
131
  */
@@ -141,9 +142,10 @@ class CdkIntegHelper {
141
142
  this.profile = options.profile;
142
143
  this.showOutput = options.showOutput ?? false;
143
144
  this.cdk = options.cdk ?? (0, engine_1.makeEngine)(options);
144
- this.cdkOutDir = options.integOutDir ?? this.test.temporaryOutputDir;
145
+ this.temporarySnapshotDir = options.integOutDir ?? this.test.temporaryOutputDir;
145
146
  const testRunCommand = this.test.appCommand;
146
147
  this.cdkApp = testRunCommand.replace('{filePath}', path.relative(this.directory, this.test.fileName));
148
+ this.deleteSynthDirectories = !options.testingUsingMocksLeaveDirectories;
147
149
  }
148
150
  /**
149
151
  * Async initialization; copy information from an async context into variables so we can access them synchronously later.
@@ -186,11 +188,11 @@ class CdkIntegHelper {
186
188
  * This will synth and then load the integration test manifest
187
189
  */
188
190
  async generateActualSnapshot() {
189
- await this.synthActualSnapshot(this.cdkOutDir);
190
- const manifest = await this.loadManifest(this.cdkOutDir);
191
+ await this.synthActualSnapshot(this.temporarySnapshotDir);
192
+ const manifest = await this._loadManifest(this.temporarySnapshotDir);
191
193
  return {
192
194
  testDefinition: manifest,
193
- snapshotDirectory: this.cdkOutDir,
195
+ snapshotDirectory: this.temporarySnapshotDir,
194
196
  };
195
197
  }
196
198
  /**
@@ -217,11 +219,18 @@ class CdkIntegHelper {
217
219
  if (this._legacyEnableLookups === undefined) {
218
220
  throw new Error('Must call configureLegacyEnableLookups before generating snapshots');
219
221
  }
222
+ const output = path.relative(this.directory, outputDirectory);
223
+ // Remove the target directory, so that we don't have stale files from
224
+ // previous synths. Also, the runner will re-use a directory that already
225
+ // exists and we want force recreation (unless we are unit testing).
226
+ if (this.deleteSynthDirectories) {
227
+ await fs.rm(output, { recursive: true, force: true });
228
+ }
220
229
  await this.cdk.synth({
221
230
  app: this.cdkApp,
222
- context: await this.getContext(this._legacyEnableLookups !== false ? exports.DEFAULT_SYNTH_OPTIONS.context : {}),
231
+ context: this.getContext(this._legacyEnableLookups !== false ? exports.DEFAULT_SYNTH_OPTIONS.context : {}),
223
232
  env: exports.DEFAULT_SYNTH_OPTIONS.env,
224
- output: path.relative(this.directory, outputDirectory),
233
+ output,
225
234
  });
226
235
  }
227
236
  actualSynthReproCommand() {
@@ -235,7 +244,7 @@ class CdkIntegHelper {
235
244
  '-a',
236
245
  `'${this.cdkApp}'`,
237
246
  '-o',
238
- `'${this.cdkOutDir}'`,
247
+ `'${this.temporarySnapshotDir}'`,
239
248
  ...Object.entries(this.getContext(exports.DEFAULT_SYNTH_OPTIONS.context)).flatMap(([k, v]) => typeof v !== 'object' ? [`-c '${k}=${v}'`] : []),
240
249
  ];
241
250
  }
@@ -251,7 +260,7 @@ class CdkIntegHelper {
251
260
  async expectedTestSuite() {
252
261
  await this.asyncInitialize();
253
262
  if (!this._expectedTestSuite && this.hasSnapshot()) {
254
- this._expectedTestSuite = await this.loadManifest();
263
+ this._expectedTestSuite = await this._loadManifest(this.goldenSnapshotDir);
255
264
  }
256
265
  return this._expectedTestSuite;
257
266
  }
@@ -284,10 +293,12 @@ class CdkIntegHelper {
284
293
  * First we try and load the manifest from the integ manifest (i.e. integ.json)
285
294
  * from the cloud assembly. If it doesn't exist, then we fallback to the
286
295
  * "legacy mode" and create a manifest from pragma
296
+ *
297
+ * @internal
287
298
  */
288
- async loadManifest(dir) {
299
+ async _loadManifest(dir) {
289
300
  await this.asyncInitialize();
290
- const manifest = dir ?? this.goldenSnapshotDir;
301
+ const manifest = dir;
291
302
  try {
292
303
  const testSuite = integ_test_suite_1.IntegTestSuite.fromPath(manifest);
293
304
  return testSuite;
@@ -310,7 +321,7 @@ class CdkIntegHelper {
310
321
  all: true,
311
322
  app: this.cdkApp,
312
323
  profile: this.profile,
313
- output: path.relative(this.directory, this.cdkOutDir),
324
+ output: path.relative(this.directory, this.temporarySnapshotDir),
314
325
  },
315
326
  });
316
327
  this.legacyContext = integ_test_suite_1.LegacyIntegTestSuite.getPragmaContext(this.test.fileName);
@@ -318,7 +329,7 @@ class CdkIntegHelper {
318
329
  }
319
330
  }
320
331
  cleanup() {
321
- const cdkOutPath = this.cdkOutDir;
332
+ const cdkOutPath = this.temporarySnapshotDir;
322
333
  if (fs.existsSync(cdkOutPath)) {
323
334
  fs.removeSync(cdkOutPath);
324
335
  }
@@ -399,9 +410,6 @@ class CdkIntegHelper {
399
410
  */
400
411
  async createSnapshot() {
401
412
  await this.asyncInitialize();
402
- if (fs.existsSync(this.goldenSnapshotDir)) {
403
- fs.removeSync(this.goldenSnapshotDir);
404
- }
405
413
  // TODO: If we're clever, we should be able to reuse the snapshot that was
406
414
  // generated during the test invalidation check and avoid the below synth.
407
415
  // But that gets run in a completely different lifecycle and it might not
@@ -514,4 +522,4 @@ exports.DEFAULT_SYNTH_OPTIONS = {
514
522
  function currentlyRecommendedAwsCdkLibFlags() {
515
523
  return recommendedFlagsFile;
516
524
  }
517
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWludGVnLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1pbnRlZy1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcW1CQSxnRkFFQztBQXZtQkQsa0RBQWtEO0FBQ2xELDJDQUE2QjtBQUM3QixvRUFBcUY7QUFFckYsNkNBQStCO0FBQy9CLHlEQUEwRTtBQUUxRSx3RkFBMEU7QUFDMUUsb0NBQW1DO0FBQ25DLHFDQUFzQztBQUV0QyxrREFBb0M7QUFFcEMsNkRBQWtFO0FBRWxFLDZEQUEyRDtBQUczRCxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDO0FBOEVyRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBOEI7UUFDakQsT0FBTyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDYSxpQkFBaUIsQ0FBUztJQUUxQzs7T0FFRztJQUNhLEdBQUcsQ0FBTztJQUUxQjs7T0FFRztJQUNhLFFBQVEsQ0FBUztJQUVqQzs7OztPQUlHO0lBQ2EsTUFBTSxDQUFTO0lBRS9COzs7T0FHRztJQUNhLGNBQWMsQ0FBUztJQUV2Qzs7O09BR0c7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYyxJQUFJLENBQVk7SUFFakM7O09BRUc7SUFDYSxXQUFXLEdBQXNCO1FBQy9DLFlBQVksRUFBRSxLQUFLO1FBQ25CLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLGdCQUFnQixFQUFFLEtBQUs7S0FDeEIsQ0FBQztJQUVGOzs7O09BSUc7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYSxPQUFPLENBQVU7SUFFakM7O09BRUc7SUFDYyxVQUFVLENBQVU7SUFFOUIsbUJBQW1CLENBQXVCO0lBQ3pDLGFBQWEsQ0FBdUI7SUFDcEMsa0JB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Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isa0NBQWtDO0lBQ2hELE9BQU8sb0JBQW9CLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBjZGtsYWJzL25vLWxpdGVyYWwtcGFydGl0aW9uICovXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQVZBSUxBQklMSVRZX1pPTkVfRkFMTEJBQ0tfQ09OVEVYVF9LRVkgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0IHR5cGUgeyBUZXN0Q2FzZSwgRGVmYXVsdENka09wdGlvbnMgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgSW50ZWdUZXN0U3VpdGUsIExlZ2FjeUludGVnVGVzdFN1aXRlIH0gZnJvbSAnLi9pbnRlZy10ZXN0LXN1aXRlJztcbmltcG9ydCB0eXBlIHsgSW50ZWdUZXN0IH0gZnJvbSAnLi9pbnRlZ3JhdGlvbi10ZXN0cyc7XG5pbXBvcnQgKiBhcyByZWNvbW1lbmRlZEZsYWdzRmlsZSBmcm9tICcuLi9yZWNvbW1lbmRlZC1mZWF0dXJlLWZsYWdzLmpzb24nO1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IG1ha2VFbmdpbmUgfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQgdHlwZSB7IElDZGsgfSBmcm9tICcuLi9lbmdpbmVzL2Nkay1pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0VHJhY2UgfSBmcm9tICcuL3ByaXZhdGUvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHsgQXNzZW1ibHlNYW5pZmVzdFJlYWRlciB9IGZyb20gJy4vcHJpdmF0ZS9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgdHlwZSB7IERlc3RydWN0aXZlQ2hhbmdlIH0gZnJvbSAnLi4vd29ya2Vycy9jb21tb24nO1xuaW1wb3J0IHsgTm9NYW5pZmVzdEVycm9yIH0gZnJvbSAnLi9wcml2YXRlL2ludGVnLW1hbmlmZXN0JztcbmltcG9ydCB0eXBlIHsgQ2RrQ29udGV4dCB9IGZyb20gJy4vcHJpdmF0ZS90ZXN0LXNwZWNpZmljLWNvbnRleHQnO1xuXG5jb25zdCBERVNUUlVDVElWRV9DSEFOR0VTID0gJyEhREVTVFJVQ1RJVkVfQ0hBTkdFUzonO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIGludGVnIGhlbHBlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENka0ludGVnSGVscGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVzdCB0byBydW5cbiAgICovXG4gIHJlYWRvbmx5IHRlc3Q6IEludGVnVGVzdDtcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbiB3aGVyZSB0aGUgdGVzdCBzaG91bGQgYmUgZGVwbG95ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIHByb2ZpbGUgdG8gdXNlIHdoZW4gaW52b2tpbmcgdGhlIENESyBDTElcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwcm9maWxlIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHQgcHJvZmlsZSBpcyB1c2VkXG4gICAqL1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlXG4gICAqIHRvIHRoZSBDREsgQ0xJXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB0bXAgY2RrLm91dCBkaXJlY3RvcnlcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkaXJlY3Rvcnkgd2lsbCBiZSBgY2RrLWludGVnLm91dC4ke3Rlc3ROYW1lfWBcbiAgICovXG4gIHJlYWRvbmx5IGludGVnT3V0RGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbnN0YW5jZSBvZiB0aGUgQ0RLIFRvb2xraXQgRW5naW5lIHRvIHVzZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJhc2VkIG9uIGBlbmdpbmVgIG9wdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY2RrPzogSUNkaztcblxuICAvKipcbiAgICogU2hvdyBvdXRwdXQgZnJvbSBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzaG93T3V0cHV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlIHRoZSBpbmRpY2F0ZWQgcHJveHlcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwcm94eVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gQ0EgY2VydGlmaWNhdGUgdG8gdXNlIHdoZW4gdmFsaWRhdGluZyBIVFRQUyByZXF1ZXN0c1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgQ0EgYnVuZGxlXG4gICAqL1xuICByZWFkb25seSBjYUJ1bmRsZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hldGhlciB0byBzeW50aGVzaXplIHRoZSBhY3R1YWwgc25hcHNob3Qgd2l0aCBsb29rdXBzIGVuYWJsZWQgb3Igbm90LlxuICpcbiAqIElmIGVpdGhlciBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2Ugc2VuZCBjb250ZXh0IGluIG9yIG5vdCB3aGlsZSBzeW50aGVzaXppbmcsXG4gKiBhbmQgaWYgdGhlIGdlbmVyYXRlZCBzbmFwc2hvdCB0ZXN0IGRlZmluaXRpb24gcmVxdWVzdHMgYSBkaWZmZXJlbnQgdmFsdWUgd2VcbiAqIHdpbGwgc3ludGggYWdhaW4uXG4gKlxuICogRm9yIGBkb250LWNhcmVgLCB3ZSBkbyBzZW5kIGluIHRoZSBjb250ZXh0IGJ1dCB3ZSBuZXZlciByZXN5bnRoLlxuICovXG5leHBvcnQgdHlwZSBMZWdhY3lFbmFibGVMb29rdXBzID0gdHJ1ZSB8IGZhbHNlIHwgJ2RvbnQtY2FyZSc7XG5cbi8qKlxuICogQ2xhc3Mgd2l0aCBzb21lIGhlbHBlciByb3V0aW5lcyBmb3IgcnVubmluZyBDREsgc25hcHNob3RzIGFuZCBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBBIFwiZ29sZGVuIHNuYXBzaG90XCIgaXMgdGhlIHNuYXBzaG90IHRoYXQgaXMgc3RvcmVkIHBlcm1hbmVudGx5IGluIHZlcnNpb25cbiAqIGNvbnRyb2wsIHRoYXQgbmV3IHJ1bnMgYXJlIGNvbXBhcmVkIGFnYWluc3QgKHN0b3JlZCBpbiBhIGRpcmVjdG9yeSBuYW1lZFxuICogYDx0ZXN0LW5hbWU+LnNuYXBzaG90YCkuXG4gKlxuICogVGhpcyBpcyBhcyBvcHBvc2VkIHRvIG90aGVyIHNuYXBzaG90cywgd2hpY2ggY2FuIGJlIGdlbmVyYXRlZCBmb3IgZXhhbXBsZVxuICogdGVtcG9yYXJpbHkgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCB0byBjb21wYXJlIGFnYWlucyB0aGUgZ29sZGVuIHNuYXBzaG90LlxuICovXG5leHBvcnQgY2xhc3MgQ2RrSW50ZWdIZWxwZXIge1xuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDZGtJbnRlZ0hlbHBlci5cbiAgICpcbiAgICogSGlkaW5nIHRoZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluaGVyaXRhbmNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9uczogQ2RrSW50ZWdIZWxwZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBDZGtJbnRlZ0hlbHBlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBnb2xkZW4gc25hcHNob3Qgd2lsbCBiZSBzdG9yZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnb2xkZW5TbmFwc2hvdERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgQ0RLICBDTElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGs6IElDZGs7XG5cbiAgLyoqXG4gICAqIFByZXR0eSBuYW1lIG9mIHRoZSB0ZXN0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGVzdE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHVzZWQgaW4gdGhlICctLWFwcCcgQ0xJIHBhcmFtZXRlclxuICAgKlxuICAgKiBQYXRoIHRvIHRoZSBpbnRlZyB0ZXN0IHNvdXJjZSBmaWxlLCByZWxhdGl2ZSB0byBgdGhpcy5kaXJlY3RvcnlgLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka0FwcDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB3aGVyZSB0aGUgYGNkay5jb250ZXh0Lmpzb25gIGZpbGVcbiAgICogd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrQ29udGV4dFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoYXQgdGhlIGludGVncmF0aW9uIHRlc3RzIHdpbGwgYmVcbiAgICogZXhlY3V0ZWQgZnJvbVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVzdCB0byBydW5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdDogSW50ZWdUZXN0O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgQ0RLIENMSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRBcmdzOiBEZWZhdWx0Q2RrT3B0aW9ucyA9IHtcbiAgICBwYXRoTWV0YWRhdGE6IGZhbHNlLFxuICAgIGFzc2V0TWV0YWRhdGE6IGZhbHNlLFxuICAgIHZlcnNpb25SZXBvcnRpbmc6IGZhbHNlLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBDREsgd2lsbCBiZSBzeW50aGVkIHRvXG4gICAqXG4gICAqIFJlbGF0aXZlIHRvIGN3ZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGtPdXREaXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb2ZpbGUgdG8gdXNlIGZvciB0aGUgQ0RLIENMSSBjYWxsc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNob3cgb3V0cHV0IGZyb20gdGhlIGludGVnIHRlc3QgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzaG93T3V0cHV0OiBib29sZWFuO1xuXG4gIHB1YmxpYyBfZGVzdHJ1Y3RpdmVDaGFuZ2VzPzogRGVzdHJ1Y3RpdmVDaGFuZ2VbXTtcbiAgcHJpdmF0ZSBsZWdhY3lDb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcHJpdmF0ZSBfZXhwZWN0ZWRUZXN0U3VpdGU/OiBJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlO1xuICBwcml2YXRlIF9hY3R1YWxTbmFwc2hvdD86IFNuYXBzaG90QW5kVGVzdERlZmluaXRpb247XG4gIHByaXZhdGUgX2xlZ2FjeUVuYWJsZUxvb2t1cHM/OiBMZWdhY3lFbmFibGVMb29rdXBzO1xuXG4gIC8qKlxuICAgKiBGaWVsZHMgdGhhdCByZXF1aXJlIGFuIGFzeW5jIGNvbnRleHQgdG8gaW5pdGlhbGl6ZS5cbiAgICovXG4gIHByaXZhdGUgX2FzeW5jTWVtYmVycz86IHtcbiAgICB0ZXN0U3BlY2lmaWNDb250ZXh0PzogQ2RrQ29udGV4dDtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluaGVyaXRhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihvcHRpb25zOiBDZGtJbnRlZ0hlbHBlck9wdGlvbnMpIHtcbiAgICB0aGlzLnRlc3QgPSBvcHRpb25zLnRlc3Q7XG4gICAgdGhpcy5kaXJlY3RvcnkgPSB0aGlzLnRlc3QuZGlyZWN0b3J5O1xuICAgIHRoaXMudGVzdE5hbWUgPSB0aGlzLnRlc3QudGVzdE5hbWU7XG4gICAgdGhpcy5nb2xkZW5TbmFwc2hvdERpciA9IHRoaXMudGVzdC5zbmFwc2hvdERpcjtcbiAgICB0aGlzLmNka0NvbnRleHRQYXRoID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnY2RrLmNvbnRleHQuanNvbicpO1xuICAgIHRoaXMucHJvZmlsZSA9IG9wdGlvbnMucHJvZmlsZTtcbiAgICB0aGlzLnNob3dPdXRwdXQgPSBvcHRpb25zLnNob3dPdXRwdXQgPz8gZmFsc2U7XG5cbiAgICB0aGlzLmNkayA9IG9wdGlvbnMuY2RrID8/IG1ha2VFbmdpbmUob3B0aW9ucyk7XG4gICAgdGhpcy5jZGtPdXREaXIgPSBvcHRpb25zLmludGVnT3V0RGlyID8/IHRoaXMudGVzdC50ZW1wb3JhcnlPdXRwdXREaXI7XG5cbiAgICBjb25zdCB0ZXN0UnVuQ29tbWFuZCA9IHRoaXMudGVzdC5hcHBDb21tYW5kO1xuICAgIHRoaXMuY2RrQXBwID0gdGVzdFJ1bkNvbW1hbmQucmVwbGFjZSgne2ZpbGVQYXRofScsIHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMudGVzdC5maWxlTmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGluaXRpYWxpemF0aW9uOyBjb3B5IGluZm9ybWF0aW9uIGZyb20gYW4gYXN5bmMgY29udGV4dCBpbnRvIHZhcmlhYmxlcyBzbyB3ZSBjYW4gYWNjZXNzIHRoZW0gc3luY2hyb25vdXNseSBsYXRlci5cbiAgICpcbiAgICogV2UgY2FsbCB0aGlzIGF1dG9tYXRpY2FsbHkgaW4gYWxsIHB1YmxpYyBhc3luYyBtZW1iZXJzLCBidXQgaWYgYSBjb25zdW1lciB3YW50cyB0byBhY2Nlc3MgdGhpcyBjb250ZXh0IHN5bmNocm9ub3VzbHlcbiAgICogd2l0aG91dCBjYWxsaW5nIGFuIGFzeW5jIG1lbWJlcnMgZmlyc3QsIGl0IG5lZWRzIHRvIGNhbGwgdGhpcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhc3luY0luaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2FzeW5jTWVtYmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2FzeW5jTWVtYmVycyA9IHtcbiAgICAgIHRlc3RTcGVjaWZpY0NvbnRleHQ6IGF3YWl0IHRoaXMudGVzdC50ZXN0U3BlY2lmaWNDb250ZXh0KCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGFzeW5jTWVtYmVycygpOiBOb25OdWxsYWJsZTxDZGtJbnRlZ0hlbHBlclsnX2FzeW5jTWVtYmVycyddPiB7XG4gICAgaWYgKCF0aGlzLl9hc3luY01lbWJlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXN5bmMgY29udGV4dCBub3QgaW5pdGlhbGl6ZWQuIENhbGwgYXN5bmNJbml0aWFsaXplKCkgZmlyc3QuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hc3luY01lbWJlcnM7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBsZWdhY3kgZW5hYmxlTG9va3VwcyB2YWx1ZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBhY3R1YWwgc25hcHNob3QuXG4gICAqXG4gICAqIE11c3QgYmUgc2V0IGJlZm9yZSB1c2luZyBzbmFwc2hvdCBtZXRob2RzLlxuICAgKi9cbiAgcHVibGljIGNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMoZW5hYmxlTG9va3VwczogTGVnYWN5RW5hYmxlTG9va3Vwcyk6IHZvaWQge1xuICAgIHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgPSBlbmFibGVMb29rdXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbGlzdCBvZiBhY3R1YWwgKGkuZS4gbmV3KSB0ZXN0IGNhc2VzIGZvciB0aGlzIGludGVncmF0aW9uIHRlc3RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3R1YWxUZXN0cygpOiBQcm9taXNlPHsgW3Rlc3ROYW1lOiBzdHJpbmddOiBUZXN0Q2FzZSB9IHwgdW5kZWZpbmVkPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCkpLnRlc3RTdWl0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyBcImFjdHVhbFwiIHNuYXBzaG90IHdoaWNoIHdpbGwgYmUgY29tcGFyZWQgdG8gdGhlXG4gICAqIGV4aXN0aW5nIFwiZXhwZWN0ZWRcIiBzbmFwc2hvdFxuICAgKiBUaGlzIHdpbGwgc3ludGggYW5kIHRoZW4gbG9hZCB0aGUgaW50ZWdyYXRpb24gdGVzdCBtYW5pZmVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFjdHVhbFNuYXBzaG90KCk6IFByb21pc2U8U25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbj4ge1xuICAgIGF3YWl0IHRoaXMuc3ludGhBY3R1YWxTbmFwc2hvdCh0aGlzLmNka091dERpcik7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCB0aGlzLmxvYWRNYW5pZmVzdCh0aGlzLmNka091dERpcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlc3REZWZpbml0aW9uOiBtYW5pZmVzdCxcbiAgICAgIHNuYXBzaG90RGlyZWN0b3J5OiB0aGlzLmNka091dERpcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIHRoZSBhY3R1YWwgYXBwbGljYXRpb24gdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSwgZm9yIHB1cnBvc2VzIG9mIGdlbmVyYXRpbmcvdmFsaWRhdGluZyBhIHNuYXBzaG90XG4gICAqXG4gICAqIGBsZWdhY3lFbmFibGVMb29rdXBzYCBpcyB0byBwcmVzZXJ2ZSBoaXN0b3JpY2FsIGJlaGF2aW9yIGZvciBhIHdoaWxlOlxuICAgKiB0cmFkaXRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24gd291bGQgb25seSBiZSBzZWVkZWQgd2l0aCBjb250ZXh0IGlmXG4gICAqIGBlbmFibGVMb29rdXBzYCB3YXMgdHJ1ZSwgYW5kIHRoaXMgaW5mb3JtYXRpb24gd291bGQgY29tZSBmcm9tIHRoZSB0ZXN0XG4gICAqIGRlZmluaXRpb24uXG4gICAqXG4gICAqIC0gU2luY2UgdGhlIHRlc3QgZGVmaW5pdGlvbiBjb21lcyBmcm9tIGluc2lkZSB0aGUgYXBwLCB0aGlzIHJlcXVpcmVzIGFcbiAgICogICBzeW50aCBqdXN0IHRvIGdldCB0aGUgdGVzdCBkZWZpbml0aW9uLCBhbmQgdGhlbiBhbm90aGVyIHN5bnRoIHRvIGdlbmVyYXRlXG4gICAqICAgdGhlIGFjdHVhbCBzbmFwc2hvdCB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHQsIHdoaWNoIGlzIHRpbWUgY29uc3VtaW5nLlxuICAgKiAtIEdpdmVuIHRoYXQgdGhlIGNvbnRleHQgaXMgZml4ZWQgYW5kIGZha2UsIGl0IGNvdWxkIGFsd2F5cyBoYXZlIGJlZW4gcGFzc2VkLlxuICAgKlxuICAgKiBIb3dldmVyLCB0aGUgc25hcHNob3QgY29udGVudHMgdGhlbXNlbHZlcyBkZXBlbmQgb24gdGhlIGNvbnRleHQgZmxhZywgYW5kIGNoYW5naW5nXG4gICAqIHRoaXMgYmVoYXZpb3Igbm93IGludmFsaWRhdGVzIGFsbCBzbmFwc2hvdHMgZXZlcnl3aGVyZSwgd2hpY2ggaXMgYW5ub3lpbmcgZm9yIHVwZ3JhZGluZy5cbiAgICpcbiAgICogU28gd2Ugd2lsbCB1c2UgdGhlIGJlaGF2aW9yIGZyb20gdGhlIEdPTERFTiBTTkFQU0hPVCdzIHRlc3QgZGVmaW5pdGlvbiB0b1xuICAgKiBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHRoZSBjb250ZXh0LCBhbmQgaWYgdGhlIG5ldyBhY3R1YWwgc25hcHNob3QgaGFzIGFcbiAgICogZGlmZmVyZW50IHZhbHVlIGZvciBgZW5hYmxlTG9va3Vwc2AsIHdlIHdpbGwgdGhyb3cgYXdheSB0aGUgb2xkIHNuYXBzaG90IGFuZCBzeW50aCBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3ludGhBY3R1YWxTbmFwc2hvdChvdXRwdXREaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBjYWxsIGNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMgYmVmb3JlIGdlbmVyYXRpbmcgc25hcHNob3RzJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jZGsuc3ludGgoe1xuICAgICAgYXBwOiB0aGlzLmNka0FwcCxcbiAgICAgIGNvbnRleHQ6IGF3YWl0IHRoaXMuZ2V0Q29udGV4dCh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzICE9PSBmYWxzZSA/IERFRkFVTFRfU1lOVEhfT1BUSU9OUy5jb250ZXh0IDoge30pLFxuICAgICAgZW52OiBERUZBVUxUX1NZTlRIX09QVElPTlMuZW52LFxuICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCBvdXRwdXREaXJlY3RvcnkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdHVhbFN5bnRoUmVwcm9Db21tYW5kKCkge1xuICAgIC8vIFNob3cgdGhlIGNvbW1hbmQgbmVjZXNzYXJ5IHRvIHJlcHJvIHRoaXNcbiAgICBjb25zdCBlbnZTZXQgPSBPYmplY3QuZW50cmllcyhERUZBVUxUX1NZTlRIX09QVElPTlMuZW52KS5tYXAoKFtrLCB2XSkgPT4gYCR7a309JyR7dn0nYCk7XG4gICAgY29uc3QgZW52Q21kID0gZW52U2V0Lmxlbmd0aCA+IDAgPyBbJ2VudicsIC4uLmVudlNldF0gOiBbXTtcblxuICAgIHJldHVybiBbXG4gICAgICAuLi5lbnZDbWQsXG4gICAgICAnY2RrJyxcbiAgICAgICdzeW50aCcsXG4gICAgICAnLWEnLFxuICAgICAgYCcke3RoaXMuY2RrQXBwfSdgLFxuICAgICAgJy1vJyxcbiAgICAgIGAnJHt0aGlzLmNka091dERpcn0nYCxcbiAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0Q29udGV4dChERUZBVUxUX1NZTlRIX09QVElPTlMuY29udGV4dCkpLmZsYXRNYXAoKFtrLCB2XSkgPT4gdHlwZW9mIHYgIT09ICdvYmplY3QnID8gW2AtYyAnJHtrfT0ke3Z9J2BdIDogW10pLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgc25hcHNob3QgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdGVzdFxuICAgKi9cbiAgcHVibGljIGhhc1NuYXBzaG90KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHN1aXRlIGZyb20gdGhlIGV4aXN0aW5nIHNuYXBzaG90XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhwZWN0ZWRUZXN0U3VpdGUoKTogUHJvbWlzZTxJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICBpZiAoIXRoaXMuX2V4cGVjdGVkVGVzdFN1aXRlICYmIHRoaXMuaGFzU25hcHNob3QoKSkge1xuICAgICAgdGhpcy5fZXhwZWN0ZWRUZXN0U3VpdGUgPSBhd2FpdCB0aGlzLmxvYWRNYW5pZmVzdCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXhwZWN0ZWRUZXN0U3VpdGU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWN0dWFsU25hcHNob3QoKTogUHJvbWlzZTxTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICBpZiAoIXRoaXMuX2FjdHVhbFNuYXBzaG90KSB7XG4gICAgICB0aGlzLl9hY3R1YWxTbmFwc2hvdCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVBY3R1YWxTbmFwc2hvdCgpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZW5hYmxlTG9va3VwcyB2YWx1ZSBoYXMgY2hhbmdlZCBiZXR3ZWVuIHRoZSBnb2xkZW5cbiAgICAgIC8vIHNuYXBzaG90IGFuZCB0aGUgYWN0dWFsIHNuYXBzaG90LiBJZiBpdCBoYXMsIHdlIG5lZWQgdG8gcmUtc3ludGggdGhlXG4gICAgICAvLyBhY3R1YWwgc25hcHNob3Qgd2l0aCB0aGUgbmV3IGVuYWJsZUxvb2t1cHMgdmFsdWUuXG4gICAgICAvL1xuICAgICAgLy8gU2VlIGBzeW50aEFjdHVhbFNuYXBzaG90YCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuXG4gICAgICBjb25zdCBhY3R1YWxFbmFibGVMb29rdXBzID0gdGhpcy5fYWN0dWFsU25hcHNob3QudGVzdERlZmluaXRpb24uZW5hYmxlTG9va3VwcyA/PyBmYWxzZTtcbiAgICAgIGlmIChhY3R1YWxFbmFibGVMb29rdXBzICE9PSB0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzICYmIHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgIT09ICdkb250LWNhcmUnKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcyhhY3R1YWxFbmFibGVMb29rdXBzKTtcbiAgICAgICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQWN0dWFsU25hcHNob3QoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FjdHVhbFNuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHN1aXRlIGZyb20gdGhlIG5ldyBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFjdHVhbFRlc3RTdWl0ZSgpOiBQcm9taXNlPEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWN0dWFsU25hcHNob3QoKSkudGVzdERlZmluaXRpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW50ZWcgbWFuaWZlc3Qgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb25cbiAgICogb24gaG93IHRvIGV4ZWN1dGUgdGhlIHRlc3RzXG4gICAqIEZpcnN0IHdlIHRyeSBhbmQgbG9hZCB0aGUgbWFuaWZlc3QgZnJvbSB0aGUgaW50ZWcgbWFuaWZlc3QgKGkuZS4gaW50ZWcuanNvbilcbiAgICogZnJvbSB0aGUgY2xvdWQgYXNzZW1ibHkuIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4gd2UgZmFsbGJhY2sgdG8gdGhlXG4gICAqIFwibGVnYWN5IG1vZGVcIiBhbmQgY3JlYXRlIGEgbWFuaWZlc3QgZnJvbSBwcmFnbWFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkTWFuaWZlc3QoZGlyPzogc3RyaW5nKTogUHJvbWlzZTxJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGRpciA/PyB0aGlzLmdvbGRlblNuYXBzaG90RGlyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZXN0U3VpdGUgPSBJbnRlZ1Rlc3RTdWl0ZS5mcm9tUGF0aChtYW5pZmVzdCk7XG4gICAgICByZXR1cm4gdGVzdFN1aXRlO1xuICAgIH0gY2F0Y2ggKG1vZGVybkVycm9yOiBhbnkpIHtcbiAgICAgIC8vIE9ubHkgYXR0ZW1wdCBsZWdhY3kgdGVzdCBjYXNlIGlmIHRoZSBpbnRlZyB0ZXN0IG1hbmlmZXN0IHdhcyBub3QgZm91bmRcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgZXJyb3JzLCBlLmcuIHdoZW4gcGFyc2luZyB0aGUgbWFuaWZlc3QgZmFpbHMsIHdlIGFib3J0LlxuICAgICAgaWYgKCEobW9kZXJuRXJyb3IgaW5zdGFuY2VvZiBOb01hbmlmZXN0RXJyb3IpKSB7XG4gICAgICAgIHRocm93IG1vZGVybkVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG93T3V0cHV0KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcbiAgICAgICAgICBcIkZhaWxlZCB0byBsb2FkIGludGVnIHRlc3QgbWFuaWZlc3QgZm9yICclcycuIEF0dGVtcHRpbmcgYXMgZGVwcmVjYXRlZCBsZWdhY3kgdGVzdCBpbnN0ZWFkLiBFcnJvciB3YXM6ICVzXCIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgbW9kZXJuRXJyb3IubWVzc2FnZSA/PyBTdHJpbmcobW9kZXJuRXJyb3IpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZXN0Q2FzZXMgPSBhd2FpdCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZS5mcm9tTGVnYWN5KHtcbiAgICAgICAgY2RrOiB0aGlzLmNkayxcbiAgICAgICAgdGVzdE5hbWU6IHRoaXMudGVzdC5ub3JtYWxpemVkVGVzdE5hbWUsXG4gICAgICAgIGludGVnU291cmNlRmlsZVBhdGg6IHRoaXMudGVzdC5maWxlTmFtZSxcbiAgICAgICAgbGlzdE9wdGlvbnM6IHtcbiAgICAgICAgICAuLi50aGlzLmRlZmF1bHRBcmdzLFxuICAgICAgICAgIGFsbDogdHJ1ZSxcbiAgICAgICAgICBhcHA6IHRoaXMuY2RrQXBwLFxuICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sZWdhY3lDb250ZXh0ID0gTGVnYWN5SW50ZWdUZXN0U3VpdGUuZ2V0UHJhZ21hQ29udGV4dCh0aGlzLnRlc3QuZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRlc3RDYXNlcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICBjb25zdCBjZGtPdXRQYXRoID0gdGhpcy5jZGtPdXREaXI7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2RrT3V0UGF0aCkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoY2RrT3V0UGF0aCk7XG4gICAgfVxuICAgIC8vIENsZWFyIGNhY2hlXG4gICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlcmUgYXJlIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzIHRvIGEgc3RhY2sgdGhlbiB0aGlzIHdpbGwgcmVjb3JkXG4gICAqIHRob3NlIGluIHRoZSBtYW5pZmVzdC5qc29uIGZpbGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVHJhY2VEYXRhKCk6IE1hbmlmZXN0VHJhY2Uge1xuICAgIGNvbnN0IHRyYWNlRGF0YTogTWFuaWZlc3RUcmFjZSA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkZXN0cnVjdGl2ZUNoYW5nZXMgPSB0aGlzLl9kZXN0cnVjdGl2ZUNoYW5nZXMgPz8gW107XG4gICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgIGNvbnN0IHRyYWNlID0gdHJhY2VEYXRhLmdldChjaGFuZ2Uuc3RhY2tOYW1lKTtcbiAgICAgIGlmICh0cmFjZSkge1xuICAgICAgICB0cmFjZS5zZXQoY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2VEYXRhLnNldChjaGFuZ2Uuc3RhY2tOYW1lLCBuZXcgTWFwKFtcbiAgICAgICAgICBbY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWBdLFxuICAgICAgICBdKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNlRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBjYXNlcyB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byByZXRhaW4gdGhlIGFzc2V0cyxcbiAgICogZm9yIGV4YW1wbGUsIGlmIHRoZSBhc3NldHMgYXJlIHZlcnkgbGFyZ2UuXG4gICAqXG4gICAqIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIHVwZGF0ZSB3b3JrZmxvdyBmb3IgaW5kaXZpZHVhbCB0ZXN0XG4gICAqIGNhc2VzLCB0aGlzIG5lZWRzIHRvIGZpcnN0IGdldCBhIGxpc3Qgb2Ygc3RhY2tzIHRoYXQgaGF2ZSB0aGUgdXBkYXRlIHdvcmtmbG93XG4gICAqIGRpc2FibGVkIGFuZCB0aGVuIGRlbGV0ZSBhc3NldHMgdGhhdCByZWxhdGUgdG8gdGhhdCBzdGFjay4gSXQgZG9lcyB0aGF0XG4gICAqIGJ5IHJlYWRpbmcgdGhlIGFzc2V0IG1hbmlmZXN0IGZvciB0aGUgc3RhY2sgYW5kIGRlbGV0aW5nIHRoZSBhc3NldCBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlQXNzZXRzRnJvbVNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YWNrcyA9IChhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpKS5nZXRTdGFja3NXaXRob3V0VXBkYXRlV29ya2Zsb3coKSA/PyBbXTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgY29uc3QgYXNzZXRzID0gZmxhdHRlbihzdGFja3MubWFwKHN0YWNrID0+IHtcbiAgICAgIHJldHVybiBtYW5pZmVzdC5nZXRBc3NldExvY2F0aW9uc0ZvclN0YWNrKHN0YWNrKSA/PyBbXTtcbiAgICB9KSk7XG5cbiAgICBhc3NldHMuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBhc3NldCk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlTmFtZSkpIHtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmaWxlTmFtZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIGZzLnJlbW92ZVN5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBhc3NldCBjYWNoZSAoLmNhY2hlLykgZmlsZXMgZnJvbSB0aGUgc25hcHNob3QuXG4gICAqIFRoZXNlIGFyZSBhIGNhY2hlIG9mIHRoZSBhc3NldCB6aXBzLCBidXQgd2UgYXJlIGZpbmUgd2l0aFxuICAgKiByZS16aXBwaW5nIG9uIGRlcGxveVxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVBc3NldHNDYWNoZUZyb21TbmFwc2hvdCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBmaWxlKTtcbiAgICAgIGlmIChmcy5sc3RhdFN5bmMoZmlsZU5hbWUpLmlzRGlyZWN0b3J5KCkgJiYgZmlsZSA9PT0gJy5jYWNoZScpIHtcbiAgICAgICAgZnMuZW1wdHlEaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgICAgZnMucm1kaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIG5ldyBzbmFwc2hvdC5cbiAgICpcbiAgICogSWYgbG9va3VwcyBhcmUgZW5hYmxlZCwgdGhlbiB3ZSBuZWVkIGNyZWF0ZSB0aGUgc25hcHNob3QgYnkgc3ludGgnaW5nIGFnYWluXG4gICAqIHdpdGggdGhlIGR1bW15IGNvbnRleHQgc28gdGhhdCBlYWNoIHRpbWUgdGhlIHRlc3QgaXMgcnVuIG9uIGRpZmZlcmVudCBtYWNoaW5lc1xuICAgKiAoYW5kIHdpdGggZGlmZmVyZW50IGNvbnRleHQvZW52KSB0aGUgZGlmZiB3aWxsIG5vdCBjaGFuZ2UuXG4gICAqXG4gICAqIElmIGxvb2t1cHMgYXJlIGRpc2FibGVkICh3aGljaCBtZWFucyB0aGUgc3RhY2sgaXMgZW52IGFnbm9zdGljKSB0aGVuIGp1c3QgY29weVxuICAgKiB0aGUgYXNzZW1ibHkgdGhhdCB3YXMgb3V0cHV0IGJ5IHRoZSBkZXBsb3ltZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmdvbGRlblNuYXBzaG90RGlyKSkge1xuICAgICAgZnMucmVtb3ZlU3luYyh0aGlzLmdvbGRlblNuYXBzaG90RGlyKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBJZiB3ZSdyZSBjbGV2ZXIsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHJldXNlIHRoZSBzbmFwc2hvdCB0aGF0IHdhc1xuICAgIC8vIGdlbmVyYXRlZCBkdXJpbmcgdGhlIHRlc3QgaW52YWxpZGF0aW9uIGNoZWNrIGFuZCBhdm9pZCB0aGUgYmVsb3cgc3ludGguXG4gICAgLy8gQnV0IHRoYXQgZ2V0cyBydW4gaW4gYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBsaWZlY3ljbGUgYW5kIGl0IG1pZ2h0IG5vdFxuICAgIC8vIGV4aXN0LiBXZSdyZSBub3QgZGVhbGluZyB3aXRoIHRoYXQganVzdCB5ZXQuXG4gICAgYXdhaXQgdGhpcy5zeW50aEFjdHVhbFNuYXBzaG90KHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuXG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwR29sZGVuU25hcHNob3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHNvbWUgY2xlYW51cCBzdGVwcyBhZnRlciB0aGUgc25hcHNob3QgaXMgY3JlYXRlZFxuICAgKiBBbnl0aW1lIHRoZSBzbmFwc2hvdCBuZWVkcyB0byBiZSBtb2RpZmllZCBhZnRlciBjcmVhdGlvblxuICAgKiB0aGUgbG9naWMgc2hvdWxkIGxpdmUgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cEdvbGRlblNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbW92ZUFzc2V0c0Zyb21TbmFwc2hvdCgpO1xuICAgICAgdGhpcy5yZW1vdmVBc3NldHNDYWNoZUZyb21TbmFwc2hvdCgpO1xuICAgICAgY29uc3QgYXNzZW1ibHkgPSBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLmZyb21QYXRoKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgICAgYXNzZW1ibHkuY2xlYW5NYW5pZmVzdCgpO1xuICAgICAgYXNzZW1ibHkucmVjb3JkVHJhY2UodGhpcy5yZW5kZXJUcmFjZURhdGEoKSk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBpcyBhIGxlZ2FjeSB0ZXN0IHRoZW4gY3JlYXRlIGFuIGludGVnIG1hbmlmZXN0XG4gICAgLy8gaW4gdGhlIHNuYXBzaG90IGRpcmVjdG9yeSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdGhlXG4gICAgLy8gdXBkYXRlIHdvcmtmbG93LiBTYXZlIGFueSBsZWdhY3lDb250ZXh0IGFzIHdlbGwgc28gdGhhdCBpdCBjYW4gYmUgcmVhZFxuICAgIC8vIHRoZSBuZXh0IHRpbWVcbiAgICBjb25zdCBhY3R1YWxUZXN0U3VpdGUgPSBhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpO1xuICAgIGlmIChhY3R1YWxUZXN0U3VpdGUudHlwZSA9PT0gJ2xlZ2FjeS10ZXN0LXN1aXRlJykge1xuICAgICAgKGFjdHVhbFRlc3RTdWl0ZSBhcyBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSkuc2F2ZU1hbmlmZXN0KHRoaXMuZ29sZGVuU25hcHNob3REaXIsIHRoaXMubGVnYWN5Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENvbnRleHQoYWRkaXRpb25hbENvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgLy8gTG9hZCB0aGUgdGVzdC1zcGVjaWZpYyBjb250ZXh0IChmcm9tIGBpbnRlZy5jb250ZXh0Lmpzb25gIG9yIGBjZGsuanNvbiNjb250ZXh0YCksIGlmIGFueS5cbiAgICAvLyBJZiBub3QgZm91bmQsIHVzZSB0aGUgYnVpbHQtaW4gY3VycmVudCBmZWF0dXJlIGZsYWdzIChhdCB0aGUgcmlzayBvZiBuZXdlciBmZWF0dXJlIGZsYWdzIGNoYW5naW5nXG4gICAgLy8gdGhlIHNuYXBzaG90cykuXG4gICAgY29uc3QgZmVhdHVyZUZsYWdzID0gdGhpcy5hc3luY01lbWJlcnMudGVzdFNwZWNpZmljQ29udGV4dCA/PyBjdXJyZW50bHlSZWNvbW1lbmRlZEF3c0Nka0xpYkZsYWdzKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmVhdHVyZUZsYWdzLFxuICAgICAgLi4udGhpcy5sZWdhY3lDb250ZXh0LFxuICAgICAgLi4uYWRkaXRpb25hbENvbnRleHQsXG5cbiAgICAgIC8vIERvbid0IHJlY29yZCBjcmVhdGlvbiBzdGFjayB0cmFjZXMgaW4gdGhlIHNuYXBzaG90LCBzaW5jZSB0aGV5IGp1c3QgdGFrZSB1cCBzcGFjZSBhbmQgYXJlIG5ldmVyIGRldGVybWluaXN0aWMuXG4gICAgICAnYXdzOmNkazpkaXNhYmxlLWNyZWF0aW9uLXN0YWNrLXRyYWNlcyc6IHRydWUsXG5cbiAgICAgIC8vIFdlIG9yaWdpbmFsbHkgaGFkIFBMQU5ORUQgdG8gc2V0IHRoaXMgdG8gWydhd3MnLCAnYXdzLWNuJ10sIGJ1dCBkdWUgdG8gYSBwcm9ncmFtbWluZyBtaXN0YWtlXG4gICAgICAvLyBpdCB3YXMgc2V0IHRvIGV2ZXJ5dGhpbmcuIEluIHRoaXMgUFIsIHNldCBpdCB0byBldmVyeXRoaW5nIHRvIG5vdCBtZXNzIHVwIGFsbCB0aGUgc25hcHNob3RzLlxuICAgICAgJ0Bhd3MtY2RrL2NvcmU6dGFyZ2V0LXBhcnRpdGlvbnMnOiB1bmRlZmluZWQsXG5cbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gVEhFIEZVVFVSRSBMSVZFUyBCRUxPVy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIFJlc3RyaWN0aW5nIHRvIHRoZXNlIHRhcmdldCBwYXJ0aXRpb25zIG1ha2VzIG1vc3Qgc2VydmljZSBwcmluY2lwYWxzIHN5bnRoZXNpemUgdG9cbiAgICAgIC8vIGBzZXJ2aWNlLiR7VVJMX1NVRkZJWH1gLCB3aGljaCBpcyB0ZWNobmljYWxseSAqaW5jb3JyZWN0KiAoaXQncyBvbmx5IGBhbWF6b25hd3MuY29tYFxuICAgICAgLy8gb3IgYGFtYXpvbmF3cy5jb20uY25gLCBuZXZlciBVcmxTdWZmaXggZm9yIGFueSBvZiB0aGUgcmVzdHJpY3RlZCByZWdpb25zKSBidXQgaXQncyB3aGF0XG4gICAgICAvLyBtb3N0IGV4aXN0aW5nIGludGVnIHRlc3RzIGNvbnRhaW4sIGFuZCB3ZSB3YW50IHRvIGRpc3R1cmIgYXMgZmV3IGFzIHBvc3NpYmxlLlxuICAgICAgLy8gW1RBUkdFVF9QQVJUSVRJT05TXTogWydhd3MnLCAnYXdzLWNuJ10sXG4gICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIEVORCBPRiBUSEUgRlVUVVJFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICB9O1xuICB9XG59XG5cbi8vIERlZmF1bHQgY29udGV4dCB3ZSBydW4gYWxsIGludGVnIHRlc3RzIHdpdGgsIHNvIHRoZXkgZG9uJ3QgZGVwZW5kIG9uIHRoZVxuLy8gYWNjb3VudCBvZiB0aGUgZXhlcmNpc2luZyB1c2VyLlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1lOVEhfT1BUSU9OUyA9IHtcbiAgY29udGV4dDoge1xuICAgIFtBVkFJTEFCSUxJVFlfWk9ORV9GQUxMQkFDS19DT05URVhUX0tFWV06IFsndGVzdC1yZWdpb24tMWEnLCAndGVzdC1yZWdpb24tMWInLCAndGVzdC1yZWdpb24tMWMnXSxcbiAgICAnYXZhaWxhYmlsaXR5LXpvbmVzOmFjY291bnQ9MTIzNDU2Nzg6cmVnaW9uPXRlc3QtcmVnaW9uJzogWyd0ZXN0LXJlZ2lvbi0xYScsICd0ZXN0LXJlZ2lvbi0xYicsICd0ZXN0LXJlZ2lvbi0xYyddLFxuICAgICdzc206YWNjb3VudD0xMjM0NTY3ODpwYXJhbWV0ZXJOYW1lPS9hd3Mvc2VydmljZS9hbWktYW1hem9uLWxpbnV4LWxhdGVzdC9hbXpuLWFtaS1odm0teDg2XzY0LWdwMjpyZWdpb249dGVzdC1yZWdpb24nOiAnYW1pLTEyMzQnLFxuICAgICdzc206YWNjb3VudD0xMjM0NTY3ODpwYXJhbWV0ZXJOYW1lPS9hd3Mvc2VydmljZS9hbWktYW1hem9uLWxpbnV4LWxhdGVzdC9hbXpuMi1hbWktaHZtLXg4Nl82NC1ncDI6cmVnaW9uPXRlc3QtcmVnaW9uJzogJ2FtaS0xMjM0JyxcbiAgICAnc3NtOmFjY291bnQ9MTIzNDU2Nzg6cGFyYW1ldGVyTmFtZT0vYXdzL3NlcnZpY2UvZWNzL29wdGltaXplZC1hbWkvYW1hem9uLWxpbnV4L3JlY29tbWVuZGVkOnJlZ2lvbj10ZXN0LXJlZ2lvbic6ICd7XCJpbWFnZV9pZFwiOiBcImFtaS0xMjM0XCJ9JyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgJ2FtaTphY2NvdW50PTEyMzQ1Njc4OmZpbHRlcnMuaW1hZ2UtdHlwZS4wPW1hY2hpbmU6ZmlsdGVycy5uYW1lLjA9YW16bi1hbWktdnBjLW5hdC0qOmZpbHRlcnMuc3RhdGUuMD1hdmFpbGFibGU6b3duZXJzLjA9YW1hem9uOnJlZ2lvbj10ZXN0LXJlZ2lvbic6ICdhbWktMTIzNCcsXG4gICAgJ3ZwYy1wcm92aWRlcjphY2NvdW50PTEyMzQ1Njc4OmZpbHRlci5pc0RlZmF1bHQ9dHJ1ZTpyZWdpb249dGVzdC1yZWdpb246cmV0dXJuQXN5bW1ldHJpY1N1Ym5ldHM9dHJ1ZSc6IHtcbiAgICAgIHZwY0lkOiAndnBjLTYwOTAwOTA1JyxcbiAgICAgIHN1Ym5ldEdyb3VwczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1B1YmxpYycsXG4gICAgICAgICAgbmFtZTogJ1B1YmxpYycsXG4gICAgICAgICAgc3VibmV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdWJuZXRJZDogJ3N1Ym5ldC1lMTk0NTVjYScsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6ICd1cy1lYXN0LTFhJyxcbiAgICAgICAgICAgICAgcm91dGVUYWJsZUlkOiAncnRiLWUxOTQ1NWNhJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN1Ym5ldElkOiAnc3VibmV0LWUwYzI0Nzk3JyxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogJ3VzLWVhc3QtMWInLFxuICAgICAgICAgICAgICByb3V0ZVRhYmxlSWQ6ICdydGItZTBjMjQ3OTcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3VibmV0SWQ6ICdzdWJuZXQtY2NkNzczOTUnLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiAndXMtZWFzdC0xYycsXG4gICAgICAgICAgICAgIHJvdXRlVGFibGVJZDogJ3J0Yi1jY2Q3NzM5NScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH0sXG4gIGVudjoge1xuICAgIENES19JTlRFR19BQ0NPVU5UOiAnMTIzNDU2NzgnLFxuICAgIENES19JTlRFR19SRUdJT046ICd0ZXN0LXJlZ2lvbicsXG4gICAgQ0RLX0lOVEVHX0hPU1RFRF9aT05FX0lEOiAnWjIzQUJDNFhZWkwwNUInLFxuICAgIENES19JTlRFR19IT1NURURfWk9ORV9OQU1FOiAnZXhhbXBsZS5jb20nLFxuICAgIENES19JTlRFR19ET01BSU5fTkFNRTogJyouZXhhbXBsZS5jb20nLFxuICAgIENES19JTlRFR19DRVJUX0FSTjogJ2Fybjphd3M6YWNtOnRlc3QtcmVnaW9uOjEyMzQ1Njc4OmNlcnRpZmljYXRlLzg2NDY4MjA5LWEyNzItNTk1ZC1iODMxLTBlZmI2NDIxMjY1eicsXG4gICAgQ0RLX0lOVEVHX1NVQk5FVF9JRDogJ3N1Ym5ldC0wZGZmMWEzOTlkOGY2ZjkyYycsXG4gIH0sXG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgY3VycmVudGx5IHJlY29tbWVuZGVkIGZsYWdzIGZvciBgYXdzLWNkay1saWJgLlxuICpcbiAqIFRoZXNlIGhhdmUgYmVlbiBidWlsdCBpbnRvIHRoZSBDTEkgYXQgYnVpbGQgdGltZS4gSWYgdGhpcyBldmVyIGdldHMgY2hhbmdlZFxuICogYmFjayB0byBhIGR5bmFtaWMgbG9hZCwgcmVtZW1iZXIgdGhhdCB0aGlzIHNvdXJjZSBmaWxlIG1heSBiZSBidW5kbGVkIGludG9cbiAqIGEgSmF2YVNjcmlwdCBidW5kbGUsIGFuZCBgX19kaXJuYW1lYCBtaWdodCBub3QgcG9pbnQgd2hlcmUgeW91IHRoaW5rIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXJyZW50bHlSZWNvbW1lbmRlZEF3c0Nka0xpYkZsYWdzKCkge1xuICByZXR1cm4gcmVjb21tZW5kZWRGbGFnc0ZpbGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbiB7XG4gIHJlYWRvbmx5IHRlc3REZWZpbml0aW9uOiBJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlO1xuICByZWFkb25seSBzbmFwc2hvdERpcmVjdG9yeTogc3RyaW5nO1xufVxuIl19
525
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWludGVnLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1pbnRlZy1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeW5CQSxnRkFFQztBQTNuQkQsa0RBQWtEO0FBQ2xELDJDQUE2QjtBQUM3QixvRUFBcUY7QUFFckYsNkNBQStCO0FBQy9CLHlEQUEwRTtBQUUxRSx3RkFBMEU7QUFDMUUsb0NBQW1DO0FBQ25DLHFDQUFzQztBQUV0QyxrREFBb0M7QUFFcEMsNkRBQWtFO0FBRWxFLDZEQUEyRDtBQUczRCxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDO0FBc0ZyRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBOEI7UUFDakQsT0FBTyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDYSxpQkFBaUIsQ0FBUztJQUUxQzs7T0FFRztJQUNhLEdBQUcsQ0FBTztJQUUxQjs7T0FFRztJQUNhLFFBQVEsQ0FBUztJQUVqQzs7OztPQUlHO0lBQ2EsTUFBTSxDQUFTO0lBRS9COzs7T0FHRztJQUNhLGNBQWMsQ0FBUztJQUV2Qzs7O09BR0c7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYyxJQUFJLENBQVk7SUFFakM7O09BRUc7SUFDYSxXQUFXLEdBQXNCO1FBQy9DLFlBQVksRUFBRSxLQUFLO1FBQ25CLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLGdCQUFnQixFQUFFLEtBQUs7S0FDeEIsQ0FBQztJQUVGOzs7O09BSUc7SUFDYSxvQkFBb0IsQ0FBUztJQUU3Qzs7T0FFRztJQUNhLE9BQU8sQ0FBVTtJQUVqQzs7T0FFRztJQUNjLFVBQVUsQ0FBVTtJQUU5QixtQkFBbUIsQ0FBdUI7SUFDekMsYUFBYSxDQUF1QjtJQUNwQyxr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QzdCLGdCQUFnQixFQUFFLGFBQWE7UUFDL0Isd0JBQXdCLEVBQUUsZ0JBQWdCO1FBQzFDLDBCQUEwQixFQUFFLGFBQWE7UUFDekMscUJBQXFCLEVBQUUsZUFBZTtRQUN0QyxrQkFBa0IsRUFBRSxtRkFBbUY7UUFDdkcsbUJBQW1CLEVBQUUsMEJBQTBCO0tBQ2hEO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILFNBQWdCLGtDQUFrQztJQUNoRCxPQUFPLG9CQUFvQixDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAY2RrbGFicy9uby1saXRlcmFsLXBhcnRpdGlvbiAqL1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgVGVzdENhc2UsIERlZmF1bHRDZGtPcHRpb25zIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEludGVnVGVzdFN1aXRlLCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSB9IGZyb20gJy4vaW50ZWctdGVzdC1zdWl0ZSc7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdCB9IGZyb20gJy4vaW50ZWdyYXRpb24tdGVzdHMnO1xuaW1wb3J0ICogYXMgcmVjb21tZW5kZWRGbGFnc0ZpbGUgZnJvbSAnLi4vcmVjb21tZW5kZWQtZmVhdHVyZS1mbGFncy5qc29uJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBtYWtlRW5naW5lIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBJQ2RrIH0gZnJvbSAnLi4vZW5naW5lcy9jZGstaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdFRyYWNlIH0gZnJvbSAnLi9wcml2YXRlL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIgfSBmcm9tICcuL3ByaXZhdGUvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBEZXN0cnVjdGl2ZUNoYW5nZSB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcbmltcG9ydCB7IE5vTWFuaWZlc3RFcnJvciB9IGZyb20gJy4vcHJpdmF0ZS9pbnRlZy1tYW5pZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENka0NvbnRleHQgfSBmcm9tICcuL3ByaXZhdGUvdGVzdC1zcGVjaWZpYy1jb250ZXh0JztcblxuY29uc3QgREVTVFJVQ1RJVkVfQ0hBTkdFUyA9ICchIURFU1RSVUNUSVZFX0NIQU5HRVM6JztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhbiBpbnRlZyBoZWxwZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtJbnRlZ0hlbHBlck9wdGlvbnMge1xuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlc3QgdG8gcnVuXG4gICAqL1xuICByZWFkb25seSB0ZXN0OiBJbnRlZ1Rlc3Q7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gd2hlcmUgdGhlIHRlc3Qgc2hvdWxkIGJlIGRlcGxveWVkXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyBwcm9maWxlIHRvIHVzZSB3aGVuIGludm9raW5nIHRoZSBDREsgQ0xJXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJvZmlsZSBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0IHByb2ZpbGUgaXMgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGF2YWlsYWJsZVxuICAgKiB0byB0aGUgQ0RLIENMSVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICByZWFkb25seSBlbnY/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogdG1wIGNkay5vdXQgZGlyZWN0b3J5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGlyZWN0b3J5IHdpbGwgYmUgYGNkay1pbnRlZy5vdXQuJHt0ZXN0TmFtZX1gXG4gICAqL1xuICByZWFkb25seSBpbnRlZ091dERpcj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIENESyBUb29sa2l0IEVuZ2luZSB0byB1c2VcbiAgICpcbiAgICogQGRlZmF1bHQgLSBiYXNlZCBvbiBgZW5naW5lYCBvcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNkaz86IElDZGs7XG5cbiAgLyoqXG4gICAqIFNob3cgb3V0cHV0IGZyb20gcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0c1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd091dHB1dD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgaW5kaWNhdGVkIHByb3h5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJveHlcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIENBIGNlcnRpZmljYXRlIHRvIHVzZSB3aGVuIHZhbGlkYXRpbmcgSFRUUFMgcmVxdWVzdHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIENBIGJ1bmRsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FCdW5kbGVQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbiB1bml0IHRlc3QgbW9kZSwgbGVhdmUgdGhlIHN5bnRoIG91dHB1dCBkaXJlY3RvcmllcywgZG9uJ3QgY2xlYW4gdGhlbS5cbiAgICpcbiAgICogTWFueSBvZiBvdXIgdGVzdHMgdXNlIG1vY2tzIGFuZCBkb24ndCBhY3R1YWxseSBzeW50aCBvdXRwdXQgZGlyZWN0b3JpZXMsIHRoZXkgYXJlXG4gICAqIHN0YXRpYyBhbmQgbXVzdCBub3QgYmUgZGVsZXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRlc3RpbmdVc2luZ01vY2tzTGVhdmVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogV2hldGhlciB0byBzeW50aGVzaXplIHRoZSBhY3R1YWwgc25hcHNob3Qgd2l0aCBsb29rdXBzIGVuYWJsZWQgb3Igbm90LlxuICpcbiAqIElmIGVpdGhlciBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2Ugc2VuZCBjb250ZXh0IGluIG9yIG5vdCB3aGlsZSBzeW50aGVzaXppbmcsXG4gKiBhbmQgaWYgdGhlIGdlbmVyYXRlZCBzbmFwc2hvdCB0ZXN0IGRlZmluaXRpb24gcmVxdWVzdHMgYSBkaWZmZXJlbnQgdmFsdWUgd2VcbiAqIHdpbGwgc3ludGggYWdhaW4uXG4gKlxuICogRm9yIGBkb250LWNhcmVgLCB3ZSBkbyBzZW5kIGluIHRoZSBjb250ZXh0IGJ1dCB3ZSBuZXZlciByZXN5bnRoLlxuICovXG5leHBvcnQgdHlwZSBMZWdhY3lFbmFibGVMb29rdXBzID0gdHJ1ZSB8IGZhbHNlIHwgJ2RvbnQtY2FyZSc7XG5cbi8qKlxuICogQ2xhc3Mgd2l0aCBzb21lIGhlbHBlciByb3V0aW5lcyBmb3IgcnVubmluZyBDREsgc25hcHNob3RzIGFuZCBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBBIFwiZ29sZGVuIHNuYXBzaG90XCIgaXMgdGhlIHNuYXBzaG90IHRoYXQgaXMgc3RvcmVkIHBlcm1hbmVudGx5IGluIHZlcnNpb25cbiAqIGNvbnRyb2wsIHRoYXQgbmV3IHJ1bnMgYXJlIGNvbXBhcmVkIGFnYWluc3QgKHN0b3JlZCBpbiBhIGRpcmVjdG9yeSBuYW1lZFxuICogYDx0ZXN0LW5hbWU+LnNuYXBzaG90YCkuXG4gKlxuICogVGhpcyBpcyBhcyBvcHBvc2VkIHRvIG90aGVyIHNuYXBzaG90cywgd2hpY2ggY2FuIGJlIGdlbmVyYXRlZCBmb3IgZXhhbXBsZVxuICogdGVtcG9yYXJpbHkgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCB0byBjb21wYXJlIGFnYWlucyB0aGUgZ29sZGVuIHNuYXBzaG90LlxuICovXG5leHBvcnQgY2xhc3MgQ2RrSW50ZWdIZWxwZXIge1xuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDZGtJbnRlZ0hlbHBlci5cbiAgICpcbiAgICogSGlkaW5nIHRoZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluaGVyaXRhbmNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9uczogQ2RrSW50ZWdIZWxwZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBDZGtJbnRlZ0hlbHBlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBnb2xkZW4gc25hcHNob3Qgd2lsbCBiZSBzdG9yZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnb2xkZW5TbmFwc2hvdERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgQ0RLICBDTElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGs6IElDZGs7XG5cbiAgLyoqXG4gICAqIFByZXR0eSBuYW1lIG9mIHRoZSB0ZXN0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGVzdE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHVzZWQgaW4gdGhlICctLWFwcCcgQ0xJIHBhcmFtZXRlclxuICAgKlxuICAgKiBQYXRoIHRvIHRoZSBpbnRlZyB0ZXN0IHNvdXJjZSBmaWxlLCByZWxhdGl2ZSB0byBgdGhpcy5kaXJlY3RvcnlgLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka0FwcDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB3aGVyZSB0aGUgYGNkay5jb250ZXh0Lmpzb25gIGZpbGVcbiAgICogd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrQ29udGV4dFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoYXQgdGhlIGludGVncmF0aW9uIHRlc3RzIHdpbGwgYmVcbiAgICogZXhlY3V0ZWQgZnJvbVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVzdCB0byBydW5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdDogSW50ZWdUZXN0O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgQ0RLIENMSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRBcmdzOiBEZWZhdWx0Q2RrT3B0aW9ucyA9IHtcbiAgICBwYXRoTWV0YWRhdGE6IGZhbHNlLFxuICAgIGFzc2V0TWV0YWRhdGE6IGZhbHNlLFxuICAgIHZlcnNpb25SZXBvcnRpbmc6IGZhbHNlLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBDREsgd2lsbCBiZSBzeW50aGVkIHRvXG4gICAqXG4gICAqIFJlbGF0aXZlIHRvIGN3ZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0ZW1wb3JhcnlTbmFwc2hvdERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvZmlsZSB0byB1c2UgZm9yIHRoZSBDREsgQ0xJIGNhbGxzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2hvdyBvdXRwdXQgZnJvbSB0aGUgaW50ZWcgdGVzdCBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3dPdXRwdXQ6IGJvb2xlYW47XG5cbiAgcHVibGljIF9kZXN0cnVjdGl2ZUNoYW5nZXM/OiBEZXN0cnVjdGl2ZUNoYW5nZVtdO1xuICBwcml2YXRlIGxlZ2FjeUNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIF9leHBlY3RlZFRlc3RTdWl0ZT86IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHByaXZhdGUgX2FjdHVhbFNuYXBzaG90PzogU25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBfbGVnYWN5RW5hYmxlTG9va3Vwcz86IExlZ2FjeUVuYWJsZUxvb2t1cHM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVTeW50aERpcmVjdG9yaWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGaWVsZHMgdGhhdCByZXF1aXJlIGFuIGFzeW5jIGNvbnRleHQgdG8gaW5pdGlhbGl6ZS5cbiAgICovXG4gIHByaXZhdGUgX2FzeW5jTWVtYmVycz86IHtcbiAgICB0ZXN0U3BlY2lmaWNDb250ZXh0PzogQ2RrQ29udGV4dDtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluaGVyaXRhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihvcHRpb25zOiBDZGtJbnRlZ0hlbHBlck9wdGlvbnMpIHtcbiAgICB0aGlzLnRlc3QgPSBvcHRpb25zLnRlc3Q7XG4gICAgdGhpcy5kaXJlY3RvcnkgPSB0aGlzLnRlc3QuZGlyZWN0b3J5O1xuICAgIHRoaXMudGVzdE5hbWUgPSB0aGlzLnRlc3QudGVzdE5hbWU7XG4gICAgdGhpcy5nb2xkZW5TbmFwc2hvdERpciA9IHRoaXMudGVzdC5zbmFwc2hvdERpcjtcbiAgICB0aGlzLmNka0NvbnRleHRQYXRoID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnY2RrLmNvbnRleHQuanNvbicpO1xuICAgIHRoaXMucHJvZmlsZSA9IG9wdGlvbnMucHJvZmlsZTtcbiAgICB0aGlzLnNob3dPdXRwdXQgPSBvcHRpb25zLnNob3dPdXRwdXQgPz8gZmFsc2U7XG5cbiAgICB0aGlzLmNkayA9IG9wdGlvbnMuY2RrID8/IG1ha2VFbmdpbmUob3B0aW9ucyk7XG4gICAgdGhpcy50ZW1wb3JhcnlTbmFwc2hvdERpciA9IG9wdGlvbnMuaW50ZWdPdXREaXIgPz8gdGhpcy50ZXN0LnRlbXBvcmFyeU91dHB1dERpcjtcblxuICAgIGNvbnN0IHRlc3RSdW5Db21tYW5kID0gdGhpcy50ZXN0LmFwcENvbW1hbmQ7XG4gICAgdGhpcy5jZGtBcHAgPSB0ZXN0UnVuQ29tbWFuZC5yZXBsYWNlKCd7ZmlsZVBhdGh9JywgcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy50ZXN0LmZpbGVOYW1lKSk7XG5cbiAgICB0aGlzLmRlbGV0ZVN5bnRoRGlyZWN0b3JpZXMgPSAhb3B0aW9ucy50ZXN0aW5nVXNpbmdNb2Nrc0xlYXZlRGlyZWN0b3JpZXM7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmMgaW5pdGlhbGl6YXRpb247IGNvcHkgaW5mb3JtYXRpb24gZnJvbSBhbiBhc3luYyBjb250ZXh0IGludG8gdmFyaWFibGVzIHNvIHdlIGNhbiBhY2Nlc3MgdGhlbSBzeW5jaHJvbm91c2x5IGxhdGVyLlxuICAgKlxuICAgKiBXZSBjYWxsIHRoaXMgYXV0b21hdGljYWxseSBpbiBhbGwgcHVibGljIGFzeW5jIG1lbWJlcnMsIGJ1dCBpZiBhIGNvbnN1bWVyIHdhbnRzIHRvIGFjY2VzcyB0aGlzIGNvbnRleHQgc3luY2hyb25vdXNseVxuICAgKiB3aXRob3V0IGNhbGxpbmcgYW4gYXN5bmMgbWVtYmVycyBmaXJzdCwgaXQgbmVlZHMgdG8gY2FsbCB0aGlzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFzeW5jSW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fYXN5bmNNZW1iZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fYXN5bmNNZW1iZXJzID0ge1xuICAgICAgdGVzdFNwZWNpZmljQ29udGV4dDogYXdhaXQgdGhpcy50ZXN0LnRlc3RTcGVjaWZpY0NvbnRleHQoKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgYXN5bmNNZW1iZXJzKCk6IE5vbk51bGxhYmxlPENka0ludGVnSGVscGVyWydfYXN5bmNNZW1iZXJzJ10+IHtcbiAgICBpZiAoIXRoaXMuX2FzeW5jTWVtYmVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3luYyBjb250ZXh0IG5vdCBpbml0aWFsaXplZC4gQ2FsbCBhc3luY0luaXRpYWxpemUoKSBmaXJzdC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FzeW5jTWVtYmVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIGxlZ2FjeSBlbmFibGVMb29rdXBzIHZhbHVlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGFjdHVhbCBzbmFwc2hvdC5cbiAgICpcbiAgICogTXVzdCBiZSBzZXQgYmVmb3JlIHVzaW5nIHNuYXBzaG90IG1ldGhvZHMuXG4gICAqL1xuICBwdWJsaWMgY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcyhlbmFibGVMb29rdXBzOiBMZWdhY3lFbmFibGVMb29rdXBzKTogdm9pZCB7XG4gICAgdGhpcy5fbGVnYWN5RW5hYmxlTG9va3VwcyA9IGVuYWJsZUxvb2t1cHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGFjdHVhbCAoaS5lLiBuZXcpIHRlc3QgY2FzZXMgZm9yIHRoaXMgaW50ZWdyYXRpb24gdGVzdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjdHVhbFRlc3RzKCk6IFByb21pc2U8eyBbdGVzdE5hbWU6IHN0cmluZ106IFRlc3RDYXNlIH0gfCB1bmRlZmluZWQ+IHtcbiAgICBhd2FpdCB0aGlzLmFzeW5jSW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKSkudGVzdFN1aXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgbmV3IFwiYWN0dWFsXCIgc25hcHNob3Qgd2hpY2ggd2lsbCBiZSBjb21wYXJlZCB0byB0aGVcbiAgICogZXhpc3RpbmcgXCJleHBlY3RlZFwiIHNuYXBzaG90XG4gICAqIFRoaXMgd2lsbCBzeW50aCBhbmQgdGhlbiBsb2FkIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IG1hbmlmZXN0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlQWN0dWFsU25hcHNob3QoKTogUHJvbWlzZTxTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uPiB7XG4gICAgYXdhaXQgdGhpcy5zeW50aEFjdHVhbFNuYXBzaG90KHRoaXMudGVtcG9yYXJ5U25hcHNob3REaXIpO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgdGhpcy5fbG9hZE1hbmlmZXN0KHRoaXMudGVtcG9yYXJ5U25hcHNob3REaXIpO1xuICAgIHJldHVybiB7XG4gICAgICB0ZXN0RGVmaW5pdGlvbjogbWFuaWZlc3QsXG4gICAgICBzbmFwc2hvdERpcmVjdG9yeTogdGhpcy50ZW1wb3JhcnlTbmFwc2hvdERpcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIHRoZSBhY3R1YWwgYXBwbGljYXRpb24gdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSwgZm9yIHB1cnBvc2VzIG9mIGdlbmVyYXRpbmcvdmFsaWRhdGluZyBhIHNuYXBzaG90XG4gICAqXG4gICAqIGBsZWdhY3lFbmFibGVMb29rdXBzYCBpcyB0byBwcmVzZXJ2ZSBoaXN0b3JpY2FsIGJlaGF2aW9yIGZvciBhIHdoaWxlOlxuICAgKiB0cmFkaXRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24gd291bGQgb25seSBiZSBzZWVkZWQgd2l0aCBjb250ZXh0IGlmXG4gICAqIGBlbmFibGVMb29rdXBzYCB3YXMgdHJ1ZSwgYW5kIHRoaXMgaW5mb3JtYXRpb24gd291bGQgY29tZSBmcm9tIHRoZSB0ZXN0XG4gICAqIGRlZmluaXRpb24uXG4gICAqXG4gICAqIC0gU2luY2UgdGhlIHRlc3QgZGVmaW5pdGlvbiBjb21lcyBmcm9tIGluc2lkZSB0aGUgYXBwLCB0aGlzIHJlcXVpcmVzIGFcbiAgICogICBzeW50aCBqdXN0IHRvIGdldCB0aGUgdGVzdCBkZWZpbml0aW9uLCBhbmQgdGhlbiBhbm90aGVyIHN5bnRoIHRvIGdlbmVyYXRlXG4gICAqICAgdGhlIGFjdHVhbCBzbmFwc2hvdCB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHQsIHdoaWNoIGlzIHRpbWUgY29uc3VtaW5nLlxuICAgKiAtIEdpdmVuIHRoYXQgdGhlIGNvbnRleHQgaXMgZml4ZWQgYW5kIGZha2UsIGl0IGNvdWxkIGFsd2F5cyBoYXZlIGJlZW4gcGFzc2VkLlxuICAgKlxuICAgKiBIb3dldmVyLCB0aGUgc25hcHNob3QgY29udGVudHMgdGhlbXNlbHZlcyBkZXBlbmQgb24gdGhlIGNvbnRleHQgZmxhZywgYW5kIGNoYW5naW5nXG4gICAqIHRoaXMgYmVoYXZpb3Igbm93IGludmFsaWRhdGVzIGFsbCBzbmFwc2hvdHMgZXZlcnl3aGVyZSwgd2hpY2ggaXMgYW5ub3lpbmcgZm9yIHVwZ3JhZGluZy5cbiAgICpcbiAgICogU28gd2Ugd2lsbCB1c2UgdGhlIGJlaGF2aW9yIGZyb20gdGhlIEdPTERFTiBTTkFQU0hPVCdzIHRlc3QgZGVmaW5pdGlvbiB0b1xuICAgKiBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHRoZSBjb250ZXh0LCBhbmQgaWYgdGhlIG5ldyBhY3R1YWwgc25hcHNob3QgaGFzIGFcbiAgICogZGlmZmVyZW50IHZhbHVlIGZvciBgZW5hYmxlTG9va3Vwc2AsIHdlIHdpbGwgdGhyb3cgYXdheSB0aGUgb2xkIHNuYXBzaG90IGFuZCBzeW50aCBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3ludGhBY3R1YWxTbmFwc2hvdChvdXRwdXREaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBjYWxsIGNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMgYmVmb3JlIGdlbmVyYXRpbmcgc25hcHNob3RzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgb3V0cHV0RGlyZWN0b3J5KTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdGFyZ2V0IGRpcmVjdG9yeSwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHN0YWxlIGZpbGVzIGZyb21cbiAgICAvLyBwcmV2aW91cyBzeW50aHMuIEFsc28sIHRoZSBydW5uZXIgd2lsbCByZS11c2UgYSBkaXJlY3RvcnkgdGhhdCBhbHJlYWR5XG4gICAgLy8gZXhpc3RzIGFuZCB3ZSB3YW50IGZvcmNlIHJlY3JlYXRpb24gKHVubGVzcyB3ZSBhcmUgdW5pdCB0ZXN0aW5nKS5cbiAgICBpZiAodGhpcy5kZWxldGVTeW50aERpcmVjdG9yaWVzKSB7XG4gICAgICBhd2FpdCBmcy5ybShvdXRwdXQsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNkay5zeW50aCh7XG4gICAgICBhcHA6IHRoaXMuY2RrQXBwLFxuICAgICAgY29udGV4dDogdGhpcy5nZXRDb250ZXh0KHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgIT09IGZhbHNlID8gREVGQVVMVF9TWU5USF9PUFRJT05TLmNvbnRleHQgOiB7fSksXG4gICAgICBlbnY6IERFRkFVTFRfU1lOVEhfT1BUSU9OUy5lbnYsXG4gICAgICBvdXRwdXQsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWN0dWFsU3ludGhSZXByb0NvbW1hbmQoKSB7XG4gICAgLy8gU2hvdyB0aGUgY29tbWFuZCBuZWNlc3NhcnkgdG8gcmVwcm8gdGhpc1xuICAgIGNvbnN0IGVudlNldCA9IE9iamVjdC5lbnRyaWVzKERFRkFVTFRfU1lOVEhfT1BUSU9OUy5lbnYpLm1hcCgoW2ssIHZdKSA9PiBgJHtrfT0nJHt2fSdgKTtcbiAgICBjb25zdCBlbnZDbWQgPSBlbnZTZXQubGVuZ3RoID4gMCA/IFsnZW52JywgLi4uZW52U2V0XSA6IFtdO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLmVudkNtZCxcbiAgICAgICdjZGsnLFxuICAgICAgJ3N5bnRoJyxcbiAgICAgICctYScsXG4gICAgICBgJyR7dGhpcy5jZGtBcHB9J2AsXG4gICAgICAnLW8nLFxuICAgICAgYCcke3RoaXMudGVtcG9yYXJ5U25hcHNob3REaXJ9J2AsXG4gICAgICAuLi5PYmplY3QuZW50cmllcyh0aGlzLmdldENvbnRleHQoREVGQVVMVF9TWU5USF9PUFRJT05TLmNvbnRleHQpKS5mbGF0TWFwKChbaywgdl0pID0+IHR5cGVvZiB2ICE9PSAnb2JqZWN0JyA/IFtgLWMgJyR7a309JHt2fSdgXSA6IFtdKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIHNuYXBzaG90IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHRlc3RcbiAgICovXG4gIHB1YmxpYyBoYXNTbmFwc2hvdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyh0aGlzLmdvbGRlblNuYXBzaG90RGlyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGVzdCBzdWl0ZSBmcm9tIHRoZSBleGlzdGluZyBzbmFwc2hvdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4cGVjdGVkVGVzdFN1aXRlKCk6IFByb21pc2U8SW50ZWdUZXN0U3VpdGUgfCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGF3YWl0IHRoaXMuYXN5bmNJbml0aWFsaXplKCk7XG4gICAgaWYgKCF0aGlzLl9leHBlY3RlZFRlc3RTdWl0ZSAmJiB0aGlzLmhhc1NuYXBzaG90KCkpIHtcbiAgICAgIHRoaXMuX2V4cGVjdGVkVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5fbG9hZE1hbmlmZXN0KHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXhwZWN0ZWRUZXN0U3VpdGU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWN0dWFsU25hcHNob3QoKTogUHJvbWlzZTxTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICBpZiAoIXRoaXMuX2FjdHVhbFNuYXBzaG90KSB7XG4gICAgICB0aGlzLl9hY3R1YWxTbmFwc2hvdCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVBY3R1YWxTbmFwc2hvdCgpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZW5hYmxlTG9va3VwcyB2YWx1ZSBoYXMgY2hhbmdlZCBiZXR3ZWVuIHRoZSBnb2xkZW5cbiAgICAgIC8vIHNuYXBzaG90IGFuZCB0aGUgYWN0dWFsIHNuYXBzaG90LiBJZiBpdCBoYXMsIHdlIG5lZWQgdG8gcmUtc3ludGggdGhlXG4gICAgICAvLyBhY3R1YWwgc25hcHNob3Qgd2l0aCB0aGUgbmV3IGVuYWJsZUxvb2t1cHMgdmFsdWUuXG4gICAgICAvL1xuICAgICAgLy8gU2VlIGBzeW50aEFjdHVhbFNuYXBzaG90YCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuXG4gICAgICBjb25zdCBhY3R1YWxFbmFibGVMb29rdXBzID0gdGhpcy5fYWN0dWFsU25hcHNob3QudGVzdERlZmluaXRpb24uZW5hYmxlTG9va3VwcyA/PyBmYWxzZTtcbiAgICAgIGlmIChhY3R1YWxFbmFibGVMb29rdXBzICE9PSB0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzICYmIHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgIT09ICdkb250LWNhcmUnKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcyhhY3R1YWxFbmFibGVMb29rdXBzKTtcbiAgICAgICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQWN0dWFsU25hcHNob3QoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FjdHVhbFNuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHN1aXRlIGZyb20gdGhlIG5ldyBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFjdHVhbFRlc3RTdWl0ZSgpOiBQcm9taXNlPEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWN0dWFsU25hcHNob3QoKSkudGVzdERlZmluaXRpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW50ZWcgbWFuaWZlc3Qgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb25cbiAgICogb24gaG93IHRvIGV4ZWN1dGUgdGhlIHRlc3RzXG4gICAqIEZpcnN0IHdlIHRyeSBhbmQgbG9hZCB0aGUgbWFuaWZlc3QgZnJvbSB0aGUgaW50ZWcgbWFuaWZlc3QgKGkuZS4gaW50ZWcuanNvbilcbiAgICogZnJvbSB0aGUgY2xvdWQgYXNzZW1ibHkuIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4gd2UgZmFsbGJhY2sgdG8gdGhlXG4gICAqIFwibGVnYWN5IG1vZGVcIiBhbmQgY3JlYXRlIGEgbWFuaWZlc3QgZnJvbSBwcmFnbWFcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgX2xvYWRNYW5pZmVzdChkaXI6IHN0cmluZyk6IFByb21pc2U8SW50ZWdUZXN0U3VpdGUgfCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZT4ge1xuICAgIGF3YWl0IHRoaXMuYXN5bmNJbml0aWFsaXplKCk7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBkaXI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlc3RTdWl0ZSA9IEludGVnVGVzdFN1aXRlLmZyb21QYXRoKG1hbmlmZXN0KTtcbiAgICAgIHJldHVybiB0ZXN0U3VpdGU7XG4gICAgfSBjYXRjaCAobW9kZXJuRXJyb3I6IGFueSkge1xuICAgICAgLy8gT25seSBhdHRlbXB0IGxlZ2FjeSB0ZXN0IGNhc2UgaWYgdGhlIGludGVnIHRlc3QgbWFuaWZlc3Qgd2FzIG5vdCBmb3VuZFxuICAgICAgLy8gRm9yIGFueSBvdGhlciBlcnJvcnMsIGUuZy4gd2hlbiBwYXJzaW5nIHRoZSBtYW5pZmVzdCBmYWlscywgd2UgYWJvcnQuXG4gICAgICBpZiAoIShtb2Rlcm5FcnJvciBpbnN0YW5jZW9mIE5vTWFuaWZlc3RFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgbW9kZXJuRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNob3dPdXRwdXQpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFxuICAgICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgaW50ZWcgdGVzdCBtYW5pZmVzdCBmb3IgJyVzJy4gQXR0ZW1wdGluZyBhcyBkZXByZWNhdGVkIGxlZ2FjeSB0ZXN0IGluc3RlYWQuIEVycm9yIHdhczogJXNcIixcbiAgICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgICBtb2Rlcm5FcnJvci5tZXNzYWdlID8/IFN0cmluZyhtb2Rlcm5FcnJvciksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IGF3YWl0IExlZ2FjeUludGVnVGVzdFN1aXRlLmZyb21MZWdhY3koe1xuICAgICAgICBjZGs6IHRoaXMuY2RrLFxuICAgICAgICB0ZXN0TmFtZTogdGhpcy50ZXN0Lm5vcm1hbGl6ZWRUZXN0TmFtZSxcbiAgICAgICAgaW50ZWdTb3VyY2VGaWxlUGF0aDogdGhpcy50ZXN0LmZpbGVOYW1lLFxuICAgICAgICBsaXN0T3B0aW9uczoge1xuICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdEFyZ3MsXG4gICAgICAgICAgYWxsOiB0cnVlLFxuICAgICAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlLFxuICAgICAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy50ZW1wb3JhcnlTbmFwc2hvdERpciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMubGVnYWN5Q29udGV4dCA9IExlZ2FjeUludGVnVGVzdFN1aXRlLmdldFByYWdtYUNvbnRleHQodGhpcy50ZXN0LmZpbGVOYW1lKTtcbiAgICAgIHJldHVybiB0ZXN0Q2FzZXM7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgY29uc3QgY2RrT3V0UGF0aCA9IHRoaXMudGVtcG9yYXJ5U25hcHNob3REaXI7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2RrT3V0UGF0aCkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoY2RrT3V0UGF0aCk7XG4gICAgfVxuICAgIC8vIENsZWFyIGNhY2hlXG4gICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlcmUgYXJlIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzIHRvIGEgc3RhY2sgdGhlbiB0aGlzIHdpbGwgcmVjb3JkXG4gICAqIHRob3NlIGluIHRoZSBtYW5pZmVzdC5qc29uIGZpbGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVHJhY2VEYXRhKCk6IE1hbmlmZXN0VHJhY2Uge1xuICAgIGNvbnN0IHRyYWNlRGF0YTogTWFuaWZlc3RUcmFjZSA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkZXN0cnVjdGl2ZUNoYW5nZXMgPSB0aGlzLl9kZXN0cnVjdGl2ZUNoYW5nZXMgPz8gW107XG4gICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgIGNvbnN0IHRyYWNlID0gdHJhY2VEYXRhLmdldChjaGFuZ2Uuc3RhY2tOYW1lKTtcbiAgICAgIGlmICh0cmFjZSkge1xuICAgICAgICB0cmFjZS5zZXQoY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2VEYXRhLnNldChjaGFuZ2Uuc3RhY2tOYW1lLCBuZXcgTWFwKFtcbiAgICAgICAgICBbY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWBdLFxuICAgICAgICBdKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNlRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBjYXNlcyB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byByZXRhaW4gdGhlIGFzc2V0cyxcbiAgICogZm9yIGV4YW1wbGUsIGlmIHRoZSBhc3NldHMgYXJlIHZlcnkgbGFyZ2UuXG4gICAqXG4gICAqIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIHVwZGF0ZSB3b3JrZmxvdyBmb3IgaW5kaXZpZHVhbCB0ZXN0XG4gICAqIGNhc2VzLCB0aGlzIG5lZWRzIHRvIGZpcnN0IGdldCBhIGxpc3Qgb2Ygc3RhY2tzIHRoYXQgaGF2ZSB0aGUgdXBkYXRlIHdvcmtmbG93XG4gICAqIGRpc2FibGVkIGFuZCB0aGVuIGRlbGV0ZSBhc3NldHMgdGhhdCByZWxhdGUgdG8gdGhhdCBzdGFjay4gSXQgZG9lcyB0aGF0XG4gICAqIGJ5IHJlYWRpbmcgdGhlIGFzc2V0IG1hbmlmZXN0IGZvciB0aGUgc3RhY2sgYW5kIGRlbGV0aW5nIHRoZSBhc3NldCBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlQXNzZXRzRnJvbVNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YWNrcyA9IChhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpKS5nZXRTdGFja3NXaXRob3V0VXBkYXRlV29ya2Zsb3coKSA/PyBbXTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgY29uc3QgYXNzZXRzID0gZmxhdHRlbihzdGFja3MubWFwKHN0YWNrID0+IHtcbiAgICAgIHJldHVybiBtYW5pZmVzdC5nZXRBc3NldExvY2F0aW9uc0ZvclN0YWNrKHN0YWNrKSA/PyBbXTtcbiAgICB9KSk7XG5cbiAgICBhc3NldHMuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBhc3NldCk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlTmFtZSkpIHtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmaWxlTmFtZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIGZzLnJlbW92ZVN5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBhc3NldCBjYWNoZSAoLmNhY2hlLykgZmlsZXMgZnJvbSB0aGUgc25hcHNob3QuXG4gICAqIFRoZXNlIGFyZSBhIGNhY2hlIG9mIHRoZSBhc3NldCB6aXBzLCBidXQgd2UgYXJlIGZpbmUgd2l0aFxuICAgKiByZS16aXBwaW5nIG9uIGRlcGxveVxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVBc3NldHNDYWNoZUZyb21TbmFwc2hvdCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBmaWxlKTtcbiAgICAgIGlmIChmcy5sc3RhdFN5bmMoZmlsZU5hbWUpLmlzRGlyZWN0b3J5KCkgJiYgZmlsZSA9PT0gJy5jYWNoZScpIHtcbiAgICAgICAgZnMuZW1wdHlEaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgICAgZnMucm1kaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIG5ldyBzbmFwc2hvdC5cbiAgICpcbiAgICogSWYgbG9va3VwcyBhcmUgZW5hYmxlZCwgdGhlbiB3ZSBuZWVkIGNyZWF0ZSB0aGUgc25hcHNob3QgYnkgc3ludGgnaW5nIGFnYWluXG4gICAqIHdpdGggdGhlIGR1bW15IGNvbnRleHQgc28gdGhhdCBlYWNoIHRpbWUgdGhlIHRlc3QgaXMgcnVuIG9uIGRpZmZlcmVudCBtYWNoaW5lc1xuICAgKiAoYW5kIHdpdGggZGlmZmVyZW50IGNvbnRleHQvZW52KSB0aGUgZGlmZiB3aWxsIG5vdCBjaGFuZ2UuXG4gICAqXG4gICAqIElmIGxvb2t1cHMgYXJlIGRpc2FibGVkICh3aGljaCBtZWFucyB0aGUgc3RhY2sgaXMgZW52IGFnbm9zdGljKSB0aGVuIGp1c3QgY29weVxuICAgKiB0aGUgYXNzZW1ibHkgdGhhdCB3YXMgb3V0cHV0IGJ5IHRoZSBkZXBsb3ltZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcblxuICAgIC8vIFRPRE86IElmIHdlJ3JlIGNsZXZlciwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcmV1c2UgdGhlIHNuYXBzaG90IHRoYXQgd2FzXG4gICAgLy8gZ2VuZXJhdGVkIGR1cmluZyB0aGUgdGVzdCBpbnZhbGlkYXRpb24gY2hlY2sgYW5kIGF2b2lkIHRoZSBiZWxvdyBzeW50aC5cbiAgICAvLyBCdXQgdGhhdCBnZXRzIHJ1biBpbiBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGxpZmVjeWNsZSBhbmQgaXQgbWlnaHQgbm90XG4gICAgLy8gZXhpc3QuIFdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggdGhhdCBqdXN0IHlldC5cbiAgICBhd2FpdCB0aGlzLnN5bnRoQWN0dWFsU25hcHNob3QodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG5cbiAgICBhd2FpdCB0aGlzLmNsZWFudXBHb2xkZW5TbmFwc2hvdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gc29tZSBjbGVhbnVwIHN0ZXBzIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyBjcmVhdGVkXG4gICAqIEFueXRpbWUgdGhlIHNuYXBzaG90IG5lZWRzIHRvIGJlIG1vZGlmaWVkIGFmdGVyIGNyZWF0aW9uXG4gICAqIHRoZSBsb2dpYyBzaG91bGQgbGl2ZSBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwR29sZGVuU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5nb2xkZW5TbmFwc2hvdERpcikpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQXNzZXRzRnJvbVNuYXBzaG90KCk7XG4gICAgICB0aGlzLnJlbW92ZUFzc2V0c0NhY2hlRnJvbVNuYXBzaG90KCk7XG4gICAgICBjb25zdCBhc3NlbWJseSA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgICBhc3NlbWJseS5jbGVhbk1hbmlmZXN0KCk7XG4gICAgICBhc3NlbWJseS5yZWNvcmRUcmFjZSh0aGlzLnJlbmRlclRyYWNlRGF0YSgpKTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgbGVnYWN5IHRlc3QgdGhlbiBjcmVhdGUgYW4gaW50ZWcgbWFuaWZlc3RcbiAgICAvLyBpbiB0aGUgc25hcHNob3QgZGlyZWN0b3J5IHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0aGVcbiAgICAvLyB1cGRhdGUgd29ya2Zsb3cuIFNhdmUgYW55IGxlZ2FjeUNvbnRleHQgYXMgd2VsbCBzbyB0aGF0IGl0IGNhbiBiZSByZWFkXG4gICAgLy8gdGhlIG5leHQgdGltZVxuICAgIGNvbnN0IGFjdHVhbFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCk7XG4gICAgaWYgKGFjdHVhbFRlc3RTdWl0ZS50eXBlID09PSAnbGVnYWN5LXRlc3Qtc3VpdGUnKSB7XG4gICAgICAoYWN0dWFsVGVzdFN1aXRlIGFzIExlZ2FjeUludGVnVGVzdFN1aXRlKS5zYXZlTWFuaWZlc3QodGhpcy5nb2xkZW5TbmFwc2hvdERpciwgdGhpcy5sZWdhY3lDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29udGV4dChhZGRpdGlvbmFsQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAvLyBMb2FkIHRoZSB0ZXN0LXNwZWNpZmljIGNvbnRleHQgKGZyb20gYGludGVnLmNvbnRleHQuanNvbmAgb3IgYGNkay5qc29uI2NvbnRleHRgKSwgaWYgYW55LlxuICAgIC8vIElmIG5vdCBmb3VuZCwgdXNlIHRoZSBidWlsdC1pbiBjdXJyZW50IGZlYXR1cmUgZmxhZ3MgKGF0IHRoZSByaXNrIG9mIG5ld2VyIGZlYXR1cmUgZmxhZ3MgY2hhbmdpbmdcbiAgICAvLyB0aGUgc25hcHNob3RzKS5cbiAgICBjb25zdCBmZWF0dXJlRmxhZ3MgPSB0aGlzLmFzeW5jTWVtYmVycy50ZXN0U3BlY2lmaWNDb250ZXh0ID8/IGN1cnJlbnRseVJlY29tbWVuZGVkQXdzQ2RrTGliRmxhZ3MoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5mZWF0dXJlRmxhZ3MsXG4gICAgICAuLi50aGlzLmxlZ2FjeUNvbnRleHQsXG4gICAgICAuLi5hZGRpdGlvbmFsQ29udGV4dCxcblxuICAgICAgLy8gRG9uJ3QgcmVjb3JkIGNyZWF0aW9uIHN0YWNrIHRyYWNlcyBpbiB0aGUgc25hcHNob3QsIHNpbmNlIHRoZXkganVzdCB0YWtlIHVwIHNwYWNlIGFuZCBhcmUgbmV2ZXIgZGV0ZXJtaW5pc3RpYy5cbiAgICAgICdhd3M6Y2RrOmRpc2FibGUtY3JlYXRpb24tc3RhY2stdHJhY2VzJzogdHJ1ZSxcblxuICAgICAgLy8gV2Ugb3JpZ2luYWxseSBoYWQgUExBTk5FRCB0byBzZXQgdGhpcyB0byBbJ2F3cycsICdhd3MtY24nXSwgYnV0IGR1ZSB0byBhIHByb2dyYW1taW5nIG1pc3Rha2VcbiAgICAgIC8vIGl0IHdhcyBzZXQgdG8gZXZlcnl0aGluZy4gSW4gdGhpcyBQUiwgc2V0IGl0IHRvIGV2ZXJ5dGhpbmcgdG8gbm90IG1lc3MgdXAgYWxsIHRoZSBzbmFwc2hvdHMuXG4gICAgICAnQGF3cy1jZGsvY29yZTp0YXJnZXQtcGFydGl0aW9ucyc6IHVuZGVmaW5lZCxcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBUSEUgRlVUVVJFIExJVkVTIEJFTE9XLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gUmVzdHJpY3RpbmcgdG8gdGhlc2UgdGFyZ2V0IHBhcnRpdGlvbnMgbWFrZXMgbW9zdCBzZXJ2aWNlIHByaW5jaXBhbHMgc3ludGhlc2l6ZSB0b1xuICAgICAgLy8gYHNlcnZpY2UuJHtVUkxfU1VGRklYfWAsIHdoaWNoIGlzIHRlY2huaWNhbGx5ICppbmNvcnJlY3QqIChpdCdzIG9ubHkgYGFtYXpvbmF3cy5jb21gXG4gICAgICAvLyBvciBgYW1hem9uYXdzLmNvbS5jbmAsIG5ldmVyIFVybFN1ZmZpeCBmb3IgYW55IG9mIHRoZSByZXN0cmljdGVkIHJlZ2lvbnMpIGJ1dCBpdCdzIHdoYXRcbiAgICAgIC8vIG1vc3QgZXhpc3RpbmcgaW50ZWcgdGVzdHMgY29udGFpbiwgYW5kIHdlIHdhbnQgdG8gZGlzdHVyYiBhcyBmZXcgYXMgcG9zc2libGUuXG4gICAgICAvLyBbVEFSR0VUX1BBUlRJVElPTlNdOiBbJ2F3cycsICdhd3MtY24nXSxcbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gRU5EIE9GIFRIRSBGVVRVUkUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgIH07XG4gIH1cbn1cblxuLy8gRGVmYXVsdCBjb250ZXh0IHdlIHJ1biBhbGwgaW50ZWcgdGVzdHMgd2l0aCwgc28gdGhleSBkb24ndCBkZXBlbmQgb24gdGhlXG4vLyBhY2NvdW50IG9mIHRoZSBleGVyY2lzaW5nIHVzZXIuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TWU5USF9PUFRJT05TID0ge1xuICBjb250ZXh0OiB7XG4gICAgW0FWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZXTogWyd0ZXN0LXJlZ2lvbi0xYScsICd0ZXN0LXJlZ2lvbi0xYicsICd0ZXN0LXJlZ2lvbi0xYyddLFxuICAgICdhdmFpbGFiaWxpdHktem9uZXM6YWNjb3VudD0xMjM0NTY3ODpyZWdpb249dGVzdC1yZWdpb24nOiBbJ3Rlc3QtcmVnaW9uLTFhJywgJ3Rlc3QtcmVnaW9uLTFiJywgJ3Rlc3QtcmVnaW9uLTFjJ10sXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4tYW1pLWh2bS14ODZfNjQtZ3AyOnJlZ2lvbj10ZXN0LXJlZ2lvbic6ICdhbWktMTIzNCcsXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4yLWFtaS1odm0teDg2XzY0LWdwMjpyZWdpb249dGVzdC1yZWdpb24nOiAnYW1pLTEyMzQnLFxuICAgICdzc206YWNjb3VudD0xMjM0NTY3ODpwYXJhbWV0ZXJOYW1lPS9hd3Mvc2VydmljZS9lY3Mvb3B0aW1pemVkLWFtaS9hbWF6b24tbGludXgvcmVjb21tZW5kZWQ6cmVnaW9uPXRlc3QtcmVnaW9uJzogJ3tcImltYWdlX2lkXCI6IFwiYW1pLTEyMzRcIn0nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgICAnYW1pOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVycy5pbWFnZS10eXBlLjA9bWFjaGluZTpmaWx0ZXJzLm5hbWUuMD1hbXpuLWFtaS12cGMtbmF0LSo6ZmlsdGVycy5zdGF0ZS4wPWF2YWlsYWJsZTpvd25lcnMuMD1hbWF6b246cmVnaW9uPXRlc3QtcmVnaW9uJzogJ2FtaS0xMjM0JyxcbiAgICAndnBjLXByb3ZpZGVyOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVyLmlzRGVmYXVsdD10cnVlOnJlZ2lvbj10ZXN0LXJlZ2lvbjpyZXR1cm5Bc3ltbWV0cmljU3VibmV0cz10cnVlJzoge1xuICAgICAgdnBjSWQ6ICd2cGMtNjA5MDA5MDUnLFxuICAgICAgc3VibmV0R3JvdXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnUHVibGljJyxcbiAgICAgICAgICBuYW1lOiAnUHVibGljJyxcbiAgICAgICAgICBzdWJuZXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN1Ym5ldElkOiAnc3VibmV0LWUxOTQ1NWNhJyxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogJ3VzLWVhc3QtMWEnLFxuICAgICAgICAgICAgICByb3V0ZVRhYmxlSWQ6ICdydGItZTE5NDU1Y2EnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3VibmV0SWQ6ICdzdWJuZXQtZTBjMjQ3OTcnLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiAndXMtZWFzdC0xYicsXG4gICAgICAgICAgICAgIHJvdXRlVGFibGVJZDogJ3J0Yi1lMGMyNDc5NycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdWJuZXRJZDogJ3N1Ym5ldC1jY2Q3NzM5NScsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6ICd1cy1lYXN0LTFjJyxcbiAgICAgICAgICAgICAgcm91dGVUYWJsZUlkOiAncnRiLWNjZDc3Mzk1JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAgZW52OiB7XG4gICAgQ0RLX0lOVEVHX0FDQ09VTlQ6ICcxMjM0NTY3OCcsXG4gICAgQ0RLX0lOVEVHX1JFR0lPTjogJ3Rlc3QtcmVnaW9uJyxcbiAgICBDREtfSU5URUdfSE9TVEVEX1pPTkVfSUQ6ICdaMjNBQkM0WFlaTDA1QicsXG4gICAgQ0RLX0lOVEVHX0hPU1RFRF9aT05FX05BTUU6ICdleGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0RPTUFJTl9OQU1FOiAnKi5leGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0NFUlRfQVJOOiAnYXJuOmF3czphY206dGVzdC1yZWdpb246MTIzNDU2Nzg6Y2VydGlmaWNhdGUvODY0NjgyMDktYTI3Mi01OTVkLWI4MzEtMGVmYjY0MjEyNjV6JyxcbiAgICBDREtfSU5URUdfU1VCTkVUX0lEOiAnc3VibmV0LTBkZmYxYTM5OWQ4ZjZmOTJjJyxcbiAgfSxcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBjdXJyZW50bHkgcmVjb21tZW5kZWQgZmxhZ3MgZm9yIGBhd3MtY2RrLWxpYmAuXG4gKlxuICogVGhlc2UgaGF2ZSBiZWVuIGJ1aWx0IGludG8gdGhlIENMSSBhdCBidWlsZCB0aW1lLiBJZiB0aGlzIGV2ZXIgZ2V0cyBjaGFuZ2VkXG4gKiBiYWNrIHRvIGEgZHluYW1pYyBsb2FkLCByZW1lbWJlciB0aGF0IHRoaXMgc291cmNlIGZpbGUgbWF5IGJlIGJ1bmRsZWQgaW50b1xuICogYSBKYXZhU2NyaXB0IGJ1bmRsZSwgYW5kIGBfX2Rpcm5hbWVgIG1pZ2h0IG5vdCBwb2ludCB3aGVyZSB5b3UgdGhpbmsgaXQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRseVJlY29tbWVuZGVkQXdzQ2RrTGliRmxhZ3MoKSB7XG4gIHJldHVybiByZWNvbW1lbmRlZEZsYWdzRmlsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uIHtcbiAgcmVhZG9ubHkgdGVzdERlZmluaXRpb246IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHJlYWRvbmx5IHNuYXBzaG90RGlyZWN0b3J5OiBzdHJpbmc7XG59XG4iXX0=