@cdktn/provider-generator 0.25.0-pre.17 → 0.25.0-pre.20

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider-functions-name-collision.test.d.ts.map
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ // Copyright (c) HashiCorp, Inc
37
+ // SPDX-License-Identifier: MPL-2.0
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const codemaker_1 = require("codemaker");
41
+ const provider_generator_1 = require("../../generator/provider-generator");
42
+ const resource_parser_1 = require("../../generator/resource-parser");
43
+ const util_1 = require("../util");
44
+ const tmp = (0, util_1.createTmpHelper)();
45
+ // A provider declaring provider-defined functions emits them to
46
+ // providers/<provider>/provider-functions/index.ts. A resource named
47
+ // <provider>_provider_functions maps to that same directory, so without a
48
+ // guard the resource overwrites the functions wrapper and the provider index
49
+ // exports the name twice.
50
+ describe("resource named like the provider functions submodule", () => {
51
+ let workdir;
52
+ beforeAll(async () => {
53
+ const code = new codemaker_1.CodeMaker();
54
+ workdir = tmp("provider-functions-name-collision.test");
55
+ const spec = JSON.parse(fs.readFileSync(path.join(__dirname, "fixtures", "provider-functions-name-collision.test.fixture.json"), "utf-8"));
56
+ new provider_generator_1.TerraformProviderGenerator(code, spec).generateAll();
57
+ await code.save(workdir);
58
+ });
59
+ const read = (relPath) => fs.readFileSync(path.join(workdir, relPath), "utf-8");
60
+ test("the functions submodule holds the functions wrapper, not the resource", () => {
61
+ const output = read("providers/example/provider-functions/index.ts");
62
+ expect(output).toContain("class ExampleProviderFunctions");
63
+ expect(output).not.toContain("cdktn.TerraformResource");
64
+ });
65
+ test("the resource is emitted to its own directory", () => {
66
+ const output = read("providers/example/provider-functions-resource/index.ts");
67
+ expect(output).toContain("class ProviderFunctionsResource");
68
+ expect(output).toContain("cdktn.TerraformResource");
69
+ });
70
+ test("the provider index exports both, without duplicate names", () => {
71
+ const index = read("providers/example/index.ts");
72
+ expect(index).toContain("export * as providerFunctions from './provider-functions/index';");
73
+ expect(index).toContain("export * as providerFunctionsResource from './provider-functions-resource/index';");
74
+ const exportedNames = [...index.matchAll(/export \* as (\w+) from/g)].map((m) => m[1]);
75
+ expect(new Set(exportedNames).size).toBe(exportedNames.length);
76
+ });
77
+ });
78
+ describe("sanitizeClassOrNamespaceName", () => {
79
+ test("suffixes a resource named provider_functions", () => {
80
+ expect((0, resource_parser_1.sanitizeClassOrNamespaceName)("provider_functions")).toBe("provider_functions_resource");
81
+ });
82
+ test("still suffixes a resource named provider", () => {
83
+ expect((0, resource_parser_1.sanitizeClassOrNamespaceName)("provider")).toBe("provider_resource");
84
+ });
85
+ test("leaves an unrelated resource name alone", () => {
86
+ expect((0, resource_parser_1.sanitizeClassOrNamespaceName)("function_app")).toBe("function_app");
87
+ });
88
+ });
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItZnVuY3Rpb25zLW5hbWUtY29sbGlzaW9uLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ2V0L19fdGVzdHNfXy9nZW5lcmF0b3IvcHJvdmlkZXItZnVuY3Rpb25zLW5hbWUtY29sbGlzaW9uLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IseUNBQXNDO0FBQ3RDLDJFQUFnRjtBQUNoRixxRUFBK0U7QUFDL0Usa0NBQTBDO0FBRTFDLE1BQU0sR0FBRyxHQUFHLElBQUEsc0JBQWUsR0FBRSxDQUFDO0FBRTlCLGdFQUFnRTtBQUNoRSxxRUFBcUU7QUFDckUsMEVBQTBFO0FBQzFFLDZFQUE2RTtBQUM3RSwwQkFBMEI7QUFDMUIsUUFBUSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtJQUNwRSxJQUFJLE9BQWUsQ0FBQztJQUVwQixTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUM7UUFDN0IsT0FBTyxHQUFHLEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQ3JCLEVBQUUsQ0FBQyxZQUFZLENBQ2IsSUFBSSxDQUFDLElBQUksQ0FDUCxTQUFTLEVBQ1QsVUFBVSxFQUNWLHFEQUFxRCxDQUN0RCxFQUNELE9BQU8sQ0FDUixDQUNGLENBQUM7UUFDRixJQUFJLCtDQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6RCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLElBQUksR0FBRyxDQUFDLE9BQWUsRUFBRSxFQUFFLENBQy9CLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFeEQsSUFBSSxDQUFDLHVFQUF1RSxFQUFFLEdBQUcsRUFBRTtRQUNqRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNyRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7UUFDeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUNqQix3REFBd0QsQ0FDekQsQ0FBQztRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsMERBQTBELEVBQUUsR0FBRyxFQUFFO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQ3JCLGtFQUFrRSxDQUNuRSxDQUFDO1FBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FDckIsbUZBQW1GLENBQ3BGLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUN2RSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNaLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtJQUM1QyxJQUFJLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1FBQ3hELE1BQU0sQ0FBQyxJQUFBLDhDQUE0QixFQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzdELDZCQUE2QixDQUM5QixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFO1FBQ3BELE1BQU0sQ0FBQyxJQUFBLDhDQUE0QixFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDN0UsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1FBQ25ELE1BQU0sQ0FBQyxJQUFBLDhDQUE0QixFQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDb2RlTWFrZXIgfSBmcm9tIFwiY29kZW1ha2VyXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvciB9IGZyb20gXCIuLi8uLi9nZW5lcmF0b3IvcHJvdmlkZXItZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBzYW5pdGl6ZUNsYXNzT3JOYW1lc3BhY2VOYW1lIH0gZnJvbSBcIi4uLy4uL2dlbmVyYXRvci9yZXNvdXJjZS1wYXJzZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVRtcEhlbHBlciB9IGZyb20gXCIuLi91dGlsXCI7XG5cbmNvbnN0IHRtcCA9IGNyZWF0ZVRtcEhlbHBlcigpO1xuXG4vLyBBIHByb3ZpZGVyIGRlY2xhcmluZyBwcm92aWRlci1kZWZpbmVkIGZ1bmN0aW9ucyBlbWl0cyB0aGVtIHRvXG4vLyBwcm92aWRlcnMvPHByb3ZpZGVyPi9wcm92aWRlci1mdW5jdGlvbnMvaW5kZXgudHMuIEEgcmVzb3VyY2UgbmFtZWRcbi8vIDxwcm92aWRlcj5fcHJvdmlkZXJfZnVuY3Rpb25zIG1hcHMgdG8gdGhhdCBzYW1lIGRpcmVjdG9yeSwgc28gd2l0aG91dCBhXG4vLyBndWFyZCB0aGUgcmVzb3VyY2Ugb3ZlcndyaXRlcyB0aGUgZnVuY3Rpb25zIHdyYXBwZXIgYW5kIHRoZSBwcm92aWRlciBpbmRleFxuLy8gZXhwb3J0cyB0aGUgbmFtZSB0d2ljZS5cbmRlc2NyaWJlKFwicmVzb3VyY2UgbmFtZWQgbGlrZSB0aGUgcHJvdmlkZXIgZnVuY3Rpb25zIHN1Ym1vZHVsZVwiLCAoKSA9PiB7XG4gIGxldCB3b3JrZGlyOiBzdHJpbmc7XG5cbiAgYmVmb3JlQWxsKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb2RlID0gbmV3IENvZGVNYWtlcigpO1xuICAgIHdvcmtkaXIgPSB0bXAoXCJwcm92aWRlci1mdW5jdGlvbnMtbmFtZS1jb2xsaXNpb24udGVzdFwiKTtcbiAgICBjb25zdCBzcGVjID0gSlNPTi5wYXJzZShcbiAgICAgIGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgICBcImZpeHR1cmVzXCIsXG4gICAgICAgICAgXCJwcm92aWRlci1mdW5jdGlvbnMtbmFtZS1jb2xsaXNpb24udGVzdC5maXh0dXJlLmpzb25cIixcbiAgICAgICAgKSxcbiAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIG5ldyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvcihjb2RlLCBzcGVjKS5nZW5lcmF0ZUFsbCgpO1xuICAgIGF3YWl0IGNvZGUuc2F2ZSh3b3JrZGlyKTtcbiAgfSk7XG5cbiAgY29uc3QgcmVhZCA9IChyZWxQYXRoOiBzdHJpbmcpID0+XG4gICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZGlyLCByZWxQYXRoKSwgXCJ1dGYtOFwiKTtcblxuICB0ZXN0KFwidGhlIGZ1bmN0aW9ucyBzdWJtb2R1bGUgaG9sZHMgdGhlIGZ1bmN0aW9ucyB3cmFwcGVyLCBub3QgdGhlIHJlc291cmNlXCIsICgpID0+IHtcbiAgICBjb25zdCBvdXRwdXQgPSByZWFkKFwicHJvdmlkZXJzL2V4YW1wbGUvcHJvdmlkZXItZnVuY3Rpb25zL2luZGV4LnRzXCIpO1xuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbihcImNsYXNzIEV4YW1wbGVQcm92aWRlckZ1bmN0aW9uc1wiKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKFwiY2RrdG4uVGVycmFmb3JtUmVzb3VyY2VcIik7XG4gIH0pO1xuXG4gIHRlc3QoXCJ0aGUgcmVzb3VyY2UgaXMgZW1pdHRlZCB0byBpdHMgb3duIGRpcmVjdG9yeVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVhZChcbiAgICAgIFwicHJvdmlkZXJzL2V4YW1wbGUvcHJvdmlkZXItZnVuY3Rpb25zLXJlc291cmNlL2luZGV4LnRzXCIsXG4gICAgKTtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oXCJjbGFzcyBQcm92aWRlckZ1bmN0aW9uc1Jlc291cmNlXCIpO1xuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbihcImNka3RuLlRlcnJhZm9ybVJlc291cmNlXCIpO1xuICB9KTtcblxuICB0ZXN0KFwidGhlIHByb3ZpZGVyIGluZGV4IGV4cG9ydHMgYm90aCwgd2l0aG91dCBkdXBsaWNhdGUgbmFtZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gcmVhZChcInByb3ZpZGVycy9leGFtcGxlL2luZGV4LnRzXCIpO1xuICAgIGV4cGVjdChpbmRleCkudG9Db250YWluKFxuICAgICAgXCJleHBvcnQgKiBhcyBwcm92aWRlckZ1bmN0aW9ucyBmcm9tICcuL3Byb3ZpZGVyLWZ1bmN0aW9ucy9pbmRleCc7XCIsXG4gICAgKTtcbiAgICBleHBlY3QoaW5kZXgpLnRvQ29udGFpbihcbiAgICAgIFwiZXhwb3J0ICogYXMgcHJvdmlkZXJGdW5jdGlvbnNSZXNvdXJjZSBmcm9tICcuL3Byb3ZpZGVyLWZ1bmN0aW9ucy1yZXNvdXJjZS9pbmRleCc7XCIsXG4gICAgKTtcblxuICAgIGNvbnN0IGV4cG9ydGVkTmFtZXMgPSBbLi4uaW5kZXgubWF0Y2hBbGwoL2V4cG9ydCBcXCogYXMgKFxcdyspIGZyb20vZyldLm1hcChcbiAgICAgIChtKSA9PiBtWzFdLFxuICAgICk7XG4gICAgZXhwZWN0KG5ldyBTZXQoZXhwb3J0ZWROYW1lcykuc2l6ZSkudG9CZShleHBvcnRlZE5hbWVzLmxlbmd0aCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwic2FuaXRpemVDbGFzc09yTmFtZXNwYWNlTmFtZVwiLCAoKSA9PiB7XG4gIHRlc3QoXCJzdWZmaXhlcyBhIHJlc291cmNlIG5hbWVkIHByb3ZpZGVyX2Z1bmN0aW9uc1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHNhbml0aXplQ2xhc3NPck5hbWVzcGFjZU5hbWUoXCJwcm92aWRlcl9mdW5jdGlvbnNcIikpLnRvQmUoXG4gICAgICBcInByb3ZpZGVyX2Z1bmN0aW9uc19yZXNvdXJjZVwiLFxuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoXCJzdGlsbCBzdWZmaXhlcyBhIHJlc291cmNlIG5hbWVkIHByb3ZpZGVyXCIsICgpID0+IHtcbiAgICBleHBlY3Qoc2FuaXRpemVDbGFzc09yTmFtZXNwYWNlTmFtZShcInByb3ZpZGVyXCIpKS50b0JlKFwicHJvdmlkZXJfcmVzb3VyY2VcIik7XG4gIH0pO1xuXG4gIHRlc3QoXCJsZWF2ZXMgYW4gdW5yZWxhdGVkIHJlc291cmNlIG5hbWUgYWxvbmVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChzYW5pdGl6ZUNsYXNzT3JOYW1lc3BhY2VOYW1lKFwiZnVuY3Rpb25fYXBwXCIpKS50b0JlKFwiZnVuY3Rpb25fYXBwXCIpO1xuICB9KTtcbn0pO1xuIl19
@@ -53,7 +53,13 @@ const getFileName = (provider, baseName) => {
53
53
  };
