@cdktn/provider-schema 0.25.0-pre.4 → 0.25.0-pre.6

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.
@@ -81,6 +81,27 @@ describe("readSchema", () => {
81
81
  const result = await (0, provider_schema_1.readModuleSchema)(target);
82
82
  expect(sanitizeJson(result)).toMatchSnapshot();
83
83
  }, 120000);
84
+ it("generates a local module that requires provider configuration aliases", async () => {
85
+ const module = new commons_1.TerraformModuleConstraint({
86
+ name: "local_module",
87
+ fqn: "local_module",
88
+ source: path.resolve(__dirname, "fixtures", "local-module-provider-aliases"),
89
+ });
90
+ const target = new commons_1.ConstructsMakerModuleTarget(module, commons_1.Language.TYPESCRIPT);
91
+ const result = await (0, provider_schema_1.readModuleSchema)(target);
92
+ expect(sanitizeJson(result)).toMatchSnapshot();
93
+ }, 120000);
94
+ it("surfaces the terraform failure when a module cannot be fetched", async () => {
95
+ const module = new commons_1.TerraformModuleConstraint({
96
+ name: "local_module",
97
+ fqn: "local_module",
98
+ source: "./this-module-does-not-exist",
99
+ });
100
+ const target = new commons_1.ConstructsMakerModuleTarget(module, commons_1.Language.TYPESCRIPT);
101
+ // the fetch is run tolerantly so a module declaring configuration_aliases
102
+ // gets a second chance - everything else has to keep failing loudly
103
+ await expect((0, provider_schema_1.readModuleSchema)(target)).rejects.toThrow(/get exited with code/);
104
+ }, 120000);
84
105
  it("generates a local json module", async () => {
85
106
  const module = new commons_1.TerraformModuleConstraint({
86
107
  name: "local_module",
@@ -91,6 +112,26 @@ describe("readSchema", () => {
91
112
  const result = await (0, provider_schema_1.readModuleSchema)(target);
92
113
  expect(sanitizeJson(result)).toMatchSnapshot();
93
114
  }, 120000);
115
+ it("generates a local json module that requires provider configuration aliases", async () => {
116
+ const module = new commons_1.TerraformModuleConstraint({
117
+ name: "local_module",
118
+ fqn: "local_module",
119
+ source: path.resolve(__dirname, "fixtures", "local-json-module-provider-aliases"),
120
+ });
121
+ const target = new commons_1.ConstructsMakerModuleTarget(module, commons_1.Language.TYPESCRIPT);
122
+ const result = await (0, provider_schema_1.readModuleSchema)(target);
123
+ expect(sanitizeJson(result)).toMatchSnapshot();
124
+ }, 120000);
125
+ it("generates a local module that declares provider configuration aliases across .tf and .tf.json files", async () => {
126
+ const module = new commons_1.TerraformModuleConstraint({
127
+ name: "local_module",
128
+ fqn: "local_module",
129
+ source: path.resolve(__dirname, "fixtures", "local-mixed-module-provider-aliases"),
130
+ });
131
+ const target = new commons_1.ConstructsMakerModuleTarget(module, commons_1.Language.TYPESCRIPT);
132
+ const result = await (0, provider_schema_1.readModuleSchema)(target);
133
+ expect(sanitizeJson(result)).toMatchSnapshot();
134
+ }, 120000);
94
135
  });
95
136
  describe("sanitizeProviderSchema", () => {
96
137
  it("sanitizes a provider schema", () => {
@@ -197,4 +238,4 @@ describe("sanitizeProviderSchema", () => {
197
238
  expect(result).toMatchSnapshot();
198
239
  });
199
240
  });
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL3Byb3ZpZGVyLXNjaGVtYS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRW5DLDJDQUE2QjtBQUM3QixrRkFBb0Q7QUFDcEQsNENBT3dCO0FBQ3hCLHdEQUk0QjtBQUU1QixTQUFTLFlBQVksQ0FBQyxLQUFVO0lBQzlCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLGlCQUFpQixDQUFDO0lBQzVDLHlFQUF5RTtJQUN6RSxpQkFBaUI7SUFDakIsSUFBSSxVQUFVLElBQUksS0FBSztRQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxhQUFhLENBQUM7SUFDM0QsSUFBSSxhQUFhLElBQUksS0FBSztRQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztJQUNyRSxPQUFPLElBQUEsK0JBQWUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUMxQixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxxQ0FBMkIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sTUFBTSxHQUFHLElBQUksdUNBQTZCLENBQzlDLFFBQVEsRUFDUixrQkFBUSxDQUFDLFVBQVUsQ0FDcEIsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxvQ0FBa0IsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDakQsQ0FBQyxFQUFFLE1BQU0s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RTt3Q0FDVCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQVE7cUNBQ2xEO2lDQUNGO2dDQUNELFdBQVcsRUFBRSxFQUFFOzZCQUNoQjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLElBQUEsd0NBQXNCLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgc3RhYmxlU3RyaW5naWZ5IGZyb20gXCJzYWZlLXN0YWJsZS1zdHJpbmdpZnlcIjtcbmltcG9ydCB7XG4gIFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQsXG4gIFRlcnJhZm9ybVByb3ZpZGVyQ29uc3RyYWludCxcbiAgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldCxcbiAgTGFuZ3VhZ2UsXG4gIFByb3ZpZGVyU2NoZW1hLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7XG4gIHJlYWRNb2R1bGVTY2hlbWEsXG4gIHJlYWRQcm92aWRlclNjaGVtYSxcbiAgc2FuaXRpemVQcm92aWRlclNjaGVtYSxcbn0gZnJvbSBcIi4uL3Byb3ZpZGVyLXNjaGVtYVwiO1xuXG5mdW5jdGlvbiBzYW5pdGl6ZUpzb24odmFsdWU6IGFueSkge1xuICB2YWx1ZVtcImZvcm1hdF92ZXJzaW9uXCJdID0gXCJTVFVCQkVEIFZFUlNJT05cIjtcbiAgLy8gY2xpX25hbWUvY2xpX3ZlcnNpb24gc3RhbXAgd2hhdGV2ZXIgYmluYXJ5IGZldGNoZWQgdGhlIHNjaGVtYSBhbmQgdmFyeVxuICAvLyBieSBlbnZpcm9ubWVudFxuICBpZiAoXCJjbGlfbmFtZVwiIGluIHZhbHVlKSB2YWx1ZVtcImNsaV9uYW1lXCJdID0gXCJTVFVCQkVEIENMSVwiO1xuICBpZiAoXCJjbGlfdmVyc2lvblwiIGluIHZhbHVlKSB2YWx1ZVtcImNsaV92ZXJzaW9uXCJdID0gXCJTVFVCQkVEIFZFUlNJT05cIjtcbiAgcmV0dXJuIHN0YWJsZVN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMik7XG59XG5cbmRlc2NyaWJlKFwicmVhZFNjaGVtYVwiLCAoKSA9PiB7XG4gIGl0KFwiZ2VuZXJhdGVzIGEgc2luZ2xlIHByb3ZpZGVyIHNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgVGVycmFmb3JtUHJvdmlkZXJDb25zdHJhaW50KFwiaGFzaGljb3JwL251bGxAMy4xLjBcIik7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0KFxuICAgICAgcHJvdmlkZXIsXG4gICAgICBMYW5ndWFnZS5UWVBFU0NSSVBULFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZFByb3ZpZGVyU2NoZW1hKHRhcmdldCk7XG4gICAgZXhwZWN0KHNhbml0aXplSnNvbihyZXN1bHQpKS50b01hdGNoU25hcHNob3QoKTtcbiAgfSwgMTIwMDAwKTtcblxuICBpdChcImdlbmVyYXRlcyBhIHNpbmdsZSBtb2R1bGUgc2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtb2R1bGUgPSBuZXcgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludChcbiAgICAgIFwidGVycmFmb3JtLWF3cy1tb2R1bGVzL2lhbS9hd3MvL21vZHVsZXMvaWFtLWFjY291bnRAMy4xMi4wXCIsXG4gICAgKTtcbiAgICBjb25zdCB0YXJnZXQgPSBuZXcgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KG1vZHVsZSwgTGFuZ3VhZ2UuVFlQRVNDUklQVCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZE1vZHVsZVNjaGVtYSh0YXJnZXQpO1xuICAgIGV4cGVjdChzYW5pdGl6ZUpzb24ocmVzdWx0KSkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0sIDEyMDAwMCk7XG5cbiAgaXQoXCJnZW5lcmF0ZXMgYSBtb3JlIGNvbXBsZXggc2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtb2R1bGUgPSBuZXcgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludChcbiAgICAgIFwidGVycmFmb3JtLWF3cy1tb2R1bGVzL2Vrcy9hd3NANy4wLjFcIixcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQobW9kdWxlLCBMYW5ndWFnZS5UWVBFU0NSSVBUKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkTW9kdWxlU2NoZW1hKHRhcmdldCk7XG4gICAgZXhwZWN0KHNhbml0aXplSnNvbihyZXN1bHQpKS50b01hdGNoU25hcHNob3QoKTtcbiAgfSwgMTIwMDAwKTtcblxuICBpdChcImdlbmVyYXRlcyBhIGxvY2FsIG1vZHVsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlID0gbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoe1xuICAgICAgbmFtZTogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIGZxbjogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIHNvdXJjZTogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgXCJmaXh0dXJlc1wiLCBcImxvY2FsLW1vZHVsZVwiKSxcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSBuZXcgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KG1vZHVsZSwgTGFuZ3VhZ2UuVFlQRVNDUklQVCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZE1vZHVsZVNjaGVtYSh0YXJnZXQpO1xuICAgIGV4cGVjdChzYW5pdGl6ZUpzb24ocmVzdWx0KSkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0sIDEyMDAwMCk7XG5cbiAgaXQoXCJnZW5lcmF0ZXMgYSBsb2NhbCBtb2R1bGUgd2l0aCBpbmxpbmUgY29tbWVudHMgaW4gdHlwZSBjb25zdHJhaW50c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlID0gbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoe1xuICAgICAgbmFtZTogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIGZxbjogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIHNvdXJjZTogcGF0aC5yZXNvbHZlKFxuICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgIFwiZml4dHVyZXNcIixcbiAgICAgICAgXCJsb2NhbC1tb2R1bGUtaW5saW5lLWNvbW1lbnRzXCIsXG4gICAgICApLFxuICAgIH0pO1xuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQobW9kdWxlLCBMYW5ndWFnZS5UWVBFU0NSSVBUKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkTW9kdWxlU2NoZW1hKHRhcmdldCk7XG4gICAgZXhwZWN0KHNhbml0aXplSnNvbihyZXN1bHQpKS50b01hdGNoU25hcHNob3QoKTtcbiAgfSwgMTIwMDAwKTtcblxuICBpdChcImdlbmVyYXRlcyBhIGxvY2FsIGpzb24gbW9kdWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtb2R1bGUgPSBuZXcgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludCh7XG4gICAgICBuYW1lOiBcImxvY2FsX21vZHVsZVwiLFxuICAgICAgZnFuOiBcImxvY2FsX21vZHVsZVwiLFxuICAgICAgc291cmNlOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcImZpeHR1cmVzXCIsIFwibG9jYWwtanNvbi1tb2R1bGVcIiksXG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldChtb2R1bGUsIExhbmd1YWdlLlRZUEVTQ1JJUFQpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRNb2R1bGVTY2hlbWEodGFyZ2V0KTtcbiAgICBleHBlY3Qoc2FuaXRpemVKc29uKHJlc3VsdCkpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICB9LCAxMjAwMDApO1xufSk7XG5cbmRlc2NyaWJlKFwic2FuaXRpemVQcm92aWRlclNjaGVtYVwiLCAoKSA9PiB7XG4gIGl0KFwic2FuaXRpemVzIGEgcHJvdmlkZXIgc2NoZW1hXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFByb3ZpZGVyU2NoZW1hID0ge1xuICAgICAgZm9ybWF0X3ZlcnNpb246IFwiMC4xXCIgYXMgY29uc3QsXG4gICAgICBwcm92aWRlcl92ZXJzaW9uczoge1xuICAgICAgICBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvbnVsbFwiOiBcIjMuMS4wXCIsXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXJfc2NoZW1hczoge1xuICAgICAgICBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvbnVsbFwiOiB7XG4gICAgICAgICAgcHJvdmlkZXI6IHtcbiAgICAgICAgICAgIHZlcnNpb246IDAsXG4gICAgICAgICAgICBibG9jazoge1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29ycmVjdDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogW1wibGlzdFwiLCBcInN0cmluZ1wiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluY29ycmVjdDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogW1wibGlzdFwiLCBcInN0cmluZ1wiLCBcImxpc3RcIiwgXCJzdHJpbmdcIl0gYXMgYW55LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGJsb2NrX3R5cGVzOiB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbW9kZTogXCJzaW5nbGVcIixcbiAgICAgICAgICAgICAgICAgIGJsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbXCJsaXN0XCIsIFwic3RyaW5nXCJdLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbXCJsaXN0XCIsIFwic3RyaW5nXCIsIFwibGlzdFwiLCBcInN0cmluZ1wiXSBhcyBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdHlwZXM6IHt9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc291cmNlX3NjaGVtYXM6IHtcbiAgICAgICAgICAgIG51bGxfcmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgICAgICAgYmxvY2s6IHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICBpZDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFtcImxpc3RcIiwgXCJzdHJpbmdcIl0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFtcImxpc3RcIiwgXCJzdHJpbmdcIiwgXCJsaXN0XCIsIFwic3RyaW5nXCJdIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBibG9ja190eXBlczoge1xuICAgICAgICAgICAgICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19tb2RlOiBcInNpbmdsZVwiLFxuICAgICAgICAgICAgICAgICAgICBibG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogW1wibGlzdFwiLCBcInN0cmluZ1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogW1wibGlzdFwiLCBcInN0cmluZ1wiLCBcImxpc3RcIiwgXCJzdHJpbmdcIl0gYXMgYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3R5cGVzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkYXRhX3NvdXJjZV9zY2hlbWFzOiB7fSxcbiAgICAgICAgICBlcGhlbWVyYWxfcmVzb3VyY2Vfc2NoZW1hczoge1xuICAgICAgICAgICAgbnVsbF9lcGhlbWVyYWw6IHtcbiAgICAgICAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgICAgICAgYmxvY2s6IHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICBjb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFtcImxpc3RcIiwgXCJzdHJpbmdcIl0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFtcImxpc3RcIiwgXCJzdHJpbmdcIiwgXCJsaXN0XCIsIFwic3RyaW5nXCJdIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBibG9ja190eXBlczoge30sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBzYW5pdGl6ZVByb3ZpZGVyU2NoZW1hKHNjaGVtYSk7XG4gICAgZXhwZWN0KHJlc3VsdCkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0pO1xufSk7XG4iXX0=
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL3Byb3ZpZGVyLXNjaGVtYS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRW5DLDJDQUE2QjtBQUM3QixrRkFBb0Q7QUFDcEQsNENBT3dCO0FBQ3hCLHdEQUk0QjtBQUU1QixTQUFTLFlBQVksQ0FBQyxLQUFVO0lBQzlCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLGlCQUFpQixDQUFDO0lBQzVDLHlFQUF5RTtJQUN6RSxpQkFBaUI7SUFDakIsSUFBSSxVQUFVLElBQUksS0FBSztRQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxhQUFhLENBQUM7SUFDM0QsSUFBSSxhQUFhLElBQUksS0FBSztRQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztJQUNyRSxPQUFPLElBQUEsK0JBQWUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTtJQUMxQixFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxxQ0FBMkIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sTUFBTSxHQUFHLElBQUksdUNBQTZCLENBQzlDLFFBQVEsRUFDUixrQkFBUSxDQUFDLFVBQVUsQ0FDcEIsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxvQ0FBa0IsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDakQsQ0FBQyxFQUFFLE1BQU0s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QUNGO1NBQ0YsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLElBQUEsd0NBQXNCLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgc3RhYmxlU3RyaW5naWZ5IGZyb20gXCJzYWZlLXN0YWJsZS1zdHJpbmdpZnlcIjtcbmltcG9ydCB7XG4gIFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQsXG4gIFRlcnJhZm9ybVByb3ZpZGVyQ29uc3RyYWludCxcbiAgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldCxcbiAgTGFuZ3VhZ2UsXG4gIFByb3ZpZGVyU2NoZW1hLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7XG4gIHJlYWRNb2R1bGVTY2hlbWEsXG4gIHJlYWRQcm92aWRlclNjaGVtYSxcbiAgc2FuaXRpemVQcm92aWRlclNjaGVtYSxcbn0gZnJvbSBcIi4uL3Byb3ZpZGVyLXNjaGVtYVwiO1xuXG5mdW5jdGlvbiBzYW5pdGl6ZUpzb24odmFsdWU6IGFueSkge1xuICB2YWx1ZVtcImZvcm1hdF92ZXJzaW9uXCJdID0gXCJTVFVCQkVEIFZFUlNJT05cIjtcbiAgLy8gY2xpX25hbWUvY2xpX3ZlcnNpb24gc3RhbXAgd2hhdGV2ZXIgYmluYXJ5IGZldGNoZWQgdGhlIHNjaGVtYSBhbmQgdmFyeVxuICAvLyBieSBlbnZpcm9ubWVudFxuICBpZiAoXCJjbGlfbmFtZVwiIGluIHZhbHVlKSB2YWx1ZVtcImNsaV9uYW1lXCJdID0gXCJTVFVCQkVEIENMSVwiO1xuICBpZiAoXCJjbGlfdmVyc2lvblwiIGluIHZhbHVlKSB2YWx1ZVtcImNsaV92ZXJzaW9uXCJdID0gXCJTVFVCQkVEIFZFUlNJT05cIjtcbiAgcmV0dXJuIHN0YWJsZVN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMik7XG59XG5cbmRlc2NyaWJlKFwicmVhZFNjaGVtYVwiLCAoKSA9PiB7XG4gIGl0KFwiZ2VuZXJhdGVzIGEgc2luZ2xlIHByb3ZpZGVyIHNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgVGVycmFmb3JtUHJvdmlkZXJDb25zdHJhaW50KFwiaGFzaGljb3JwL251bGxAMy4xLjBcIik7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0KFxuICAgICAgcHJvdmlkZXIsXG4gICAgICBMYW5ndWFnZS5UWVBFU0NSSVBULFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZFByb3ZpZGVyU2NoZW1hKHRhcmdldCk7XG4gICAgZXhwZWN0KHNhbml0aXplSnNvbihyZXN1bHQpKS50b01hdGNoU25hcHNob3QoKTtcbiAgfSwgMTIwMDAwKTtcblxuICBpdChcImdlbmVyYXRlcyBhIHNpbmdsZSBtb2R1bGUgc2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtb2R1bGUgPSBuZXcgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludChcbiAgICAgIFwidGVycmFmb3JtLWF3cy1tb2R1bGVzL2lhbS9hd3MvL21vZHVsZXMvaWFtLWFjY291bnRAMy4xMi4wXCIsXG4gICAgKTtcbiAgICBjb25zdCB0YXJnZXQgPSBuZXcgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KG1vZHVsZSwgTGFuZ3VhZ2UuVFlQRVNDUklQVCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZE1vZHVsZVNjaGVtYSh0YXJnZXQpO1xuICAgIGV4cGVjdChzYW5pdGl6ZUpzb24ocmVzdWx0KSkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0sIDEyMDAwMCk7XG5cbiAgaXQoXCJnZW5lcmF0ZXMgYSBtb3JlIGNvbXBsZXggc2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtb2R1bGUgPSBuZXcgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludChcbiAgICAgIFwidGVycmFmb3JtLWF3cy1tb2R1bGVzL2Vrcy9hd3NANy4wLjFcIixcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQobW9kdWxlLCBMYW5ndWFnZS5UWVBFU0NSSVBUKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkTW9kdWxlU2NoZW1hKHRhcmdldCk7XG4gICAgZXhwZWN0KHNhbml0aXplSnNvbihyZXN1bHQpKS50b01hdGNoU25hcHNob3QoKTtcbiAgfSwgMTIwMDAwKTtcblxuICBpdChcImdlbmVyYXRlcyBhIGxvY2FsIG1vZHVsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlID0gbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoe1xuICAgICAgbmFtZTogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIGZxbjogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIHNvdXJjZTogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgXCJmaXh0dXJlc1wiLCBcImxvY2FsLW1vZHVsZVwiKSxcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSBuZXcgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KG1vZHVsZSwgTGFuZ3VhZ2UuVFlQRVNDUklQVCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZE1vZHVsZVNjaGVtYSh0YXJnZXQpO1xuICAgIGV4cGVjdChzYW5pdGl6ZUpzb24ocmVzdWx0KSkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0sIDEyMDAwMCk7XG5cbiAgaXQoXCJnZW5lcmF0ZXMgYSBsb2NhbCBtb2R1bGUgd2l0aCBpbmxpbmUgY29tbWVudHMgaW4gdHlwZSBjb25zdHJhaW50c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlID0gbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoe1xuICAgICAgbmFtZTogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIGZxbjogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIHNvdXJjZTogcGF0aC5yZXNvbHZlKFxuICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgIFwiZml4dHVyZXNcIixcbiAgICAgICAgXCJsb2NhbC1tb2R1bGUtaW5saW5lLWNvbW1lbnRzXCIsXG4gICAgICApLFxuICAgIH0pO1xuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBDb25zdHJ1Y3RzTWFrZXJNb2R1bGVUYXJnZXQobW9kdWxlLCBMYW5ndWFnZS5UWVBFU0NSSVBUKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkTW9kdWxlU2NoZW1hKHRhcmdldCk7XG4gICAgZXhwZWN0KHNhbml0aXplSnNvbihyZXN1bHQpKS50b01hdGNoU25hcHNob3QoKTtcbiAgfSwgMTIwMDAwKTtcblxuICBpdChcImdlbmVyYXRlcyBhIGxvY2FsIG1vZHVsZSB0aGF0IHJlcXVpcmVzIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb24gYWxpYXNlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlID0gbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoe1xuICAgICAgbmFtZTogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIGZxbjogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIHNvdXJjZTogcGF0aC5yZXNvbHZlKFxuICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgIFwiZml4dHVyZXNcIixcbiAgICAgICAgXCJsb2NhbC1tb2R1bGUtcHJvdmlkZXItYWxpYXNlc1wiLFxuICAgICAgKSxcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSBuZXcgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KG1vZHVsZSwgTGFuZ3VhZ2UuVFlQRVNDUklQVCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZE1vZHVsZVNjaGVtYSh0YXJnZXQpO1xuICAgIGV4cGVjdChzYW5pdGl6ZUpzb24ocmVzdWx0KSkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0sIDEyMDAwMCk7XG5cbiAgaXQoXCJzdXJmYWNlcyB0aGUgdGVycmFmb3JtIGZhaWx1cmUgd2hlbiBhIG1vZHVsZSBjYW5ub3QgYmUgZmV0Y2hlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlID0gbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoe1xuICAgICAgbmFtZTogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIGZxbjogXCJsb2NhbF9tb2R1bGVcIixcbiAgICAgIHNvdXJjZTogXCIuL3RoaXMtbW9kdWxlLWRvZXMtbm90LWV4aXN0XCIsXG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldChtb2R1bGUsIExhbmd1YWdlLlRZUEVTQ1JJUFQpO1xuXG4gICAgLy8gdGhlIGZldGNoIGlzIHJ1biB0b2xlcmFudGx5IHNvIGEgbW9kdWxlIGRlY2xhcmluZyBjb25maWd1cmF0aW9uX2FsaWFzZXNcbiAgICAvLyBnZXRzIGEgc2Vjb25kIGNoYW5jZSAtIGV2ZXJ5dGhpbmcgZWxzZSBoYXMgdG8ga2VlcCBmYWlsaW5nIGxvdWRseVxuICAgIGF3YWl0IGV4cGVjdChyZWFkTW9kdWxlU2NoZW1hKHRhcmdldCkpLnJlamVjdHMudG9UaHJvdyhcbiAgICAgIC9nZXQgZXhpdGVkIHdpdGggY29kZS8sXG4gICAgKTtcbiAgfSwgMTIwMDAwKTtcblxuICBpdChcImdlbmVyYXRlcyBhIGxvY2FsIGpzb24gbW9kdWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtb2R1bGUgPSBuZXcgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludCh7XG4gICAgICBuYW1lOiBcImxvY2FsX21vZHVsZVwiLFxuICAgICAgZnFuOiBcImxvY2FsX21vZHVsZVwiLFxuICAgICAgc291cmNlOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcImZpeHR1cmVzXCIsIFwibG9jYWwtanNvbi1tb2R1bGVcIiksXG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldChtb2R1bGUsIExhbmd1YWdlLlRZUEVTQ1JJUFQpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRNb2R1bGVTY2hlbWEodGFyZ2V0KTtcbiAgICBleHBlY3Qoc2FuaXRpemVKc29uKHJlc3VsdCkpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICB9LCAxMjAwMDApO1xuXG4gIGl0KFwiZ2VuZXJhdGVzIGEgbG9jYWwganNvbiBtb2R1bGUgdGhhdCByZXF1aXJlcyBwcm92aWRlciBjb25maWd1cmF0aW9uIGFsaWFzZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50KHtcbiAgICAgIG5hbWU6IFwibG9jYWxfbW9kdWxlXCIsXG4gICAgICBmcW46IFwibG9jYWxfbW9kdWxlXCIsXG4gICAgICBzb3VyY2U6IHBhdGgucmVzb2x2ZShcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBcImZpeHR1cmVzXCIsXG4gICAgICAgIFwibG9jYWwtanNvbi1tb2R1bGUtcHJvdmlkZXItYWxpYXNlc1wiLFxuICAgICAgKSxcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSBuZXcgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KG1vZHVsZSwgTGFuZ3VhZ2UuVFlQRVNDUklQVCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZE1vZHVsZVNjaGVtYSh0YXJnZXQpO1xuICAgIGV4cGVjdChzYW5pdGl6ZUpzb24ocmVzdWx0KSkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0sIDEyMDAwMCk7XG5cbiAgaXQoXCJnZW5lcmF0ZXMgYSBsb2NhbCBtb2R1bGUgdGhhdCBkZWNsYXJlcyBwcm92aWRlciBjb25maWd1cmF0aW9uIGFsaWFzZXMgYWNyb3NzIC50ZiBhbmQgLnRmLmpzb24gZmlsZXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50KHtcbiAgICAgIG5hbWU6IFwibG9jYWxfbW9kdWxlXCIsXG4gICAgICBmcW46IFwibG9jYWxfbW9kdWxlXCIsXG4gICAgICBzb3VyY2U6IHBhdGgucmVzb2x2ZShcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBcImZpeHR1cmVzXCIsXG4gICAgICAgIFwibG9jYWwtbWl4ZWQtbW9kdWxlLXByb3ZpZGVyLWFsaWFzZXNcIixcbiAgICAgICksXG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldChtb2R1bGUsIExhbmd1YWdlLlRZUEVTQ1JJUFQpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRNb2R1bGVTY2hlbWEodGFyZ2V0KTtcbiAgICBleHBlY3Qoc2FuaXRpemVKc29uKHJlc3VsdCkpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICB9LCAxMjAwMDApO1xufSk7XG5cbmRlc2NyaWJlKFwic2FuaXRpemVQcm92aWRlclNjaGVtYVwiLCAoKSA9PiB7XG4gIGl0KFwic2FuaXRpemVzIGEgcHJvdmlkZXIgc2NoZW1hXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFByb3ZpZGVyU2NoZW1hID0ge1xuICAgICAgZm9ybWF0X3ZlcnNpb246IFwiMC4xXCIgYXMgY29uc3QsXG4gICAgICBwcm92aWRlcl92ZXJzaW9uczoge1xuICAgICAgICBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvbnVsbFwiOiBcIjMuMS4wXCIsXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXJfc2NoZW1hczoge1xuICAgICAgICBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvbnVsbFwiOiB7XG4gICAgICAgICAgcHJvdmlkZXI6IHtcbiAgICAgICAgICAgIHZlcnNpb246IDAsXG4gICAgICAgICAgICBibG9jazoge1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29ycmVjdDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogW1wibGlzdFwiLCBcInN0cmluZ1wiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluY29ycmVjdDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogW1wibGlzdFwiLCBcInN0cmluZ1wiLCBcImxpc3RcIiwgXCJzdHJpbmdcIl0gYXMgYW55LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGJsb2NrX3R5cGVzOiB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbW9kZTogXCJzaW5nbGVcIixcbiAgICAgICAgICAgICAgICAgIGJsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbXCJsaXN0XCIsIFwic3RyaW5nXCJdLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbXCJsaXN0XCIsIFwic3RyaW5nXCIsIFwibGlzdFwiLCBcInN0cmluZ1wiXSBhcyBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tfdHlwZXM6IHt9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc291cmNlX3NjaGVtYXM6IHtcbiAgICAgICAgICAgIG51bGxfcmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgICAgICAgYmxvY2s6IHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICBpZDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFtcImxpc3RcIiwgXCJzdHJpbmdcIl0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFtcImxpc3RcIiwgXCJzdHJpbmdcIiwgXCJsaXN0XCIsIFwic3RyaW5nXCJdIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBibG9ja190eXBlczoge1xuICAgICAgICAgICAgICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19tb2RlOiBcInNpbmdsZVwiLFxuICAgICAgICAgICAgICAgICAgICBibG9jazoge1xuICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogW1wibGlzdFwiLCBcInN0cmluZ1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogW1wibGlzdFwiLCBcInN0cmluZ1wiLCBcImxpc3RcIiwgXCJzdHJpbmdcIl0gYXMgYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3R5cGVzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkYXRhX3NvdXJjZV9zY2hlbWFzOiB7fSxcbiAgICAgICAgICBlcGhlbWVyYWxfcmVzb3VyY2Vfc2NoZW1hczoge1xuICAgICAgICAgICAgbnVsbF9lcGhlbWVyYWw6IHtcbiAgICAgICAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgICAgICAgYmxvY2s6IHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICBjb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFtcImxpc3RcIiwgXCJzdHJpbmdcIl0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFtcImxpc3RcIiwgXCJzdHJpbmdcIiwgXCJsaXN0XCIsIFwic3RyaW5nXCJdIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBibG9ja190eXBlczoge30sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBzYW5pdGl6ZVByb3ZpZGVyU2NoZW1hKHNjaGVtYSk7XG4gICAgZXhwZWN0KHJlc3VsdCkudG9NYXRjaFNuYXBzaG90KCk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -1,11 +1,37 @@
1
1
  "use strict";
2
2
  // Copyright (c) HashiCorp, Inc
3
3
  // SPDX-License-Identifier: MPL-2.0
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
17
+ }) : function(o, v) {
18
+ o["default"] = v;
19
+ });
20
+ var __importStar = (this && this.__importStar) || function (mod) {
21
+ if (mod && mod.__esModule) return mod;
22
+ var result = {};
23
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
24
+ __setModuleDefault(result, mod);
25
+ return result;
26
+ };
4
27
  Object.defineProperty(exports, "__esModule", { value: true });
5
28
  jest.mock("@cdktn/commons", () => ({
6
29
  ...jest.requireActual("@cdktn/commons"),
7
30
  exec: jest.fn(),
8
31
  }));
32
+ const fs = __importStar(require("fs"));
33
+ const os = __importStar(require("os"));
34
+ const path = __importStar(require("path"));
9
35
  const commons_1 = require("@cdktn/commons");
10
36
  const provider_schema_1 = require("../provider-schema");
11
37
  const execMock = commons_1.exec;
@@ -67,4 +93,209 @@ describe("getFetchingCliVersion", () => {
67
93
  expect(execMock).toHaveBeenCalledTimes(1);
68
94
  });
69
95
  });
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLnVuaXQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vcHJvdmlkZXItc2NoZW1hLnVuaXQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQzs7QUFFbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN2QyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUNoQixDQUFDLENBQUMsQ0FBQztBQUVKLDRDQUFzQztBQUN0Qyx3REFHNEI7QUFFNUIsTUFBTSxRQUFRLEdBQUcsY0FBNEIsQ0FBQztBQUU5QyxTQUFTLGNBQWMsQ0FBQyxPQUFPLEdBQUcsaUNBQWlDO0lBQ2pFLE1BQU0sR0FBRyxHQUFRLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDbkQsR0FBRyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsT0FBTyxHQUFHLGlDQUFpQztJQUM3RCxNQUFNLEdBQUcsR0FBUSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDdEMsSUFBSSxlQUFpQyxDQUFDO0lBRXRDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsZUFBZSxHQUFHLElBQUk7YUFDbkIsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7YUFDdkIsa0JBQWtCLENBQUMs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LElBQUEsdUNBQXFCLEdBQUUsQ0FBQztRQUU3QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcblxuamVzdC5tb2NrKFwiQGNka3RuL2NvbW1vbnNcIiwgKCkgPT4gKHtcbiAgLi4uamVzdC5yZXF1aXJlQWN0dWFsKFwiQGNka3RuL2NvbW1vbnNcIiksXG4gIGV4ZWM6IGplc3QuZm4oKSxcbn0pKTtcblxuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uLFxuICB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5LFxufSBmcm9tIFwiLi4vcHJvdmlkZXItc2NoZW1hXCI7XG5cbmNvbnN0IGV4ZWNNb2NrID0gZXhlYyBhcyB1bmtub3duIGFzIGplc3QuTW9jaztcblxuZnVuY3Rpb24gdHJhbnNpZW50RXJyb3IobWVzc2FnZSA9IFwiNTAyIEJhZCBHYXRld2F5IGZyb20gZ2l0aHViLmNvbVwiKSB7XG4gIGNvbnN0IGVycjogYW55ID0gbmV3IEVycm9yKFwibm9uLXplcm8gZXhpdCBjb2RlIDFcIik7XG4gIGVyci5zdGRlcnIgPSBtZXNzYWdlO1xuICByZXR1cm4gZXJyO1xufVxuXG5mdW5jdGlvbiBmYXRhbEVycm9yKG1lc3NhZ2UgPSBcIkVycm9yOiBJbnZhbGlkIHByb3ZpZGVyIHZlcnNpb25cIikge1xuICBjb25zdCBlcnI6IGFueSA9IG5ldyBFcnJvcihcIm5vbi16ZXJvIGV4aXQgY29kZSAxXCIpO1xuICBlcnIuc3RkZXJyID0gbWVzc2FnZTtcbiAgcmV0dXJuIGVycjtcbn1cblxuZGVzY3JpYmUoXCJ0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5XCIsICgpID0+IHtcbiAgbGV0IGNvbnNvbGVFcnJvclNweTogamVzdC5TcHlJbnN0YW5jZTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBleGVjTW9jay5tb2NrUmVzZXQoKTtcbiAgICBjb25zb2xlRXJyb3JTcHkgPSBqZXN0XG4gICAgICAuc3B5T24oY29uc29sZSwgXCJlcnJvclwiKVxuICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB1bmRlZmluZWQpO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGNvbnNvbGVFcnJvclNweS5tb2NrUmVzdG9yZSgpO1xuICB9KTtcblxuICBpdChcInJldHVybnMgaW1tZWRpYXRlbHkgb24gZmlyc3QtYXR0ZW1wdCBzdWNjZXNzXCIsIGFzeW5jICgpID0+IHtcbiAgICBleGVjTW9jay5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoXCJva1wiKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRlcnJhZm9ybUluaXRXaXRoUmV0cnkoeyBjd2Q6IFwiL3RtcC94XCIgfSwgMywgMCk7XG5cbiAgICBleHBlY3QocmVzdWx0KS50b0JlKFwib2tcIik7XG4gICAgZXhwZWN0KGV4ZWNNb2NrKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gIH0pO1xuXG4gIGl0KFwicmV0cmllcyBvbiB0cmFuc2llbnQgc3RkZXJyIGFuZCBldmVudHVhbGx5IHN1Y2NlZWRzXCIsIGFzeW5jICgpID0+IHtcbiAgICBleGVjTW9ja1xuICAgICAgLm1vY2tSZWplY3RlZFZhbHVlT25jZSh0cmFuc2llbnRFcnJvcigpKVxuICAgICAgLm1vY2tSZWplY3RlZFZhbHVlT25jZSh0cmFuc2llbnRFcnJvcihcIkVDT05OUkVTRVRcIikpXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKFwib2tcIik7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBcIi90bXAveFwiIH0sIDMsIDApO1xuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZShcIm9rXCIpO1xuICAgIGV4cGVjdChleGVjTW9jaykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDMpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IHJldHJ5IG9uIG5vbi10cmFuc2llbnQgZXJyb3JzXCIsIGFzeW5jICgpID0+IHtcbiAgICBleGVjTW9jay5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UoZmF0YWxFcnJvcigpKTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIHRlcnJhZm9ybUluaXRXaXRoUmV0cnkoeyBjd2Q6IFwiL3RtcC94XCIgfSwgMywgMCksXG4gICAgKS5yZWplY3RzLnRvTWF0Y2hPYmplY3QoeyBzdGRlcnI6IGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiSW52YWxpZFwiKSB9KTtcblxuICAgIGV4cGVjdChleGVjTW9jaykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICB9KTtcblxuICBpdChcInRocm93cyBhZnRlciBleGhhdXN0aW5nIHJldHJpZXMgb24gcGVyc2lzdGVudCB0cmFuc2llbnQgZXJyb3JzXCIsIGFzeW5jICgpID0+IHtcbiAgICBleGVjTW9jay5tb2NrUmVqZWN0ZWRWYWx1ZSh0cmFuc2llbnRFcnJvcihcIjUwMyBTZXJ2aWNlIFVuYXZhaWxhYmxlXCIpKTtcblxuICAgIGF3YWl0IGV4cGVjdChcbiAgICAgIHRlcnJhZm9ybUluaXRXaXRoUmV0cnkoeyBjd2Q6IFwiL3RtcC94XCIgfSwgMywgMCksXG4gICAgKS5yZWplY3RzLnRvTWF0Y2hPYmplY3QoeyBzdGRlcnI6IGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiNTAzXCIpIH0pO1xuXG4gICAgZXhwZWN0KGV4ZWNNb2NrKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uXCIsICgpID0+IHtcbiAgaXQoXCJleGVjcyBgdGVycmFmb3JtIHZlcnNpb25gIG9uY2UgYW5kIG1lbW9pemVzIHRoZSByZXN1bHRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGV4ZWNNb2NrLm1vY2tSZXNldCgpO1xuICAgIGV4ZWNNb2NrLm1vY2tSZXNvbHZlZFZhbHVlKFwiVGVycmFmb3JtIHYxLjcuNVxcbm9uIGxpbnV4X2FtZDY0XFxuXCIpO1xuXG4gICAgY29uc3QgZmlyc3QgPSBhd2FpdCBnZXRGZXRjaGluZ0NsaVZlcnNpb24oKTtcbiAgICBjb25zdCBzZWNvbmQgPSBhd2FpdCBnZXRGZXRjaGluZ0NsaVZlcnNpb24oKTtcblxuICAgIGV4cGVjdChmaXJzdCkudG9FcXVhbCh7IG5hbWU6IFwidGVycmFmb3JtXCIsIHZlcnNpb246IFwiMS43LjVcIiB9KTtcbiAgICBleHBlY3Qoc2Vjb25kKS50b0JlKGZpcnN0KTtcbiAgICBleHBlY3QoZXhlY01vY2spLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG59KTtcbiJdfQ==
96
+ describe("collectModuleProviderAliases", () => {
97
+ it("returns nothing for a module without required_providers", () => {
98
+ expect((0, provider_schema_1.collectModuleProviderAliases)({ variable: { foo: [{}] } })).toEqual([]);
99
+ });
100
+ it("returns nothing for required providers without configuration aliases", () => {
101
+ const parsed = {
102
+ terraform: [
103
+ { required_providers: [{ aws: { source: "hashicorp/aws" } }] },
104
+ ],
105
+ };
106
+ expect((0, provider_schema_1.collectModuleProviderAliases)(parsed)).toEqual([]);
107
+ });
108
+ it("collects every alias declared across terraform blocks", () => {
109
+ const parsed = {
110
+ terraform: [
111
+ {
112
+ required_providers: [
113
+ {
114
+ aws: {
115
+ source: "hashicorp/aws",
116
+ configuration_aliases: [
117
+ "${aws.global_region}",
118
+ "${aws.secondary}",
119
+ ],
120
+ },
121
+ random: { source: "hashicorp/random" },
122
+ },
123
+ ],
124
+ },
125
+ {
126
+ required_providers: [
127
+ {
128
+ awsx: {
129
+ source: "hashicorp/aws",
130
+ configuration_aliases: ["${awsx.tertiary}"],
131
+ },
132
+ },
133
+ ],
134
+ },
135
+ ],
136
+ };
137
+ expect((0, provider_schema_1.collectModuleProviderAliases)(parsed)).toEqual([
138
+ { localName: "aws", alias: "global_region", source: "hashicorp/aws" },
139
+ { localName: "aws", alias: "secondary", source: "hashicorp/aws" },
140
+ { localName: "awsx", alias: "tertiary", source: "hashicorp/aws" },
141
+ ]);
142
+ });
143
+ it("deduplicates aliases declared in more than one file", () => {
144
+ const declaration = {
145
+ aws: {
146
+ source: "hashicorp/aws",
147
+ configuration_aliases: ["${aws.global_region}"],
148
+ },
149
+ };
150
+ const parsed = {
151
+ terraform: [{ required_providers: [declaration, declaration] }],
152
+ };
153
+ expect((0, provider_schema_1.collectModuleProviderAliases)(parsed)).toEqual([
154
+ { localName: "aws", alias: "global_region", source: "hashicorp/aws" },
155
+ ]);
156
+ });
157
+ it("keeps aliases of providers declared without a source", () => {
158
+ const parsed = {
159
+ terraform: {
160
+ required_providers: {
161
+ aws: { configuration_aliases: ["${aws.other}"] },
162
+ },
163
+ },
164
+ };
165
+ expect((0, provider_schema_1.collectModuleProviderAliases)(parsed)).toEqual([
166
+ { localName: "aws", alias: "other", source: undefined },
167
+ ]);
168
+ });
169
+ it("reads the plain references a .tf.json module declares", () => {
170
+ // hcl2json only wraps HCL expressions in an interpolation; JSON syntax
171
+ // carries the reference as-is, and its blocks come through unwrapped
172
+ const parsed = {
173
+ terraform: {
174
+ required_providers: {
175
+ null: {
176
+ source: "hashicorp/null",
177
+ configuration_aliases: ["null.extra"],
178
+ },
179
+ },
180
+ },
181
+ };
182
+ expect((0, provider_schema_1.collectModuleProviderAliases)(parsed)).toEqual([
183
+ { localName: "null", alias: "extra", source: "hashicorp/null" },
184
+ ]);
185
+ });
186
+ it("reads aliases a module spread across .tf and .tf.json files", () => {
187
+ // hcl2json merges a .tf.json file into the parsed HCL by recursing into
188
+ // the HCL block array, so the JSON half ends up as a named property on
189
+ // that array rather than another entry in it
190
+ const parsed = {
191
+ terraform: [
192
+ { required_providers: [{ aws: { source: "hashicorp/aws" } }] },
193
+ ],
194
+ };
195
+ parsed.terraform.required_providers = {
196
+ null: {
197
+ source: "hashicorp/null",
198
+ configuration_aliases: ["null.extra"],
199
+ },
200
+ };
201
+ expect((0, provider_schema_1.collectModuleProviderAliases)(parsed)).toEqual([
202
+ { localName: "null", alias: "extra", source: "hashicorp/null" },
203
+ ]);
204
+ });
205
+ it("ignores entries that are not provider configuration references", () => {
206
+ const parsed = {
207
+ terraform: {
208
+ required_providers: {
209
+ aws: { configuration_aliases: ["${aws}", "${var.not_an_alias.x}"] },
210
+ },
211
+ },
212
+ };
213
+ expect((0, provider_schema_1.collectModuleProviderAliases)(parsed)).toEqual([]);
214
+ });
215
+ });
216
+ describe("applyModuleProviderAliases", () => {
217
+ const configWithModule = () => ({
218
+ terraform: {},
219
+ module: { my_module: { source: "./mod" } },
220
+ });
221
+ it("declares the aliased providers and passes them to the module", () => {
222
+ const config = (0, provider_schema_1.applyModuleProviderAliases)(configWithModule(), "my_module", [
223
+ { localName: "aws", alias: "global_region", source: "hashicorp/aws" },
224
+ { localName: "aws", alias: "secondary", source: "hashicorp/aws" },
225
+ ]);
226
+ expect(config).toEqual({
227
+ terraform: { required_providers: { aws: { source: "hashicorp/aws" } } },
228
+ provider: { aws: [{ alias: "global_region" }, { alias: "secondary" }] },
229
+ module: {
230
+ my_module: {
231
+ source: "./mod",
232
+ providers: {
233
+ "aws.global_region": "aws.global_region",
234
+ "aws.secondary": "aws.secondary",
235
+ },
236
+ },
237
+ },
238
+ });
239
+ });
240
+ it("omits required_providers for aliases without a declared source", () => {
241
+ const config = (0, provider_schema_1.applyModuleProviderAliases)(configWithModule(), "my_module", [
242
+ { localName: "aws", alias: "other" },
243
+ ]);
244
+ expect(config.terraform.required_providers).toBeUndefined();
245
+ expect(config.provider).toEqual({ aws: [{ alias: "other" }] });
246
+ });
247
+ it("leaves the config untouched when there are no aliases", () => {
248
+ expect((0, provider_schema_1.applyModuleProviderAliases)(configWithModule(), "my_module", [])).toEqual(configWithModule());
249
+ });
250
+ it("leaves the config untouched when the module call is unknown", () => {
251
+ expect((0, provider_schema_1.applyModuleProviderAliases)(configWithModule(), "other_module", [
252
+ { localName: "aws", alias: "global_region" },
253
+ ])).toEqual(configWithModule());
254
+ });
255
+ });
256
+ describe("packageSubdir", () => {
257
+ it.each([
258
+ ["terraform-aws-modules/iam/aws", undefined],
259
+ [
260
+ "terraform-aws-modules/iam/aws//modules/iam-account",
261
+ "modules/iam-account",
262
+ ],
263
+ ["git::https://github.com/org/repo.git//sub?ref=v1.2.3", "sub"],
264
+ ["git::ssh://git@github.com/org/repo.git", undefined],
265
+ ["./local/module", undefined],
266
+ ])("splits %s", (source, expected) => {
267
+ expect((0, provider_schema_1.packageSubdir)(source)).toEqual(expected);
268
+ });
269
+ });
270
+ describe("fetchedModuleDir", () => {
271
+ let workdir;
272
+ beforeEach(() => {
273
+ workdir = fs.mkdtempSync(path.join(os.tmpdir(), "fetched-module-dir-"));
274
+ });
275
+ afterEach(() => {
276
+ fs.rmSync(workdir, { recursive: true, force: true });
277
+ });
278
+ function writeManifest(modules) {
279
+ const dir = path.join(workdir, ".terraform", "modules");
280
+ fs.mkdirSync(dir, { recursive: true });
281
+ fs.writeFileSync(path.join(dir, "modules.json"), JSON.stringify({ Modules: modules }));
282
+ }
283
+ it("prefers the directory recorded in the module manifest", () => {
284
+ writeManifest([
285
+ { Key: "", Dir: "." },
286
+ { Key: "my_module", Dir: ".terraform/modules/my_module/modules/sub" },
287
+ ]);
288
+ expect((0, provider_schema_1.fetchedModuleDir)(workdir, "my_module", "org/name/aws//modules/sub")).toEqual(path.join(workdir, ".terraform", "modules", "my_module", "modules", "sub"));
289
+ });
290
+ it("falls back to the install path when the manifest was not written", () => {
291
+ expect((0, provider_schema_1.fetchedModuleDir)(workdir, "my_module", "org/name/aws//modules/sub")).toEqual(path.join(workdir, ".terraform", "modules", "my_module", "modules", "sub"));
292
+ });
293
+ it("falls back to the install path when the manifest lacks the module", () => {
294
+ writeManifest([{ Key: "", Dir: "." }]);
295
+ expect((0, provider_schema_1.fetchedModuleDir)(workdir, "my_module", "org/name/aws")).toEqual(path.join(workdir, ".terraform", "modules", "my_module"));
296
+ });
297
+ it("reads local modules where they are", () => {
298
+ expect((0, provider_schema_1.fetchedModuleDir)(workdir, "my_module", "../mod", "/abs/path/to/mod")).toEqual("/abs/path/to/mod");
299
+ });
300
+ });
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLnVuaXQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vcHJvdmlkZXItc2NoZW1hLnVuaXQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDakMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDO0lBQ3ZDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0NBQ2hCLENBQUMsQ0FBQyxDQUFDO0FBRUosdUNBQXlCO0FBQ3pCLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0IsNENBQXNDO0FBQ3RDLHdEQVE0QjtBQUU1QixNQUFNLFFBQVEsR0FBRyxjQUE0QixDQUFDO0FBRTlDLFNBQVMsY0FBYyxDQUFDLE9BQU8sR0FBRyxpQ0FBaUM7SUFDakUsTUFBTSxHQUFHLEdBQVEsSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNuRCxHQUFHLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUNyQixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxPQUFPLEdBQUcsaUNBQWlDO0lBQzdELE1BQU0sR0FBRyxHQUFRLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDbkQsR0FBRyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsUUFBUSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtJQUN0QyxJQUFJLGVBQWlDLENBQUM7SUFFdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixlQUFlLEdB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QUFDLGtCQUFrQixDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5cbmplc3QubW9jayhcIkBjZGt0bi9jb21tb25zXCIsICgpID0+ICh7XG4gIC4uLmplc3QucmVxdWlyZUFjdHVhbChcIkBjZGt0bi9jb21tb25zXCIpLFxuICBleGVjOiBqZXN0LmZuKCksXG59KSk7XG5cbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7XG4gIFRlcnJhZm9ybUNvbmZpZyxcbiAgYXBwbHlNb2R1bGVQcm92aWRlckFsaWFzZXMsXG4gIGNvbGxlY3RNb2R1bGVQcm92aWRlckFsaWFzZXMsXG4gIGZldGNoZWRNb2R1bGVEaXIsXG4gIGdldEZldGNoaW5nQ2xpVmVyc2lvbixcbiAgcGFja2FnZVN1YmRpcixcbiAgdGVycmFmb3JtSW5pdFdpdGhSZXRyeSxcbn0gZnJvbSBcIi4uL3Byb3ZpZGVyLXNjaGVtYVwiO1xuXG5jb25zdCBleGVjTW9jayA9IGV4ZWMgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2s7XG5cbmZ1bmN0aW9uIHRyYW5zaWVudEVycm9yKG1lc3NhZ2UgPSBcIjUwMiBCYWQgR2F0ZXdheSBmcm9tIGdpdGh1Yi5jb21cIikge1xuICBjb25zdCBlcnI6IGFueSA9IG5ldyBFcnJvcihcIm5vbi16ZXJvIGV4aXQgY29kZSAxXCIpO1xuICBlcnIuc3RkZXJyID0gbWVzc2FnZTtcbiAgcmV0dXJuIGVycjtcbn1cblxuZnVuY3Rpb24gZmF0YWxFcnJvcihtZXNzYWdlID0gXCJFcnJvcjogSW52YWxpZCBwcm92aWRlciB2ZXJzaW9uXCIpIHtcbiAgY29uc3QgZXJyOiBhbnkgPSBuZXcgRXJyb3IoXCJub24temVybyBleGl0IGNvZGUgMVwiKTtcbiAgZXJyLnN0ZGVyciA9IG1lc3NhZ2U7XG4gIHJldHVybiBlcnI7XG59XG5cbmRlc2NyaWJlKFwidGVycmFmb3JtSW5pdFdpdGhSZXRyeVwiLCAoKSA9PiB7XG4gIGxldCBjb25zb2xlRXJyb3JTcHk6IGplc3QuU3B5SW5zdGFuY2U7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZXhlY01vY2subW9ja1Jlc2V0KCk7XG4gICAgY29uc29sZUVycm9yU3B5ID0gamVzdFxuICAgICAgLnNweU9uKGNvbnNvbGUsIFwiZXJyb3JcIilcbiAgICAgIC5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBjb25zb2xlRXJyb3JTcHkubW9ja1Jlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXR1cm5zIGltbWVkaWF0ZWx5IG9uIGZpcnN0LWF0dGVtcHQgc3VjY2Vzc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgZXhlY01vY2subW9ja1Jlc29sdmVkVmFsdWVPbmNlKFwib2tcIik7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBcIi90bXAveFwiIH0sIDMsIDApO1xuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZShcIm9rXCIpO1xuICAgIGV4cGVjdChleGVjTW9jaykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICB9KTtcblxuICBpdChcInJldHJpZXMgb24gdHJhbnNpZW50IHN0ZGVyciBhbmQgZXZlbnR1YWxseSBzdWNjZWVkc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgZXhlY01vY2tcbiAgICAgIC5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UodHJhbnNpZW50RXJyb3IoKSlcbiAgICAgIC5tb2NrUmVqZWN0ZWRWYWx1ZU9uY2UodHJhbnNpZW50RXJyb3IoXCJFQ09OTlJFU0VUXCIpKVxuICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZShcIm9rXCIpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGVycmFmb3JtSW5pdFdpdGhSZXRyeSh7IGN3ZDogXCIvdG1wL3hcIiB9LCAzLCAwKTtcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQmUoXCJva1wiKTtcbiAgICBleHBlY3QoZXhlY01vY2spLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygzKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2VzIG5vdCByZXRyeSBvbiBub24tdHJhbnNpZW50IGVycm9yc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgZXhlY01vY2subW9ja1JlamVjdGVkVmFsdWVPbmNlKGZhdGFsRXJyb3IoKSk7XG5cbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBcIi90bXAveFwiIH0sIDMsIDApLFxuICAgICkucmVqZWN0cy50b01hdGNoT2JqZWN0KHsgc3RkZXJyOiBleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIkludmFsaWRcIikgfSk7XG5cbiAgICBleHBlY3QoZXhlY01vY2spLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG5cbiAgaXQoXCJ0aHJvd3MgYWZ0ZXIgZXhoYXVzdGluZyByZXRyaWVzIG9uIHBlcnNpc3RlbnQgdHJhbnNpZW50IGVycm9yc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgZXhlY01vY2subW9ja1JlamVjdGVkVmFsdWUodHJhbnNpZW50RXJyb3IoXCI1MDMgU2VydmljZSBVbmF2YWlsYWJsZVwiKSk7XG5cbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBcIi90bXAveFwiIH0sIDMsIDApLFxuICAgICkucmVqZWN0cy50b01hdGNoT2JqZWN0KHsgc3RkZXJyOiBleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIjUwM1wiKSB9KTtcblxuICAgIGV4cGVjdChleGVjTW9jaykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDMpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImdldEZldGNoaW5nQ2xpVmVyc2lvblwiLCAoKSA9PiB7XG4gIGl0KFwiZXhlY3MgYHRlcnJhZm9ybSB2ZXJzaW9uYCBvbmNlIGFuZCBtZW1vaXplcyB0aGUgcmVzdWx0XCIsIGFzeW5jICgpID0+IHtcbiAgICBleGVjTW9jay5tb2NrUmVzZXQoKTtcbiAgICBleGVjTW9jay5tb2NrUmVzb2x2ZWRWYWx1ZShcIlRlcnJhZm9ybSB2MS43LjVcXG5vbiBsaW51eF9hbWQ2NFxcblwiKTtcblxuICAgIGNvbnN0IGZpcnN0ID0gYXdhaXQgZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uKCk7XG4gICAgY29uc3Qgc2Vjb25kID0gYXdhaXQgZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uKCk7XG5cbiAgICBleHBlY3QoZmlyc3QpLnRvRXF1YWwoeyBuYW1lOiBcInRlcnJhZm9ybVwiLCB2ZXJzaW9uOiBcIjEuNy41XCIgfSk7XG4gICAgZXhwZWN0KHNlY29uZCkudG9CZShmaXJzdCk7XG4gICAgZXhwZWN0KGV4ZWNNb2NrKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiY29sbGVjdE1vZHVsZVByb3ZpZGVyQWxpYXNlc1wiLCAoKSA9PiB7XG4gIGl0KFwicmV0dXJucyBub3RoaW5nIGZvciBhIG1vZHVsZSB3aXRob3V0IHJlcXVpcmVkX3Byb3ZpZGVyc1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNvbGxlY3RNb2R1bGVQcm92aWRlckFsaWFzZXMoeyB2YXJpYWJsZTogeyBmb286IFt7fV0gfSB9KSkudG9FcXVhbChcbiAgICAgIFtdLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBub3RoaW5nIGZvciByZXF1aXJlZCBwcm92aWRlcnMgd2l0aG91dCBjb25maWd1cmF0aW9uIGFsaWFzZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHBhcnNlZCA9IHtcbiAgICAgIHRlcnJhZm9ybTogW1xuICAgICAgICB7IHJlcXVpcmVkX3Byb3ZpZGVyczogW3sgYXdzOiB7IHNvdXJjZTogXCJoYXNoaWNvcnAvYXdzXCIgfSB9XSB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgZXhwZWN0KGNvbGxlY3RNb2R1bGVQcm92aWRlckFsaWFzZXMocGFyc2VkKSkudG9FcXVhbChbXSk7XG4gIH0pO1xuXG4gIGl0KFwiY29sbGVjdHMgZXZlcnkgYWxpYXMgZGVjbGFyZWQgYWNyb3NzIHRlcnJhZm9ybSBibG9ja3NcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHBhcnNlZCA9IHtcbiAgICAgIHRlcnJhZm9ybTogW1xuICAgICAgICB7XG4gICAgICAgICAgcmVxdWlyZWRfcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF3czoge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogXCJoYXNoaWNvcnAvYXdzXCIsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbl9hbGlhc2VzOiBbXG4gICAgICAgICAgICAgICAgICBcIiR7YXdzLmdsb2JhbF9yZWdpb259XCIsXG4gICAgICAgICAgICAgICAgICBcIiR7YXdzLnNlY29uZGFyeX1cIixcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByYW5kb206IHsgc291cmNlOiBcImhhc2hpY29ycC9yYW5kb21cIiB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcmVxdWlyZWRfcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF3c3g6IHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IFwiaGFzaGljb3JwL2F3c1wiLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25fYWxpYXNlczogW1wiJHthd3N4LnRlcnRpYXJ5fVwiXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGV4cGVjdChjb2xsZWN0TW9kdWxlUHJvdmlkZXJBbGlhc2VzKHBhcnNlZCkpLnRvRXF1YWwoW1xuICAgICAgeyBsb2NhbE5hbWU6IFwiYXdzXCIsIGFsaWFzOiBcImdsb2JhbF9yZWdpb25cIiwgc291cmNlOiBcImhhc2hpY29ycC9hd3NcIiB9LFxuICAgICAgeyBsb2NhbE5hbWU6IFwiYXdzXCIsIGFsaWFzOiBcInNlY29uZGFyeVwiLCBzb3VyY2U6IFwiaGFzaGljb3JwL2F3c1wiIH0sXG4gICAgICB7IGxvY2FsTmFtZTogXCJhd3N4XCIsIGFsaWFzOiBcInRlcnRpYXJ5XCIsIHNvdXJjZTogXCJoYXNoaWNvcnAvYXdzXCIgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJkZWR1cGxpY2F0ZXMgYWxpYXNlcyBkZWNsYXJlZCBpbiBtb3JlIHRoYW4gb25lIGZpbGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0ge1xuICAgICAgYXdzOiB7XG4gICAgICAgIHNvdXJjZTogXCJoYXNoaWNvcnAvYXdzXCIsXG4gICAgICAgIGNvbmZpZ3VyYXRpb25fYWxpYXNlczogW1wiJHthd3MuZ2xvYmFsX3JlZ2lvbn1cIl0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgcGFyc2VkID0ge1xuICAgICAgdGVycmFmb3JtOiBbeyByZXF1aXJlZF9wcm92aWRlcnM6IFtkZWNsYXJhdGlvbiwgZGVjbGFyYXRpb25dIH1dLFxuICAgIH07XG5cbiAgICBleHBlY3QoY29sbGVjdE1vZHVsZVByb3ZpZGVyQWxpYXNlcyhwYXJzZWQpKS50b0VxdWFsKFtcbiAgICAgIHsgbG9jYWxOYW1lOiBcImF3c1wiLCBhbGlhczogXCJnbG9iYWxfcmVnaW9uXCIsIHNvdXJjZTogXCJoYXNoaWNvcnAvYXdzXCIgfSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyBhbGlhc2VzIG9mIHByb3ZpZGVycyBkZWNsYXJlZCB3aXRob3V0IGEgc291cmNlXCIsICgpID0+IHtcbiAgICBjb25zdCBwYXJzZWQgPSB7XG4gICAgICB0ZXJyYWZvcm06IHtcbiAgICAgICAgcmVxdWlyZWRfcHJvdmlkZXJzOiB7XG4gICAgICAgICAgYXdzOiB7IGNvbmZpZ3VyYXRpb25fYWxpYXNlczogW1wiJHthd3Mub3RoZXJ9XCJdIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBleHBlY3QoY29sbGVjdE1vZHVsZVByb3ZpZGVyQWxpYXNlcyhwYXJzZWQpKS50b0VxdWFsKFtcbiAgICAgIHsgbG9jYWxOYW1lOiBcImF3c1wiLCBhbGlhczogXCJvdGhlclwiLCBzb3VyY2U6IHVuZGVmaW5lZCB9LFxuICAgIF0pO1xuICB9KTtcblxuICBpdChcInJlYWRzIHRoZSBwbGFpbiByZWZlcmVuY2VzIGEgLnRmLmpzb24gbW9kdWxlIGRlY2xhcmVzXCIsICgpID0+IHtcbiAgICAvLyBoY2wyanNvbiBvbmx5IHdyYXBzIEhDTCBleHByZXNzaW9ucyBpbiBhbiBpbnRlcnBvbGF0aW9uOyBKU09OIHN5bnRheFxuICAgIC8vIGNhcnJpZXMgdGhlIHJlZmVyZW5jZSBhcy1pcywgYW5kIGl0cyBibG9ja3MgY29tZSB0aHJvdWdoIHVud3JhcHBlZFxuICAgIGNvbnN0IHBhcnNlZCA9IHtcbiAgICAgIHRlcnJhZm9ybToge1xuICAgICAgICByZXF1aXJlZF9wcm92aWRlcnM6IHtcbiAgICAgICAgICBudWxsOiB7XG4gICAgICAgICAgICBzb3VyY2U6IFwiaGFzaGljb3JwL251bGxcIixcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25fYWxpYXNlczogW1wibnVsbC5leHRyYVwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgZXhwZWN0KGNvbGxlY3RNb2R1bGVQcm92aWRlckFsaWFzZXMocGFyc2VkKSkudG9FcXVhbChbXG4gICAgICB7IGxvY2FsTmFtZTogXCJudWxsXCIsIGFsaWFzOiBcImV4dHJhXCIsIHNvdXJjZTogXCJoYXNoaWNvcnAvbnVsbFwiIH0sXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KFwicmVhZHMgYWxpYXNlcyBhIG1vZHVsZSBzcHJlYWQgYWNyb3NzIC50ZiBhbmQgLnRmLmpzb24gZmlsZXNcIiwgKCkgPT4ge1xuICAgIC8vIGhjbDJqc29uIG1lcmdlcyBhIC50Zi5qc29uIGZpbGUgaW50byB0aGUgcGFyc2VkIEhDTCBieSByZWN1cnNpbmcgaW50b1xuICAgIC8vIHRoZSBIQ0wgYmxvY2sgYXJyYXksIHNvIHRoZSBKU09OIGhhbGYgZW5kcyB1cCBhcyBhIG5hbWVkIHByb3BlcnR5IG9uXG4gICAgLy8gdGhhdCBhcnJheSByYXRoZXIgdGhhbiBhbm90aGVyIGVudHJ5IGluIGl0XG4gICAgY29uc3QgcGFyc2VkOiBhbnkgPSB7XG4gICAgICB0ZXJyYWZvcm06IFtcbiAgICAgICAgeyByZXF1aXJlZF9wcm92aWRlcnM6IFt7IGF3czogeyBzb3VyY2U6IFwiaGFzaGljb3JwL2F3c1wiIH0gfV0gfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBwYXJzZWQudGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyA9IHtcbiAgICAgIG51bGw6IHtcbiAgICAgICAgc291cmNlOiBcImhhc2hpY29ycC9udWxsXCIsXG4gICAgICAgIGNvbmZpZ3VyYXRpb25fYWxpYXNlczogW1wibnVsbC5leHRyYVwiXSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGV4cGVjdChjb2xsZWN0TW9kdWxlUHJvdmlkZXJBbGlhc2VzKHBhcnNlZCkpLnRvRXF1YWwoW1xuICAgICAgeyBsb2NhbE5hbWU6IFwibnVsbFwiLCBhbGlhczogXCJleHRyYVwiLCBzb3VyY2U6IFwiaGFzaGljb3JwL251bGxcIiB9LFxuICAgIF0pO1xuICB9KTtcblxuICBpdChcImlnbm9yZXMgZW50cmllcyB0aGF0IGFyZSBub3QgcHJvdmlkZXIgY29uZmlndXJhdGlvbiByZWZlcmVuY2VzXCIsICgpID0+IHtcbiAgICBjb25zdCBwYXJzZWQgPSB7XG4gICAgICB0ZXJyYWZvcm06IHtcbiAgICAgICAgcmVxdWlyZWRfcHJvdmlkZXJzOiB7XG4gICAgICAgICAgYXdzOiB7IGNvbmZpZ3VyYXRpb25fYWxpYXNlczogW1wiJHthd3N9XCIsIFwiJHt2YXIubm90X2FuX2FsaWFzLnh9XCJdIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBleHBlY3QoY29sbGVjdE1vZHVsZVByb3ZpZGVyQWxpYXNlcyhwYXJzZWQpKS50b0VxdWFsKFtdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJhcHBseU1vZHVsZVByb3ZpZGVyQWxpYXNlc1wiLCAoKSA9PiB7XG4gIGNvbnN0IGNvbmZpZ1dpdGhNb2R1bGUgPSAoKTogVGVycmFmb3JtQ29uZmlnID0+ICh7XG4gICAgdGVycmFmb3JtOiB7fSxcbiAgICBtb2R1bGU6IHsgbXlfbW9kdWxlOiB7IHNvdXJjZTogXCIuL21vZFwiIH0gfSxcbiAgfSk7XG5cbiAgaXQoXCJkZWNsYXJlcyB0aGUgYWxpYXNlZCBwcm92aWRlcnMgYW5kIHBhc3NlcyB0aGVtIHRvIHRoZSBtb2R1bGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGFwcGx5TW9kdWxlUHJvdmlkZXJBbGlhc2VzKGNvbmZpZ1dpdGhNb2R1bGUoKSwgXCJteV9tb2R1bGVcIiwgW1xuICAgICAgeyBsb2NhbE5hbWU6IFwiYXdzXCIsIGFsaWFzOiBcImdsb2JhbF9yZWdpb25cIiwgc291cmNlOiBcImhhc2hpY29ycC9hd3NcIiB9LFxuICAgICAgeyBsb2NhbE5hbWU6IFwiYXdzXCIsIGFsaWFzOiBcInNlY29uZGFyeVwiLCBzb3VyY2U6IFwiaGFzaGljb3JwL2F3c1wiIH0sXG4gICAgXSk7XG5cbiAgICBleHBlY3QoY29uZmlnKS50b0VxdWFsKHtcbiAgICAgIHRlcnJhZm9ybTogeyByZXF1aXJlZF9wcm92aWRlcnM6IHsgYXdzOiB7IHNvdXJjZTogXCJoYXNoaWNvcnAvYXdzXCIgfSB9IH0sXG4gICAgICBwcm92aWRlcjogeyBhd3M6IFt7IGFsaWFzOiBcImdsb2JhbF9yZWdpb25cIiB9LCB7IGFsaWFzOiBcInNlY29uZGFyeVwiIH1dIH0sXG4gICAgICBtb2R1bGU6IHtcbiAgICAgICAgbXlfbW9kdWxlOiB7XG4gICAgICAgICAgc291cmNlOiBcIi4vbW9kXCIsXG4gICAgICAgICAgcHJvdmlkZXJzOiB7XG4gICAgICAgICAgICBcImF3cy5nbG9iYWxfcmVnaW9uXCI6IFwiYXdzLmdsb2JhbF9yZWdpb25cIixcbiAgICAgICAgICAgIFwiYXdzLnNlY29uZGFyeVwiOiBcImF3cy5zZWNvbmRhcnlcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJvbWl0cyByZXF1aXJlZF9wcm92aWRlcnMgZm9yIGFsaWFzZXMgd2l0aG91dCBhIGRlY2xhcmVkIHNvdXJjZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gYXBwbHlNb2R1bGVQcm92aWRlckFsaWFzZXMoY29uZmlnV2l0aE1vZHVsZSgpLCBcIm15X21vZHVsZVwiLCBbXG4gICAgICB7IGxvY2FsTmFtZTogXCJhd3NcIiwgYWxpYXM6IFwib3RoZXJcIiB9LFxuICAgIF0pO1xuXG4gICAgZXhwZWN0KGNvbmZpZy50ZXJyYWZvcm0ucmVxdWlyZWRfcHJvdmlkZXJzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KGNvbmZpZy5wcm92aWRlcikudG9FcXVhbCh7IGF3czogW3sgYWxpYXM6IFwib3RoZXJcIiB9XSB9KTtcbiAgfSk7XG5cbiAgaXQoXCJsZWF2ZXMgdGhlIGNvbmZpZyB1bnRvdWNoZWQgd2hlbiB0aGVyZSBhcmUgbm8gYWxpYXNlc1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KFxuICAgICAgYXBwbHlNb2R1bGVQcm92aWRlckFsaWFzZXMoY29uZmlnV2l0aE1vZHVsZSgpLCBcIm15X21vZHVsZVwiLCBbXSksXG4gICAgKS50b0VxdWFsKGNvbmZpZ1dpdGhNb2R1bGUoKSk7XG4gIH0pO1xuXG4gIGl0KFwibGVhdmVzIHRoZSBjb25maWcgdW50b3VjaGVkIHdoZW4gdGhlIG1vZHVsZSBjYWxsIGlzIHVua25vd25cIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFwcGx5TW9kdWxlUHJvdmlkZXJBbGlhc2VzKGNvbmZpZ1dpdGhNb2R1bGUoKSwgXCJvdGhlcl9tb2R1bGVcIiwgW1xuICAgICAgICB7IGxvY2FsTmFtZTogXCJhd3NcIiwgYWxpYXM6IFwiZ2xvYmFsX3JlZ2lvblwiIH0sXG4gICAgICBdKSxcbiAgICApLnRvRXF1YWwoY29uZmlnV2l0aE1vZHVsZSgpKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJwYWNrYWdlU3ViZGlyXCIsICgpID0+IHtcbiAgaXQuZWFjaChbXG4gICAgW1widGVycmFmb3JtLWF3cy1tb2R1bGVzL2lhbS9hd3NcIiwgdW5kZWZpbmVkXSxcbiAgICBbXG4gICAgICBcInRlcnJhZm9ybS1hd3MtbW9kdWxlcy9pYW0vYXdzLy9tb2R1bGVzL2lhbS1hY2NvdW50XCIsXG4gICAgICBcIm1vZHVsZXMvaWFtLWFjY291bnRcIixcbiAgICBdLFxuICAgIFtcImdpdDo6aHR0cHM6Ly9naXRodWIuY29tL29yZy9yZXBvLmdpdC8vc3ViP3JlZj12MS4yLjNcIiwgXCJzdWJcIl0sXG4gICAgW1wiZ2l0Ojpzc2g6Ly9naXRAZ2l0aHViLmNvbS9vcmcvcmVwby5naXRcIiwgdW5kZWZpbmVkXSxcbiAgICBbXCIuL2xvY2FsL21vZHVsZVwiLCB1bmRlZmluZWRdLFxuICBdKShcInNwbGl0cyAlc1wiLCAoc291cmNlLCBleHBlY3RlZCkgPT4ge1xuICAgIGV4cGVjdChwYWNrYWdlU3ViZGlyKHNvdXJjZSBhcyBzdHJpbmcpKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJmZXRjaGVkTW9kdWxlRGlyXCIsICgpID0+IHtcbiAgbGV0IHdvcmtkaXI6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB3b3JrZGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcImZldGNoZWQtbW9kdWxlLWRpci1cIikpO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGZzLnJtU3luYyh3b3JrZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHdyaXRlTWFuaWZlc3QobW9kdWxlczogeyBLZXk6IHN0cmluZzsgRGlyOiBzdHJpbmcgfVtdKSB7XG4gICAgY29uc3QgZGlyID0gcGF0aC5qb2luKHdvcmtkaXIsIFwiLnRlcnJhZm9ybVwiLCBcIm1vZHVsZXNcIik7XG4gICAgZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIHBhdGguam9pbihkaXIsIFwibW9kdWxlcy5qc29uXCIpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoeyBNb2R1bGVzOiBtb2R1bGVzIH0pLFxuICAgICk7XG4gIH1cblxuICBpdChcInByZWZlcnMgdGhlIGRpcmVjdG9yeSByZWNvcmRlZCBpbiB0aGUgbW9kdWxlIG1hbmlmZXN0XCIsICgpID0+IHtcbiAgICB3cml0ZU1hbmlmZXN0KFtcbiAgICAgIHsgS2V5OiBcIlwiLCBEaXI6IFwiLlwiIH0sXG4gICAgICB7IEtleTogXCJteV9tb2R1bGVcIiwgRGlyOiBcIi50ZXJyYWZvcm0vbW9kdWxlcy9teV9tb2R1bGUvbW9kdWxlcy9zdWJcIiB9LFxuICAgIF0pO1xuXG4gICAgZXhwZWN0KFxuICAgICAgZmV0Y2hlZE1vZHVsZURpcih3b3JrZGlyLCBcIm15X21vZHVsZVwiLCBcIm9yZy9uYW1lL2F3cy8vbW9kdWxlcy9zdWJcIiksXG4gICAgKS50b0VxdWFsKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICB3b3JrZGlyLFxuICAgICAgICBcIi50ZXJyYWZvcm1cIixcbiAgICAgICAgXCJtb2R1bGVzXCIsXG4gICAgICAgIFwibXlfbW9kdWxlXCIsXG4gICAgICAgIFwibW9kdWxlc1wiLFxuICAgICAgICBcInN1YlwiLFxuICAgICAgKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcImZhbGxzIGJhY2sgdG8gdGhlIGluc3RhbGwgcGF0aCB3aGVuIHRoZSBtYW5pZmVzdCB3YXMgbm90IHdyaXR0ZW5cIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGZldGNoZWRNb2R1bGVEaXIod29ya2RpciwgXCJteV9tb2R1bGVcIiwgXCJvcmcvbmFtZS9hd3MvL21vZHVsZXMvc3ViXCIpLFxuICAgICkudG9FcXVhbChcbiAgICAgIHBhdGguam9pbihcbiAgICAgICAgd29ya2RpcixcbiAgICAgICAgXCIudGVycmFmb3JtXCIsXG4gICAgICAgIFwibW9kdWxlc1wiLFxuICAgICAgICBcIm15X21vZHVsZVwiLFxuICAgICAgICBcIm1vZHVsZXNcIixcbiAgICAgICAgXCJzdWJcIixcbiAgICAgICksXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJmYWxscyBiYWNrIHRvIHRoZSBpbnN0YWxsIHBhdGggd2hlbiB0aGUgbWFuaWZlc3QgbGFja3MgdGhlIG1vZHVsZVwiLCAoKSA9PiB7XG4gICAgd3JpdGVNYW5pZmVzdChbeyBLZXk6IFwiXCIsIERpcjogXCIuXCIgfV0pO1xuXG4gICAgZXhwZWN0KGZldGNoZWRNb2R1bGVEaXIod29ya2RpciwgXCJteV9tb2R1bGVcIiwgXCJvcmcvbmFtZS9hd3NcIikpLnRvRXF1YWwoXG4gICAgICBwYXRoLmpvaW4od29ya2RpciwgXCIudGVycmFmb3JtXCIsIFwibW9kdWxlc1wiLCBcIm15X21vZHVsZVwiKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcInJlYWRzIGxvY2FsIG1vZHVsZXMgd2hlcmUgdGhleSBhcmVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGZldGNoZWRNb2R1bGVEaXIod29ya2RpciwgXCJteV9tb2R1bGVcIiwgXCIuLi9tb2RcIiwgXCIvYWJzL3BhdGgvdG8vbW9kXCIpLFxuICAgICkudG9FcXVhbChcIi9hYnMvcGF0aC90by9tb2RcIik7XG4gIH0pO1xufSk7XG4iXX0=
@@ -22,7 +22,7 @@ export declare const parseFQPN: (f: FQPN) => {
22
22
  };
