velocious 1.0.217 → 1.0.219

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -331,6 +331,8 @@ Frontend-model command transport preserves `Date` and `undefined` by encoding th
331
331
  - `bigint` -> `{__velocious_type: "bigint", value: "<decimal string>"}`
332
332
  - `NaN` / `Infinity` / `-Infinity` -> `{__velocious_type: "number", value: "NaN" | "Infinity" | "-Infinity"}`
333
333
 
334
+ Frontend-model commands raise an `Error` when the backend responds with `{status: "error"}` (using `errorMessage` when present), so unauthorized or missing-record update/find/destroy responses fail fast in frontend code.
335
+
334
336
  ## Route resolver hooks
335
337
 
336
338
  Libraries can hook unresolved routes and hijack them before Velocious falls back to the built-in 404 controller.
@@ -1,5 +1,10 @@
1
1
  export default class VelociousCliCommandsServer extends BaseCommand {
2
2
  output: string;
3
+ /**
4
+ * @param {string} actionName - Raw route action name.
5
+ * @returns {string} - Normalized method name.
6
+ */
7
+ normalizeActionName(actionName: string): string;
3
8
  execute(): Promise<{
4
9
  output: string;
5
10
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/routes.js"],"names":[],"mappings":"AAKA;IACE,eAAW;IAEX;;OAWC;IAED;;;;OAIG;IACH,mBAJW,OAAO,kCAAkC,EAAE,OAAO,UAClD,MAAM,GACJ,IAAI,CAYhB;IAED;;;OAGG;IACH,aAHW,MAAM,GACJ,IAAI,CAQhB;CACF;wBA9CuB,iCAAiC"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/routes.js"],"names":[],"mappings":"AAKA;IACE,eAAW;IAEX;;;OAGG;IACH,gCAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;OAWC;IAED;;;;OAIG;IACH,mBAJW,OAAO,kCAAkC,EAAE,OAAO,UAClD,MAAM,GACJ,IAAI,CAYhB;IAED;;;OAGG;IACH,aAHW,MAAM,GACJ,IAAI,CAQhB;CACF;wBAtDuB,iCAAiC"}
@@ -3,6 +3,13 @@ import Application from "../../../../application.js";
3
3
  import BaseCommand from "../../../../cli/base-command.js";