54
54
  function sanitizeClassOrNamespaceName(baseName, isProvider = false) {
55
55
  const resourceIsNamedProvider = !isProvider && baseName === "provider";
56
- if (isReservedClassOrNamespaceName(baseName) || resourceIsNamedProvider) {
56
+ // A resource named `<provider>_provider_functions` maps to the same
57
+ // providers/<provider>/provider-functions/ directory that the provider's
58
+ // functions submodule is emitted to, and would silently overwrite it.
59
+ const resourceIsNamedProviderFunctions = !isProvider && baseName === "provider_functions";
60
+ if (isReservedClassOrNamespaceName(baseName) ||
61
+ resourceIsNamedProvider ||
62
+ resourceIsNamedProviderFunctions) {
57
63
  return `${baseName}_resource`;
58
64
  }
59
65
  else {
@@ -522,4 +528,4 @@ class ResourceParser {
522
528
  }
523
529
  }
524
530
  exports.ResourceParser = ResourceParser;
525
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dldC9nZW5lcmF0b3IvcmVzb3VyY2UtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQStFQSxvRUFXQztBQTFGRCwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLHlDQUFtRTtBQUNuRSw0Q0FVd0I7QUFDeEIsNERBQXVFO0FBQ3ZFLHFDQVlrQjtBQUNsQixxREFBd0Q7QUFDeEQsNkRBQTJEO0FBRTNELHNFQUFzRTtBQUN0RSx5SkFBeUo7QUFDekosTUFBTSxnQ0FBZ0MsR0FBRztJQUN2QyxZQUFZO0lBQ1osV0FBVztJQUNYLEtBQUs7SUFDTCxTQUFTO0lBQ1QsU0FBUztJQUNULFdBQVc7SUFDWCxRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0NBQ1IsQ0FBQztBQUVGLE1BQU0seUJBQXlCLEdBQUc7SUFDaEMsbUhBQW1IO0lBQ25ILFNBQVM7SUFDVCwyQkFBMkI7SUFDM0IsU0FBUztDQUNWLENBQUM7QUFFRixNQUFNLDhCQUE4QixHQUFHLENBQUMsU0FBaUIsRUFBVyxFQUFFO0lBQ3BFLE9BQU87UUFDTCxRQUFRO1FBQ1IsUUFBUTtRQUNSLFVBQVU7UUFDVixHQUFHLGdDQUFnQztRQUNuQyxHQUFHLHlCQUF5QjtLQUM3QixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHLENBQUMsU0FBaUIsRUFBVyxFQUFFO0lBQy9ELE9BQU8sU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsRCxDQUFDLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLFFBQXNCLEVBQUUsUUFBZ0IsRUFBVSxFQUFFO0lBQ3ZFLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLE9B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LFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCw4REFBOEQ7SUFDdkQsMkJBQTJCLENBQUMsYUFBcUI7UUFDdEQsa0ZBQWtGO1FBQ2xGLElBQUksYUFBYSxLQUFLLGdCQUFnQixFQUFFLENBQUM7WUFDdkMsYUFBYSxHQUFHLGVBQWUsQ0FBQztRQUNsQyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxhQUFhLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RSxDQUFDO0NBQ0Y7QUFoREQsd0NBZ0RDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IHRvQ2FtZWxDYXNlLCB0b1Bhc2NhbENhc2UsIHRvU25ha2VDYXNlIH0gZnJvbSBcImNvZGVtYWtlclwiO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVOZXN0ZWRUeXBlLFxuICBBdHRyaWJ1dGVUeXBlLFxuICBCbG9jayxcbiAgQmxvY2tUeXBlLFxuICBDb25zdHJ1Y3RzTWFrZXJUYXJnZXQsXG4gIGlzQXR0cmlidXRlTmVzdGVkVHlwZSxcbiAgaXNOZXN0ZWRUeXBlQXR0cmlidXRlLFxuICBTY2hlbWEsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHsgUHJvdmlkZXJOYW1lLCBGUVBOLCBwYXJzZUZRUE4gfSBmcm9tIFwiQGNka3RuL3Byb3ZpZGVyLXNjaGVtYVwiO1xuaW1wb3J0IHtcbiAgUmVzb3VyY2VNb2RlbCxcbiAgQXR0cmlidXRlVHlwZU1vZGVsLFxuICBTdHJ1Y3QsXG4gIFNjb3BlLFxuICBBdHRyaWJ1dGVNb2RlbCxcbiAgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsLFxuICBMaXN0QXR0cmlidXRlVHlwZU1vZGVsLFxuICBTZXRBdHRyaWJ1dGVUeXBlTW9kZWwsXG4gIE1hcEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsLFxuICBTa2lwcGVkQXR0cmlidXRlVHlwZU1vZGVsLFxufSBmcm9tIFwiLi9tb2RlbHNcIjtcbmltcG9ydCB7IGRldGVjdEF0dHJpYnV0ZUxvb3BzIH0gZnJvbSBcIi4vbG9vcC1kZXRlY3Rpb25cIjtcbmltcG9ydCB7IHNob3VsZFNraXBBdHRyaWJ1dGUgfSBmcm9tIFwiLi9za2lwcGVkLWF0dHJpYnV0ZXNcIjtcblxuLy8gQ2FuJ3QgYmUgdXNlZCBpbiBleHByZXNzaW9ucyBsaWtlIFwiZXhwb3J0ICogYXMgPGtleXdvcmQ+IGZyb20gLi4uIFwiXG4vLyBmaWx0ZXJlZCBmcm9tIGFsbCBrZXl3b3JkcyBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvYmxvYi81MDM2MDRjODg0YmQwNTU3Yzg1MWIxMWI2OTllZjk4Y2RiNjViOTNiL3NyYy9jb21waWxlci90eXBlcy50cyNMMTE0LUwxOTdcbmNvbnN0IFJFU0VSVkVEX0tFWVdPUkRTX0ZPUl9OQU1FU1BBQ0VTID0gW1xuICBcImltcGxlbWVudHNcIixcbiAgXCJpbnRlcmZhY2VcIixcbiAgXCJsZXRcIixcbiAgXCJwYWNrYWdlXCIsXG4gIFwicHJpdmF0ZVwiLFxuICBcInByb3RlY3RlZFwiLFxuICBcInB1YmxpY1wiLFxuICBcInN0YXRpY1wiLFxuICBcInlpZWxkXCIsXG4gIFwiYXdhaXRcIixcbl07XG5cbmNvbnN0IENPTExJRElOR19OQU1FU1BBQ0VfTkFNRVMgPSBbXG4gIC8vIGUuZy4gaGFzaGljb3JwL2NvbnN1bCDigJMgY29sbGlkZXMgd2l0aCB0aGUgTElDRU5TRSBmaWxlIG9uIGNhc2UtaW5zZW5zaXRpdmUgZmlsZXN5c3RlbXMgaW4gdGhlIEdvIHBhY2thZ2UgKCMyNjI3KVxuICBcImxpY2Vuc2VcIixcbiAgLy8gY29sbGlkZXMgZm9yIEdvIHBhY2thZ2VzXG4gIFwidmVyc2lvblwiLFxuXTtcblxuY29uc3QgaXNSZXNlcnZlZENsYXNzT3JOYW1lc3BhY2VOYW1lID0gKGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBbXG4gICAgXCJzdHJpbmdcIixcbiAgICBcIm9iamVjdFwiLFxuICAgIFwiZnVuY3Rpb25cIixcbiAgICAuLi5SRVNFUlZFRF9LRVlXT1JEU19GT1JfTkFNRVNQQUNFUyxcbiAgICAuLi5DT0xMSURJTkdfTkFNRVNQQUNFX05BTUVTLFxuICBdLmluY2x1ZGVzKGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpKTtcbn07XG5cbmNvbnN0IGlzUmVzZXJ2ZWRTdHJ1Y3RDbGFzc05hbWUgPSAoY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFwibGlzdFwiKTtcbn07XG5cbmNvbnN0IGdldEZpbGVOYW1lID0gKHByb3ZpZGVyOiBQcm92aWRlck5hbWUsIGJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoYmFzZU5hbWUgPT09IFwiaW5kZXhcIikge1xuICAgIHJldHVybiBcImluZGV4LXJlc291cmNlL2luZGV4LnRzXCI7XG4gIH1cblxuICBpZiAoYmFzZU5hbWUgPT09IGAke3Byb3ZpZGVyfV9wcm92aWRlcmApIHtcbiAgICByZXR1cm4gXCJwcm92aWRlci9pbmRleC50c1wiO1xuICB9XG5cbiAgcmV0dXJuIGAke3RvU25ha2VDYXNlKGJhc2VOYW1lKS5yZXBsYWNlKC9fL2csIFwiLVwiKX0vaW5kZXgudHNgO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplQ2xhc3NPck5hbWVzcGFjZU5hbWUoXG4gIGJhc2VOYW1lOiBzdHJpbmcsXG4gIGlzUHJvdmlkZXIgPSBmYWxzZSxcbikge1xuICBjb25zdCByZXNvdXJjZUlzTmFtZWRQcm92aWRlciA9ICFpc1Byb3ZpZGVyICYmIGJhc2VOYW1lID09PSBcInByb3ZpZGVyXCI7XG5cbiAgaWYgKGlzUmVzZXJ2ZWRDbGFzc09yTmFtZXNwYWNlTmFtZShiYXNlTmFtZSkgfHwgcmVzb3VyY2VJc05hbWVkUHJvdmlkZXIpIHtcbiAgICByZXR1cm4gYCR7YmFzZU5hbWV9X3Jlc291cmNlYDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZU5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgYXR0cmlidXRlcyB0aGF0IG1heSBjb25mbGljdCBhZnRlciBiZWluZyBzbmFrZSBjYXNlZFxuICogRXhhbXBsZTogb2NpX2NvcmVfaXBzZWNfY29ubmVjdGlvbl90dW5uZWxfbWFuYWdlbWVudCAoaGFzaGljb3JwL29jaUA9NS4yMS4wKSBoYXMgYmdwX2lwdjZfc3RhdGUgYW5kIGJncF9pcHY2c3RhdGVcbiAqICh3aGljaCBib3RoIHJlc3VsdCBpbiBcImJncElwdjZTdGF0ZVwiIHdoZW4gY2FtZWwtY2FzZWQsIHdpdGggdGhlIHNlY29uZCBvbmUgYmVpbmcgZGVwcmVjYXRlZDogdHJ1ZSlcbiAqIEFzIHdlIGN1cnJlbnRseSBkb24ndCBoYW5kbGUgYW55IGRlcHJlY2F0ZWQgb25lcyBhdCBhbGwsIHdlJ2xsIGp1c3QgZGVsZXRlIG9uZSBvZiB0aGUgdHdvIGF0dHJpYnV0ZXMgZm9yIG5vd1xuICogQHBhcmFtIGF0dHJpYnV0ZXNcbiAqL1xuZnVuY3Rpb24gZGVkdXBsaWNhdGVBdHRyaWJ1dGVzV2l0aFNhbWVOYW1lKFxuICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNb2RlbFtdLFxuKTogQXR0cmlidXRlTW9kZWxbXSB7XG4gIHJldHVybiBhdHRyaWJ1dGVzLmZpbHRlcigoYXR0ciwgaWR4KSA9PiB7XG4gICAgY29uc3QgaGFzT3RoZXJXaXRoU2FtZU5hbWUgPSBhdHRyaWJ1dGVzXG4gICAgICAuc2xpY2UoaWR4ICsgMSkgLy8gb25seSBzZWFyY2ggYWZ0ZXIgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSB0byBhdm9pZCBkZWxldGluZyBib3RoXG4gICAgICAuc29tZSgob3RoZXIpID0+IG90aGVyLm5hbWUgPT09IGF0dHIubmFtZSAmJiBvdGhlciAhPT0gYXR0cik7XG4gICAgcmV0dXJuICFoYXNPdGhlcldpdGhTYW1lTmFtZTtcbiAgfSk7XG59XG5cbmNsYXNzIFBhcnNlciB7XG4gIHByaXZhdGUgc3RydWN0cyA9IG5ldyBBcnJheTxTdHJ1Y3Q+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjbGFzc05hbWVzOiBzdHJpbmdbXSxcbiAgICBwcml2YXRlIHVzZWRCYXNlTmFtZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gICkge31cblxuICBwcml2YXRlIHVuaXF1ZUNsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY2xhc3NOYW1lcy5pbmNsdWRlcyhjbGFzc05hbWUpKSB7XG4gICAgICBjbGFzc05hbWUgPSBgJHtjbGFzc05hbWV9QWA7XG4gICAgfVxuICAgIHRoaXMuY2xhc3NOYW1lcy5wdXNoKGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYmFzZSBuYW1lcyBhcmUgdW5pcXVlIGNhc2UtaW5zZW5zaXRpdmVseS5cbiAgICpcbiAgICogQWZmZWN0ZWQgbGFuZ3VhZ2VzOlxuICAgKiAtIEdvOiBKU0lJLWdlbmVyYXRlZCBHbyBwYWNrYWdlIG5hbWVzIGFyZSBmdWxseSBsb3dlcmNhc2VkLCBzb1xuICAgKiAgIGBsb2FkLWJhbGFuY2VyLWJhY2tlbmRzZXRgIGFuZCBgbG9hZC1iYWxhbmNlci1iYWNrZW5kLXNldGAgYm90aFxuICAgKiAgIGJlY29tZSBwYWNrYWdlIGBsb2FkYmFsYW5jZXJiYWNrZW5kc2V0YCwgY2F1c2luZyBhIGhhcmQgYnVpbGQgZmFpbHVyZTpcbiAgICogICBcImNhc2UtaW5zZW5zaXRpdmUgZmlsZSBuYW1lIGNvbGxpc2lvblwiLlxuICAgKiAtIEMjOiBKU0lJIGdlbmVyYXRlcyBQYXNjYWxDYXNlIGRpcmVjdG9yaWVzIGxpa2VcbiAgICogICBgTG9hZEJhbGFuY2VyQmFja2VuZHNldC9gIGFuZCBgTG9hZEJhbGFuY2VyQmFja2VuZFNldC9gIHdoaWNoIHRoZSBDI1xuICAgKiAgIGNvbXBpbGVyIHRyZWF0cyBjYXNlLWluc2Vuc2l0aXZlbHksIGNhdXNpbmcgQ1MyMDAyIGFuZCBDUzAyMzQgZXJyb3JzLlxuICAgKi9cbiAgcHJpdmF0ZSB1bmlxdWVCYXNlTmFtZShiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXNjYWxOYW1lID0gdG9QYXNjYWxDYXNlKGJhc2VOYW1lKTtcbiAgICBjb25zdCBrZXkgPSBwYXNjYWxOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnVzZWRCYXNlTmFtZXMuZ2V0KGtleSk7XG5cbiAgICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCAmJiBleGlzdGluZyAhPT0gcGFzY2FsTmFtZSkge1xuICAgICAgYmFzZU5hbWUgPSBgJHtiYXNlTmFtZX1BYDtcbiAgICAgIHJldHVybiB0aGlzLnVuaXF1ZUJhc2VOYW1lKGJhc2VOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZWRCYXNlTmFtZXMuc2V0KGtleSwgcGFzY2FsTmFtZSk7XG4gICAgcmV0dXJuIGJhc2VOYW1lO1xuICB9XG5cbiAgcHVibGljIHJlc291cmNlRnJvbShcbiAgICBmcXBuOiBGUVBOLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYSxcbiAgICB0ZXJyYWZvcm1TY2hlbWFUeXBlOiBzdHJpbmcsXG4gICAgY29uc3RyYWludD86IENvbnN0cnVjdHNNYWtlclRhcmdldCxcbiAgKTogUmVzb3VyY2VNb2RlbCB7XG4gICAgbGV0IGJhc2VOYW1lID0gdHlwZTtcblxuICAgIGNvbnN0IHByb3ZpZGVyTmFtZUZyb21Db25zdHJhaW50ID0gY29uc3RyYWludFxuICAgICAgPyAoY29uc3RyYWludC5uYW1lIGFzIFByb3ZpZGVyTmFtZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb3ZpZGVyTmFtZUZyb21GUVBOID0gcGFyc2VGUVBOKGZxcG4pLm5hbWU7XG5cbiAgICBpZiAoYmFzZU5hbWUuc3RhcnRzV2l0aChgJHtwcm92aWRlck5hbWVGcm9tRlFQTn1fYCkpIHtcbiAgICAgIGJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyKHByb3ZpZGVyTmFtZUZyb21GUVBOLmxlbmd0aCArIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3ZpZGVyTmFtZSA9IHByb3ZpZGVyTmFtZUZyb21Db25zdHJhaW50XG4gICAgICA/IHByb3ZpZGVyTmFtZUZyb21Db25zdHJhaW50XG4gICAgICA6IHByb3ZpZGVyTmFtZUZyb21GUVBOO1xuXG4gICAgY29uc3QgaXNQcm92aWRlciA9IHRlcnJhZm9ybVNjaGVtYVR5cGUgPT09IFwicHJvdmlkZXJcIjtcbiAgICBpZiAoaXNQcm92aWRlcikge1xuICAgICAgYmFzZU5hbWUgPSBgJHtwcm92aWRlck5hbWV9XyR7YmFzZU5hbWV9YDtcbiAgICAgIGlmICghKFwiYXR0cmlidXRlc1wiIGluIHNjaGVtYS5ibG9jaykpIHtcbiAgICAgICAgc2NoZW1hLmJsb2NrID0ge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgIGJsb2NrX3R5cGVzOiAoc2NoZW1hLmJsb2NrIGFzIEJsb2NrKS5ibG9ja190eXBlcyB8fCB7fSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIHNvbWVob3cgbWlzc2luZyBmcm9tIHByb3ZpZGVyIHNjaGVtYVxuICAgICAgc2NoZW1hLmJsb2NrLmF0dHJpYnV0ZXNbXCJhbGlhc1wiXSA9IHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQWxpYXMgbmFtZVwiLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBiYXNlTmFtZSA9IHNhbml0aXplQ2xhc3NPck5hbWVzcGFjZU5hbWUoYmFzZU5hbWUsIGlzUHJvdmlkZXIpO1xuICAgIGJhc2VOYW1lID0gdGhpcy51bmlxdWVCYXNlTmFtZShiYXNlTmFtZSk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLnVuaXF1ZUNsYXNzTmFtZSh0b1Bhc2NhbENhc2UoYmFzZU5hbWUpKTtcbiAgICAvLyBhdm9pZCBuYW1pbmcgY29sbGlzaW9uIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9pc3N1ZXMvMjk5XG4gICAgY29uc3QgY29uZmlnU3RydWN0TmFtZSA9IHRoaXMudW5pcXVlQ2xhc3NOYW1lKGAke2NsYXNzTmFtZX1Db25maWdgKTtcbiAgICBjb25zdCBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKHByb3ZpZGVyTmFtZSwgYmFzZU5hbWUpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSBgcHJvdmlkZXJzLyR7dG9TbmFrZUNhc2UocHJvdmlkZXJOYW1lKX0vJHtmaWxlTmFtZX1gO1xuICAgIGxldCBhdHRyaWJ1dGVzID0gdGhpcy5yZW5kZXJBdHRyaWJ1dGVzRm9yQmxvY2soXG4gICAgICBuZXcgU2NvcGUoe1xuICAgICAgICBuYW1lOiBiYXNlTmFtZSxcbiAgICAgICAgaXNQcm92aWRlcixcbiAgICAgICAgcGFyZW50OiBpc1Byb3ZpZGVyXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IG5ldyBTY29wZSh7IG5hbWU6IHByb3ZpZGVyTmFtZSwgaXNQcm92aWRlcjogdHJ1ZSB9KSxcbiAgICAgIH0pLFxuICAgICAgc2NoZW1hLmJsb2NrLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBnZXRTdHJ1Y3RBdHRyaWJ1dGUoXG4gICAgICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNb2RlbFtdLFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICk6IEF0dHJpYnV0ZU1vZGVsIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZmluZCgoYXR0KSA9PiB7XG4gICAgICAgIHJldHVybiBhdHQudGVycmFmb3JtTmFtZSA9PT0gZmlyc3Q7XG4gICAgICB9KTtcbiAgICAgIGlmICghYXR0cmlidXRlKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIHRvIGZpbmQgcmVjdXJzaXZlIGF0dHJpYnV0ZSBhdCBwYXRoOiAke3BhdGh9YCxcbiAgICAgICAgKTtcbiAgICAgIGlmICghYXR0cmlidXRlLnR5cGUuc3RydWN0KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIHRvIGZpbmQgc3RydWN0IHR5cGUgYXR0cmlidXRlIGF0IHBhdGg6ICR7cGF0aH0gYnV0IGdvdCAke2F0dHJpYnV0ZS50eXBlLnN0b3JlZENsYXNzVHlwZX1gLFxuICAgICAgICApO1xuICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSByZXR1cm4gYXR0cmlidXRlO1xuICAgICAgcmV0dXJuIGdldFN0cnVjdEF0dHJpYnV0ZShcbiAgICAgICAgYXR0cmlidXRlLnR5cGUuc3RydWN0LmF0dHJpYnV0ZXMsXG4gICAgICAgIHJlc3Quam9pbihcIi5cIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEludHJvZHVjZSByZWN1cnNpb24gZm9yIHNvbWUgYXR0cmlidXRlc1xuICAgIGNvbnN0IHJlY3Vyc2l2ZUF0dHJpYnV0ZVBhdGhzID0gZGV0ZWN0QXR0cmlidXRlTG9vcHMoYXR0cmlidXRlcyk7XG5cbiAgICBPYmplY3QuZW50cmllcyhyZWN1cnNpdmVBdHRyaWJ1dGVQYXRocykuZm9yRWFjaChcbiAgICAgIChbYXR0cmlidXRlUGF0aCwgc3RydWN0UGF0aF0pID0+IHtcbiAgICAgICAgLy8gVE9ETzogYnVpbGQgdGhpcyB0byBiZSBhIGJpdCBtb3JlIGRlZmVuc2l2ZSAoZS5nLiByZW1vdmUgISBvcGVyYXRvcilcbiAgICAgICAgY29uc3QgcmVjdXJzaW9uVGFyZ2V0U3RydWN0QXR0cmlidXRlID0gZ2V0U3RydWN0QXR0cmlidXRlKFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgc3RydWN0UGF0aCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBhdHRyaWJ1dGVQYXRoLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHBhcnRzLnBvcCgpO1xuICAgICAgICBjb25zdCBwYXJlbnRBdHRyaWJ1dGUgPSBnZXRTdHJ1Y3RBdHRyaWJ1dGUoYXR0cmlidXRlcywgcGFydHMuam9pbihcIi5cIikpO1xuICAgICAgICBjb25zdCBpbmRleFRvUmVwbGFjZSA9XG4gICAgICAgICAgcGFyZW50QXR0cmlidXRlLnR5cGUuc3RydWN0IS5hdHRyaWJ1dGVzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChhdHQpID0+IGF0dC50ZXJyYWZvcm1OYW1lID09PSBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChpbmRleFRvUmVwbGFjZSA9PT0gLTEpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBhdHRyaWJ1dGUgYXQgcGF0aCBcIiArIGF0dHJpYnV0ZVBhdGgpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0F0dHJpYnV0ZSA9XG4gICAgICAgICAgcGFyZW50QXR0cmlidXRlLnR5cGUuc3RydWN0IS5hdHRyaWJ1dGVzW2luZGV4VG9SZXBsYWNlXTtcblxuICAgICAgICBwYXJlbnRBdHRyaWJ1dGUudHlwZS5zdHJ1Y3QhLmF0dHJpYnV0ZXNbaW5kZXhUb1JlcGxhY2VdID1cbiAgICAgICAgICByZWN1cnNpb25UYXJnZXRTdHJ1Y3RBdHRyaWJ1dGU7IC8vIGludHJvZHVjZSByZWN1cnNpb25cblxuICAgICAgICAvLyB1Z2x5LCBwbHMgY8y2Ycy2bMy2bMy2IHJlZmFjdG9yIG1lIG1heWJlXG4gICAgICAgIC8vIHdlIHN0b3JlIGFsbCBzdHJ1Y3RzIGluIHRoaXMuc3RydWN0cyDigJMgbm93IHdlIG5lZWQgdG8gZGlzcG9zZSBhbGwgc3RydWN0cyB0aGF0IGFyZSBwYXJ0IG9mIHByZXZpb3VzQXR0cmlidXRlXG4gICAgICAgIGNvbnN0IGRpc3Bvc2VTdHJ1Y3RzID0gKGF0dHI6IEF0dHJpYnV0ZU1vZGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGF0dHIudHlwZS5zdHJ1Y3QpIHtcbiAgICAgICAgICAgIGF0dHIudHlwZS5zdHJ1Y3QuYXR0cmlidXRlcy5mb3JFYWNoKGRpc3Bvc2VTdHJ1Y3RzKTtcbiAgICAgICAgICAgIHRoaXMuc3RydWN0cyA9IHRoaXMuc3RydWN0cy5maWx0ZXIoKHMpID0+IHMgIT09IGF0dHIudHlwZS5zdHJ1Y3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkaXNwb3NlU3RydWN0cyhwcmV2aW91c0F0dHJpYnV0ZSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBhdHRyaWJ1dGVzID0gZGVkdXBsaWNhdGVBdHRyaWJ1dGVzV2l0aFNhbWVOYW1lKGF0dHJpYnV0ZXMpO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNb2RlbCA9IG5ldyBSZXNvdXJjZU1vZGVsKHtcbiAgICAgIHRlcnJhZm9ybVR5cGU6IHR5cGUsXG4gICAgICBiYXNlTmFtZSxcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzY2hlbWEsXG4gICAgICBmcXBuLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIHRlcnJhZm9ybVNjaGVtYVR5cGUsXG4gICAgICBzdHJ1Y3RzOiB0aGlzLnN0cnVjdHMsXG4gICAgICBjb25maWdTdHJ1Y3ROYW1lLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc291cmNlTW9kZWw7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckF0dHJpYnV0ZVR5cGUoXG4gICAgc2NvcGU6IFNjb3BlW10sXG4gICAgYXR0cmlidXRlVHlwZTogQXR0cmlidXRlVHlwZSB8IEF0dHJpYnV0ZU5lc3RlZFR5cGUsXG4gICAgcGFyZW50S2luZD86IHN0cmluZyxcbiAgKTogQXR0cmlidXRlVHlwZU1vZGVsIHtcbiAgICBjb25zdCBwYXJlbnQgPSBzY29wZVtzY29wZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoc2hvdWxkU2tpcEF0dHJpYnV0ZShwYXJlbnQuYmFzZU5hbWUpKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcEF0dHJpYnV0ZVR5cGVNb2RlbChuZXcgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsKFwiYW55XCIpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZVR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlVHlwZSkge1xuICAgICAgICBjYXNlIFwiYm9vbFwiOlxuICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsKFwiYm9vbGVhblwiKTtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsKFwic3RyaW5nXCIpO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVBdHRyaWJ1dGVUeXBlTW9kZWwoXCJudW1iZXJcIik7XG4gICAgICAgIGNhc2UgXCJkeW5hbWljXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXBBdHRyaWJ1dGVUeXBlTW9kZWwobmV3IFNpbXBsZUF0dHJpYnV0ZVR5cGVNb2RlbChcImFueVwiKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHByaW1pdGl2ZSB0eXBlICR7YXR0cmlidXRlVHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVUeXBlKSkge1xuICAgICAgaWYgKGF0dHJpYnV0ZVR5cGUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBhcnJheWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBba2luZCwgdHlwZV0gPSBhdHRyaWJ1dGVUeXBlO1xuXG4gICAgICBpZiAoa2luZCA9PT0gXCJzZXRcIiB8fCBraW5kID09PSBcImxpc3RcIikge1xuICAgICAgICBjb25zdCBlbGVtZW50VHlwZSA9IHRoaXMucmVuZGVyQXR0cmlidXRlVHlwZShcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB0eXBlIGFzIEF0dHJpYnV0ZVR5cGUsXG4gICAgICAgICAgW2tpbmQsIHBhcmVudEtpbmRdLmpvaW4oXCJcIiksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBraW5kID09PSBcImxpc3RcIlxuICAgICAgICAgID8gbmV3IExpc3RBdHRyaWJ1dGVUeXBlTW9kZWwoZWxlbWVudFR5cGUsIGZhbHNlLCBmYWxzZSlcbiAgICAgICAgICA6IG5ldyBTZXRBdHRyaWJ1dGVUeXBlTW9kZWwoZWxlbWVudFR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kID09PSBcIm1hcFwiKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMucmVuZGVyQXR0cmlidXRlVHlwZShcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB0eXBlIGFzIEF0dHJpYnV0ZVR5cGUsXG4gICAgICAgICAgW2tpbmQsIHBhcmVudEtpbmRdLmpvaW4oXCJcIiksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgTWFwQXR0cmlidXRlVHlwZU1vZGVsKHZhbHVlVHlwZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IG9iakF0dHJpYnV0ZXMgPSB0eXBlIGFzIHsgW25hbWU6IHN0cmluZ106IEF0dHJpYnV0ZVR5cGUgfTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlczogeyBbbmFtZTogc3RyaW5nXTogQXR0cmlidXRlIH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdHlwZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqQXR0cmlidXRlcykpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzW25hbWVdID0geyB0eXBlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICBwYXJlbnRLaW5kID8/IGtpbmQsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQXR0cmlidXRlTmVzdGVkVHlwZShhdHRyaWJ1dGVUeXBlKSkge1xuICAgICAgbGV0IHN0cnVjdCA9IHVuZGVmaW5lZDtcbiAgICAgIGxldCB0eXBlTW9kZWwgPSB1bmRlZmluZWQ7XG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlKSB7XG4gICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHlwZU1vZGVsID0gbmV3IExpc3RBdHRyaWJ1dGVUeXBlTW9kZWwoXG4gICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgICAgICBzdHJ1Y3QgPSB0aGlzLmFkZEFub255bW91c1N0cnVjdChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgYXR0cmlidXRlVHlwZS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgYXR0cmlidXRlVHlwZS5uZXN0aW5nX21vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0eXBlTW9kZWwgPSBuZXcgU2V0QXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHlwZU1vZGVsID0gbmV3IE1hcEF0dHJpYnV0ZVR5cGVNb2RlbChcbiAgICAgICAgICAgIG5ldyBTdHJ1Y3RBdHRyaWJ1dGVUeXBlTW9kZWwoc3RydWN0KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic2luZ2xlXCI6XG4gICAgICAgICAgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHlwZU1vZGVsID0gbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYG5lc3RlZF90eXBlIHdpdGggbmVzdGluZ19tb2RlIFwiJHtcbiAgICAgICAgICAgICAgYXR0cmlidXRlVHlwZS5uZXN0aW5nX21vZGVcbiAgICAgICAgICAgIH1cIiBub3Qgc3VwcG9ydGVkIChhdHRyaWJ1dGUgc2NvcGU6ICR7c2NvcGVcbiAgICAgICAgICAgICAgLm1hcCgocykgPT4gcy5mdWxsTmFtZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIsXCIpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVNb2RlbDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gdHlwZSAke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZVR5cGUpfWApO1xuICB9XG5cbiAgcHVibGljIHJlbmRlckF0dHJpYnV0ZXNGb3JCbG9jayhwYXJlbnRUeXBlOiBTY29wZSwgYmxvY2s6IEJsb2NrKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheTxBdHRyaWJ1dGVNb2RlbD4oKTtcblxuICAgIGZvciAoY29uc3QgW3RlcnJhZm9ybUF0dHJpYnV0ZU5hbWUsIGF0dF0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICBibG9jay5hdHRyaWJ1dGVzIHx8IHt9LFxuICAgICkpIHtcbiAgICAgIGxldCB0eXBlOiBBdHRyaWJ1dGVUeXBlTW9kZWw7XG4gICAgICBsZXQgZm9yY2VQbGFpbkdldHRlclR5cGUgPSBmYWxzZTtcbiAgICAgIGlmIChzaG91bGRTa2lwQXR0cmlidXRlKHBhcmVudFR5cGUuZnVsbE5hbWUodGVycmFmb3JtQXR0cmlidXRlTmFtZSkpKSB7XG4gICAgICAgIHR5cGUgPSBuZXcgU2tpcHBlZEF0dHJpYnV0ZVR5cGVNb2RlbCgpO1xuICAgICAgICBmb3JjZVBsYWluR2V0dGVyVHlwZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gdGhpcy5yZW5kZXJBdHRyaWJ1dGVUeXBlKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgICAgICBuZXcgU2NvcGUoe1xuICAgICAgICAgICAgICBuYW1lOiB0ZXJyYWZvcm1BdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHBhcmVudFR5cGUsXG4gICAgICAgICAgICAgIGlzUHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICAgICAgaXNDb21wdXRlZDogISFhdHQuY29tcHV0ZWQsXG4gICAgICAgICAgICAgIGlzT3B0aW9uYWw6ICEhYXR0Lm9wdGlvbmFsLFxuICAgICAgICAgICAgICBpc1JlcXVpcmVkOiAhIWF0dC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgaXNOZXN0ZWRUeXBlOiBpc05lc3RlZFR5cGVBdHRyaWJ1dGUoYXR0KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYXR0LnR5cGUgfHwgYXR0Lm5lc3RlZF90eXBlLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gdG9DYW1lbENhc2UodGVycmFmb3JtQXR0cmlidXRlTmFtZSk7XG5cbiAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICB0ZXJyYWZvcm1GdWxsTmFtZTogcGFyZW50VHlwZS5mdWxsTmFtZSh0ZXJyYWZvcm1BdHRyaWJ1dGVOYW1lKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYXR0LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgc3RvcmFnZU5hbWU6IGBfJHtuYW1lfWAsXG4gICAgICAgICAgY29tcHV0ZWQ6ICEhYXR0LmNvbXB1dGVkLFxuICAgICAgICAgIG9wdGlvbmFsOiAhIWF0dC5vcHRpb25hbCxcbiAgICAgICAgICB0ZXJyYWZvcm1OYW1lOiB0ZXJyYWZvcm1BdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICByZXF1aXJlZDogISFhdHQucmVxdWlyZWQsXG4gICAgICAgICAgZm9yY2VQbGFpbkdldHRlclR5cGUsXG4gICAgICAgICAgaXNXcml0ZU9ubHk6ICEhYXR0LndyaXRlX29ubHksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtibG9ja1R5cGVOYW1lLCBibG9ja1R5cGVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgYmxvY2suYmxvY2tfdHlwZXMgfHwge30sXG4gICAgKSkge1xuICAgICAgaWYgKHNob3VsZFNraXBBdHRyaWJ1dGUocGFyZW50VHlwZS5mdWxsTmFtZShibG9ja1R5cGVOYW1lKSkpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRvQ2FtZWxDYXNlKGJsb2NrVHlwZU5hbWUpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBuZXcgU2NvcGUoe1xuICAgICAgICAgIG5hbWU6IGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgcGFyZW50OiBwYXJlbnRUeXBlLFxuICAgICAgICAgIGlzUHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgICBuZXcgQXR0cmlidXRlTW9kZWwoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybU5hbWU6IGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1GdWxsTmFtZTogcGFyZW50LmZ1bGxOYW1lKGJsb2NrVHlwZU5hbWUpLFxuICAgICAgICAgICAgdHlwZTogbmV3IFNraXBwZWRBdHRyaWJ1dGVUeXBlTW9kZWwoKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtibG9ja1R5cGVOYW1lfSBibG9ja2AsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBjcmVhdGUgYSBzdHJ1Y3QgZm9yIHRoaXMgYmxvY2tcbiAgICAgIGxldCBibG9ja0F0dHJpYnV0ZXMgPSB0aGlzLnJlbmRlckF0dHJpYnV0ZXNGb3JCbG9jayhcbiAgICAgICAgbmV3IFNjb3BlKHtcbiAgICAgICAgICBuYW1lOiBgJHtwYXJlbnRUeXBlLm5hbWV9XyR7YmxvY2tUeXBlTmFtZX1gLFxuICAgICAgICAgIHBhcmVudDogcGFyZW50VHlwZSxcbiAgICAgICAgICBpc1Byb3ZpZGVyOiBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgICAgaW5CbG9ja1R5cGU6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgICBibG9ja1R5cGUuYmxvY2ssXG4gICAgICApO1xuXG4gICAgICBibG9ja0F0dHJpYnV0ZXMgPSBkZWR1cGxpY2F0ZUF0dHJpYnV0ZXNXaXRoU2FtZU5hbWUoYmxvY2tBdHRyaWJ1dGVzKTtcblxuICAgICAgY29uc3QgYmxvY2tTdHJ1Y3QgPSB0aGlzLmFkZFN0cnVjdChcbiAgICAgICAgW1xuICAgICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgICAgbmV3IFNjb3BlKHtcbiAgICAgICAgICAgIG5hbWU6IGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudFR5cGUsXG4gICAgICAgICAgICBpc1Byb3ZpZGVyOiBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICAgIGJsb2NrQXR0cmlidXRlcyxcbiAgICAgICAgYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSxcbiAgICAgICAgKGJsb2NrVHlwZS5uZXN0aW5nX21vZGUgPT09IFwibGlzdFwiIHx8XG4gICAgICAgICAgYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSA9PT0gXCJzZXRcIikgJiZcbiAgICAgICAgICBibG9ja1R5cGUubWF4X2l0ZW1zID09PSAxLFxuICAgICAgKTtcblxuICAgICAgLy8gZGVmaW5lIHRoZSBhdHRyaWJ1dGVcbiAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgYXR0cmlidXRlRm9yQmxvY2tUeXBlKFxuICAgICAgICAgIGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgYmxvY2tUeXBlLFxuICAgICAgICAgIGJsb2NrU3RydWN0LFxuICAgICAgICAgIHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICBwYXJlbnRUeXBlLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlcztcblxuICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZUZvckJsb2NrVHlwZShcbiAgICAgIHRlcnJhZm9ybU5hbWU6IHN0cmluZyxcbiAgICAgIGJsb2NrVHlwZTogQmxvY2tUeXBlLFxuICAgICAgc3RydWN0OiBTdHJ1Y3QsXG4gICAgICBpc1Byb3ZpZGVyOiBib29sZWFuLFxuICAgICAgcGFyZW50OiBTY29wZSxcbiAgICApOiBBdHRyaWJ1dGVNb2RlbCB7XG4gICAgICBjb25zdCBuYW1lID0gdG9DYW1lbENhc2UodGVycmFmb3JtTmFtZSk7XG4gICAgICBsZXQgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgICBsZXQgcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgICAgIHN3aXRjaCAoYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSkge1xuICAgICAgICBjYXNlIFwic2luZ2xlXCI6XG4gICAgICAgICAgb3B0aW9uYWwgPSAhc3RydWN0LmF0dHJpYnV0ZXMuc29tZSgoeCkgPT4gIXgub3B0aW9uYWwpO1xuICAgICAgICAgIHJlcXVpcmVkID0gIXN0cnVjdC5hdHRyaWJ1dGVzLnNvbWUoKHgpID0+ICF4LnJlcXVpcmVkKTtcblxuICAgICAgICAgIC8vIFRoaXMgaXMgZm9yIGJ1ZyAjMzU3MCBhcyBib3RoIG9wdGlvbmFsIGFuZCByZXF1aXJlZCBldmFsdWF0ZSB0byBmYWxzZSB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXNcbiAgICAgICAgICAvLyAodGhpcyB0aGVuIGNhdXNlcyB0aGUgY29tcHV0ZWQgYmxvY2sgdG8gbm90IGJlIHBhcnQgb2YgYXNzaWduYWJsZUF0dHJpYnV0ZXMgYW5kIHRodXMgc2tpcHBlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUpXG4gICAgICAgICAgLy8gSGVuY2U6IElmIGJvdGggb3B0aW9uYWwgYW5kIHJlcXVpcmVkIGFyZSBmYWxzZSwgc2V0IG9wdGlvbmFsIHRvIHRydWUgSUYgYXQgbGVhc3Qgb25lXG4gICAgICAgICAgLy8gYXR0cmlidXRlIGluIHRoZSBibG9jayBoYXMgb3B0aW9uYWwgPSB0cnVlIG9yIHJlcXVpcmVkID0gdHJ1ZSwgYXMgdGhpcyB3b3VsZCBtZWFuIHRoYXQgYXQgbGVhc3Qgc29tZXRoaW5nIGNhbiBiZSBzZXRcbiAgICAgICAgICAvLyBhbmQgdGhlIGJsb2NrIGlzIG5vdCBhbGwgY29tcHV0ZWQuXG4gICAgICAgICAgaWYgKCFvcHRpb25hbCAmJiAhcmVxdWlyZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbmFsID0gc3RydWN0LmF0dHJpYnV0ZXMuc29tZSgoeCkgPT4geC5vcHRpb25hbCB8fCB4LnJlcXVpcmVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1OYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtRnVsbE5hbWU6IHBhcmVudC5mdWxsTmFtZSh0ZXJyYWZvcm1OYW1lKSxcbiAgICAgICAgICAgIHR5cGU6IG5ldyBTdHJ1Y3RBdHRyaWJ1dGVUeXBlTW9kZWwoc3RydWN0KSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHt0ZXJyYWZvcm1OYW1lfSBibG9ja2AsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIG9wdGlvbmFsLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IGlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVNb2RlbCh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtTmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybUZ1bGxOYW1lOiBwYXJlbnQuZnVsbE5hbWUodGVycmFmb3JtTmFtZSksXG4gICAgICAgICAgICB0eXBlOiBuZXcgTWFwQXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke3RlcnJhZm9ybU5hbWV9IGJsb2NrYCxcbiAgICAgICAgICAgIHN0b3JhZ2VOYW1lOiBgXyR7bmFtZX1gLFxuICAgICAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IGlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcImxpc3RcIjpcbiAgICAgICAgY2FzZSBcInNldFwiOlxuICAgICAgICAgIG9wdGlvbmFsID1cbiAgICAgICAgICAgIGJsb2NrVHlwZS5taW5faXRlbXMgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBibG9ja1R5cGUubWluX2l0ZW1zIDwgMTtcbiAgICAgICAgICByZXF1aXJlZCA9XG4gICAgICAgICAgICBibG9ja1R5cGUubWluX2l0ZW1zID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJsb2NrVHlwZS5taW5faXRlbXMgPiAwO1xuICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlTW9kZWwoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybU5hbWU6IHRlcnJhZm9ybU5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1GdWxsTmFtZTogcGFyZW50LmZ1bGxOYW1lKHRlcnJhZm9ybU5hbWUpLFxuICAgICAgICAgICAgdHlwZTpcbiAgICAgICAgICAgICAgYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSA9PT0gXCJsaXN0XCJcbiAgICAgICAgICAgICAgICA/IG5ldyBMaXN0QXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZS5tYXhfaXRlbXMgPT09IDEsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBuZXcgU2V0QXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZS5tYXhfaXRlbXMgPT09IDEsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke3RlcnJhZm9ybU5hbWV9IGJsb2NrYCxcbiAgICAgICAgICAgIHN0b3JhZ2VOYW1lOiBgXyR7bmFtZX1gLFxuICAgICAgICAgICAgb3B0aW9uYWwsXG4gICAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgICBwcm92aWRlcjogaXNQcm92aWRlcixcbiAgICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZEFub255bW91c1N0cnVjdChcbiAgICBzY29wZTogU2NvcGVbXSxcbiAgICBhdHRyczogeyBbbmFtZTogc3RyaW5nXTogQXR0cmlidXRlIH0gfCB1bmRlZmluZWQsXG4gICAgbmVzdGluZ19tb2RlOiBzdHJpbmcsXG4gICkge1xuICAgIGxldCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5PEF0dHJpYnV0ZU1vZGVsPigpO1xuICAgIGNvbnN0IHBhcmVudCA9IHNjb3BlW3Njb3BlLmxlbmd0aCAtIDFdO1xuICAgIGlmIChhdHRycykge1xuICAgICAgZm9yIChjb25zdCBbdGVycmFmb3JtTmFtZSwgYXR0XSBvZiBPYmplY3QuZW50cmllcyhhdHRycyB8fCB7fSkpIHtcbiAgICAgICAgLy8gbmVzdGVkIHR5cGVzIHN1cHBvcnQgY29tcHV0ZWQsIG9wdGlvbmFsIGFuZCByZXF1aXJlZCBvbiBhdHRyaWJ1dGUgbGV2ZWxcbiAgICAgICAgLy8gaWYgcGFyZW50IGlzIGNvbXB1dGVkLCBjaGlsZCBhbHdheXMgaXMgY29tcHV0ZWQgYXMgd2VsbFxuICAgICAgICBjb25zdCBjb21wdXRlZCA9XG4gICAgICAgICAgISFwYXJlbnQuaXNDb21wdXRlZCB8fCAocGFyZW50LmlzTmVzdGVkVHlwZSAmJiAhIWF0dC5jb21wdXRlZCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbmFsID0gcGFyZW50LmlzTmVzdGVkVHlwZVxuICAgICAgICAgID8gISFhdHQub3B0aW9uYWxcbiAgICAgICAgICA6ICEhcGFyZW50LmlzT3B0aW9uYWw7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gcGFyZW50LmlzTmVzdGVkVHlwZVxuICAgICAgICAgID8gISFhdHQucmVxdWlyZWRcbiAgICAgICAgICA6ICEhcGFyZW50LmlzUmVxdWlyZWQ7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0b0NhbWVsQ2FzZSh0ZXJyYWZvcm1OYW1lKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMucmVuZGVyQXR0cmlidXRlVHlwZShcbiAgICAgICAgICBbXG4gICAgICAgICAgICAuLi5zY29wZSxcbiAgICAgICAgICAgIG5ldyBTY29wZSh7XG4gICAgICAgICAgICAgIG5hbWU6IHRlcnJhZm9ybU5hbWUsXG4gICAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgICAgaXNQcm92aWRlcjogcGFyZW50LmlzUHJvdmlkZXIsXG4gICAgICAgICAgICAgIGlzQ29tcHV0ZWQ6IGNvbXB1dGVkLFxuICAgICAgICAgICAgICBpc09wdGlvbmFsOiBvcHRpb25hbCxcbiAgICAgICAgICAgICAgaXNSZXF1aXJlZDogcmVxdWlyZWQsXG4gICAgICAgICAgICAgIGlzTmVzdGVkVHlwZTogcGFyZW50LmlzTmVzdGVkVHlwZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYXR0LnR5cGUgfHwgYXR0Lm5lc3RlZF90eXBlLFxuICAgICAgICApO1xuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgICAgbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIGNvbXB1dGVkOiBjb21wdXRlZCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhdHQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBvcHRpb25hbDogb3B0aW9uYWwsXG4gICAgICAgICAgICB0ZXJyYWZvcm1OYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtRnVsbE5hbWU6IHBhcmVudC5mdWxsTmFtZSh0ZXJyYWZvcm1OYW1lKSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBwcm92aWRlcjogcGFyZW50LmlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZDogcmVxdWlyZWQsXG4gICAgICAgICAgICBpc1dyaXRlT25seTogISFhdHQud3JpdGVfb25seSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzID0gZGVkdXBsaWNhdGVBdHRyaWJ1dGVzV2l0aFNhbWVOYW1lKGF0dHJpYnV0ZXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuYWRkU3RydWN0KHNjb3BlLCBhdHRyaWJ1dGVzLCBuZXN0aW5nX21vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTdHJ1Y3QoXG4gICAgc2NvcGU6IFNjb3BlW10sXG4gICAgYXR0cmlidXRlczogQXR0cmlidXRlTW9kZWxbXSxcbiAgICBuZXN0aW5nX21vZGU6IHN0cmluZyxcbiAgICBpc1NpbmdsZUl0ZW0gPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgcG9zc2libGVOYW1lID0gdG9QYXNjYWxDYXNlKFxuICAgICAgc2NvcGUubWFwKCh4KSA9PiB0b1NuYWtlQ2FzZSh4Lm5hbWUpKS5qb2luKFwiX1wiKSxcbiAgICApO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnVuaXF1ZUNsYXNzTmFtZShcbiAgICAgIGlzUmVzZXJ2ZWRTdHJ1Y3RDbGFzc05hbWUocG9zc2libGVOYW1lKVxuICAgICAgICA/IGAke3Bvc3NpYmxlTmFtZX1TdHJ1Y3RgXG4gICAgICAgIDogcG9zc2libGVOYW1lLFxuICAgICk7XG5cbiAgICBjb25zdCBwYXJlbnQgPSBzY29wZVtzY29wZS5sZW5ndGggLSAxXTtcbiAgICAvLyBibG9ja1R5cGUubmVzdGluZ19tb2RlID0+IGxpc3Qvc2V0ICYgYmxvY2tUeXBlLm1heF9pdGVtcyA9PT0gMSxcbiAgICBjb25zdCBpc0NsYXNzID0gKHBhcmVudC5pc0NvbXB1dGVkICYmICFwYXJlbnQuaXNPcHRpb25hbCkgfHwgaXNTaW5nbGVJdGVtO1xuICAgIGNvbnN0IGlzQW5vbnltb3VzID0gdHJ1ZTtcbiAgICBjb25zdCBzID0gbmV3IFN0cnVjdChcbiAgICAgIG5hbWUsXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgaXNDbGFzcyxcbiAgICAgIGlzQW5vbnltb3VzLFxuICAgICAgaXNTaW5nbGVJdGVtLFxuICAgICAgbmVzdGluZ19tb2RlLFxuICAgICk7XG4gICAgdGhpcy5zdHJ1Y3RzLnB1c2gocyk7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlc291cmNlUGFyc2VyIHtcbiAgcHJpdmF0ZSB1bmlxdWVDbGFzc25hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHVuaXF1ZUJhc2VOYW1lczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZXNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW9kZWw+ID0ge307XG5cbiAgcHVibGljIHBhcnNlKFxuICAgIGZxcG46IEZRUE4sXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hLFxuICAgIHRlcnJhZm9ybVR5cGU6IHN0cmluZyxcbiAgICBjb25zdHJhaW50PzogQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICApOiBSZXNvdXJjZU1vZGVsIHtcbiAgICBpZiAodGhpcy5yZXNvdXJjZXNbdHlwZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc291cmNlc1t0eXBlXTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHRoaXMudW5pcXVlQ2xhc3NuYW1lcywgdGhpcy51bmlxdWVCYXNlTmFtZXMpO1xuICAgIGNvbnN0IHJlc291cmNlID0gcGFyc2VyLnJlc291cmNlRnJvbShcbiAgICAgIGZxcG4sXG4gICAgICB0eXBlLFxuICAgICAgc2NoZW1hLFxuICAgICAgdGVycmFmb3JtVHlwZSxcbiAgICAgIGNvbnN0cmFpbnQsXG4gICAgKTtcbiAgICB0aGlzLnJlc291cmNlc1t0eXBlXSA9IHJlc291cmNlO1xuICAgIHJldHVybiByZXNvdXJjZTtcbiAgfVxuXG4gIC8vIFVzZWQgYnkgY29udmVydCB0byBkZXRlcm1pbmUgdGhlIHJpZ2h0IG5hbWUgZm9yIGEgY2xhc3NcbiAgcHVibGljIGdldENsYXNzTmFtZUZvclJlc291cmNlKHRlcnJhZm9ybVR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZXNbdGVycmFmb3JtVHlwZV07XG4gICAgcmV0dXJuIHJlc291cmNlID8gcmVzb3VyY2UuY2xhc3NOYW1lIDogXCJcIjtcbiAgfVxuXG4gIC8vIFVzZWQgYnkgY29udmVydCB0byBkZXRlcm1pbmUgdGhlIHJpZ2h0IG5hbWUgZm9yIGEgbmFtZXNwYWNlXG4gIHB1YmxpYyBnZXROYW1lc3BhY2VOYW1lRm9yUmVzb3VyY2UodGVycmFmb3JtVHlwZTogc3RyaW5nKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlIGV4dGVybmFsIHByb3ZpZGVyIHNpbmNlIHRoZSBuYW1lIG9mIHJlc291cmNlIGRvZXNuJ3QgaGF2ZSBhIHByZWZpeFxuICAgIGlmICh0ZXJyYWZvcm1UeXBlID09PSBcImRhdGFfZXh0ZXJuYWxfXCIpIHtcbiAgICAgIHRlcnJhZm9ybVR5cGUgPSBcImRhdGFfZXh0ZXJuYWxcIjtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VzW3RlcnJhZm9ybVR5cGVdO1xuICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBmb2xkZXIgPSBgcHJvdmlkZXJzLyR7cmVzb3VyY2UucHJvdmlkZXJ9YDtcbiAgICByZXR1cm4gcmVzb3VyY2UuZmlsZVBhdGgucmVwbGFjZShgJHtmb2xkZXJ9L2AsIFwiXCIpLnJlcGxhY2UoXCIvaW5kZXgudHNcIiwgXCJcIik7XG4gIH1cbn1cbiJdfQ==
531
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dldC9nZW5lcmF0b3IvcmVzb3VyY2UtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQStFQSxvRUFvQkM7QUFuR0QsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyx5Q0FBbUU7QUFDbkUsNENBVXdCO0FBQ3hCLDREQUF1RTtBQUN2RSxxQ0FZa0I7QUFDbEIscURBQXdEO0FBQ3hELDZEQUEyRDtBQUUzRCxzRUFBc0U7QUFDdEUseUpBQXlKO0FBQ3pKLE1BQU0sZ0NBQWdDLEdBQUc7SUFDdkMsWUFBWTtJQUNaLFdBQVc7SUFDWCxLQUFLO0lBQ0wsU0FBUztJQUNULFNBQVM7SUFDVCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztDQUNSLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHO0lBQ2hDLG1IQUFtSDtJQUNuSCxTQUFTO0lBQ1QsMkJBQTJCO0lBQzNCLFNBQVM7Q0FDVixDQUFDO0FBRUYsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLFNBQWlCLEVBQVcsRUFBRTtJQUNwRSxPQUFPO1FBQ0wsUUFBUTtRQUNSLFFBQVE7UUFDUixVQUFVO1FBQ1YsR0FBRyxnQ0FBZ0M7UUFDbkMsR0FBRyx5QkFBeUI7S0FDN0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDdEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLFNBQWlCLEVBQVcsRUFBRTtJQUMvRCxPQUFPLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbEQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxRQUFzQixFQUFFLFFBQWdCLEVBQVUsRUFBRTtJQUN2RSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN6QixP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QztJQUNsQixDQUFDO0lBRUQsMERBQTBEO0lBQ25ELHVCQUF1QixDQUFDLGFBQXFCO1FBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsOERBQThEO0lBQ3ZELDJCQUEyQixDQUFDLGFBQXFCO1FBQ3RELGtGQUFrRjtRQUNsRixJQUFJLGFBQWEsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3ZDLGFBQWEsR0FBRyxlQUFlLENBQUM7UUFDbEMsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsYUFBYSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEQsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNGO0FBaERELHdDQWdEQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyB0b0NhbWVsQ2FzZSwgdG9QYXNjYWxDYXNlLCB0b1NuYWtlQ2FzZSB9IGZyb20gXCJjb2RlbWFrZXJcIjtcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZSxcbiAgQXR0cmlidXRlTmVzdGVkVHlwZSxcbiAgQXR0cmlidXRlVHlwZSxcbiAgQmxvY2ssXG4gIEJsb2NrVHlwZSxcbiAgQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICBpc0F0dHJpYnV0ZU5lc3RlZFR5cGUsXG4gIGlzTmVzdGVkVHlwZUF0dHJpYnV0ZSxcbiAgU2NoZW1hLFxufSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7IFByb3ZpZGVyTmFtZSwgRlFQTiwgcGFyc2VGUVBOIH0gZnJvbSBcIkBjZGt0bi9wcm92aWRlci1zY2hlbWFcIjtcbmltcG9ydCB7XG4gIFJlc291cmNlTW9kZWwsXG4gIEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgU3RydWN0LFxuICBTY29wZSxcbiAgQXR0cmlidXRlTW9kZWwsXG4gIFNpbXBsZUF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgTGlzdEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgU2V0QXR0cmlidXRlVHlwZU1vZGVsLFxuICBNYXBBdHRyaWJ1dGVUeXBlTW9kZWwsXG4gIFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbCxcbiAgU2tpcHBlZEF0dHJpYnV0ZVR5cGVNb2RlbCxcbn0gZnJvbSBcIi4vbW9kZWxzXCI7XG5pbXBvcnQgeyBkZXRlY3RBdHRyaWJ1dGVMb29wcyB9IGZyb20gXCIuL2xvb3AtZGV0ZWN0aW9uXCI7XG5pbXBvcnQgeyBzaG91bGRTa2lwQXR0cmlidXRlIH0gZnJvbSBcIi4vc2tpcHBlZC1hdHRyaWJ1dGVzXCI7XG5cbi8vIENhbid0IGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMgbGlrZSBcImV4cG9ydCAqIGFzIDxrZXl3b3JkPiBmcm9tIC4uLiBcIlxuLy8gZmlsdGVyZWQgZnJvbSBhbGwga2V5d29yZHMgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2Jsb2IvNTAzNjA0Yzg4NGJkMDU1N2M4NTFiMTFiNjk5ZWY5OGNkYjY1YjkzYi9zcmMvY29tcGlsZXIvdHlwZXMudHMjTDExNC1MMTk3XG5jb25zdCBSRVNFUlZFRF9LRVlXT1JEU19GT1JfTkFNRVNQQUNFUyA9IFtcbiAgXCJpbXBsZW1lbnRzXCIsXG4gIFwiaW50ZXJmYWNlXCIsXG4gIFwibGV0XCIsXG4gIFwicGFja2FnZVwiLFxuICBcInByaXZhdGVcIixcbiAgXCJwcm90ZWN0ZWRcIixcbiAgXCJwdWJsaWNcIixcbiAgXCJzdGF0aWNcIixcbiAgXCJ5aWVsZFwiLFxuICBcImF3YWl0XCIsXG5dO1xuXG5jb25zdCBDT0xMSURJTkdfTkFNRVNQQUNFX05BTUVTID0gW1xuICAvLyBlLmcuIGhhc2hpY29ycC9jb25zdWwg4oCTIGNvbGxpZGVzIHdpdGggdGhlIExJQ0VOU0UgZmlsZSBvbiBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW1zIGluIHRoZSBHbyBwYWNrYWdlICgjMjYyNylcbiAgXCJsaWNlbnNlXCIsXG4gIC8vIGNvbGxpZGVzIGZvciBHbyBwYWNrYWdlc1xuICBcInZlcnNpb25cIixcbl07XG5cbmNvbnN0IGlzUmVzZXJ2ZWRDbGFzc09yTmFtZXNwYWNlTmFtZSA9IChjbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gW1xuICAgIFwic3RyaW5nXCIsXG4gICAgXCJvYmplY3RcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgLi4uUkVTRVJWRURfS0VZV09SRFNfRk9SX05BTUVTUEFDRVMsXG4gICAgLi4uQ09MTElESU5HX05BTUVTUEFDRV9OQU1FUyxcbiAgXS5pbmNsdWRlcyhjbGFzc05hbWUudG9Mb3dlckNhc2UoKSk7XG59O1xuXG5jb25zdCBpc1Jlc2VydmVkU3RydWN0Q2xhc3NOYW1lID0gKGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBjbGFzc05hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChcImxpc3RcIik7XG59O1xuXG5jb25zdCBnZXRGaWxlTmFtZSA9IChwcm92aWRlcjogUHJvdmlkZXJOYW1lLCBiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKGJhc2VOYW1lID09PSBcImluZGV4XCIpIHtcbiAgICByZXR1cm4gXCJpbmRleC1yZXNvdXJjZS9pbmRleC50c1wiO1xuICB9XG5cbiAgaWYgKGJhc2VOYW1lID09PSBgJHtwcm92aWRlcn1fcHJvdmlkZXJgKSB7XG4gICAgcmV0dXJuIFwicHJvdmlkZXIvaW5kZXgudHNcIjtcbiAgfVxuXG4gIHJldHVybiBgJHt0b1NuYWtlQ2FzZShiYXNlTmFtZSkucmVwbGFjZSgvXy9nLCBcIi1cIil9L2luZGV4LnRzYDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUNsYXNzT3JOYW1lc3BhY2VOYW1lKFxuICBiYXNlTmFtZTogc3RyaW5nLFxuICBpc1Byb3ZpZGVyID0gZmFsc2UsXG4pIHtcbiAgY29uc3QgcmVzb3VyY2VJc05hbWVkUHJvdmlkZXIgPSAhaXNQcm92aWRlciAmJiBiYXNlTmFtZSA9PT0gXCJwcm92aWRlclwiO1xuICAvLyBBIHJlc291cmNlIG5hbWVkIGA8cHJvdmlkZXI+X3Byb3ZpZGVyX2Z1bmN0aW9uc2AgbWFwcyB0byB0aGUgc2FtZVxuICAvLyBwcm92aWRlcnMvPHByb3ZpZGVyPi9wcm92aWRlci1mdW5jdGlvbnMvIGRpcmVjdG9yeSB0aGF0IHRoZSBwcm92aWRlcidzXG4gIC8vIGZ1bmN0aW9ucyBzdWJtb2R1bGUgaXMgZW1pdHRlZCB0bywgYW5kIHdvdWxkIHNpbGVudGx5IG92ZXJ3cml0ZSBpdC5cbiAgY29uc3QgcmVzb3VyY2VJc05hbWVkUHJvdmlkZXJGdW5jdGlvbnMgPVxuICAgICFpc1Byb3ZpZGVyICYmIGJhc2VOYW1lID09PSBcInByb3ZpZGVyX2Z1bmN0aW9uc1wiO1xuXG4gIGlmIChcbiAgICBpc1Jlc2VydmVkQ2xhc3NPck5hbWVzcGFjZU5hbWUoYmFzZU5hbWUpIHx8XG4gICAgcmVzb3VyY2VJc05hbWVkUHJvdmlkZXIgfHxcbiAgICByZXNvdXJjZUlzTmFtZWRQcm92aWRlckZ1bmN0aW9uc1xuICApIHtcbiAgICByZXR1cm4gYCR7YmFzZU5hbWV9X3Jlc291cmNlYDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZU5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgYXR0cmlidXRlcyB0aGF0IG1heSBjb25mbGljdCBhZnRlciBiZWluZyBzbmFrZSBjYXNlZFxuICogRXhhbXBsZTogb2NpX2NvcmVfaXBzZWNfY29ubmVjdGlvbl90dW5uZWxfbWFuYWdlbWVudCAoaGFzaGljb3JwL29jaUA9NS4yMS4wKSBoYXMgYmdwX2lwdjZfc3RhdGUgYW5kIGJncF9pcHY2c3RhdGVcbiAqICh3aGljaCBib3RoIHJlc3VsdCBpbiBcImJncElwdjZTdGF0ZVwiIHdoZW4gY2FtZWwtY2FzZWQsIHdpdGggdGhlIHNlY29uZCBvbmUgYmVpbmcgZGVwcmVjYXRlZDogdHJ1ZSlcbiAqIEFzIHdlIGN1cnJlbnRseSBkb24ndCBoYW5kbGUgYW55IGRlcHJlY2F0ZWQgb25lcyBhdCBhbGwsIHdlJ2xsIGp1c3QgZGVsZXRlIG9uZSBvZiB0aGUgdHdvIGF0dHJpYnV0ZXMgZm9yIG5vd1xuICogQHBhcmFtIGF0dHJpYnV0ZXNcbiAqL1xuZnVuY3Rpb24gZGVkdXBsaWNhdGVBdHRyaWJ1dGVzV2l0aFNhbWVOYW1lKFxuICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNb2RlbFtdLFxuKTogQXR0cmlidXRlTW9kZWxbXSB7XG4gIHJldHVybiBhdHRyaWJ1dGVzLmZpbHRlcigoYXR0ciwgaWR4KSA9PiB7XG4gICAgY29uc3QgaGFzT3RoZXJXaXRoU2FtZU5hbWUgPSBhdHRyaWJ1dGVzXG4gICAgICAuc2xpY2UoaWR4ICsgMSkgLy8gb25seSBzZWFyY2ggYWZ0ZXIgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGF0dHJpYnV0ZSB0byBhdm9pZCBkZWxldGluZyBib3RoXG4gICAgICAuc29tZSgob3RoZXIpID0+IG90aGVyLm5hbWUgPT09IGF0dHIubmFtZSAmJiBvdGhlciAhPT0gYXR0cik7XG4gICAgcmV0dXJuICFoYXNPdGhlcldpdGhTYW1lTmFtZTtcbiAgfSk7XG59XG5cbmNsYXNzIFBhcnNlciB7XG4gIHByaXZhdGUgc3RydWN0cyA9IG5ldyBBcnJheTxTdHJ1Y3Q+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjbGFzc05hbWVzOiBzdHJpbmdbXSxcbiAgICBwcml2YXRlIHVzZWRCYXNlTmFtZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gICkge31cblxuICBwcml2YXRlIHVuaXF1ZUNsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY2xhc3NOYW1lcy5pbmNsdWRlcyhjbGFzc05hbWUpKSB7XG4gICAgICBjbGFzc05hbWUgPSBgJHtjbGFzc05hbWV9QWA7XG4gICAgfVxuICAgIHRoaXMuY2xhc3NOYW1lcy5wdXNoKGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYmFzZSBuYW1lcyBhcmUgdW5pcXVlIGNhc2UtaW5zZW5zaXRpdmVseS5cbiAgICpcbiAgICogQWZmZWN0ZWQgbGFuZ3VhZ2VzOlxuICAgKiAtIEdvOiBKU0lJLWdlbmVyYXRlZCBHbyBwYWNrYWdlIG5hbWVzIGFyZSBmdWxseSBsb3dlcmNhc2VkLCBzb1xuICAgKiAgIGBsb2FkLWJhbGFuY2VyLWJhY2tlbmRzZXRgIGFuZCBgbG9hZC1iYWxhbmNlci1iYWNrZW5kLXNldGAgYm90aFxuICAgKiAgIGJlY29tZSBwYWNrYWdlIGBsb2FkYmFsYW5jZXJiYWNrZW5kc2V0YCwgY2F1c2luZyBhIGhhcmQgYnVpbGQgZmFpbHVyZTpcbiAgICogICBcImNhc2UtaW5zZW5zaXRpdmUgZmlsZSBuYW1lIGNvbGxpc2lvblwiLlxuICAgKiAtIEMjOiBKU0lJIGdlbmVyYXRlcyBQYXNjYWxDYXNlIGRpcmVjdG9yaWVzIGxpa2VcbiAgICogICBgTG9hZEJhbGFuY2VyQmFja2VuZHNldC9gIGFuZCBgTG9hZEJhbGFuY2VyQmFja2VuZFNldC9gIHdoaWNoIHRoZSBDI1xuICAgKiAgIGNvbXBpbGVyIHRyZWF0cyBjYXNlLWluc2Vuc2l0aXZlbHksIGNhdXNpbmcgQ1MyMDAyIGFuZCBDUzAyMzQgZXJyb3JzLlxuICAgKi9cbiAgcHJpdmF0ZSB1bmlxdWVCYXNlTmFtZShiYXNlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXNjYWxOYW1lID0gdG9QYXNjYWxDYXNlKGJhc2VOYW1lKTtcbiAgICBjb25zdCBrZXkgPSBwYXNjYWxOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnVzZWRCYXNlTmFtZXMuZ2V0KGtleSk7XG5cbiAgICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCAmJiBleGlzdGluZyAhPT0gcGFzY2FsTmFtZSkge1xuICAgICAgYmFzZU5hbWUgPSBgJHtiYXNlTmFtZX1BYDtcbiAgICAgIHJldHVybiB0aGlzLnVuaXF1ZUJhc2VOYW1lKGJhc2VOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZWRCYXNlTmFtZXMuc2V0KGtleSwgcGFzY2FsTmFtZSk7XG4gICAgcmV0dXJuIGJhc2VOYW1lO1xuICB9XG5cbiAgcHVibGljIHJlc291cmNlRnJvbShcbiAgICBmcXBuOiBGUVBOLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYSxcbiAgICB0ZXJyYWZvcm1TY2hlbWFUeXBlOiBzdHJpbmcsXG4gICAgY29uc3RyYWludD86IENvbnN0cnVjdHNNYWtlclRhcmdldCxcbiAgKTogUmVzb3VyY2VNb2RlbCB7XG4gICAgbGV0IGJhc2VOYW1lID0gdHlwZTtcblxuICAgIGNvbnN0IHByb3ZpZGVyTmFtZUZyb21Db25zdHJhaW50ID0gY29uc3RyYWludFxuICAgICAgPyAoY29uc3RyYWludC5uYW1lIGFzIFByb3ZpZGVyTmFtZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb3ZpZGVyTmFtZUZyb21GUVBOID0gcGFyc2VGUVBOKGZxcG4pLm5hbWU7XG5cbiAgICBpZiAoYmFzZU5hbWUuc3RhcnRzV2l0aChgJHtwcm92aWRlck5hbWVGcm9tRlFQTn1fYCkpIHtcbiAgICAgIGJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyKHByb3ZpZGVyTmFtZUZyb21GUVBOLmxlbmd0aCArIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3ZpZGVyTmFtZSA9IHByb3ZpZGVyTmFtZUZyb21Db25zdHJhaW50XG4gICAgICA/IHByb3ZpZGVyTmFtZUZyb21Db25zdHJhaW50XG4gICAgICA6IHByb3ZpZGVyTmFtZUZyb21GUVBOO1xuXG4gICAgY29uc3QgaXNQcm92aWRlciA9IHRlcnJhZm9ybVNjaGVtYVR5cGUgPT09IFwicHJvdmlkZXJcIjtcbiAgICBpZiAoaXNQcm92aWRlcikge1xuICAgICAgYmFzZU5hbWUgPSBgJHtwcm92aWRlck5hbWV9XyR7YmFzZU5hbWV9YDtcbiAgICAgIGlmICghKFwiYXR0cmlidXRlc1wiIGluIHNjaGVtYS5ibG9jaykpIHtcbiAgICAgICAgc2NoZW1hLmJsb2NrID0ge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgIGJsb2NrX3R5cGVzOiAoc2NoZW1hLmJsb2NrIGFzIEJsb2NrKS5ibG9ja190eXBlcyB8fCB7fSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIHNvbWVob3cgbWlzc2luZyBmcm9tIHByb3ZpZGVyIHNjaGVtYVxuICAgICAgc2NoZW1hLmJsb2NrLmF0dHJpYnV0ZXNbXCJhbGlhc1wiXSA9IHtcbiAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQWxpYXMgbmFtZVwiLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBiYXNlTmFtZSA9IHNhbml0aXplQ2xhc3NPck5hbWVzcGFjZU5hbWUoYmFzZU5hbWUsIGlzUHJvdmlkZXIpO1xuICAgIGJhc2VOYW1lID0gdGhpcy51bmlxdWVCYXNlTmFtZShiYXNlTmFtZSk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLnVuaXF1ZUNsYXNzTmFtZSh0b1Bhc2NhbENhc2UoYmFzZU5hbWUpKTtcbiAgICAvLyBhdm9pZCBuYW1pbmcgY29sbGlzaW9uIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9pc3N1ZXMvMjk5XG4gICAgY29uc3QgY29uZmlnU3RydWN0TmFtZSA9IHRoaXMudW5pcXVlQ2xhc3NOYW1lKGAke2NsYXNzTmFtZX1Db25maWdgKTtcbiAgICBjb25zdCBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKHByb3ZpZGVyTmFtZSwgYmFzZU5hbWUpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSBgcHJvdmlkZXJzLyR7dG9TbmFrZUNhc2UocHJvdmlkZXJOYW1lKX0vJHtmaWxlTmFtZX1gO1xuICAgIGxldCBhdHRyaWJ1dGVzID0gdGhpcy5yZW5kZXJBdHRyaWJ1dGVzRm9yQmxvY2soXG4gICAgICBuZXcgU2NvcGUoe1xuICAgICAgICBuYW1lOiBiYXNlTmFtZSxcbiAgICAgICAgaXNQcm92aWRlcixcbiAgICAgICAgcGFyZW50OiBpc1Byb3ZpZGVyXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IG5ldyBTY29wZSh7IG5hbWU6IHByb3ZpZGVyTmFtZSwgaXNQcm92aWRlcjogdHJ1ZSB9KSxcbiAgICAgIH0pLFxuICAgICAgc2NoZW1hLmJsb2NrLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBnZXRTdHJ1Y3RBdHRyaWJ1dGUoXG4gICAgICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNb2RlbFtdLFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICk6IEF0dHJpYnV0ZU1vZGVsIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZmluZCgoYXR0KSA9PiB7XG4gICAgICAgIHJldHVybiBhdHQudGVycmFmb3JtTmFtZSA9PT0gZmlyc3Q7XG4gICAgICB9KTtcbiAgICAgIGlmICghYXR0cmlidXRlKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIHRvIGZpbmQgcmVjdXJzaXZlIGF0dHJpYnV0ZSBhdCBwYXRoOiAke3BhdGh9YCxcbiAgICAgICAgKTtcbiAgICAgIGlmICghYXR0cmlidXRlLnR5cGUuc3RydWN0KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIHRvIGZpbmQgc3RydWN0IHR5cGUgYXR0cmlidXRlIGF0IHBhdGg6ICR7cGF0aH0gYnV0IGdvdCAke2F0dHJpYnV0ZS50eXBlLnN0b3JlZENsYXNzVHlwZX1gLFxuICAgICAgICApO1xuICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSByZXR1cm4gYXR0cmlidXRlO1xuICAgICAgcmV0dXJuIGdldFN0cnVjdEF0dHJpYnV0ZShcbiAgICAgICAgYXR0cmlidXRlLnR5cGUuc3RydWN0LmF0dHJpYnV0ZXMsXG4gICAgICAgIHJlc3Quam9pbihcIi5cIiksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEludHJvZHVjZSByZWN1cnNpb24gZm9yIHNvbWUgYXR0cmlidXRlc1xuICAgIGNvbnN0IHJlY3Vyc2l2ZUF0dHJpYnV0ZVBhdGhzID0gZGV0ZWN0QXR0cmlidXRlTG9vcHMoYXR0cmlidXRlcyk7XG5cbiAgICBPYmplY3QuZW50cmllcyhyZWN1cnNpdmVBdHRyaWJ1dGVQYXRocykuZm9yRWFjaChcbiAgICAgIChbYXR0cmlidXRlUGF0aCwgc3RydWN0UGF0aF0pID0+IHtcbiAgICAgICAgLy8gVE9ETzogYnVpbGQgdGhpcyB0byBiZSBhIGJpdCBtb3JlIGRlZmVuc2l2ZSAoZS5nLiByZW1vdmUgISBvcGVyYXRvcilcbiAgICAgICAgY29uc3QgcmVjdXJzaW9uVGFyZ2V0U3RydWN0QXR0cmlidXRlID0gZ2V0U3RydWN0QXR0cmlidXRlKFxuICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgc3RydWN0UGF0aCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBhdHRyaWJ1dGVQYXRoLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IHBhcnRzLnBvcCgpO1xuICAgICAgICBjb25zdCBwYXJlbnRBdHRyaWJ1dGUgPSBnZXRTdHJ1Y3RBdHRyaWJ1dGUoYXR0cmlidXRlcywgcGFydHMuam9pbihcIi5cIikpO1xuICAgICAgICBjb25zdCBpbmRleFRvUmVwbGFjZSA9XG4gICAgICAgICAgcGFyZW50QXR0cmlidXRlLnR5cGUuc3RydWN0IS5hdHRyaWJ1dGVzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChhdHQpID0+IGF0dC50ZXJyYWZvcm1OYW1lID09PSBhdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChpbmRleFRvUmVwbGFjZSA9PT0gLTEpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBhdHRyaWJ1dGUgYXQgcGF0aCBcIiArIGF0dHJpYnV0ZVBhdGgpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0F0dHJpYnV0ZSA9XG4gICAgICAgICAgcGFyZW50QXR0cmlidXRlLnR5cGUuc3RydWN0IS5hdHRyaWJ1dGVzW2luZGV4VG9SZXBsYWNlXTtcblxuICAgICAgICBwYXJlbnRBdHRyaWJ1dGUudHlwZS5zdHJ1Y3QhLmF0dHJpYnV0ZXNbaW5kZXhUb1JlcGxhY2VdID1cbiAgICAgICAgICByZWN1cnNpb25UYXJnZXRTdHJ1Y3RBdHRyaWJ1dGU7IC8vIGludHJvZHVjZSByZWN1cnNpb25cblxuICAgICAgICAvLyB1Z2x5LCBwbHMgY8y2Ycy2bMy2bMy2IHJlZmFjdG9yIG1lIG1heWJlXG4gICAgICAgIC8vIHdlIHN0b3JlIGFsbCBzdHJ1Y3RzIGluIHRoaXMuc3RydWN0cyDigJMgbm93IHdlIG5lZWQgdG8gZGlzcG9zZSBhbGwgc3RydWN0cyB0aGF0IGFyZSBwYXJ0IG9mIHByZXZpb3VzQXR0cmlidXRlXG4gICAgICAgIGNvbnN0IGRpc3Bvc2VTdHJ1Y3RzID0gKGF0dHI6IEF0dHJpYnV0ZU1vZGVsKSA9PiB7XG4gICAgICAgICAgaWYgKGF0dHIudHlwZS5zdHJ1Y3QpIHtcbiAgICAgICAgICAgIGF0dHIudHlwZS5zdHJ1Y3QuYXR0cmlidXRlcy5mb3JFYWNoKGRpc3Bvc2VTdHJ1Y3RzKTtcbiAgICAgICAgICAgIHRoaXMuc3RydWN0cyA9IHRoaXMuc3RydWN0cy5maWx0ZXIoKHMpID0+IHMgIT09IGF0dHIudHlwZS5zdHJ1Y3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkaXNwb3NlU3RydWN0cyhwcmV2aW91c0F0dHJpYnV0ZSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBhdHRyaWJ1dGVzID0gZGVkdXBsaWNhdGVBdHRyaWJ1dGVzV2l0aFNhbWVOYW1lKGF0dHJpYnV0ZXMpO1xuXG4gICAgY29uc3QgcmVzb3VyY2VNb2RlbCA9IG5ldyBSZXNvdXJjZU1vZGVsKHtcbiAgICAgIHRlcnJhZm9ybVR5cGU6IHR5cGUsXG4gICAgICBiYXNlTmFtZSxcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzY2hlbWEsXG4gICAgICBmcXBuLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIHRlcnJhZm9ybVNjaGVtYVR5cGUsXG4gICAgICBzdHJ1Y3RzOiB0aGlzLnN0cnVjdHMsXG4gICAgICBjb25maWdTdHJ1Y3ROYW1lLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc291cmNlTW9kZWw7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckF0dHJpYnV0ZVR5cGUoXG4gICAgc2NvcGU6IFNjb3BlW10sXG4gICAgYXR0cmlidXRlVHlwZTogQXR0cmlidXRlVHlwZSB8IEF0dHJpYnV0ZU5lc3RlZFR5cGUsXG4gICAgcGFyZW50S2luZD86IHN0cmluZyxcbiAgKTogQXR0cmlidXRlVHlwZU1vZGVsIHtcbiAgICBjb25zdCBwYXJlbnQgPSBzY29wZVtzY29wZS5sZW5ndGggLSAxXTtcbiAgICBpZiAoc2hvdWxkU2tpcEF0dHJpYnV0ZShwYXJlbnQuYmFzZU5hbWUpKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcEF0dHJpYnV0ZVR5cGVNb2RlbChuZXcgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsKFwiYW55XCIpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZVR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlVHlwZSkge1xuICAgICAgICBjYXNlIFwiYm9vbFwiOlxuICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsKFwiYm9vbGVhblwiKTtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlQXR0cmlidXRlVHlwZU1vZGVsKFwic3RyaW5nXCIpO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVBdHRyaWJ1dGVUeXBlTW9kZWwoXCJudW1iZXJcIik7XG4gICAgICAgIGNhc2UgXCJkeW5hbWljXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXBBdHRyaWJ1dGVUeXBlTW9kZWwobmV3IFNpbXBsZUF0dHJpYnV0ZVR5cGVNb2RlbChcImFueVwiKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHByaW1pdGl2ZSB0eXBlICR7YXR0cmlidXRlVHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVUeXBlKSkge1xuICAgICAgaWYgKGF0dHJpYnV0ZVR5cGUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBhcnJheWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBba2luZCwgdHlwZV0gPSBhdHRyaWJ1dGVUeXBlO1xuXG4gICAgICBpZiAoa2luZCA9PT0gXCJzZXRcIiB8fCBraW5kID09PSBcImxpc3RcIikge1xuICAgICAgICBjb25zdCBlbGVtZW50VHlwZSA9IHRoaXMucmVuZGVyQXR0cmlidXRlVHlwZShcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB0eXBlIGFzIEF0dHJpYnV0ZVR5cGUsXG4gICAgICAgICAgW2tpbmQsIHBhcmVudEtpbmRdLmpvaW4oXCJcIiksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBraW5kID09PSBcImxpc3RcIlxuICAgICAgICAgID8gbmV3IExpc3RBdHRyaWJ1dGVUeXBlTW9kZWwoZWxlbWVudFR5cGUsIGZhbHNlLCBmYWxzZSlcbiAgICAgICAgICA6IG5ldyBTZXRBdHRyaWJ1dGVUeXBlTW9kZWwoZWxlbWVudFR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kID09PSBcIm1hcFwiKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMucmVuZGVyQXR0cmlidXRlVHlwZShcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICB0eXBlIGFzIEF0dHJpYnV0ZVR5cGUsXG4gICAgICAgICAgW2tpbmQsIHBhcmVudEtpbmRdLmpvaW4oXCJcIiksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgTWFwQXR0cmlidXRlVHlwZU1vZGVsKHZhbHVlVHlwZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IG9iakF0dHJpYnV0ZXMgPSB0eXBlIGFzIHsgW25hbWU6IHN0cmluZ106IEF0dHJpYnV0ZVR5cGUgfTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlczogeyBbbmFtZTogc3RyaW5nXTogQXR0cmlidXRlIH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdHlwZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqQXR0cmlidXRlcykpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzW25hbWVdID0geyB0eXBlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICBwYXJlbnRLaW5kID8/IGtpbmQsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQXR0cmlidXRlTmVzdGVkVHlwZShhdHRyaWJ1dGVUeXBlKSkge1xuICAgICAgbGV0IHN0cnVjdCA9IHVuZGVmaW5lZDtcbiAgICAgIGxldCB0eXBlTW9kZWwgPSB1bmRlZmluZWQ7XG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlKSB7XG4gICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHlwZU1vZGVsID0gbmV3IExpc3RBdHRyaWJ1dGVUeXBlTW9kZWwoXG4gICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgICAgICBzdHJ1Y3QgPSB0aGlzLmFkZEFub255bW91c1N0cnVjdChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgYXR0cmlidXRlVHlwZS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgYXR0cmlidXRlVHlwZS5uZXN0aW5nX21vZGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0eXBlTW9kZWwgPSBuZXcgU2V0QXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHlwZU1vZGVsID0gbmV3IE1hcEF0dHJpYnV0ZVR5cGVNb2RlbChcbiAgICAgICAgICAgIG5ldyBTdHJ1Y3RBdHRyaWJ1dGVUeXBlTW9kZWwoc3RydWN0KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic2luZ2xlXCI6XG4gICAgICAgICAgc3RydWN0ID0gdGhpcy5hZGRBbm9ueW1vdXNTdHJ1Y3QoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUubmVzdGluZ19tb2RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHlwZU1vZGVsID0gbmV3IFN0cnVjdEF0dHJpYnV0ZVR5cGVNb2RlbChzdHJ1Y3QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYG5lc3RlZF90eXBlIHdpdGggbmVzdGluZ19tb2RlIFwiJHtcbiAgICAgICAgICAgICAgYXR0cmlidXRlVHlwZS5uZXN0aW5nX21vZGVcbiAgICAgICAgICAgIH1cIiBub3Qgc3VwcG9ydGVkIChhdHRyaWJ1dGUgc2NvcGU6ICR7c2NvcGVcbiAgICAgICAgICAgICAgLm1hcCgocykgPT4gcy5mdWxsTmFtZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIsXCIpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVNb2RlbDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gdHlwZSAke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZVR5cGUpfWApO1xuICB9XG5cbiAgcHVibGljIHJlbmRlckF0dHJpYnV0ZXNGb3JCbG9jayhwYXJlbnRUeXBlOiBTY29wZSwgYmxvY2s6IEJsb2NrKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheTxBdHRyaWJ1dGVNb2RlbD4oKTtcblxuICAgIGZvciAoY29uc3QgW3RlcnJhZm9ybUF0dHJpYnV0ZU5hbWUsIGF0dF0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICBibG9jay5hdHRyaWJ1dGVzIHx8IHt9LFxuICAgICkpIHtcbiAgICAgIGxldCB0eXBlOiBBdHRyaWJ1dGVUeXBlTW9kZWw7XG4gICAgICBsZXQgZm9yY2VQbGFpbkdldHRlclR5cGUgPSBmYWxzZTtcbiAgICAgIGlmIChzaG91bGRTa2lwQXR0cmlidXRlKHBhcmVudFR5cGUuZnVsbE5hbWUodGVycmFmb3JtQXR0cmlidXRlTmFtZSkpKSB7XG4gICAgICAgIHR5cGUgPSBuZXcgU2tpcHBlZEF0dHJpYnV0ZVR5cGVNb2RlbCgpO1xuICAgICAgICBmb3JjZVBsYWluR2V0dGVyVHlwZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gdGhpcy5yZW5kZXJBdHRyaWJ1dGVUeXBlKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgICAgICBuZXcgU2NvcGUoe1xuICAgICAgICAgICAgICBuYW1lOiB0ZXJyYWZvcm1BdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHBhcmVudFR5cGUsXG4gICAgICAgICAgICAgIGlzUHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICAgICAgaXNDb21wdXRlZDogISFhdHQuY29tcHV0ZWQsXG4gICAgICAgICAgICAgIGlzT3B0aW9uYWw6ICEhYXR0Lm9wdGlvbmFsLFxuICAgICAgICAgICAgICBpc1JlcXVpcmVkOiAhIWF0dC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgaXNOZXN0ZWRUeXBlOiBpc05lc3RlZFR5cGVBdHRyaWJ1dGUoYXR0KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYXR0LnR5cGUgfHwgYXR0Lm5lc3RlZF90eXBlLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gdG9DYW1lbENhc2UodGVycmFmb3JtQXR0cmlidXRlTmFtZSk7XG5cbiAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICB0ZXJyYWZvcm1GdWxsTmFtZTogcGFyZW50VHlwZS5mdWxsTmFtZSh0ZXJyYWZvcm1BdHRyaWJ1dGVOYW1lKSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYXR0LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgc3RvcmFnZU5hbWU6IGBfJHtuYW1lfWAsXG4gICAgICAgICAgY29tcHV0ZWQ6ICEhYXR0LmNvbXB1dGVkLFxuICAgICAgICAgIG9wdGlvbmFsOiAhIWF0dC5vcHRpb25hbCxcbiAgICAgICAgICB0ZXJyYWZvcm1OYW1lOiB0ZXJyYWZvcm1BdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgcHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICByZXF1aXJlZDogISFhdHQucmVxdWlyZWQsXG4gICAgICAgICAgZm9yY2VQbGFpbkdldHRlclR5cGUsXG4gICAgICAgICAgaXNXcml0ZU9ubHk6ICEhYXR0LndyaXRlX29ubHksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtibG9ja1R5cGVOYW1lLCBibG9ja1R5cGVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgYmxvY2suYmxvY2tfdHlwZXMgfHwge30sXG4gICAgKSkge1xuICAgICAgaWYgKHNob3VsZFNraXBBdHRyaWJ1dGUocGFyZW50VHlwZS5mdWxsTmFtZShibG9ja1R5cGVOYW1lKSkpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRvQ2FtZWxDYXNlKGJsb2NrVHlwZU5hbWUpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBuZXcgU2NvcGUoe1xuICAgICAgICAgIG5hbWU6IGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgcGFyZW50OiBwYXJlbnRUeXBlLFxuICAgICAgICAgIGlzUHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgICBuZXcgQXR0cmlidXRlTW9kZWwoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybU5hbWU6IGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1GdWxsTmFtZTogcGFyZW50LmZ1bGxOYW1lKGJsb2NrVHlwZU5hbWUpLFxuICAgICAgICAgICAgdHlwZTogbmV3IFNraXBwZWRBdHRyaWJ1dGVUeXBlTW9kZWwoKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtibG9ja1R5cGVOYW1lfSBibG9ja2AsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBjcmVhdGUgYSBzdHJ1Y3QgZm9yIHRoaXMgYmxvY2tcbiAgICAgIGxldCBibG9ja0F0dHJpYnV0ZXMgPSB0aGlzLnJlbmRlckF0dHJpYnV0ZXNGb3JCbG9jayhcbiAgICAgICAgbmV3IFNjb3BlKHtcbiAgICAgICAgICBuYW1lOiBgJHtwYXJlbnRUeXBlLm5hbWV9XyR7YmxvY2tUeXBlTmFtZX1gLFxuICAgICAgICAgIHBhcmVudDogcGFyZW50VHlwZSxcbiAgICAgICAgICBpc1Byb3ZpZGVyOiBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgICAgaW5CbG9ja1R5cGU6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgICBibG9ja1R5cGUuYmxvY2ssXG4gICAgICApO1xuXG4gICAgICBibG9ja0F0dHJpYnV0ZXMgPSBkZWR1cGxpY2F0ZUF0dHJpYnV0ZXNXaXRoU2FtZU5hbWUoYmxvY2tBdHRyaWJ1dGVzKTtcblxuICAgICAgY29uc3QgYmxvY2tTdHJ1Y3QgPSB0aGlzLmFkZFN0cnVjdChcbiAgICAgICAgW1xuICAgICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgICAgbmV3IFNjb3BlKHtcbiAgICAgICAgICAgIG5hbWU6IGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudFR5cGUsXG4gICAgICAgICAgICBpc1Byb3ZpZGVyOiBwYXJlbnRUeXBlLmlzUHJvdmlkZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICAgIGJsb2NrQXR0cmlidXRlcyxcbiAgICAgICAgYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSxcbiAgICAgICAgKGJsb2NrVHlwZS5uZXN0aW5nX21vZGUgPT09IFwibGlzdFwiIHx8XG4gICAgICAgICAgYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSA9PT0gXCJzZXRcIikgJiZcbiAgICAgICAgICBibG9ja1R5cGUubWF4X2l0ZW1zID09PSAxLFxuICAgICAgKTtcblxuICAgICAgLy8gZGVmaW5lIHRoZSBhdHRyaWJ1dGVcbiAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgYXR0cmlidXRlRm9yQmxvY2tUeXBlKFxuICAgICAgICAgIGJsb2NrVHlwZU5hbWUsXG4gICAgICAgICAgYmxvY2tUeXBlLFxuICAgICAgICAgIGJsb2NrU3RydWN0LFxuICAgICAgICAgIHBhcmVudFR5cGUuaXNQcm92aWRlcixcbiAgICAgICAgICBwYXJlbnRUeXBlLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlcztcblxuICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZUZvckJsb2NrVHlwZShcbiAgICAgIHRlcnJhZm9ybU5hbWU6IHN0cmluZyxcbiAgICAgIGJsb2NrVHlwZTogQmxvY2tUeXBlLFxuICAgICAgc3RydWN0OiBTdHJ1Y3QsXG4gICAgICBpc1Byb3ZpZGVyOiBib29sZWFuLFxuICAgICAgcGFyZW50OiBTY29wZSxcbiAgICApOiBBdHRyaWJ1dGVNb2RlbCB7XG4gICAgICBjb25zdCBuYW1lID0gdG9DYW1lbENhc2UodGVycmFmb3JtTmFtZSk7XG4gICAgICBsZXQgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgICBsZXQgcmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgICAgIHN3aXRjaCAoYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSkge1xuICAgICAgICBjYXNlIFwic2luZ2xlXCI6XG4gICAgICAgICAgb3B0aW9uYWwgPSAhc3RydWN0LmF0dHJpYnV0ZXMuc29tZSgoeCkgPT4gIXgub3B0aW9uYWwpO1xuICAgICAgICAgIHJlcXVpcmVkID0gIXN0cnVjdC5hdHRyaWJ1dGVzLnNvbWUoKHgpID0+ICF4LnJlcXVpcmVkKTtcblxuICAgICAgICAgIC8vIFRoaXMgaXMgZm9yIGJ1ZyAjMzU3MCBhcyBib3RoIG9wdGlvbmFsIGFuZCByZXF1aXJlZCBldmFsdWF0ZSB0byBmYWxzZSB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXNcbiAgICAgICAgICAvLyAodGhpcyB0aGVuIGNhdXNlcyB0aGUgY29tcHV0ZWQgYmxvY2sgdG8gbm90IGJlIHBhcnQgb2YgYXNzaWduYWJsZUF0dHJpYnV0ZXMgYW5kIHRodXMgc2tpcHBlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUpXG4gICAgICAgICAgLy8gSGVuY2U6IElmIGJvdGggb3B0aW9uYWwgYW5kIHJlcXVpcmVkIGFyZSBmYWxzZSwgc2V0IG9wdGlvbmFsIHRvIHRydWUgSUYgYXQgbGVhc3Qgb25lXG4gICAgICAgICAgLy8gYXR0cmlidXRlIGluIHRoZSBibG9jayBoYXMgb3B0aW9uYWwgPSB0cnVlIG9yIHJlcXVpcmVkID0gdHJ1ZSwgYXMgdGhpcyB3b3VsZCBtZWFuIHRoYXQgYXQgbGVhc3Qgc29tZXRoaW5nIGNhbiBiZSBzZXRcbiAgICAgICAgICAvLyBhbmQgdGhlIGJsb2NrIGlzIG5vdCBhbGwgY29tcHV0ZWQuXG4gICAgICAgICAgaWYgKCFvcHRpb25hbCAmJiAhcmVxdWlyZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbmFsID0gc3RydWN0LmF0dHJpYnV0ZXMuc29tZSgoeCkgPT4geC5vcHRpb25hbCB8fCB4LnJlcXVpcmVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1OYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtRnVsbE5hbWU6IHBhcmVudC5mdWxsTmFtZSh0ZXJyYWZvcm1OYW1lKSxcbiAgICAgICAgICAgIHR5cGU6IG5ldyBTdHJ1Y3RBdHRyaWJ1dGVUeXBlTW9kZWwoc3RydWN0KSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHt0ZXJyYWZvcm1OYW1lfSBibG9ja2AsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIG9wdGlvbmFsLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IGlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVNb2RlbCh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtTmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybUZ1bGxOYW1lOiBwYXJlbnQuZnVsbE5hbWUodGVycmFmb3JtTmFtZSksXG4gICAgICAgICAgICB0eXBlOiBuZXcgTWFwQXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke3RlcnJhZm9ybU5hbWV9IGJsb2NrYCxcbiAgICAgICAgICAgIHN0b3JhZ2VOYW1lOiBgXyR7bmFtZX1gLFxuICAgICAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHJvdmlkZXI6IGlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcImxpc3RcIjpcbiAgICAgICAgY2FzZSBcInNldFwiOlxuICAgICAgICAgIG9wdGlvbmFsID1cbiAgICAgICAgICAgIGJsb2NrVHlwZS5taW5faXRlbXMgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBibG9ja1R5cGUubWluX2l0ZW1zIDwgMTtcbiAgICAgICAgICByZXF1aXJlZCA9XG4gICAgICAgICAgICBibG9ja1R5cGUubWluX2l0ZW1zID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJsb2NrVHlwZS5taW5faXRlbXMgPiAwO1xuICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlTW9kZWwoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHRlcnJhZm9ybU5hbWU6IHRlcnJhZm9ybU5hbWUsXG4gICAgICAgICAgICB0ZXJyYWZvcm1GdWxsTmFtZTogcGFyZW50LmZ1bGxOYW1lKHRlcnJhZm9ybU5hbWUpLFxuICAgICAgICAgICAgdHlwZTpcbiAgICAgICAgICAgICAgYmxvY2tUeXBlLm5lc3RpbmdfbW9kZSA9PT0gXCJsaXN0XCJcbiAgICAgICAgICAgICAgICA/IG5ldyBMaXN0QXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZS5tYXhfaXRlbXMgPT09IDEsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBuZXcgU2V0QXR0cmlidXRlVHlwZU1vZGVsKFxuICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0QXR0cmlidXRlVHlwZU1vZGVsKHN0cnVjdCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZS5tYXhfaXRlbXMgPT09IDEsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke3RlcnJhZm9ybU5hbWV9IGJsb2NrYCxcbiAgICAgICAgICAgIHN0b3JhZ2VOYW1lOiBgXyR7bmFtZX1gLFxuICAgICAgICAgICAgb3B0aW9uYWwsXG4gICAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgICBwcm92aWRlcjogaXNQcm92aWRlcixcbiAgICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZEFub255bW91c1N0cnVjdChcbiAgICBzY29wZTogU2NvcGVbXSxcbiAgICBhdHRyczogeyBbbmFtZTogc3RyaW5nXTogQXR0cmlidXRlIH0gfCB1bmRlZmluZWQsXG4gICAgbmVzdGluZ19tb2RlOiBzdHJpbmcsXG4gICkge1xuICAgIGxldCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5PEF0dHJpYnV0ZU1vZGVsPigpO1xuICAgIGNvbnN0IHBhcmVudCA9IHNjb3BlW3Njb3BlLmxlbmd0aCAtIDFdO1xuICAgIGlmIChhdHRycykge1xuICAgICAgZm9yIChjb25zdCBbdGVycmFmb3JtTmFtZSwgYXR0XSBvZiBPYmplY3QuZW50cmllcyhhdHRycyB8fCB7fSkpIHtcbiAgICAgICAgLy8gbmVzdGVkIHR5cGVzIHN1cHBvcnQgY29tcHV0ZWQsIG9wdGlvbmFsIGFuZCByZXF1aXJlZCBvbiBhdHRyaWJ1dGUgbGV2ZWxcbiAgICAgICAgLy8gaWYgcGFyZW50IGlzIGNvbXB1dGVkLCBjaGlsZCBhbHdheXMgaXMgY29tcHV0ZWQgYXMgd2VsbFxuICAgICAgICBjb25zdCBjb21wdXRlZCA9XG4gICAgICAgICAgISFwYXJlbnQuaXNDb21wdXRlZCB8fCAocGFyZW50LmlzTmVzdGVkVHlwZSAmJiAhIWF0dC5jb21wdXRlZCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbmFsID0gcGFyZW50LmlzTmVzdGVkVHlwZVxuICAgICAgICAgID8gISFhdHQub3B0aW9uYWxcbiAgICAgICAgICA6ICEhcGFyZW50LmlzT3B0aW9uYWw7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gcGFyZW50LmlzTmVzdGVkVHlwZVxuICAgICAgICAgID8gISFhdHQucmVxdWlyZWRcbiAgICAgICAgICA6ICEhcGFyZW50LmlzUmVxdWlyZWQ7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0b0NhbWVsQ2FzZSh0ZXJyYWZvcm1OYW1lKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMucmVuZGVyQXR0cmlidXRlVHlwZShcbiAgICAgICAgICBbXG4gICAgICAgICAgICAuLi5zY29wZSxcbiAgICAgICAgICAgIG5ldyBTY29wZSh7XG4gICAgICAgICAgICAgIG5hbWU6IHRlcnJhZm9ybU5hbWUsXG4gICAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgICAgaXNQcm92aWRlcjogcGFyZW50LmlzUHJvdmlkZXIsXG4gICAgICAgICAgICAgIGlzQ29tcHV0ZWQ6IGNvbXB1dGVkLFxuICAgICAgICAgICAgICBpc09wdGlvbmFsOiBvcHRpb25hbCxcbiAgICAgICAgICAgICAgaXNSZXF1aXJlZDogcmVxdWlyZWQsXG4gICAgICAgICAgICAgIGlzTmVzdGVkVHlwZTogcGFyZW50LmlzTmVzdGVkVHlwZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYXR0LnR5cGUgfHwgYXR0Lm5lc3RlZF90eXBlLFxuICAgICAgICApO1xuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goXG4gICAgICAgICAgbmV3IEF0dHJpYnV0ZU1vZGVsKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBzdG9yYWdlTmFtZTogYF8ke25hbWV9YCxcbiAgICAgICAgICAgIGNvbXB1dGVkOiBjb21wdXRlZCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBhdHQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBvcHRpb25hbDogb3B0aW9uYWwsXG4gICAgICAgICAgICB0ZXJyYWZvcm1OYW1lLFxuICAgICAgICAgICAgdGVycmFmb3JtRnVsbE5hbWU6IHBhcmVudC5mdWxsTmFtZSh0ZXJyYWZvcm1OYW1lKSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBwcm92aWRlcjogcGFyZW50LmlzUHJvdmlkZXIsXG4gICAgICAgICAgICByZXF1aXJlZDogcmVxdWlyZWQsXG4gICAgICAgICAgICBpc1dyaXRlT25seTogISFhdHQud3JpdGVfb25seSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzID0gZGVkdXBsaWNhdGVBdHRyaWJ1dGVzV2l0aFNhbWVOYW1lKGF0dHJpYnV0ZXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuYWRkU3RydWN0KHNjb3BlLCBhdHRyaWJ1dGVzLCBuZXN0aW5nX21vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTdHJ1Y3QoXG4gICAgc2NvcGU6IFNjb3BlW10sXG4gICAgYXR0cmlidXRlczogQXR0cmlidXRlTW9kZWxbXSxcbiAgICBuZXN0aW5nX21vZGU6IHN0cmluZyxcbiAgICBpc1NpbmdsZUl0ZW0gPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgcG9zc2libGVOYW1lID0gdG9QYXNjYWxDYXNlKFxuICAgICAgc2NvcGUubWFwKCh4KSA9PiB0b1NuYWtlQ2FzZSh4Lm5hbWUpKS5qb2luKFwiX1wiKSxcbiAgICApO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnVuaXF1ZUNsYXNzTmFtZShcbiAgICAgIGlzUmVzZXJ2ZWRTdHJ1Y3RDbGFzc05hbWUocG9zc2libGVOYW1lKVxuICAgICAgICA/IGAke3Bvc3NpYmxlTmFtZX1TdHJ1Y3RgXG4gICAgICAgIDogcG9zc2libGVOYW1lLFxuICAgICk7XG5cbiAgICBjb25zdCBwYXJlbnQgPSBzY29wZVtzY29wZS5sZW5ndGggLSAxXTtcbiAgICAvLyBibG9ja1R5cGUubmVzdGluZ19tb2RlID0+IGxpc3Qvc2V0ICYgYmxvY2tUeXBlLm1heF9pdGVtcyA9PT0gMSxcbiAgICBjb25zdCBpc0NsYXNzID0gKHBhcmVudC5pc0NvbXB1dGVkICYmICFwYXJlbnQuaXNPcHRpb25hbCkgfHwgaXNTaW5nbGVJdGVtO1xuICAgIGNvbnN0IGlzQW5vbnltb3VzID0gdHJ1ZTtcbiAgICBjb25zdCBzID0gbmV3IFN0cnVjdChcbiAgICAgIG5hbWUsXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgaXNDbGFzcyxcbiAgICAgIGlzQW5vbnltb3VzLFxuICAgICAgaXNTaW5nbGVJdGVtLFxuICAgICAgbmVzdGluZ19tb2RlLFxuICAgICk7XG4gICAgdGhpcy5zdHJ1Y3RzLnB1c2gocyk7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlc291cmNlUGFyc2VyIHtcbiAgcHJpdmF0ZSB1bmlxdWVDbGFzc25hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHVuaXF1ZUJhc2VOYW1lczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZXNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTW9kZWw+ID0ge307XG5cbiAgcHVibGljIHBhcnNlKFxuICAgIGZxcG46IEZRUE4sXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hLFxuICAgIHRlcnJhZm9ybVR5cGU6IHN0cmluZyxcbiAgICBjb25zdHJhaW50PzogQ29uc3RydWN0c01ha2VyVGFyZ2V0LFxuICApOiBSZXNvdXJjZU1vZGVsIHtcbiAgICBpZiAodGhpcy5yZXNvdXJjZXNbdHlwZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc291cmNlc1t0eXBlXTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHRoaXMudW5pcXVlQ2xhc3NuYW1lcywgdGhpcy51bmlxdWVCYXNlTmFtZXMpO1xuICAgIGNvbnN0IHJlc291cmNlID0gcGFyc2VyLnJlc291cmNlRnJvbShcbiAgICAgIGZxcG4sXG4gICAgICB0eXBlLFxuICAgICAgc2NoZW1hLFxuICAgICAgdGVycmFmb3JtVHlwZSxcbiAgICAgIGNvbnN0cmFpbnQsXG4gICAgKTtcbiAgICB0aGlzLnJlc291cmNlc1t0eXBlXSA9IHJlc291cmNlO1xuICAgIHJldHVybiByZXNvdXJjZTtcbiAgfVxuXG4gIC8vIFVzZWQgYnkgY29udmVydCB0byBkZXRlcm1pbmUgdGhlIHJpZ2h0IG5hbWUgZm9yIGEgY2xhc3NcbiAgcHVibGljIGdldENsYXNzTmFtZUZvclJlc291cmNlKHRlcnJhZm9ybVR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZXNbdGVycmFmb3JtVHlwZV07XG4gICAgcmV0dXJuIHJlc291cmNlID8gcmVzb3VyY2UuY2xhc3NOYW1lIDogXCJcIjtcbiAgfVxuXG4gIC8vIFVzZWQgYnkgY29udmVydCB0byBkZXRlcm1pbmUgdGhlIHJpZ2h0IG5hbWUgZm9yIGEgbmFtZXNwYWNlXG4gIHB1YmxpYyBnZXROYW1lc3BhY2VOYW1lRm9yUmVzb3VyY2UodGVycmFmb3JtVHlwZTogc3RyaW5nKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlIGV4dGVybmFsIHByb3ZpZGVyIHNpbmNlIHRoZSBuYW1lIG9mIHJlc291cmNlIGRvZXNuJ3QgaGF2ZSBhIHByZWZpeFxuICAgIGlmICh0ZXJyYWZvcm1UeXBlID09PSBcImRhdGFfZXh0ZXJuYWxfXCIpIHtcbiAgICAgIHRlcnJhZm9ybVR5cGUgPSBcImRhdGFfZXh0ZXJuYWxcIjtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VzW3RlcnJhZm9ybVR5cGVdO1xuICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBmb2xkZXIgPSBgcHJvdmlkZXJzLyR7cmVzb3VyY2UucHJvdmlkZXJ9YDtcbiAgICByZXR1cm4gcmVzb3VyY2UuZmlsZVBhdGgucmVwbGFjZShgJHtmb2xkZXJ9L2AsIFwiXCIpLnJlcGxhY2UoXCIvaW5kZXgudHNcIiwgXCJcIik7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cdktn/provider-generator",
3
- "version": "0.25.0-pre.17",
3
+ "version": "0.25.0-pre.20",
4
4
  "description": "Exposes API to generate Terraform CDK provider bindings",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -35,9 +35,9 @@
35
35
  "glob": "13.0.6",
36
36
  "jsii": "~6.0.0",
37
37
  "jsii-pacmak": "1.140.0",
38
- "@cdktn/commons": "0.25.0-pre.17",
39
- "@cdktn/provider-schema": "0.25.0-pre.17",
40
- "cdktn": "0.25.0-pre.17"
38
+ "@cdktn/commons": "0.25.0-pre.20",
39
+ "@cdktn/provider-schema": "0.25.0-pre.20",
40
+ "cdktn": "0.25.0-pre.20"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/fs-extra": "11.0.4",
@@ -0,0 +1,42 @@
1
+ {
2
+ "provider_schemas": {
3
+ "registry.terraform.io/hashicorp/example": {
4
+ "resource_schemas": {
5
+ "example_provider_functions": {
6
+ "version": 0,
7
+ "block": {
8
+ "attributes": {
9
+ "id": {
10
+ "type": "string",
11
+ "description_kind": "plain",
12
+ "computed": true
13
+ },
14
+ "name": {
15
+ "type": "string",
16
+ "description_kind": "plain",
17
+ "optional": true
18
+ }
19
+ }
20
+ }
21
+ }
22
+ },
23
+ "functions": {
24
+ "sum": {
25
+ "description": "Adds up two numbers.",
26
+ "summary": "Sum numbers",
27
+ "return_type": "number",
28
+ "parameters": [
29
+ {
30
+ "name": "a",
31
+ "type": "number"
32
+ },
33
+ {
34
+ "name": "b",
35
+ "type": "number"
36
+ }
37
+ ]
38
+ }
39
+ }
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,84 @@
1
+ // Copyright (c) HashiCorp, Inc
2
+ // SPDX-License-Identifier: MPL-2.0
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ import { CodeMaker } from "codemaker";
6
+ import { TerraformProviderGenerator } from "../../generator/provider-generator";
7
+ import { sanitizeClassOrNamespaceName } from "../../generator/resource-parser";
8
+ import { createTmpHelper } from "../util";
9
+
10
+ const tmp = createTmpHelper();
11
+
12
+ // A provider declaring provider-defined functions emits them to
13
+ // providers/<provider>/provider-functions/index.ts. A resource named
14
+ // <provider>_provider_functions maps to that same directory, so without a
15
+ // guard the resource overwrites the functions wrapper and the provider index
16
+ // exports the name twice.
17
+ describe("resource named like the provider functions submodule", () => {
18
+ let workdir: string;
19
+
20
+ beforeAll(async () => {
21
+ const code = new CodeMaker();
22
+ workdir = tmp("provider-functions-name-collision.test");
23
+ const spec = JSON.parse(
24
+ fs.readFileSync(
25
+ path.join(
26
+ __dirname,
27
+ "fixtures",
28
+ "provider-functions-name-collision.test.fixture.json",
29
+ ),
30
+ "utf-8",
31
+ ),
32
+ );
33
+ new TerraformProviderGenerator(code, spec).generateAll();
34
+ await code.save(workdir);
35
+ });
36
+
37
+ const read = (relPath: string) =>
38
+ fs.readFileSync(path.join(workdir, relPath), "utf-8");
39
+
40
+ test("the functions submodule holds the functions wrapper, not the resource", () => {
41
+ const output = read("providers/example/provider-functions/index.ts");
42
+ expect(output).toContain("class ExampleProviderFunctions");
43
+ expect(output).not.toContain("cdktn.TerraformResource");
44
+ });
45
+
46
+ test("the resource is emitted to its own directory", () => {
47
+ const output = read(
48
+ "providers/example/provider-functions-resource/index.ts",
49
+ );
50
+ expect(output).toContain("class ProviderFunctionsResource");
51
+ expect(output).toContain("cdktn.TerraformResource");
52
+ });
53
+
54
+ test("the provider index exports both, without duplicate names", () => {
55
+ const index = read("providers/example/index.ts");
56
+ expect(index).toContain(
57
+ "export * as providerFunctions from './provider-functions/index';",
58
+ );
59
+ expect(index).toContain(
60
+ "export * as providerFunctionsResource from './provider-functions-resource/index';",
61
+ );
62
+
63
+ const exportedNames = [...index.matchAll(/export \* as (\w+) from/g)].map(
64
+ (m) => m[1],
65
+ );
66
+ expect(new Set(exportedNames).size).toBe(exportedNames.length);
67
+ });
68
+ });
69
+
70
+ describe("sanitizeClassOrNamespaceName", () => {
71
+ test("suffixes a resource named provider_functions", () => {
72
+ expect(sanitizeClassOrNamespaceName("provider_functions")).toBe(
73
+ "provider_functions_resource",
74
+ );
75
+ });
76
+
77
+ test("still suffixes a resource named provider", () => {
78
+ expect(sanitizeClassOrNamespaceName("provider")).toBe("provider_resource");
79
+ });
80
+
81
+ test("leaves an unrelated resource name alone", () => {
82
+ expect(sanitizeClassOrNamespaceName("function_app")).toBe("function_app");
83
+ });
84
+ });
@@ -82,8 +82,17 @@ export function sanitizeClassOrNamespaceName(
82
82
  isProvider = false,
83
83
  ) {
84
84
  const resourceIsNamedProvider = !isProvider && baseName === "provider";
85
-
86
- if (isReservedClassOrNamespaceName(baseName) || resourceIsNamedProvider) {
85
+ // A resource named `<provider>_provider_functions` maps to the same
86
+ // providers/<provider>/provider-functions/ directory that the provider's
87
+ // functions submodule is emitted to, and would silently overwrite it.
88
+ const resourceIsNamedProviderFunctions =
89
+ !isProvider && baseName === "provider_functions";
90
+
91
+ if (
92
+ isReservedClassOrNamespaceName(baseName) ||
93
+ resourceIsNamedProvider ||
94
+ resourceIsNamedProviderFunctions
95
+ ) {
87
96
  return `${baseName}_resource`;
88
97
  } else {
89
98
  return baseName;