23
23
  export interface TerraformConfig {
24
24
  provider?: {
25
- [name: string]: Record<string, any>;
25
+ [name: string]: Record<string, any> | Record<string, any>[];
26
26
  };
27
27
  terraform: {
28
28
  required_providers?: {
@@ -36,10 +36,25 @@ export interface TerraformConfig {
36
36
  [name: string]: {
37
37
  source: string;
38
38
  version?: string;
39
+ providers?: {
40
+ [localName: string]: string;
41
+ };
39
42
  };
40
43
  };
41
44
  }
42
45
  export declare function readProviderSchema(target: ConstructsMakerProviderTarget): Promise<ProviderSchema>;
43
46
  export declare function sanitizeProviderSchema(schema: ProviderSchema): ProviderSchema;
47
+ /**
48
+ * A provider configuration that a module expects to be handed by its caller,
49
+ * declared as `configuration_aliases` in the module's `required_providers`.
50
+ */
51
+ export interface ModuleProviderAlias {
52
+ /** local name the module knows the provider by, e.g. `aws` */
53
+ localName: string;
54
+ /** alias part of the reference, e.g. `global_region` */
55
+ alias: string;
56
+ /** provider source the module declared for `localName`, if it declared one */
57
+ source?: string;
58
+ }
44
59
  export declare function readModuleSchema(target: ConstructsMakerModuleTarget): Promise<Record<string, ModuleSchema>>;
45
60
  //# sourceMappingURL=provider-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-schema.d.ts","sourceRoot":"","sources":["../src/provider-schema.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,2BAA2B,EAC3B,6BAA6B,EAG7B,YAAY,EACZ,cAAc,EAUf,MAAM,gBAAgB,CAAC;AA2FxB;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAC;AACrE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AACvE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC;AAE/D,eAAO,MAAM,SAAS,MAAO,IAAI;cAMnB,gBAAgB;eACf,iBAAiB;UACtB,YAAY;CAErB,CAAC;AAuIF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC;IACnD,SAAS,EAAE;QACT,kBAAkB,CAAC,EAAE;YACnB,CAAC,IAAI,EAAE,MAAM,GAAG;gBAAE,MAAM,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACvD,CAAC;KACH,CAAC;IACF,MAAM,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACnE;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,6BAA6B,2BAoDtC;AA2DD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAuC7E;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,yCAqCzE"}
1
+ {"version":3,"file":"provider-schema.d.ts","sourceRoot":"","sources":["../src/provider-schema.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,2BAA2B,EAC3B,6BAA6B,EAG7B,YAAY,EACZ,cAAc,EAUf,MAAM,gBAAgB,CAAC;AA2FxB;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,4BAA4B,CAAA;CAAE,CAAC;AACrE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AACvE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC;AAE/D,eAAO,MAAM,SAAS,MAAO,IAAI;cAMnB,gBAAgB;eACf,iBAAiB;UACtB,YAAY;CAErB,CAAC;AAuIF,MAAM,WAAW,eAAe;IAG9B,QAAQ,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAA;KAAE,CAAC;IAC3E,SAAS,EAAE;QACT,kBAAkB,CAAC,EAAE;YACnB,CAAC,IAAI,EAAE,MAAM,GAAG;gBAAE,MAAM,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACvD,CAAC;KACH,CAAC;IACF,MAAM,CAAC,EAAE;QACP,CAAC,IAAI,EAAE,MAAM,GAAG;YACd,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,SAAS,CAAC,EAAE;gBAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;aAAE,CAAC;SAC7C,CAAC;KACH,CAAC;CACH;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,6BAA6B,2BAoDtC;AA2DD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAuC7E;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAwND,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,yCAoEzE"}
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.readModuleSchema = exports.sanitizeProviderSchema = exports.warnIfSchemaEmissionGaps = exports.readProviderSchema = exports.parseFQPN = exports.terraformInitWithRetry = exports.getFetchingCliVersion = void 0;
26
+ exports.readModuleSchema = exports.fetchedModuleDir = exports.packageSubdir = exports.applyModuleProviderAliases = exports.collectModuleProviderAliases = exports.sanitizeProviderSchema = exports.warnIfSchemaEmissionGaps = exports.readProviderSchema = exports.parseFQPN = exports.terraformInitWithRetry = exports.getFetchingCliVersion = void 0;
27
27
  // Copyright (c) HashiCorp, Inc
28
28
  // SPDX-License-Identifier: MPL-2.0
29
29
  const fs = __importStar(require("fs-extra"));
@@ -328,6 +328,166 @@ function sanitizeProviderSchema(schema) {
328
328
  return schema;
329
329
  }
330
330
  exports.sanitizeProviderSchema = sanitizeProviderSchema;
331
+ const CONFIGURATION_ALIAS = /^([\w-]+)\.([\w-]+)$/;
332
+ // hcl2json hands HCL expressions back as interpolations, so a
333
+ // `configuration_aliases = [aws.global_region]` entry arrives as the string
334
+ // "${aws.global_region}". A .tf.json module writes the same reference as a
335
+ // plain string, which hcl2json passes through untouched.
336
+ const unwrapInterpolation = (value) => value.startsWith("${") && value.endsWith("}") ? value.slice(2, -1) : value;
337
+ const toArray = (item) => {
338
+ if (item === undefined || item === null)
339
+ return [];
340
+ return Array.isArray(item) ? item : [item];
341
+ };
342
+ /**
343
+ * Every occurrence of a block that hcl2json produced under one key.
344
+ *
345
+ * HCL blocks come back as an array with an entry per occurrence, a .tf.json
346
+ * block as a plain object. A module mixing both syntaxes gets a third shape:
347
+ * hcl2json merges the JSON file into the parsed HCL, and its deepMerge
348
+ * recurses into the HCL array instead of appending to it, leaving the JSON
349
+ * contribution hanging off the array as named properties. Those properties
350
+ * are an occurrence of their own - and one that neither iterating the array
351
+ * nor JSON.stringify would ever show.
352
+ */
353
+ const blockOccurrences = (block) => {
354
+ if (block === undefined || block === null)
355
+ return [];
356
+ if (!Array.isArray(block))
357
+ return [block];
358
+ const merged = Object.fromEntries(Object.entries(block).filter(([key]) => !/^\d+$/.test(key)));
359
+ return Object.keys(merged).length > 0 ? [...block, merged] : [...block];
360
+ };
361
+ /**
362
+ * Collects the provider configurations a module requires its caller to pass
363
+ * in, from the hcl2json representation of the module's directory.
364
+ *
365
+ * A module may declare `required_providers` in more than one `terraform`
366
+ * block, and may spread them across .tf and .tf.json files; every occurrence
367
+ * hcl2json reports is considered (see {@link blockOccurrences}).
368
+ *
369
+ * @internal exposed for testing
370
+ */
371
+ function collectModuleProviderAliases(parsedModule) {
372
+ const aliases = [];
373
+ const seen = new Set();
374
+ for (const terraformBlock of blockOccurrences(parsedModule === null || parsedModule === void 0 ? void 0 : parsedModule.terraform)) {
375
+ for (const requiredProviders of blockOccurrences(terraformBlock === null || terraformBlock === void 0 ? void 0 : terraformBlock.required_providers)) {
376
+ for (const declaration of Object.values(requiredProviders || {})) {
377
+ const provider = unwrapIfArray(declaration);
378
+ for (const entry of toArray(provider === null || provider === void 0 ? void 0 : provider.configuration_aliases)) {
379
+ const match = CONFIGURATION_ALIAS.exec(unwrapInterpolation(String(entry)));
380
+ if (!match)
381
+ continue;
382
+ const [, localName, alias] = match;
383
+ const key = `${localName}.${alias}`;
384
+ if (seen.has(key))
385
+ continue;
386
+ seen.add(key);
387
+ aliases.push({ localName, alias, source: provider === null || provider === void 0 ? void 0 : provider.source });
388
+ }
389
+ }
390
+ }
391
+ }
392
+ return aliases;
393
+ }
394
+ exports.collectModuleProviderAliases = collectModuleProviderAliases;
395
+ /**
396
+ * Declares the provider configurations that `aliases` names on the synthetic
397
+ * root config and passes them into the module call, which is what Terraform
398
+ * demands of anyone calling a module with `configuration_aliases`.
399
+ *
400
+ * The alias blocks stay empty: `terraform get` only builds the configuration
401
+ * tree, it never configures or installs a provider. Sources are mirrored from
402
+ * the module's own `required_providers` so a module referring to, say,
403
+ * hashicorp/aws under a non-default local name still resolves to the same
404
+ * provider in the root.
405
+ *
406
+ * @internal exposed for testing
407
+ */
408
+ function applyModuleProviderAliases(config, moduleKey, aliases) {
409
+ var _a;
410
+ const moduleCall = (_a = config.module) === null || _a === void 0 ? void 0 : _a[moduleKey];
411
+ if (!moduleCall || aliases.length === 0)
412
+ return config;
413
+ for (const { localName, alias, source } of aliases) {
414
+ if (source) {
415
+ config.terraform.required_providers = {
416
+ ...config.terraform.required_providers,
417
+ [localName]: { source },
418
+ };
419
+ }
420
+ config.provider = config.provider || {};
421
+ const blocks = toArray(config.provider[localName]);
422
+ if (!blocks.some((block) => block.alias === alias)) {
423
+ blocks.push({ alias });
424
+ }
425
+ config.provider[localName] = blocks;
426
+ moduleCall.providers = {
427
+ ...moduleCall.providers,
428
+ [`${localName}.${alias}`]: `${localName}.${alias}`,
429
+ };
430
+ }
431
+ return config;
432
+ }
433
+ exports.applyModuleProviderAliases = applyModuleProviderAliases;
434
+ /**
435
+ * The `//subdir` portion of a module source, if it has one, mirroring how
436
+ * Terraform unpacks a package into `.terraform/modules/<key>/<subdir>`.
437
+ *
438
+ * @internal exposed for testing
439
+ */
440
+ function packageSubdir(source) {
441
+ const [withoutQuery] = source.split("?");
442
+ const withoutGetterPrefix = withoutQuery.replace(/^[A-Za-z0-9]+::/, "");
443
+ const withoutScheme = withoutGetterPrefix.replace(/^[A-Za-z][A-Za-z0-9+.-]*:\/\/+/, "");
444
+ const [, ...rest] = withoutScheme.split("//");
445
+ const subdir = rest.join("//").replace(/^\/+|\/+$/g, "");
446
+ return subdir || undefined;
447
+ }
448
+ exports.packageSubdir = packageSubdir;
449
+ /**
450
+ * Where the module Terraform just fetched ended up on disk.
451
+ *
452
+ * The manifest is the authority, but a `terraform get` that installed the
453
+ * module and then failed to validate the configuration around it leaves no
454
+ * manifest behind - so fall back to the locations Terraform installs into:
455
+ * local modules are read where they are, remote packages are unpacked into
456
+ * `.terraform/modules/<key>`.
457
+ *
458
+ * @internal exposed for testing
459
+ */
460
+ function fetchedModuleDir(workingDirectory, moduleKey, source, localSourceAbsolutePath) {
461
+ const manifestPath = path.join(workingDirectory, ".terraform", "modules", "modules.json");
462
+ if (fs.existsSync(manifestPath)) {
463
+ const moduleIndex = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
464
+ const record = moduleIndex.Modules.find((mod) => mod.Key === moduleKey);
465
+ if (record) {
466
+ return path.resolve(workingDirectory, record.Dir);
467
+ }
468
+ }
469
+ if (localSourceAbsolutePath) {
470
+ return localSourceAbsolutePath;
471
+ }
472
+ return path.join(workingDirectory, ".terraform", "modules", moduleKey, packageSubdir(source) || "");
473
+ }
474
+ exports.fetchedModuleDir = fetchedModuleDir;
475
+ /**
476
+ * Runs `terraform get` and hands the failure back instead of throwing it.
477
+ *
478
+ * Its diagnostics are not final (see {@link readModuleSchema}), so they go to
479
+ * the debug log rather than the terminal; the returned error still carries
480
+ * them on its `stderr` for callers that end up rethrowing it.
481
+ */
482
+ async function tryTerraformGet(outdir) {
483
+ try {
484
+ await (0, commons_1.exec)(terraformBinaryName, ["get"], { cwd: outdir, logStderrAsDebug: true }, undefined, undefined, false);
485
+ return undefined;
486
+ }
487
+ catch (error) {
488
+ return error;
489
+ }
490
+ }
331
491
  async function readModuleSchema(target) {
332
492
  let moduleSchema = {};
333
493
  await (0, commons_1.withTempDir)("fetchSchema", async () => {
@@ -350,7 +510,31 @@ async function readModuleSchema(target) {
350
510
  const outdir = process.cwd();
351
511
  const filePath = path.join(outdir, "main.tf.json");
352
512
  await fs.writeFile(filePath, JSON.stringify(config));
353
- await (0, commons_1.exec)(terraformBinaryName, ["get"], { cwd: outdir });
513
+ // `terraform get` is both our downloader and a full validation of the
514
+ // synthetic root config wrapped around the module. A module declaring
515
+ // `configuration_aliases` cannot validate until the root passes those
516
+ // configurations in, and their names are only knowable once the module is
517
+ // on disk - so this first run is a fetch we defer judgement on. Terraform
518
+ // installs the module either way; since 1.15 it just stops short of
519
+ // writing the module manifest when validation fails (terraform#38217
520
+ // dropped the error-to-warning downgrade that `terraform get` used to
521
+ // apply), which is what the second run below restores.
522
+ const fetchError = await tryTerraformGet(outdir);
523
+ const moduleDir = fetchedModuleDir(outdir, target.moduleKey, source, localSource);
524
+ const aliases = fs.existsSync(moduleDir)
525
+ ? collectModuleProviderAliases(await (0, hcl2json_1.convertFiles)(moduleDir))
526
+ : [];
527
+ if (aliases.length > 0) {
528
+ applyModuleProviderAliases(config, target.moduleKey, aliases);
529
+ await fs.writeFile(filePath, JSON.stringify(config));
530
+ await (0, commons_1.exec)(terraformBinaryName, ["get"], { cwd: outdir });
531
+ }
532
+ else if (fetchError) {
533
+ // nothing here was salvageable after all, so report the diagnostics that
534
+ // were held back while the fetch still had a second chance
535
+ commons_1.logger.error(fetchError.stderr || String(fetchError));
536
+ throw fetchError;
537
+ }
354
538
  if (config.module) {
355
539
  moduleSchema = await harvestModuleSchema(outdir, Object.keys(config.module));
356
540
  }
@@ -358,4 +542,4 @@ async function readModuleSchema(target) {
358
542
  return moduleSchema;
359
543
  }
360
544
  exports.readModuleSchema = readModuleSchema;
361
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3ZpZGVyLXNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUU3Qiw4Q0FBK0M7QUFDL0MsNENBbUJ3QjtBQUN4QixxREFJMEI7QUFFMUIsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFdBQVcsQ0FBQztBQUU3RSxJQUFJLHlCQUFtRSxDQUFDO0FBRXhFOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLHFCQUFxQjtJQUNuQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUMvQix5QkFBeUIsR0FBRyxJQUFBLGNBQUksRUFBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFO1NBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsa0NBQXdCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyx5QkFBeUIsQ0FBQztBQUNuQyxDQUFDO0FBUEQsc0RBT0M7QUFFRCxtRUFBbUU7QUFDbkUscUVBQXFFO0FBQ3JFLHNFQUFzRTtBQUN0RSxNQUFNLDZCQUE2QixHQUFHO0lBQ3BDLGFBQWE7SUFDYixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUI7Q0FDbEIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0ksS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxPQUF3QixFQUN4QixXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLGlCQUFpQixHQUFHLENBQUM7O0lBRXJCLEtBQUssSUFBSSxP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LENBQUM7SUFFSCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBckNELDRDQXFDQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgY29udmVydEZpbGVzIH0gZnJvbSBcIkBjZGt0bi9oY2wyanNvblwiO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVUeXBlLFxuICBCbG9jayxcbiAgQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0LFxuICBDb25zdHJ1Y3RzTWFrZXJQcm92aWRlclRhcmdldCxcbiAgSW5wdXQsXG4gIE1vZHVsZUluZGV4LFxuICBNb2R1bGVTY2hlbWEsXG4gIFByb3ZpZGVyU2NoZW1hLFxuICBUZXJyYWZvcm1DbGlWZXJzaW9uLFxuICBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50LFxuICBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbiAgVmVyc2lvblNjaGVtYSxcbiAgZXhlYyxcbiAgaXNOZXN0ZWRUeXBlQXR0cmlidXRlLFxuICBsb2dnZXIsXG4gIHBhcnNlVGVycmFmb3JtQ2xpVmVyc2lvbixcbiAgd2l0aFRlbXBEaXIsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHtcbiAgU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFMsXG4gIGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyxcbiAgc3VnZ2VzdGVkRW1pdHRpbmdDbGlWZXJzaW9ucyxcbn0gZnJvbSBcIi4vZW1pc3Npb24tY2hlY2tcIjtcblxuY29uc3QgdGVycmFmb3JtQmluYXJ5TmFtZSA9IHByb2Nlc3MuZW52LlRFUlJBRk9STV9CSU5BUllfTkFNRSB8fCBcInRlcnJhZm9ybVwiO1xuXG5sZXQgZmV0Y2hpbmdDbGlWZXJzaW9uUHJvbWlzZTogUHJvbWlzZTxUZXJyYWZvcm1DbGlWZXJzaW9uPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBmZXRjaGluZyBDTEkgKGB0ZXJyYWZvcm1gL2B0b2Z1YCBiaW5hcnlcbiAqIHJlc29sdmVkIHZpYSBgVEVSUkFGT1JNX0JJTkFSWV9OQU1FYCkgb25jZSBwZXIgcHJvY2VzcywgbWVtb2l6ZWQuXG4gKlxuICogVXNlZCBib3RoIHRvIHN0YW1wIGZldGNoZWQgcHJvdmlkZXIgc2NoZW1hcyAoYGNsaV9uYW1lYC9gY2xpX3ZlcnNpb25gKVxuICogYW5kIGFzIHRoZSBjYWNoZSBrZXkgc3VmZml4IGluIHJlYWQudHMsIHNpbmNlIHNjaGVtYSBlbWlzc2lvbiBpcyBmaXhlZFxuICogcGVyIENMSSBtaW5vciB2ZXJzaW9uLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nIGxpa2UgdGVycmFmb3JtSW5pdFdpdGhSZXRyeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uKCk6IFByb21pc2U8VGVycmFmb3JtQ2xpVmVyc2lvbj4ge1xuICBpZiAoIWZldGNoaW5nQ2xpVmVyc2lvblByb21pc2UpIHtcbiAgICBmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlID0gZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJ2ZXJzaW9uXCJdLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSkudGhlbihwYXJzZVRlcnJhZm9ybUNsaVZlcnNpb24pO1xuICB9XG4gIHJldHVybiBmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlO1xufVxuXG4vLyBQcm92aWRlciBiaW5hcmllcyBhcmUgZG93bmxvYWRlZCBmcm9tIEdpdEh1YiByZWxlYXNlIENETnMgZHVyaW5nXG4vLyBgdGVycmFmb3JtIGluaXRgLCB3aGljaCBpbnRlcm1pdHRlbnRseSByZXR1cm5zIDV4eC4gUmV0cnkgb24gdGhvc2Vcbi8vIHNpZ25hdHVyZXMgb25seSDigJQgcmVhbCBjb25maWcvc2NoZW1hIGVycm9ycyBzaG91bGQgc3RpbGwgZmFpbCBmYXN0LlxuY29uc3QgVFJBTlNJRU5UX0lOSVRfRVJST1JfUEFUVEVSTlMgPSBbXG4gIC9cXGI1MFsyMzRdXFxiLyxcbiAgL0JhZCBHYXRld2F5L2ksXG4gIC9TZXJ2aWNlIFVuYXZhaWxhYmxlL2ksXG4gIC9HYXRld2F5IFRpbWVvdXQvaSxcbiAgL0VDT05OUkVTRVQvaSxcbiAgL0VUSU1FRE9VVC9pLFxuICAvRUFJX0FHQUlOL2ksXG4gIC91bmV4cGVjdGVkIEVPRi9pLFxuXTtcblxuLyoqXG4gKiBSdW5zIGB0ZXJyYWZvcm0gaW5pdGAgYW5kIHJldHJpZXMgb24gdHJhbnNpZW50IEhUVFAvbmV0d29yayBmYWlsdXJlcy5cbiAqXG4gKiBQcm92aWRlciBiaW5hcmllcyBhcmUgcHVsbGVkIGZyb20gR2l0SHViJ3MgcmVsZWFzZSBDRE4sIHdoaWNoXG4gKiBpbnRlcm1pdHRlbnRseSByZXR1cm5zIDV4eC4gVGhlIHJldHJ5IG9ubHkgZmlyZXMgd2hlbiBzdGRlcnIgbWF0Y2hlcyBhXG4gKiBrbm93biB0cmFuc2llbnQgcGF0dGVybiDigJQgcmVhbCBlcnJvcnMgKGJhZCB2ZXJzaW9uLCBzY2hlbWEgcGFyc2UsIGV0Yy4pXG4gKiBzdGlsbCBmYWlsIG9uIHRoZSBmaXJzdCBhdHRlbXB0LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gc3Bhd24gb3B0aW9ucyBmb3J3YXJkZWQgdG8gYGV4ZWNgIChgY3dkYCBpcyByZXF1aXJlZCBzb1xuICogICBgdGVycmFmb3JtIGluaXRgIHJ1bnMgaW5zaWRlIHRoZSB0ZW1wIGRpciBob2xkaW5nIGBtYWluLnRmLmpzb25gKVxuICogQHBhcmFtIG1heEF0dGVtcHRzIC0gdG90YWwgYXR0ZW1wdHMgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGNhbGw7IHRoZSBudW1iZXJcbiAqICAgb2YgcmV0cmllcyBpcyBgbWF4QXR0ZW1wdHMgLSAxYC4gRGVmYXVsdHMgdG8gNSAoMSBpbml0aWFsICsgNCByZXRyaWVzKVxuICogQHBhcmFtIGJhc2VEZWxheU1zIC0gZGVsYXkgYmVmb3JlIHRoZSBmaXJzdCByZXRyeS4gVGVzdHMgcGFzcyBgMGAgdG8gc2tpcFxuICogICB3YWl0cy4gRGVmYXVsdHMgdG8gNTAwMG1zXG4gKiBAcGFyYW0gYmFja29mZk11bHRpcGxpZXIgLSBmYWN0b3IgYXBwbGllZCB0byB0aGUgZGVsYXkgb24gZWFjaCBzdWJzZXF1ZW50XG4gKiAgIHJldHJ5IChzbyByZXRyaWVzIHdhaXQgYGJhc2VEZWxheU1zICogbXVsdGlwbGllcl4oYXR0ZW1wdC0xKWApLiBEZWZhdWx0c1xuICogICB0byAyICgxcyDihpIgMnMg4oaSIDRzIOKApilcbiAqIEByZXR1cm5zIHN0ZG91dCBmcm9tIHRoZSBzdWNjZXNzZnVsIGB0ZXJyYWZvcm0gaW5pdGAgaW52b2NhdGlvblxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlcnJhZm9ybUluaXRXaXRoUmV0cnkoXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmcgfSxcbiAgbWF4QXR0ZW1wdHMgPSA1LFxuICBiYXNlRGVsYXlNcyA9IDUwMDAsXG4gIGJhY2tvZmZNdWx0aXBsaWVyID0gMixcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1wiaW5pdFwiXSwgb3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3Qgc3RkZXJyOiBzdHJpbmcgPSBlcnJvcj8uc3RkZXJyID8/IFwiXCI7XG4gICAgICBjb25zdCB0cmFuc2llbnQgPSBUUkFOU0lFTlRfSU5JVF9FUlJPUl9QQVRURVJOUy5zb21lKChwKSA9PlxuICAgICAgICBwLnRlc3Qoc3RkZXJyKSxcbiAgICAgICk7XG4gICAgICBpZiAoIXRyYW5zaWVudCB8fCBhdHRlbXB0ID09PSBtYXhBdHRlbXB0cykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlbGF5TXMgPSBiYXNlRGVsYXlNcyAqIGJhY2tvZmZNdWx0aXBsaWVyICoqIChhdHRlbXB0IC0gMSk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYHRlcnJhZm9ybSBpbml0IGZhaWxlZCB3aXRoIGEgdHJhbnNpZW50IGVycm9yLCByZXRyeWluZyBpbiAke2RlbGF5TXN9bXMgKGF0dGVtcHQgJHthdHRlbXB0fS8ke21heEF0dGVtcHRzIC0gMX0pYCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheU1zKSk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcInVucmVhY2hhYmxlXCIpO1xufVxuXG4vKipcbiAqIEZ1bGx5IFF1YWxpZmllZCBwcm92aWRlciBuYW1lIGluIHRoZSBmb3JtYXQ6XG4gKiBsaWtlIGUuZy4gcmVnaXN0cnkudGVycmFmb3JtLmlvL2hhc2hpY29ycC9hd3NcbiAqL1xuZXhwb3J0IHR5cGUgRlFQTiA9IHN0cmluZyAmIHsgX190eXBlOiBcIkZ1bGx5UXVhbGlmaWVkUHJvdmlkZXJOYW1lXCIgfTtcbmV4cG9ydCB0eXBlIFByb3ZpZGVySG9zdG5hbWUgPSBzdHJpbmcgJiB7IF9fdHlwZTogXCJQcm92aWRlckhvc3RuYW1lXCIgfTtcbmV4cG9ydCB0eXBlIFByb3ZpZGVyTmFtZXNwYWNlID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiUHJvdmlkZXJOYW1lc3BhY2VcIiB9O1xuZXhwb3J0IHR5cGUgUHJvdmlkZXJOYW1lID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiUHJvdmlkZXJOYW1lXCIgfTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlRlFQTiA9IChmOiBGUVBOKSA9PiB7XG4gIGNvbnN0IFtob3N0bmFtZSwgbmFtZXNwYWNlLCBuYW1lXSA9IGYuc3BsaXQoXCIvXCIpO1xuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IGhhbmRsZSAke2Z9YCk7XG4gIH1cbiAgcmV0dXJuIHsgaG9zdG5hbWUsIG5hbWVzcGFjZSwgbmFtZSB9IGFzIHtcbiAgICBob3N0bmFtZTogUHJvdmlkZXJIb3N0bmFtZTtcbiAgICBuYW1lc3BhY2U6IFByb3ZpZGVyTmFtZXNwYWNlO1xuICAgIG5hbWU6IFByb3ZpZGVyTmFtZTtcbiAgfTtcbn07XG5cbmNvbnN0IHVud3JhcElmQXJyYXkgPSA8VD4oaXRlbTogVCB8IFRbXSk6IFQgPT5cbiAgQXJyYXkuaXNBcnJheShpdGVtKSA/IGl0ZW1bMF0gOiBpdGVtO1xuXG5jb25zdCB0cmFuc2Zvcm1WYXJpYWJsZXMgPSAodmFyaWFibGVzOiBhbnkpID0+IHtcbiAgY29uc3QgcmVzdWx0OiBJbnB1dFtdID0gW107XG5cbiAgaWYgKCF2YXJpYWJsZXMpIHJldHVybiByZXN1bHQ7XG5cbiAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHZhcmlhYmxlcykpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHVud3JhcElmQXJyYXkodmFyaWFibGVzW25hbWVdKTtcbiAgICBsZXQgdmFyaWFibGVUeXBlOiBzdHJpbmc7XG5cbiAgICBpZiAoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICB2YXJpYWJsZS5oYXNPd25Qcm9wZXJ0eShcInR5cGVcIikgPT0gZmFsc2UgJiZcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIHZhcmlhYmxlLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFwiKSA9PSB0cnVlXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YXJpYWJsZVtcImRlZmF1bHRcIl0pIHtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICB2YXJpYWJsZVR5cGUgPSBcImJvb2xcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgIHZhcmlhYmxlVHlwZSA9IFwibnVtYmVyXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdmFyaWFibGVUeXBlID0gXCJhbnlcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VmFyaWFibGVUeXBlID0gdmFyaWFibGVbXCJ0eXBlXCJdO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgcmF3VmFyaWFibGVUeXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJhd1ZhcmlhYmxlVHlwZS5zdGFydHNXaXRoKFwiJHtcIikgJiZcbiAgICAgICAgcmF3VmFyaWFibGVUeXBlLmVuZHNXaXRoKFwifVwiKSAmJlxuICAgICAgICAhcmF3VmFyaWFibGVUeXBlLmluY2x1ZGVzKFwiXFxuXCIpXG4gICAgICApIHtcbiAgICAgICAgdmFyaWFibGVUeXBlID0gcmF3VmFyaWFibGVUeXBlLnNsaWNlKDIsIC0xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcmlhYmxlVHlwZSA9IFwiYW55XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbTogSW5wdXQgPSB7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogdmFyaWFibGVUeXBlLFxuICAgICAgZGVzY3JpcHRpb246IHZhcmlhYmxlW1wiZGVzY3JpcHRpb25cIl0sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICByZXF1aXJlZDogdmFyaWFibGUuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0XCIpID09IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAoIWl0ZW0ucmVxdWlyZWQpIHtcbiAgICAgIGl0ZW1bXCJkZWZhdWx0XCJdID0gdmFyaWFibGVbXCJkZWZhdWx0XCJdO1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybU91dHB1dHMgPSAob3V0cHV0czogYW55KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gIGlmIChvdXRwdXRzKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKG91dHB1dHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSB1bndyYXBJZkFycmF5KG91dHB1dHNbbmFtZV0pO1xuXG4gICAgICBjb25zdCBpdGVtOiBhbnkgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvdXRwdXRbXCJkZXNjcmlwdGlvblwiXSxcbiAgICAgIH07XG5cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBoYXJ2ZXN0TW9kdWxlU2NoZW1hID0gYXN5bmMgKFxuICB3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcsXG4gIG1vZHVsZXM6IHN0cmluZ1tdLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9PiB7XG4gIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5qb2luKFxuICAgIHdvcmtpbmdEaXJlY3RvcnksXG4gICAgXCIudGVycmFmb3JtXCIsXG4gICAgXCJtb2R1bGVzXCIsXG4gICAgXCJtb2R1bGVzLmpzb25cIixcbiAgKTtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVOYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNb2R1bGVzIHdlcmUgbm90IGdlbmVyYXRlZCBwcm9wZXJseSAtIGNvdWxkbid0IGZpbmQgJHtmaWxlTmFtZX1gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtb2R1bGVJbmRleCA9IEpTT04ucGFyc2UoXG4gICAgZnMucmVhZEZpbGVTeW5jKGZpbGVOYW1lLCBcInV0Zi04XCIpLFxuICApIGFzIE1vZHVsZUluZGV4O1xuXG4gIGZvciAoY29uc3QgbW9kIG9mIG1vZHVsZXMpIHtcbiAgICBjb25zdCBtID0gbW9kdWxlSW5kZXguTW9kdWxlcy5maW5kKChvdGhlcikgPT4gbW9kID09PSBvdGhlci5LZXkpO1xuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgJHttfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IGNvbnZlcnRGaWxlcyhwYXRoLmpvaW4od29ya2luZ0RpcmVjdG9yeSwgbS5EaXIpKTtcblxuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNb2R1bGVzIHdlcmUgbm90IGdlbmVyYXRlZCBwcm9wZXJseSAtIGNvdWxkbid0IHBhcnNlICR7bS5EaXJ9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hOiBNb2R1bGVTY2hlbWEgPSB7XG4gICAgICBpbnB1dHM6IHRyYW5zZm9ybVZhcmlhYmxlcyhwYXJzZWQudmFyaWFibGUpLFxuICAgICAgb3V0cHV0czogdHJhbnNmb3JtT3V0cHV0cyhwYXJzZWQub3V0cHV0KSxcbiAgICAgIG5hbWU6IG1vZCxcbiAgICB9O1xuXG4gICAgcmVzdWx0W21vZF0gPSBzY2hlbWE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZnVuY3Rpb24gam9pbldpdGhBbmQoaXRlbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKGl0ZW1zLmxlbmd0aCA8PSAxKSByZXR1cm4gaXRlbXMuam9pbihcIlwiKTtcbiAgcmV0dXJuIGAke2l0ZW1zLnNsaWNlKDAsIC0xKS5qb2luKFwiLCBcIil9IGFuZCAke2l0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdfWA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVycmFmb3JtQ29uZmlnIHtcbiAgcHJvdmlkZXI/OiB7IFtuYW1lOiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gIHRlcnJhZm9ybToge1xuICAgIHJlcXVpcmVkX3Byb3ZpZGVycz86IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB7IHNvdXJjZT86IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9O1xuICAgIH07XG4gIH07XG4gIG1vZHVsZT86IHsgW25hbWU6IHN0cmluZ106IHsgc291cmNlOiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFByb3ZpZGVyU2NoZW1hKFxuICB0YXJnZXQ6IENvbnN0cnVjdHNNYWtlclByb3ZpZGVyVGFyZ2V0LFxuKSB7XG4gIGNvbnN0IGNvbmZpZzogVGVycmFmb3JtQ29uZmlnID0ge1xuICAgIHByb3ZpZGVyOiB7fSxcbiAgICB0ZXJyYWZvcm06IHtcbiAgICAgIHJlcXVpcmVkX3Byb3ZpZGVyczoge30sXG4gICAgfSxcbiAgfTtcblxuICBjb25maWcucHJvdmlkZXIhW3RhcmdldC5uYW1lXSA9IHt9O1xuICBjb25maWcudGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyFbdGFyZ2V0Lm5hbWVdID0ge1xuICAgIHZlcnNpb246IHRhcmdldC52ZXJzaW9uLFxuICAgIHNvdXJjZTogdGFyZ2V0LnNvdXJjZSxcbiAgfTtcblxuICBsZXQgcHJvdmlkZXJTY2hlbWE6IFByb3ZpZGVyU2NoZW1hID0geyBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIiB9O1xuXG4gIGF3YWl0IHdpdGhUZW1wRGlyKFwiZmV0Y2hQcm92aWRlclNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvdXRkaXIsIFwibWFpbi50Zi5qc29uXCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG5cbiAgICBhd2FpdCB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgcHJvdmlkZXJTY2hlbWEgPSBKU09OLnBhcnNlKFxuICAgICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJwcm92aWRlcnNcIiwgXCJzY2hlbWFcIiwgXCItanNvblwiXSwge1xuICAgICAgICBjd2Q6IG91dGRpcixcbiAgICAgIH0pLFxuICAgICkgYXMgUHJvdmlkZXJTY2hlbWE7XG5cbiAgICBjb25zdCB2ZXJzaW9uU2NoZW1hID0gSlNPTi5wYXJzZShcbiAgICAgIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1widmVyc2lvblwiLCBcIi1qc29uXCJdLCB7XG4gICAgICAgIGN3ZDogb3V0ZGlyLFxuICAgICAgfSksXG4gICAgKSBhcyBWZXJzaW9uU2NoZW1hO1xuXG4gICAgcHJvdmlkZXJTY2hlbWEucHJvdmlkZXJfdmVyc2lvbnMgPSB2ZXJzaW9uU2NoZW1hLnByb3ZpZGVyX3NlbGVjdGlvbnM7XG4gIH0pO1xuXG4gIC8vIFN0YW1wIHRoZSBmZXRjaGluZyBDTEkncyBpZGVudGl0eSBzbyBkb3duc3RyZWFtIGNvbnN1bWVycyBjYW4gcmVhc29uXG4gIC8vIGFib3V0IHdoaWNoIG5ld2VyLXByb3RvY29sIHNlY3Rpb25zIHRoaXMgZmV0Y2ggY291bGQgcG9zc2libHkgaGF2ZVxuICAvLyBlbWl0dGVkLiBOZXZlciBmYWlsIHRoZSBmZXRjaCBvdmVyIHRoaXMgLSBpdCdzIGJlc3QtZWZmb3J0IG1ldGFkYXRhLlxuICB0cnkge1xuICAgIGNvbnN0IGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIHByb3ZpZGVyU2NoZW1hLmNsaV9uYW1lID0gY2xpLm5hbWU7XG4gICAgcHJvdmlkZXJTY2hlbWEuY2xpX3ZlcnNpb24gPSBjbGkudmVyc2lvbjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgQ291bGQgbm90IGRldGVybWluZSBmZXRjaGluZyBDTEkgdmVyc2lvbiB0byBzdGFtcCBwcm92aWRlciBzY2hlbWE6ICR7ZXJyb3J9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHNhbml0aXplUHJvdmlkZXJTY2hlbWEocHJvdmlkZXJTY2hlbWEpO1xufVxuXG4vKipcbiAqIFdhcm5zIHdoZW4gdGhlIENMSSB0aGF0IHByb2R1Y2VkIGEgZ2l2ZW4gcHJvdmlkZXIgc2NoZW1hIHByZWRhdGVzIG9uZSBvclxuICogbW9yZSBzY2hlbWEtZW1pc3Npb24gYm91bmRhcmllcyB0aGUgcHJvamVjdCdzIGRlY2xhcmVkIGB0YXJnZXRWZXJzaW9uc2BcbiAqIGNhcmUgYWJvdXQgKHNlZSBlbWlzc2lvbi1jaGVjay50cykgLSBpLmUuIHNvbWUgbmV3ZXItcHJvdG9jb2wgc2VjdGlvbnNcbiAqIChmdW5jdGlvbnMsIGVwaGVtZXJhbCByZXNvdXJjZXMsIC4uLikgbWF5IGJlIG1pc3NpbmcgZnJvbSB0aGUgZ2VuZXJhdGVkXG4gKiBiaW5kaW5ncyBldmVuIHRob3VnaCB0aGUgc2NoZW1hIGZldGNoIGl0c2VsZiBzdWNjZWVkZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGRlY291cGxlZCBmcm9tIHRoZSBmZXRjaCBwYXRoIChyZWFkUHJvdmlkZXJTY2hlbWEpIHNvIGl0XG4gKiBhbHNvIHJ1bnMgZm9yIHNjaGVtYXMgc2VydmVkIGZyb20gdGhlIG9uLWRpc2sgY2FjaGU6IGNhY2hlZCBKU09OIGNhcnJpZXNcbiAqIHRoZSBzYW1lIGBjbGlfbmFtZWAvYGNsaV92ZXJzaW9uYCBzdGFtcHMgYSBmcmVzaCBmZXRjaCB3b3VsZCBoYXZlXG4gKiB3cml0dGVuICh0aGUgY2FjaGUga2V5IGFscmVhZHkgc2VnbWVudHMgYnkgQ0xJIHByb2R1Y3QrbWlub3IpLCBzbyB0aGUgZ2FwXG4gKiBjaGVjayBpcyBqdXN0IGFzIG1lYW5pbmdmdWwgb24gYSBjYWNoZSBoaXQgYXMgb24gYSBtaXNzLlxuICpcbiAqIE5vLW9wIHdpdGhvdXQgYHRhcmdldFZlcnNpb25zYCAtIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSB0aGUgQ0xJXG4gKiBhZ2FpbnN0LiBGYWxscyBiYWNrIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MncyBmZXRjaGluZyBDTEkgdmVyc2lvbiB3aGVuXG4gKiB0aGUgc2NoZW1hIGl0c2VsZiBpc24ndCBzdGFtcGVkIChlLmcuIG9sZGVyIGNhY2hlIGVudHJpZXMgd3JpdHRlbiBiZWZvcmVcbiAqIHN0YW1waW5nIGV4aXN0ZWQpLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXJuSWZTY2hlbWFFbWlzc2lvbkdhcHMoXG4gIHNjaGVtYTogUHJvdmlkZXJTY2hlbWEsXG4gIHRhcmdldFZlcnNpb25zPzogVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCF0YXJnZXRWZXJzaW9ucykgcmV0dXJuO1xuXG4gIGxldCBjbGk6IFRlcnJhZm9ybUNsaVZlcnNpb247XG4gIGlmIChzY2hlbWEuY2xpX25hbWUgJiYgc2NoZW1hLmNsaV92ZXJzaW9uKSB7XG4gICAgaWYgKHNjaGVtYS5jbGlfbmFtZSAhPT0gXCJ0ZXJyYWZvcm1cIiAmJiBzY2hlbWEuY2xpX25hbWUgIT09IFwib3BlbnRvZnVcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGkgPSB7IG5hbWU6IHNjaGVtYS5jbGlfbmFtZSwgdmVyc2lvbjogc2NoZW1hLmNsaV92ZXJzaW9uIH07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGNsaSA9IGF3YWl0IGdldEZldGNoaW5nQ2xpVmVyc2lvbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGZldGNoaW5nIENMSSB2ZXJzaW9uIHRvIGNoZWNrIGZvciBzY2hlbWEgZW1pc3Npb24gZ2FwczogJHtlcnJvcn1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBnYXBGYW1pbGllcyA9IGNoZWNrU2NoZW1hRW1pc3Npb25HYXBGYW1pbGllcyhjbGksIHRhcmdldFZlcnNpb25zKTtcbiAgaWYgKGdhcEZhbWlsaWVzLmxlbmd0aCA+IDAgJiYgY2xpLnZlcnNpb24pIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBwcm92aWRlciBzY2hlbWEgZmV0Y2hlZCB3aXRoICR7Y2xpLm5hbWV9ICR7Y2xpLnZlcnNpb259IOKAlCAke2pvaW5XaXRoQW5kKFxuICAgICAgICBnYXBGYW1pbGllcy5tYXAoKGZhbWlseSkgPT4gU0NIRU1BX0VNSVNTSU9OX0ZBTUlMWV9MQUJFTFNbZmFtaWx5XSksXG4gICAgICApfSB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQ7IHJ1biBjZGt0biBnZXQgd2l0aCAke3N1Z2dlc3RlZEVtaXR0aW5nQ2xpVmVyc2lvbnMoXG4gICAgICAgIGdhcEZhbWlsaWVzLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbn1cblxuLy8gVGhlIHByb3ZpZGVycyBoYXZlIHNvbWUgcG90ZW50aWFsIGJ1Z3MgdGhhdCB3ZSB3YW50IHRvIHByby1hY3RpdmVseVxuLy8gZml4IGhlcmUgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBjYW4gYXNzdW1lIGEgY29uc2lzdGVudCBzY2hlbWEuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVQcm92aWRlclNjaGVtYShzY2hlbWE6IFByb3ZpZGVyU2NoZW1hKTogUHJvdmlkZXJTY2hlbWEge1xuICAvLyBNYWlubHkgc29tZSBhdHRyaWJ1dGVzIGFyZSBcImRvdWJsZWRcIiwgZS5nLiBbXCJsaXN0XCIsIFwic3RyaW5nXCIsIFwibGlzdFwiLCBcInN0cmluZ1wiXVxuICAvLyBpbnN0ZWFkIG9mIFtcImxpc3RcIiwgXCJzdHJpbmdcIl1cbiAgZnVuY3Rpb24gYXR0cmlidXRlRG91YmxpbmdGaXgoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiBBdHRyaWJ1dGUge1xuICAgIGlmIChpc05lc3RlZFR5cGVBdHRyaWJ1dGUoYXR0cmlidXRlKSB8fCAhQXJyYXkuaXNBcnJheShhdHRyaWJ1dGUudHlwZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9XG4gICAgICBhdHRyaWJ1dGUudHlwZS5sZW5ndGggPT09IDJcbiAgICAgICAgPyBhdHRyaWJ1dGUudHlwZVxuICAgICAgICA6IChhdHRyaWJ1dGUudHlwZSBhcyBzdHJpbmdbXSkuc2xpY2UoMCwgMik7IC8vIFRoZSB0eXBlcyB0ZWxsIHVzIHRoaXMgY2FuJ3QgaGFwcGVuLCByZWFsaXR5IGJlZ3MgdG8gZGlmZmVyXG5cbiAgICBhdHRyaWJ1dGUudHlwZSA9IHR5cGUgYXMgQXR0cmlidXRlVHlwZTtcbiAgICByZXR1cm4gYXR0cmlidXRlO1xuICB9XG5cbiAgLy8gTXV0YXRlcyBibG9jayB3aXRoIHRoZSBmaXhcbiAgZnVuY3Rpb24gc2FuaXRpemVCbG9jayhibG9jazogQmxvY2spIHtcbiAgICBPYmplY3QudmFsdWVzKGJsb2NrLmF0dHJpYnV0ZXMgfHwge30pLmZvckVhY2goYXR0cmlidXRlRG91YmxpbmdGaXgpO1xuICAgIE9iamVjdC52YWx1ZXMoYmxvY2suYmxvY2tfdHlwZXMgfHwge30pLmZvckVhY2goKGJsb2NrVHlwZSkgPT4ge1xuICAgICAgc2FuaXRpemVCbG9jayhibG9ja1R5cGUuYmxvY2spO1xuICAgIH0pO1xuICB9XG5cbiAgT2JqZWN0LnZhbHVlcyhzY2hlbWEucHJvdmlkZXJfc2NoZW1hcyB8fCB7fSkuZm9yRWFjaCgocHJvdmlkZXIpID0+IHtcbiAgICBjb25zdCBlbnRpdGllcyA9IFtcbiAgICAgIHByb3ZpZGVyLnByb3ZpZGVyLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhwcm92aWRlci5yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMocHJvdmlkZXIuZGF0YV9zb3VyY2Vfc2NoZW1hcyB8fCB7fSksXG4gICAgICAuLi5PYmplY3QudmFsdWVzKHByb3ZpZGVyLmVwaGVtZXJhbF9yZXNvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICBdO1xuXG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XG4gICAgICBzYW5pdGl6ZUJsb2NrKGVudGl0eS5ibG9jayk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBzY2hlbWE7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTW9kdWxlU2NoZW1hKHRhcmdldDogQ29uc3RydWN0c01ha2VyTW9kdWxlVGFyZ2V0KSB7XG4gIGxldCBtb2R1bGVTY2hlbWE6IFJlY29yZDxzdHJpbmcsIE1vZHVsZVNjaGVtYT4gPSB7fTtcblxuICBhd2FpdCB3aXRoVGVtcERpcihcImZldGNoU2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25maWc6IFRlcnJhZm9ybUNvbmZpZyA9IHtcbiAgICAgIHRlcnJhZm9ybToge30sXG4gICAgfTtcblxuICAgIGlmICghY29uZmlnLm1vZHVsZSkgY29uZmlnLm1vZHVsZSA9IHt9O1xuICAgIGxldCBzb3VyY2U6IHN0cmluZyA9IHRhcmdldC5zb3VyY2U7XG5cbiAgICBjb25zdCBsb2NhbFNvdXJjZSA9ICh0YXJnZXQuY29uc3RyYWludCBhcyBUZXJyYWZvcm1Nb2R1bGVDb25zdHJhaW50KVxuICAgICAgLmxvY2FsU291cmNlQWJzb2x1dGVQYXRoO1xuICAgIGlmIChsb2NhbFNvdXJjZSkge1xuICAgICAgLy8gY3JlYXRlIHJlbGF0aXZlIHBhdGggdG8gbW9kdWxlIGluIHRoZSB1c2VyIHByb2plY3RcbiAgICAgIHNvdXJjZSA9IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgbG9jYWxTb3VyY2UpO1xuICAgIH1cblxuICAgIGNvbmZpZy5tb2R1bGVbdGFyZ2V0Lm1vZHVsZUtleV0gPSB7IHNvdXJjZTogc291cmNlIH07XG4gICAgaWYgKHRhcmdldC52ZXJzaW9uKSB7XG4gICAgICBjb25maWcubW9kdWxlW3RhcmdldC5tb2R1bGVLZXldW1widmVyc2lvblwiXSA9IHRhcmdldC52ZXJzaW9uO1xuICAgIH1cblxuICAgIGNvbnN0IG91dGRpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ob3V0ZGlyLCBcIm1haW4udGYuanNvblwiKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuXG4gICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJnZXRcIl0sIHsgY3dkOiBvdXRkaXIgfSk7XG4gICAgaWYgKGNvbmZpZy5tb2R1bGUpIHtcbiAgICAgIG1vZHVsZVNjaGVtYSA9IGF3YWl0IGhhcnZlc3RNb2R1bGVTY2hlbWEoXG4gICAgICAgIG91dGRpcixcbiAgICAgICAgT2JqZWN0LmtleXMoY29uZmlnLm1vZHVsZSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG1vZHVsZVNjaGVtYTtcbn1cbiJdfQ==
545
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3ZpZGVyLXNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUU3Qiw4Q0FBK0M7QUFDL0MsNENBbUJ3QjtBQUN4QixxREFJMEI7QUFFMUIsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFdBQVcsQ0FBQztBQUU3RSxJQUFJLHlCQUFtRSxDQUFDO0FBRXhFOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLHFCQUFxQjtJQUNuQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUMvQix5QkFBeUIsR0FBRyxJQUFBLGNBQUksRUFBQyxtQkFBbUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFO1NBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsa0NBQXdCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyx5QkFBeUIsQ0FBQztBQUNuQyxDQUFDO0FBUEQsc0RBT0M7QUFFRCxtRUFBbUU7QUFDbkUscUVBQXFFO0FBQ3JFLHNFQUFzRTtBQUN0RSxNQUFNLDZCQUE2QixHQUFHO0lBQ3BDLGFBQWE7SUFDYixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUI7Q0FDbEIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0ksS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxPQUF3QixFQUN4QixXQUFXLEdBQUcsQ0FBQyxFQUNmLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLGlCQUFpQixHQUFHLENBQUM7O0lBRXJCLEtBQUssSUFBSSxP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WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGNvbnZlcnRGaWxlcyB9IGZyb20gXCJAY2RrdG4vaGNsMmpzb25cIjtcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZSxcbiAgQXR0cmlidXRlVHlwZSxcbiAgQmxvY2ssXG4gIENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldCxcbiAgQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQsXG4gIElucHV0LFxuICBNb2R1bGVJbmRleCxcbiAgTW9kdWxlU2NoZW1hLFxuICBQcm92aWRlclNjaGVtYSxcbiAgVGVycmFmb3JtQ2xpVmVyc2lvbixcbiAgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludCxcbiAgVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG4gIFZlcnNpb25TY2hlbWEsXG4gIGV4ZWMsXG4gIGlzTmVzdGVkVHlwZUF0dHJpYnV0ZSxcbiAgbG9nZ2VyLFxuICBwYXJzZVRlcnJhZm9ybUNsaVZlcnNpb24sXG4gIHdpdGhUZW1wRGlyLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7XG4gIFNDSEVNQV9FTUlTU0lPTl9GQU1JTFlfTEFCRUxTLFxuICBjaGVja1NjaGVtYUVtaXNzaW9uR2FwRmFtaWxpZXMsXG4gIHN1Z2dlc3RlZEVtaXR0aW5nQ2xpVmVyc2lvbnMsXG59IGZyb20gXCIuL2VtaXNzaW9uLWNoZWNrXCI7XG5cbmNvbnN0IHRlcnJhZm9ybUJpbmFyeU5hbWUgPSBwcm9jZXNzLmVudi5URVJSQUZPUk1fQklOQVJZX05BTUUgfHwgXCJ0ZXJyYWZvcm1cIjtcblxubGV0IGZldGNoaW5nQ2xpVmVyc2lvblByb21pc2U6IFByb21pc2U8VGVycmFmb3JtQ2xpVmVyc2lvbj4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgdmVyc2lvbiBvZiB0aGUgZmV0Y2hpbmcgQ0xJIChgdGVycmFmb3JtYC9gdG9mdWAgYmluYXJ5XG4gKiByZXNvbHZlZCB2aWEgYFRFUlJBRk9STV9CSU5BUllfTkFNRWApIG9uY2UgcGVyIHByb2Nlc3MsIG1lbW9pemVkLlxuICpcbiAqIFVzZWQgYm90aCB0byBzdGFtcCBmZXRjaGVkIHByb3ZpZGVyIHNjaGVtYXMgKGBjbGlfbmFtZWAvYGNsaV92ZXJzaW9uYClcbiAqIGFuZCBhcyB0aGUgY2FjaGUga2V5IHN1ZmZpeCBpbiByZWFkLnRzLCBzaW5jZSBzY2hlbWEgZW1pc3Npb24gaXMgZml4ZWRcbiAqIHBlciBDTEkgbWlub3IgdmVyc2lvbi5cbiAqXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZyBsaWtlIHRlcnJhZm9ybUluaXRXaXRoUmV0cnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZldGNoaW5nQ2xpVmVyc2lvbigpOiBQcm9taXNlPFRlcnJhZm9ybUNsaVZlcnNpb24+IHtcbiAgaWYgKCFmZXRjaGluZ0NsaVZlcnNpb25Qcm9taXNlKSB7XG4gICAgZmV0Y2hpbmdDbGlWZXJzaW9uUHJvbWlzZSA9IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1widmVyc2lvblwiXSwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnRoZW4ocGFyc2VUZXJyYWZvcm1DbGlWZXJzaW9uKTtcbiAgfVxuICByZXR1cm4gZmV0Y2hpbmdDbGlWZXJzaW9uUHJvbWlzZTtcbn1cblxuLy8gUHJvdmlkZXIgYmluYXJpZXMgYXJlIGRvd25sb2FkZWQgZnJvbSBHaXRIdWIgcmVsZWFzZSBDRE5zIGR1cmluZ1xuLy8gYHRlcnJhZm9ybSBpbml0YCwgd2hpY2ggaW50ZXJtaXR0ZW50bHkgcmV0dXJucyA1eHguIFJldHJ5IG9uIHRob3NlXG4vLyBzaWduYXR1cmVzIG9ubHkg4oCUIHJlYWwgY29uZmlnL3NjaGVtYSBlcnJvcnMgc2hvdWxkIHN0aWxsIGZhaWwgZmFzdC5cbmNvbnN0IFRSQU5TSUVOVF9JTklUX0VSUk9SX1BBVFRFUk5TID0gW1xuICAvXFxiNTBbMjM0XVxcYi8sXG4gIC9CYWQgR2F0ZXdheS9pLFxuICAvU2VydmljZSBVbmF2YWlsYWJsZS9pLFxuICAvR2F0ZXdheSBUaW1lb3V0L2ksXG4gIC9FQ09OTlJFU0VUL2ksXG4gIC9FVElNRURPVVQvaSxcbiAgL0VBSV9BR0FJTi9pLFxuICAvdW5leHBlY3RlZCBFT0YvaSxcbl07XG5cbi8qKlxuICogUnVucyBgdGVycmFmb3JtIGluaXRgIGFuZCByZXRyaWVzIG9uIHRyYW5zaWVudCBIVFRQL25ldHdvcmsgZmFpbHVyZXMuXG4gKlxuICogUHJvdmlkZXIgYmluYXJpZXMgYXJlIHB1bGxlZCBmcm9tIEdpdEh1YidzIHJlbGVhc2UgQ0ROLCB3aGljaFxuICogaW50ZXJtaXR0ZW50bHkgcmV0dXJucyA1eHguIFRoZSByZXRyeSBvbmx5IGZpcmVzIHdoZW4gc3RkZXJyIG1hdGNoZXMgYVxuICoga25vd24gdHJhbnNpZW50IHBhdHRlcm4g4oCUIHJlYWwgZXJyb3JzIChiYWQgdmVyc2lvbiwgc2NoZW1hIHBhcnNlLCBldGMuKVxuICogc3RpbGwgZmFpbCBvbiB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIHNwYXduIG9wdGlvbnMgZm9yd2FyZGVkIHRvIGBleGVjYCAoYGN3ZGAgaXMgcmVxdWlyZWQgc29cbiAqICAgYHRlcnJhZm9ybSBpbml0YCBydW5zIGluc2lkZSB0aGUgdGVtcCBkaXIgaG9sZGluZyBgbWFpbi50Zi5qc29uYClcbiAqIEBwYXJhbSBtYXhBdHRlbXB0cyAtIHRvdGFsIGF0dGVtcHRzIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBjYWxsOyB0aGUgbnVtYmVyXG4gKiAgIG9mIHJldHJpZXMgaXMgYG1heEF0dGVtcHRzIC0gMWAuIERlZmF1bHRzIHRvIDUgKDEgaW5pdGlhbCArIDQgcmV0cmllcylcbiAqIEBwYXJhbSBiYXNlRGVsYXlNcyAtIGRlbGF5IGJlZm9yZSB0aGUgZmlyc3QgcmV0cnkuIFRlc3RzIHBhc3MgYDBgIHRvIHNraXBcbiAqICAgd2FpdHMuIERlZmF1bHRzIHRvIDUwMDBtc1xuICogQHBhcmFtIGJhY2tvZmZNdWx0aXBsaWVyIC0gZmFjdG9yIGFwcGxpZWQgdG8gdGhlIGRlbGF5IG9uIGVhY2ggc3Vic2VxdWVudFxuICogICByZXRyeSAoc28gcmV0cmllcyB3YWl0IGBiYXNlRGVsYXlNcyAqIG11bHRpcGxpZXJeKGF0dGVtcHQtMSlgKS4gRGVmYXVsdHNcbiAqICAgdG8gMiAoMXMg4oaSIDJzIOKGkiA0cyDigKYpXG4gKiBAcmV0dXJucyBzdGRvdXQgZnJvbSB0aGUgc3VjY2Vzc2Z1bCBgdGVycmFmb3JtIGluaXRgIGludm9jYXRpb25cbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXJyYWZvcm1Jbml0V2l0aFJldHJ5KFxuICBvcHRpb25zOiB7IGN3ZDogc3RyaW5nIH0sXG4gIG1heEF0dGVtcHRzID0gNSxcbiAgYmFzZURlbGF5TXMgPSA1MDAwLFxuICBiYWNrb2ZmTXVsdGlwbGllciA9IDIsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBleGVjKHRlcnJhZm9ybUJpbmFyeU5hbWUsIFtcImluaXRcIl0sIG9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnN0IHN0ZGVycjogc3RyaW5nID0gZXJyb3I/LnN0ZGVyciA/PyBcIlwiO1xuICAgICAgY29uc3QgdHJhbnNpZW50ID0gVFJBTlNJRU5UX0lOSVRfRVJST1JfUEFUVEVSTlMuc29tZSgocCkgPT5cbiAgICAgICAgcC50ZXN0KHN0ZGVyciksXG4gICAgICApO1xuICAgICAgaWYgKCF0cmFuc2llbnQgfHwgYXR0ZW1wdCA9PT0gbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWxheU1zID0gYmFzZURlbGF5TXMgKiBiYWNrb2ZmTXVsdGlwbGllciAqKiAoYXR0ZW1wdCAtIDEpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGB0ZXJyYWZvcm0gaW5pdCBmYWlsZWQgd2l0aCBhIHRyYW5zaWVudCBlcnJvciwgcmV0cnlpbmcgaW4gJHtkZWxheU1zfW1zIChhdHRlbXB0ICR7YXR0ZW1wdH0vJHttYXhBdHRlbXB0cyAtIDF9KWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXlNcykpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJ1bnJlYWNoYWJsZVwiKTtcbn1cblxuLyoqXG4gKiBGdWxseSBRdWFsaWZpZWQgcHJvdmlkZXIgbmFtZSBpbiB0aGUgZm9ybWF0OlxuICogbGlrZSBlLmcuIHJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvYXdzXG4gKi9cbmV4cG9ydCB0eXBlIEZRUE4gPSBzdHJpbmcgJiB7IF9fdHlwZTogXCJGdWxseVF1YWxpZmllZFByb3ZpZGVyTmFtZVwiIH07XG5leHBvcnQgdHlwZSBQcm92aWRlckhvc3RuYW1lID0gc3RyaW5nICYgeyBfX3R5cGU6IFwiUHJvdmlkZXJIb3N0bmFtZVwiIH07XG5leHBvcnQgdHlwZSBQcm92aWRlck5hbWVzcGFjZSA9IHN0cmluZyAmIHsgX190eXBlOiBcIlByb3ZpZGVyTmFtZXNwYWNlXCIgfTtcbmV4cG9ydCB0eXBlIFByb3ZpZGVyTmFtZSA9IHN0cmluZyAmIHsgX190eXBlOiBcIlByb3ZpZGVyTmFtZVwiIH07XG5cbmV4cG9ydCBjb25zdCBwYXJzZUZRUE4gPSAoZjogRlFQTikgPT4ge1xuICBjb25zdCBbaG9zdG5hbWUsIG5hbWVzcGFjZSwgbmFtZV0gPSBmLnNwbGl0KFwiL1wiKTtcbiAgaWYgKCFuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBoYW5kbGUgJHtmfWApO1xuICB9XG4gIHJldHVybiB7IGhvc3RuYW1lLCBuYW1lc3BhY2UsIG5hbWUgfSBhcyB7XG4gICAgaG9zdG5hbWU6IFByb3ZpZGVySG9zdG5hbWU7XG4gICAgbmFtZXNwYWNlOiBQcm92aWRlck5hbWVzcGFjZTtcbiAgICBuYW1lOiBQcm92aWRlck5hbWU7XG4gIH07XG59O1xuXG5jb25zdCB1bndyYXBJZkFycmF5ID0gPFQ+KGl0ZW06IFQgfCBUW10pOiBUID0+XG4gIEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtWzBdIDogaXRlbTtcblxuY29uc3QgdHJhbnNmb3JtVmFyaWFibGVzID0gKHZhcmlhYmxlczogYW55KSA9PiB7XG4gIGNvbnN0IHJlc3VsdDogSW5wdXRbXSA9IFtdO1xuXG4gIGlmICghdmFyaWFibGVzKSByZXR1cm4gcmVzdWx0O1xuXG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyh2YXJpYWJsZXMpKSB7XG4gICAgY29uc3QgdmFyaWFibGUgPSB1bndyYXBJZkFycmF5KHZhcmlhYmxlc1tuYW1lXSk7XG4gICAgbGV0IHZhcmlhYmxlVHlwZTogc3RyaW5nO1xuXG4gICAgaWYgKFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgdmFyaWFibGUuaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpID09IGZhbHNlICYmXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICB2YXJpYWJsZS5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRcIikgPT0gdHJ1ZVxuICAgICkge1xuICAgICAgc3dpdGNoICh0eXBlb2YgdmFyaWFibGVbXCJkZWZhdWx0XCJdKSB7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgdmFyaWFibGVUeXBlID0gXCJib29sXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICB2YXJpYWJsZVR5cGUgPSBcIm51bWJlclwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHZhcmlhYmxlVHlwZSA9IFwiYW55XCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJhd1ZhcmlhYmxlVHlwZSA9IHZhcmlhYmxlW1widHlwZVwiXTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHJhd1ZhcmlhYmxlVHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByYXdWYXJpYWJsZVR5cGUuc3RhcnRzV2l0aChcIiR7XCIpICYmXG4gICAgICAgIHJhd1ZhcmlhYmxlVHlwZS5lbmRzV2l0aChcIn1cIikgJiZcbiAgICAgICAgIXJhd1ZhcmlhYmxlVHlwZS5pbmNsdWRlcyhcIlxcblwiKVxuICAgICAgKSB7XG4gICAgICAgIHZhcmlhYmxlVHlwZSA9IHJhd1ZhcmlhYmxlVHlwZS5zbGljZSgyLCAtMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJpYWJsZVR5cGUgPSBcImFueVwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGl0ZW06IElucHV0ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIHR5cGU6IHZhcmlhYmxlVHlwZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB2YXJpYWJsZVtcImRlc2NyaXB0aW9uXCJdLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgcmVxdWlyZWQ6IHZhcmlhYmxlLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFwiKSA9PSBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKCFpdGVtLnJlcXVpcmVkKSB7XG4gICAgICBpdGVtW1wiZGVmYXVsdFwiXSA9IHZhcmlhYmxlW1wiZGVmYXVsdFwiXTtcbiAgICB9XG5cbiAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1PdXRwdXRzID0gKG91dHB1dHM6IGFueSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcblxuICBpZiAob3V0cHV0cykge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhvdXRwdXRzKSkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gdW53cmFwSWZBcnJheShvdXRwdXRzW25hbWVdKTtcblxuICAgICAgY29uc3QgaXRlbTogYW55ID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogb3V0cHV0W1wiZGVzY3JpcHRpb25cIl0sXG4gICAgICB9O1xuXG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgaGFydmVzdE1vZHVsZVNjaGVtYSA9IGFzeW5jIChcbiAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICBtb2R1bGVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4gPT4ge1xuICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbihcbiAgICB3b3JraW5nRGlyZWN0b3J5LFxuICAgIFwiLnRlcnJhZm9ybVwiLFxuICAgIFwibW9kdWxlc1wiLFxuICAgIFwibW9kdWxlcy5qc29uXCIsXG4gICk7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlTmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTW9kdWxlcyB3ZXJlIG5vdCBnZW5lcmF0ZWQgcHJvcGVybHkgLSBjb3VsZG4ndCBmaW5kICR7ZmlsZU5hbWV9YCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbW9kdWxlSW5kZXggPSBKU09OLnBhcnNlKFxuICAgIGZzLnJlYWRGaWxlU3luYyhmaWxlTmFtZSwgXCJ1dGYtOFwiKSxcbiAgKSBhcyBNb2R1bGVJbmRleDtcblxuICBmb3IgKGNvbnN0IG1vZCBvZiBtb2R1bGVzKSB7XG4gICAgY29uc3QgbSA9IG1vZHVsZUluZGV4Lk1vZHVsZXMuZmluZCgob3RoZXIpID0+IG1vZCA9PT0gb3RoZXIuS2V5KTtcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kICR7bX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCBjb252ZXJ0RmlsZXMocGF0aC5qb2luKHdvcmtpbmdEaXJlY3RvcnksIG0uRGlyKSk7XG5cbiAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTW9kdWxlcyB3ZXJlIG5vdCBnZW5lcmF0ZWQgcHJvcGVybHkgLSBjb3VsZG4ndCBwYXJzZSAke20uRGlyfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYTogTW9kdWxlU2NoZW1hID0ge1xuICAgICAgaW5wdXRzOiB0cmFuc2Zvcm1WYXJpYWJsZXMocGFyc2VkLnZhcmlhYmxlKSxcbiAgICAgIG91dHB1dHM6IHRyYW5zZm9ybU91dHB1dHMocGFyc2VkLm91dHB1dCksXG4gICAgICBuYW1lOiBtb2QsXG4gICAgfTtcblxuICAgIHJlc3VsdFttb2RdID0gc2NoZW1hO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmZ1bmN0aW9uIGpvaW5XaXRoQW5kKGl0ZW1zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChpdGVtcy5sZW5ndGggPD0gMSkgcmV0dXJuIGl0ZW1zLmpvaW4oXCJcIik7XG4gIHJldHVybiBgJHtpdGVtcy5zbGljZSgwLCAtMSkuam9pbihcIiwgXCIpfSBhbmQgJHtpdGVtc1tpdGVtcy5sZW5ndGggLSAxXX1gO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlcnJhZm9ybUNvbmZpZyB7XG4gIC8vIGEgbGlzdCBob2xkcyBzZXZlcmFsIGNvbmZpZ3VyYXRpb25zIG9mIHRoZSBzYW1lIHByb3ZpZGVyLCB3aGljaCBpcyBob3dcbiAgLy8gYWxpYXNlZCBwcm92aWRlciBibG9ja3MgYXJlIGV4cHJlc3NlZCBpbiBKU09OIHN5bnRheFxuICBwcm92aWRlcj86IHsgW25hbWU6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIGFueT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+W10gfTtcbiAgdGVycmFmb3JtOiB7XG4gICAgcmVxdWlyZWRfcHJvdmlkZXJzPzoge1xuICAgICAgW25hbWU6IHN0cmluZ106IHsgc291cmNlPzogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nIH07XG4gICAgfTtcbiAgfTtcbiAgbW9kdWxlPzoge1xuICAgIFtuYW1lOiBzdHJpbmddOiB7XG4gICAgICBzb3VyY2U6IHN0cmluZztcbiAgICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgICBwcm92aWRlcnM/OiB7IFtsb2NhbE5hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUHJvdmlkZXJTY2hlbWEoXG4gIHRhcmdldDogQ29uc3RydWN0c01ha2VyUHJvdmlkZXJUYXJnZXQsXG4pIHtcbiAgY29uc3QgY29uZmlnOiBUZXJyYWZvcm1Db25maWcgPSB7XG4gICAgcHJvdmlkZXI6IHt9LFxuICAgIHRlcnJhZm9ybToge1xuICAgICAgcmVxdWlyZWRfcHJvdmlkZXJzOiB7fSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbmZpZy5wcm92aWRlciFbdGFyZ2V0Lm5hbWVdID0ge307XG4gIGNvbmZpZy50ZXJyYWZvcm0ucmVxdWlyZWRfcHJvdmlkZXJzIVt0YXJnZXQubmFtZV0gPSB7XG4gICAgdmVyc2lvbjogdGFyZ2V0LnZlcnNpb24sXG4gICAgc291cmNlOiB0YXJnZXQuc291cmNlLFxuICB9O1xuXG4gIGxldCBwcm92aWRlclNjaGVtYTogUHJvdmlkZXJTY2hlbWEgPSB7IGZvcm1hdF92ZXJzaW9uOiBcIjAuMVwiIH07XG5cbiAgYXdhaXQgd2l0aFRlbXBEaXIoXCJmZXRjaFByb3ZpZGVyU2NoZW1hXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKG91dGRpciwgXCJtYWluLnRmLmpzb25cIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcblxuICAgIGF3YWl0IHRlcnJhZm9ybUluaXRXaXRoUmV0cnkoeyBjd2Q6IG91dGRpciB9KTtcbiAgICBwcm92aWRlclNjaGVtYSA9IEpTT04ucGFyc2UoXG4gICAgICBhd2FpdCBleGVjKHRlcnJhZm9ybUJpbmFyeU5hbWUsIFtcInByb3ZpZGVyc1wiLCBcInNjaGVtYVwiLCBcIi1qc29uXCJdLCB7XG4gICAgICAgIGN3ZDogb3V0ZGlyLFxuICAgICAgfSksXG4gICAgKSBhcyBQcm92aWRlclNjaGVtYTtcblxuICAgIGNvbnN0IHZlcnNpb25TY2hlbWEgPSBKU09OLnBhcnNlKFxuICAgICAgYXdhaXQgZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJ2ZXJzaW9uXCIsIFwiLWpzb25cIl0sIHtcbiAgICAgICAgY3dkOiBvdXRkaXIsXG4gICAgICB9KSxcbiAgICApIGFzIFZlcnNpb25TY2hlbWE7XG5cbiAgICBwcm92aWRlclNjaGVtYS5wcm92aWRlcl92ZXJzaW9ucyA9IHZlcnNpb25TY2hlbWEucHJvdmlkZXJfc2VsZWN0aW9ucztcbiAgfSk7XG5cbiAgLy8gU3RhbXAgdGhlIGZldGNoaW5nIENMSSdzIGlkZW50aXR5IHNvIGRvd25zdHJlYW0gY29uc3VtZXJzIGNhbiByZWFzb25cbiAgLy8gYWJvdXQgd2hpY2ggbmV3ZXItcHJvdG9jb2wgc2VjdGlvbnMgdGhpcyBmZXRjaCBjb3VsZCBwb3NzaWJseSBoYXZlXG4gIC8vIGVtaXR0ZWQuIE5ldmVyIGZhaWwgdGhlIGZldGNoIG92ZXIgdGhpcyAtIGl0J3MgYmVzdC1lZmZvcnQgbWV0YWRhdGEuXG4gIHRyeSB7XG4gICAgY29uc3QgY2xpID0gYXdhaXQgZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uKCk7XG4gICAgcHJvdmlkZXJTY2hlbWEuY2xpX25hbWUgPSBjbGkubmFtZTtcbiAgICBwcm92aWRlclNjaGVtYS5jbGlfdmVyc2lvbiA9IGNsaS52ZXJzaW9uO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGZldGNoaW5nIENMSSB2ZXJzaW9uIHRvIHN0YW1wIHByb3ZpZGVyIHNjaGVtYTogJHtlcnJvcn1gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gc2FuaXRpemVQcm92aWRlclNjaGVtYShwcm92aWRlclNjaGVtYSk7XG59XG5cbi8qKlxuICogV2FybnMgd2hlbiB0aGUgQ0xJIHRoYXQgcHJvZHVjZWQgYSBnaXZlbiBwcm92aWRlciBzY2hlbWEgcHJlZGF0ZXMgb25lIG9yXG4gKiBtb3JlIHNjaGVtYS1lbWlzc2lvbiBib3VuZGFyaWVzIHRoZSBwcm9qZWN0J3MgZGVjbGFyZWQgYHRhcmdldFZlcnNpb25zYFxuICogY2FyZSBhYm91dCAoc2VlIGVtaXNzaW9uLWNoZWNrLnRzKSAtIGkuZS4gc29tZSBuZXdlci1wcm90b2NvbCBzZWN0aW9uc1xuICogKGZ1bmN0aW9ucywgZXBoZW1lcmFsIHJlc291cmNlcywgLi4uKSBtYXkgYmUgbWlzc2luZyBmcm9tIHRoZSBnZW5lcmF0ZWRcbiAqIGJpbmRpbmdzIGV2ZW4gdGhvdWdoIHRoZSBzY2hlbWEgZmV0Y2ggaXRzZWxmIHN1Y2NlZWRlZC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgZGVjb3VwbGVkIGZyb20gdGhlIGZldGNoIHBhdGggKHJlYWRQcm92aWRlclNjaGVtYSkgc28gaXRcbiAqIGFsc28gcnVucyBmb3Igc2NoZW1hcyBzZXJ2ZWQgZnJvbSB0aGUgb24tZGlzayBjYWNoZTogY2FjaGVkIEpTT04gY2Fycmllc1xuICogdGhlIHNhbWUgYGNsaV9uYW1lYC9gY2xpX3ZlcnNpb25gIHN0YW1wcyBhIGZyZXNoIGZldGNoIHdvdWxkIGhhdmVcbiAqIHdyaXR0ZW4gKHRoZSBjYWNoZSBrZXkgYWxyZWFkeSBzZWdtZW50cyBieSBDTEkgcHJvZHVjdCttaW5vciksIHNvIHRoZSBnYXBcbiAqIGNoZWNrIGlzIGp1c3QgYXMgbWVhbmluZ2Z1bCBvbiBhIGNhY2hlIGhpdCBhcyBvbiBhIG1pc3MuXG4gKlxuICogTm8tb3Agd2l0aG91dCBgdGFyZ2V0VmVyc2lvbnNgIC0gdGhlcmUgaXMgbm90aGluZyB0byBjb21wYXJlIHRoZSBDTElcbiAqIGFnYWluc3QuIEZhbGxzIGJhY2sgdG8gdGhlIGN1cnJlbnQgcHJvY2VzcydzIGZldGNoaW5nIENMSSB2ZXJzaW9uIHdoZW5cbiAqIHRoZSBzY2hlbWEgaXRzZWxmIGlzbid0IHN0YW1wZWQgKGUuZy4gb2xkZXIgY2FjaGUgZW50cmllcyB3cml0dGVuIGJlZm9yZVxuICogc3RhbXBpbmcgZXhpc3RlZCkuXG4gKlxuICogQGludGVybmFsIGV4cG9zZWQgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhcm5JZlNjaGVtYUVtaXNzaW9uR2FwcyhcbiAgc2NoZW1hOiBQcm92aWRlclNjaGVtYSxcbiAgdGFyZ2V0VmVyc2lvbnM/OiBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXRhcmdldFZlcnNpb25zKSByZXR1cm47XG5cbiAgbGV0IGNsaTogVGVycmFmb3JtQ2xpVmVyc2lvbjtcbiAgaWYgKHNjaGVtYS5jbGlfbmFtZSAmJiBzY2hlbWEuY2xpX3ZlcnNpb24pIHtcbiAgICBpZiAoc2NoZW1hLmNsaV9uYW1lICE9PSBcInRlcnJhZm9ybVwiICYmIHNjaGVtYS5jbGlfbmFtZSAhPT0gXCJvcGVudG9mdVwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNsaSA9IHsgbmFtZTogc2NoZW1hLmNsaV9uYW1lLCB2ZXJzaW9uOiBzY2hlbWEuY2xpX3ZlcnNpb24gfTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgY2xpID0gYXdhaXQgZ2V0RmV0Y2hpbmdDbGlWZXJzaW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgZmV0Y2hpbmcgQ0xJIHZlcnNpb24gdG8gY2hlY2sgZm9yIHNjaGVtYSBlbWlzc2lvbiBnYXBzOiAke2Vycm9yfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGdhcEZhbWlsaWVzID0gY2hlY2tTY2hlbWFFbWlzc2lvbkdhcEZhbWlsaWVzKGNsaSwgdGFyZ2V0VmVyc2lvbnMpO1xuICBpZiAoZ2FwRmFtaWxpZXMubGVuZ3RoID4gMCAmJiBjbGkudmVyc2lvbikge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgYHByb3ZpZGVyIHNjaGVtYSBmZXRjaGVkIHdpdGggJHtjbGkubmFtZX0gJHtjbGkudmVyc2lvbn0g4oCUICR7am9pbldpdGhBbmQoXG4gICAgICAgIGdhcEZhbWlsaWVzLm1hcCgoZmFtaWx5KSA9PiBTQ0hFTUFfRU1JU1NJT05fRkFNSUxZX0xBQkVMU1tmYW1pbHldKSxcbiAgICAgICl9IHdpbGwgbm90IGJlIGdlbmVyYXRlZDsgcnVuIGNka3RuIGdldCB3aXRoICR7c3VnZ2VzdGVkRW1pdHRpbmdDbGlWZXJzaW9ucyhcbiAgICAgICAgZ2FwRmFtaWxpZXMsXG4gICAgICApfWAsXG4gICAgKTtcbiAgfVxufVxuXG4vLyBUaGUgcHJvdmlkZXJzIGhhdmUgc29tZSBwb3RlbnRpYWwgYnVncyB0aGF0IHdlIHdhbnQgdG8gcHJvLWFjdGl2ZWx5XG4vLyBmaXggaGVyZSBzbyB0aGF0IHRoZSByZXN0IG9mIHRoZSBjb2RlIGNhbiBhc3N1bWUgYSBjb25zaXN0ZW50IHNjaGVtYS5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZVByb3ZpZGVyU2NoZW1hKHNjaGVtYTogUHJvdmlkZXJTY2hlbWEpOiBQcm92aWRlclNjaGVtYSB7XG4gIC8vIE1haW5seSBzb21lIGF0dHJpYnV0ZXMgYXJlIFwiZG91YmxlZFwiLCBlLmcuIFtcImxpc3RcIiwgXCJzdHJpbmdcIiwgXCJsaXN0XCIsIFwic3RyaW5nXCJdXG4gIC8vIGluc3RlYWQgb2YgW1wibGlzdFwiLCBcInN0cmluZ1wiXVxuICBmdW5jdGlvbiBhdHRyaWJ1dGVEb3VibGluZ0ZpeChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSk6IEF0dHJpYnV0ZSB7XG4gICAgaWYgKGlzTmVzdGVkVHlwZUF0dHJpYnV0ZShhdHRyaWJ1dGUpIHx8ICFBcnJheS5pc0FycmF5KGF0dHJpYnV0ZS50eXBlKSkge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID1cbiAgICAgIGF0dHJpYnV0ZS50eXBlLmxlbmd0aCA9PT0gMlxuICAgICAgICA/IGF0dHJpYnV0ZS50eXBlXG4gICAgICAgIDogKGF0dHJpYnV0ZS50eXBlIGFzIHN0cmluZ1tdKS5zbGljZSgwLCAyKTsgLy8gVGhlIHR5cGVzIHRlbGwgdXMgdGhpcyBjYW4ndCBoYXBwZW4sIHJlYWxpdHkgYmVncyB0byBkaWZmZXJcblxuICAgIGF0dHJpYnV0ZS50eXBlID0gdHlwZSBhcyBBdHRyaWJ1dGVUeXBlO1xuICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gIH1cblxuICAvLyBNdXRhdGVzIGJsb2NrIHdpdGggdGhlIGZpeFxuICBmdW5jdGlvbiBzYW5pdGl6ZUJsb2NrKGJsb2NrOiBCbG9jaykge1xuICAgIE9iamVjdC52YWx1ZXMoYmxvY2suYXR0cmlidXRlcyB8fCB7fSkuZm9yRWFjaChhdHRyaWJ1dGVEb3VibGluZ0ZpeCk7XG4gICAgT2JqZWN0LnZhbHVlcyhibG9jay5ibG9ja190eXBlcyB8fCB7fSkuZm9yRWFjaCgoYmxvY2tUeXBlKSA9PiB7XG4gICAgICBzYW5pdGl6ZUJsb2NrKGJsb2NrVHlwZS5ibG9jayk7XG4gICAgfSk7XG4gIH1cblxuICBPYmplY3QudmFsdWVzKHNjaGVtYS5wcm92aWRlcl9zY2hlbWFzIHx8IHt9KS5mb3JFYWNoKChwcm92aWRlcikgPT4ge1xuICAgIGNvbnN0IGVudGl0aWVzID0gW1xuICAgICAgcHJvdmlkZXIucHJvdmlkZXIsXG4gICAgICAuLi5PYmplY3QudmFsdWVzKHByb3ZpZGVyLnJlc291cmNlX3NjaGVtYXMgfHwge30pLFxuICAgICAgLi4uT2JqZWN0LnZhbHVlcyhwcm92aWRlci5kYXRhX3NvdXJjZV9zY2hlbWFzIHx8IHt9KSxcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMocHJvdmlkZXIuZXBoZW1lcmFsX3Jlc291cmNlX3NjaGVtYXMgfHwge30pLFxuICAgIF07XG5cbiAgICBlbnRpdGllcy5mb3JFYWNoKChlbnRpdHkpID0+IHtcbiAgICAgIHNhbml0aXplQmxvY2soZW50aXR5LmJsb2NrKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHNjaGVtYTtcbn1cblxuLyoqXG4gKiBBIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb24gdGhhdCBhIG1vZHVsZSBleHBlY3RzIHRvIGJlIGhhbmRlZCBieSBpdHMgY2FsbGVyLFxuICogZGVjbGFyZWQgYXMgYGNvbmZpZ3VyYXRpb25fYWxpYXNlc2AgaW4gdGhlIG1vZHVsZSdzIGByZXF1aXJlZF9wcm92aWRlcnNgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZVByb3ZpZGVyQWxpYXMge1xuICAvKiogbG9jYWwgbmFtZSB0aGUgbW9kdWxlIGtub3dzIHRoZSBwcm92aWRlciBieSwgZS5nLiBgYXdzYCAqL1xuICBsb2NhbE5hbWU6IHN0cmluZztcbiAgLyoqIGFsaWFzIHBhcnQgb2YgdGhlIHJlZmVyZW5jZSwgZS5nLiBgZ2xvYmFsX3JlZ2lvbmAgKi9cbiAgYWxpYXM6IHN0cmluZztcbiAgLyoqIHByb3ZpZGVyIHNvdXJjZSB0aGUgbW9kdWxlIGRlY2xhcmVkIGZvciBgbG9jYWxOYW1lYCwgaWYgaXQgZGVjbGFyZWQgb25lICovXG4gIHNvdXJjZT86IHN0cmluZztcbn1cblxuY29uc3QgQ09ORklHVVJBVElPTl9BTElBUyA9IC9eKFtcXHctXSspXFwuKFtcXHctXSspJC87XG5cbi8vIGhjbDJqc29uIGhhbmRzIEhDTCBleHByZXNzaW9ucyBiYWNrIGFzIGludGVycG9sYXRpb25zLCBzbyBhXG4vLyBgY29uZmlndXJhdGlvbl9hbGlhc2VzID0gW2F3cy5nbG9iYWxfcmVnaW9uXWAgZW50cnkgYXJyaXZlcyBhcyB0aGUgc3RyaW5nXG4vLyBcIiR7YXdzLmdsb2JhbF9yZWdpb259XCIuIEEgLnRmLmpzb24gbW9kdWxlIHdyaXRlcyB0aGUgc2FtZSByZWZlcmVuY2UgYXMgYVxuLy8gcGxhaW4gc3RyaW5nLCB3aGljaCBoY2wyanNvbiBwYXNzZXMgdGhyb3VnaCB1bnRvdWNoZWQuXG5jb25zdCB1bndyYXBJbnRlcnBvbGF0aW9uID0gKHZhbHVlOiBzdHJpbmcpID0+XG4gIHZhbHVlLnN0YXJ0c1dpdGgoXCIke1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIn1cIikgPyB2YWx1ZS5zbGljZSgyLCAtMSkgOiB2YWx1ZTtcblxuY29uc3QgdG9BcnJheSA9IDxUPihpdGVtOiBUIHwgVFtdIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFRbXSA9PiB7XG4gIGlmIChpdGVtID09PSB1bmRlZmluZWQgfHwgaXRlbSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpdGVtKSA/IGl0ZW0gOiBbaXRlbV07XG59O1xuXG4vKipcbiAqIEV2ZXJ5IG9jY3VycmVuY2Ugb2YgYSBibG9jayB0aGF0IGhjbDJqc29uIHByb2R1Y2VkIHVuZGVyIG9uZSBrZXkuXG4gKlxuICogSENMIGJsb2NrcyBjb21lIGJhY2sgYXMgYW4gYXJyYXkgd2l0aCBhbiBlbnRyeSBwZXIgb2NjdXJyZW5jZSwgYSAudGYuanNvblxuICogYmxvY2sgYXMgYSBwbGFpbiBvYmplY3QuIEEgbW9kdWxlIG1peGluZyBib3RoIHN5bnRheGVzIGdldHMgYSB0aGlyZCBzaGFwZTpcbiAqIGhjbDJqc29uIG1lcmdlcyB0aGUgSlNPTiBmaWxlIGludG8gdGhlIHBhcnNlZCBIQ0wsIGFuZCBpdHMgZGVlcE1lcmdlXG4gKiByZWN1cnNlcyBpbnRvIHRoZSBIQ0wgYXJyYXkgaW5zdGVhZCBvZiBhcHBlbmRpbmcgdG8gaXQsIGxlYXZpbmcgdGhlIEpTT05cbiAqIGNvbnRyaWJ1dGlvbiBoYW5naW5nIG9mZiB0aGUgYXJyYXkgYXMgbmFtZWQgcHJvcGVydGllcy4gVGhvc2UgcHJvcGVydGllc1xuICogYXJlIGFuIG9jY3VycmVuY2Ugb2YgdGhlaXIgb3duIC0gYW5kIG9uZSB0aGF0IG5laXRoZXIgaXRlcmF0aW5nIHRoZSBhcnJheVxuICogbm9yIEpTT04uc3RyaW5naWZ5IHdvdWxkIGV2ZXIgc2hvdy5cbiAqL1xuY29uc3QgYmxvY2tPY2N1cnJlbmNlcyA9IChibG9jazogYW55KTogYW55W10gPT4ge1xuICBpZiAoYmxvY2sgPT09IHVuZGVmaW5lZCB8fCBibG9jayA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYmxvY2spKSByZXR1cm4gW2Jsb2NrXTtcblxuICBjb25zdCBtZXJnZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoYmxvY2spLmZpbHRlcigoW2tleV0pID0+ICEvXlxcZCskLy50ZXN0KGtleSkpLFxuICApO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA+IDAgPyBbLi4uYmxvY2ssIG1lcmdlZF0gOiBbLi4uYmxvY2tdO1xufTtcblxuLyoqXG4gKiBDb2xsZWN0cyB0aGUgcHJvdmlkZXIgY29uZmlndXJhdGlvbnMgYSBtb2R1bGUgcmVxdWlyZXMgaXRzIGNhbGxlciB0byBwYXNzXG4gKiBpbiwgZnJvbSB0aGUgaGNsMmpzb24gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZHVsZSdzIGRpcmVjdG9yeS5cbiAqXG4gKiBBIG1vZHVsZSBtYXkgZGVjbGFyZSBgcmVxdWlyZWRfcHJvdmlkZXJzYCBpbiBtb3JlIHRoYW4gb25lIGB0ZXJyYWZvcm1gXG4gKiBibG9jaywgYW5kIG1heSBzcHJlYWQgdGhlbSBhY3Jvc3MgLnRmIGFuZCAudGYuanNvbiBmaWxlczsgZXZlcnkgb2NjdXJyZW5jZVxuICogaGNsMmpzb24gcmVwb3J0cyBpcyBjb25zaWRlcmVkIChzZWUge0BsaW5rIGJsb2NrT2NjdXJyZW5jZXN9KS5cbiAqXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdE1vZHVsZVByb3ZpZGVyQWxpYXNlcyhcbiAgcGFyc2VkTW9kdWxlOiBhbnksXG4pOiBNb2R1bGVQcm92aWRlckFsaWFzW10ge1xuICBjb25zdCBhbGlhc2VzOiBNb2R1bGVQcm92aWRlckFsaWFzW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgdGVycmFmb3JtQmxvY2sgb2YgYmxvY2tPY2N1cnJlbmNlcyhwYXJzZWRNb2R1bGU/LnRlcnJhZm9ybSkpIHtcbiAgICBmb3IgKGNvbnN0IHJlcXVpcmVkUHJvdmlkZXJzIG9mIGJsb2NrT2NjdXJyZW5jZXMoXG4gICAgICB0ZXJyYWZvcm1CbG9jaz8ucmVxdWlyZWRfcHJvdmlkZXJzLFxuICAgICkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgT2JqZWN0LnZhbHVlcyhyZXF1aXJlZFByb3ZpZGVycyB8fCB7fSkpIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSB1bndyYXBJZkFycmF5KGRlY2xhcmF0aW9uIGFzIGFueSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0b0FycmF5KHByb3ZpZGVyPy5jb25maWd1cmF0aW9uX2FsaWFzZXMpKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSBDT05GSUdVUkFUSU9OX0FMSUFTLmV4ZWMoXG4gICAgICAgICAgICB1bndyYXBJbnRlcnBvbGF0aW9uKFN0cmluZyhlbnRyeSkpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBbLCBsb2NhbE5hbWUsIGFsaWFzXSA9IG1hdGNoO1xuICAgICAgICAgIGNvbnN0IGtleSA9IGAke2xvY2FsTmFtZX0uJHthbGlhc31gO1xuICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICBzZWVuLmFkZChrZXkpO1xuXG4gICAgICAgICAgYWxpYXNlcy5wdXNoKHsgbG9jYWxOYW1lLCBhbGlhcywgc291cmNlOiBwcm92aWRlcj8uc291cmNlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFsaWFzZXM7XG59XG5cbi8qKlxuICogRGVjbGFyZXMgdGhlIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb25zIHRoYXQgYGFsaWFzZXNgIG5hbWVzIG9uIHRoZSBzeW50aGV0aWNcbiAqIHJvb3QgY29uZmlnIGFuZCBwYXNzZXMgdGhlbSBpbnRvIHRoZSBtb2R1bGUgY2FsbCwgd2hpY2ggaXMgd2hhdCBUZXJyYWZvcm1cbiAqIGRlbWFuZHMgb2YgYW55b25lIGNhbGxpbmcgYSBtb2R1bGUgd2l0aCBgY29uZmlndXJhdGlvbl9hbGlhc2VzYC5cbiAqXG4gKiBUaGUgYWxpYXMgYmxvY2tzIHN0YXkgZW1wdHk6IGB0ZXJyYWZvcm0gZ2V0YCBvbmx5IGJ1aWxkcyB0aGUgY29uZmlndXJhdGlvblxuICogdHJlZSwgaXQgbmV2ZXIgY29uZmlndXJlcyBvciBpbnN0YWxscyBhIHByb3ZpZGVyLiBTb3VyY2VzIGFyZSBtaXJyb3JlZCBmcm9tXG4gKiB0aGUgbW9kdWxlJ3Mgb3duIGByZXF1aXJlZF9wcm92aWRlcnNgIHNvIGEgbW9kdWxlIHJlZmVycmluZyB0bywgc2F5LFxuICogaGFzaGljb3JwL2F3cyB1bmRlciBhIG5vbi1kZWZhdWx0IGxvY2FsIG5hbWUgc3RpbGwgcmVzb2x2ZXMgdG8gdGhlIHNhbWVcbiAqIHByb3ZpZGVyIGluIHRoZSByb290LlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vZHVsZVByb3ZpZGVyQWxpYXNlcyhcbiAgY29uZmlnOiBUZXJyYWZvcm1Db25maWcsXG4gIG1vZHVsZUtleTogc3RyaW5nLFxuICBhbGlhc2VzOiBNb2R1bGVQcm92aWRlckFsaWFzW10sXG4pOiBUZXJyYWZvcm1Db25maWcge1xuICBjb25zdCBtb2R1bGVDYWxsID0gY29uZmlnLm1vZHVsZT8uW21vZHVsZUtleV07XG4gIGlmICghbW9kdWxlQ2FsbCB8fCBhbGlhc2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbmZpZztcblxuICBmb3IgKGNvbnN0IHsgbG9jYWxOYW1lLCBhbGlhcywgc291cmNlIH0gb2YgYWxpYXNlcykge1xuICAgIGlmIChzb3VyY2UpIHtcbiAgICAgIGNvbmZpZy50ZXJyYWZvcm0ucmVxdWlyZWRfcHJvdmlkZXJzID0ge1xuICAgICAgICAuLi5jb25maWcudGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycyxcbiAgICAgICAgW2xvY2FsTmFtZV06IHsgc291cmNlIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbmZpZy5wcm92aWRlciA9IGNvbmZpZy5wcm92aWRlciB8fCB7fTtcbiAgICBjb25zdCBibG9ja3MgPSB0b0FycmF5KGNvbmZpZy5wcm92aWRlcltsb2NhbE5hbWVdKTtcbiAgICBpZiAoIWJsb2Nrcy5zb21lKChibG9jaykgPT4gYmxvY2suYWxpYXMgPT09IGFsaWFzKSkge1xuICAgICAgYmxvY2tzLnB1c2goeyBhbGlhcyB9KTtcbiAgICB9XG4gICAgY29uZmlnLnByb3ZpZGVyW2xvY2FsTmFtZV0gPSBibG9ja3M7XG5cbiAgICBtb2R1bGVDYWxsLnByb3ZpZGVycyA9IHtcbiAgICAgIC4uLm1vZHVsZUNhbGwucHJvdmlkZXJzLFxuICAgICAgW2Ake2xvY2FsTmFtZX0uJHthbGlhc31gXTogYCR7bG9jYWxOYW1lfS4ke2FsaWFzfWAsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG5cbi8qKlxuICogVGhlIGAvL3N1YmRpcmAgcG9ydGlvbiBvZiBhIG1vZHVsZSBzb3VyY2UsIGlmIGl0IGhhcyBvbmUsIG1pcnJvcmluZyBob3dcbiAqIFRlcnJhZm9ybSB1bnBhY2tzIGEgcGFja2FnZSBpbnRvIGAudGVycmFmb3JtL21vZHVsZXMvPGtleT4vPHN1YmRpcj5gLlxuICpcbiAqIEBpbnRlcm5hbCBleHBvc2VkIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWNrYWdlU3ViZGlyKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgW3dpdGhvdXRRdWVyeV0gPSBzb3VyY2Uuc3BsaXQoXCI/XCIpO1xuICBjb25zdCB3aXRob3V0R2V0dGVyUHJlZml4ID0gd2l0aG91dFF1ZXJ5LnJlcGxhY2UoL15bQS1aYS16MC05XSs6Oi8sIFwiXCIpO1xuICBjb25zdCB3aXRob3V0U2NoZW1lID0gd2l0aG91dEdldHRlclByZWZpeC5yZXBsYWNlKFxuICAgIC9eW0EtWmEtel1bQS1aYS16MC05Ky4tXSo6XFwvXFwvKy8sXG4gICAgXCJcIixcbiAgKTtcblxuICBjb25zdCBbLCAuLi5yZXN0XSA9IHdpdGhvdXRTY2hlbWUuc3BsaXQoXCIvL1wiKTtcbiAgY29uc3Qgc3ViZGlyID0gcmVzdC5qb2luKFwiLy9cIikucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gIHJldHVybiBzdWJkaXIgfHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdoZXJlIHRoZSBtb2R1bGUgVGVycmFmb3JtIGp1c3QgZmV0Y2hlZCBlbmRlZCB1cCBvbiBkaXNrLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBpcyB0aGUgYXV0aG9yaXR5LCBidXQgYSBgdGVycmFmb3JtIGdldGAgdGhhdCBpbnN0YWxsZWQgdGhlXG4gKiBtb2R1bGUgYW5kIHRoZW4gZmFpbGVkIHRvIHZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIGFyb3VuZCBpdCBsZWF2ZXMgbm9cbiAqIG1hbmlmZXN0IGJlaGluZCAtIHNvIGZhbGwgYmFjayB0byB0aGUgbG9jYXRpb25zIFRlcnJhZm9ybSBpbnN0YWxscyBpbnRvOlxuICogbG9jYWwgbW9kdWxlcyBhcmUgcmVhZCB3aGVyZSB0aGV5IGFyZSwgcmVtb3RlIHBhY2thZ2VzIGFyZSB1bnBhY2tlZCBpbnRvXG4gKiBgLnRlcnJhZm9ybS9tb2R1bGVzLzxrZXk+YC5cbiAqXG4gKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hlZE1vZHVsZURpcihcbiAgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nLFxuICBtb2R1bGVLZXk6IHN0cmluZyxcbiAgc291cmNlOiBzdHJpbmcsXG4gIGxvY2FsU291cmNlQWJzb2x1dGVQYXRoPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5qb2luKFxuICAgIHdvcmtpbmdEaXJlY3RvcnksXG4gICAgXCIudGVycmFmb3JtXCIsXG4gICAgXCJtb2R1bGVzXCIsXG4gICAgXCJtb2R1bGVzLmpzb25cIixcbiAgKTtcblxuICBpZiAoZnMuZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpKSB7XG4gICAgY29uc3QgbW9kdWxlSW5kZXggPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgXCJ1dGYtOFwiKSxcbiAgICApIGFzIE1vZHVsZUluZGV4O1xuICAgIGNvbnN0IHJlY29yZCA9IG1vZHVsZUluZGV4Lk1vZHVsZXMuZmluZCgobW9kKSA9PiBtb2QuS2V5ID09PSBtb2R1bGVLZXkpO1xuXG4gICAgaWYgKHJlY29yZCkge1xuICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh3b3JraW5nRGlyZWN0b3J5LCByZWNvcmQuRGlyKTtcbiAgICB9XG4gIH1cblxuICBpZiAobG9jYWxTb3VyY2VBYnNvbHV0ZVBhdGgpIHtcbiAgICByZXR1cm4gbG9jYWxTb3VyY2VBYnNvbHV0ZVBhdGg7XG4gIH1cblxuICByZXR1cm4gcGF0aC5qb2luKFxuICAgIHdvcmtpbmdEaXJlY3RvcnksXG4gICAgXCIudGVycmFmb3JtXCIsXG4gICAgXCJtb2R1bGVzXCIsXG4gICAgbW9kdWxlS2V5LFxuICAgIHBhY2thZ2VTdWJkaXIoc291cmNlKSB8fCBcIlwiLFxuICApO1xufVxuXG4vKipcbiAqIFJ1bnMgYHRlcnJhZm9ybSBnZXRgIGFuZCBoYW5kcyB0aGUgZmFpbHVyZSBiYWNrIGluc3RlYWQgb2YgdGhyb3dpbmcgaXQuXG4gKlxuICogSXRzIGRpYWdub3N0aWNzIGFyZSBub3QgZmluYWwgKHNlZSB7QGxpbmsgcmVhZE1vZHVsZVNjaGVtYX0pLCBzbyB0aGV5IGdvIHRvXG4gKiB0aGUgZGVidWcgbG9nIHJhdGhlciB0aGFuIHRoZSB0ZXJtaW5hbDsgdGhlIHJldHVybmVkIGVycm9yIHN0aWxsIGNhcnJpZXNcbiAqIHRoZW0gb24gaXRzIGBzdGRlcnJgIGZvciBjYWxsZXJzIHRoYXQgZW5kIHVwIHJldGhyb3dpbmcgaXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRyeVRlcnJhZm9ybUdldChvdXRkaXI6IHN0cmluZyk6IFByb21pc2U8RXJyb3IgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKFxuICAgICAgdGVycmFmb3JtQmluYXJ5TmFtZSxcbiAgICAgIFtcImdldFwiXSxcbiAgICAgIHsgY3dkOiBvdXRkaXIsIGxvZ1N0ZGVyckFzRGVidWc6IHRydWUgfSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE1vZHVsZVNjaGVtYSh0YXJnZXQ6IENvbnN0cnVjdHNNYWtlck1vZHVsZVRhcmdldCkge1xuICBsZXQgbW9kdWxlU2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBNb2R1bGVTY2hlbWE+ID0ge307XG5cbiAgYXdhaXQgd2l0aFRlbXBEaXIoXCJmZXRjaFNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnOiBUZXJyYWZvcm1Db25maWcgPSB7XG4gICAgICB0ZXJyYWZvcm06IHt9LFxuICAgIH07XG5cbiAgICBpZiAoIWNvbmZpZy5tb2R1bGUpIGNvbmZpZy5tb2R1bGUgPSB7fTtcbiAgICBsZXQgc291cmNlOiBzdHJpbmcgPSB0YXJnZXQuc291cmNlO1xuXG4gICAgY29uc3QgbG9jYWxTb3VyY2UgPSAodGFyZ2V0LmNvbnN0cmFpbnQgYXMgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludClcbiAgICAgIC5sb2NhbFNvdXJjZUFic29sdXRlUGF0aDtcbiAgICBpZiAobG9jYWxTb3VyY2UpIHtcbiAgICAgIC8vIGNyZWF0ZSByZWxhdGl2ZSBwYXRoIHRvIG1vZHVsZSBpbiB0aGUgdXNlciBwcm9qZWN0XG4gICAgICBzb3VyY2UgPSBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGxvY2FsU291cmNlKTtcbiAgICB9XG5cbiAgICBjb25maWcubW9kdWxlW3RhcmdldC5tb2R1bGVLZXldID0geyBzb3VyY2U6IHNvdXJjZSB9O1xuICAgIGlmICh0YXJnZXQudmVyc2lvbikge1xuICAgICAgY29uZmlnLm1vZHVsZVt0YXJnZXQubW9kdWxlS2V5XVtcInZlcnNpb25cIl0gPSB0YXJnZXQudmVyc2lvbjtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKG91dGRpciwgXCJtYWluLnRmLmpzb25cIik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcblxuICAgIC8vIGB0ZXJyYWZvcm0gZ2V0YCBpcyBib3RoIG91ciBkb3dubG9hZGVyIGFuZCBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGVcbiAgICAvLyBzeW50aGV0aWMgcm9vdCBjb25maWcgd3JhcHBlZCBhcm91bmQgdGhlIG1vZHVsZS4gQSBtb2R1bGUgZGVjbGFyaW5nXG4gICAgLy8gYGNvbmZpZ3VyYXRpb25fYWxpYXNlc2AgY2Fubm90IHZhbGlkYXRlIHVudGlsIHRoZSByb290IHBhc3NlcyB0aG9zZVxuICAgIC8vIGNvbmZpZ3VyYXRpb25zIGluLCBhbmQgdGhlaXIgbmFtZXMgYXJlIG9ubHkga25vd2FibGUgb25jZSB0aGUgbW9kdWxlIGlzXG4gICAgLy8gb24gZGlzayAtIHNvIHRoaXMgZmlyc3QgcnVuIGlzIGEgZmV0Y2ggd2UgZGVmZXIganVkZ2VtZW50IG9uLiBUZXJyYWZvcm1cbiAgICAvLyBpbnN0YWxscyB0aGUgbW9kdWxlIGVpdGhlciB3YXk7IHNpbmNlIDEuMTUgaXQganVzdCBzdG9wcyBzaG9ydCBvZlxuICAgIC8vIHdyaXRpbmcgdGhlIG1vZHVsZSBtYW5pZmVzdCB3aGVuIHZhbGlkYXRpb24gZmFpbHMgKHRlcnJhZm9ybSMzODIxN1xuICAgIC8vIGRyb3BwZWQgdGhlIGVycm9yLXRvLXdhcm5pbmcgZG93bmdyYWRlIHRoYXQgYHRlcnJhZm9ybSBnZXRgIHVzZWQgdG9cbiAgICAvLyBhcHBseSksIHdoaWNoIGlzIHdoYXQgdGhlIHNlY29uZCBydW4gYmVsb3cgcmVzdG9yZXMuXG4gICAgY29uc3QgZmV0Y2hFcnJvciA9IGF3YWl0IHRyeVRlcnJhZm9ybUdldChvdXRkaXIpO1xuXG4gICAgY29uc3QgbW9kdWxlRGlyID0gZmV0Y2hlZE1vZHVsZURpcihcbiAgICAgIG91dGRpcixcbiAgICAgIHRhcmdldC5tb2R1bGVLZXksXG4gICAgICBzb3VyY2UsXG4gICAgICBsb2NhbFNvdXJjZSxcbiAgICApO1xuICAgIGNvbnN0IGFsaWFzZXMgPSBmcy5leGlzdHNTeW5jKG1vZHVsZURpcilcbiAgICAgID8gY29sbGVjdE1vZHVsZVByb3ZpZGVyQWxpYXNlcyhhd2FpdCBjb252ZXJ0RmlsZXMobW9kdWxlRGlyKSlcbiAgICAgIDogW107XG5cbiAgICBpZiAoYWxpYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBhcHBseU1vZHVsZVByb3ZpZGVyQWxpYXNlcyhjb25maWcsIHRhcmdldC5tb2R1bGVLZXksIGFsaWFzZXMpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcbiAgICAgIGF3YWl0IGV4ZWModGVycmFmb3JtQmluYXJ5TmFtZSwgW1wiZ2V0XCJdLCB7IGN3ZDogb3V0ZGlyIH0pO1xuICAgIH0gZWxzZSBpZiAoZmV0Y2hFcnJvcikge1xuICAgICAgLy8gbm90aGluZyBoZXJlIHdhcyBzYWx2YWdlYWJsZSBhZnRlciBhbGwsIHNvIHJlcG9ydCB0aGUgZGlhZ25vc3RpY3MgdGhhdFxuICAgICAgLy8gd2VyZSBoZWxkIGJhY2sgd2hpbGUgdGhlIGZldGNoIHN0aWxsIGhhZCBhIHNlY29uZCBjaGFuY2VcbiAgICAgIGxvZ2dlci5lcnJvcigoZmV0Y2hFcnJvciBhcyBhbnkpLnN0ZGVyciB8fCBTdHJpbmcoZmV0Y2hFcnJvcikpO1xuICAgICAgdGhyb3cgZmV0Y2hFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLm1vZHVsZSkge1xuICAgICAgbW9kdWxlU2NoZW1hID0gYXdhaXQgaGFydmVzdE1vZHVsZVNjaGVtYShcbiAgICAgICAgb3V0ZGlyLFxuICAgICAgICBPYmplY3Qua2V5cyhjb25maWcubW9kdWxlKSxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gbW9kdWxlU2NoZW1hO1xufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cdktn/provider-schema",
3
- "version": "0.25.0-pre.4",
3
+ "version": "0.25.0-pre.6",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -32,8 +32,8 @@
32
32
  "deepmerge": "4.3.1",
33
33
  "fs-extra": "11.3.6",
34
34
  "semver": "7.8.5",
35
- "@cdktn/commons": "0.25.0-pre.4",
36
- "@cdktn/hcl2json": "0.25.0-pre.4"
35
+ "@cdktn/commons": "0.25.0-pre.6",
36
+ "@cdktn/hcl2json": "0.25.0-pre.6"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/fs-extra": "11.0.4",
@@ -30,6 +30,29 @@ exports[`readSchema generates a local json module 1`] = `
30
30
  }"
31
31
  `;
32
32
 
33
+ exports[`readSchema generates a local json module that requires provider configuration aliases 1`] = `
34
+ "{
35
+ "format_version": "STUBBED VERSION",
36
+ "local_module": {
37
+ "inputs": [
38
+ {
39
+ "default": "module",
40
+ "description": "Name of the DigitalOcean static site",
41
+ "name": "name",
42
+ "required": false,
43
+ "type": "any"
44
+ }
45
+ ],
46
+ "name": "local_module",
47
+ "outputs": [
48
+ {
49
+ "name": "uri"
50
+ }
51
+ ]
52
+ }
53
+ }"
54
+ `;
55
+
33
56
  exports[`readSchema generates a local module 1`] = `
34
57
  "{
35
58
  "format_version": "STUBBED VERSION",
@@ -68,6 +91,52 @@ exports[`readSchema generates a local module 1`] = `
68
91
  }"
69
92
  `;
70
93
 
94
+ exports[`readSchema generates a local module that declares provider configuration aliases across .tf and .tf.json files 1`] = `
95
+ "{
96
+ "format_version": "STUBBED VERSION",
97
+ "local_module": {
98
+ "inputs": [
99
+ {
100
+ "description": "Name of the s3 bucket. Must be unique.",
101
+ "name": "bucket_name",
102
+ "required": true,
103
+ "type": "string"
104
+ }
105
+ ],
106
+ "name": "local_module",
107
+ "outputs": [
108
+ {
109
+ "description": "ARN of the bucket",
110
+ "name": "arn"
111
+ }
112
+ ]
113
+ }
114
+ }"
115
+ `;
116
+
117
+ exports[`readSchema generates a local module that requires provider configuration aliases 1`] = `
118
+ "{
119
+ "format_version": "STUBBED VERSION",
120
+ "local_module": {
121
+ "inputs": [
122
+ {
123
+ "description": "Name of the s3 bucket. Must be unique.",
124
+ "name": "bucket_name",
125
+ "required": true,
126
+ "type": "string"
127
+ }
128
+ ],
129
+ "name": "local_module",
130
+ "outputs": [
131
+ {
132
+ "description": "ARN of the bucket",
133
+ "name": "arn"
134
+ }
135
+ ]
136
+ }
137
+ }"
138
+ `;
139
+
71
140
  exports[`readSchema generates a local module with inline comments in type constraints 1`] = `
72
141
  "{
73
142
  "format_version": "STUBBED VERSION",
@@ -0,0 +1,21 @@
1
+ {
2
+ "terraform": {
3
+ "required_providers": {
4
+ "null": {
5
+ "source": "hashicorp/null",
6
+ "configuration_aliases": ["null.extra"]
7
+ }
8
+ }
9
+ },
10
+ "variable": {
11
+ "name": {
12
+ "default": "module",
13
+ "description": "Name of the DigitalOcean static site"
14
+ }
15
+ },
16
+ "output": {
17
+ "uri": {
18
+ "value": "${digitalocean_app.static_site}"
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "terraform": {
3
+ "required_providers": {
4
+ "null": {
5
+ "source": "hashicorp/null",
6
+ "configuration_aliases": ["null.extra"]
7
+ }
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,22 @@
1
+ # Copyright (c) HashiCorp, Inc.
2
+ # SPDX-License-Identifier: MPL-2.0
3
+
4
+ # One half of a module that spreads its terraform settings across .tf and
5
+ # .tf.json files. Terraform allows several terraform blocks but only one
6
+ # required_providers configuration, so the provider requirements live in the
7
+ # .tf.json half - which hcl2json merges into a shape that hides them from a
8
+ # plain walk over the parsed terraform blocks.
9
+
10
+ terraform {
11
+ required_version = ">= 1.0"
12
+ }
13
+
14
+ variable "bucket_name" {
15
+ description = "Name of the s3 bucket. Must be unique."
16
+ type = string
17
+ }
18
+
19
+ output "arn" {
20
+ description = "ARN of the bucket"
21
+ value = aws_s3_bucket.s3_bucket.arn
22
+ }
@@ -0,0 +1,24 @@
1
+ # Copyright (c) HashiCorp, Inc.
2
+ # SPDX-License-Identifier: MPL-2.0
3
+
4
+ # A module that expects its caller to hand it extra provider configurations,
5
+ # the way multi-region AWS modules do.
6
+
7
+ terraform {
8
+ required_providers {
9
+ aws = {
10
+ source = "hashicorp/aws"
11
+ configuration_aliases = [aws.global_region, aws.secondary_region]
12
+ }
13
+ }
14
+ }
15
+
16
+ variable "bucket_name" {
17
+ description = "Name of the s3 bucket. Must be unique."
18
+ type = string
19
+ }
20
+
21
+ output "arn" {
22
+ description = "ARN of the bucket"
23
+ value = aws_s3_bucket.s3_bucket.arn
24
+ }