4
4
  export default class VelociousCliCommandsServer extends BaseCommand {
5
5
  output = "";
6
+ /**
7
+ * @param {string} actionName - Raw route action name.
8
+ * @returns {string} - Normalized method name.
9
+ */
10
+ normalizeActionName(actionName) {
11
+ return inflection.camelize(actionName.replaceAll("-", "_").replaceAll("/", "_"), true);
12
+ }
6
13
  async execute() {
7
14
  const application = new Application({
8
15
  configuration: this.getConfiguration(),
@@ -21,7 +28,7 @@ export default class VelociousCliCommandsServer extends BaseCommand {
21
28
  printRoutes(route, level = 0) {
22
29
  const prefix = " ".repeat(level);
23
30
  for (const routeData of route.getHumanPaths()) {
24
- this.log(`${prefix}${routeData.method} ${routeData.path}${routeData.action ? ` -> ${inflection.camelize(routeData.action.replaceAll("-", "_"), true)}` : ""}`);
31
+ this.log(`${prefix}${routeData.method} ${routeData.path}${routeData.action ? ` -> ${this.normalizeActionName(routeData.action)}` : ""}`);
25
32
  }
26
33
  for (const subRoute of route.getSubRoutes()) {
27
34
  this.printRoutes(subRoute, level + 1);
@@ -40,4 +47,4 @@ export default class VelociousCliCommandsServer extends BaseCommand {
40
47
  }
41
48
  }
42
49
  }
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL3JvdXRlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxPQUFPLFdBQVcsTUFBTSw0QkFBNEIsQ0FBQTtBQUNwRCxPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV6RCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEyQixTQUFRLFdBQVc7SUFDakUsTUFBTSxHQUFHLEVBQUUsQ0FBQTtJQUVYLEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDbEMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN0QyxJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUMsQ0FBQTtRQUNGLE1BQU0sV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRWxELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRWxDLE9BQU8sRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFBO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWpDLEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ2hLLENBQUM7UUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxPQUFPO1FBQ1QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxDQUFBO1FBQy9CLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN0QixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5cbmltcG9ydCBBcHBsaWNhdGlvbiBmcm9tIFwiLi4vLi4vLi4vLi4vYXBwbGljYXRpb24uanNcIlxuaW1wb3J0IEJhc2VDb21tYW5kIGZyb20gXCIuLi8uLi8uLi8uLi9jbGkvYmFzZS1jb21tYW5kLmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzQ2xpQ29tbWFuZHNTZXJ2ZXIgZXh0ZW5kcyBCYXNlQ29tbWFuZHtcbiAgb3V0cHV0ID0gXCJcIlxuXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb24oe1xuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5nZXRDb25maWd1cmF0aW9uKCksXG4gICAgICB0eXBlOiBcInNlcnZlclwiXG4gICAgfSlcbiAgICBhd2FpdCBhcHBsaWNhdGlvbi5pbml0aWFsaXplKClcbiAgICBjb25zdCByb3V0ZXMgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRSb3V0ZXMoKVxuXG4gICAgdGhpcy5wcmludFJvdXRlcyhyb3V0ZXMucm9vdFJvdXRlKVxuXG4gICAgcmV0dXJuIHtvdXRwdXQ6IHRoaXMub3V0cHV0fVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vcm91dGVzL2Jhc2Utcm91dGUuanNcIikuZGVmYXVsdH0gcm91dGUgLSBSb3V0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtsZXZlbF0gLSBMZXZlbC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcHJpbnRSb3V0ZXMocm91dGUsIGxldmVsID0gMCkge1xuICAgIGNvbnN0IHByZWZpeCA9IFwiICBcIi5yZXBlYXQobGV2ZWwpXG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlRGF0YSBvZiByb3V0ZS5nZXRIdW1hblBhdGhzKCkpIHtcbiAgICAgIHRoaXMubG9nKGAke3ByZWZpeH0ke3JvdXRlRGF0YS5tZXRob2R9ICR7cm91dGVEYXRhLnBhdGh9JHtyb3V0ZURhdGEuYWN0aW9uID8gYCAtPiAke2luZmxlY3Rpb24uY2FtZWxpemUocm91dGVEYXRhLmFjdGlvbi5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIiksIHRydWUpfWAgOiBcIlwifWApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdWJSb3V0ZSBvZiByb3V0ZS5nZXRTdWJSb3V0ZXMoKSkge1xuICAgICAgdGhpcy5wcmludFJvdXRlcyhzdWJSb3V0ZSwgbGV2ZWwgKyAxKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIENvbnRlbnQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGxvZyhjb250ZW50KSB7XG4gICAgaWYgKHRoaXMuY2xpLmdldFRlc3RpbmcoKSkge1xuICAgICAgdGhpcy5vdXRwdXQgKz0gYCR7Y29udGVudH1cXG5gXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNvbnRlbnQpXG4gICAgfVxuICB9XG59XG4iXX0=
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL3JvdXRlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxPQUFPLFdBQVcsTUFBTSw0QkFBNEIsQ0FBQTtBQUNwRCxPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV6RCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEyQixTQUFRLFdBQVc7SUFDakUsTUFBTSxHQUFHLEVBQUUsQ0FBQTtJQUVYOzs7T0FHRztJQUNILG1CQUFtQixDQUFDLFVBQVU7UUFDNUIsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDeEYsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDbEMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN0QyxJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUMsQ0FBQTtRQUNGLE1BQU0sV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRWxELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRWxDLE9BQU8sRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFBO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWpDLEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDMUksQ0FBQztRQUVELEtBQUssTUFBTSxRQUFRLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLE9BQU87UUFDVCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLENBQUE7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcblxuaW1wb3J0IEFwcGxpY2F0aW9uIGZyb20gXCIuLi8uLi8uLi8uLi9hcHBsaWNhdGlvbi5qc1wiXG5pbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNDbGlDb21tYW5kc1NlcnZlciBleHRlbmRzIEJhc2VDb21tYW5ke1xuICBvdXRwdXQgPSBcIlwiXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25OYW1lIC0gUmF3IHJvdXRlIGFjdGlvbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgbWV0aG9kIG5hbWUuXG4gICAqL1xuICBub3JtYWxpemVBY3Rpb25OYW1lKGFjdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gaW5mbGVjdGlvbi5jYW1lbGl6ZShhY3Rpb25OYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKS5yZXBsYWNlQWxsKFwiL1wiLCBcIl9cIiksIHRydWUpXG4gIH1cblxuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLFxuICAgICAgdHlwZTogXCJzZXJ2ZXJcIlxuICAgIH0pXG4gICAgYXdhaXQgYXBwbGljYXRpb24uaW5pdGlhbGl6ZSgpXG4gICAgY29uc3Qgcm91dGVzID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Um91dGVzKClcblxuICAgIHRoaXMucHJpbnRSb3V0ZXMocm91dGVzLnJvb3RSb3V0ZSlcblxuICAgIHJldHVybiB7b3V0cHV0OiB0aGlzLm91dHB1dH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uL3JvdXRlcy9iYXNlLXJvdXRlLmpzXCIpLmRlZmF1bHR9IHJvdXRlIC0gUm91dGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWxdIC0gTGV2ZWwuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHByaW50Um91dGVzKHJvdXRlLCBsZXZlbCA9IDApIHtcbiAgICBjb25zdCBwcmVmaXggPSBcIiAgXCIucmVwZWF0KGxldmVsKVxuXG4gICAgZm9yIChjb25zdCByb3V0ZURhdGEgb2Ygcm91dGUuZ2V0SHVtYW5QYXRocygpKSB7XG4gICAgICB0aGlzLmxvZyhgJHtwcmVmaXh9JHtyb3V0ZURhdGEubWV0aG9kfSAke3JvdXRlRGF0YS5wYXRofSR7cm91dGVEYXRhLmFjdGlvbiA/IGAgLT4gJHt0aGlzLm5vcm1hbGl6ZUFjdGlvbk5hbWUocm91dGVEYXRhLmFjdGlvbil9YCA6IFwiXCJ9YClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN1YlJvdXRlIG9mIHJvdXRlLmdldFN1YlJvdXRlcygpKSB7XG4gICAgICB0aGlzLnByaW50Um91dGVzKHN1YlJvdXRlLCBsZXZlbCArIDEpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gQ29udGVudC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgbG9nKGNvbnRlbnQpIHtcbiAgICBpZiAodGhpcy5jbGkuZ2V0VGVzdGluZygpKSB7XG4gICAgICB0aGlzLm91dHB1dCArPSBgJHtjb250ZW50fVxcbmBcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY29udGVudClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -261,6 +261,22 @@ export default class FrontendModelBase {
261
261
  * @returns {Promise<Record<string, any>>} - Parsed JSON response.
262
262
  */
263
263
  static executeCommand(this: typeof FrontendModelBase, commandType: "find" | "index" | "update" | "destroy", payload: Record<string, any>): Promise<Record<string, any>>;
264
+ /**
265
+ * @this {typeof FrontendModelBase}
266
+ * @param {object} args - Arguments.
267
+ * @param {"find" | "index" | "update" | "destroy"} args.commandType - Command type.
268
+ * @param {Record<string, any>} args.response - Decoded response.
269
+ * @returns {void}
270
+ */
271
+ static throwOnErrorFrontendModelResponse(this: typeof FrontendModelBase, { commandType, response }: {
272
+ commandType: "find" | "index" | "update" | "destroy";
273
+ response: Record<string, any>;
274
+ }): void;
275
+ /**
276
+ * @this {typeof FrontendModelBase}
277
+ * @returns {Set<string>} - Configured frontend model attribute names.
278
+ */
279
+ static configuredFrontendModelAttributeNames(this: typeof FrontendModelBase): Set<string>;
264
280
  /**
265
281
  * @param {Record<string, any>} [attributes] - Initial attributes.
266
282
  */
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/base.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/base.js"],"names":[],"mappings":"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"}
@@ -823,7 +823,12 @@ export default class FrontendModelBase {
823
823
  payload: serializedPayload,
824
824
  url
825
825
  });
826
- return /** @type {Record<string, any>} */ (deserializeFrontendModelTransportValue(customResponse));
826
+ const decodedResponse = /** @type {Record<string, any>} */ (deserializeFrontendModelTransportValue(customResponse));
827
+ this.throwOnErrorFrontendModelResponse({
828
+ commandType,
829
+ response: decodedResponse
830
+ });
831
+ return decodedResponse;
827
832
  }
828
833
  const response = await fetch(url, {
829
834
  body: JSON.stringify(serializedPayload),
@@ -838,7 +843,55 @@ export default class FrontendModelBase {
838
843
  }
839
844
  const responseText = await response.text();
840
845
  const json = responseText.length > 0 ? JSON.parse(responseText) : {};
841
- return /** @type {Record<string, any>} */ (deserializeFrontendModelTransportValue(json));
846
+ const decodedResponse = /** @type {Record<string, any>} */ (deserializeFrontendModelTransportValue(json));
847
+ this.throwOnErrorFrontendModelResponse({
848
+ commandType,
849
+ response: decodedResponse
850
+ });
851
+ return decodedResponse;
852
+ }
853
+ /**
854
+ * @this {typeof FrontendModelBase}
855
+ * @param {object} args - Arguments.
856
+ * @param {"find" | "index" | "update" | "destroy"} args.commandType - Command type.
857
+ * @param {Record<string, any>} args.response - Decoded response.
858
+ * @returns {void}
859
+ */
860
+ static throwOnErrorFrontendModelResponse({ commandType, response }) {
861
+ if (response?.status !== "error")
862
+ return;
863
+ const responseKeys = Object.keys(response);
864
+ const hasOnlyStatus = responseKeys.length === 1 && responseKeys[0] === "status";
865
+ const hasErrorMessage = typeof response.errorMessage === "string" && response.errorMessage.length > 0;
866
+ const hasErrorEnvelopeKeys = Boolean(response.code !== undefined
867
+ || response.error !== undefined
868
+ || response.errors !== undefined
869
+ || response.message !== undefined);
870
+ const nonStatusKeys = responseKeys.filter((key) => key !== "status");
871
+ const configuredAttributeNames = this.configuredFrontendModelAttributeNames();
872
+ const looksLikeRawModelPayload = nonStatusKeys.length > 0
873
+ && nonStatusKeys.every((key) => configuredAttributeNames.has(key));
874
+ if (!hasErrorMessage && !hasOnlyStatus && !hasErrorEnvelopeKeys && looksLikeRawModelPayload)
875
+ return;
876
+ const errorMessage = hasErrorMessage
877
+ ? response.errorMessage
878
+ : `Request failed for ${this.name}#${commandType}`;
879
+ throw new Error(errorMessage);
880
+ }
881
+ /**
882
+ * @this {typeof FrontendModelBase}
883
+ * @returns {Set<string>} - Configured frontend model attribute names.
884
+ */
885
+ static configuredFrontendModelAttributeNames() {
886
+ const resourceConfig = /** @type {Record<string, any>} */ (this.resourceConfig());
887
+ const attributes = resourceConfig.attributes;
888
+ if (Array.isArray(attributes)) {
889
+ return new Set(attributes.filter((attributeName) => typeof attributeName === "string"));
890
+ }
891
+ if (attributes && typeof attributes === "object") {
892
+ return new Set(Object.keys(attributes));
893
+ }
894
+ return new Set();
842
895
  }
843
896
  }
844
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbHMvYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxrQkFBa0IsTUFBTSxZQUFZLENBQUE7QUFDM0MsT0FBTyxFQUFDLHNDQUFzQyxFQUFFLG9DQUFvQyxFQUFDLE1BQU0sOEJBQThCLENBQUE7QUFFekgscUhBQXFIO0FBQ3JIOzs7Ozs7OztHQVFHO0FBRUgsMkNBQTJDO0FBQzNDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxDQUFBO0FBQ3ZDLE1BQU0sMkJBQTJCLEdBQUcsMEJBQTBCLENBQUE7QUFDOUQsTUFBTSx1QkFBdUIsR0FBRyxzQkFBc0IsQ0FBQTtBQUV0RCxzRkFBc0Y7QUFDdEYsTUFBTSxPQUFPLHlCQUEwQixTQUFRLEtBQUs7SUFDbEQ7OztPQUdHO0lBQ0gsWUFBWSxTQUFTLEVBQUUsYUFBYTtRQUNsQyxLQUFLLENBQUMsR0FBRyxTQUFTLElBQUksYUFBYSxtQkFBbUIsQ0FBQyxDQUFBO1FBQ3ZELElBQUksQ0FBQyxJQUFJLEdBQUcsMkJBQTJCLENBQUE7SUFDekMsQ0FBQztDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRTdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFOUMsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFBO0FBQzdELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGlDQUFpQztJQUM1Qzs7OztPQUlHO0lBQ0gsWUFBWSxLQUFLLEVBQUUsZ0JBQWdCLEVB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QU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQzFDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFcEUsT0FBTyxrQ0FBa0MsQ0FBQyxDQUFDLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDMUYsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBGcm9udGVuZE1vZGVsUXVlcnkgZnJvbSBcIi4vcXVlcnkuanNcIlxuaW1wb3J0IHtkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSwgc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBmcm9tIFwiLi90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7e2NvbW1hbmRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgcGF0aD86IHN0cmluZywgcHJpbWFyeUtleT86IHN0cmluZ319IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZyAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Jhc2VVcmxdIC0gT3B0aW9uYWwgYmFzZSBVUkwgcHJlZml4ZWQgYmVmb3JlIHJlc291cmNlIHBhdGhzLlxuICogQHByb3BlcnR5IHsoKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCl9IFtiYXNlVXJsUmVzb2x2ZXJdIC0gT3B0aW9uYWwgcmVzb2x2ZXIgdXNlZCBwZXIgcmVxdWVzdCBmb3IgZHluYW1pYyBiYXNlIFVSTC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aFByZWZpeF0gLSBPcHRpb25hbCBwYXRoIHByZWZpeCBpbnNlcnRlZCBiZXR3ZWVuIGJhc2UgVVJMIGFuZCByZXNvdXJjZSBwYXRoLlxuICogQHByb3BlcnR5IHsoKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCl9IFtwYXRoUHJlZml4UmVzb2x2ZXJdIC0gT3B0aW9uYWwgcmVzb2x2ZXIgdXNlZCBwZXIgcmVxdWVzdCBmb3IgZHluYW1pYyBwYXRoIHByZWZpeC5cbiAqIEBwcm9wZXJ0eSB7XCJvbWl0XCIgfCBcInNhbWUtb3JpZ2luXCIgfCBcImluY2x1ZGVcIn0gW2NyZWRlbnRpYWxzXSAtIE9wdGlvbmFsIGNyZWRlbnRpYWxzIG1vZGUgZm9yd2FyZGVkIHRvIGZldGNoLlxuICogQHByb3BlcnR5IHsoKGFyZ3M6IHtjb21tYW5kTmFtZTogc3RyaW5nLCBjb21tYW5kVHlwZTogXCJmaW5kXCIgfCBcImluZGV4XCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIG1vZGVsQ2xhc3M6IHR5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSwgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgYW55PiwgdXJsOiBzdHJpbmd9KSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+KX0gW3JlcXVlc3RdIC0gT3B0aW9uYWwgY3VzdG9tIHRyYW5zcG9ydCBoYW5kbGVyLlxuICovXG5cbi8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZ30gKi9cbmNvbnN0IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcgPSB7fVxuY29uc3QgUFJFTE9BREVEX1JFTEFUSU9OU0hJUFNfS0VZID0gXCJfX3ByZWxvYWRlZFJlbGF0aW9uc2hpcHNcIlxuY29uc3QgU0VMRUNURURfQVRUUklCVVRFU19LRVkgPSBcIl9fc2VsZWN0ZWRBdHRyaWJ1dGVzXCJcblxuLyoqIEVycm9yIHJhaXNlZCB3aGVuIHJlYWRpbmcgYW4gYXR0cmlidXRlIHRoYXQgd2FzIG5vdCBzZWxlY3RlZCBpbiBxdWVyeSBwYXlsb2Fkcy4gKi9cbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVOb3RTZWxlY3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIHRoYXQgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsTmFtZSwgYXR0cmlidXRlTmFtZSkge1xuICAgIHN1cGVyKGAke21vZGVsTmFtZX0jJHthdHRyaWJ1dGVOYW1lfSB3YXMgbm90IHNlbGVjdGVkYClcbiAgICB0aGlzLm5hbWUgPSBcIkF0dHJpYnV0ZU5vdFNlbGVjdGVkRXJyb3JcIlxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFdoZXRoZXIgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSlcblxuICByZXR1cm4gcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvdHlwZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIExpZ2h0d2VpZ2h0IHNpbmd1bGFyIHJlbGF0aW9uc2hpcCBzdGF0ZSBob2xkZXIgZm9yIGZyb250ZW5kIG1vZGVsIGluc3RhbmNlcy5cbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBTXG4gKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICovXG5leHBvcnQgY2xhc3MgRnJvbnRlbmRNb2RlbFNpbmd1bGFyUmVsYXRpb25zaGlwIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7SW5zdGFuY2VUeXBlPFM+fSBtb2RlbCAtIFBhcmVudCBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHBhcmFtIHtUIHwgbnVsbH0gdGFyZ2V0TW9kZWxDbGFzcyAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsLCByZWxhdGlvbnNoaXBOYW1lLCB0YXJnZXRNb2RlbENsYXNzKSB7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsXG4gICAgdGhpcy5yZWxhdGlvbnNoaXBOYW1lID0gcmVsYXRpb25zaGlwTmFtZVxuICAgIHRoaXMudGFyZ2V0TW9kZWxDbGFzcyA9IHRhcmdldE1vZGVsQ2xhc3NcbiAgICB0aGlzLl9wcmVsb2FkZWQgPSBmYWxzZVxuICAgIHRoaXMuX2xvYWRlZFZhbHVlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBsb2FkZWRWYWx1ZSAtIExvYWRlZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TG9hZGVkKGxvYWRlZFZhbHVlKSB7XG4gICAgdGhpcy5fbG9hZGVkVmFsdWUgPSBsb2FkZWRWYWx1ZSA9PSB1bmRlZmluZWQgPyBudWxsIDogbG9hZGVkVmFsdWVcbiAgICB0aGlzLl9wcmVsb2FkZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciByZWxhdGlvbnNoaXAgaXMgcHJlbG9hZGVkLlxuICAgKi9cbiAgZ2V0UHJlbG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVsb2FkZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7YW55fSAtIExvYWRlZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqL1xuICBsb2FkZWQoKSB7XG4gICAgaWYgKCF0aGlzLl9wcmVsb2FkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IyR7dGhpcy5yZWxhdGlvbnNoaXBOYW1lfSBoYXNuJ3QgYmVlbiBwcmVsb2FkZWRgKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9sb2FkZWRWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdIC0gTmV3IG1vZGVsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm5zIHtJbnN0YW5jZVR5cGU8VD59IC0gQnVpbHQgbW9kZWwuXG4gICAqL1xuICBidWlsZChhdHRyaWJ1dGVzID0ge30pIHtcbiAgICBpZiAoIXRoaXMudGFyZ2V0TW9kZWxDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXJnZXQgbW9kZWwgY2xhc3MgY29uZmlndXJlZCBmb3IgJHt0aGlzLm1vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IyR7dGhpcy5yZWxhdGlvbnNoaXBOYW1lfWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWwgPSAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKG5ldyB0aGlzLnRhcmdldE1vZGVsQ2xhc3MoYXR0cmlidXRlcykpXG5cbiAgICB0aGlzLnNldExvYWRlZChtb2RlbClcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG59XG5cbi8qKlxuICogTGlnaHR3ZWlnaHQgaGFzLW1hbnkgcmVsYXRpb25zaGlwIHN0YXRlIGhvbGRlciBmb3IgZnJvbnRlbmQgbW9kZWwgaW5zdGFuY2VzLlxuICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFNcbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gKi9cbmV4cG9ydCBjbGFzcyBGcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0luc3RhbmNlVHlwZTxTPn0gbW9kZWwgLSBQYXJlbnQgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gICAqIEBwYXJhbSB7VCB8IG51bGx9IHRhcmdldE1vZGVsQ2xhc3MgLSBUYXJnZXQgbW9kZWwgY2xhc3MuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlbCwgcmVsYXRpb25zaGlwTmFtZSwgdGFyZ2V0TW9kZWxDbGFzcykge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbFxuICAgIHRoaXMucmVsYXRpb25zaGlwTmFtZSA9IHJlbGF0aW9uc2hpcE5hbWVcbiAgICB0aGlzLnRhcmdldE1vZGVsQ2xhc3MgPSB0YXJnZXRNb2RlbENsYXNzXG4gICAgdGhpcy5fcHJlbG9hZGVkID0gZmFsc2VcbiAgICB0aGlzLl9sb2FkZWRWYWx1ZSA9IFtdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxJbnN0YW5jZVR5cGU8VD4+fSBsb2FkZWRWYWx1ZSAtIExvYWRlZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TG9hZGVkKGxvYWRlZFZhbHVlKSB7XG4gICAgdGhpcy5fbG9hZGVkVmFsdWUgPSBBcnJheS5pc0FycmF5KGxvYWRlZFZhbHVlKSA/IGxvYWRlZFZhbHVlIDogW11cbiAgICB0aGlzLl9wcmVsb2FkZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciByZWxhdGlvbnNoaXAgaXMgcHJlbG9hZGVkLlxuICAgKi9cbiAgZ2V0UHJlbG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVsb2FkZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBMb2FkZWQgcmVsYXRpb25zaGlwIHZhbHVlcy5cbiAgICovXG4gIGxvYWRlZCgpIHtcbiAgICBpZiAoIXRoaXMuX3ByZWxvYWRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLnJlbGF0aW9uc2hpcE5hbWV9IGhhc24ndCBiZWVuIHByZWxvYWRlZGApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlZFZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxJbnN0YW5jZVR5cGU8VD4+fSBtb2RlbHMgLSBNb2RlbHMgdG8gYXBwZW5kLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFkZFRvTG9hZGVkKG1vZGVscykge1xuICAgIGNvbnN0IGxvYWRlZE1vZGVscyA9IHRoaXMuZ2V0UHJlbG9hZGVkKCkgPyB0aGlzLmxvYWRlZCgpIDogW11cblxuICAgIHRoaXMuc2V0TG9hZGVkKFsuLi5sb2FkZWRNb2RlbHMsIC4uLm1vZGVsc10pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXR0cmlidXRlc10gLSBOZXcgbW9kZWwgYXR0cmlidXRlcy5cbiAgICogQHJldHVybnMge0luc3RhbmNlVHlwZTxUPn0gLSBCdWlsdCBtb2RlbC5cbiAgICovXG4gIGJ1aWxkKGF0dHJpYnV0ZXMgPSB7fSkge1xuICAgIGlmICghdGhpcy50YXJnZXRNb2RlbENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRhcmdldCBtb2RlbCBjbGFzcyBjb25maWd1cmVkIGZvciAke3RoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLnJlbGF0aW9uc2hpcE5hbWV9YClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbCA9IC8qKiBAdHlwZSB7SW5zdGFuY2VUeXBlPFQ+fSAqLyAobmV3IHRoaXMudGFyZ2V0TW9kZWxDbGFzcyhhdHRyaWJ1dGVzKSlcblxuICAgIHRoaXMuYWRkVG9Mb2FkZWQoW21vZGVsXSlcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcFR5cGUgLSBSZWxhdGlvbnNoaXAgdHlwZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcmVsYXRpb25zaGlwIHR5cGUgaXMgaGFzLW1hbnkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aW9uc2hpcFR5cGVJc0NvbGxlY3Rpb24ocmVsYXRpb25zaGlwVHlwZSkge1xuICByZXR1cm4gcmVsYXRpb25zaGlwVHlwZSA9PSBcImhhc01hbnlcIlxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbH0gdmFsdWUgLSBCYXNlIFVSTCBjYW5kaWRhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgYmFzZSBVUkwgd2l0aG91dCB0cmFpbGluZyBzbGFzaC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQmFzZVVybCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJcIlxuXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcblxuICBpZiAoIXRyaW1tZWQubGVuZ3RoKSByZXR1cm4gXCJcIlxuXG4gIHJldHVybiB0cmltbWVkLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZCB8IG51bGx9IHZhbHVlIC0gUGF0aCBwcmVmaXggY2FuZGlkYXRlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIHBhdGggcHJlZml4IHdpdGggbGVhZGluZyBzbGFzaCBhbmQgbm8gdHJhaWxpbmcgc2xhc2guXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhQcmVmaXgodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiXCJcblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG5cbiAgaWYgKCF0cmltbWVkLmxlbmd0aCkgcmV0dXJuIFwiXCJcblxuICBjb25zdCB3aXRoTGVhZGluZ1NsYXNoID0gdHJpbW1lZC5zdGFydHNXaXRoKFwiL1wiKSA/IHRyaW1tZWQgOiBgLyR7dHJpbW1lZH1gXG5cbiAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2gucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZVBhdGggLSBSZXNvdXJjZSBwYXRoIChleHBlY3RlZCBhYnNvbHV0ZSBwYXRoKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kTmFtZSAtIENvbW1hbmQgbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29tYmluZWQgY29tbWFuZCBVUkwuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxDb21tYW5kVXJsKHJlc291cmNlUGF0aCwgY29tbWFuZE5hbWUpIHtcbiAgY29uc3QgcmVzb2x2ZWRCYXNlVXJsID0gZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5iYXNlVXJsUmVzb2x2ZXJcbiAgICA/IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcuYmFzZVVybFJlc29sdmVyKClcbiAgICA6IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcuYmFzZVVybFxuICBjb25zdCBiYXNlVXJsID0gbm9ybWFsaXplQmFzZVVybChyZXNvbHZlZEJhc2VVcmwpXG4gIGNvbnN0IHJlc29sdmVkUGF0aFByZWZpeCA9IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcucGF0aFByZWZpeFJlc29sdmVyXG4gICAgPyBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnBhdGhQcmVmaXhSZXNvbHZlcigpXG4gICAgOiBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnBhdGhQcmVmaXhcbiAgY29uc3QgcGF0aFByZWZpeCA9IG5vcm1hbGl6ZVBhdGhQcmVmaXgocmVzb2x2ZWRQYXRoUHJlZml4KVxuICBjb25zdCBub3JtYWxpemVkUmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcmVzb3VyY2VQYXRoIDogYC8ke3Jlc291cmNlUGF0aH1gXG5cbiAgcmV0dXJuIGAke2Jhc2VVcmx9JHtwYXRoUHJlZml4fSR7bm9ybWFsaXplZFJlc291cmNlUGF0aH0vJHtjb21tYW5kTmFtZX1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gZmluZEJ5IGNvbmRpdGlvbnMuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBKU09OLW5vcm1hbGl6ZWQgY29uZGl0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRmluZENvbmRpdGlvbnMoY29uZGl0aW9ucykge1xuICB0cnkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbmRpdGlvbnMpKSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBjb25kaXRpb25zIGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjb25kaXRpb25zIC0gZmluZEJ5IGNvbmRpdGlvbnMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0RmluZEJ5Q29uZGl0aW9uc1NoYXBlKGNvbmRpdGlvbnMpIHtcbiAgaWYgKCFjb25kaXRpb25zIHx8IHR5cGVvZiBjb25kaXRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoY29uZGl0aW9ucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBleHBlY3RzIGNvbmRpdGlvbnMgdG8gYmUgYSBwbGFpbiBvYmplY3QsIGdvdDogJHtjb25kaXRpb25zfWApXG4gIH1cblxuICBjb25zdCBjb25kaXRpb25zUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbmRpdGlvbnMpXG5cbiAgaWYgKGNvbmRpdGlvbnNQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgY29uZGl0aW9uc1Byb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGV4cGVjdHMgY29uZGl0aW9ucyB0byBiZSBhIHBsYWluIG9iamVjdCwgZ290OiAke2NvbmRpdGlvbnN9YClcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGNvbmRpdGlvbnMpXG5cbiAgaWYgKHN5bWJvbEtleXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGRvZXMgbm90IHN1cHBvcnQgc3ltYm9sIGNvbmRpdGlvbiBrZXlzIChrZXlzOiAke3N5bWJvbEtleXMubWFwKChrZXkpID0+IGtleS50b1N0cmluZygpKS5qb2luKFwiLCBcIil9KWApXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ29uZGl0aW9uIHZhbHVlIHRvIHZhbGlkYXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVBhdGggLSBLZXkgcGF0aCBmb3IgZXJyb3Igb3V0cHV0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydERlZmluZWRGaW5kQnlDb25kaXRpb25WYWx1ZSh2YWx1ZSwga2V5UGF0aCkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGRvZXMgbm90IHN1cHBvcnQgdW5kZWZpbmVkIGNvbmRpdGlvbiB2YWx1ZXMgKGtleTogJHtrZXlQYXRofSlgKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBmdW5jdGlvbiBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3ltYm9sXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IHN5bWJvbCBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IGJpZ2ludCBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1maW5pdGUgbnVtYmVyIGNvbmRpdGlvbiB2YWx1ZXMgKGtleTogJHtrZXlQYXRofSlgKVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiB7XG4gICAgICBhc3NlcnREZWZpbmVkRmluZEJ5Q29uZGl0aW9uVmFsdWUoZW50cnksIGAke2tleVBhdGh9WyR7aW5kZXh9XWApXG4gICAgfSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvYmplY3RWYWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0VmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBub24tcGxhaW4gb2JqZWN0IGNvbmRpdGlvbiB2YWx1ZXMgKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGNvbnN0IHN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdFZhbHVlKVxuXG4gICAgaWYgKHN5bWJvbEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBzeW1ib2wgY29uZGl0aW9uIGtleXMgKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVxuXG4gICAgT2JqZWN0LmtleXModmFsdWVPYmplY3QpLmZvckVhY2goKG5lc3RlZEtleSkgPT4ge1xuICAgICAgYXNzZXJ0RGVmaW5lZEZpbmRCeUNvbmRpdGlvblZhbHVlKHZhbHVlT2JqZWN0W25lc3RlZEtleV0sIGAke2tleVBhdGh9LiR7bmVzdGVkS2V5fWApXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gb3JpZ2luYWxWYWx1ZSAtIE9yaWdpbmFsIGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbm9ybWFsaXplZFZhbHVlIC0gSlNPTi1ub3JtYWxpemVkIGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlQYXRoIC0gS2V5IHBhdGggZm9yIGVycm9yIG91dHB1dC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRGaW5kQnlDb25kaXRpb25TZXJpYWxpemF0aW9uUHJlc2VydmVzVmFsdWUob3JpZ2luYWxWYWx1ZSwgbm9ybWFsaXplZFZhbHVlLCBrZXlQYXRoKSB7XG4gIGlmIChvcmlnaW5hbFZhbHVlID09PSBudWxsKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob3JpZ2luYWxWYWx1ZSkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZFZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGlmIChvcmlnaW5hbFZhbHVlLmxlbmd0aCAhPT0gbm9ybWFsaXplZFZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvcmlnaW5hbFZhbHVlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgYXNzZXJ0RmluZEJ5Q29uZGl0aW9uU2VyaWFsaXphdGlvblByZXNlcnZlc1ZhbHVlKG9yaWdpbmFsVmFsdWVbaW5kZXhdLCBub3JtYWxpemVkVmFsdWVbaW5kZXhdLCBgJHtrZXlQYXRofVske2luZGV4fV1gKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG9yaWdpbmFsVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgaWYgKHR5cGVvZiBub3JtYWxpemVkVmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBjaGFuZ2VkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChvcmlnaW5hbFZhbHVlICYmIHR5cGVvZiBvcmlnaW5hbFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKCFub3JtYWxpemVkVmFsdWUgfHwgdHlwZW9mIG5vcm1hbGl6ZWRWYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBjaGFuZ2VkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKG5vcm1hbGl6ZWRWYWx1ZSlcbiAgICBjb25zdCBvcmlnaW5hbE9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChvcmlnaW5hbFZhbHVlKVxuXG4gICAgT2JqZWN0LmtleXMob3JpZ2luYWxPYmplY3QpLmZvckVhY2goKG5lc3RlZEtleSkgPT4ge1xuICAgICAgaWYgKCEobmVzdGVkS2V5IGluIG5vcm1hbGl6ZWRPYmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBrZXkgd2FzIHJlbW92ZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofS4ke25lc3RlZEtleX0pYClcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0RmluZEJ5Q29uZGl0aW9uU2VyaWFsaXphdGlvblByZXNlcnZlc1ZhbHVlKG9yaWdpbmFsT2JqZWN0W25lc3RlZEtleV0sIG5vcm1hbGl6ZWRPYmplY3RbbmVzdGVkS2V5XSwgYCR7a2V5UGF0aH0uJHtuZXN0ZWRLZXl9YClcbiAgICB9KVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAobm9ybWFsaXplZFZhbHVlICE9PSBvcmlnaW5hbFZhbHVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICB9XG59XG5cbi8qKiBCYXNlIGNsYXNzIGZvciBnZW5lcmF0ZWQgZnJvbnRlbmQgbW9kZWwgY2xhc3Nlcy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyb250ZW5kTW9kZWxCYXNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdIC0gSW5pdGlhbCBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXR0cmlidXRlcyA9IHt9KSB7XG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IHt9XG4gICAgdGhpcy5fcmVsYXRpb25zaGlwcyA9IHt9XG4gICAgdGhpcy5fc2VsZWN0ZWRBdHRyaWJ1dGVzID0gbnVsbFxuICAgIHRoaXMuYXNzaWduQXR0cmlidXRlcyhhdHRyaWJ1dGVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd9IC0gUmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyByZXNvdXJjZUNvbmZpZygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNvdXJjZUNvbmZpZygpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlc1wiKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnJlYWNoYWJsZVxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2U+fSAtIFJlbGF0aW9uc2hpcCBtb2RlbCBjbGFzc2VzIGtleWVkIGJ5IHJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKi9cbiAgc3RhdGljIHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcygpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywge3R5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9Pn0gLSBSZWxhdGlvbnNoaXAgZGVmaW5pdGlvbnMga2V5ZWQgYnkgcmVsYXRpb25zaGlwIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zaGlwRGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHJldHVybnMge3t0eXBlOiBcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifSB8IG51bGx9IC0gUmVsYXRpb25zaGlwIGRlZmluaXRpb24uXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zaGlwRGVmaW5pdGlvbihyZWxhdGlvbnNoaXBOYW1lKSB7XG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSB0aGlzLnJlbGF0aW9uc2hpcERlZmluaXRpb25zKClcblxuICAgIHJldHVybiBkZWZpbml0aW9uc1tyZWxhdGlvbnNoaXBOYW1lXSB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHJldHVybnMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSB8IG51bGx9IC0gVGFyZ2V0IHJlbGF0aW9uc2hpcCBtb2RlbCBjbGFzcy5cbiAgICovXG4gIHN0YXRpYyByZWxhdGlvbnNoaXBNb2RlbENsYXNzKHJlbGF0aW9uc2hpcE5hbWUpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBNb2RlbENsYXNzZXMgPSB0aGlzLnJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcygpXG5cbiAgICByZXR1cm4gcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzW3JlbGF0aW9uc2hpcE5hbWVdIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBBdHRyaWJ1dGVzIGhhc2guXG4gICAqL1xuICBhdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9hdHRyaWJ1dGVzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwPGFueSwgYW55PiB8IEZyb250ZW5kTW9kZWxTaW5ndWxhclJlbGF0aW9uc2hpcDxhbnksIGFueT59IC0gUmVsYXRpb25zaGlwIHN0YXRlIG9iamVjdC5cbiAgICovXG4gIGdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKSB7XG4gICAgaWYgKCF0aGlzLl9yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdKSB7XG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwRGVmaW5pdGlvbiA9IE1vZGVsQ2xhc3MucmVsYXRpb25zaGlwRGVmaW5pdGlvbihyZWxhdGlvbnNoaXBOYW1lKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IE1vZGVsQ2xhc3MucmVsYXRpb25zaGlwTW9kZWxDbGFzcyhyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwRGVmaW5pdGlvbiAmJiByZWxhdGlvbnNoaXBUeXBlSXNDb2xsZWN0aW9uKHJlbGF0aW9uc2hpcERlZmluaXRpb24udHlwZSkpIHtcbiAgICAgICAgdGhpcy5fcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG5ldyBGcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcCh0aGlzLCByZWxhdGlvbnNoaXBOYW1lLCB0YXJnZXRNb2RlbENsYXNzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG5ldyBGcm9udGVuZE1vZGVsU2luZ3VsYXJSZWxhdGlvbnNoaXAodGhpcywgcmVsYXRpb25zaGlwTmFtZSwgdGFyZ2V0TW9kZWxDbGFzcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXR0cmlidXRlcyAtIEF0dHJpYnV0ZXMgdG8gYXNzaWduLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhc3NpZ25BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9IC0gQ2xlYXJzIGNhY2hlZCByZWxhdGlvbnNoaXAgc3RhdGUuXG4gICAqL1xuICBjbGVhclJlbGF0aW9uc2hpcENhY2hlKCkge1xuICAgIHRoaXMuX3JlbGF0aW9uc2hpcHMgPSB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUHJpbWFyeSBrZXkgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBwcmltYXJ5S2V5KCkge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlQ29uZmlnKCkucHJpbWFyeUtleSB8fCBcImlkXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfSAtIFByaW1hcnkga2V5IHZhbHVlLlxuICAgKi9cbiAgcHJpbWFyeUtleVZhbHVlKCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRBdHRyaWJ1dGUoTW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpXG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHByaW1hcnkga2V5ICcke01vZGVsQ2xhc3MucHJpbWFyeUtleSgpfScgb24gJHtNb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7YW55fSAtIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZEF0dHJpYnV0ZXMgJiYgIXRoaXMuX3NlbGVjdGVkQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBBdHRyaWJ1dGVOb3RTZWxlY3RlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgYXR0cmlidXRlTmFtZSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7YW55fSBuZXdWYWx1ZSAtIE5ldyB2YWx1ZS5cbiAgICogQHJldHVybnMge2FueX0gLSBBc3NpZ25lZCB2YWx1ZS5cbiAgICovXG4gIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBuZXdWYWx1ZSkge1xuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLl9hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICB0aGlzLl9hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3VmFsdWVcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlTmFtZSlcbiAgICB9XG5cbiAgICBpZiAoIU9iamVjdC5pcyhwcmV2aW91c1ZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuY2xlYXJSZWxhdGlvbnNoaXBDYWNoZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1ZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBSZXNvdXJjZSBwYXRoLlxuICAgKi9cbiAgc3RhdGljIHJlc291cmNlUGF0aCgpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5yZXNvdXJjZUNvbmZpZygpLnBhdGhcblxuICAgIGlmICghcGF0aCkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHJlc291cmNlIHBhdGggZm9yICR7dGhpcy5uYW1lfWApXG5cbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7XCJmaW5kXCIgfCBcImluZGV4XCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCJ9IGNvbW1hbmRUeXBlIC0gQ29tbWFuZCB0eXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJlc29sdmVkIGNvbW1hbmQgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBjb21tYW5kTmFtZShjb21tYW5kVHlwZSkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gdGhpcy5yZXNvdXJjZUNvbmZpZygpLmNvbW1hbmRzIHx8IHt9XG5cbiAgICByZXR1cm4gY29tbWFuZHNbY29tbWFuZFR5cGVdIHx8IGNvbW1hbmRUeXBlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnfSBjb25maWcgLSBGcm9udGVuZCBtb2RlbCB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIGNvbmZpZ3VyZVRyYW5zcG9ydChjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJiYXNlVXJsXCIpKSB7XG4gICAgICBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLmJhc2VVcmwgPSBjb25maWcuYmFzZVVybFxuICAgIH1cblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBcImJhc2VVcmxSZXNvbHZlclwiKSkge1xuICAgICAgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5iYXNlVXJsUmVzb2x2ZXIgPSBjb25maWcuYmFzZVVybFJlc29sdmVyXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwiY3JlZGVudGlhbHNcIikpIHtcbiAgICAgIGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcuY3JlZGVudGlhbHMgPSBjb25maWcuY3JlZGVudGlhbHNcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJwYXRoUHJlZml4XCIpKSB7XG4gICAgICBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnBhdGhQcmVmaXggPSBjb25maWcucGF0aFByZWZpeFxuICAgIH1cblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBcInBhdGhQcmVmaXhSZXNvbHZlclwiKSkge1xuICAgICAgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5wYXRoUHJlZml4UmVzb2x2ZXIgPSBjb25maWcucGF0aFByZWZpeFJlc29sdmVyXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwicmVxdWVzdFwiKSkge1xuICAgICAgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5yZXF1ZXN0ID0gY29uZmlnLnJlcXVlc3RcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIC0gUmVzcG9uc2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gQXR0cmlidXRlcyBmcm9tIHBheWxvYWQuXG4gICAqL1xuICBzdGF0aWMgYXR0cmlidXRlc0Zyb21SZXNwb25zZShyZXNwb25zZSkge1xuICAgIGNvbnN0IG1vZGVsRGF0YSA9IHRoaXMubW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuXG4gICAgcmV0dXJuIG1vZGVsRGF0YS5hdHRyaWJ1dGVzXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIC0gUmVzcG9uc2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3thdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzZWxlY3RlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdIHwgbnVsbH19IC0gQXR0cmlidXRlcyBhbmQgcHJlbG9hZC9zZWxlY3QgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBtb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QgcmVzcG9uc2UgYnV0IGdvdDogJHtyZXNwb25zZX1gKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBsZXQgbW9kZWxEYXRhXG5cbiAgICBpZiAocmVzcG9uc2UubW9kZWwgJiYgdHlwZW9mIHJlc3BvbnNlLm1vZGVsID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBtb2RlbERhdGEgPSByZXNwb25zZS5tb2RlbFxuICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuYXR0cmlidXRlcyAmJiB0eXBlb2YgcmVzcG9uc2UuYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgbW9kZWxEYXRhID0gcmVzcG9uc2UuYXR0cmlidXRlc1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RlbERhdGEgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChyZXNwb25zZSlcbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gey4uLm1vZGVsRGF0YX1cbiAgICBjb25zdCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzID0gaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzW1BSRUxPQURFRF9SRUxBVElPTlNISVBTX0tFWV0pXG4gICAgICA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKGF0dHJpYnV0ZXNbUFJFTE9BREVEX1JFTEFUSU9OU0hJUFNfS0VZXSlcbiAgICAgIDoge31cbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXNGcm9tUGF5bG9hZCA9IEFycmF5LmlzQXJyYXkoYXR0cmlidXRlc1tTRUxFQ1RFRF9BVFRSSUJVVEVTX0tFWV0pXG4gICAgICA/IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChhdHRyaWJ1dGVzW1NFTEVDVEVEX0FUVFJJQlVURVNfS0VZXSkuZmlsdGVyKChhdHRyaWJ1dGVOYW1lKSA9PiB0eXBlb2YgYXR0cmlidXRlTmFtZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIDogbnVsbFxuXG4gICAgZGVsZXRlIGF0dHJpYnV0ZXNbUFJFTE9BREVEX1JFTEFUSU9OU0hJUFNfS0VZXVxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzW1NFTEVDVEVEX0FUVFJJQlVURVNfS0VZXVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRBdHRyaWJ1dGVzID0gc2VsZWN0ZWRBdHRyaWJ1dGVzRnJvbVBheWxvYWQgfHwgT2JqZWN0LmtleXMoYXR0cmlidXRlcylcblxuICAgIHJldHVybiB7YXR0cmlidXRlcywgcHJlbG9hZGVkUmVsYXRpb25zaGlwcywgc2VsZWN0ZWRBdHRyaWJ1dGVzfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEJhc2V9IG1vZGVsIC0gTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcHJlbG9hZGVkUmVsYXRpb25zaGlwcyAtIFByZWxvYWRlZCByZWxhdGlvbnNoaXAgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgYXBwbHlQcmVsb2FkZWRSZWxhdGlvbnNoaXBzKG1vZGVsLCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgZm9yIChjb25zdCBbcmVsYXRpb25zaGlwTmFtZSwgcmVsYXRpb25zaGlwUGF5bG9hZF0gb2YgT2JqZWN0LmVudHJpZXMocHJlbG9hZGVkUmVsYXRpb25zaGlwcykpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHRoaXMucmVsYXRpb25zaGlwTW9kZWxDbGFzcyhyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBQYXlsb2FkKSkge1xuICAgICAgICByZWxhdGlvbnNoaXAuc2V0TG9hZGVkKHJlbGF0aW9uc2hpcFBheWxvYWQubWFwKChlbnRyeSkgPT4gdGhpcy5pbnN0YW50aWF0ZVJlbGF0aW9uc2hpcFZhbHVlKGVudHJ5LCB0YXJnZXRNb2RlbENsYXNzKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHJlbGF0aW9uc2hpcC5zZXRMb2FkZWQodGhpcy5pbnN0YW50aWF0ZVJlbGF0aW9uc2hpcFZhbHVlKHJlbGF0aW9uc2hpcFBheWxvYWQsIHRhcmdldE1vZGVsQ2xhc3MpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge2FueX0gcmVsYXRpb25zaGlwUGF5bG9hZCAtIFJlbGF0aW9uc2hpcCBwYXlsb2FkIHZhbHVlLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSB8IG51bGx9IHRhcmdldE1vZGVsQ2xhc3MgLSBUYXJnZXQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHthbnl9IC0gSW5zdGFudGlhdGVkIHJlbGF0aW9uc2hpcCB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBpbnN0YW50aWF0ZVJlbGF0aW9uc2hpcFZhbHVlKHJlbGF0aW9uc2hpcFBheWxvYWQsIHRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHJldHVybiByZWxhdGlvbnNoaXBQYXlsb2FkXG5cbiAgICBpZiAoIXJlbGF0aW9uc2hpcFBheWxvYWQgfHwgdHlwZW9mIHJlbGF0aW9uc2hpcFBheWxvYWQgIT09IFwib2JqZWN0XCIpIHJldHVybiByZWxhdGlvbnNoaXBQYXlsb2FkXG5cbiAgICByZXR1cm4gdGFyZ2V0TW9kZWxDbGFzcy5pbnN0YW50aWF0ZUZyb21SZXNwb25zZShyZWxhdGlvbnNoaXBQYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHJlc3BvbnNlIC0gUmVzcG9uc2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0luc3RhbmNlVHlwZTxUPn0gLSBOZXcgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgaW5zdGFudGlhdGVGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLm1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9kZWxEYXRhLmF0dHJpYnV0ZXNcbiAgICBjb25zdCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzID0gbW9kZWxEYXRhLnByZWxvYWRlZFJlbGF0aW9uc2hpcHNcbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXMgPSBtb2RlbERhdGEuc2VsZWN0ZWRBdHRyaWJ1dGVzXG4gICAgY29uc3QgbW9kZWwgPSAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKG5ldyB0aGlzKGF0dHJpYnV0ZXMpKVxuICAgIG1vZGVsLl9zZWxlY3RlZEF0dHJpYnV0ZXMgPSBzZWxlY3RlZEF0dHJpYnV0ZXMgPyBuZXcgU2V0KHNlbGVjdGVkQXR0cmlidXRlcykgOiBudWxsXG5cbiAgICB0aGlzLmFwcGx5UHJlbG9hZGVkUmVsYXRpb25zaGlwcyhtb2RlbCwgcHJlbG9hZGVkUmVsYXRpb25zaGlwcylcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gaWQgLSBSZWNvcmQgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBSZXNvbHZlZCBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kKGlkKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS5maW5kKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBBdHRyaWJ1dGUgbWF0Y2ggY29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD59IC0gRm91bmQgbW9kZWwgb3IgbnVsbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kQnkoY29uZGl0aW9ucykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZEJ5KGNvbmRpdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIEF0dHJpYnV0ZSBtYXRjaCBjb25kaXRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4+fSAtIEZvdW5kIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGZpbmRCeU9yRmFpbChjb25kaXRpb25zKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS5maW5kQnlPckZhaWwoY29uZGl0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+W10+fSAtIExvYWRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdG9BcnJheSgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWVyeSgpLnRvQXJyYXkoKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAtIFF1ZXJ5IGJ1aWxkZXIuXG4gICAqL1xuICBzdGF0aWMgcXVlcnkoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAqLyAobmV3IEZyb250ZW5kTW9kZWxRdWVyeSh7bW9kZWxDbGFzczogdGhpc30pKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQgfCBzdHJpbmcgfCBzdHJpbmdbXX0gcHJlbG9hZCAtIFByZWxvYWQgZ3JhcGguXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgd2l0aCBwcmVsb2FkLlxuICAgKi9cbiAgc3RhdGljIHByZWxvYWQocHJlbG9hZCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gKi8gKHRoaXMucXVlcnkoKS5wcmVsb2FkKHByZWxvYWQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgc3RyaW5nPn0gc2VsZWN0IC0gTW9kZWwtYXdhcmUgYXR0cmlidXRlIHNlbGVjdCBtYXAuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgd2l0aCBzZWxlY3RlZCBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgc3RhdGljIHNlbGVjdChzZWxlY3QpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59ICovICh0aGlzLnF1ZXJ5KCkuc2VsZWN0KHNlbGVjdCkpXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gZmluZEJ5IGNvbmRpdGlvbnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGFzc2VydEZpbmRCeUNvbmRpdGlvbnMoY29uZGl0aW9ucykge1xuICAgIGFzc2VydEZpbmRCeUNvbmRpdGlvbnNTaGFwZShjb25kaXRpb25zKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb25kaXRpb25zID0gbm9ybWFsaXplRmluZENvbmRpdGlvbnMoY29uZGl0aW9ucylcblxuICAgIE9iamVjdC5rZXlzKGNvbmRpdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgYXNzZXJ0RGVmaW5lZEZpbmRCeUNvbmRpdGlvblZhbHVlKGNvbmRpdGlvbnNba2V5XSwga2V5KVxuICAgICAgYXNzZXJ0RmluZEJ5Q29uZGl0aW9uU2VyaWFsaXphdGlvblByZXNlcnZlc1ZhbHVlKGNvbmRpdGlvbnNba2V5XSwgbm9ybWFsaXplZENvbmRpdGlvbnNba2V5XSwga2V5KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsQmFzZX0gbW9kZWwgLSBDYW5kaWRhdGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIE1hdGNoIGNvbmRpdGlvbnMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIG1vZGVsIG1hdGNoZXMgYWxsIGNvbmRpdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgbWF0Y2hlc0ZpbmRCeUNvbmRpdGlvbnMobW9kZWwsIGNvbmRpdGlvbnMpIHtcbiAgICBjb25zdCBtb2RlbEF0dHJpYnV0ZXMgPSBtb2RlbC5hdHRyaWJ1dGVzKClcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmRpdGlvbnMpKSB7XG4gICAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gY29uZGl0aW9uc1trZXldXG4gICAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IG1vZGVsQXR0cmlidXRlc1trZXldXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWUpKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFjdHVhbFZhbHVlKSkge1xuICAgICAgICAgIGlmICghdGhpcy5maW5kQnlDb25kaXRpb25WYWx1ZU1hdGNoZXMoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkVmFsdWUuc29tZSgoZW50cnkpID0+IHRoaXMuZmluZEJ5Q29uZGl0aW9uVmFsdWVNYXRjaGVzKGFjdHVhbFZhbHVlLCBlbnRyeSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZmluZEJ5Q29uZGl0aW9uVmFsdWVNYXRjaGVzKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7dW5rbm93bn0gYWN0dWFsVmFsdWUgLSBBY3R1YWwgbW9kZWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gZXhwZWN0ZWRWYWx1ZSAtIEV4cGVjdGVkIGZpbmQgY29uZGl0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZhbHVlcyBtYXRjaC5cbiAgICovXG4gIHN0YXRpYyBmaW5kQnlDb25kaXRpb25WYWx1ZU1hdGNoZXMoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpIHtcbiAgICBpZiAoZXhwZWN0ZWRWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGFjdHVhbFZhbHVlID09PSBudWxsXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhY3R1YWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGlmIChhY3R1YWxWYWx1ZS5sZW5ndGggIT09IGV4cGVjdGVkVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXhwZWN0ZWRWYWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbmRCeUNvbmRpdGlvblZhbHVlTWF0Y2hlcyhhY3R1YWxWYWx1ZVtpbmRleF0sIGV4cGVjdGVkVmFsdWVbaW5kZXhdKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdGVkVmFsdWUgJiYgdHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmICghYWN0dWFsVmFsdWUgfHwgdHlwZW9mIGFjdHVhbFZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYWN0dWFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3R1YWxPYmplY3QgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoYWN0dWFsVmFsdWUpXG4gICAgICBjb25zdCBleHBlY3RlZE9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChleHBlY3RlZFZhbHVlKVxuICAgICAgY29uc3QgYWN0dWFsS2V5cyA9IE9iamVjdC5rZXlzKGFjdHVhbE9iamVjdClcbiAgICAgIGNvbnN0IGV4cGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKGV4cGVjdGVkT2JqZWN0KVxuXG4gICAgICBpZiAoYWN0dWFsS2V5cy5sZW5ndGggIT09IGV4cGVjdGVkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGV4cGVjdGVkS2V5cykge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhY3R1YWxPYmplY3QsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5maW5kQnlDb25kaXRpb25WYWx1ZU1hdGNoZXMoYWN0dWFsT2JqZWN0W2tleV0sIGV4cGVjdGVkT2JqZWN0W2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoYWN0dWFsVmFsdWUgPT09IGV4cGVjdGVkVmFsdWUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmluZEJ5UHJpbWl0aXZlVmFsdWVzTWF0Y2goYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHt1bmtub3dufSBhY3R1YWxWYWx1ZSAtIEFjdHVhbCBtb2RlbCB2YWx1ZS5cbiAgICogQHBhcmFtIHt1bmtub3dufSBleHBlY3RlZFZhbHVlIC0gRXhwZWN0ZWQgZmluZCBjb25kaXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcHJpbWl0aXZlIHZhbHVlcyBtYXRjaCBhZnRlciBzYWZlIGNvZXJjaW9uLlxuICAgKi9cbiAgc3RhdGljIGZpbmRCeVByaW1pdGl2ZVZhbHVlc01hdGNoKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKSB7XG4gICAgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiB0eXBlb2YgZXhwZWN0ZWRWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIGFjdHVhbFZhbHVlLnRvSVNPU3RyaW5nKCkgPT09IGV4cGVjdGVkVmFsdWVcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdHVhbFZhbHVlID09PSBcInN0cmluZ1wiICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gYWN0dWFsVmFsdWUgPT09IGV4cGVjdGVkVmFsdWUudG9JU09TdHJpbmcoKVxuICAgIH1cblxuICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBhY3R1YWxWYWx1ZS50b0lTT1N0cmluZygpID09PSBleHBlY3RlZFZhbHVlLnRvSVNPU3RyaW5nKClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdHVhbFZhbHVlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBleHBlY3RlZFZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kQnlOdW1lcmljU3RyaW5nTWF0Y2hlc051bWJlcihleHBlY3RlZFZhbHVlLCBhY3R1YWxWYWx1ZSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdHVhbFZhbHVlID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBleHBlY3RlZFZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kQnlOdW1lcmljU3RyaW5nTWF0Y2hlc051bWJlcihhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbnVtZXJpY1N0cmluZyAtIE51bWVyaWMgc3RyaW5nIHZhbHVlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZXhwZWN0ZWROdW1iZXIgLSBOdW1iZXIgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdmFsdWVzIHJlcHJlc2VudCB0aGUgc2FtZSBudW1iZXIuXG4gICAqL1xuICBzdGF0aWMgZmluZEJ5TnVtZXJpY1N0cmluZ01hdGNoZXNOdW1iZXIobnVtZXJpY1N0cmluZywgZXhwZWN0ZWROdW1iZXIpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShleHBlY3RlZE51bWJlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICghL14tP1xcZCsoPzpcXC5cXGQrKT8kLy50ZXN0KG51bWVyaWNTdHJpbmcpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gTnVtYmVyKG51bWVyaWNTdHJpbmcpID09PSBleHBlY3RlZE51bWJlclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW25ld0F0dHJpYnV0ZXNdIC0gTmV3IHZhbHVlcyB0byBhc3NpZ24gYmVmb3JlIHVwZGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dGhpcz59IC0gVXBkYXRlZCBtb2RlbC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShuZXdBdHRyaWJ1dGVzID0ge30pIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuXG4gICAgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKG5ld0F0dHJpYnV0ZXMpXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJ1cGRhdGVcIiwge1xuICAgICAgYXR0cmlidXRlczogdGhpcy5hdHRyaWJ1dGVzKCksXG4gICAgICBpZDogdGhpcy5wcmltYXJ5S2V5VmFsdWUoKVxuICAgIH0pXG5cbiAgICB0aGlzLmFzc2lnbkF0dHJpYnV0ZXMoTW9kZWxDbGFzcy5hdHRyaWJ1dGVzRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBkZXN0cm95ZWQgb24gYmFja2VuZC5cbiAgICovXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcblxuICAgIGF3YWl0IE1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJkZXN0cm95XCIsIHtcbiAgICAgIGlkOiB0aGlzLnByaW1hcnlLZXlWYWx1ZSgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge1wiZmluZFwiIHwgXCJpbmRleFwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwifSBjb21tYW5kVHlwZSAtIENvbW1hbmQgdHlwZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXlsb2FkIC0gQ29tbWFuZCBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gLSBQYXJzZWQgSlNPTiByZXNwb25zZS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBleGVjdXRlQ29tbWFuZChjb21tYW5kVHlwZSwgcGF5bG9hZCkge1xuICAgIGNvbnN0IGNvbW1hbmROYW1lID0gdGhpcy5jb21tYW5kTmFtZShjb21tYW5kVHlwZSlcbiAgICBjb25zdCB1cmwgPSBmcm9udGVuZE1vZGVsQ29tbWFuZFVybCh0aGlzLnJlc291cmNlUGF0aCgpLCBjb21tYW5kTmFtZSlcbiAgICBjb25zdCBzZXJpYWxpemVkUGF5bG9hZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShwYXlsb2FkKSlcblxuICAgIGlmIChmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnJlcXVlc3QpIHtcbiAgICAgIGNvbnN0IGN1c3RvbVJlc3BvbnNlID0gYXdhaXQgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5yZXF1ZXN0KHtcbiAgICAgICAgY29tbWFuZE5hbWUsXG4gICAgICAgIGNvbW1hbmRUeXBlLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLFxuICAgICAgICBwYXlsb2FkOiBzZXJpYWxpemVkUGF5bG9hZCxcbiAgICAgICAgdXJsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoY3VzdG9tUmVzcG9uc2UpKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkUGF5bG9hZCksXG4gICAgICBjcmVkZW50aWFsczogZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5jcmVkZW50aWFscyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAgfSlcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgKCR7cmVzcG9uc2Uuc3RhdHVzfSkgZm9yICR7dGhpcy5uYW1lfSMke2NvbW1hbmRUeXBlfWApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgY29uc3QganNvbiA9IHJlc3BvbnNlVGV4dC5sZW5ndGggPiAwID8gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpIDoge31cblxuICAgIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShqc29uKSlcbiAgfVxufVxuIl19
897
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbHMvYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxrQkFBa0IsTUFBTSxZQUFZLENBQUE7QUFDM0MsT0FBTyxFQUFDLHNDQUFzQyxFQUFFLG9DQUFvQyxFQUFDLE1BQU0sOEJBQThCLENBQUE7QUFFekgscUhBQXFIO0FBQ3JIOzs7Ozs7OztHQVFHO0FBRUgsMkNBQTJDO0FBQzNDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxDQUFBO0FBQ3ZDLE1BQU0sMkJBQTJCLEdBQUcsMEJBQTBCLENBQUE7QUFDOUQsTUFBTSx1QkFBdUIsR0FBRyxzQkFBc0IsQ0FBQTtBQUV0RCxzRkFBc0Y7QUFDdEYsTUFBTSxPQUFPLHlCQUEwQixTQUFRLEtBQUs7SUFDbEQ7OztPQUdHO0lBQ0gsWUFBWSxTQUFTLEVBQUUsYUFBYTtRQUNsQyxLQUFLLENBQUMsR0FBRyxTQUFTLElBQUksYUFBYSxtQkFBbUIsQ0FBQyxDQUFBO1FBQ3ZELElBQUksQ0FBQyxJQUFJLEdBQUcsMkJBQTJCLENBQUE7SUFDekMsQ0FBQztDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRTdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFOUMsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFBO0FBQzdELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGlDQUFpQztJQUM1Qzs7OztPQUlHO0lBQ0gsWUFBWSxLQUFLLEVBQUUsZ0JBQWdCLEVB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VUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ3pDLENBQUM7UUFFRCxPQUFPLElBQUksR0FBRyxFQUFFLENBQUE7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBGcm9udGVuZE1vZGVsUXVlcnkgZnJvbSBcIi4vcXVlcnkuanNcIlxuaW1wb3J0IHtkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSwgc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBmcm9tIFwiLi90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7e2NvbW1hbmRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgcGF0aD86IHN0cmluZywgcHJpbWFyeUtleT86IHN0cmluZ319IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZyAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Jhc2VVcmxdIC0gT3B0aW9uYWwgYmFzZSBVUkwgcHJlZml4ZWQgYmVmb3JlIHJlc291cmNlIHBhdGhzLlxuICogQHByb3BlcnR5IHsoKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCl9IFtiYXNlVXJsUmVzb2x2ZXJdIC0gT3B0aW9uYWwgcmVzb2x2ZXIgdXNlZCBwZXIgcmVxdWVzdCBmb3IgZHluYW1pYyBiYXNlIFVSTC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aFByZWZpeF0gLSBPcHRpb25hbCBwYXRoIHByZWZpeCBpbnNlcnRlZCBiZXR3ZWVuIGJhc2UgVVJMIGFuZCByZXNvdXJjZSBwYXRoLlxuICogQHByb3BlcnR5IHsoKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCl9IFtwYXRoUHJlZml4UmVzb2x2ZXJdIC0gT3B0aW9uYWwgcmVzb2x2ZXIgdXNlZCBwZXIgcmVxdWVzdCBmb3IgZHluYW1pYyBwYXRoIHByZWZpeC5cbiAqIEBwcm9wZXJ0eSB7XCJvbWl0XCIgfCBcInNhbWUtb3JpZ2luXCIgfCBcImluY2x1ZGVcIn0gW2NyZWRlbnRpYWxzXSAtIE9wdGlvbmFsIGNyZWRlbnRpYWxzIG1vZGUgZm9yd2FyZGVkIHRvIGZldGNoLlxuICogQHByb3BlcnR5IHsoKGFyZ3M6IHtjb21tYW5kTmFtZTogc3RyaW5nLCBjb21tYW5kVHlwZTogXCJmaW5kXCIgfCBcImluZGV4XCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIsIG1vZGVsQ2xhc3M6IHR5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSwgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgYW55PiwgdXJsOiBzdHJpbmd9KSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+KX0gW3JlcXVlc3RdIC0gT3B0aW9uYWwgY3VzdG9tIHRyYW5zcG9ydCBoYW5kbGVyLlxuICovXG5cbi8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZ30gKi9cbmNvbnN0IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcgPSB7fVxuY29uc3QgUFJFTE9BREVEX1JFTEFUSU9OU0hJUFNfS0VZID0gXCJfX3ByZWxvYWRlZFJlbGF0aW9uc2hpcHNcIlxuY29uc3QgU0VMRUNURURfQVRUUklCVVRFU19LRVkgPSBcIl9fc2VsZWN0ZWRBdHRyaWJ1dGVzXCJcblxuLyoqIEVycm9yIHJhaXNlZCB3aGVuIHJlYWRpbmcgYW4gYXR0cmlidXRlIHRoYXQgd2FzIG5vdCBzZWxlY3RlZCBpbiBxdWVyeSBwYXlsb2Fkcy4gKi9cbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVOb3RTZWxlY3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIHRoYXQgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsTmFtZSwgYXR0cmlidXRlTmFtZSkge1xuICAgIHN1cGVyKGAke21vZGVsTmFtZX0jJHthdHRyaWJ1dGVOYW1lfSB3YXMgbm90IHNlbGVjdGVkYClcbiAgICB0aGlzLm5hbWUgPSBcIkF0dHJpYnV0ZU5vdFNlbGVjdGVkRXJyb3JcIlxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFdoZXRoZXIgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSlcblxuICByZXR1cm4gcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvdHlwZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIExpZ2h0d2VpZ2h0IHNpbmd1bGFyIHJlbGF0aW9uc2hpcCBzdGF0ZSBob2xkZXIgZm9yIGZyb250ZW5kIG1vZGVsIGluc3RhbmNlcy5cbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBTXG4gKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICovXG5leHBvcnQgY2xhc3MgRnJvbnRlbmRNb2RlbFNpbmd1bGFyUmVsYXRpb25zaGlwIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7SW5zdGFuY2VUeXBlPFM+fSBtb2RlbCAtIFBhcmVudCBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHBhcmFtIHtUIHwgbnVsbH0gdGFyZ2V0TW9kZWxDbGFzcyAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsLCByZWxhdGlvbnNoaXBOYW1lLCB0YXJnZXRNb2RlbENsYXNzKSB7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsXG4gICAgdGhpcy5yZWxhdGlvbnNoaXBOYW1lID0gcmVsYXRpb25zaGlwTmFtZVxuICAgIHRoaXMudGFyZ2V0TW9kZWxDbGFzcyA9IHRhcmdldE1vZGVsQ2xhc3NcbiAgICB0aGlzLl9wcmVsb2FkZWQgPSBmYWxzZVxuICAgIHRoaXMuX2xvYWRlZFZhbHVlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBsb2FkZWRWYWx1ZSAtIExvYWRlZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TG9hZGVkKGxvYWRlZFZhbHVlKSB7XG4gICAgdGhpcy5fbG9hZGVkVmFsdWUgPSBsb2FkZWRWYWx1ZSA9PSB1bmRlZmluZWQgPyBudWxsIDogbG9hZGVkVmFsdWVcbiAgICB0aGlzLl9wcmVsb2FkZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciByZWxhdGlvbnNoaXAgaXMgcHJlbG9hZGVkLlxuICAgKi9cbiAgZ2V0UHJlbG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVsb2FkZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7YW55fSAtIExvYWRlZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqL1xuICBsb2FkZWQoKSB7XG4gICAgaWYgKCF0aGlzLl9wcmVsb2FkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IyR7dGhpcy5yZWxhdGlvbnNoaXBOYW1lfSBoYXNuJ3QgYmVlbiBwcmVsb2FkZWRgKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9sb2FkZWRWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdIC0gTmV3IG1vZGVsIGF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm5zIHtJbnN0YW5jZVR5cGU8VD59IC0gQnVpbHQgbW9kZWwuXG4gICAqL1xuICBidWlsZChhdHRyaWJ1dGVzID0ge30pIHtcbiAgICBpZiAoIXRoaXMudGFyZ2V0TW9kZWxDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0YXJnZXQgbW9kZWwgY2xhc3MgY29uZmlndXJlZCBmb3IgJHt0aGlzLm1vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IyR7dGhpcy5yZWxhdGlvbnNoaXBOYW1lfWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWwgPSAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKG5ldyB0aGlzLnRhcmdldE1vZGVsQ2xhc3MoYXR0cmlidXRlcykpXG5cbiAgICB0aGlzLnNldExvYWRlZChtb2RlbClcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG59XG5cbi8qKlxuICogTGlnaHR3ZWlnaHQgaGFzLW1hbnkgcmVsYXRpb25zaGlwIHN0YXRlIGhvbGRlciBmb3IgZnJvbnRlbmQgbW9kZWwgaW5zdGFuY2VzLlxuICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFNcbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gKi9cbmV4cG9ydCBjbGFzcyBGcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0luc3RhbmNlVHlwZTxTPn0gbW9kZWwgLSBQYXJlbnQgbW9kZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gICAqIEBwYXJhbSB7VCB8IG51bGx9IHRhcmdldE1vZGVsQ2xhc3MgLSBUYXJnZXQgbW9kZWwgY2xhc3MuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlbCwgcmVsYXRpb25zaGlwTmFtZSwgdGFyZ2V0TW9kZWxDbGFzcykge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbFxuICAgIHRoaXMucmVsYXRpb25zaGlwTmFtZSA9IHJlbGF0aW9uc2hpcE5hbWVcbiAgICB0aGlzLnRhcmdldE1vZGVsQ2xhc3MgPSB0YXJnZXRNb2RlbENsYXNzXG4gICAgdGhpcy5fcHJlbG9hZGVkID0gZmFsc2VcbiAgICB0aGlzLl9sb2FkZWRWYWx1ZSA9IFtdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxJbnN0YW5jZVR5cGU8VD4+fSBsb2FkZWRWYWx1ZSAtIExvYWRlZCByZWxhdGlvbnNoaXAgdmFsdWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TG9hZGVkKGxvYWRlZFZhbHVlKSB7XG4gICAgdGhpcy5fbG9hZGVkVmFsdWUgPSBBcnJheS5pc0FycmF5KGxvYWRlZFZhbHVlKSA/IGxvYWRlZFZhbHVlIDogW11cbiAgICB0aGlzLl9wcmVsb2FkZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciByZWxhdGlvbnNoaXAgaXMgcHJlbG9hZGVkLlxuICAgKi9cbiAgZ2V0UHJlbG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVsb2FkZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBMb2FkZWQgcmVsYXRpb25zaGlwIHZhbHVlcy5cbiAgICovXG4gIGxvYWRlZCgpIHtcbiAgICBpZiAoIXRoaXMuX3ByZWxvYWRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLnJlbGF0aW9uc2hpcE5hbWV9IGhhc24ndCBiZWVuIHByZWxvYWRlZGApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlZFZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxJbnN0YW5jZVR5cGU8VD4+fSBtb2RlbHMgLSBNb2RlbHMgdG8gYXBwZW5kLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFkZFRvTG9hZGVkKG1vZGVscykge1xuICAgIGNvbnN0IGxvYWRlZE1vZGVscyA9IHRoaXMuZ2V0UHJlbG9hZGVkKCkgPyB0aGlzLmxvYWRlZCgpIDogW11cblxuICAgIHRoaXMuc2V0TG9hZGVkKFsuLi5sb2FkZWRNb2RlbHMsIC4uLm1vZGVsc10pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXR0cmlidXRlc10gLSBOZXcgbW9kZWwgYXR0cmlidXRlcy5cbiAgICogQHJldHVybnMge0luc3RhbmNlVHlwZTxUPn0gLSBCdWlsdCBtb2RlbC5cbiAgICovXG4gIGJ1aWxkKGF0dHJpYnV0ZXMgPSB7fSkge1xuICAgIGlmICghdGhpcy50YXJnZXRNb2RlbENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRhcmdldCBtb2RlbCBjbGFzcyBjb25maWd1cmVkIGZvciAke3RoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLnJlbGF0aW9uc2hpcE5hbWV9YClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbCA9IC8qKiBAdHlwZSB7SW5zdGFuY2VUeXBlPFQ+fSAqLyAobmV3IHRoaXMudGFyZ2V0TW9kZWxDbGFzcyhhdHRyaWJ1dGVzKSlcblxuICAgIHRoaXMuYWRkVG9Mb2FkZWQoW21vZGVsXSlcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcFR5cGUgLSBSZWxhdGlvbnNoaXAgdHlwZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcmVsYXRpb25zaGlwIHR5cGUgaXMgaGFzLW1hbnkuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aW9uc2hpcFR5cGVJc0NvbGxlY3Rpb24ocmVsYXRpb25zaGlwVHlwZSkge1xuICByZXR1cm4gcmVsYXRpb25zaGlwVHlwZSA9PSBcImhhc01hbnlcIlxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbH0gdmFsdWUgLSBCYXNlIFVSTCBjYW5kaWRhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgYmFzZSBVUkwgd2l0aG91dCB0cmFpbGluZyBzbGFzaC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQmFzZVVybCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJcIlxuXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcblxuICBpZiAoIXRyaW1tZWQubGVuZ3RoKSByZXR1cm4gXCJcIlxuXG4gIHJldHVybiB0cmltbWVkLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZCB8IG51bGx9IHZhbHVlIC0gUGF0aCBwcmVmaXggY2FuZGlkYXRlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIHBhdGggcHJlZml4IHdpdGggbGVhZGluZyBzbGFzaCBhbmQgbm8gdHJhaWxpbmcgc2xhc2guXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhQcmVmaXgodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiXCJcblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG5cbiAgaWYgKCF0cmltbWVkLmxlbmd0aCkgcmV0dXJuIFwiXCJcblxuICBjb25zdCB3aXRoTGVhZGluZ1NsYXNoID0gdHJpbW1lZC5zdGFydHNXaXRoKFwiL1wiKSA/IHRyaW1tZWQgOiBgLyR7dHJpbW1lZH1gXG5cbiAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2gucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZVBhdGggLSBSZXNvdXJjZSBwYXRoIChleHBlY3RlZCBhYnNvbHV0ZSBwYXRoKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kTmFtZSAtIENvbW1hbmQgbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQ29tYmluZWQgY29tbWFuZCBVUkwuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxDb21tYW5kVXJsKHJlc291cmNlUGF0aCwgY29tbWFuZE5hbWUpIHtcbiAgY29uc3QgcmVzb2x2ZWRCYXNlVXJsID0gZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5iYXNlVXJsUmVzb2x2ZXJcbiAgICA/IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcuYmFzZVVybFJlc29sdmVyKClcbiAgICA6IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcuYmFzZVVybFxuICBjb25zdCBiYXNlVXJsID0gbm9ybWFsaXplQmFzZVVybChyZXNvbHZlZEJhc2VVcmwpXG4gIGNvbnN0IHJlc29sdmVkUGF0aFByZWZpeCA9IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcucGF0aFByZWZpeFJlc29sdmVyXG4gICAgPyBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnBhdGhQcmVmaXhSZXNvbHZlcigpXG4gICAgOiBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnBhdGhQcmVmaXhcbiAgY29uc3QgcGF0aFByZWZpeCA9IG5vcm1hbGl6ZVBhdGhQcmVmaXgocmVzb2x2ZWRQYXRoUHJlZml4KVxuICBjb25zdCBub3JtYWxpemVkUmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcmVzb3VyY2VQYXRoIDogYC8ke3Jlc291cmNlUGF0aH1gXG5cbiAgcmV0dXJuIGAke2Jhc2VVcmx9JHtwYXRoUHJlZml4fSR7bm9ybWFsaXplZFJlc291cmNlUGF0aH0vJHtjb21tYW5kTmFtZX1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gZmluZEJ5IGNvbmRpdGlvbnMuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBKU09OLW5vcm1hbGl6ZWQgY29uZGl0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRmluZENvbmRpdGlvbnMoY29uZGl0aW9ucykge1xuICB0cnkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbmRpdGlvbnMpKSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBjb25kaXRpb25zIGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjb25kaXRpb25zIC0gZmluZEJ5IGNvbmRpdGlvbnMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0RmluZEJ5Q29uZGl0aW9uc1NoYXBlKGNvbmRpdGlvbnMpIHtcbiAgaWYgKCFjb25kaXRpb25zIHx8IHR5cGVvZiBjb25kaXRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoY29uZGl0aW9ucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBleHBlY3RzIGNvbmRpdGlvbnMgdG8gYmUgYSBwbGFpbiBvYmplY3QsIGdvdDogJHtjb25kaXRpb25zfWApXG4gIH1cblxuICBjb25zdCBjb25kaXRpb25zUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbmRpdGlvbnMpXG5cbiAgaWYgKGNvbmRpdGlvbnNQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgY29uZGl0aW9uc1Byb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGV4cGVjdHMgY29uZGl0aW9ucyB0byBiZSBhIHBsYWluIG9iamVjdCwgZ290OiAke2NvbmRpdGlvbnN9YClcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGNvbmRpdGlvbnMpXG5cbiAgaWYgKHN5bWJvbEtleXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGRvZXMgbm90IHN1cHBvcnQgc3ltYm9sIGNvbmRpdGlvbiBrZXlzIChrZXlzOiAke3N5bWJvbEtleXMubWFwKChrZXkpID0+IGtleS50b1N0cmluZygpKS5qb2luKFwiLCBcIil9KWApXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ29uZGl0aW9uIHZhbHVlIHRvIHZhbGlkYXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVBhdGggLSBLZXkgcGF0aCBmb3IgZXJyb3Igb3V0cHV0LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydERlZmluZWRGaW5kQnlDb25kaXRpb25WYWx1ZSh2YWx1ZSwga2V5UGF0aCkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGRvZXMgbm90IHN1cHBvcnQgdW5kZWZpbmVkIGNvbmRpdGlvbiB2YWx1ZXMgKGtleTogJHtrZXlQYXRofSlgKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBmdW5jdGlvbiBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3ltYm9sXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IHN5bWJvbCBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IGJpZ2ludCBjb25kaXRpb24gdmFsdWVzIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGZpbmRCeSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1maW5pdGUgbnVtYmVyIGNvbmRpdGlvbiB2YWx1ZXMgKGtleTogJHtrZXlQYXRofSlgKVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiB7XG4gICAgICBhc3NlcnREZWZpbmVkRmluZEJ5Q29uZGl0aW9uVmFsdWUoZW50cnksIGAke2tleVBhdGh9WyR7aW5kZXh9XWApXG4gICAgfSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvYmplY3RWYWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlcbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0VmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBub24tcGxhaW4gb2JqZWN0IGNvbmRpdGlvbiB2YWx1ZXMgKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGNvbnN0IHN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdFZhbHVlKVxuXG4gICAgaWYgKHN5bWJvbEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgZG9lcyBub3Qgc3VwcG9ydCBzeW1ib2wgY29uZGl0aW9uIGtleXMgKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVxuXG4gICAgT2JqZWN0LmtleXModmFsdWVPYmplY3QpLmZvckVhY2goKG5lc3RlZEtleSkgPT4ge1xuICAgICAgYXNzZXJ0RGVmaW5lZEZpbmRCeUNvbmRpdGlvblZhbHVlKHZhbHVlT2JqZWN0W25lc3RlZEtleV0sIGAke2tleVBhdGh9LiR7bmVzdGVkS2V5fWApXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gb3JpZ2luYWxWYWx1ZSAtIE9yaWdpbmFsIGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbm9ybWFsaXplZFZhbHVlIC0gSlNPTi1ub3JtYWxpemVkIGNvbmRpdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlQYXRoIC0gS2V5IHBhdGggZm9yIGVycm9yIG91dHB1dC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRGaW5kQnlDb25kaXRpb25TZXJpYWxpemF0aW9uUHJlc2VydmVzVmFsdWUob3JpZ2luYWxWYWx1ZSwgbm9ybWFsaXplZFZhbHVlLCBrZXlQYXRoKSB7XG4gIGlmIChvcmlnaW5hbFZhbHVlID09PSBudWxsKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob3JpZ2luYWxWYWx1ZSkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZFZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGlmIChvcmlnaW5hbFZhbHVlLmxlbmd0aCAhPT0gbm9ybWFsaXplZFZhbHVlLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICAgIH1cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvcmlnaW5hbFZhbHVlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgYXNzZXJ0RmluZEJ5Q29uZGl0aW9uU2VyaWFsaXphdGlvblByZXNlcnZlc1ZhbHVlKG9yaWdpbmFsVmFsdWVbaW5kZXhdLCBub3JtYWxpemVkVmFsdWVbaW5kZXhdLCBgJHtrZXlQYXRofVske2luZGV4fV1gKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG9yaWdpbmFsVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgaWYgKHR5cGVvZiBub3JtYWxpemVkVmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBjaGFuZ2VkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChvcmlnaW5hbFZhbHVlICYmIHR5cGVvZiBvcmlnaW5hbFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKCFub3JtYWxpemVkVmFsdWUgfHwgdHlwZW9mIG5vcm1hbGl6ZWRWYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBjaGFuZ2VkIGR1cmluZyBzZXJpYWxpemF0aW9uIChrZXk6ICR7a2V5UGF0aH0pYClcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKG5vcm1hbGl6ZWRWYWx1ZSlcbiAgICBjb25zdCBvcmlnaW5hbE9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChvcmlnaW5hbFZhbHVlKVxuXG4gICAgT2JqZWN0LmtleXMob3JpZ2luYWxPYmplY3QpLmZvckVhY2goKG5lc3RlZEtleSkgPT4ge1xuICAgICAgaWYgKCEobmVzdGVkS2V5IGluIG5vcm1hbGl6ZWRPYmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5IGNvbmRpdGlvbiBrZXkgd2FzIHJlbW92ZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofS4ke25lc3RlZEtleX0pYClcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0RmluZEJ5Q29uZGl0aW9uU2VyaWFsaXphdGlvblByZXNlcnZlc1ZhbHVlKG9yaWdpbmFsT2JqZWN0W25lc3RlZEtleV0sIG5vcm1hbGl6ZWRPYmplY3RbbmVzdGVkS2V5XSwgYCR7a2V5UGF0aH0uJHtuZXN0ZWRLZXl9YClcbiAgICB9KVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAobm9ybWFsaXplZFZhbHVlICE9PSBvcmlnaW5hbFZhbHVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnkgY29uZGl0aW9uIGNoYW5nZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gKGtleTogJHtrZXlQYXRofSlgKVxuICB9XG59XG5cbi8qKiBCYXNlIGNsYXNzIGZvciBnZW5lcmF0ZWQgZnJvbnRlbmQgbW9kZWwgY2xhc3Nlcy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyb250ZW5kTW9kZWxCYXNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdIC0gSW5pdGlhbCBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXR0cmlidXRlcyA9IHt9KSB7XG4gICAgdGhpcy5fYXR0cmlidXRlcyA9IHt9XG4gICAgdGhpcy5fcmVsYXRpb25zaGlwcyA9IHt9XG4gICAgdGhpcy5fc2VsZWN0ZWRBdHRyaWJ1dGVzID0gbnVsbFxuICAgIHRoaXMuYXNzaWduQXR0cmlidXRlcyhhdHRyaWJ1dGVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd9IC0gUmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyByZXNvdXJjZUNvbmZpZygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXNvdXJjZUNvbmZpZygpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlc1wiKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnJlYWNoYWJsZVxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2U+fSAtIFJlbGF0aW9uc2hpcCBtb2RlbCBjbGFzc2VzIGtleWVkIGJ5IHJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKi9cbiAgc3RhdGljIHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcygpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywge3R5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9Pn0gLSBSZWxhdGlvbnNoaXAgZGVmaW5pdGlvbnMga2V5ZWQgYnkgcmVsYXRpb25zaGlwIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zaGlwRGVmaW5pdGlvbnMoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHJldHVybnMge3t0eXBlOiBcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifSB8IG51bGx9IC0gUmVsYXRpb25zaGlwIGRlZmluaXRpb24uXG4gICAqL1xuICBzdGF0aWMgcmVsYXRpb25zaGlwRGVmaW5pdGlvbihyZWxhdGlvbnNoaXBOYW1lKSB7XG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSB0aGlzLnJlbGF0aW9uc2hpcERlZmluaXRpb25zKClcblxuICAgIHJldHVybiBkZWZpbml0aW9uc1tyZWxhdGlvbnNoaXBOYW1lXSB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHJldHVybnMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSB8IG51bGx9IC0gVGFyZ2V0IHJlbGF0aW9uc2hpcCBtb2RlbCBjbGFzcy5cbiAgICovXG4gIHN0YXRpYyByZWxhdGlvbnNoaXBNb2RlbENsYXNzKHJlbGF0aW9uc2hpcE5hbWUpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBNb2RlbENsYXNzZXMgPSB0aGlzLnJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcygpXG5cbiAgICByZXR1cm4gcmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzW3JlbGF0aW9uc2hpcE5hbWVdIHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBBdHRyaWJ1dGVzIGhhc2guXG4gICAqL1xuICBhdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9hdHRyaWJ1dGVzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHJldHVybnMge0Zyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwPGFueSwgYW55PiB8IEZyb250ZW5kTW9kZWxTaW5ndWxhclJlbGF0aW9uc2hpcDxhbnksIGFueT59IC0gUmVsYXRpb25zaGlwIHN0YXRlIG9iamVjdC5cbiAgICovXG4gIGdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKSB7XG4gICAgaWYgKCF0aGlzLl9yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdKSB7XG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwRGVmaW5pdGlvbiA9IE1vZGVsQ2xhc3MucmVsYXRpb25zaGlwRGVmaW5pdGlvbihyZWxhdGlvbnNoaXBOYW1lKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IE1vZGVsQ2xhc3MucmVsYXRpb25zaGlwTW9kZWxDbGFzcyhyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwRGVmaW5pdGlvbiAmJiByZWxhdGlvbnNoaXBUeXBlSXNDb2xsZWN0aW9uKHJlbGF0aW9uc2hpcERlZmluaXRpb24udHlwZSkpIHtcbiAgICAgICAgdGhpcy5fcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG5ldyBGcm9udGVuZE1vZGVsSGFzTWFueVJlbGF0aW9uc2hpcCh0aGlzLCByZWxhdGlvbnNoaXBOYW1lLCB0YXJnZXRNb2RlbENsYXNzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG5ldyBGcm9udGVuZE1vZGVsU2luZ3VsYXJSZWxhdGlvbnNoaXAodGhpcywgcmVsYXRpb25zaGlwTmFtZSwgdGFyZ2V0TW9kZWxDbGFzcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXR0cmlidXRlcyAtIEF0dHJpYnV0ZXMgdG8gYXNzaWduLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhc3NpZ25BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShrZXksIGF0dHJpYnV0ZXNba2V5XSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9IC0gQ2xlYXJzIGNhY2hlZCByZWxhdGlvbnNoaXAgc3RhdGUuXG4gICAqL1xuICBjbGVhclJlbGF0aW9uc2hpcENhY2hlKCkge1xuICAgIHRoaXMuX3JlbGF0aW9uc2hpcHMgPSB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUHJpbWFyeSBrZXkgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBwcmltYXJ5S2V5KCkge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlQ29uZmlnKCkucHJpbWFyeUtleSB8fCBcImlkXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfSAtIFByaW1hcnkga2V5IHZhbHVlLlxuICAgKi9cbiAgcHJpbWFyeUtleVZhbHVlKCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRBdHRyaWJ1dGUoTW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpXG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHByaW1hcnkga2V5ICcke01vZGVsQ2xhc3MucHJpbWFyeUtleSgpfScgb24gJHtNb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7YW55fSAtIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZEF0dHJpYnV0ZXMgJiYgIXRoaXMuX3NlbGVjdGVkQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBBdHRyaWJ1dGVOb3RTZWxlY3RlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgYXR0cmlidXRlTmFtZSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gICAqIEBwYXJhbSB7YW55fSBuZXdWYWx1ZSAtIE5ldyB2YWx1ZS5cbiAgICogQHJldHVybnMge2FueX0gLSBBc3NpZ25lZCB2YWx1ZS5cbiAgICovXG4gIHNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBuZXdWYWx1ZSkge1xuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLl9hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICB0aGlzLl9hdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3VmFsdWVcblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlTmFtZSlcbiAgICB9XG5cbiAgICBpZiAoIU9iamVjdC5pcyhwcmV2aW91c1ZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuY2xlYXJSZWxhdGlvbnNoaXBDYWNoZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1ZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBSZXNvdXJjZSBwYXRoLlxuICAgKi9cbiAgc3RhdGljIHJlc291cmNlUGF0aCgpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5yZXNvdXJjZUNvbmZpZygpLnBhdGhcblxuICAgIGlmICghcGF0aCkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHJlc291cmNlIHBhdGggZm9yICR7dGhpcy5uYW1lfWApXG5cbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7XCJmaW5kXCIgfCBcImluZGV4XCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCJ9IGNvbW1hbmRUeXBlIC0gQ29tbWFuZCB0eXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJlc29sdmVkIGNvbW1hbmQgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBjb21tYW5kTmFtZShjb21tYW5kVHlwZSkge1xuICAgIGNvbnN0IGNvbW1hbmRzID0gdGhpcy5yZXNvdXJjZUNvbmZpZygpLmNvbW1hbmRzIHx8IHt9XG5cbiAgICByZXR1cm4gY29tbWFuZHNbY29tbWFuZFR5cGVdIHx8IGNvbW1hbmRUeXBlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnfSBjb25maWcgLSBGcm9udGVuZCBtb2RlbCB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIGNvbmZpZ3VyZVRyYW5zcG9ydChjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJiYXNlVXJsXCIpKSB7XG4gICAgICBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLmJhc2VVcmwgPSBjb25maWcuYmFzZVVybFxuICAgIH1cblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBcImJhc2VVcmxSZXNvbHZlclwiKSkge1xuICAgICAgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5iYXNlVXJsUmVzb2x2ZXIgPSBjb25maWcuYmFzZVVybFJlc29sdmVyXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwiY3JlZGVudGlhbHNcIikpIHtcbiAgICAgIGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcuY3JlZGVudGlhbHMgPSBjb25maWcuY3JlZGVudGlhbHNcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJwYXRoUHJlZml4XCIpKSB7XG4gICAgICBmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnBhdGhQcmVmaXggPSBjb25maWcucGF0aFByZWZpeFxuICAgIH1cblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBcInBhdGhQcmVmaXhSZXNvbHZlclwiKSkge1xuICAgICAgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5wYXRoUHJlZml4UmVzb2x2ZXIgPSBjb25maWcucGF0aFByZWZpeFJlc29sdmVyXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwicmVxdWVzdFwiKSkge1xuICAgICAgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5yZXF1ZXN0ID0gY29uZmlnLnJlcXVlc3RcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIC0gUmVzcG9uc2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gQXR0cmlidXRlcyBmcm9tIHBheWxvYWQuXG4gICAqL1xuICBzdGF0aWMgYXR0cmlidXRlc0Zyb21SZXNwb25zZShyZXNwb25zZSkge1xuICAgIGNvbnN0IG1vZGVsRGF0YSA9IHRoaXMubW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuXG4gICAgcmV0dXJuIG1vZGVsRGF0YS5hdHRyaWJ1dGVzXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIC0gUmVzcG9uc2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3thdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzZWxlY3RlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdIHwgbnVsbH19IC0gQXR0cmlidXRlcyBhbmQgcHJlbG9hZC9zZWxlY3QgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBtb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QgcmVzcG9uc2UgYnV0IGdvdDogJHtyZXNwb25zZX1gKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBsZXQgbW9kZWxEYXRhXG5cbiAgICBpZiAocmVzcG9uc2UubW9kZWwgJiYgdHlwZW9mIHJlc3BvbnNlLm1vZGVsID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBtb2RlbERhdGEgPSByZXNwb25zZS5tb2RlbFxuICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuYXR0cmlidXRlcyAmJiB0eXBlb2YgcmVzcG9uc2UuYXR0cmlidXRlcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgbW9kZWxEYXRhID0gcmVzcG9uc2UuYXR0cmlidXRlc1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2RlbERhdGEgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChyZXNwb25zZSlcbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gey4uLm1vZGVsRGF0YX1cbiAgICBjb25zdCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzID0gaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzW1BSRUxPQURFRF9SRUxBVElPTlNISVBTX0tFWV0pXG4gICAgICA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKGF0dHJpYnV0ZXNbUFJFTE9BREVEX1JFTEFUSU9OU0hJUFNfS0VZXSlcbiAgICAgIDoge31cbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXNGcm9tUGF5bG9hZCA9IEFycmF5LmlzQXJyYXkoYXR0cmlidXRlc1tTRUxFQ1RFRF9BVFRSSUJVVEVTX0tFWV0pXG4gICAgICA/IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChhdHRyaWJ1dGVzW1NFTEVDVEVEX0FUVFJJQlVURVNfS0VZXSkuZmlsdGVyKChhdHRyaWJ1dGVOYW1lKSA9PiB0eXBlb2YgYXR0cmlidXRlTmFtZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIDogbnVsbFxuXG4gICAgZGVsZXRlIGF0dHJpYnV0ZXNbUFJFTE9BREVEX1JFTEFUSU9OU0hJUFNfS0VZXVxuICAgIGRlbGV0ZSBhdHRyaWJ1dGVzW1NFTEVDVEVEX0FUVFJJQlVURVNfS0VZXVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRBdHRyaWJ1dGVzID0gc2VsZWN0ZWRBdHRyaWJ1dGVzRnJvbVBheWxvYWQgfHwgT2JqZWN0LmtleXMoYXR0cmlidXRlcylcblxuICAgIHJldHVybiB7YXR0cmlidXRlcywgcHJlbG9hZGVkUmVsYXRpb25zaGlwcywgc2VsZWN0ZWRBdHRyaWJ1dGVzfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbEJhc2V9IG1vZGVsIC0gTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcHJlbG9hZGVkUmVsYXRpb25zaGlwcyAtIFByZWxvYWRlZCByZWxhdGlvbnNoaXAgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgYXBwbHlQcmVsb2FkZWRSZWxhdGlvbnNoaXBzKG1vZGVsLCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgZm9yIChjb25zdCBbcmVsYXRpb25zaGlwTmFtZSwgcmVsYXRpb25zaGlwUGF5bG9hZF0gb2YgT2JqZWN0LmVudHJpZXMocHJlbG9hZGVkUmVsYXRpb25zaGlwcykpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuICAgICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHRoaXMucmVsYXRpb25zaGlwTW9kZWxDbGFzcyhyZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBQYXlsb2FkKSkge1xuICAgICAgICByZWxhdGlvbnNoaXAuc2V0TG9hZGVkKHJlbGF0aW9uc2hpcFBheWxvYWQubWFwKChlbnRyeSkgPT4gdGhpcy5pbnN0YW50aWF0ZVJlbGF0aW9uc2hpcFZhbHVlKGVudHJ5LCB0YXJnZXRNb2RlbENsYXNzKSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHJlbGF0aW9uc2hpcC5zZXRMb2FkZWQodGhpcy5pbnN0YW50aWF0ZVJlbGF0aW9uc2hpcFZhbHVlKHJlbGF0aW9uc2hpcFBheWxvYWQsIHRhcmdldE1vZGVsQ2xhc3MpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge2FueX0gcmVsYXRpb25zaGlwUGF5bG9hZCAtIFJlbGF0aW9uc2hpcCBwYXlsb2FkIHZhbHVlLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZSB8IG51bGx9IHRhcmdldE1vZGVsQ2xhc3MgLSBUYXJnZXQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHthbnl9IC0gSW5zdGFudGlhdGVkIHJlbGF0aW9uc2hpcCB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBpbnN0YW50aWF0ZVJlbGF0aW9uc2hpcFZhbHVlKHJlbGF0aW9uc2hpcFBheWxvYWQsIHRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHJldHVybiByZWxhdGlvbnNoaXBQYXlsb2FkXG5cbiAgICBpZiAoIXJlbGF0aW9uc2hpcFBheWxvYWQgfHwgdHlwZW9mIHJlbGF0aW9uc2hpcFBheWxvYWQgIT09IFwib2JqZWN0XCIpIHJldHVybiByZWxhdGlvbnNoaXBQYXlsb2FkXG5cbiAgICByZXR1cm4gdGFyZ2V0TW9kZWxDbGFzcy5pbnN0YW50aWF0ZUZyb21SZXNwb25zZShyZWxhdGlvbnNoaXBQYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHJlc3BvbnNlIC0gUmVzcG9uc2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0luc3RhbmNlVHlwZTxUPn0gLSBOZXcgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgaW5zdGFudGlhdGVGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLm1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9kZWxEYXRhLmF0dHJpYnV0ZXNcbiAgICBjb25zdCBwcmVsb2FkZWRSZWxhdGlvbnNoaXBzID0gbW9kZWxEYXRhLnByZWxvYWRlZFJlbGF0aW9uc2hpcHNcbiAgICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXMgPSBtb2RlbERhdGEuc2VsZWN0ZWRBdHRyaWJ1dGVzXG4gICAgY29uc3QgbW9kZWwgPSAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKG5ldyB0aGlzKGF0dHJpYnV0ZXMpKVxuICAgIG1vZGVsLl9zZWxlY3RlZEF0dHJpYnV0ZXMgPSBzZWxlY3RlZEF0dHJpYnV0ZXMgPyBuZXcgU2V0KHNlbGVjdGVkQXR0cmlidXRlcykgOiBudWxsXG5cbiAgICB0aGlzLmFwcGx5UHJlbG9hZGVkUmVsYXRpb25zaGlwcyhtb2RlbCwgcHJlbG9hZGVkUmVsYXRpb25zaGlwcylcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gaWQgLSBSZWNvcmQgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn0gLSBSZXNvbHZlZCBtb2RlbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kKGlkKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS5maW5kKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmRpdGlvbnMgLSBBdHRyaWJ1dGUgbWF0Y2ggY29uZGl0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD59IC0gRm91bmQgbW9kZWwgb3IgbnVsbC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kQnkoY29uZGl0aW9ucykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZEJ5KGNvbmRpdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIEF0dHJpYnV0ZSBtYXRjaCBjb25kaXRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4+fSAtIEZvdW5kIG1vZGVsLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGZpbmRCeU9yRmFpbChjb25kaXRpb25zKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoKS5maW5kQnlPckZhaWwoY29uZGl0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+W10+fSAtIExvYWRlZCBtb2RlbCBpbnN0YW5jZXMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgdG9BcnJheSgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWVyeSgpLnRvQXJyYXkoKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAtIFF1ZXJ5IGJ1aWxkZXIuXG4gICAqL1xuICBzdGF0aWMgcXVlcnkoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RnJvbnRlbmRNb2RlbFF1ZXJ5PFQ+fSAqLyAobmV3IEZyb250ZW5kTW9kZWxRdWVyeSh7bW9kZWxDbGFzczogdGhpc30pKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L2luZGV4LmpzXCIpLk5lc3RlZFByZWxvYWRSZWNvcmQgfCBzdHJpbmcgfCBzdHJpbmdbXX0gcHJlbG9hZCAtIFByZWxvYWQgZ3JhcGguXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgd2l0aCBwcmVsb2FkLlxuICAgKi9cbiAgc3RhdGljIHByZWxvYWQocHJlbG9hZCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxRdWVyeTxUPn0gKi8gKHRoaXMucXVlcnkoKS5wcmVsb2FkKHByZWxvYWQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgc3RyaW5nPn0gc2VsZWN0IC0gTW9kZWwtYXdhcmUgYXR0cmlidXRlIHNlbGVjdCBtYXAuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59IC0gUXVlcnkgd2l0aCBzZWxlY3RlZCBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgc3RhdGljIHNlbGVjdChzZWxlY3QpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsUXVlcnk8VD59ICovICh0aGlzLnF1ZXJ5KCkuc2VsZWN0KHNlbGVjdCkpXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25kaXRpb25zIC0gZmluZEJ5IGNvbmRpdGlvbnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGFzc2VydEZpbmRCeUNvbmRpdGlvbnMoY29uZGl0aW9ucykge1xuICAgIGFzc2VydEZpbmRCeUNvbmRpdGlvbnNTaGFwZShjb25kaXRpb25zKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb25kaXRpb25zID0gbm9ybWFsaXplRmluZENvbmRpdGlvbnMoY29uZGl0aW9ucylcblxuICAgIE9iamVjdC5rZXlzKGNvbmRpdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgYXNzZXJ0RGVmaW5lZEZpbmRCeUNvbmRpdGlvblZhbHVlKGNvbmRpdGlvbnNba2V5XSwga2V5KVxuICAgICAgYXNzZXJ0RmluZEJ5Q29uZGl0aW9uU2VyaWFsaXphdGlvblByZXNlcnZlc1ZhbHVlKGNvbmRpdGlvbnNba2V5XSwgbm9ybWFsaXplZENvbmRpdGlvbnNba2V5XSwga2V5KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsQmFzZX0gbW9kZWwgLSBDYW5kaWRhdGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZGl0aW9ucyAtIE1hdGNoIGNvbmRpdGlvbnMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIG1vZGVsIG1hdGNoZXMgYWxsIGNvbmRpdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgbWF0Y2hlc0ZpbmRCeUNvbmRpdGlvbnMobW9kZWwsIGNvbmRpdGlvbnMpIHtcbiAgICBjb25zdCBtb2RlbEF0dHJpYnV0ZXMgPSBtb2RlbC5hdHRyaWJ1dGVzKClcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmRpdGlvbnMpKSB7XG4gICAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gY29uZGl0aW9uc1trZXldXG4gICAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IG1vZGVsQXR0cmlidXRlc1trZXldXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWUpKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFjdHVhbFZhbHVlKSkge1xuICAgICAgICAgIGlmICghdGhpcy5maW5kQnlDb25kaXRpb25WYWx1ZU1hdGNoZXMoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4cGVjdGVkVmFsdWUuc29tZSgoZW50cnkpID0+IHRoaXMuZmluZEJ5Q29uZGl0aW9uVmFsdWVNYXRjaGVzKGFjdHVhbFZhbHVlLCBlbnRyeSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZmluZEJ5Q29uZGl0aW9uVmFsdWVNYXRjaGVzKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7dW5rbm93bn0gYWN0dWFsVmFsdWUgLSBBY3R1YWwgbW9kZWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gZXhwZWN0ZWRWYWx1ZSAtIEV4cGVjdGVkIGZpbmQgY29uZGl0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZhbHVlcyBtYXRjaC5cbiAgICovXG4gIHN0YXRpYyBmaW5kQnlDb25kaXRpb25WYWx1ZU1hdGNoZXMoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpIHtcbiAgICBpZiAoZXhwZWN0ZWRWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGFjdHVhbFZhbHVlID09PSBudWxsXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhY3R1YWxWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGlmIChhY3R1YWxWYWx1ZS5sZW5ndGggIT09IGV4cGVjdGVkVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXhwZWN0ZWRWYWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbmRCeUNvbmRpdGlvblZhbHVlTWF0Y2hlcyhhY3R1YWxWYWx1ZVtpbmRleF0sIGV4cGVjdGVkVmFsdWVbaW5kZXhdKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdGVkVmFsdWUgJiYgdHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmICghYWN0dWFsVmFsdWUgfHwgdHlwZW9mIGFjdHVhbFZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYWN0dWFsVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3R1YWxPYmplY3QgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoYWN0dWFsVmFsdWUpXG4gICAgICBjb25zdCBleHBlY3RlZE9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChleHBlY3RlZFZhbHVlKVxuICAgICAgY29uc3QgYWN0dWFsS2V5cyA9IE9iamVjdC5rZXlzKGFjdHVhbE9iamVjdClcbiAgICAgIGNvbnN0IGV4cGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKGV4cGVjdGVkT2JqZWN0KVxuXG4gICAgICBpZiAoYWN0dWFsS2V5cy5sZW5ndGggIT09IGV4cGVjdGVkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGV4cGVjdGVkS2V5cykge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhY3R1YWxPYmplY3QsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5maW5kQnlDb25kaXRpb25WYWx1ZU1hdGNoZXMoYWN0dWFsT2JqZWN0W2tleV0sIGV4cGVjdGVkT2JqZWN0W2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoYWN0dWFsVmFsdWUgPT09IGV4cGVjdGVkVmFsdWUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmluZEJ5UHJpbWl0aXZlVmFsdWVzTWF0Y2goYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHBhcmFtIHt1bmtub3dufSBhY3R1YWxWYWx1ZSAtIEFjdHVhbCBtb2RlbCB2YWx1ZS5cbiAgICogQHBhcmFtIHt1bmtub3dufSBleHBlY3RlZFZhbHVlIC0gRXhwZWN0ZWQgZmluZCBjb25kaXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcHJpbWl0aXZlIHZhbHVlcyBtYXRjaCBhZnRlciBzYWZlIGNvZXJjaW9uLlxuICAgKi9cbiAgc3RhdGljIGZpbmRCeVByaW1pdGl2ZVZhbHVlc01hdGNoKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKSB7XG4gICAgaWYgKGFjdHVhbFZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiB0eXBlb2YgZXhwZWN0ZWRWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIGFjdHVhbFZhbHVlLnRvSVNPU3RyaW5nKCkgPT09IGV4cGVjdGVkVmFsdWVcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdHVhbFZhbHVlID09PSBcInN0cmluZ1wiICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gYWN0dWFsVmFsdWUgPT09IGV4cGVjdGVkVmFsdWUudG9JU09TdHJpbmcoKVxuICAgIH1cblxuICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBhY3R1YWxWYWx1ZS50b0lTT1N0cmluZygpID09PSBleHBlY3RlZFZhbHVlLnRvSVNPU3RyaW5nKClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdHVhbFZhbHVlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBleHBlY3RlZFZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kQnlOdW1lcmljU3RyaW5nTWF0Y2hlc051bWJlcihleHBlY3RlZFZhbHVlLCBhY3R1YWxWYWx1ZSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFjdHVhbFZhbHVlID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBleHBlY3RlZFZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kQnlOdW1lcmljU3RyaW5nTWF0Y2hlc051bWJlcihhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbnVtZXJpY1N0cmluZyAtIE51bWVyaWMgc3RyaW5nIHZhbHVlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZXhwZWN0ZWROdW1iZXIgLSBOdW1iZXIgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdmFsdWVzIHJlcHJlc2VudCB0aGUgc2FtZSBudW1iZXIuXG4gICAqL1xuICBzdGF0aWMgZmluZEJ5TnVtZXJpY1N0cmluZ01hdGNoZXNOdW1iZXIobnVtZXJpY1N0cmluZywgZXhwZWN0ZWROdW1iZXIpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShleHBlY3RlZE51bWJlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICghL14tP1xcZCsoPzpcXC5cXGQrKT8kLy50ZXN0KG51bWVyaWNTdHJpbmcpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gTnVtYmVyKG51bWVyaWNTdHJpbmcpID09PSBleHBlY3RlZE51bWJlclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW25ld0F0dHJpYnV0ZXNdIC0gTmV3IHZhbHVlcyB0byBhc3NpZ24gYmVmb3JlIHVwZGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dGhpcz59IC0gVXBkYXRlZCBtb2RlbC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShuZXdBdHRyaWJ1dGVzID0ge30pIHtcbiAgICBjb25zdCBNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuXG4gICAgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKG5ld0F0dHJpYnV0ZXMpXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJ1cGRhdGVcIiwge1xuICAgICAgYXR0cmlidXRlczogdGhpcy5hdHRyaWJ1dGVzKCksXG4gICAgICBpZDogdGhpcy5wcmltYXJ5S2V5VmFsdWUoKVxuICAgIH0pXG5cbiAgICB0aGlzLmFzc2lnbkF0dHJpYnV0ZXMoTW9kZWxDbGFzcy5hdHRyaWJ1dGVzRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSlcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBkZXN0cm95ZWQgb24gYmFja2VuZC5cbiAgICovXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcilcblxuICAgIGF3YWl0IE1vZGVsQ2xhc3MuZXhlY3V0ZUNvbW1hbmQoXCJkZXN0cm95XCIsIHtcbiAgICAgIGlkOiB0aGlzLnByaW1hcnlLZXlWYWx1ZSgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7dHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlfVxuICAgKiBAcGFyYW0ge1wiZmluZFwiIHwgXCJpbmRleFwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwifSBjb21tYW5kVHlwZSAtIENvbW1hbmQgdHlwZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXlsb2FkIC0gQ29tbWFuZCBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gLSBQYXJzZWQgSlNPTiByZXNwb25zZS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBleGVjdXRlQ29tbWFuZChjb21tYW5kVHlwZSwgcGF5bG9hZCkge1xuICAgIGNvbnN0IGNvbW1hbmROYW1lID0gdGhpcy5jb21tYW5kTmFtZShjb21tYW5kVHlwZSlcbiAgICBjb25zdCB1cmwgPSBmcm9udGVuZE1vZGVsQ29tbWFuZFVybCh0aGlzLnJlc291cmNlUGF0aCgpLCBjb21tYW5kTmFtZSlcbiAgICBjb25zdCBzZXJpYWxpemVkUGF5bG9hZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShwYXlsb2FkKSlcblxuICAgIGlmIChmcm9udGVuZE1vZGVsVHJhbnNwb3J0Q29uZmlnLnJlcXVlc3QpIHtcbiAgICAgIGNvbnN0IGN1c3RvbVJlc3BvbnNlID0gYXdhaXQgZnJvbnRlbmRNb2RlbFRyYW5zcG9ydENvbmZpZy5yZXF1ZXN0KHtcbiAgICAgICAgY29tbWFuZE5hbWUsXG4gICAgICAgIGNvbW1hbmRUeXBlLFxuICAgICAgICBtb2RlbENsYXNzOiB0aGlzLFxuICAgICAgICBwYXlsb2FkOiBzZXJpYWxpemVkUGF5bG9hZCxcbiAgICAgICAgdXJsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBkZWNvZGVkUmVzcG9uc2UgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovIChkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShjdXN0b21SZXNwb25zZSkpXG5cbiAgICAgIHRoaXMudGhyb3dPbkVycm9yRnJvbnRlbmRNb2RlbFJlc3BvbnNlKHtcbiAgICAgICAgY29tbWFuZFR5cGUsXG4gICAgICAgIHJlc3BvbnNlOiBkZWNvZGVkUmVzcG9uc2VcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBkZWNvZGVkUmVzcG9uc2VcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZFBheWxvYWQpLFxuICAgICAgY3JlZGVudGlhbHM6IGZyb250ZW5kTW9kZWxUcmFuc3BvcnRDb25maWcuY3JlZGVudGlhbHMsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICB9LFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIlxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVlc3QgZmFpbGVkICgke3Jlc3BvbnNlLnN0YXR1c30pIGZvciAke3RoaXMubmFtZX0jJHtjb21tYW5kVHlwZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgIGNvbnN0IGpzb24gPSByZXNwb25zZVRleHQubGVuZ3RoID4gMCA/IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KSA6IHt9XG4gICAgY29uc3QgZGVjb2RlZFJlc3BvbnNlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoanNvbikpXG5cbiAgICB0aGlzLnRocm93T25FcnJvckZyb250ZW5kTW9kZWxSZXNwb25zZSh7XG4gICAgICBjb21tYW5kVHlwZSxcbiAgICAgIHJlc3BvbnNlOiBkZWNvZGVkUmVzcG9uc2VcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRlY29kZWRSZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHt0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2V9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge1wiZmluZFwiIHwgXCJpbmRleFwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwifSBhcmdzLmNvbW1hbmRUeXBlIC0gQ29tbWFuZCB0eXBlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MucmVzcG9uc2UgLSBEZWNvZGVkIHJlc3BvbnNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyB0aHJvd09uRXJyb3JGcm9udGVuZE1vZGVsUmVzcG9uc2Uoe2NvbW1hbmRUeXBlLCByZXNwb25zZX0pIHtcbiAgICBpZiAocmVzcG9uc2U/LnN0YXR1cyAhPT0gXCJlcnJvclwiKSByZXR1cm5cblxuICAgIGNvbnN0IHJlc3BvbnNlS2V5cyA9IE9iamVjdC5rZXlzKHJlc3BvbnNlKVxuICAgIGNvbnN0IGhhc09ubHlTdGF0dXMgPSByZXNwb25zZUtleXMubGVuZ3RoID09PSAxICYmIHJlc3BvbnNlS2V5c1swXSA9PT0gXCJzdGF0dXNcIlxuICAgIGNvbnN0IGhhc0Vycm9yTWVzc2FnZSA9IHR5cGVvZiByZXNwb25zZS5lcnJvck1lc3NhZ2UgPT09IFwic3RyaW5nXCIgJiYgcmVzcG9uc2UuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcbiAgICBjb25zdCBoYXNFcnJvckVudmVsb3BlS2V5cyA9IEJvb2xlYW4oXG4gICAgICByZXNwb25zZS5jb2RlICE9PSB1bmRlZmluZWRcbiAgICAgIHx8IHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWRcbiAgICAgIHx8IHJlc3BvbnNlLmVycm9ycyAhPT0gdW5kZWZpbmVkXG4gICAgICB8fCByZXNwb25zZS5tZXNzYWdlICE9PSB1bmRlZmluZWRcbiAgICApXG4gICAgY29uc3Qgbm9uU3RhdHVzS2V5cyA9IHJlc3BvbnNlS2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInN0YXR1c1wiKVxuICAgIGNvbnN0IGNvbmZpZ3VyZWRBdHRyaWJ1dGVOYW1lcyA9IHRoaXMuY29uZmlndXJlZEZyb250ZW5kTW9kZWxBdHRyaWJ1dGVOYW1lcygpXG4gICAgY29uc3QgbG9va3NMaWtlUmF3TW9kZWxQYXlsb2FkID0gbm9uU3RhdHVzS2V5cy5sZW5ndGggPiAwXG4gICAgICAmJiBub25TdGF0dXNLZXlzLmV2ZXJ5KChrZXkpID0+IGNvbmZpZ3VyZWRBdHRyaWJ1dGVOYW1lcy5oYXMoa2V5KSlcblxuICAgIGlmICghaGFzRXJyb3JNZXNzYWdlICYmICFoYXNPbmx5U3RhdHVzICYmICFoYXNFcnJvckVudmVsb3BlS2V5cyAmJiBsb29rc0xpa2VSYXdNb2RlbFBheWxvYWQpIHJldHVyblxuXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gaGFzRXJyb3JNZXNzYWdlXG4gICAgICA/IHJlc3BvbnNlLmVycm9yTWVzc2FnZVxuICAgICAgOiBgUmVxdWVzdCBmYWlsZWQgZm9yICR7dGhpcy5uYW1lfSMke2NvbW1hbmRUeXBlfWBcblxuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge3R5cGVvZiBGcm9udGVuZE1vZGVsQmFzZX1cbiAgICogQHJldHVybnMge1NldDxzdHJpbmc+fSAtIENvbmZpZ3VyZWQgZnJvbnRlbmQgbW9kZWwgYXR0cmlidXRlIG5hbWVzLlxuICAgKi9cbiAgc3RhdGljIGNvbmZpZ3VyZWRGcm9udGVuZE1vZGVsQXR0cmlidXRlTmFtZXMoKSB7XG4gICAgY29uc3QgcmVzb3VyY2VDb25maWcgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovICh0aGlzLnJlc291cmNlQ29uZmlnKCkpXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHJlc291cmNlQ29uZmlnLmF0dHJpYnV0ZXNcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgICByZXR1cm4gbmV3IFNldChhdHRyaWJ1dGVzLmZpbHRlcigoYXR0cmlidXRlTmFtZSkgPT4gdHlwZW9mIGF0dHJpYnV0ZU5hbWUgPT09IFwic3RyaW5nXCIpKVxuICAgIH1cblxuICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gbmV3IFNldChPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFNldCgpXG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"get-route.d.ts","sourceRoot":"","sources":["../../../src/routes/get-route.js"],"names":[],"mappings":";AAOA;IACE;;;OAGG;IACH,mCAFG;QAAqB,IAAI,EAAjB,MAAM;KAChB,EAMA;IAFC,aAAgB;IAChB,eAA+D;CA8BlE;sBA1CqB,iBAAiB"}
1
+ {"version":3,"file":"get-route.d.ts","sourceRoot":"","sources":["../../../src/routes/get-route.js"],"names":[],"mappings":";AA4BA;IACE;;;OAGG;IACH,mCAFG;QAAqB,IAAI,EAAjB,MAAM;KAChB,EAMA;IAFC,aAAgB;IAChB,eAA+D;CA8BlE;sBA/DqB,iBAAiB"}
@@ -2,6 +2,23 @@
2
2
  import escapeStringRegexp from "escape-string-regexp";
3
3
  import BaseRoute from "./base-route.js";
4
4
  import restArgsError from "../utils/rest-args-error.js";
5
+ /**
6
+ * @param {Record<string, any>} params - Route params object.
7
+ * @param {string} name - Route name.
8
+ * @returns {void} - No return value.
9
+ */
10
+ function assignActionAndController(params, name) {
11
+ const segments = name.split("/").filter((segment) => segment.length > 0);
12
+ if (segments.length <= 1) {
13
+ params.action = name;
14
+ return;
15
+ }
16
+ const actionSegment = segments[segments.length - 1];
17
+ const controllerSuffix = segments.slice(0, -1).join("/");
18
+ const existingController = typeof params.controller === "string" && params.controller.length > 0 ? params.controller : null;
19
+ params.action = actionSegment;
20
+ params.controller = existingController ? `${existingController}/${controllerSuffix}` : controllerSuffix;
21
+ }
5
22
  class VelociousRouteGetRoute extends BaseRoute {
6
23
  /**
7
24
  * @param {object} args - Options object.
@@ -32,11 +49,11 @@ class VelociousRouteGetRoute extends BaseRoute {
32
49
  // Prevent partial prefix matches (e.g., "params" matching "params-with-query")
33
50
  if (restPath && !restPath.startsWith("/"))
34
51
  return;
35
- params.action = this.name;
52
+ assignActionAndController(params, this.name);
36
53
  return { restPath };
37
54
  }
38
55
  }
39
56
  }
40
57
  BaseRoute.registerRouteGetType(VelociousRouteGetRoute);
41
58
  export default VelociousRouteGetRoute;
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9nZXQtcm91dGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sa0JBQWtCLE1BQU0sc0JBQXNCLENBQUE7QUFFckQsT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUE7QUFDdkMsT0FBTyxhQUFhLE1BQU0sNkJBQTZCLENBQUE7QUFFdkQsTUFBTSxzQkFBdUIsU0FBUSxTQUFTO0lBQzVDOzs7T0FHRztJQUNILFlBQVksRUFBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDN0IsS0FBSyxFQUFFLENBQUE7UUFDUCxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNqRSxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU87WUFDTCxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUM7U0FDcEQsQ0FBQTtJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVyQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFBLENBQUMscUNBQXFDO1lBRTVGLCtFQUErRTtZQUMvRSxJQUFJLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUFFLE9BQU07WUFFakQsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1lBRXpCLE9BQU8sRUFBQyxRQUFRLEVBQUMsQ0FBQTtRQUNuQixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsU0FBUyxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLENBQUE7QUFFdEQsZUFBZSxzQkFBc0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgZXNjYXBlU3RyaW5nUmVnZXhwIGZyb20gXCJlc2NhcGUtc3RyaW5nLXJlZ2V4cFwiXG5cbmltcG9ydCBCYXNlUm91dGUgZnJvbSBcIi4vYmFzZS1yb3V0ZS5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuY2xhc3MgVmVsb2Npb3VzUm91dGVHZXRSb3V0ZSBleHRlbmRzIEJhc2VSb3V0ZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lIC0gTmFtZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtuYW1lLCAuLi5yZXN0QXJnc30pIHtcbiAgICBzdXBlcigpXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdGhpcy5yZWdFeHAgPSBuZXcgUmVnRXhwKGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKG5hbWUpfSkoLiopJGApXG4gIH1cblxuICBnZXRIdW1hblBhdGhzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7bWV0aG9kOiBcIkdFVFwiLCBhY3Rpb246IHRoaXMubmFtZSwgcGF0aDogdGhpcy5uYW1lfVxuICAgIF1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MucGFyYW1zIC0gUGFyYW1ldGVycyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gYXJncy5yZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt7cmVzdFBhdGg6IHN0cmluZ30gfCB1bmRlZmluZWR9IC0gUkVTVCBwYXRoIG1ldGFkYXRhIGZvciB0aGlzIHJvdXRlLlxuICAgKi9cbiAgbWF0Y2hXaXRoUGF0aCh7cGFyYW1zLCBwYXRoLCByZXF1ZXN0fSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY29uc3QgbWF0Y2ggPSBwYXRoLm1hdGNoKHRoaXMucmVnRXhwKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBbX2JlZ2lubmlnU2xhc2gsIF9tYXRjaGVkTmFtZSwgcmVzdFBhdGhdID0gbWF0Y2ggLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gICAgICAvLyBQcmV2ZW50IHBhcnRpYWwgcHJlZml4IG1hdGNoZXMgKGUuZy4sIFwicGFyYW1zXCIgbWF0Y2hpbmcgXCJwYXJhbXMtd2l0aC1xdWVyeVwiKVxuICAgICAgaWYgKHJlc3RQYXRoICYmICFyZXN0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuXG5cbiAgICAgIHBhcmFtcy5hY3Rpb24gPSB0aGlzLm5hbWVcblxuICAgICAgcmV0dXJuIHtyZXN0UGF0aH1cbiAgICB9XG4gIH1cbn1cblxuQmFzZVJvdXRlLnJlZ2lzdGVyUm91dGVHZXRUeXBlKFZlbG9jaW91c1JvdXRlR2V0Um91dGUpXG5cbmV4cG9ydCBkZWZhdWx0IFZlbG9jaW91c1JvdXRlR2V0Um91dGVcblxuIl19
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9nZXQtcm91dGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sa0JBQWtCLE1BQU0sc0JBQXNCLENBQUE7QUFFckQsT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUE7QUFDdkMsT0FBTyxhQUFhLE1BQU0sNkJBQTZCLENBQUE7QUFFdkQ7Ozs7R0FJRztBQUNILFNBQVMseUJBQXlCLENBQUMsTUFBTSxFQUFFLElBQUk7SUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFFeEUsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFBO1FBQ3BCLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDbkQsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN4RCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sTUFBTSxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFFM0gsTUFBTSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUE7SUFDN0IsTUFBTSxDQUFDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQTtBQUN6RyxDQUFDO0FBRUQsTUFBTSxzQkFBdUIsU0FBUSxTQUFTO0lBQzVDOzs7T0FHRztJQUNILFlBQVksRUFBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDN0IsS0FBSyxFQUFFLENBQUE7UUFDUCxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNqRSxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU87WUFDTCxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUM7U0FDcEQsQ0FBQTtJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVyQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFBLENBQUMscUNBQXFDO1lBRTVGLCtFQUErRTtZQUMvRSxJQUFJLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUFFLE9BQU07WUFFakQseUJBQXlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUU1QyxPQUFPLEVBQUMsUUFBUSxFQUFDLENBQUE7UUFDbkIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO0FBRXRELGVBQWUsc0JBQXNCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGVzY2FwZVN0cmluZ1JlZ2V4cCBmcm9tIFwiZXNjYXBlLXN0cmluZy1yZWdleHBcIlxuXG5pbXBvcnQgQmFzZVJvdXRlIGZyb20gXCIuL2Jhc2Utcm91dGUuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBSb3V0ZSBwYXJhbXMgb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBSb3V0ZSBuYW1lLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhc3NpZ25BY3Rpb25BbmRDb250cm9sbGVyKHBhcmFtcywgbmFtZSkge1xuICBjb25zdCBzZWdtZW50cyA9IG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcigoc2VnbWVudCkgPT4gc2VnbWVudC5sZW5ndGggPiAwKVxuXG4gIGlmIChzZWdtZW50cy5sZW5ndGggPD0gMSkge1xuICAgIHBhcmFtcy5hY3Rpb24gPSBuYW1lXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBhY3Rpb25TZWdtZW50ID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV1cbiAgY29uc3QgY29udHJvbGxlclN1ZmZpeCA9IHNlZ21lbnRzLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKVxuICBjb25zdCBleGlzdGluZ0NvbnRyb2xsZXIgPSB0eXBlb2YgcGFyYW1zLmNvbnRyb2xsZXIgPT09IFwic3RyaW5nXCIgJiYgcGFyYW1zLmNvbnRyb2xsZXIubGVuZ3RoID4gMCA/IHBhcmFtcy5jb250cm9sbGVyIDogbnVsbFxuXG4gIHBhcmFtcy5hY3Rpb24gPSBhY3Rpb25TZWdtZW50XG4gIHBhcmFtcy5jb250cm9sbGVyID0gZXhpc3RpbmdDb250cm9sbGVyID8gYCR7ZXhpc3RpbmdDb250cm9sbGVyfS8ke2NvbnRyb2xsZXJTdWZmaXh9YCA6IGNvbnRyb2xsZXJTdWZmaXhcbn1cblxuY2xhc3MgVmVsb2Npb3VzUm91dGVHZXRSb3V0ZSBleHRlbmRzIEJhc2VSb3V0ZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lIC0gTmFtZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtuYW1lLCAuLi5yZXN0QXJnc30pIHtcbiAgICBzdXBlcigpXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdGhpcy5yZWdFeHAgPSBuZXcgUmVnRXhwKGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKG5hbWUpfSkoLiopJGApXG4gIH1cblxuICBnZXRIdW1hblBhdGhzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7bWV0aG9kOiBcIkdFVFwiLCBhY3Rpb246IHRoaXMubmFtZSwgcGF0aDogdGhpcy5uYW1lfVxuICAgIF1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MucGFyYW1zIC0gUGFyYW1ldGVycyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gYXJncy5yZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt7cmVzdFBhdGg6IHN0cmluZ30gfCB1bmRlZmluZWR9IC0gUkVTVCBwYXRoIG1ldGFkYXRhIGZvciB0aGlzIHJvdXRlLlxuICAgKi9cbiAgbWF0Y2hXaXRoUGF0aCh7cGFyYW1zLCBwYXRoLCByZXF1ZXN0fSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY29uc3QgbWF0Y2ggPSBwYXRoLm1hdGNoKHRoaXMucmVnRXhwKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBbX2JlZ2lubmlnU2xhc2gsIF9tYXRjaGVkTmFtZSwgcmVzdFBhdGhdID0gbWF0Y2ggLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gICAgICAvLyBQcmV2ZW50IHBhcnRpYWwgcHJlZml4IG1hdGNoZXMgKGUuZy4sIFwicGFyYW1zXCIgbWF0Y2hpbmcgXCJwYXJhbXMtd2l0aC1xdWVyeVwiKVxuICAgICAgaWYgKHJlc3RQYXRoICYmICFyZXN0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuXG5cbiAgICAgIGFzc2lnbkFjdGlvbkFuZENvbnRyb2xsZXIocGFyYW1zLCB0aGlzLm5hbWUpXG5cbiAgICAgIHJldHVybiB7cmVzdFBhdGh9XG4gICAgfVxuICB9XG59XG5cbkJhc2VSb3V0ZS5yZWdpc3RlclJvdXRlR2V0VHlwZShWZWxvY2lvdXNSb3V0ZUdldFJvdXRlKVxuXG5leHBvcnQgZGVmYXVsdCBWZWxvY2lvdXNSb3V0ZUdldFJvdXRlXG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"post-route.d.ts","sourceRoot":"","sources":["../../../src/routes/post-route.js"],"names":[],"mappings":";AAMA;IACE;;;OAGG;IACH,mCAFG;QAAqB,IAAI,EAAjB,MAAM;KAChB,EAMA;IAFC,aAAgB;IAChB,eAA+D;CA2BlE;sBAxCqB,iBAAiB"}
1
+ {"version":3,"file":"post-route.d.ts","sourceRoot":"","sources":["../../../src/routes/post-route.js"],"names":[],"mappings":";AA2BA;IACE;;;OAGG;IACH,mCAFG;QAAqB,IAAI,EAAjB,MAAM;KAChB,EAMA;IAFC,aAAgB;IAChB,eAA+D;CA8BlE;sBAhEqB,iBAAiB"}
@@ -2,6 +2,23 @@
2
2
  import BaseRoute from "./base-route.js";
3
3
  import escapeStringRegexp from "escape-string-regexp";
4
4
  import restArgsError from "../utils/rest-args-error.js";
5
+ /**
6
+ * @param {Record<string, any>} params - Route params object.
7
+ * @param {string} name - Route name.
8
+ * @returns {void} - No return value.
9
+ */
10
+ function assignActionAndController(params, name) {
11
+ const segments = name.split("/").filter((segment) => segment.length > 0);
12
+ if (segments.length <= 1) {
13
+ params.action = name;
14
+ return;
15
+ }
16
+ const actionSegment = segments[segments.length - 1];
17
+ const controllerSuffix = segments.slice(0, -1).join("/");
18
+ const existingController = typeof params.controller === "string" && params.controller.length > 0 ? params.controller : null;
19
+ params.action = actionSegment;
20
+ params.controller = existingController ? `${existingController}/${controllerSuffix}` : controllerSuffix;
21
+ }
5
22
  class VelociousRoutePostRoute extends BaseRoute {
6
23
  /**
7
24
  * @param {object} args - Options object.
@@ -30,11 +47,14 @@ class VelociousRoutePostRoute extends BaseRoute {
30
47
  const match = path.match(this.regExp);
31
48
  if (match) {
32
49
  const [_beginnigSlash, _matchedName, restPath] = match; // eslint-disable-line no-unused-vars
33
- params.action = this.name;
50
+ // Prevent partial prefix matches (e.g., "update" matching "update-password")
51
+ if (restPath && !restPath.startsWith("/"))
52
+ return;
53
+ assignActionAndController(params, this.name);
34
54
  return { restPath };
35
55
  }
36
56
  }
37
57
  }
38
58
  BaseRoute.registerRoutePostType(VelociousRoutePostRoute);
39
59
  export default VelociousRoutePostRoute;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdC1yb3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yb3V0ZXMvcG9zdC1yb3V0ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUE7QUFDdkMsT0FBTyxrQkFBa0IsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRCxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RCxNQUFNLHVCQUF3QixTQUFRLFNBQVM7SUFDN0M7OztPQUdHO0lBQ0gsWUFBWSxFQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBQztRQUM3QixLQUFLLEVBQUUsQ0FBQTtRQUNQLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2pFLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxDQUFDO2dCQUNOLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2FBQUM7U0FDcEQsQ0FBQTtJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVyQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFBLENBQUMscUNBQXFDO1lBRTVGLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtZQUV6QixPQUFPLEVBQUMsUUFBUSxFQUFDLENBQUE7UUFDbkIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0FBRXhELGVBQWUsdUJBQXVCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEJhc2VSb3V0ZSBmcm9tIFwiLi9iYXNlLXJvdXRlLmpzXCJcbmltcG9ydCBlc2NhcGVTdHJpbmdSZWdleHAgZnJvbSBcImVzY2FwZS1zdHJpbmctcmVnZXhwXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG5jbGFzcyBWZWxvY2lvdXNSb3V0ZVBvc3RSb3V0ZSBleHRlbmRzIEJhc2VSb3V0ZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lIC0gTmFtZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtuYW1lLCAuLi5yZXN0QXJnc30pIHtcbiAgICBzdXBlcigpXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdGhpcy5yZWdFeHAgPSBuZXcgUmVnRXhwKGBeKCR7ZXNjYXBlU3RyaW5nUmVnZXhwKG5hbWUpfSkoLiopJGApXG4gIH1cblxuICBnZXRIdW1hblBhdGhzKCkge1xuICAgIHJldHVybiBbe1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIiwgYWN0aW9uOiB0aGlzLm5hbWUsIHBhdGg6IHRoaXMubmFtZX1cbiAgICBdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzLnBhcmFtcyAtIFBhcmFtZXRlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wYXRoIC0gUGF0aC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7e3Jlc3RQYXRoOiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIFJFU1QgcGF0aCBtZXRhZGF0YSBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIG1hdGNoV2l0aFBhdGgoe3BhcmFtcywgcGF0aCwgcmVxdWVzdH0pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IG1hdGNoID0gcGF0aC5tYXRjaCh0aGlzLnJlZ0V4cClcblxuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgW19iZWdpbm5pZ1NsYXNoLCBfbWF0Y2hlZE5hbWUsIHJlc3RQYXRoXSA9IG1hdGNoIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblxuICAgICAgcGFyYW1zLmFjdGlvbiA9IHRoaXMubmFtZVxuXG4gICAgICByZXR1cm4ge3Jlc3RQYXRofVxuICAgIH1cbiAgfVxufVxuXG5CYXNlUm91dGUucmVnaXN0ZXJSb3V0ZVBvc3RUeXBlKFZlbG9jaW91c1JvdXRlUG9zdFJvdXRlKVxuXG5leHBvcnQgZGVmYXVsdCBWZWxvY2lvdXNSb3V0ZVBvc3RSb3V0ZVxuXG4iXX0=
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdC1yb3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yb3V0ZXMvcG9zdC1yb3V0ZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxTQUFTLE1BQU0saUJBQWlCLENBQUE7QUFDdkMsT0FBTyxrQkFBa0IsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRCxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RDs7OztHQUlHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsSUFBSTtJQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUV4RSxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUE7UUFDcEIsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNuRCxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3hELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxNQUFNLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUUzSCxNQUFNLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQTtJQUM3QixNQUFNLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixJQUFJLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFBO0FBQ3pHLENBQUM7QUFFRCxNQUFNLHVCQUF3QixTQUFRLFNBQVM7SUFDN0M7OztPQUdHO0lBQ0gsWUFBWSxFQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBQztRQUM3QixLQUFLLEVBQUUsQ0FBQTtRQUNQLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2pFLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxDQUFDO2dCQUNOLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2FBQUM7U0FDcEQsQ0FBQTtJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUVyQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFBLENBQUMscUNBQXFDO1lBRTVGLDZFQUE2RTtZQUM3RSxJQUFJLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUFFLE9BQU07WUFFakQseUJBQXlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUU1QyxPQUFPLEVBQUMsUUFBUSxFQUFDLENBQUE7UUFDbkIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0FBRXhELGVBQWUsdUJBQXVCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEJhc2VSb3V0ZSBmcm9tIFwiLi9iYXNlLXJvdXRlLmpzXCJcbmltcG9ydCBlc2NhcGVTdHJpbmdSZWdleHAgZnJvbSBcImVzY2FwZS1zdHJpbmctcmVnZXhwXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGFyYW1zIC0gUm91dGUgcGFyYW1zIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gUm91dGUgbmFtZS5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXNzaWduQWN0aW9uQW5kQ29udHJvbGxlcihwYXJhbXMsIG5hbWUpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQubGVuZ3RoID4gMClcblxuICBpZiAoc2VnbWVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICBwYXJhbXMuYWN0aW9uID0gbmFtZVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgYWN0aW9uU2VnbWVudCA9IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdXG4gIGNvbnN0IGNvbnRyb2xsZXJTdWZmaXggPSBzZWdtZW50cy5zbGljZSgwLCAtMSkuam9pbihcIi9cIilcbiAgY29uc3QgZXhpc3RpbmdDb250cm9sbGVyID0gdHlwZW9mIHBhcmFtcy5jb250cm9sbGVyID09PSBcInN0cmluZ1wiICYmIHBhcmFtcy5jb250cm9sbGVyLmxlbmd0aCA+IDAgPyBwYXJhbXMuY29udHJvbGxlciA6IG51bGxcblxuICBwYXJhbXMuYWN0aW9uID0gYWN0aW9uU2VnbWVudFxuICBwYXJhbXMuY29udHJvbGxlciA9IGV4aXN0aW5nQ29udHJvbGxlciA/IGAke2V4aXN0aW5nQ29udHJvbGxlcn0vJHtjb250cm9sbGVyU3VmZml4fWAgOiBjb250cm9sbGVyU3VmZml4XG59XG5cbmNsYXNzIFZlbG9jaW91c1JvdXRlUG9zdFJvdXRlIGV4dGVuZHMgQmFzZVJvdXRlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm5hbWUgLSBOYW1lLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe25hbWUsIC4uLnJlc3RBcmdzfSkge1xuICAgIHN1cGVyKClcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB0aGlzLnJlZ0V4cCA9IG5ldyBSZWdFeHAoYF4oJHtlc2NhcGVTdHJpbmdSZWdleHAobmFtZSl9KSguKikkYClcbiAgfVxuXG4gIGdldEh1bWFuUGF0aHMoKSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLCBhY3Rpb246IHRoaXMubmFtZSwgcGF0aDogdGhpcy5uYW1lfVxuICAgIF1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MucGFyYW1zIC0gUGFyYW1ldGVycyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gYXJncy5yZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt7cmVzdFBhdGg6IHN0cmluZ30gfCB1bmRlZmluZWR9IC0gUkVTVCBwYXRoIG1ldGFkYXRhIGZvciB0aGlzIHJvdXRlLlxuICAgKi9cbiAgbWF0Y2hXaXRoUGF0aCh7cGFyYW1zLCBwYXRoLCByZXF1ZXN0fSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY29uc3QgbWF0Y2ggPSBwYXRoLm1hdGNoKHRoaXMucmVnRXhwKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBbX2JlZ2lubmlnU2xhc2gsIF9tYXRjaGVkTmFtZSwgcmVzdFBhdGhdID0gbWF0Y2ggLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gICAgICAvLyBQcmV2ZW50IHBhcnRpYWwgcHJlZml4IG1hdGNoZXMgKGUuZy4sIFwidXBkYXRlXCIgbWF0Y2hpbmcgXCJ1cGRhdGUtcGFzc3dvcmRcIilcbiAgICAgIGlmIChyZXN0UGF0aCAmJiAhcmVzdFBhdGguc3RhcnRzV2l0aChcIi9cIikpIHJldHVyblxuXG4gICAgICBhc3NpZ25BY3Rpb25BbmRDb250cm9sbGVyKHBhcmFtcywgdGhpcy5uYW1lKVxuXG4gICAgICByZXR1cm4ge3Jlc3RQYXRofVxuICAgIH1cbiAgfVxufVxuXG5CYXNlUm91dGUucmVnaXN0ZXJSb3V0ZVBvc3RUeXBlKFZlbG9jaW91c1JvdXRlUG9zdFJvdXRlKVxuXG5leHBvcnQgZGVmYXVsdCBWZWxvY2lvdXNSb3V0ZVBvc3RSb3V0ZVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAWA;IAIE;;;;;OAKG;IACH,kDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACmF,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO;QACvD,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO;KAC7D,EAcA;IAtBD,iCAAiC;IACjC,QADW,MAAM,GAAG,SAAS,CACvB;IAaJ,qDAAkC;IAGlC,YAAgC;IAGhC,2HAAsB;IACtB,8DAAwB;IAG1B,yBA6FC;IAED;;;;OAIG;IACH,2BAJW,OAAO,iBAAiB,EAAE,OAAO,QACjC,MAAM,GACJ;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAsB1C;IAED;;;OAGG;IACH,uCAHW,MAAM,GACJ,OAAO,CAAC,OAAO,2BAA2B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAqCvF;IAED;;;;;OAKG;IACH,6CAJG;QAAqB,MAAM,EAAnB,MAAM;QAC0C,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;KACjD,GAAU,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;OAGG;IACH,uBAHW,IAAI,GACF,MAAM,CAqBlB;IAED;;;OAGG;IACH,iCAHW,GAAG,GACD,GAAG,CA2Bf;CACF;mBA/QkB,cAAc"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAmBA;IAIE;;;;;OAKG;IACH,kDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACmF,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO;QACvD,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO;KAC7D,EAcA;IAtBD,iCAAiC;IACjC,QADW,MAAM,GAAG,SAAS,CACvB;IAaJ,qDAAkC;IAGlC,YAAgC;IAGhC,2HAAsB;IACtB,8DAAwB;IAG1B,yBA6FC;IAED;;;;OAIG;IACH,2BAJW,OAAO,iBAAiB,EAAE,OAAO,QACjC,MAAM,GACJ;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAiC1C;IAED;;;OAGG;IACH,uCAHW,MAAM,GACJ,OAAO,CAAC,OAAO,2BAA2B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAqCvF;IAED;;;;;OAKG;IACH,6CAJG;QAAqB,MAAM,EAAnB,MAAM;QAC0C,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;KACjD,GAAU,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;OAGG;IACH,uBAHW,IAAI,GACF,MAAM,CAqBlB;IAED;;;OAGG;IACH,iCAHW,GAAG,GACD,GAAG,CA2Bf;CACF;mBAlSkB,cAAc"}
@@ -7,6 +7,13 @@ import Logger from "../logger.js";
7
7
  import UploadedFile from "../http-server/client/uploaded-file/uploaded-file.js";
8
8
  import ensureError from "../utils/ensure-error.js";
9
9
  import toImportSpecifier from "../utils/to-import-specifier.js";
10
+ /**
11
+ * @param {string} actionName - Raw action name from route params or route hook.
12
+ * @returns {string} - Normalized controller method name.
13
+ */
14
+ function normalizeActionName(actionName) {
15
+ return inflection.camelize(actionName.replaceAll("-", "_").replaceAll("/", "_"), true);
16
+ }
10
17
  export default class VelociousRoutesResolver {
11
18
  /** @type {Logger | undefined} */
12
19
  logger;
@@ -43,11 +50,11 @@ export default class VelociousRoutesResolver {
43
50
  const actionParam = this.params.action;
44
51
  const controllerParam = this.params.controller;
45
52
  const actionValue = typeof actionParam == "string" ? actionParam : (Array.isArray(actionParam) ? actionParam[0] : undefined);
46
- let action = typeof actionValue == "string" ? inflection.camelize(actionValue.replaceAll("-", "_"), true) : undefined;
53
+ let action = typeof actionValue == "string" ? normalizeActionName(actionValue) : undefined;
47
54
  let controller = typeof controllerParam == "string" ? controllerParam : (Array.isArray(controllerParam) ? controllerParam[0] : undefined);
48
55
  if (routeResolverHookMatch) {
49
56
  controller = routeResolverHookMatch.controller;
50
- action = inflection.camelize(routeResolverHookMatch.action.replaceAll("-", "_"), true);
57
+ action = normalizeActionName(routeResolverHookMatch.action);
51
58
  this.params.controller = controller;
52
59
  this.params.action = routeResolverHookMatch.action;
53
60
  controllerPath = `${this.configuration.getDirectory()}/src/routes/${controller}/controller.js`;
@@ -126,16 +133,24 @@ export default class VelociousRoutesResolver {
126
133
  matchPathWithRoutes(route, path) {
127
134
  const pathWithoutSlash = path.replace(/^\//, "").split("?")[0];
128
135
  for (const subRoute of route.routes) {
136
+ const paramsSnapshot = { ...this.params };
129
137
  const matchResult = subRoute.matchWithPath({
130
138
  params: this.params,
131
139
  path: pathWithoutSlash,
132
140
  request: this.request
133
141
  });
134
- if (!matchResult)
142
+ if (!matchResult) {
143
+ this.params = paramsSnapshot;
135
144
  continue;
145
+ }
136
146
  const { restPath } = matchResult;
137
147
  if (restPath) {
138
- return this.matchPathWithRoutes(subRoute, restPath);
148
+ const recursiveMatch = this.matchPathWithRoutes(subRoute, restPath);
149
+ if (recursiveMatch) {
150
+ return recursiveMatch;
151
+ }
152
+ this.params = paramsSnapshot;
153
+ continue;
139
154
  }
140
155
  return matchResult;
141
156
  }
@@ -241,4 +256,4 @@ export default class VelociousRoutesResolver {
241
256
  return value;
242
257
  }
243
258
  }
244
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3Jlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLFlBQVksTUFBTSxzREFBc0QsQ0FBQTtBQUMvRSxPQUFPLFdBQVcsTUFBTSwwQkFBMEIsQ0FBQTtBQUNsRCxPQUFPLGlCQUFpQixNQUFNLGlDQUFpQyxDQUFBO0FBRS9ELE1BQU0sQ0FBQyxPQUFPLE9BQU8sdUJBQXVCO0lBQzFDLGlDQUFpQztJQUNqQyxNQUFNLENBQUE7SUFFTjs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQztRQUM1QyxJQUFJLENBQUMsYUFBYTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUM3RCxJQUFJLENBQUMsT0FBTztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsUUFBUTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUVuRCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtRQUMzRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFBO1FBQzVDLElBQUks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QUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUMxRCxDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaXJuYW1lfSBmcm9tIFwicGF0aFwiXG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgVXBsb2FkZWRGaWxlIGZyb20gXCIuLi9odHRwLXNlcnZlci9jbGllbnQvdXBsb2FkZWQtZmlsZS91cGxvYWRlZC1maWxlLmpzXCJcbmltcG9ydCBlbnN1cmVFcnJvciBmcm9tIFwiLi4vdXRpbHMvZW5zdXJlLWVycm9yLmpzXCJcbmltcG9ydCB0b0ltcG9ydFNwZWNpZmllciBmcm9tIFwiLi4vdXRpbHMvdG8taW1wb3J0LXNwZWNpZmllci5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c1JvdXRlc1Jlc29sdmVyIHtcbiAgLyoqIEB0eXBlIHtMb2dnZXIgfCB1bmRlZmluZWR9ICovXG4gIGxvZ2dlclxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSkge1xuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29uZmlndXJhdGlvbiBnaXZlblwiKVxuICAgIGlmICghcmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVxdWVzdCBnaXZlblwiKVxuICAgIGlmICghcmVzcG9uc2UpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3BvbnNlIGdpdmVuXCIpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUm91dGVzUmVzb2x2ZXJcIiwge2NvbmZpZ3VyYXRpb259KVxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSByZXF1ZXN0LnBhcmFtcygpIHx8IHt9XG4gICAgdGhpcy5wYXJhbXMgPSB7Li4ucmVxdWVzdFBhcmFtc31cbiAgICBkZWxldGUgdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLmNvbnRyb2xsZXJcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gIH1cblxuICBhc3luYyByZXNvbHZlKCkge1xuICAgIGxldCBjb250cm9sbGVyUGF0aFxuICAgIGxldCBjdXJyZW50Um91dGUgPSB0aGlzLmNvbmZpZ3VyYXRpb24ucm91dGVzLnJvb3RSb3V0ZVxuICAgIGNvbnN0IHJhd1BhdGggPSB0aGlzLnJlcXVlc3QucGF0aCgpXG4gICAgY29uc3QgY3VycmVudFBhdGggPSByYXdQYXRoLnNwbGl0KFwiP1wiKVswXVxuICAgIGxldCB2aWV3UGF0aFxuXG4gICAgY29uc3Qgcm91dGVSZXNvbHZlckhvb2tNYXRjaCA9IGF3YWl0IHRoaXMucmVzb2x2ZVJvdXRlUmVzb2x2ZXJIb29rcyhjdXJyZW50UGF0aClcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggPyB1bmRlZmluZWQgOiB0aGlzLm1hdGNoUGF0aFdpdGhSb3V0ZXMoY3VycmVudFJvdXRlLCBjdXJyZW50UGF0aClcbiAgICBjb25zdCBhY3Rpb25QYXJhbSA9IHRoaXMucGFyYW1zLmFjdGlvblxuICAgIGNvbnN0IGNvbnRyb2xsZXJQYXJhbSA9IHRoaXMucGFyYW1zLmNvbnRyb2xsZXJcbiAgICBjb25zdCBhY3Rpb25WYWx1ZSA9IHR5cGVvZiBhY3Rpb25QYXJhbSA9PSBcInN0cmluZ1wiID8gYWN0aW9uUGFyYW0gOiAoQXJyYXkuaXNBcnJheShhY3Rpb25QYXJhbSkgPyBhY3Rpb25QYXJhbVswXSA6IHVuZGVmaW5lZClcbiAgICBsZXQgYWN0aW9uID0gdHlwZW9mIGFjdGlvblZhbHVlID09IFwic3RyaW5nXCIgPyBpbmZsZWN0aW9uLmNhbWVsaXplKGFjdGlvblZhbHVlLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSwgdHJ1ZSkgOiB1bmRlZmluZWRcbiAgICBsZXQgY29udHJvbGxlciA9IHR5cGVvZiBjb250cm9sbGVyUGFyYW0gPT0gXCJzdHJpbmdcIiA/IGNvbnRyb2xsZXJQYXJhbSA6IChBcnJheS5pc0FycmF5KGNvbnRyb2xsZXJQYXJhbSkgPyBjb250cm9sbGVyUGFyYW1bMF0gOiB1bmRlZmluZWQpXG5cbiAgICBpZiAocm91dGVSZXNvbHZlckhvb2tNYXRjaCkge1xuICAgICAgY29udHJvbGxlciA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclxuICAgICAgYWN0aW9uID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShyb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvbi5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIiksIHRydWUpXG4gICAgICB0aGlzLnBhcmFtcy5jb250cm9sbGVyID0gY29udHJvbGxlclxuICAgICAgdGhpcy5wYXJhbXMuYWN0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaC5hY3Rpb25cbiAgICAgIGNvbnRyb2xsZXJQYXRoID0gYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn0vY29udHJvbGxlci5qc2BcbiAgICAgIHZpZXdQYXRoID0gYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn1gXG4gICAgfSBlbHNlIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKVxuICAgICAgICBjb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKF9fZmlsZW5hbWUpXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZFBhdGggPSBjdXJyZW50UGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikgfHwgXCJfcm9vdFwiXG4gICAgICAgIGNvbnN0IGF0dGVtcHRlZENvbnRyb2xsZXJQYXRoID0gYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7cmVxdWVzdGVkUGF0aH0vY29udHJvbGxlci5qc2BcblxuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci53YXJuKGBObyByb3V0ZSBtYXRjaGVkIGZvciAke3Jhd1BhdGh9LiBUcmllZCBjb250cm9sbGVyIGF0ICR7YXR0ZW1wdGVkQ29udHJvbGxlclBhdGh9YClcblxuICAgICAgICBjb250cm9sbGVyID0gXCJlcnJvcnNcIlxuICAgICAgICBjb250cm9sbGVyUGF0aCA9IFwiLi9idWlsdC1pbi9lcnJvcnMvY29udHJvbGxlci5qc1wiXG4gICAgICAgIGFjdGlvbiA9IFwibm90Rm91bmRcIlxuICAgICAgICB2aWV3UGF0aCA9IGF3YWl0IGZzLnJlYWxwYXRoKGAke19fZGlybmFtZX0vYnVpbHQtaW4vZXJyb3JzYClcbiAgICB9IGVsc2UgaWYgKGFjdGlvbikge1xuICAgICAgaWYgKCFjb250cm9sbGVyKSBjb250cm9sbGVyID0gXCJfcm9vdFwiXG5cbiAgICAgIGNvbnRyb2xsZXJQYXRoID0gYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn0vY29udHJvbGxlci5qc2BcbiAgICAgIHZpZXdQYXRoID0gYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWF0Y2hlZCB0aGUgcm91dGUgYnV0IGRpZG4ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBpdDogJHtyYXdQYXRofSAoYWN0aW9uOiAke2FjdGlvbn0sIGNvbnRyb2xsZXI6ICR7Y29udHJvbGxlcn0sIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnBhcmFtcyl9KWApXG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlckNsYXNzSW1wb3J0ID0gYXdhaXQgaW1wb3J0KHRvSW1wb3J0U3BlY2lmaWVyKGNvbnRyb2xsZXJQYXRoKSlcbiAgICBjb25zdCBjb250cm9sbGVyQ2xhc3MgPSBjb250cm9sbGVyQ2xhc3NJbXBvcnQuZGVmYXVsdFxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyQ2xhc3Moe1xuICAgICAgYWN0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZSxcbiAgICAgIHZpZXdQYXRoXG4gICAgfSlcblxuICAgIGlmICghKGFjdGlvbiBpbiBjb250cm9sbGVySW5zdGFuY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYWN0aW9uIG9uIGNvbnRyb2xsZXI6ICR7Y29udHJvbGxlcn0jJHthY3Rpb259YClcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLl9sb2dBY3Rpb25TdGFydCh7YWN0aW9uLCBjb250cm9sbGVyQ2xhc3N9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFiaWxpdHkgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucmVzb2x2ZUFiaWxpdHkoe1xuICAgICAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhBYmlsaXR5KGFiaWxpdHksIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjb250cm9sbGVySW5zdGFuY2UuX3J1bkJlZm9yZUNhbGxiYWNrcygpXG4gICAgICAgICAgYXdhaXQgY29udHJvbGxlckluc3RhbmNlW2FjdGlvbl0oKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZW5zdXJlZEVycm9yID0gZW5zdXJlRXJyb3IoZXJyb3IpXG4gICAgICBjb25zdCBlcnJvckNvbnRleHQgPSB7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgaHR0cE1ldGhvZDogdGhpcy5yZXF1ZXN0Lmh0dHBNZXRob2QoKSxcbiAgICAgICAgcGF0aDogdGhpcy5yZXF1ZXN0LnBhdGgoKSxcbiAgICAgICAgc3RhZ2U6IFwiY29udHJvbGxlci1hY3Rpb25cIlxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcldpdGhDb250ZXh0ID0gLyoqIEB0eXBlIHt7dmVsb2Npb3VzQ29udGV4dD86IG9iamVjdH19ICovIChlbnN1cmVkRXJyb3IpXG5cbiAgICAgIGVycm9yV2l0aENvbnRleHQudmVsb2Npb3VzQ29udGV4dCA9IHtcbiAgICAgICAgLi4uKGVycm9yV2l0aENvbnRleHQudmVsb2Npb3VzQ29udGV4dCB8fCB7fSksXG4gICAgICAgIGNvbnRyb2xsZXJBY3Rpb246IGVycm9yQ29udGV4dFxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlbnN1cmVkRXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2Utcm91dGUuanNcIikuZGVmYXVsdH0gcm91dGUgLSBSb3V0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcmV0dXJucyB7e3Jlc3RQYXRoOiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIFJFU1QgcGF0aCBtZXRhZGF0YSBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIG1hdGNoUGF0aFdpdGhSb3V0ZXMocm91dGUsIHBhdGgpIHtcbiAgICBjb25zdCBwYXRoV2l0aG91dFNsYXNoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikuc3BsaXQoXCI/XCIpWzBdXG5cbiAgICBmb3IgKGNvbnN0IHN1YlJvdXRlIG9mIHJvdXRlLnJvdXRlcykge1xuICAgICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdWJSb3V0ZS5tYXRjaFdpdGhQYXRoKHtcbiAgICAgICAgcGFyYW1zOiB0aGlzLnBhcmFtcyxcbiAgICAgICAgcGF0aDogcGF0aFdpdGhvdXRTbGFzaCxcbiAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0XG4gICAgICB9KVxuXG4gICAgICBpZiAoIW1hdGNoUmVzdWx0KSBjb250aW51ZVxuXG4gICAgICBjb25zdCB7cmVzdFBhdGh9ID0gbWF0Y2hSZXN1bHRcblxuICAgICAgaWYgKHJlc3RQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoUGF0aFdpdGhSb3V0ZXMoc3ViUm91dGUsIHJlc3RQYXRoKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF0Y2hSZXN1bHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkgc3RyaW5nLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0IHwgbnVsbD59IC0gTWF0Y2hlZCBhY3Rpb24vY29udHJvbGxlciBmcm9tIGhvb2tzLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVJvdXRlUmVzb2x2ZXJIb29rcyhjdXJyZW50UGF0aCkge1xuICAgIGNvbnN0IGhvb2tzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFJvdXRlUmVzb2x2ZXJIb29rcz8uKCkgfHwgW11cblxuICAgIGZvciAoY29uc3QgaG9vayBvZiBob29rcykge1xuICAgICAgY29uc3QgaG9va1Jlc3VsdCA9IGF3YWl0IGhvb2soe1xuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIGN1cnJlbnRQYXRoLFxuICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICAgIHJlc29sdmVyOiB0aGlzLFxuICAgICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZVxuICAgICAgfSlcblxuICAgICAgaWYgKCFob29rUmVzdWx0KSBjb250aW51ZVxuXG4gICAgICBpZiAodHlwZW9mIGhvb2tSZXN1bHQuYWN0aW9uICE9PSBcInN0cmluZ1wiIHx8IGhvb2tSZXN1bHQuYWN0aW9uLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIGFjdGlvbiB0byBiZSBhIHN0cmluZywgZ290OiAke2hvb2tSZXN1bHQuYWN0aW9ufWApXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaG9va1Jlc3VsdC5jb250cm9sbGVyICE9PSBcInN0cmluZ1wiIHx8IGhvb2tSZXN1bHQuY29udHJvbGxlci5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBjb250cm9sbGVyIHRvIGJlIGEgc3RyaW5nLCBnb3Q6ICR7aG9va1Jlc3VsdC5jb250cm9sbGVyfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnBhcmFtcyAmJiB0eXBlb2YgaG9va1Jlc3VsdC5wYXJhbXMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHBhcmFtcyB0byBiZSBhbiBvYmplY3QsIGdvdDogJHtob29rUmVzdWx0LnBhcmFtc31gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5wYXJhbXMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhcmFtcywgaG9va1Jlc3VsdC5wYXJhbXMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBob29rUmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hY3Rpb24gLSBBY3Rpb24uXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gYXJncy5jb250cm9sbGVyQ2xhc3MgLSBDb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2xvZ0FjdGlvblN0YXJ0KHthY3Rpb24sIGNvbnRyb2xsZXJDbGFzc30pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5fZm9ybWF0VGltZXN0YW1wKG5ldyBEYXRlKCkpXG4gICAgY29uc3QgcmVtb3RlQWRkcmVzcyA9IHJlcXVlc3QucmVtb3RlQWRkcmVzcz8uKCkgfHwgcmVxdWVzdC5oZWFkZXIoXCJ4LWZvcndhcmRlZC1mb3JcIikgfHwgXCJ1bmtub3duXCJcbiAgICBjb25zdCBsb2dnZWRQYXJhbXMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodGhpcy5fc2FuaXRpemVQYXJhbXNGb3JMb2dnaW5nKHRoaXMucGFyYW1zKSlcbiAgICBjb25zdCBsb2dNZXRob2QgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCIgPyBcImRlYnVnXCIgOiBcImluZm9cIlxuXG4gICAgZGVsZXRlIGxvZ2dlZFBhcmFtcy5hY3Rpb25cbiAgICBkZWxldGUgbG9nZ2VkUGFyYW1zLmNvbnRyb2xsZXJcblxuICAgIGNvbnN0IGNvbnRyb2xsZXJMb2dnZXIgPSBuZXcgTG9nZ2VyKGNvbnRyb2xsZXJDbGFzcy5uYW1lLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcblxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBgU3RhcnRlZCAke3JlcXVlc3QuaHR0cE1ldGhvZCgpfSBcIiR7cmVxdWVzdC5wYXRoKCl9XCIgZm9yICR7cmVtb3RlQWRkcmVzc30gYXQgJHt0aW1lc3RhbXB9YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gYFByb2Nlc3NpbmcgYnkgJHtjb250cm9sbGVyQ2xhc3MubmFtZX0jJHthY3Rpb259YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gW2AgIFBhcmFtZXRlcnM6YCwgbG9nZ2VkUGFyYW1zXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgLSBEYXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0aW1lc3RhbXAuXG4gICAqL1xuICBfZm9ybWF0VGltZXN0YW1wKGRhdGUpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtIC0gTnVtLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBhZC5cbiAgICAgKi9cbiAgICBjb25zdCBwYWQgPSAobnVtKSA9PiBTdHJpbmcobnVtKS5wYWRTdGFydCgyLCBcIjBcIilcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gICAgY29uc3QgbW9udGggPSBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgICBjb25zdCBkYXkgPSBwYWQoZGF0ZS5nZXREYXRlKCkpXG4gICAgY29uc3QgaG91cnMgPSBwYWQoZGF0ZS5nZXRIb3VycygpKVxuICAgIGNvbnN0IG1pbnV0ZXMgPSBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpXG4gICAgY29uc3Qgc2Vjb25kcyA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICBjb25zdCBvZmZzZXRNaW51dGVzID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpXG4gICAgY29uc3Qgb2Zmc2V0U2lnbiA9IG9mZnNldE1pbnV0ZXMgPiAwID8gXCItXCIgOiBcIitcIlxuICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IE1hdGguYWJzKG9mZnNldE1pbnV0ZXMpXG4gICAgY29uc3Qgb2Zmc2V0SG91cnMgPSBwYWQoTWF0aC5mbG9vcihvZmZzZXRUb3RhbE1pbnV0ZXMgLyA2MCkpXG4gICAgY29uc3Qgb2Zmc2V0UmVtYWluaW5nTWludXRlcyA9IHBhZChvZmZzZXRUb3RhbE1pbnV0ZXMgJSA2MClcblxuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9ICR7b2Zmc2V0U2lnbn0ke29mZnNldEhvdXJzfSR7b2Zmc2V0UmVtYWluaW5nTWludXRlc31gXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7YW55fSAtIFRoZSBzYW5pdGl6ZSBwYXJhbXMgZm9yIGxvZ2dpbmcuXG4gICAqL1xuICBfc2FuaXRpemVQYXJhbXNGb3JMb2dnaW5nKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVXBsb2FkZWRGaWxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzc05hbWU6IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgIGZpbGVuYW1lOiB2YWx1ZS5maWxlbmFtZSgpLFxuICAgICAgICBzaXplOiB2YWx1ZS5zaXplKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyhpdGVtKSlcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodmFsdWVba2V5XSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG4iXX0=
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3Jlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLFlBQVksTUFBTSxzREFBc0QsQ0FBQTtBQUMvRSxPQUFPLFdBQVcsTUFBTSwwQkFBMEIsQ0FBQTtBQUNsRCxPQUFPLGlCQUFpQixNQUFNLGlDQUFpQyxDQUFBO0FBRS9EOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsVUFBVTtJQUNyQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyx1QkFBdUI7SUFDMUMsaUNBQWlDO0lBQ2pDLE1BQU0sQ0FBQTtJQUVOOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDO1FBQzVDLElBQUksQ0FBQyxhQUFhO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQzdELElBQUksQ0FBQyxPQUFPO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQyxRQUFRO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1FBRW5E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QUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDbEUsQ0FBQztRQUVELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLGtDQUFrQztZQUNsQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7WUFFakIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDMUQsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFBO1FBQ2YsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGlybmFtZX0gZnJvbSBcInBhdGhcIlxuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tIFwidXJsXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IFVwbG9hZGVkRmlsZSBmcm9tIFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3VwbG9hZGVkLWZpbGUvdXBsb2FkZWQtZmlsZS5qc1wiXG5pbXBvcnQgZW5zdXJlRXJyb3IgZnJvbSBcIi4uL3V0aWxzL2Vuc3VyZS1lcnJvci5qc1wiXG5pbXBvcnQgdG9JbXBvcnRTcGVjaWZpZXIgZnJvbSBcIi4uL3V0aWxzL3RvLWltcG9ydC1zcGVjaWZpZXIuanNcIlxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25OYW1lIC0gUmF3IGFjdGlvbiBuYW1lIGZyb20gcm91dGUgcGFyYW1zIG9yIHJvdXRlIGhvb2suXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgY29udHJvbGxlciBtZXRob2QgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQWN0aW9uTmFtZShhY3Rpb25OYW1lKSB7XG4gIHJldHVybiBpbmZsZWN0aW9uLmNhbWVsaXplKGFjdGlvbk5hbWUucmVwbGFjZUFsbChcIi1cIiwgXCJfXCIpLnJlcGxhY2VBbGwoXCIvXCIsIFwiX1wiKSwgdHJ1ZSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzUm91dGVzUmVzb2x2ZXIge1xuICAvKiogQHR5cGUge0xvZ2dlciB8IHVuZGVmaW5lZH0gKi9cbiAgbG9nZ2VyXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gYXJncy5yZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVzcG9uc2UgLSBSZXNwb25zZSBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgcmVxdWVzdCwgcmVzcG9uc2V9KSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25maWd1cmF0aW9uIGdpdmVuXCIpXG4gICAgaWYgKCFyZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXF1ZXN0IGdpdmVuXCIpXG4gICAgaWYgKCFyZXNwb25zZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVzcG9uc2UgZ2l2ZW5cIilcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIoXCJSb3V0ZXNSZXNvbHZlclwiLCB7Y29uZmlndXJhdGlvbn0pXG4gICAgY29uc3QgcmVxdWVzdFBhcmFtcyA9IHJlcXVlc3QucGFyYW1zKCkgfHwge31cbiAgICB0aGlzLnBhcmFtcyA9IHsuLi5yZXF1ZXN0UGFyYW1zfVxuICAgIGRlbGV0ZSB0aGlzLnBhcmFtcy5hY3Rpb25cbiAgICBkZWxldGUgdGhpcy5wYXJhbXMuY29udHJvbGxlclxuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2VcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmUoKSB7XG4gICAgbGV0IGNvbnRyb2xsZXJQYXRoXG4gICAgbGV0IGN1cnJlbnRSb3V0ZSA9IHRoaXMuY29uZmlndXJhdGlvbi5yb3V0ZXMucm9vdFJvdXRlXG4gICAgY29uc3QgcmF3UGF0aCA9IHRoaXMucmVxdWVzdC5wYXRoKClcbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHJhd1BhdGguc3BsaXQoXCI/XCIpWzBdXG4gICAgbGV0IHZpZXdQYXRoXG5cbiAgICBjb25zdCByb3V0ZVJlc29sdmVySG9va01hdGNoID0gYXdhaXQgdGhpcy5yZXNvbHZlUm91dGVSZXNvbHZlckhvb2tzKGN1cnJlbnRQYXRoKVxuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaCA/IHVuZGVmaW5lZCA6IHRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKVxuICAgIGNvbnN0IGFjdGlvblBhcmFtID0gdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgY29uc3QgY29udHJvbGxlclBhcmFtID0gdGhpcy5wYXJhbXMuY29udHJvbGxlclxuICAgIGNvbnN0IGFjdGlvblZhbHVlID0gdHlwZW9mIGFjdGlvblBhcmFtID09IFwic3RyaW5nXCIgPyBhY3Rpb25QYXJhbSA6IChBcnJheS5pc0FycmF5KGFjdGlvblBhcmFtKSA/IGFjdGlvblBhcmFtWzBdIDogdW5kZWZpbmVkKVxuICAgIGxldCBhY3Rpb24gPSB0eXBlb2YgYWN0aW9uVmFsdWUgPT0gXCJzdHJpbmdcIiA/IG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uVmFsdWUpIDogdW5kZWZpbmVkXG4gICAgbGV0IGNvbnRyb2xsZXIgPSB0eXBlb2YgY29udHJvbGxlclBhcmFtID09IFwic3RyaW5nXCIgPyBjb250cm9sbGVyUGFyYW0gOiAoQXJyYXkuaXNBcnJheShjb250cm9sbGVyUGFyYW0pID8gY29udHJvbGxlclBhcmFtWzBdIDogdW5kZWZpbmVkKVxuXG4gICAgaWYgKHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gpIHtcbiAgICAgIGNvbnRyb2xsZXIgPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmNvbnRyb2xsZXJcbiAgICAgIGFjdGlvbiA9IG5vcm1hbGl6ZUFjdGlvbk5hbWUocm91dGVSZXNvbHZlckhvb2tNYXRjaC5hY3Rpb24pXG4gICAgICB0aGlzLnBhcmFtcy5jb250cm9sbGVyID0gY29udHJvbGxlclxuICAgICAgdGhpcy5wYXJhbXMuYWN0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaC5hY3Rpb25cbiAgICAgIGNvbnRyb2xsZXJQYXRoID0gYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn0vY29udHJvbGxlci5qc2BcbiAgICAgIHZpZXdQYXRoID0gYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn1gXG4gICAgfSBlbHNlIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKVxuICAgICAgICBjb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKF9fZmlsZW5hbWUpXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZFBhdGggPSBjdXJyZW50UGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikgfHwgXCJfcm9vdFwiXG4gICAgICAgIGNvbnN0IGF0dGVtcHRlZENvbnRyb2xsZXJQYXRoID0gYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7cmVxdWVzdGVkUGF0aH0vY29udHJvbGxlci5qc2BcblxuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci53YXJuKGBObyByb3V0ZSBtYXRjaGVkIGZvciAke3Jhd1BhdGh9LiBUcmllZCBjb250cm9sbGVyIGF0ICR7YXR0ZW1wdGVkQ29udHJvbGxlclBhdGh9YClcblxuICAgICAgICBjb250cm9sbGVyID0gXCJlcnJvcnNcIlxuICAgICAgICBjb250cm9sbGVyUGF0aCA9IFwiLi9idWlsdC1pbi9lcnJvcnMvY29udHJvbGxlci5qc1wiXG4gICAgICAgIGFjdGlvbiA9IFwibm90Rm91bmRcIlxuICAgICAgICB2aWV3UGF0aCA9IGF3YWl0IGZzLnJlYWxwYXRoKGAke19fZGlybmFtZX0vYnVpbHQtaW4vZXJyb3JzYClcbiAgICB9IGVsc2UgaWYgKGFjdGlvbikge1xuICAgICAgaWYgKCFjb250cm9sbGVyKSBjb250cm9sbGVyID0gXCJfcm9vdFwiXG5cbiAgICAgIGNvbnRyb2xsZXJQYXRoID0gYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn0vY29udHJvbGxlci5qc2BcbiAgICAgIHZpZXdQYXRoID0gYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzLyR7Y29udHJvbGxlcn1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWF0Y2hlZCB0aGUgcm91dGUgYnV0IGRpZG4ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBpdDogJHtyYXdQYXRofSAoYWN0aW9uOiAke2FjdGlvbn0sIGNvbnRyb2xsZXI6ICR7Y29udHJvbGxlcn0sIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnBhcmFtcyl9KWApXG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlckNsYXNzSW1wb3J0ID0gYXdhaXQgaW1wb3J0KHRvSW1wb3J0U3BlY2lmaWVyKGNvbnRyb2xsZXJQYXRoKSlcbiAgICBjb25zdCBjb250cm9sbGVyQ2xhc3MgPSBjb250cm9sbGVyQ2xhc3NJbXBvcnQuZGVmYXVsdFxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyQ2xhc3Moe1xuICAgICAgYWN0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZSxcbiAgICAgIHZpZXdQYXRoXG4gICAgfSlcblxuICAgIGlmICghKGFjdGlvbiBpbiBjb250cm9sbGVySW5zdGFuY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYWN0aW9uIG9uIGNvbnRyb2xsZXI6ICR7Y29udHJvbGxlcn0jJHthY3Rpb259YClcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLl9sb2dBY3Rpb25TdGFydCh7YWN0aW9uLCBjb250cm9sbGVyQ2xhc3N9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFiaWxpdHkgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucmVzb2x2ZUFiaWxpdHkoe1xuICAgICAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhBYmlsaXR5KGFiaWxpdHksIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBjb250cm9sbGVySW5zdGFuY2UuX3J1bkJlZm9yZUNhbGxiYWNrcygpXG4gICAgICAgICAgYXdhaXQgY29udHJvbGxlckluc3RhbmNlW2FjdGlvbl0oKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZW5zdXJlZEVycm9yID0gZW5zdXJlRXJyb3IoZXJyb3IpXG4gICAgICBjb25zdCBlcnJvckNvbnRleHQgPSB7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgaHR0cE1ldGhvZDogdGhpcy5yZXF1ZXN0Lmh0dHBNZXRob2QoKSxcbiAgICAgICAgcGF0aDogdGhpcy5yZXF1ZXN0LnBhdGgoKSxcbiAgICAgICAgc3RhZ2U6IFwiY29udHJvbGxlci1hY3Rpb25cIlxuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcldpdGhDb250ZXh0ID0gLyoqIEB0eXBlIHt7dmVsb2Npb3VzQ29udGV4dD86IG9iamVjdH19ICovIChlbnN1cmVkRXJyb3IpXG5cbiAgICAgIGVycm9yV2l0aENvbnRleHQudmVsb2Npb3VzQ29udGV4dCA9IHtcbiAgICAgICAgLi4uKGVycm9yV2l0aENvbnRleHQudmVsb2Npb3VzQ29udGV4dCB8fCB7fSksXG4gICAgICAgIGNvbnRyb2xsZXJBY3Rpb246IGVycm9yQ29udGV4dFxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlbnN1cmVkRXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2Utcm91dGUuanNcIikuZGVmYXVsdH0gcm91dGUgLSBSb3V0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcmV0dXJucyB7e3Jlc3RQYXRoOiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIFJFU1QgcGF0aCBtZXRhZGF0YSBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIG1hdGNoUGF0aFdpdGhSb3V0ZXMocm91dGUsIHBhdGgpIHtcbiAgICBjb25zdCBwYXRoV2l0aG91dFNsYXNoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikuc3BsaXQoXCI/XCIpWzBdXG5cbiAgICBmb3IgKGNvbnN0IHN1YlJvdXRlIG9mIHJvdXRlLnJvdXRlcykge1xuICAgICAgY29uc3QgcGFyYW1zU25hcHNob3QgPSB7Li4udGhpcy5wYXJhbXN9XG4gICAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN1YlJvdXRlLm1hdGNoV2l0aFBhdGgoe1xuICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICBwYXRoOiBwYXRoV2l0aG91dFNsYXNoLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3RcbiAgICAgIH0pXG5cbiAgICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNTbmFwc2hvdFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7cmVzdFBhdGh9ID0gbWF0Y2hSZXN1bHRcblxuICAgICAgaWYgKHJlc3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlY3Vyc2l2ZU1hdGNoID0gdGhpcy5tYXRjaFBhdGhXaXRoUm91dGVzKHN1YlJvdXRlLCByZXN0UGF0aClcblxuICAgICAgICBpZiAocmVjdXJzaXZlTWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlTWF0Y2hcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zU25hcHNob3RcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoUmVzdWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5IHN0cmluZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Sb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGw+fSAtIE1hdGNoZWQgYWN0aW9uL2NvbnRyb2xsZXIgZnJvbSBob29rcy5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgpIHtcbiAgICBjb25zdCBob29rcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRSb3V0ZVJlc29sdmVySG9va3M/LigpIHx8IFtdXG5cbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICAgIGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rKHtcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICBjdXJyZW50UGF0aCxcbiAgICAgICAgcGFyYW1zOiB0aGlzLnBhcmFtcyxcbiAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICByZXNvbHZlcjogdGhpcyxcbiAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgIH0pXG5cbiAgICAgIGlmICghaG9va1Jlc3VsdCkgY29udGludWVcblxuICAgICAgaWYgKHR5cGVvZiBob29rUmVzdWx0LmFjdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBob29rUmVzdWx0LmFjdGlvbi5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBhY3Rpb24gdG8gYmUgYSBzdHJpbmcsIGdvdDogJHtob29rUmVzdWx0LmFjdGlvbn1gKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGhvb2tSZXN1bHQuY29udHJvbGxlciAhPT0gXCJzdHJpbmdcIiB8fCBob29rUmVzdWx0LmNvbnRyb2xsZXIubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgY29udHJvbGxlciB0byBiZSBhIHN0cmluZywgZ290OiAke2hvb2tSZXN1bHQuY29udHJvbGxlcn1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5wYXJhbXMgJiYgdHlwZW9mIGhvb2tSZXN1bHQucGFyYW1zICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBwYXJhbXMgdG8gYmUgYW4gb2JqZWN0LCBnb3Q6ICR7aG9va1Jlc3VsdC5wYXJhbXN9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQucGFyYW1zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXJhbXMsIGhvb2tSZXN1bHQucGFyYW1zKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaG9va1Jlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYWN0aW9uIC0gQWN0aW9uLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29udHJvbGxlckNsYXNzIC0gQ29udHJvbGxlciBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9sb2dBY3Rpb25TdGFydCh7YWN0aW9uLCBjb250cm9sbGVyQ2xhc3N9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdFxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuX2Zvcm1hdFRpbWVzdGFtcChuZXcgRGF0ZSgpKVxuICAgIGNvbnN0IHJlbW90ZUFkZHJlc3MgPSByZXF1ZXN0LnJlbW90ZUFkZHJlc3M/LigpIHx8IHJlcXVlc3QuaGVhZGVyKFwieC1mb3J3YXJkZWQtZm9yXCIpIHx8IFwidW5rbm93blwiXG4gICAgY29uc3QgbG9nZ2VkUGFyYW1zID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHRoaXMuX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh0aGlzLnBhcmFtcykpXG4gICAgY29uc3QgbG9nTWV0aG9kID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50KCkgPT09IFwidGVzdFwiID8gXCJkZWJ1Z1wiIDogXCJpbmZvXCJcblxuICAgIGRlbGV0ZSBsb2dnZWRQYXJhbXMuYWN0aW9uXG4gICAgZGVsZXRlIGxvZ2dlZFBhcmFtcy5jb250cm9sbGVyXG5cbiAgICBjb25zdCBjb250cm9sbGVyTG9nZ2VyID0gbmV3IExvZ2dlcihjb250cm9sbGVyQ2xhc3MubmFtZSwge2NvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbn0pXG5cbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gYFN0YXJ0ZWQgJHtyZXF1ZXN0Lmh0dHBNZXRob2QoKX0gXCIke3JlcXVlc3QucGF0aCgpfVwiIGZvciAke3JlbW90ZUFkZHJlc3N9IGF0ICR7dGltZXN0YW1wfWApXG4gICAgYXdhaXQgY29udHJvbGxlckxvZ2dlcltsb2dNZXRob2RdKCgpID0+IGBQcm9jZXNzaW5nIGJ5ICR7Y29udHJvbGxlckNsYXNzLm5hbWV9IyR7YWN0aW9ufWApXG4gICAgYXdhaXQgY29udHJvbGxlckxvZ2dlcltsb2dNZXRob2RdKCgpID0+IFtgICBQYXJhbWV0ZXJzOmAsIGxvZ2dlZFBhcmFtc10pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gRGF0ZSB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgdGltZXN0YW1wLlxuICAgKi9cbiAgX2Zvcm1hdFRpbWVzdGFtcChkYXRlKSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bSAtIE51bS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBwYWQuXG4gICAgICovXG4gICAgY29uc3QgcGFkID0gKG51bSkgPT4gU3RyaW5nKG51bSkucGFkU3RhcnQoMiwgXCIwXCIpXG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICAgIGNvbnN0IG1vbnRoID0gcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gICAgY29uc3QgZGF5ID0gcGFkKGRhdGUuZ2V0RGF0ZSgpKVxuICAgIGNvbnN0IGhvdXJzID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgICBjb25zdCBtaW51dGVzID0gcGFkKGRhdGUuZ2V0TWludXRlcygpKVxuICAgIGNvbnN0IHNlY29uZHMgPSBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gICAgY29uc3Qgb2Zmc2V0TWludXRlcyA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKVxuICAgIGNvbnN0IG9mZnNldFNpZ24gPSBvZmZzZXRNaW51dGVzID4gMCA/IFwiLVwiIDogXCIrXCJcbiAgICBjb25zdCBvZmZzZXRUb3RhbE1pbnV0ZXMgPSBNYXRoLmFicyhvZmZzZXRNaW51dGVzKVxuICAgIGNvbnN0IG9mZnNldEhvdXJzID0gcGFkKE1hdGguZmxvb3Iob2Zmc2V0VG90YWxNaW51dGVzIC8gNjApKVxuICAgIGNvbnN0IG9mZnNldFJlbWFpbmluZ01pbnV0ZXMgPSBwYWQob2Zmc2V0VG90YWxNaW51dGVzICUgNjApXG5cbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aG91cnN9OiR7bWludXRlc306JHtzZWNvbmRzfSAke29mZnNldFNpZ259JHtvZmZzZXRIb3Vyc30ke29mZnNldFJlbWFpbmluZ01pbnV0ZXN9YFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge2FueX0gLSBUaGUgc2FuaXRpemUgcGFyYW1zIGZvciBsb2dnaW5nLlxuICAgKi9cbiAgX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVwbG9hZGVkRmlsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xhc3NOYW1lOiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBmaWxlbmFtZTogdmFsdWUuZmlsZW5hbWUoKSxcbiAgICAgICAgc2l6ZTogdmFsdWUuc2l6ZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcoaXRlbSkpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0ge31cblxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5fc2FuaXRpemVQYXJhbXNGb3JMb2dnaW5nKHZhbHVlW2tleV0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.217",
6
+ "version": "1.0.219",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [