gitlab-ci-local 4.26.3 → 4.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -32,7 +32,9 @@ Get rid of all those dev specific shell scripts and make files.
32
32
  * [Quirks](#quirks)
33
33
  * [Tracked Files](#tracked-files)
34
34
  * [Home Variables](#home-variables)
35
+ * [Project Variables](#project-variables)
35
36
  * [Decorators](#decorators)
37
+ * [Includes](#includes)
36
38
  * [Artifacts](#artifacts)
37
39
  * [Development](#development)
38
40
  * [Scripts](#scripts)
@@ -135,6 +137,20 @@ global:
135
137
 
136
138
  Variables will now appear in your jobs, if project or group matches git remote, global's are always present
137
139
 
140
+ ### Project variables
141
+
142
+ Put a file like this in `$CWD/.gitlab-ci-local-variables.yml`
143
+
144
+ ```yaml
145
+ ---
146
+ AUTHORIZATION_PASSWORD: djwqiod910321
147
+ DOCKER_LOGIN_PASSWORD: dij3213n123n12in3
148
+ # Will be type File, because value is a file path
149
+ KNOWN_HOSTS: '~/.ssh/known_hosts'
150
+ ```
151
+
152
+ Variables will now appear in your jobs.
153
+
138
154
  ### Decorators
139
155
 
140
156
  #### The `@Description` decorator
@@ -190,6 +206,9 @@ produce:
190
206
  artifacts: {paths: [path/] }
191
207
  ```
192
208
 
209
+ ### Includes
210
+ Includes from external sources are only fetched once. Use `--fetch-includes` to invoke an external fetching rutine.
211
+
193
212
  ### Artifacts
194
213
 
195
214
  Shell executor jobs copies artifacts to host/cwd directory. Use --shell-isolation option to mimic correct artifact handling for shell jobs.
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Tired of pushing to test your .gitlab-ci.yml?",
4
4
  "main": "src/index.js",
5
5
  "bin": "src/index.js",
6
- "version": "4.26.3",
6
+ "version": "4.28.0",
7
7
  "scripts": {
8
8
  "prepublishOnly": "npm run check-all && chmod +x src/index.js",
9
9
  "pkg-linux": "pkg src/index.js --public -t node16-linux-x64 -o bin/linux/gitlab-ci-local && chmod +x bin/linux/gitlab-ci-local && gzip -c bin/linux/gitlab-ci-local > bin/linux.gz",
@@ -20,41 +20,40 @@
20
20
  "start": "ts-node --log-error src/index.ts --cwd examples/docker-compose-nodejs"
21
21
  },
22
22
  "dependencies": {
23
+ "axios": "^0.24.0",
23
24
  "base64url": "^3.0.1",
24
- "camelcase": "^6.2.0",
25
+ "camelcase": "^6.2.1",
25
26
  "chalk": "^4.1.2",
26
27
  "checksum": "^1.0.0",
27
28
  "deep-extend": "^0.6.0",
28
29
  "dotenv": "^10.0.0",
29
30
  "fs-extra": "^10.0.0",
30
31
  "js-yaml": "^4.1.0",
31
- "node-fetch": "^2.6.5",
32
32
  "pretty-hrtime": "^1.0.3",
33
- "source-map-support": "^0.5.20",
34
- "yargs": "^17.2.1"
33
+ "source-map-support": "^0.5.21",
34
+ "yargs": "^17.3.0"
35
35
  },
36
36
  "devDependencies": {
37
- "@types/chalk": "2.2.0",
38
37
  "@types/checksum": "0.1.33",
39
38
  "@types/deep-extend": "0.4.32",
40
39
  "@types/fs-extra": "9.0.13",
41
- "@types/jest": "27.0.2",
40
+ "@types/jest": "27.0.3",
42
41
  "@types/jest-when": "2.7.3",
43
- "@types/js-yaml": "4.0.4",
44
- "@types/node-fetch": "2.5.12",
42
+ "@types/js-yaml": "4.0.5",
45
43
  "@types/pretty-hrtime": "1.0.1",
46
44
  "@types/source-map-support": "0.5.4",
47
- "@types/yargs": "17.0.5",
48
- "@typescript-eslint/eslint-plugin": "5.3.1",
49
- "@typescript-eslint/parser": "5.3.1",
45
+ "@types/yargs": "17.0.7",
46
+ "@typescript-eslint/eslint-plugin": "5.8.0",
47
+ "@typescript-eslint/parser": "5.8.0",
48
+ "axios-mock-adapter": "1.20.0",
50
49
  "depcheck": "1.4.2",
51
- "eslint": "8.2.0",
52
- "jest": "27.3.1",
53
- "jest-when": "3.4.2",
54
- "pkg": "5.4.1",
55
- "ts-jest": "27.0.7",
50
+ "eslint": "8.5.0",
51
+ "jest": "27.4.5",
52
+ "jest-when": "3.5.0",
53
+ "pkg": "5.5.1",
54
+ "ts-jest": "27.1.2",
56
55
  "ts-node": "10.4.0",
57
- "typescript": "4.4.4"
56
+ "typescript": "4.5.4"
58
57
  },
59
58
  "engines": {
60
59
  "node": ">=16.10.0"
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CacheEntry = void 0;
4
+ const utils_1 = require("./utils");
5
+ class CacheEntry {
6
+ constructor(key, paths, policy) {
7
+ this.key = key;
8
+ this.policy = policy;
9
+ this.paths = paths;
10
+ }
11
+ async getUniqueCacheName(cwd, env) {
12
+ if (typeof this.key === "string" || this.key == null) {
13
+ return utils_1.Utils.expandText(this.key ?? "default");
14
+ }
15
+ return "md-" + await utils_1.Utils.checksumFiles(this.key.files.map(f => {
16
+ return `${cwd}/${utils_1.Utils.expandText(f, env)}`;
17
+ }));
18
+ }
19
+ }
20
+ exports.CacheEntry = CacheEntry;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtZW50cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjYWNoZS1lbnRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBOEI7QUFFOUIsTUFBYSxVQUFVO0lBS25CLFlBQVksR0FBaUMsRUFBRSxLQUFlLEVBQUUsTUFBcUM7UUFDakcsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEdBQVcsRUFBRSxHQUE4QjtRQUNoRSxJQUFJLE9BQU8sSUFBSSxDQUFDLEdBQUcsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDbEQsT0FBTyxhQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxPQUFPLEtBQUssR0FBRyxNQUFNLGFBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzVELE9BQU8sR0FBRyxHQUFHLElBQUksYUFBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztDQUVKO0FBcEJELGdDQW9CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VXRpbHN9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBDYWNoZUVudHJ5IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5OiBcInB1bGxcIiB8IFwicHVsbC1wdXNoXCIgfCBcInB1c2hcIjtcbiAgICBwdWJsaWMgcmVhZG9ubHkga2V5OiBzdHJpbmcgfCB7IGZpbGVzOiBzdHJpbmdbXSB9O1xuICAgIHB1YmxpYyByZWFkb25seSBwYXRoczogc3RyaW5nW107XG5cbiAgICBjb25zdHJ1Y3RvcihrZXk6IHN0cmluZyB8IHsgZmlsZXM6IHN0cmluZ1tdIH0sIHBhdGhzOiBzdHJpbmdbXSwgcG9saWN5OiBcInB1bGxcIiB8IFwicHVsbC1wdXNoXCIgfCBcInB1c2hcIikge1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgICAgIHRoaXMucGF0aHMgPSBwYXRocztcbiAgICB9XG5cbiAgICBhc3luYyBnZXRVbmlxdWVDYWNoZU5hbWUoY3dkOiBzdHJpbmcsIGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMua2V5ID09PSBcInN0cmluZ1wiIHx8IHRoaXMua2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5leHBhbmRUZXh0KHRoaXMua2V5ID8/IFwiZGVmYXVsdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJtZC1cIiArIGF3YWl0IFV0aWxzLmNoZWNrc3VtRmlsZXModGhpcy5rZXkuZmlsZXMubWFwKGYgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAke2N3ZH0vJHtVdGlscy5leHBhbmRUZXh0KGYsIGVudil9YDtcbiAgICAgICAgfSkpO1xuICAgIH1cblxufVxuIl19
package/src/commander.js CHANGED
@@ -8,17 +8,18 @@ exports.Commander = void 0;
8
8
  const chalk_1 = __importDefault(require("chalk"));
9
9
  const utils_1 = require("./utils");
10
10
  const job_executor_1 = require("./job-executor");
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
11
12
  class Commander {
12
- static async runPipeline(parser, writeStreams, manualOpts, privileged) {
13
+ static async runPipeline(parser, writeStreams, manualOpts, privileged, cwd) {
13
14
  const jobs = parser.jobs;
14
15
  const stages = parser.stages;
15
16
  let potentialStarters = [...jobs.values()];
16
17
  potentialStarters = potentialStarters.filter(j => j.when !== "never");
17
18
  potentialStarters = potentialStarters.filter(j => j.when !== "manual" || manualOpts.includes(j.name));
18
19
  await job_executor_1.JobExecutor.runLoop(jobs, stages, potentialStarters, manualOpts, privileged);
19
- await Commander.printReport(writeStreams, jobs, stages, parser.jobNamePad);
20
+ await Commander.printReport(writeStreams, jobs, stages, parser.jobNamePad, cwd);
20
21
  }
21
- static async runSingleJob(parser, writeStreams, jobArgs, needs, manualOpts, privileged) {
22
+ static async runSingleJob(parser, writeStreams, jobArgs, needs, manualOpts, privileged, cwd) {
22
23
  const jobs = parser.jobs;
23
24
  const stages = parser.stages;
24
25
  let potentialStarters = [];
@@ -32,7 +33,7 @@ class Commander {
32
33
  potentialStarters.push(job);
33
34
  });
34
35
  await job_executor_1.JobExecutor.runLoop(jobPoolMap, stages, potentialStarters, manualOpts, privileged);
35
- await Commander.printReport(writeStreams, jobs, stages, parser.jobNamePad);
36
+ await Commander.printReport(writeStreams, jobs, stages, parser.jobNamePad, cwd);
36
37
  }
37
38
  static runList(parser, writeStreams, listAll) {
38
39
  const stages = parser.stages;
@@ -68,7 +69,7 @@ class Commander {
68
69
  }
69
70
  exports.Commander = Commander;
70
71
  _a = Commander;
71
- Commander.printReport = async (writeStreams, jobs, stages, jobNamePad) => {
72
+ Commander.printReport = async (writeStreams, jobs, stages, jobNamePad, cwd) => {
72
73
  writeStreams.stdout("\n");
73
74
  const preScripts = {
74
75
  successful: [],
@@ -110,10 +111,15 @@ Commander.printReport = async (writeStreams, jobs, stages, jobNamePad) => {
110
111
  }
111
112
  if (preScripts.warned.length !== 0) {
112
113
  preScripts.warned.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
113
- preScripts.warned.forEach(({ name }) => {
114
+ for (const { name } of preScripts.warned) {
114
115
  const namePad = name.padEnd(jobNamePad);
116
+ const safeName = utils_1.Utils.getSafeJobName(name);
115
117
  writeStreams.stdout((0, chalk_1.default) `{black.bgYellowBright WARN } {blueBright ${namePad}} pre_script\n`);
116
- });
118
+ const outputLog = await fs_extra_1.default.readFile(`${cwd}/.gitlab-ci-local/output/${safeName}.log`, "utf8");
119
+ for (const line of outputLog.split(/\r?\n/).filter(j => !j.includes("[32m$ ")).filter(j => j !== "").slice(-3)) {
120
+ writeStreams.stdout((0, chalk_1.default) ` {yellow >} ${line}\n`);
121
+ }
122
+ }
117
123
  }
118
124
  if (afterScripts.warned.length !== 0) {
119
125
  afterScripts.warned.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
@@ -124,10 +130,15 @@ Commander.printReport = async (writeStreams, jobs, stages, jobNamePad) => {
124
130
  }
125
131
  if (preScripts.failed.length !== 0) {
126
132
  preScripts.failed.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
127
- preScripts.failed.forEach(({ name }) => {
133
+ for (const { name } of preScripts.failed) {
128
134
  const namePad = name.padEnd(jobNamePad);
135
+ const safeName = utils_1.Utils.getSafeJobName(name);
129
136
  writeStreams.stdout((0, chalk_1.default) `{black.bgRed FAIL } {blueBright ${namePad}}\n`);
130
- });
137
+ const outputLog = await fs_extra_1.default.readFile(`${cwd}/.gitlab-ci-local/output/${safeName}.log`, "utf8");
138
+ for (const line of outputLog.split(/\r?\n/).filter(j => !j.includes("[32m$ ")).filter(j => j !== "").slice(-3)) {
139
+ writeStreams.stdout((0, chalk_1.default) ` {red >} ${line}\n`);
140
+ }
141
+ }
131
142
  }
132
143
  for (const job of preScripts.successful) {
133
144
  const e = job.environment;
@@ -143,4 +154,4 @@ Commander.printReport = async (writeStreams, jobs, stages, jobNamePad) => {
143
154
  writeStreams.stdout(" }\n");
144
155
  }
145
156
  };
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbWFuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxrREFBMEI7QUFHMUIsbUNBQThCO0FBRTlCLGlEQUEyQztBQUUzQyxNQUFhLFNBQVM7SUFFbEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBYyxFQUFFLFlBQTBCLEVBQUUsVUFBb0IsRUFBRSxVQUFtQjtRQUMxRyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFFN0IsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDM0MsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQztRQUN0RSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RHLE1BQU0sMEJBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkYsTUFBTSxTQUFTLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBYyxFQUFFLFlBQTBCLEVBQUUsT0FBaUIsRUFBRSxLQUFjLEVBQUUsVUFBb0IsRUFBRSxVQUFtQjtRQUM5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QU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4QyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLG9DQUFvQyxPQUFPLEtBQUssQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO0tBQ047SUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7UUFDckMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDWCxTQUFTO1NBQ1o7UUFDRCxNQUFNLElBQUksR0FBRyxhQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDN0QsTUFBTSxHQUFHLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzNELFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUEsZUFBZSxHQUFHLENBQUMsSUFBSSxpQ0FBaUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMxRixJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDYixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMvQjtBQUVMLENBQUUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7Sm9ifSBmcm9tIFwiLi9qb2JcIjtcbmltcG9ydCB7UGFyc2VyfSBmcm9tIFwiLi9wYXJzZXJcIjtcbmltcG9ydCB7VXRpbHN9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1dyaXRlU3RyZWFtc30gZnJvbSBcIi4vdHlwZXMvd3JpdGUtc3RyZWFtc1wiO1xuaW1wb3J0IHtKb2JFeGVjdXRvcn0gZnJvbSBcIi4vam9iLWV4ZWN1dG9yXCI7XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kZXIge1xuXG4gICAgc3RhdGljIGFzeW5jIHJ1blBpcGVsaW5lKHBhcnNlcjogUGFyc2VyLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgbWFudWFsT3B0czogc3RyaW5nW10sIHByaXZpbGVnZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgam9icyA9IHBhcnNlci5qb2JzO1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuXG4gICAgICAgIGxldCBwb3RlbnRpYWxTdGFydGVycyA9IFsuLi5qb2JzLnZhbHVlcygpXTtcbiAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5maWx0ZXIoaiA9PiBqLndoZW4gIT09IFwibmV2ZXJcIik7XG4gICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzID0gcG90ZW50aWFsU3RhcnRlcnMuZmlsdGVyKGogPT4gai53aGVuICE9PSBcIm1hbnVhbFwiIHx8IG1hbnVhbE9wdHMuaW5jbHVkZXMoai5uYW1lKSk7XG4gICAgICAgIGF3YWl0IEpvYkV4ZWN1dG9yLnJ1bkxvb3Aoam9icywgc3RhZ2VzLCBwb3RlbnRpYWxTdGFydGVycywgbWFudWFsT3B0cywgcHJpdmlsZWdlZCk7XG4gICAgICAgIGF3YWl0IENvbW1hbmRlci5wcmludFJlcG9ydCh3cml0ZVN0cmVhbXMsIGpvYnMsIHN0YWdlcywgcGFyc2VyLmpvYk5hbWVQYWQpO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBydW5TaW5nbGVKb2IocGFyc2VyOiBQYXJzZXIsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBqb2JBcmdzOiBzdHJpbmdbXSwgbmVlZHM6IGJvb2xlYW4sIG1hbnVhbE9wdHM6IHN0cmluZ1tdLCBwcml2aWxlZ2VkOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGpvYnMgPSBwYXJzZXIuam9icztcbiAgICAgICAgY29uc3Qgc3RhZ2VzID0gcGFyc2VyLnN0YWdlcztcblxuICAgICAgICBsZXQgcG90ZW50aWFsU3RhcnRlcnM6IEpvYltdID0gW107XG4gICAgICAgIGNvbnN0IGpvYlBvb2xNYXAgPSBuZWVkcyA/IG5ldyBNYXA8c3RyaW5nLCBKb2I+KGpvYnMpIDogbmV3IE1hcDxzdHJpbmcsIEpvYj4oKTtcbiAgICAgICAgam9iQXJncy5mb3JFYWNoKGpvYk5hbWUgPT4ge1xuICAgICAgICAgICAgY29uc3Qgam9iID0gVXRpbHMuZ2V0Sm9iQnlOYW1lKGpvYnMsIGpvYk5hbWUpO1xuICAgICAgICAgICAgam9iUG9vbE1hcC5zZXQoam9iTmFtZSwgam9iKTtcbiAgICAgICAgICAgIGlmIChuZWVkcykge1xuICAgICAgICAgICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzID0gcG90ZW50aWFsU3RhcnRlcnMuY29uY2F0KEpvYkV4ZWN1dG9yLmdldFBhc3RUb1dhaXRGb3Ioam9icywgc3RhZ2VzLCBqb2IsIG1hbnVhbE9wdHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzLnB1c2goam9iKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgSm9iRXhlY3V0b3IucnVuTG9vcChqb2JQb29sTWFwLCBzdGFnZXMsIHBvdGVudGlhbFN0YXJ0ZXJzLCBtYW51YWxPcHRzLCBwcml2aWxlZ2VkKTtcbiAgICAgICAgYXdhaXQgQ29tbWFuZGVyLnByaW50UmVwb3J0KHdyaXRlU3RyZWFtcywgam9icywgc3RhZ2VzLCBwYXJzZXIuam9iTmFtZVBhZCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHByaW50UmVwb3J0ID0gYXN5bmMgKHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBqb2JzOiBSZWFkb25seU1hcDxzdHJpbmcsIEpvYj4sIHN0YWdlczogcmVhZG9ubHkgc3RyaW5nW10sIGpvYk5hbWVQYWQ6IG51bWJlcikgPT4ge1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KFwiXFxuXCIpO1xuXG4gICAgICAgIGNvbnN0IHByZVNjcmlwdHM6IHsgc3VjY2Vzc2Z1bDogSm9iW107IGZhaWxlZDogSm9iW107IHdhcm5lZDogSm9iW10gfSA9IHtcbiAgICAgICAgICAgIHN1Y2Nlc3NmdWw6IFtdLFxuICAgICAgICAgICAgZmFpbGVkOiBbXSxcbiAgICAgICAgICAgIHdhcm5lZDogW10sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGFmdGVyU2NyaXB0czogeyB3YXJuZWQ6IEpvYltdIH0gPSB7XG4gICAgICAgICAgICB3YXJuZWQ6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChqb2Iuc3RhcnRlZCAmJiBqb2IuYWZ0ZXJTY3JpcHRzRXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgICAgICAgICBhZnRlclNjcmlwdHMud2FybmVkLnB1c2goam9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmICgham9iLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGpvYi5wcmVTY3JpcHRzRXhpdENvZGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwucHVzaChqb2IpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChqb2IuYWxsb3dGYWlsdXJlKSB7XG4gICAgICAgICAgICAgICAgcHJlU2NyaXB0cy53YXJuZWQucHVzaChqb2IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmVTY3JpcHRzLmZhaWxlZC5wdXNoKGpvYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJlU2NyaXB0cy5zdWNjZXNzZnVsLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcHJlU2NyaXB0cy5zdWNjZXNzZnVsLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgcHJlU2NyaXB0cy5zdWNjZXNzZnVsLmZvckVhY2goKGpvYikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVQYWQgPSBqb2IubmFtZS5wYWRFbmQoam9iTmFtZVBhZCk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7YmxhY2suYmdHcmVlbkJyaWdodCAgUEFTUyB9IHtibHVlQnJpZ2h0ICR7bmFtZVBhZH19YCk7XG4gICAgICAgICAgICAgICAgaWYgKGpvYi5jb3ZlcmFnZVBlcmNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2AgJHtqb2IuY292ZXJhZ2VQZXJjZW50fSUge2dyZXkgY292ZXJhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoXCJcXG5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLndhcm5lZC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHByZVNjcmlwdHMud2FybmVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgcHJlU2NyaXB0cy53YXJuZWQuZm9yRWFjaCgoe25hbWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IG5hbWUucGFkRW5kKGpvYk5hbWVQYWQpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2JsYWNrLmJnWWVsbG93QnJpZ2h0ICBXQVJOIH0ge2JsdWVCcmlnaHQgJHtuYW1lUGFkfX0gIHByZV9zY3JpcHRcXG5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFmdGVyU2NyaXB0cy53YXJuZWQubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBhZnRlclNjcmlwdHMud2FybmVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgYWZ0ZXJTY3JpcHRzLndhcm5lZC5mb3JFYWNoKCh7bmFtZX0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lUGFkID0gbmFtZS5wYWRFbmQoam9iTmFtZVBhZCk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7YmxhY2suYmdZZWxsb3dCcmlnaHQgIFdBUk4gfSB7Ymx1ZUJyaWdodCAke25hbWVQYWR9fSAgYWZ0ZXJfc2NyaXB0XFxuYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLmZhaWxlZC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHByZVNjcmlwdHMuZmFpbGVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgcHJlU2NyaXB0cy5mYWlsZWQuZm9yRWFjaCgoe25hbWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IG5hbWUucGFkRW5kKGpvYk5hbWVQYWQpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2JsYWNrLmJnUmVkICBGQUlMIH0ge2JsdWVCcmlnaHQgJHtuYW1lUGFkfX1cXG5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2YgcHJlU2NyaXB0cy5zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gam9iLmVudmlyb25tZW50O1xuICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IFV0aWxzLmV4cGFuZFRleHQoZS5uYW1lLCBqb2IuZXhwYW5kZWRWYXJpYWJsZXMpO1xuICAgICAgICAgICAgY29uc3QgdXJsID0gVXRpbHMuZXhwYW5kVGV4dChlLnVybCwgam9iLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2JsdWVCcmlnaHQgJHtqb2IubmFtZX19IGVudmlyb25tZW50OiBcXHsgbmFtZToge2JvbGQgJHtuYW1lfX1gKTtcbiAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgLCB1cmw6IHtib2xkICR7dXJsfX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoXCIgfVxcblwiKTtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHN0YXRpYyBydW5MaXN0KHBhcnNlcjogUGFyc2VyLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgbGlzdEFsbDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuICAgICAgICBsZXQgam9icyA9IFsuLi5wYXJzZXIuam9icy52YWx1ZXMoKV07XG4gICAgICAgIGpvYnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCB3aGVuUGFkRW5kID0gNDtcbiAgICAgICAgam9icy5mb3JFYWNoKGogPT4gd2hlblBhZEVuZCA9IE1hdGgubWF4KGoud2hlbi5sZW5ndGgsIHdoZW5QYWRFbmQpKTtcblxuICAgICAgICBsZXQgc3RhZ2VQYWRFbmQgPSA1O1xuICAgICAgICBzdGFnZXMuZm9yRWFjaChzID0+IHN0YWdlUGFkRW5kID0gTWF0aC5tYXgocy5sZW5ndGgsIHN0YWdlUGFkRW5kKSk7XG5cbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uUGFkRW5kID0gMTE7XG4gICAgICAgIGpvYnMuZm9yRWFjaChqID0+IGRlc2NyaXB0aW9uUGFkRW5kID0gTWF0aC5tYXgoai5kZXNjcmlwdGlvbi5sZW5ndGgsIGRlc2NyaXB0aW9uUGFkRW5kKSk7XG5cbiAgICAgICAgY29uc3Qgam9iTmFtZVBhZCA9IHBhcnNlci5qb2JOYW1lUGFkO1xuXG4gICAgICAgIGlmICghbGlzdEFsbCkge1xuICAgICAgICAgICAgam9icyA9IGpvYnMuZmlsdGVyKGogPT4gai53aGVuICE9PSBcIm5ldmVyXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7Z3JleSAke1wibmFtZVwiLnBhZEVuZChqb2JOYW1lUGFkKX0gICR7XCJkZXNjcmlwdGlvblwiLnBhZEVuZChkZXNjcmlwdGlvblBhZEVuZCl9fSAgYCk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2dyZXkgJHtcInN0YWdlXCIucGFkRW5kKHN0YWdlUGFkRW5kKX0gICR7XCJ3aGVuXCIucGFkRW5kKHdoZW5QYWRFbmQpfX0gIGApO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtncmV5IGFsbG93X2ZhaWx1cmUgIG5lZWRzfVxcbmApO1xuXG4gICAgICAgIGNvbnN0IHJlbmRlckxpbmUgPSAoam9iOiBKb2IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5lZWRzID0gam9iLm5lZWRzO1xuICAgICAgICAgICAgY29uc3QgYWxsb3dGYWlsdXJlID0gam9iLmFsbG93RmFpbHVyZSA/IFwidHJ1ZSBcIiA6IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIGxldCBqb2JMaW5lID0gY2hhbGtge2JsdWVCcmlnaHQgJHtqb2IubmFtZS5wYWRFbmQoam9iTmFtZVBhZCl9fSAgJHtqb2IuZGVzY3JpcHRpb24ucGFkRW5kKGRlc2NyaXB0aW9uUGFkRW5kKX0gIGA7XG4gICAgICAgICAgICBqb2JMaW5lICs9IGNoYWxrYHt5ZWxsb3cgJHtqb2Iuc3RhZ2UucGFkRW5kKHN0YWdlUGFkRW5kKX19ICAke2pvYi53aGVuLnBhZEVuZCh3aGVuUGFkRW5kKX0gICR7YWxsb3dGYWlsdXJlLnBhZEVuZCgxMSl9YDtcbiAgICAgICAgICAgIGlmIChuZWVkcykge1xuICAgICAgICAgICAgICAgIGpvYkxpbmUgKz0gY2hhbGtgICAgIFt7Ymx1ZUJyaWdodCAke25lZWRzLm1hcChuID0+IG4uam9iKS5qb2luKFwiLFwiKX19XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGAke2pvYkxpbmV9XFxuYCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgam9icy5mb3JFYWNoKChqb2IpID0+IHJlbmRlckxpbmUoam9iKSk7XG4gICAgfVxuXG59XG4iXX0=
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbWFuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxrREFBMEI7QUFHMUIsbUNBQThCO0FBRTlCLGlEQUEyQztBQUMzQyx3REFBMEI7QUFFMUIsTUFBYSxTQUFTO0lBRWxCLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQWMsRUFBRSxZQUEwQixFQUFFLFVBQW9CLEVBQUUsVUFBbUIsRUFBRSxHQUFXO1FBQ3ZILE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUU3QixJQUFJLGlCQUFpQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMzQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQ3RFLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEcsTUFBTSwwQkFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNuRixNQUFNLFNBQVMsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBYyxFQUFFLFlBQTBCLEVBQUUsT0FBaUIsRUFB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Q0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDNUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxhQUFhLElBQUksSUFBSSxDQUFDLENBQUM7YUFDbkQ7U0FDSjtLQUNKO0lBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO1FBQ3JDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ1gsU0FBUztTQUNaO1FBQ0QsTUFBTSxJQUFJLEdBQUcsYUFBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdELE1BQU0sR0FBRyxHQUFHLGFBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzRCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLGVBQWUsR0FBRyxDQUFDLElBQUksaUNBQWlDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDMUYsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ2IsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUNwRDtRQUNELFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDL0I7QUFFTCxDQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQge0pvYn0gZnJvbSBcIi4vam9iXCI7XG5pbXBvcnQge1BhcnNlcn0gZnJvbSBcIi4vcGFyc2VyXCI7XG5pbXBvcnQge1V0aWxzfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHtXcml0ZVN0cmVhbXN9IGZyb20gXCIuL3R5cGVzL3dyaXRlLXN0cmVhbXNcIjtcbmltcG9ydCB7Sm9iRXhlY3V0b3J9IGZyb20gXCIuL2pvYi1leGVjdXRvclwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiO1xuXG5leHBvcnQgY2xhc3MgQ29tbWFuZGVyIHtcblxuICAgIHN0YXRpYyBhc3luYyBydW5QaXBlbGluZShwYXJzZXI6IFBhcnNlciwgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIG1hbnVhbE9wdHM6IHN0cmluZ1tdLCBwcml2aWxlZ2VkOiBib29sZWFuLCBjd2Q6IHN0cmluZykge1xuICAgICAgICBjb25zdCBqb2JzID0gcGFyc2VyLmpvYnM7XG4gICAgICAgIGNvbnN0IHN0YWdlcyA9IHBhcnNlci5zdGFnZXM7XG5cbiAgICAgICAgbGV0IHBvdGVudGlhbFN0YXJ0ZXJzID0gWy4uLmpvYnMudmFsdWVzKCldO1xuICAgICAgICBwb3RlbnRpYWxTdGFydGVycyA9IHBvdGVudGlhbFN0YXJ0ZXJzLmZpbHRlcihqID0+IGoud2hlbiAhPT0gXCJuZXZlclwiKTtcbiAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5maWx0ZXIoaiA9PiBqLndoZW4gIT09IFwibWFudWFsXCIgfHwgbWFudWFsT3B0cy5pbmNsdWRlcyhqLm5hbWUpKTtcbiAgICAgICAgYXdhaXQgSm9iRXhlY3V0b3IucnVuTG9vcChqb2JzLCBzdGFnZXMsIHBvdGVudGlhbFN0YXJ0ZXJzLCBtYW51YWxPcHRzLCBwcml2aWxlZ2VkKTtcbiAgICAgICAgYXdhaXQgQ29tbWFuZGVyLnByaW50UmVwb3J0KHdyaXRlU3RyZWFtcywgam9icywgc3RhZ2VzLCBwYXJzZXIuam9iTmFtZVBhZCwgY3dkKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcnVuU2luZ2xlSm9iKHBhcnNlcjogUGFyc2VyLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgam9iQXJnczogc3RyaW5nW10sIG5lZWRzOiBib29sZWFuLCBtYW51YWxPcHRzOiBzdHJpbmdbXSwgcHJpdmlsZWdlZDogYm9vbGVhbiwgY3dkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgam9icyA9IHBhcnNlci5qb2JzO1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuXG4gICAgICAgIGxldCBwb3RlbnRpYWxTdGFydGVyczogSm9iW10gPSBbXTtcbiAgICAgICAgY29uc3Qgam9iUG9vbE1hcCA9IG5lZWRzID8gbmV3IE1hcDxzdHJpbmcsIEpvYj4oam9icykgOiBuZXcgTWFwPHN0cmluZywgSm9iPigpO1xuICAgICAgICBqb2JBcmdzLmZvckVhY2goam9iTmFtZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBqb2IgPSBVdGlscy5nZXRKb2JCeU5hbWUoam9icywgam9iTmFtZSk7XG4gICAgICAgICAgICBqb2JQb29sTWFwLnNldChqb2JOYW1lLCBqb2IpO1xuICAgICAgICAgICAgaWYgKG5lZWRzKSB7XG4gICAgICAgICAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5jb25jYXQoSm9iRXhlY3V0b3IuZ2V0UGFzdFRvV2FpdEZvcihqb2JzLCBzdGFnZXMsIGpvYiwgbWFudWFsT3B0cykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMucHVzaChqb2IpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBKb2JFeGVjdXRvci5ydW5Mb29wKGpvYlBvb2xNYXAsIHN0YWdlcywgcG90ZW50aWFsU3RhcnRlcnMsIG1hbnVhbE9wdHMsIHByaXZpbGVnZWQpO1xuICAgICAgICBhd2FpdCBDb21tYW5kZXIucHJpbnRSZXBvcnQod3JpdGVTdHJlYW1zLCBqb2JzLCBzdGFnZXMsIHBhcnNlci5qb2JOYW1lUGFkLCBjd2QpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwcmludFJlcG9ydCA9IGFzeW5jICh3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcywgam9iczogUmVhZG9ubHlNYXA8c3RyaW5nLCBKb2I+LCBzdGFnZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBqb2JOYW1lUGFkOiBudW1iZXIsIGN3ZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoXCJcXG5cIik7XG5cbiAgICAgICAgY29uc3QgcHJlU2NyaXB0czogeyBzdWNjZXNzZnVsOiBKb2JbXTsgZmFpbGVkOiBKb2JbXTsgd2FybmVkOiBKb2JbXSB9ID0ge1xuICAgICAgICAgICAgc3VjY2Vzc2Z1bDogW10sXG4gICAgICAgICAgICBmYWlsZWQ6IFtdLFxuICAgICAgICAgICAgd2FybmVkOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYWZ0ZXJTY3JpcHRzOiB7IHdhcm5lZDogSm9iW10gfSA9IHtcbiAgICAgICAgICAgIHdhcm5lZDogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKGpvYi5zdGFydGVkICYmIGpvYi5hZnRlclNjcmlwdHNFeGl0Q29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGFmdGVyU2NyaXB0cy53YXJuZWQucHVzaChqb2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKCFqb2Iuc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoam9iLnByZVNjcmlwdHNFeGl0Q29kZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHByZVNjcmlwdHMuc3VjY2Vzc2Z1bC5wdXNoKGpvYik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGpvYi5hbGxvd0ZhaWx1cmUpIHtcbiAgICAgICAgICAgICAgICBwcmVTY3JpcHRzLndhcm5lZC5wdXNoKGpvYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZVNjcmlwdHMuZmFpbGVkLnB1c2goam9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwuc29ydCgoYSwgYikgPT4gc3RhZ2VzLmluZGV4T2YoYS5zdGFnZSkgLSBzdGFnZXMuaW5kZXhPZihiLnN0YWdlKSk7XG4gICAgICAgICAgICBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwuZm9yRWFjaCgoam9iKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IGpvYi5uYW1lLnBhZEVuZChqb2JOYW1lUGFkKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ0dyZWVuQnJpZ2h0ICBQQVNTIH0ge2JsdWVCcmlnaHQgJHtuYW1lUGFkfX1gKTtcbiAgICAgICAgICAgICAgICBpZiAoam9iLmNvdmVyYWdlUGVyY2VudCkge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCAke2pvYi5jb3ZlcmFnZVBlcmNlbnR9JSB7Z3JleSBjb3ZlcmFnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChcIlxcblwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZVNjcmlwdHMud2FybmVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcHJlU2NyaXB0cy53YXJuZWQuc29ydCgoYSwgYikgPT4gc3RhZ2VzLmluZGV4T2YoYS5zdGFnZSkgLSBzdGFnZXMuaW5kZXhPZihiLnN0YWdlKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHtuYW1lfSBvZiBwcmVTY3JpcHRzLndhcm5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVQYWQgPSBuYW1lLnBhZEVuZChqb2JOYW1lUGFkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzYWZlTmFtZSA9IFV0aWxzLmdldFNhZmVKb2JOYW1lKG5hbWUpO1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2JsYWNrLmJnWWVsbG93QnJpZ2h0ICBXQVJOIH0ge2JsdWVCcmlnaHQgJHtuYW1lUGFkfX0gIHByZV9zY3JpcHRcXG5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRMb2cgPSBhd2FpdCBmcy5yZWFkRmlsZShgJHtjd2R9Ly5naXRsYWItY2ktbG9jYWwvb3V0cHV0LyR7c2FmZU5hbWV9LmxvZ2AsIFwidXRmOFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygb3V0cHV0TG9nLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKGogPT4gIWouaW5jbHVkZXMoXCJbMzJtJCBcIikpLmZpbHRlcihqID0+IGogIT09IFwiXCIpLnNsaWNlKC0zKSkge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCAge3llbGxvdyA+fSAke2xpbmV9XFxuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFmdGVyU2NyaXB0cy53YXJuZWQubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBhZnRlclNjcmlwdHMud2FybmVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgYWZ0ZXJTY3JpcHRzLndhcm5lZC5mb3JFYWNoKCh7bmFtZX0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lUGFkID0gbmFtZS5wYWRFbmQoam9iTmFtZVBhZCk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7YmxhY2suYmdZZWxsb3dCcmlnaHQgIFdBUk4gfSB7Ymx1ZUJyaWdodCAke25hbWVQYWR9fSAgYWZ0ZXJfc2NyaXB0XFxuYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLmZhaWxlZC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHByZVNjcmlwdHMuZmFpbGVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7bmFtZX0gb2YgcHJlU2NyaXB0cy5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lUGFkID0gbmFtZS5wYWRFbmQoam9iTmFtZVBhZCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2FmZU5hbWUgPSBVdGlscy5nZXRTYWZlSm9iTmFtZShuYW1lKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ1JlZCAgRkFJTCB9IHtibHVlQnJpZ2h0ICR7bmFtZVBhZH19XFxuYCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0TG9nID0gYXdhaXQgZnMucmVhZEZpbGUoYCR7Y3dkfS8uZ2l0bGFiLWNpLWxvY2FsL291dHB1dC8ke3NhZmVOYW1lfS5sb2dgLCBcInV0ZjhcIik7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG91dHB1dExvZy5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcihqID0+ICFqLmluY2x1ZGVzKFwiWzMybSQgXCIpKS5maWx0ZXIoaiA9PiBqICE9PSBcIlwiKS5zbGljZSgtMykpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2AgIHtyZWQgPn0gJHtsaW5lfVxcbmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIHByZVNjcmlwdHMuc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IGpvYi5lbnZpcm9ubWVudDtcbiAgICAgICAgICAgIGlmIChlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBVdGlscy5leHBhbmRUZXh0KGUubmFtZSwgam9iLmV4cGFuZGVkVmFyaWFibGVzKTtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IFV0aWxzLmV4cGFuZFRleHQoZS51cmwsIGpvYi5leHBhbmRlZFZhcmlhYmxlcyk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fSBlbnZpcm9ubWVudDogXFx7IG5hbWU6IHtib2xkICR7bmFtZX19YCk7XG4gICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCwgdXJsOiB7Ym9sZCAke3VybH19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KFwiIH1cXG5cIik7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBzdGF0aWMgcnVuTGlzdChwYXJzZXI6IFBhcnNlciwgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGxpc3RBbGw6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgc3RhZ2VzID0gcGFyc2VyLnN0YWdlcztcbiAgICAgICAgbGV0IGpvYnMgPSBbLi4ucGFyc2VyLmpvYnMudmFsdWVzKCldO1xuICAgICAgICBqb2JzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGFnZXMuaW5kZXhPZihhLnN0YWdlKSAtIHN0YWdlcy5pbmRleE9mKGIuc3RhZ2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgd2hlblBhZEVuZCA9IDQ7XG4gICAgICAgIGpvYnMuZm9yRWFjaChqID0+IHdoZW5QYWRFbmQgPSBNYXRoLm1heChqLndoZW4ubGVuZ3RoLCB3aGVuUGFkRW5kKSk7XG5cbiAgICAgICAgbGV0IHN0YWdlUGFkRW5kID0gNTtcbiAgICAgICAgc3RhZ2VzLmZvckVhY2gocyA9PiBzdGFnZVBhZEVuZCA9IE1hdGgubWF4KHMubGVuZ3RoLCBzdGFnZVBhZEVuZCkpO1xuXG4gICAgICAgIGxldCBkZXNjcmlwdGlvblBhZEVuZCA9IDExO1xuICAgICAgICBqb2JzLmZvckVhY2goaiA9PiBkZXNjcmlwdGlvblBhZEVuZCA9IE1hdGgubWF4KGouZGVzY3JpcHRpb24ubGVuZ3RoLCBkZXNjcmlwdGlvblBhZEVuZCkpO1xuXG4gICAgICAgIGNvbnN0IGpvYk5hbWVQYWQgPSBwYXJzZXIuam9iTmFtZVBhZDtcblxuICAgICAgICBpZiAoIWxpc3RBbGwpIHtcbiAgICAgICAgICAgIGpvYnMgPSBqb2JzLmZpbHRlcihqID0+IGoud2hlbiAhPT0gXCJuZXZlclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2dyZXkgJHtcIm5hbWVcIi5wYWRFbmQoam9iTmFtZVBhZCl9ICAke1wiZGVzY3JpcHRpb25cIi5wYWRFbmQoZGVzY3JpcHRpb25QYWRFbmQpfX0gIGApO1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtncmV5ICR7XCJzdGFnZVwiLnBhZEVuZChzdGFnZVBhZEVuZCl9ICAke1wid2hlblwiLnBhZEVuZCh3aGVuUGFkRW5kKX19ICBgKTtcbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7Z3JleSBhbGxvd19mYWlsdXJlICBuZWVkc31cXG5gKTtcblxuICAgICAgICBjb25zdCByZW5kZXJMaW5lID0gKGpvYjogSm9iKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZWVkcyA9IGpvYi5uZWVkcztcbiAgICAgICAgICAgIGNvbnN0IGFsbG93RmFpbHVyZSA9IGpvYi5hbGxvd0ZhaWx1cmUgPyBcInRydWUgXCIgOiBcImZhbHNlXCI7XG4gICAgICAgICAgICBsZXQgam9iTGluZSA9IGNoYWxrYHtibHVlQnJpZ2h0ICR7am9iLm5hbWUucGFkRW5kKGpvYk5hbWVQYWQpfX0gICR7am9iLmRlc2NyaXB0aW9uLnBhZEVuZChkZXNjcmlwdGlvblBhZEVuZCl9ICBgO1xuICAgICAgICAgICAgam9iTGluZSArPSBjaGFsa2B7eWVsbG93ICR7am9iLnN0YWdlLnBhZEVuZChzdGFnZVBhZEVuZCl9fSAgJHtqb2Iud2hlbi5wYWRFbmQod2hlblBhZEVuZCl9ICAke2FsbG93RmFpbHVyZS5wYWRFbmQoMTEpfWA7XG4gICAgICAgICAgICBpZiAobmVlZHMpIHtcbiAgICAgICAgICAgICAgICBqb2JMaW5lICs9IGNoYWxrYCAgICBbe2JsdWVCcmlnaHQgJHtuZWVkcy5tYXAobiA9PiBuLmpvYikuam9pbihcIixcIil9fV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChgJHtqb2JMaW5lfVxcbmApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGpvYnMuZm9yRWFjaCgoam9iKSA9PiByZW5kZXJMaW5lKGpvYikpO1xuICAgIH1cblxufVxuIl19
package/src/git-data.js CHANGED
@@ -9,10 +9,24 @@ const asserts_1 = require("./asserts");
9
9
  const chalk_1 = __importDefault(require("chalk"));
10
10
  const exit_error_1 = require("./types/exit-error");
11
11
  class GitData {
12
- constructor(data) {
13
- this.remote = data.remote;
14
- this.commit = data.commit;
15
- this.user = data.user;
12
+ constructor() {
13
+ this.user = {
14
+ GITLAB_USER_LOGIN: "local",
15
+ GITLAB_USER_EMAIL: "local@gitlab.com",
16
+ GITLAB_USER_NAME: "Bob Local",
17
+ GITLAB_USER_ID: "1000",
18
+ };
19
+ this.remote = {
20
+ port: "22",
21
+ host: "gitlab.com",
22
+ group: "fallback.group",
23
+ project: "fallback.project",
24
+ };
25
+ this.commit = {
26
+ REF_NAME: "main",
27
+ SHA: "0000000000000000000000000000000000000000",
28
+ SHORT_SHA: "00000000",
29
+ };
16
30
  }
17
31
  get CI_PROJECT_PATH() {
18
32
  return `${this.remote.group}/${this.remote.project}`;
@@ -27,95 +41,77 @@ class GitData {
27
41
  return `${this.remote.group.replace(/\//g, "-")}-${this.remote.project}`;
28
42
  }
29
43
  static async init(cwd, writeStreams) {
44
+ const gitData = new GitData();
30
45
  try {
31
46
  const gitVersion = (await utils_1.Utils.spawn("git --version", cwd)).stdout.trimEnd();
32
47
  (0, asserts_1.assert)(gitVersion != null, "We do not think it is safe to use git without a proper version string!");
33
48
  }
34
49
  catch (e) {
35
50
  writeStreams.stderr((0, chalk_1.default) `{yellow Git not available using fallback}\n`);
36
- return this.defaultData;
51
+ return gitData;
37
52
  }
38
- return new GitData({
39
- user: await GitData.getUserData(cwd, writeStreams),
40
- remote: await GitData.getRemoteData(cwd, writeStreams),
41
- commit: await GitData.getCommitData(cwd, writeStreams),
42
- });
53
+ await gitData.initCommitData(cwd, writeStreams);
54
+ await gitData.initRemoteData(cwd, writeStreams);
55
+ await gitData.initUserData(cwd, writeStreams);
56
+ return gitData;
43
57
  }
44
- static async getCommitData(cwd, writeStreams) {
58
+ async initCommitData(cwd, writeStreams) {
45
59
  try {
46
60
  const gitLogStdout = (await utils_1.Utils.spawn("git log -1 --pretty=format:'%h %H %D'", cwd)).stdout.replace(/\r?\n/g, "");
47
61
  const gitLogMatch = gitLogStdout.match(/(?<short_sha>\S*?) (?<sha>\S*) .*HEAD( -> |, tag: |, )(?<ref_name>.*?)(?:,|$)/);
48
62
  (0, asserts_1.assert)(gitLogMatch?.groups != null, "git log -1 didn't provide valid matches");
49
- return {
50
- REF_NAME: gitLogMatch.groups.ref_name,
51
- SHA: gitLogMatch.groups.sha,
52
- SHORT_SHA: gitLogMatch.groups.short_sha,
53
- };
63
+ this.commit.REF_NAME = gitLogMatch.groups.ref_name;
64
+ this.commit.SHA = gitLogMatch.groups.sha;
65
+ this.commit.SHORT_SHA = gitLogMatch.groups.short_sha;
54
66
  }
55
67
  catch (e) {
56
68
  if (e instanceof exit_error_1.ExitError) {
57
69
  writeStreams.stderr((0, chalk_1.default) `{yellow ${e.message}}\n`);
58
- return this.defaultData.commit;
70
+ return;
59
71
  }
60
72
  writeStreams.stderr((0, chalk_1.default) `{yellow Using fallback git commit data}\n`);
61
- return this.defaultData.commit;
62
73
  }
63
74
  }
64
- static async getRemoteData(cwd, writeStreams) {
75
+ async initRemoteData(cwd, writeStreams) {
65
76
  try {
66
77
  const { stdout: gitRemote } = await utils_1.Utils.spawn("git remote -v", cwd);
67
78
  const gitRemoteMatch = gitRemote.match(/.*(?:\/\/|@)(?<host>[^:/]*)(:(?<port>\d+)\/|:|\/)(?<group>.*)\/(?<project>.*?)(?:\r?\n|\.git)/);
68
79
  (0, asserts_1.assert)(gitRemoteMatch?.groups != null, "git remote -v didn't provide valid matches");
69
- return {
70
- port: gitRemoteMatch.groups.port ?? "22",
71
- host: gitRemoteMatch.groups.host,
72
- group: gitRemoteMatch.groups.group,
73
- project: gitRemoteMatch.groups.project,
74
- };
80
+ this.remote.port = gitRemoteMatch.groups.port ?? "22";
81
+ this.remote.host = gitRemoteMatch.groups.host;
82
+ this.remote.group = gitRemoteMatch.groups.group;
83
+ this.remote.project = gitRemoteMatch.groups.project;
75
84
  }
76
85
  catch (e) {
77
86
  if (e instanceof exit_error_1.ExitError) {
78
87
  writeStreams.stderr((0, chalk_1.default) `{yellow ${e.message}}\n`);
79
- return this.defaultData.remote;
88
+ return;
80
89
  }
81
90
  writeStreams.stderr((0, chalk_1.default) `{yellow Using fallback git remote data}\n`);
82
- return this.defaultData.remote;
83
91
  }
84
92
  }
85
- static async getUserData(cwd, writeStreams) {
93
+ async initUserData(cwd, writeStreams) {
94
+ try {
95
+ this.user.GITLAB_USER_NAME = (await utils_1.Utils.spawn("git config user.name", cwd)).stdout.trimEnd();
96
+ }
97
+ catch (e) {
98
+ writeStreams.stderr((0, chalk_1.default) `{yellow Using fallback git user.name}\n`);
99
+ }
86
100
  try {
87
101
  const email = (await utils_1.Utils.spawn("git config user.email", cwd)).stdout.trimEnd();
88
- return {
89
- GITLAB_USER_NAME: (await utils_1.Utils.spawn("git config user.name", cwd)).stdout.trimEnd(),
90
- GITLAB_USER_ID: (await utils_1.Utils.spawn("id -u", cwd)).stdout.trimEnd(),
91
- GITLAB_USER_EMAIL: email,
92
- GITLAB_USER_LOGIN: email.replace(/@.*/, ""),
93
- };
102
+ this.user.GITLAB_USER_EMAIL = email;
103
+ this.user.GITLAB_USER_LOGIN = email.replace(/@.*/, "");
104
+ }
105
+ catch (e) {
106
+ writeStreams.stderr((0, chalk_1.default) `{yellow Using fallback git user.email}\n`);
107
+ }
108
+ try {
109
+ this.user.GITLAB_USER_ID = (await utils_1.Utils.spawn("id -u", cwd)).stdout.trimEnd();
94
110
  }
95
111
  catch (e) {
96
- writeStreams.stderr((0, chalk_1.default) `{yellow Using fallback git user data}\n`);
97
- return this.defaultData.user;
112
+ writeStreams.stderr((0, chalk_1.default) `{yellow Using fallback linux user id}\n`);
98
113
  }
99
114
  }
100
115
  }
101
116
  exports.GitData = GitData;
102
- GitData.defaultData = new GitData({
103
- user: {
104
- GITLAB_USER_LOGIN: "local",
105
- GITLAB_USER_EMAIL: "local@gitlab.com",
106
- GITLAB_USER_NAME: "Bob Local",
107
- GITLAB_USER_ID: "1000",
108
- },
109
- remote: {
110
- port: "22",
111
- host: "gitlab.com",
112
- group: "fallback.group",
113
- project: "fallback.project",
114
- },
115
- commit: {
116
- REF_NAME: "main",
117
- SHA: "0000000000000000000000000000000000000000",
118
- SHORT_SHA: "00000000",
119
- },
120
- });
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnaXQtZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtQ0FBZ0M7QUFDaEMsdUNBQW1DO0FBRW5DLGtEQUEwQjtBQUMxQixtREFBNkM7QUFzQjdDLE1BQWEsT0FBTztJQTJCaEIsWUFBWSxJQUE2RDtRQUNyRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2YsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sa0JBQWtCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFBSSxvQkFBb0I7UUFDcEIsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBVyxFQUFFLFlBQTBCO1FBQ3JELElBQUk7WUFDQSxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sYUFBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxN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RUFBRSxXQUFXO1FBQzdCLGNBQWMsRUFBRSxNQUFNO0tBQ3pCO0lBQ0QsTUFBTSxFQUFFO1FBQ0osSUFBSSxFQUFFLElBQUk7UUFDVixJQUFJLEVBQUUsWUFBWTtRQUNsQixLQUFLLEVBQUUsZ0JBQWdCO1FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0I7S0FDOUI7SUFDRCxNQUFNLEVBQUU7UUFDSixRQUFRLEVBQUUsTUFBTTtRQUNoQixHQUFHLEVBQUUsMENBQTBDO1FBQy9DLFNBQVMsRUFBRSxVQUFVO0tBQ3hCO0NBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4vYXNzZXJ0c1wiO1xuaW1wb3J0IHtXcml0ZVN0cmVhbXN9IGZyb20gXCIuL3R5cGVzL3dyaXRlLXN0cmVhbXNcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7RXhpdEVycm9yfSBmcm9tIFwiLi90eXBlcy9leGl0LWVycm9yXCI7XG5cbmludGVyZmFjZSBHaXRSZW1vdGUge1xuICAgIHBvcnQ6IHN0cmluZztcbiAgICBob3N0OiBzdHJpbmc7XG4gICAgZ3JvdXA6IHN0cmluZztcbiAgICBwcm9qZWN0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHaXRDb21taXQge1xuICAgIFNIQTogc3RyaW5nO1xuICAgIFNIT1JUX1NIQTogc3RyaW5nO1xuICAgIFJFRl9OQU1FOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHaXRVc2VyIHtcbiAgICBHSVRMQUJfVVNFUl9FTUFJTDogc3RyaW5nO1xuICAgIEdJVExBQl9VU0VSX0xPR0lOOiBzdHJpbmc7XG4gICAgR0lUTEFCX1VTRVJfTkFNRTogc3RyaW5nO1xuICAgIEdJVExBQl9VU0VSX0lEOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBHaXREYXRhIHtcblxuICAgIHN0YXRpYyByZWFkb25seSBkZWZhdWx0RGF0YTogR2l0RGF0YSA9XG4gICAgICAgIG5ldyBHaXREYXRhKHtcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgICBHSVRMQUJfVVNFUl9MT0dJTjogXCJsb2NhbFwiLFxuICAgICAgICAgICAgICAgIEdJVExBQl9VU0VSX0VNQUlMOiBcImxvY2FsQGdpdGxhYi5jb21cIixcbiAgICAgICAgICAgICAgICBHSVRMQUJfVVNFUl9OQU1FOiBcIkJvYiBMb2NhbFwiLFxuICAgICAgICAgICAgICAgIEdJVExBQl9VU0VSX0lEOiBcIjEwMDBcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZW1vdGU6IHtcbiAgICAgICAgICAgICAgICBwb3J0OiBcIjIyXCIsXG4gICAgICAgICAgICAgICAgaG9zdDogXCJnaXRsYWIuY29tXCIsXG4gICAgICAgICAgICAgICAgZ3JvdXA6IFwiZmFsbGJhY2suZ3JvdXBcIixcbiAgICAgICAgICAgICAgICBwcm9qZWN0OiBcImZhbGxiYWNrLnByb2plY3RcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21taXQ6IHtcbiAgICAgICAgICAgICAgICBSRUZfTkFNRTogXCJtYWluXCIsXG4gICAgICAgICAgICAgICAgU0hBOiBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcbiAgICAgICAgICAgICAgICBTSE9SVF9TSEE6IFwiMDAwMDAwMDBcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgcmVhZG9ubHkgcmVtb3RlOiBHaXRSZW1vdGU7XG4gICAgcmVhZG9ubHkgY29tbWl0OiBHaXRDb21taXQ7XG4gICAgcmVhZG9ubHkgdXNlcjogR2l0VXNlcjtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IHsgcmVtb3RlOiBHaXRSZW1vdGU7IGNvbW1pdDogR2l0Q29tbWl0OyB1c2VyOiBHaXRVc2VyIH0pIHtcbiAgICAgICAgdGhpcy5yZW1vdGUgPSBkYXRhLnJlbW90ZTtcbiAgICAgICAgdGhpcy5jb21taXQgPSBkYXRhLmNvbW1pdDtcbiAgICAgICAgdGhpcy51c2VyID0gZGF0YS51c2VyO1xuICAgIH1cblxuICAgIGdldCBDSV9QUk9KRUNUX1BBVEgoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnJlbW90ZS5ncm91cH0vJHt0aGlzLnJlbW90ZS5wcm9qZWN0fWA7XG4gICAgfVxuXG4gICAgZ2V0IENJX1JFR0lTVFJZKCkge1xuICAgICAgICByZXR1cm4gYGxvY2FsLXJlZ2lzdHJ5LiR7dGhpcy5yZW1vdGUuaG9zdH1gO1xuICAgIH1cblxuICAgIGdldCBDSV9SRUdJU1RSWV9JTUFHRSgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuQ0lfUkVHSVNUUll9LyR7dGhpcy5DSV9QUk9KRUNUX1BBVEh9YDtcbiAgICB9XG5cbiAgICBnZXQgQ0lfUFJPSkVDVF9QQVRIX1NMVUcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnJlbW90ZS5ncm91cC5yZXBsYWNlKC9cXC8vZywgXCItXCIpfS0ke3RoaXMucmVtb3RlLnByb2plY3R9YDtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgaW5pdChjd2Q6IHN0cmluZywgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpOiBQcm9taXNlPEdpdERhdGE+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGdpdFZlcnNpb24gPSAoYXdhaXQgVXRpbHMuc3Bhd24oXCJnaXQgLS12ZXJzaW9uXCIsIGN3ZCkpLnN0ZG91dC50cmltRW5kKCk7XG4gICAgICAgICAgICBhc3NlcnQoZ2l0VmVyc2lvbiAhPSBudWxsLCBcIldlIGRvIG5vdCB0aGluayBpdCBpcyBzYWZlIHRvIHVzZSBnaXQgd2l0aG91dCBhIHByb3BlciB2ZXJzaW9uIHN0cmluZyFcIik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyBHaXQgbm90IGF2YWlsYWJsZSB1c2luZyBmYWxsYmFja31cXG5gKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHREYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBHaXREYXRhKHtcbiAgICAgICAgICAgIHVzZXI6IGF3YWl0IEdpdERhdGEuZ2V0VXNlckRhdGEoY3dkLCB3cml0ZVN0cmVhbXMpLFxuICAgICAgICAgICAgcmVtb3RlOiBhd2FpdCBHaXREYXRhLmdldFJlbW90ZURhdGEoY3dkLCB3cml0ZVN0cmVhbXMpLFxuICAgICAgICAgICAgY29tbWl0OiBhd2FpdCBHaXREYXRhLmdldENvbW1pdERhdGEoY3dkLCB3cml0ZVN0cmVhbXMpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgZ2V0Q29tbWl0RGF0YShjd2Q6IHN0cmluZywgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpOiBQcm9taXNlPEdpdENvbW1pdD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZ2l0TG9nU3Rkb3V0ID0gKGF3YWl0IFV0aWxzLnNwYXduKFwiZ2l0IGxvZyAtMSAtLXByZXR0eT1mb3JtYXQ6JyVoICVIICVEJ1wiLCBjd2QpKS5zdGRvdXQucmVwbGFjZSgvXFxyP1xcbi9nLCBcIlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGdpdExvZ01hdGNoID0gZ2l0TG9nU3Rkb3V0Lm1hdGNoKC8oPzxzaG9ydF9zaGE+XFxTKj8pICg/PHNoYT5cXFMqKSAuKkhFQUQoIC0+IHwsIHRhZzogfCwgKSg/PHJlZl9uYW1lPi4qPykoPzosfCQpLyk7XG5cbiAgICAgICAgICAgIGFzc2VydChnaXRMb2dNYXRjaD8uZ3JvdXBzICE9IG51bGwsIFwiZ2l0IGxvZyAtMSBkaWRuJ3QgcHJvdmlkZSB2YWxpZCBtYXRjaGVzXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIFJFRl9OQU1FOiBnaXRMb2dNYXRjaC5ncm91cHMucmVmX25hbWUsXG4gICAgICAgICAgICAgICAgU0hBOiBnaXRMb2dNYXRjaC5ncm91cHMuc2hhLFxuICAgICAgICAgICAgICAgIFNIT1JUX1NIQTogZ2l0TG9nTWF0Y2guZ3JvdXBzLnNob3J0X3NoYSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXhpdEVycm9yKSB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93ICR7ZS5tZXNzYWdlfX1cXG5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RGF0YS5jb21taXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgVXNpbmcgZmFsbGJhY2sgZ2l0IGNvbW1pdCBkYXRhfVxcbmApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdERhdGEuY29tbWl0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGdldFJlbW90ZURhdGEoY3dkOiBzdHJpbmcsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKTogUHJvbWlzZTxHaXRSZW1vdGU+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3Rkb3V0OiBnaXRSZW1vdGUgfSA9IGF3YWl0IFV0aWxzLnNwYXduKFwiZ2l0IHJlbW90ZSAtdlwiLCBjd2QpO1xuICAgICAgICAgICAgY29uc3QgZ2l0UmVtb3RlTWF0Y2ggPSBnaXRSZW1vdGUubWF0Y2goLy4qKD86XFwvXFwvfEApKD88aG9zdD5bXjovXSopKDooPzxwb3J0PlxcZCspXFwvfDp8XFwvKSg/PGdyb3VwPi4qKVxcLyg/PHByb2plY3Q+Lio/KSg/Olxccj9cXG58XFwuZ2l0KS8pO1xuXG4gICAgICAgICAgICBhc3NlcnQoZ2l0UmVtb3RlTWF0Y2g/Lmdyb3VwcyAhPSBudWxsLCBcImdpdCByZW1vdGUgLXYgZGlkbid0IHByb3ZpZGUgdmFsaWQgbWF0Y2hlc1wiKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwb3J0OiBnaXRSZW1vdGVNYXRjaC5ncm91cHMucG9ydCA/PyBcIjIyXCIsXG4gICAgICAgICAgICAgICAgaG9zdDogZ2l0UmVtb3RlTWF0Y2guZ3JvdXBzLmhvc3QsXG4gICAgICAgICAgICAgICAgZ3JvdXA6IGdpdFJlbW90ZU1hdGNoLmdyb3Vwcy5ncm91cCxcbiAgICAgICAgICAgICAgICBwcm9qZWN0OiBnaXRSZW1vdGVNYXRjaC5ncm91cHMucHJvamVjdCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXhpdEVycm9yKSB7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93ICR7ZS5tZXNzYWdlfX1cXG5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0RGF0YS5yZW1vdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgVXNpbmcgZmFsbGJhY2sgZ2l0IHJlbW90ZSBkYXRhfVxcbmApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdERhdGEucmVtb3RlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGdldFVzZXJEYXRhKGN3ZDogc3RyaW5nLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcyk6IFByb21pc2U8R2l0VXNlcj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZW1haWwgPSAoYXdhaXQgVXRpbHMuc3Bhd24oXCJnaXQgY29uZmlnIHVzZXIuZW1haWxcIiwgY3dkKSkuc3Rkb3V0LnRyaW1FbmQoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBHSVRMQUJfVVNFUl9OQU1FOiAoYXdhaXQgVXRpbHMuc3Bhd24oXCJnaXQgY29uZmlnIHVzZXIubmFtZVwiLCBjd2QpKS5zdGRvdXQudHJpbUVuZCgpLFxuICAgICAgICAgICAgICAgIEdJVExBQl9VU0VSX0lEOiAoYXdhaXQgVXRpbHMuc3Bhd24oXCJpZCAtdVwiLCBjd2QpKS5zdGRvdXQudHJpbUVuZCgpLFxuICAgICAgICAgICAgICAgIEdJVExBQl9VU0VSX0VNQUlMOiBlbWFpbCxcbiAgICAgICAgICAgICAgICBHSVRMQUJfVVNFUl9MT0dJTjogZW1haWwucmVwbGFjZSgvQC4qLywgXCJcIiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgVXNpbmcgZmFsbGJhY2sgZ2l0IHVzZXIgZGF0YX1cXG5gKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHREYXRhLnVzZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnaXQtZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtQ0FBOEI7QUFDOUIsdUNBQWlDO0FBRWpDLGtEQUEwQjtBQUMxQixtREFBNkM7QUFFN0MsTUFBYSxPQUFPO0lBQXBCO1FBRW9CLFNBQUksR0FBRztZQUNuQixpQkFBaUIsRUFBRSxPQUFPO1lBQzFCLGlCQUFpQixFQUFFLGtCQUFrQjtZQUNyQyxnQkFBZ0IsRUFBRSxXQUFXO1lBQzdCLGNBQWMsRUFBRSxNQUFNO1NBQ3pCLENBQUM7UUFFYyxXQUFNLEdBQUc7WUFDckIsSUFBSSxFQUFFLElBQUk7WUFDVixJQUFJLEVBQUUsWUFBWTtZQUNsQixLQUFLLEVBQUUsZ0JBQWdCO1lBQ3ZCLE9BQU8sRUFBRSxrQkFBa0I7U0FDOUIsQ0FBQztRQUVjLFdBQU0sR0FBRztZQUNyQixRQUFRLEVBQUUsTUFBTTtZQUNoQixHQUFHLEVBQUUsMENBQTBDO1lBQy9DLFNBQVMsRUFBRSxVQUFVO1NBQ3hCLENBQUM7SUE2Rk4sQ0FBQztJQTNGRyxJQUFJLGVBQWU7UUFDZixPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxrQkFBa0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDakIsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxD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eEU7UUFFRCxJQUFJO1lBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxNQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2pGO1FBQUMsT0FBTSxDQUFDLEVBQUU7WUFDUCxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFBLHlDQUF5QyxDQUFDLENBQUM7U0FDdkU7SUFDTCxDQUFDO0NBQ0o7QUFqSEQsMEJBaUhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtVdGlsc30gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7YXNzZXJ0fSBmcm9tIFwiLi9hc3NlcnRzXCI7XG5pbXBvcnQge1dyaXRlU3RyZWFtc30gZnJvbSBcIi4vdHlwZXMvd3JpdGUtc3RyZWFtc1wiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHtFeGl0RXJyb3J9IGZyb20gXCIuL3R5cGVzL2V4aXQtZXJyb3JcIjtcblxuZXhwb3J0IGNsYXNzIEdpdERhdGEge1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHVzZXIgPSB7XG4gICAgICAgIEdJVExBQl9VU0VSX0xPR0lOOiBcImxvY2FsXCIsXG4gICAgICAgIEdJVExBQl9VU0VSX0VNQUlMOiBcImxvY2FsQGdpdGxhYi5jb21cIixcbiAgICAgICAgR0lUTEFCX1VTRVJfTkFNRTogXCJCb2IgTG9jYWxcIixcbiAgICAgICAgR0lUTEFCX1VTRVJfSUQ6IFwiMTAwMFwiLFxuICAgIH07XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVtb3RlID0ge1xuICAgICAgICBwb3J0OiBcIjIyXCIsXG4gICAgICAgIGhvc3Q6IFwiZ2l0bGFiLmNvbVwiLFxuICAgICAgICBncm91cDogXCJmYWxsYmFjay5ncm91cFwiLFxuICAgICAgICBwcm9qZWN0OiBcImZhbGxiYWNrLnByb2plY3RcIixcbiAgICB9O1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbW1pdCA9IHtcbiAgICAgICAgUkVGX05BTUU6IFwibWFpblwiLFxuICAgICAgICBTSEE6IFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBTSE9SVF9TSEE6IFwiMDAwMDAwMDBcIixcbiAgICB9O1xuXG4gICAgZ2V0IENJX1BST0pFQ1RfUEFUSCgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMucmVtb3RlLmdyb3VwfS8ke3RoaXMucmVtb3RlLnByb2plY3R9YDtcbiAgICB9XG5cbiAgICBnZXQgQ0lfUkVHSVNUUlkoKSB7XG4gICAgICAgIHJldHVybiBgbG9jYWwtcmVnaXN0cnkuJHt0aGlzLnJlbW90ZS5ob3N0fWA7XG4gICAgfVxuXG4gICAgZ2V0IENJX1JFR0lTVFJZX0lNQUdFKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5DSV9SRUdJU1RSWX0vJHt0aGlzLkNJX1BST0pFQ1RfUEFUSH1gO1xuICAgIH1cblxuICAgIGdldCBDSV9QUk9KRUNUX1BBVEhfU0xVRygpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMucmVtb3RlLmdyb3VwLnJlcGxhY2UoL1xcLy9nLCBcIi1cIil9LSR7dGhpcy5yZW1vdGUucHJvamVjdH1gO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBpbml0KGN3ZDogc3RyaW5nLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcyk6IFByb21pc2U8R2l0RGF0YT4ge1xuICAgICAgICBjb25zdCBnaXREYXRhID0gbmV3IEdpdERhdGEoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGdpdFZlcnNpb24gPSAoYXdhaXQgVXRpbHMuc3Bhd24oXCJnaXQgLS12ZXJzaW9uXCIsIGN3ZCkpLnN0ZG91dC50cmltRW5kKCk7XG4gICAgICAgICAgICBhc3NlcnQoZ2l0VmVyc2lvbiAhPSBudWxsLCBcIldlIGRvIG5vdCB0aGluayBpdCBpcyBzYWZlIHRvIHVzZSBnaXQgd2l0aG91dCBhIHByb3BlciB2ZXJzaW9uIHN0cmluZyFcIik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyBHaXQgbm90IGF2YWlsYWJsZSB1c2luZyBmYWxsYmFja31cXG5gKTtcbiAgICAgICAgICAgIHJldHVybiBnaXREYXRhO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGdpdERhdGEuaW5pdENvbW1pdERhdGEoY3dkLCB3cml0ZVN0cmVhbXMpO1xuICAgICAgICBhd2FpdCBnaXREYXRhLmluaXRSZW1vdGVEYXRhKGN3ZCwgd3JpdGVTdHJlYW1zKTtcbiAgICAgICAgYXdhaXQgZ2l0RGF0YS5pbml0VXNlckRhdGEoY3dkLCB3cml0ZVN0cmVhbXMpO1xuICAgICAgICByZXR1cm4gZ2l0RGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXRDb21taXREYXRhKGN3ZDogc3RyaW5nLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZ2l0TG9nU3Rkb3V0ID0gKGF3YWl0IFV0aWxzLnNwYXduKFwiZ2l0IGxvZyAtMSAtLXByZXR0eT1mb3JtYXQ6JyVoICVIICVEJ1wiLCBjd2QpKS5zdGRvdXQucmVwbGFjZSgvXFxyP1xcbi9nLCBcIlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGdpdExvZ01hdGNoID0gZ2l0TG9nU3Rkb3V0Lm1hdGNoKC8oPzxzaG9ydF9zaGE+XFxTKj8pICg/PHNoYT5cXFMqKSAuKkhFQUQoIC0+IHwsIHRhZzogfCwgKSg/PHJlZl9uYW1lPi4qPykoPzosfCQpLyk7XG5cbiAgICAgICAgICAgIGFzc2VydChnaXRMb2dNYXRjaD8uZ3JvdXBzICE9IG51bGwsIFwiZ2l0IGxvZyAtMSBkaWRuJ3QgcHJvdmlkZSB2YWxpZCBtYXRjaGVzXCIpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbW1pdC5SRUZfTkFNRSA9IGdpdExvZ01hdGNoLmdyb3Vwcy5yZWZfbmFtZTtcbiAgICAgICAgICAgIHRoaXMuY29tbWl0LlNIQSA9IGdpdExvZ01hdGNoLmdyb3Vwcy5zaGE7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdC5TSE9SVF9TSEEgPSBnaXRMb2dNYXRjaC5ncm91cHMuc2hvcnRfc2hhO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEV4aXRFcnJvcikge1xuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyAke2UubWVzc2FnZX19XFxuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93IFVzaW5nIGZhbGxiYWNrIGdpdCBjb21taXQgZGF0YX1cXG5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdFJlbW90ZURhdGEoY3dkOiBzdHJpbmcsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHN0ZG91dDogZ2l0UmVtb3RlIH0gPSBhd2FpdCBVdGlscy5zcGF3bihcImdpdCByZW1vdGUgLXZcIiwgY3dkKTtcbiAgICAgICAgICAgIGNvbnN0IGdpdFJlbW90ZU1hdGNoID0gZ2l0UmVtb3RlLm1hdGNoKC8uKig/OlxcL1xcL3xAKSg/PGhvc3Q+W146L10qKSg6KD88cG9ydD5cXGQrKVxcL3w6fFxcLykoPzxncm91cD4uKilcXC8oPzxwcm9qZWN0Pi4qPykoPzpcXHI/XFxufFxcLmdpdCkvKTtcblxuICAgICAgICAgICAgYXNzZXJ0KGdpdFJlbW90ZU1hdGNoPy5ncm91cHMgIT0gbnVsbCwgXCJnaXQgcmVtb3RlIC12IGRpZG4ndCBwcm92aWRlIHZhbGlkIG1hdGNoZXNcIik7XG5cbiAgICAgICAgICAgIHRoaXMucmVtb3RlLnBvcnQgPSBnaXRSZW1vdGVNYXRjaC5ncm91cHMucG9ydCA/PyBcIjIyXCI7XG4gICAgICAgICAgICB0aGlzLnJlbW90ZS5ob3N0ID0gZ2l0UmVtb3RlTWF0Y2guZ3JvdXBzLmhvc3Q7XG4gICAgICAgICAgICB0aGlzLnJlbW90ZS5ncm91cCA9IGdpdFJlbW90ZU1hdGNoLmdyb3Vwcy5ncm91cDtcbiAgICAgICAgICAgIHRoaXMucmVtb3RlLnByb2plY3QgPSBnaXRSZW1vdGVNYXRjaC5ncm91cHMucHJvamVjdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFeGl0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgJHtlLm1lc3NhZ2V9fVxcbmApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyBVc2luZyBmYWxsYmFjayBnaXQgcmVtb3RlIGRhdGF9XFxuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBpbml0VXNlckRhdGEoY3dkOiBzdHJpbmcsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnVzZXIuR0lUTEFCX1VTRVJfTkFNRSA9IChhd2FpdCBVdGlscy5zcGF3bihcImdpdCBjb25maWcgdXNlci5uYW1lXCIsIGN3ZCkpLnN0ZG91dC50cmltRW5kKCk7XG4gICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7eWVsbG93IFVzaW5nIGZhbGxiYWNrIGdpdCB1c2VyLm5hbWV9XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZW1haWwgPSAoYXdhaXQgVXRpbHMuc3Bhd24oXCJnaXQgY29uZmlnIHVzZXIuZW1haWxcIiwgY3dkKSkuc3Rkb3V0LnRyaW1FbmQoKTtcbiAgICAgICAgICAgIHRoaXMudXNlci5HSVRMQUJfVVNFUl9FTUFJTCA9IGVtYWlsO1xuICAgICAgICAgICAgdGhpcy51c2VyLkdJVExBQl9VU0VSX0xPR0lOID0gZW1haWwucmVwbGFjZSgvQC4qLywgXCJcIik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyBVc2luZyBmYWxsYmFjayBnaXQgdXNlci5lbWFpbH1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnVzZXIuR0lUTEFCX1VTRVJfSUQgPSAoYXdhaXQgVXRpbHMuc3Bhd24oXCJpZCAtdVwiLCBjd2QpKS5zdGRvdXQudHJpbUVuZCgpO1xuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRlcnIoY2hhbGtge3llbGxvdyBVc2luZyBmYWxsYmFjayBsaW51eCB1c2VyIGlkfVxcbmApO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19