gitlab-ci-local 4.65.1 → 4.66.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 +20 -19
- package/dist/index.js +340 -0
- package/dist/index.js.map +480 -0
- package/package.json +26 -80
- package/src/argv.js +0 -307
- package/src/commander.js +0 -247
- package/src/data-expander.js +0 -220
- package/src/executor.js +0 -104
- package/src/git-data.js +0 -168
- package/src/gitlab-preset.js +0 -24
- package/src/global.js +0 -40
- package/src/handler.js +0 -119
- package/src/index.js +0 -364
- package/src/job.js +0 -1463
- package/src/mutex.js +0 -20
- package/src/parallel.js +0 -46
- package/src/parser-includes.js +0 -387
- package/src/parser.js +0 -357
- package/src/predefined-variables.js +0 -67
- package/src/producers.js +0 -42
- package/src/schema/index.js +0 -19
- package/src/schema/schema.js +0 -3190
- package/src/schema-error.js +0 -114
- package/src/state.js +0 -22
- package/src/utils.js +0 -485
- package/src/validator.js +0 -151
- package/src/variables-from-files.js +0 -143
- package/src/write-streams.js +0 -51
package/src/commander.js
DELETED
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk-template";
|
|
2
|
-
import { Utils } from "./utils.js";
|
|
3
|
-
import { Executor } from "./executor.js";
|
|
4
|
-
import fs from "fs-extra";
|
|
5
|
-
import { AssertionError } from "assert";
|
|
6
|
-
export class Commander {
|
|
7
|
-
static async runPipeline(argv, parser, writeStreams) {
|
|
8
|
-
const jobs = parser.jobs;
|
|
9
|
-
const stages = parser.stages;
|
|
10
|
-
let potentialStarters = [...jobs.values()];
|
|
11
|
-
potentialStarters = potentialStarters.filter(j => j.when !== "never");
|
|
12
|
-
potentialStarters = potentialStarters.filter(j => j.when !== "manual" || argv.manual.includes(j.name));
|
|
13
|
-
await Executor.runLoop(argv, jobs, stages, potentialStarters);
|
|
14
|
-
await Commander.printReport({
|
|
15
|
-
cwd: argv.cwd,
|
|
16
|
-
showTimestamps: argv.showTimestamps,
|
|
17
|
-
stateDir: argv.stateDir,
|
|
18
|
-
writeStreams: writeStreams,
|
|
19
|
-
jobs: jobs,
|
|
20
|
-
stages: stages,
|
|
21
|
-
jobNamePad: parser.jobNamePad,
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
static async runJobsInStage(argv, parser, writeStreams) {
|
|
25
|
-
const jobs = parser.jobs.filter(j => j.stage === argv.stage);
|
|
26
|
-
const stages = parser.stages;
|
|
27
|
-
let potentialStarters = [...jobs.values()];
|
|
28
|
-
potentialStarters = potentialStarters.filter(j => j.when !== "never");
|
|
29
|
-
potentialStarters = potentialStarters.filter(j => j.when !== "manual" || argv.manual.includes(j.name));
|
|
30
|
-
potentialStarters = potentialStarters.filter(j => j.stage === argv.stage);
|
|
31
|
-
await Executor.runLoop(argv, jobs, stages, potentialStarters);
|
|
32
|
-
await Commander.printReport({
|
|
33
|
-
cwd: argv.cwd,
|
|
34
|
-
showTimestamps: argv.showTimestamps,
|
|
35
|
-
stateDir: argv.stateDir,
|
|
36
|
-
writeStreams: writeStreams,
|
|
37
|
-
jobs: jobs,
|
|
38
|
-
stages: stages,
|
|
39
|
-
jobNamePad: parser.jobNamePad,
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
static async runJobs(argv, parser, writeStreams) {
|
|
43
|
-
const needs = argv.needs || argv.onlyNeeds;
|
|
44
|
-
const jobArgs = argv.job;
|
|
45
|
-
const jobs = parser.jobs;
|
|
46
|
-
const stages = parser.stages;
|
|
47
|
-
const potentialStarters = [];
|
|
48
|
-
const jobSet = needs ? new Set(jobs) : new Set();
|
|
49
|
-
jobArgs.forEach(jobArgName => {
|
|
50
|
-
const baseJobs = jobs.filter(j => j.baseName == jobArgName || j.name === jobArgName);
|
|
51
|
-
for (const b of baseJobs) {
|
|
52
|
-
jobSet.add(b);
|
|
53
|
-
if (needs) {
|
|
54
|
-
potentialStarters.push(...Executor.getPastToWaitFor(jobs, stages, b, argv.manual));
|
|
55
|
-
}
|
|
56
|
-
potentialStarters.push(b);
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
if (potentialStarters.length === 0) {
|
|
60
|
-
throw new AssertionError({ message: chalk `{blueBright ${jobArgs.join(",")}} could not be found` });
|
|
61
|
-
}
|
|
62
|
-
const starters = argv.onlyNeeds ?
|
|
63
|
-
potentialStarters.filter(p => !jobArgs.includes(p.name)) :
|
|
64
|
-
potentialStarters;
|
|
65
|
-
await Executor.runLoop(argv, Array.from(jobSet), stages, starters);
|
|
66
|
-
await Commander.printReport({
|
|
67
|
-
cwd: argv.cwd,
|
|
68
|
-
showTimestamps: argv.showTimestamps,
|
|
69
|
-
stateDir: argv.stateDir,
|
|
70
|
-
writeStreams: writeStreams,
|
|
71
|
-
jobs: jobs,
|
|
72
|
-
stages: stages,
|
|
73
|
-
jobNamePad: parser.jobNamePad,
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
static async printReport({ cwd, stateDir, showTimestamps, writeStreams, jobs, stages, jobNamePad }) {
|
|
77
|
-
writeStreams.stdout("\n");
|
|
78
|
-
const renderDuration = (duration) => showTimestamps ? ` [${duration.padStart(7)}]` : "";
|
|
79
|
-
const preScripts = {
|
|
80
|
-
successful: [],
|
|
81
|
-
failed: [],
|
|
82
|
-
warned: [],
|
|
83
|
-
};
|
|
84
|
-
const afterScripts = {
|
|
85
|
-
warned: [],
|
|
86
|
-
};
|
|
87
|
-
for (const job of jobs.values()) {
|
|
88
|
-
if (job.started && job.afterScriptsExitCode !== 0) {
|
|
89
|
-
afterScripts.warned.push(job);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
for (const job of jobs.values()) {
|
|
93
|
-
if (!job.started) {
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
if (job.jobStatus === "success") {
|
|
97
|
-
preScripts.successful.push(job);
|
|
98
|
-
}
|
|
99
|
-
else if (job.jobStatus === "warning") {
|
|
100
|
-
preScripts.warned.push(job);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
preScripts.failed.push(job);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
if (preScripts.successful.length !== 0) {
|
|
107
|
-
preScripts.successful.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
|
|
108
|
-
preScripts.successful.forEach(({ argv, coveragePercent, name, prettyDuration }) => {
|
|
109
|
-
let prefix = "";
|
|
110
|
-
if (argv.childPipelineDepth > 0)
|
|
111
|
-
prefix = `[${argv.variable.GCL_TRIGGERER}] -> `;
|
|
112
|
-
const namePad = name.padEnd(jobNamePad);
|
|
113
|
-
writeStreams.stdout(chalk `{black.bgGreenBright PASS }${renderDuration(prettyDuration)} {blueBright ${prefix}${namePad}}`);
|
|
114
|
-
if (coveragePercent) {
|
|
115
|
-
writeStreams.stdout(chalk ` ${coveragePercent}% {grey coverage}`);
|
|
116
|
-
}
|
|
117
|
-
writeStreams.stdout("\n");
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
if (preScripts.warned.length !== 0) {
|
|
121
|
-
preScripts.warned.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
|
|
122
|
-
for (const { name, prettyDuration } of preScripts.warned) {
|
|
123
|
-
const namePad = name.padEnd(jobNamePad);
|
|
124
|
-
const safeName = Utils.safeDockerString(name);
|
|
125
|
-
writeStreams.stdout(chalk `{black.bgYellowBright WARN }${renderDuration(prettyDuration)} {blueBright ${namePad}} pre_script\n`);
|
|
126
|
-
const outputLog = await fs.readFile(`${cwd}/${stateDir}/output/${safeName}.log`, "utf8");
|
|
127
|
-
for (const line of outputLog.split(/\r?\n/).filter(j => !j.includes("[32m$ ")).filter(j => j !== "").slice(-3)) {
|
|
128
|
-
writeStreams.stdout(chalk ` {yellow >} ${line}\n`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
if (afterScripts.warned.length !== 0) {
|
|
133
|
-
afterScripts.warned.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
|
|
134
|
-
afterScripts.warned.forEach(({ name, prettyDuration }) => {
|
|
135
|
-
const namePad = name.padEnd(jobNamePad);
|
|
136
|
-
writeStreams.stdout(chalk `{black.bgYellowBright WARN }${renderDuration(prettyDuration)} {blueBright ${namePad}} after_script\n`);
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
if (preScripts.failed.length !== 0) {
|
|
140
|
-
preScripts.failed.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
|
|
141
|
-
for (const { name, prettyDuration } of preScripts.failed) {
|
|
142
|
-
const namePad = name.padEnd(jobNamePad);
|
|
143
|
-
const safeName = Utils.safeDockerString(name);
|
|
144
|
-
writeStreams.stdout(chalk `{black.bgRed FAIL }${renderDuration(prettyDuration)} {blueBright ${namePad}}\n`);
|
|
145
|
-
const outputLog = await fs.readFile(`${cwd}/${stateDir}/output/${safeName}.log`, "utf8");
|
|
146
|
-
for (const line of outputLog.split(/\r?\n/).filter(j => !j.includes("[32m$ ")).filter(j => j !== "").slice(-3)) {
|
|
147
|
-
writeStreams.stdout(chalk ` {red >} ${line}\n`);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
for (const job of preScripts.successful) {
|
|
152
|
-
const e = job.environment;
|
|
153
|
-
if (e == null) {
|
|
154
|
-
continue;
|
|
155
|
-
}
|
|
156
|
-
const name = e.name;
|
|
157
|
-
const url = e.url;
|
|
158
|
-
writeStreams.stdout(chalk `{blueBright ${job.name}} environment: \{ name: {bold ${name}}`);
|
|
159
|
-
if (url != null) {
|
|
160
|
-
writeStreams.stdout(chalk `, url: {bold ${url}}`);
|
|
161
|
-
}
|
|
162
|
-
writeStreams.stdout(" }\n");
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
static runList(parser, writeStreams, listAll) {
|
|
166
|
-
const stages = parser.stages;
|
|
167
|
-
let jobs = [...parser.jobs.values()];
|
|
168
|
-
jobs.sort((a, b) => {
|
|
169
|
-
return stages.indexOf(a.stage) - stages.indexOf(b.stage);
|
|
170
|
-
});
|
|
171
|
-
let whenPadEnd = 4;
|
|
172
|
-
jobs.forEach(j => whenPadEnd = Math.max(j.when.length, whenPadEnd));
|
|
173
|
-
let stagePadEnd = 5;
|
|
174
|
-
stages.forEach(s => stagePadEnd = Math.max(s.length, stagePadEnd));
|
|
175
|
-
let descriptionPadEnd = 11;
|
|
176
|
-
jobs.forEach(j => descriptionPadEnd = Math.max(j.description.length, descriptionPadEnd));
|
|
177
|
-
const jobNamePad = parser.jobNamePad;
|
|
178
|
-
if (!listAll) {
|
|
179
|
-
jobs = jobs.filter(j => j.when !== "never");
|
|
180
|
-
}
|
|
181
|
-
writeStreams.stdout(chalk `{grey ${"name".padEnd(jobNamePad)} ${"description".padEnd(descriptionPadEnd)}} `);
|
|
182
|
-
writeStreams.stdout(chalk `{grey ${"stage".padEnd(stagePadEnd)} ${"when".padEnd(whenPadEnd)}} `);
|
|
183
|
-
writeStreams.stdout(chalk `{grey allow_failure needs}\n`);
|
|
184
|
-
const renderLine = (job) => {
|
|
185
|
-
const needs = job.needs?.filter(n => !n.project && !n.pipeline).map(n => n.job);
|
|
186
|
-
const allowFailure = job.allowFailure ? "true " : "false ";
|
|
187
|
-
let jobLine = chalk `{blueBright ${job.name.padEnd(jobNamePad)}} ${job.description.padEnd(descriptionPadEnd)} `;
|
|
188
|
-
jobLine += chalk `{yellow ${job.stage.padEnd(stagePadEnd)}} ${job.when.padEnd(whenPadEnd)} ${allowFailure.padEnd(11)}`;
|
|
189
|
-
if (needs) {
|
|
190
|
-
jobLine += chalk ` [{blueBright ${needs}}]`;
|
|
191
|
-
}
|
|
192
|
-
writeStreams.stdout(`${jobLine}\n`);
|
|
193
|
-
};
|
|
194
|
-
jobs.forEach((job) => renderLine(job));
|
|
195
|
-
}
|
|
196
|
-
static runJson(parser, writeStreams) {
|
|
197
|
-
const jobs = [...parser.jobs.values()];
|
|
198
|
-
const json = [];
|
|
199
|
-
jobs.forEach((job) => {
|
|
200
|
-
json.push({
|
|
201
|
-
name: job.name,
|
|
202
|
-
description: job.description,
|
|
203
|
-
stage: job.stage,
|
|
204
|
-
when: job.when,
|
|
205
|
-
allow_failure: job.allowFailure,
|
|
206
|
-
needs: job.needs?.filter(n => !n.project && !n.pipeline),
|
|
207
|
-
...job.rules ? { rules: job.rules } : {},
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
writeStreams.stdout(`${JSON.stringify(json, null, 2)}\n`);
|
|
211
|
-
}
|
|
212
|
-
static runCsv(parser, writeStreams, all) {
|
|
213
|
-
const stages = parser.stages;
|
|
214
|
-
let jobs = [...parser.jobs.values()];
|
|
215
|
-
jobs.sort((a, b) => {
|
|
216
|
-
return stages.indexOf(a.stage) - stages.indexOf(b.stage);
|
|
217
|
-
});
|
|
218
|
-
if (!all) {
|
|
219
|
-
jobs = jobs.filter(j => j.when !== "never");
|
|
220
|
-
}
|
|
221
|
-
writeStreams.stdout("name;description;stage;when;allowFailure;needs\n");
|
|
222
|
-
jobs.forEach((job) => {
|
|
223
|
-
const needs = job.needs?.filter(n => !n.project && !n.pipeline).map(n => n.job).join(",") ?? [];
|
|
224
|
-
writeStreams.stdout(`${job.name};"${job.description}";${job.stage};${job.when};${job.allowFailure ? "true" : "false"};[${needs}]\n`);
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
static validateDependencyChain(parser) {
|
|
228
|
-
const allJobs = parser.jobs;
|
|
229
|
-
// This is only the jobs that will actually run
|
|
230
|
-
const activeJobs = allJobs.filter(j => j.when !== "never");
|
|
231
|
-
const stages = parser.stages;
|
|
232
|
-
// This will throw an assertion errror if the dependency chain is broken due to needs keyword on specific events without having to run the full pipeline
|
|
233
|
-
Executor.getStartCandidates(allJobs, stages, activeJobs, []);
|
|
234
|
-
const activeJobNames = new Set(activeJobs.map(job => job.name));
|
|
235
|
-
// This willl throw an assertion error if the dependency chain is broken due to dependencies keyword (a job depending on artifacts from a job that will never run) without having to run the full pipeline
|
|
236
|
-
for (const job of activeJobs) {
|
|
237
|
-
if (job.dependencies) {
|
|
238
|
-
for (const dependency of job.dependencies) {
|
|
239
|
-
if (!activeJobNames.has(dependency)) {
|
|
240
|
-
throw new AssertionError({ message: chalk `{blueBright ${dependency}} is when:never, but its depended on by {blueBright ${job.name}}` });
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbWFuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBR25DLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFakMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFMUIsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUV0QyxNQUFNLE9BQU8sU0FBUztJQUVsQixNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBRSxJQUFVLEVBQUUsTUFBYyxFQUFFLFlBQTBCO1FBQzVFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUU3QixJQUFJLGlCQUFpQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMzQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQ3RFLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlELE1BQU0sU0FBUyxDQUFDLFdBQVcsQ0FBQztZQUN4QixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7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Q0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7d0JBQ2xDLE1BQU0sSUFBSSxjQUFjLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxDQUFBLGVBQWUsVUFBVSx1REFBdUQsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFDLENBQUMsQ0FBQztvQkFDMUksQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrLXRlbXBsYXRlXCI7XG5pbXBvcnQge0pvYn0gZnJvbSBcIi4vam9iLmpzXCI7XG5pbXBvcnQge1BhcnNlcn0gZnJvbSBcIi4vcGFyc2VyLmpzXCI7XG5pbXBvcnQge1V0aWxzfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuaW1wb3J0IHtXcml0ZVN0cmVhbXN9IGZyb20gXCIuL3dyaXRlLXN0cmVhbXMuanNcIjtcbmltcG9ydCB7RXhlY3V0b3J9IGZyb20gXCIuL2V4ZWN1dG9yLmpzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQge0FyZ3Z9IGZyb20gXCIuL2FyZ3YuanNcIjtcbmltcG9ydCB7QXNzZXJ0aW9uRXJyb3J9IGZyb20gXCJhc3NlcnRcIjtcblxuZXhwb3J0IGNsYXNzIENvbW1hbmRlciB7XG5cbiAgICBzdGF0aWMgYXN5bmMgcnVuUGlwZWxpbmUgKGFyZ3Y6IEFyZ3YsIHBhcnNlcjogUGFyc2VyLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBjb25zdCBqb2JzID0gcGFyc2VyLmpvYnM7XG4gICAgICAgIGNvbnN0IHN0YWdlcyA9IHBhcnNlci5zdGFnZXM7XG5cbiAgICAgICAgbGV0IHBvdGVudGlhbFN0YXJ0ZXJzID0gWy4uLmpvYnMudmFsdWVzKCldO1xuICAgICAgICBwb3RlbnRpYWxTdGFydGVycyA9IHBvdGVudGlhbFN0YXJ0ZXJzLmZpbHRlcihqID0+IGoud2hlbiAhPT0gXCJuZXZlclwiKTtcbiAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5maWx0ZXIoaiA9PiBqLndoZW4gIT09IFwibWFudWFsXCIgfHwgYXJndi5tYW51YWwuaW5jbHVkZXMoai5uYW1lKSk7XG4gICAgICAgIGF3YWl0IEV4ZWN1dG9yLnJ1bkxvb3AoYXJndiwgam9icywgc3RhZ2VzLCBwb3RlbnRpYWxTdGFydGVycyk7XG4gICAgICAgIGF3YWl0IENvbW1hbmRlci5wcmludFJlcG9ydCh7XG4gICAgICAgICAgICBjd2Q6IGFyZ3YuY3dkLFxuICAgICAgICAgICAgc2hvd1RpbWVzdGFtcHM6IGFyZ3Yuc2hvd1RpbWVzdGFtcHMsXG4gICAgICAgICAgICBzdGF0ZURpcjogYXJndi5zdGF0ZURpcixcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtczogd3JpdGVTdHJlYW1zLFxuICAgICAgICAgICAgam9iczogam9icyxcbiAgICAgICAgICAgIHN0YWdlczogc3RhZ2VzLFxuICAgICAgICAgICAgam9iTmFtZVBhZDogcGFyc2VyLmpvYk5hbWVQYWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBydW5Kb2JzSW5TdGFnZSAoYXJndjogQXJndiwgcGFyc2VyOiBQYXJzZXIsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGNvbnN0IGpvYnMgPSBwYXJzZXIuam9icy5maWx0ZXIoaiA9PiBqLnN0YWdlID09PSBhcmd2LnN0YWdlKTtcbiAgICAgICAgY29uc3Qgc3RhZ2VzID0gcGFyc2VyLnN0YWdlcztcblxuICAgICAgICBsZXQgcG90ZW50aWFsU3RhcnRlcnMgPSBbLi4uam9icy52YWx1ZXMoKV07XG4gICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzID0gcG90ZW50aWFsU3RhcnRlcnMuZmlsdGVyKGogPT4gai53aGVuICE9PSBcIm5ldmVyXCIpO1xuICAgICAgICBwb3RlbnRpYWxTdGFydGVycyA9IHBvdGVudGlhbFN0YXJ0ZXJzLmZpbHRlcihqID0+IGoud2hlbiAhPT0gXCJtYW51YWxcIiB8fCBhcmd2Lm1hbnVhbC5pbmNsdWRlcyhqLm5hbWUpKTtcbiAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5maWx0ZXIoaiA9PiBqLnN0YWdlID09PSBhcmd2LnN0YWdlKTtcbiAgICAgICAgYXdhaXQgRXhlY3V0b3IucnVuTG9vcChhcmd2LCBqb2JzLCBzdGFnZXMsIHBvdGVudGlhbFN0YXJ0ZXJzKTtcbiAgICAgICAgYXdhaXQgQ29tbWFuZGVyLnByaW50UmVwb3J0KHtcbiAgICAgICAgICAgIGN3ZDogYXJndi5jd2QsXG4gICAgICAgICAgICBzaG93VGltZXN0YW1wczogYXJndi5zaG93VGltZXN0YW1wcyxcbiAgICAgICAgICAgIHN0YXRlRGlyOiBhcmd2LnN0YXRlRGlyLFxuICAgICAgICAgICAgd3JpdGVTdHJlYW1zOiB3cml0ZVN0cmVhbXMsXG4gICAgICAgICAgICBqb2JzOiBqb2JzLFxuICAgICAgICAgICAgc3RhZ2VzOiBzdGFnZXMsXG4gICAgICAgICAgICBqb2JOYW1lUGFkOiBwYXJzZXIuam9iTmFtZVBhZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHJ1bkpvYnMgKGFyZ3Y6IEFyZ3YsIHBhcnNlcjogUGFyc2VyLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBjb25zdCBuZWVkcyA9IGFyZ3YubmVlZHMgfHwgYXJndi5vbmx5TmVlZHM7XG4gICAgICAgIGNvbnN0IGpvYkFyZ3MgPSBhcmd2LmpvYjtcbiAgICAgICAgY29uc3Qgam9icyA9IHBhcnNlci5qb2JzO1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuXG4gICAgICAgIGNvbnN0IHBvdGVudGlhbFN0YXJ0ZXJzOiBKb2JbXSA9IFtdO1xuICAgICAgICBjb25zdCBqb2JTZXQgPSBuZWVkcyA/IG5ldyBTZXQoam9icykgOiBuZXcgU2V0PEpvYj4oKTtcbiAgICAgICAgam9iQXJncy5mb3JFYWNoKGpvYkFyZ05hbWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmFzZUpvYnMgPSBqb2JzLmZpbHRlcihqID0+IGouYmFzZU5hbWUgPT0gam9iQXJnTmFtZSB8fCBqLm5hbWUgPT09IGpvYkFyZ05hbWUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBiIG9mIGJhc2VKb2JzKSB7XG4gICAgICAgICAgICAgICAgam9iU2V0LmFkZChiKTtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMucHVzaCguLi5FeGVjdXRvci5nZXRQYXN0VG9XYWl0Rm9yKGpvYnMsIHN0YWdlcywgYiwgYXJndi5tYW51YWwpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMucHVzaChiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBvdGVudGlhbFN0YXJ0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHttZXNzYWdlOiBjaGFsa2B7Ymx1ZUJyaWdodCAke2pvYkFyZ3Muam9pbihcIixcIil9fSBjb3VsZCBub3QgYmUgZm91bmRgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFydGVycyA9IGFyZ3Yub25seU5lZWRzID9cbiAgICAgICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzLmZpbHRlcihwID0+ICFqb2JBcmdzLmluY2x1ZGVzKHAubmFtZSkpIDpcbiAgICAgICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzO1xuXG4gICAgICAgIGF3YWl0IEV4ZWN1dG9yLnJ1bkxvb3AoYXJndiwgQXJyYXkuZnJvbShqb2JTZXQpLCBzdGFnZXMsIHN0YXJ0ZXJzKTtcbiAgICAgICAgYXdhaXQgQ29tbWFuZGVyLnByaW50UmVwb3J0KHtcbiAgICAgICAgICAgIGN3ZDogYXJndi5jd2QsXG4gICAgICAgICAgICBzaG93VGltZXN0YW1wczogYXJndi5zaG93VGltZXN0YW1wcyxcbiAgICAgICAgICAgIHN0YXRlRGlyOiBhcmd2LnN0YXRlRGlyLFxuICAgICAgICAgICAgd3JpdGVTdHJlYW1zOiB3cml0ZVN0cmVhbXMsXG4gICAgICAgICAgICBqb2JzOiBqb2JzLFxuICAgICAgICAgICAgc3RhZ2VzOiBzdGFnZXMsXG4gICAgICAgICAgICBqb2JOYW1lUGFkOiBwYXJzZXIuam9iTmFtZVBhZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHByaW50UmVwb3J0ICh7Y3dkLCBzdGF0ZURpciwgc2hvd1RpbWVzdGFtcHMsIHdyaXRlU3RyZWFtcywgam9icywgc3RhZ2VzLCBqb2JOYW1lUGFkfToge1xuICAgICAgICBjd2Q6IHN0cmluZztcbiAgICAgICAgc2hvd1RpbWVzdGFtcHM6IGJvb2xlYW47XG4gICAgICAgIHN0YXRlRGlyOiBzdHJpbmc7XG4gICAgICAgIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zO1xuICAgICAgICBqb2JzOiBSZWFkb25seUFycmF5PEpvYj47XG4gICAgICAgIHN0YWdlczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgICAgIGpvYk5hbWVQYWQ6IG51bWJlcjtcbiAgICB9KSB7XG5cbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChcIlxcblwiKTtcblxuICAgICAgICBjb25zdCByZW5kZXJEdXJhdGlvbiA9IChkdXJhdGlvbjogc3RyaW5nKSA9PiBzaG93VGltZXN0YW1wcyA/IGAgWyR7ZHVyYXRpb24ucGFkU3RhcnQoNyl9XWAgOiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IHByZVNjcmlwdHM6IHtzdWNjZXNzZnVsOiBKb2JbXTsgZmFpbGVkOiBKb2JbXTsgd2FybmVkOiBKb2JbXX0gPSB7XG4gICAgICAgICAgICBzdWNjZXNzZnVsOiBbXSxcbiAgICAgICAgICAgIGZhaWxlZDogW10sXG4gICAgICAgICAgICB3YXJuZWQ6IFtdLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBhZnRlclNjcmlwdHM6IHt3YXJuZWQ6IEpvYltdfSA9IHtcbiAgICAgICAgICAgIHdhcm5lZDogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKGpvYi5zdGFydGVkICYmIGpvYi5hZnRlclNjcmlwdHNFeGl0Q29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGFmdGVyU2NyaXB0cy53YXJuZWQucHVzaChqb2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKCFqb2Iuc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoam9iLmpvYlN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwucHVzaChqb2IpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChqb2Iuam9iU3RhdHVzID09PSBcIndhcm5pbmdcIikge1xuICAgICAgICAgICAgICAgIHByZVNjcmlwdHMud2FybmVkLnB1c2goam9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJlU2NyaXB0cy5mYWlsZWQucHVzaChqb2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZVNjcmlwdHMuc3VjY2Vzc2Z1bC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHByZVNjcmlwdHMuc3VjY2Vzc2Z1bC5zb3J0KChhLCBiKSA9PiBzdGFnZXMuaW5kZXhPZihhLnN0YWdlKSAtIHN0YWdlcy5pbmRleE9mKGIuc3RhZ2UpKTtcbiAgICAgICAgICAgIHByZVNjcmlwdHMuc3VjY2Vzc2Z1bC5mb3JFYWNoKCh7YXJndiwgY292ZXJhZ2VQZXJjZW50LCBuYW1lLCBwcmV0dHlEdXJhdGlvbn0pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoYXJndi5jaGlsZFBpcGVsaW5lRGVwdGggPiAwKSBwcmVmaXggPSBgWyR7YXJndi52YXJpYWJsZS5HQ0xfVFJJR0dFUkVSfV0gLT4gYDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVQYWQgPSBuYW1lLnBhZEVuZChqb2JOYW1lUGFkKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ0dyZWVuQnJpZ2h0ICBQQVNTIH0ke3JlbmRlckR1cmF0aW9uKHByZXR0eUR1cmF0aW9uKX0ge2JsdWVCcmlnaHQgJHtwcmVmaXh9JHtuYW1lUGFkfX1gKTtcbiAgICAgICAgICAgICAgICBpZiAoY292ZXJhZ2VQZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgICR7Y292ZXJhZ2VQZXJjZW50fSUge2dyZXkgY292ZXJhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoXCJcXG5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLndhcm5lZC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHByZVNjcmlwdHMud2FybmVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7bmFtZSwgcHJldHR5RHVyYXRpb259IG9mIHByZVNjcmlwdHMud2FybmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IG5hbWUucGFkRW5kKGpvYk5hbWVQYWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNhZmVOYW1lID0gVXRpbHMuc2FmZURvY2tlclN0cmluZyhuYW1lKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiB9JHtyZW5kZXJEdXJhdGlvbihwcmV0dHlEdXJhdGlvbil9IHtibHVlQnJpZ2h0ICR7bmFtZVBhZH19ICBwcmVfc2NyaXB0XFxuYCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0TG9nID0gYXdhaXQgZnMucmVhZEZpbGUoYCR7Y3dkfS8ke3N0YXRlRGlyfS9vdXRwdXQvJHtzYWZlTmFtZX0ubG9nYCwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBvdXRwdXRMb2cuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoaiA9PiAhai5pbmNsdWRlcyhcIlszMm0kIFwiKSkuZmlsdGVyKGogPT4gaiAhPT0gXCJcIikuc2xpY2UoLTMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgICB7eWVsbG93ID59ICR7bGluZX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWZ0ZXJTY3JpcHRzLndhcm5lZC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGFmdGVyU2NyaXB0cy53YXJuZWQuc29ydCgoYSwgYikgPT4gc3RhZ2VzLmluZGV4T2YoYS5zdGFnZSkgLSBzdGFnZXMuaW5kZXhPZihiLnN0YWdlKSk7XG4gICAgICAgICAgICBhZnRlclNjcmlwdHMud2FybmVkLmZvckVhY2goKHtuYW1lLCBwcmV0dHlEdXJhdGlvbn0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lUGFkID0gbmFtZS5wYWRFbmQoam9iTmFtZVBhZCk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7YmxhY2suYmdZZWxsb3dCcmlnaHQgIFdBUk4gfSR7cmVuZGVyRHVyYXRpb24ocHJldHR5RHVyYXRpb24pfSB7Ymx1ZUJyaWdodCAke25hbWVQYWR9fSAgYWZ0ZXJfc2NyaXB0XFxuYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLmZhaWxlZC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHByZVNjcmlwdHMuZmFpbGVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7bmFtZSwgcHJldHR5RHVyYXRpb259IG9mIHByZVNjcmlwdHMuZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IG5hbWUucGFkRW5kKGpvYk5hbWVQYWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNhZmVOYW1lID0gVXRpbHMuc2FmZURvY2tlclN0cmluZyhuYW1lKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ1JlZCAgRkFJTCB9JHtyZW5kZXJEdXJhdGlvbihwcmV0dHlEdXJhdGlvbil9IHtibHVlQnJpZ2h0ICR7bmFtZVBhZH19XFxuYCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0TG9nID0gYXdhaXQgZnMucmVhZEZpbGUoYCR7Y3dkfS8ke3N0YXRlRGlyfS9vdXRwdXQvJHtzYWZlTmFtZX0ubG9nYCwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBvdXRwdXRMb2cuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoaiA9PiAhai5pbmNsdWRlcyhcIlszMm0kIFwiKSkuZmlsdGVyKGogPT4gaiAhPT0gXCJcIikuc2xpY2UoLTMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgICB7cmVkID59ICR7bGluZX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBqb2IuZW52aXJvbm1lbnQ7XG4gICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gZS5uYW1lO1xuICAgICAgICAgICAgY29uc3QgdXJsID0gZS51cmw7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fSBlbnZpcm9ubWVudDogXFx7IG5hbWU6IHtib2xkICR7bmFtZX19YCk7XG4gICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCwgdXJsOiB7Ym9sZCAke3VybH19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KFwiIH1cXG5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcnVuTGlzdCAocGFyc2VyOiBQYXJzZXIsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBsaXN0QWxsOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHN0YWdlcyA9IHBhcnNlci5zdGFnZXM7XG4gICAgICAgIGxldCBqb2JzID0gWy4uLnBhcnNlci5qb2JzLnZhbHVlcygpXTtcbiAgICAgICAgam9icy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhZ2VzLmluZGV4T2YoYS5zdGFnZSkgLSBzdGFnZXMuaW5kZXhPZihiLnN0YWdlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHdoZW5QYWRFbmQgPSA0O1xuICAgICAgICBqb2JzLmZvckVhY2goaiA9PiB3aGVuUGFkRW5kID0gTWF0aC5tYXgoai53aGVuLmxlbmd0aCwgd2hlblBhZEVuZCkpO1xuXG4gICAgICAgIGxldCBzdGFnZVBhZEVuZCA9IDU7XG4gICAgICAgIHN0YWdlcy5mb3JFYWNoKHMgPT4gc3RhZ2VQYWRFbmQgPSBNYXRoLm1heChzLmxlbmd0aCwgc3RhZ2VQYWRFbmQpKTtcblxuICAgICAgICBsZXQgZGVzY3JpcHRpb25QYWRFbmQgPSAxMTtcbiAgICAgICAgam9icy5mb3JFYWNoKGogPT4gZGVzY3JpcHRpb25QYWRFbmQgPSBNYXRoLm1heChqLmRlc2NyaXB0aW9uLmxlbmd0aCwgZGVzY3JpcHRpb25QYWRFbmQpKTtcblxuICAgICAgICBjb25zdCBqb2JOYW1lUGFkID0gcGFyc2VyLmpvYk5hbWVQYWQ7XG5cbiAgICAgICAgaWYgKCFsaXN0QWxsKSB7XG4gICAgICAgICAgICBqb2JzID0gam9icy5maWx0ZXIoaiA9PiBqLndoZW4gIT09IFwibmV2ZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtncmV5ICR7XCJuYW1lXCIucGFkRW5kKGpvYk5hbWVQYWQpfSAgJHtcImRlc2NyaXB0aW9uXCIucGFkRW5kKGRlc2NyaXB0aW9uUGFkRW5kKX19ICBgKTtcbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7Z3JleSAke1wic3RhZ2VcIi5wYWRFbmQoc3RhZ2VQYWRFbmQpfSAgJHtcIndoZW5cIi5wYWRFbmQod2hlblBhZEVuZCl9fSAgYCk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2dyZXkgYWxsb3dfZmFpbHVyZSAgbmVlZHN9XFxuYCk7XG5cbiAgICAgICAgY29uc3QgcmVuZGVyTGluZSA9IChqb2I6IEpvYikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmVlZHMgPSBqb2IubmVlZHM/LmZpbHRlcihuID0+ICFuLnByb2plY3QgJiYgIW4ucGlwZWxpbmUpLm1hcChuID0+IG4uam9iKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93RmFpbHVyZSA9IGpvYi5hbGxvd0ZhaWx1cmUgPyBcInRydWUgXCIgOiBcImZhbHNlIFwiO1xuICAgICAgICAgICAgbGV0IGpvYkxpbmUgPSBjaGFsa2B7Ymx1ZUJyaWdodCAke2pvYi5uYW1lLnBhZEVuZChqb2JOYW1lUGFkKX19ICAke2pvYi5kZXNjcmlwdGlvbi5wYWRFbmQoZGVzY3JpcHRpb25QYWRFbmQpfSAgYDtcbiAgICAgICAgICAgIGpvYkxpbmUgKz0gY2hhbGtge3llbGxvdyAke2pvYi5zdGFnZS5wYWRFbmQoc3RhZ2VQYWRFbmQpfX0gICR7am9iLndoZW4ucGFkRW5kKHdoZW5QYWRFbmQpfSAgJHthbGxvd0ZhaWx1cmUucGFkRW5kKDExKX1gO1xuICAgICAgICAgICAgaWYgKG5lZWRzKSB7XG4gICAgICAgICAgICAgICAgam9iTGluZSArPSBjaGFsa2AgICAgW3tibHVlQnJpZ2h0ICR7bmVlZHN9fV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChgJHtqb2JMaW5lfVxcbmApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGpvYnMuZm9yRWFjaCgoam9iKSA9PiByZW5kZXJMaW5lKGpvYikpO1xuICAgIH1cblxuICAgIHN0YXRpYyBydW5Kc29uIChwYXJzZXI6IFBhcnNlciwgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgY29uc3Qgam9icyA9IFsuLi5wYXJzZXIuam9icy52YWx1ZXMoKV07XG4gICAgICAgIGNvbnN0IGpzb246IGFueVtdID0gW107XG5cbiAgICAgICAgam9icy5mb3JFYWNoKChqb2IpID0+IHtcbiAgICAgICAgICAgIGpzb24ucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogam9iLm5hbWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGpvYi5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBzdGFnZTogam9iLnN0YWdlLFxuICAgICAgICAgICAgICAgIHdoZW46IGpvYi53aGVuLFxuICAgICAgICAgICAgICAgIGFsbG93X2ZhaWx1cmU6IGpvYi5hbGxvd0ZhaWx1cmUsXG4gICAgICAgICAgICAgICAgbmVlZHM6IGpvYi5uZWVkcz8uZmlsdGVyKG4gPT4gIW4ucHJvamVjdCAmJiAhbi5waXBlbGluZSksXG4gICAgICAgICAgICAgICAgLi4uam9iLnJ1bGVzID8ge3J1bGVzOiBqb2IucnVsZXN9IDoge30sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChgJHtKU09OLnN0cmluZ2lmeShqc29uLCBudWxsLCAyKX1cXG5gKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcnVuQ3N2IChwYXJzZXI6IFBhcnNlciwgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGFsbDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuICAgICAgICBsZXQgam9icyA9IFsuLi5wYXJzZXIuam9icy52YWx1ZXMoKV07XG4gICAgICAgIGpvYnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghYWxsKSB7XG4gICAgICAgICAgICBqb2JzID0gam9icy5maWx0ZXIoaiA9PiBqLndoZW4gIT09IFwibmV2ZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KFwibmFtZTtkZXNjcmlwdGlvbjtzdGFnZTt3aGVuO2FsbG93RmFpbHVyZTtuZWVkc1xcblwiKTtcbiAgICAgICAgam9icy5mb3JFYWNoKChqb2IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5lZWRzID0gam9iLm5lZWRzPy5maWx0ZXIobiA9PiAhbi5wcm9qZWN0ICYmICFuLnBpcGVsaW5lKS5tYXAobiA9PiBuLmpvYikuam9pbihcIixcIikgPz8gW107XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGAke2pvYi5uYW1lfTtcIiR7am9iLmRlc2NyaXB0aW9ufVwiOyR7am9iLnN0YWdlfTske2pvYi53aGVufTske2pvYi5hbGxvd0ZhaWx1cmUgPyBcInRydWVcIiA6IFwiZmFsc2VcIn07WyR7bmVlZHN9XVxcbmApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVEZXBlbmRlbmN5Q2hhaW4gKHBhcnNlcjogUGFyc2VyKSB7XG4gICAgICAgIGNvbnN0IGFsbEpvYnMgPSBwYXJzZXIuam9icztcbiAgICAgICAgLy8gVGhpcyBpcyBvbmx5IHRoZSBqb2JzIHRoYXQgd2lsbCBhY3R1YWxseSBydW5cbiAgICAgICAgY29uc3QgYWN0aXZlSm9icyA9IGFsbEpvYnMuZmlsdGVyKGogPT4gai53aGVuICE9PSBcIm5ldmVyXCIpO1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gYXNzZXJ0aW9uIGVycnJvciBpZiB0aGUgZGVwZW5kZW5jeSBjaGFpbiBpcyBicm9rZW4gZHVlIHRvIG5lZWRzIGtleXdvcmQgb24gc3BlY2lmaWMgZXZlbnRzIHdpdGhvdXQgaGF2aW5nIHRvIHJ1biB0aGUgZnVsbCBwaXBlbGluZVxuICAgICAgICBFeGVjdXRvci5nZXRTdGFydENhbmRpZGF0ZXMoYWxsSm9icywgc3RhZ2VzLCBhY3RpdmVKb2JzLCBbXSk7XG5cbiAgICAgICAgY29uc3QgYWN0aXZlSm9iTmFtZXMgPSBuZXcgU2V0KGFjdGl2ZUpvYnMubWFwKGpvYiA9PiBqb2IubmFtZSkpO1xuICAgICAgICAvLyBUaGlzIHdpbGxsIHRocm93IGFuIGFzc2VydGlvbiBlcnJvciBpZiB0aGUgZGVwZW5kZW5jeSBjaGFpbiBpcyBicm9rZW4gZHVlIHRvIGRlcGVuZGVuY2llcyBrZXl3b3JkIChhIGpvYiBkZXBlbmRpbmcgb24gYXJ0aWZhY3RzIGZyb20gYSBqb2IgdGhhdCB3aWxsIG5ldmVyIHJ1bikgd2l0aG91dCBoYXZpbmcgdG8gcnVuIHRoZSBmdWxsIHBpcGVsaW5lXG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIGFjdGl2ZUpvYnMpIHtcbiAgICAgICAgICAgIGlmIChqb2IuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIGpvYi5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3RpdmVKb2JOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7bWVzc2FnZTogY2hhbGtge2JsdWVCcmlnaHQgJHtkZXBlbmRlbmN5fX0gaXMgd2hlbjpuZXZlciwgYnV0IGl0cyBkZXBlbmRlZCBvbiBieSB7Ymx1ZUJyaWdodCAke2pvYi5uYW1lfX1gfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
package/src/data-expander.js
DELETED
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk-template";
|
|
2
|
-
import deepExtend from "deep-extend";
|
|
3
|
-
import assert, { AssertionError } from "assert";
|
|
4
|
-
import { Job } from "./job.js";
|
|
5
|
-
import { traverse } from "object-traversal";
|
|
6
|
-
import { Utils } from "./utils.js";
|
|
7
|
-
const extendsMaxDepth = 11;
|
|
8
|
-
const extendsRecurse = (gitlabData, jobName, jobData, parents, depth) => {
|
|
9
|
-
assert(depth < extendsMaxDepth, chalk `{blueBright ${jobName}}: circular dependency detected in \`extends\``);
|
|
10
|
-
depth++;
|
|
11
|
-
jobData.extends = typeof jobData.extends === "string" ? [jobData.extends] : jobData.extends;
|
|
12
|
-
jobData.extends = jobData.extends ?? [];
|
|
13
|
-
for (const parentName of jobData.extends) {
|
|
14
|
-
const parentData = gitlabData[parentName];
|
|
15
|
-
assert(parentData != null, chalk `{blueBright ${parentName}} is unspecified, used by {blueBright ${jobName}} extends`);
|
|
16
|
-
extendsRecurse(gitlabData, parentName, parentData, parents, depth);
|
|
17
|
-
parents.push(parentData);
|
|
18
|
-
}
|
|
19
|
-
return parents;
|
|
20
|
-
};
|
|
21
|
-
export function jobExtends(gitlabData) {
|
|
22
|
-
for (const [jobName, jobData] of Object.entries(gitlabData)) {
|
|
23
|
-
if (Job.illegalJobNames.has(jobName))
|
|
24
|
-
continue;
|
|
25
|
-
if (!Utils.isObject(jobData))
|
|
26
|
-
continue;
|
|
27
|
-
const parentDatas = extendsRecurse(gitlabData, jobName, jobData, [], 0);
|
|
28
|
-
gitlabData[jobName] = deepExtend({}, ...parentDatas, jobData);
|
|
29
|
-
}
|
|
30
|
-
for (const [jobName, jobData] of Object.entries(gitlabData)) {
|
|
31
|
-
if (Job.illegalJobNames.has(jobName))
|
|
32
|
-
continue;
|
|
33
|
-
if (!Utils.isObject(jobData))
|
|
34
|
-
continue;
|
|
35
|
-
delete jobData.extends;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
export function reference(gitlabData, recurseData) {
|
|
39
|
-
for (const [key, value] of Object.entries(recurseData || {})) {
|
|
40
|
-
if (value?.referenceData) {
|
|
41
|
-
if (Object.keys(value).length > 1) {
|
|
42
|
-
recurseData[key] = { ...getSubDataByReference(gitlabData, value.referenceData), ...recurseData[key] };
|
|
43
|
-
delete recurseData[key].referenceData;
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
recurseData[key] = getSubDataByReference(gitlabData, value.referenceData);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
else if (typeof value === "object") {
|
|
50
|
-
reference(gitlabData, value);
|
|
51
|
-
}
|
|
52
|
-
if (hasCircularChain(recurseData)) {
|
|
53
|
-
throw new AssertionError({ message: `!reference circular chain detected [${value.referenceData}]` });
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
const getSubDataByReference = (gitlabData, referenceData) => {
|
|
58
|
-
let gitlabSubData = gitlabData;
|
|
59
|
-
referenceData.forEach((referencePointer) => {
|
|
60
|
-
assert(gitlabSubData[referencePointer] != null, `!reference [${referenceData.join(", ")}] is undefined`);
|
|
61
|
-
gitlabSubData = gitlabSubData[referencePointer];
|
|
62
|
-
});
|
|
63
|
-
return gitlabSubData;
|
|
64
|
-
};
|
|
65
|
-
function hasCircularChain(data) {
|
|
66
|
-
try {
|
|
67
|
-
JSON.stringify(data);
|
|
68
|
-
}
|
|
69
|
-
catch (e) {
|
|
70
|
-
if (e instanceof TypeError && e.message.startsWith("Converting circular structure to JSON")) {
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
Transform the globally defined ["image", "services", "cache", "before_script", "after_script"] into the default.x syntax
|
|
78
|
-
https://docs.gitlab.com/ee/ci/yaml/index.html#globally-defined-image-services-cache-before_script-after_script
|
|
79
|
-
*/
|
|
80
|
-
export function transformDeprecatedGlobalDefaultSyntax(gitlabData) {
|
|
81
|
-
const GITLAB_DEPRECATED_GLOBALLY_DEFINED_KEYWORDS = ["image", "services", "cache", "before_script", "after_script"];
|
|
82
|
-
gitlabData.default = gitlabData.default ?? {};
|
|
83
|
-
for (const g of GITLAB_DEPRECATED_GLOBALLY_DEFINED_KEYWORDS) {
|
|
84
|
-
if (gitlabData[g] !== undefined) {
|
|
85
|
-
gitlabData.default[g] = gitlabData[g];
|
|
86
|
-
delete gitlabData[g]; // Since this is deprecated, deleting it to prevent us from using it internally
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
export function normalize(gitlabData) {
|
|
91
|
-
normalizeGlobalVariables(gitlabData);
|
|
92
|
-
for (const [jobName, jobData] of Object.entries(gitlabData)) {
|
|
93
|
-
if (Job.illegalJobNames.has(jobName) || jobName.startsWith("."))
|
|
94
|
-
continue;
|
|
95
|
-
needsEach(jobName, gitlabData);
|
|
96
|
-
cacheEach(jobName, gitlabData);
|
|
97
|
-
servicesEach(jobName, gitlabData);
|
|
98
|
-
imageEach(jobName, gitlabData);
|
|
99
|
-
jobData.after_script = (typeof jobData.after_script === "string" && jobData.after_script !== "") ? [jobData.after_script] : jobData.after_script;
|
|
100
|
-
jobData.before_script = (typeof jobData.before_script === "string" && jobData.before_script !== "") ? [jobData.before_script] : jobData.before_script;
|
|
101
|
-
jobData.script = (typeof jobData.script === "string" && jobData.script !== "") ? [jobData.script] : jobData.script;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
export function needsComplex(data) {
|
|
105
|
-
const needs = {
|
|
106
|
-
job: data.job ?? data,
|
|
107
|
-
artifacts: data.artifacts ?? true,
|
|
108
|
-
...(data.pipeline ? { pipeline: data.pipeline } : {}),
|
|
109
|
-
...(data.project ? { project: data.project } : {}),
|
|
110
|
-
...(data.ref ? { ref: data.ref } : {}),
|
|
111
|
-
...(data.optional ? { optional: data.optional } : {}),
|
|
112
|
-
};
|
|
113
|
-
// In needs:project/needs:pipeline, `optional` is not an allowed property
|
|
114
|
-
if (!data.project && !data.pipeline && data.optional === undefined) {
|
|
115
|
-
needs.optional = false;
|
|
116
|
-
}
|
|
117
|
-
return needs;
|
|
118
|
-
}
|
|
119
|
-
export function needsEach(jobName, gitlabData) {
|
|
120
|
-
const jobData = gitlabData[jobName];
|
|
121
|
-
if (!jobData.needs)
|
|
122
|
-
return;
|
|
123
|
-
for (const [i, n] of Object.entries(jobData.needs)) {
|
|
124
|
-
jobData.needs[i] = needsComplex(n);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
export function cacheComplex(data) {
|
|
128
|
-
return {
|
|
129
|
-
key: data.key,
|
|
130
|
-
paths: data.paths,
|
|
131
|
-
policy: data.policy ?? "pull-push",
|
|
132
|
-
when: data.when ?? "on_success",
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
export function cacheEach(jobName, gitlabData) {
|
|
136
|
-
const jobData = gitlabData[jobName];
|
|
137
|
-
const cache = jobData.cache;
|
|
138
|
-
if (!cache)
|
|
139
|
-
return;
|
|
140
|
-
jobData.cache = Array.isArray(cache) ? cache : [cache];
|
|
141
|
-
for (const [i, c] of Object.entries(jobData.cache)) {
|
|
142
|
-
if (c.key?.files instanceof Array) {
|
|
143
|
-
assert(c.key.files.length === 1 || c.key.files.length === 2, `cache:key:files should be an array of one or two file paths. Got ${c.key.files.length}`);
|
|
144
|
-
}
|
|
145
|
-
jobData.cache[i] = cacheComplex(c);
|
|
146
|
-
}
|
|
147
|
-
// Remove cache elements with empty paths array (gitlab.com works the same way.)
|
|
148
|
-
jobData.cache = jobData.cache.filter((c) => c.paths?.length !== undefined);
|
|
149
|
-
}
|
|
150
|
-
export function servicesComplex(data) {
|
|
151
|
-
return {
|
|
152
|
-
name: typeof data === "string" ? data : data.name,
|
|
153
|
-
entrypoint: data.entrypoint,
|
|
154
|
-
command: data.command,
|
|
155
|
-
alias: data.alias,
|
|
156
|
-
variables: data.variables,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
export function servicesEach(jobName, gitlabData) {
|
|
160
|
-
const jobData = gitlabData[jobName];
|
|
161
|
-
const services = jobData.services;
|
|
162
|
-
if (!services)
|
|
163
|
-
return;
|
|
164
|
-
jobData.services = Array.isArray(services) ? services : [services];
|
|
165
|
-
for (const [i, s] of Object.entries(jobData.services)) {
|
|
166
|
-
jobData.services[i] = servicesComplex(s);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
export function imageComplex(data) {
|
|
170
|
-
if (data == null)
|
|
171
|
-
return data;
|
|
172
|
-
return {
|
|
173
|
-
name: typeof data === "string" ? data : data.name,
|
|
174
|
-
entrypoint: data.entrypoint,
|
|
175
|
-
...(data.docker?.user ? { docker: { user: data.docker?.user } } : {}),
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
export function imageEach(jobName, gitlabData) {
|
|
179
|
-
const jobData = gitlabData[jobName];
|
|
180
|
-
const image = jobData.image;
|
|
181
|
-
if (!image)
|
|
182
|
-
return;
|
|
183
|
-
jobData.image = imageComplex(jobData.image);
|
|
184
|
-
}
|
|
185
|
-
export function inheritDefault(gitlabData) {
|
|
186
|
-
for (const [jobName, jobData] of Object.entries(gitlabData)) {
|
|
187
|
-
if (jobData.inherit?.default === false)
|
|
188
|
-
continue;
|
|
189
|
-
if (Job.illegalJobNames.has(jobName) || jobName.startsWith(".")) {
|
|
190
|
-
// skip hidden jobs as they might just contain shared yaml
|
|
191
|
-
// see https://github.com/firecow/gitlab-ci-local/issues/1277
|
|
192
|
-
continue;
|
|
193
|
-
}
|
|
194
|
-
const keywordsToInheritFrom = (Array.isArray(jobData.inherit?.default)) ?
|
|
195
|
-
jobData.inherit.default :
|
|
196
|
-
["artifacts", "cache", "services", "image", "before_script", "after_script"];
|
|
197
|
-
for (const keyword of keywordsToInheritFrom) {
|
|
198
|
-
if (gitlabData.default[keyword] !== undefined)
|
|
199
|
-
jobData[keyword] = jobData[keyword] ?? gitlabData.default[keyword];
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
function normalizeGlobalVariables(gitlabData) {
|
|
204
|
-
for (const [key, value] of Object.entries(gitlabData.variables ?? {})) {
|
|
205
|
-
gitlabData.variables[key] = Utils.normalizeVariables(value);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
export function flattenLists(gitlabData) {
|
|
209
|
-
traverse(gitlabData, ({ parent, key, value, meta }) => {
|
|
210
|
-
if (parent != null && key != null && Array.isArray(value)) {
|
|
211
|
-
assert(!value.flat(9).some(Array.isArray), chalk `This Gitlab CI configuration is invalid: {blueBright ${meta.nodePath}} config should be string or a nested array of strings up to 10 level deep`);
|
|
212
|
-
}
|
|
213
|
-
}, { cycleHandling: true });
|
|
214
|
-
traverse(gitlabData, ({ parent, key, value }) => {
|
|
215
|
-
if (parent != null && key != null && Array.isArray(value)) {
|
|
216
|
-
parent[key] = value.flat(9);
|
|
217
|
-
}
|
|
218
|
-
}, { cycleHandling: false });
|
|
219
|
-
}
|
|
220
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1leHBhbmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRhdGEtZXhwYW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sTUFBTSxFQUFFLEVBQUMsY0FBYyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxHQUFHLEVBQU8sTUFBTSxVQUFVLENBQUM7QUFDbkMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFakMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLE1BQU0sY0FBYyxHQUFHLENBQUMsVUFBZSxFQUFFLE9BQWUsRUFBRSxPQUFZLEVBQUUsT0FBYyxFQUFFLEtBQWEsRUFBRSxFQUFFO0lBQ3JHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsZUFBZSxFQUFFLEtBQUssQ0FBQSxlQUFlLE9BQU8sZ0RBQWdELENBQUMsQ0FBQztJQUM3RyxLQUFLLEVBQUUsQ0FBQztJQUVSLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDNUYsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUV4QyxLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUUsS0FBSyxDQUFBLGVBQWUsVUFBVSx5Q0FBeUMs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QUMsRUFBRSxFQUFFO1FBQ2hELElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFBLHdEQUF3RCxJQUFJLENBQUMsUUFBUSw0RUFBNEUsQ0FBQyxDQUFDO1FBQ3ZNLENBQUM7SUFDTCxDQUFDLEVBQUUsRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUUxQixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBQyxFQUFFLEVBQUU7UUFDMUMsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDTCxDQUFDLEVBQUUsRUFBQyxhQUFhLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsay10ZW1wbGF0ZVwiO1xuaW1wb3J0IGRlZXBFeHRlbmQgZnJvbSBcImRlZXAtZXh0ZW5kXCI7XG5pbXBvcnQgYXNzZXJ0LCB7QXNzZXJ0aW9uRXJyb3J9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7Sm9iLCBOZWVkfSBmcm9tIFwiLi9qb2IuanNcIjtcbmltcG9ydCB7dHJhdmVyc2V9IGZyb20gXCJvYmplY3QtdHJhdmVyc2FsXCI7XG5pbXBvcnQge1V0aWxzfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuXG5jb25zdCBleHRlbmRzTWF4RGVwdGggPSAxMTtcbmNvbnN0IGV4dGVuZHNSZWN1cnNlID0gKGdpdGxhYkRhdGE6IGFueSwgam9iTmFtZTogc3RyaW5nLCBqb2JEYXRhOiBhbnksIHBhcmVudHM6IGFueVtdLCBkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgYXNzZXJ0KGRlcHRoIDwgZXh0ZW5kc01heERlcHRoLCBjaGFsa2B7Ymx1ZUJyaWdodCAke2pvYk5hbWV9fTogY2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCBpbiBcXGBleHRlbmRzXFxgYCk7XG4gICAgZGVwdGgrKztcblxuICAgIGpvYkRhdGEuZXh0ZW5kcyA9IHR5cGVvZiBqb2JEYXRhLmV4dGVuZHMgPT09IFwic3RyaW5nXCIgPyBbam9iRGF0YS5leHRlbmRzXSA6IGpvYkRhdGEuZXh0ZW5kcztcbiAgICBqb2JEYXRhLmV4dGVuZHMgPSBqb2JEYXRhLmV4dGVuZHMgPz8gW107XG5cbiAgICBmb3IgKGNvbnN0IHBhcmVudE5hbWUgb2Ygam9iRGF0YS5leHRlbmRzKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudERhdGEgPSBnaXRsYWJEYXRhW3BhcmVudE5hbWVdO1xuICAgICAgICBhc3NlcnQocGFyZW50RGF0YSAhPSBudWxsLCBjaGFsa2B7Ymx1ZUJyaWdodCAke3BhcmVudE5hbWV9fSBpcyB1bnNwZWNpZmllZCwgdXNlZCBieSB7Ymx1ZUJyaWdodCAke2pvYk5hbWV9fSBleHRlbmRzYCk7XG4gICAgICAgIGV4dGVuZHNSZWN1cnNlKGdpdGxhYkRhdGEsIHBhcmVudE5hbWUsIHBhcmVudERhdGEsIHBhcmVudHMsIGRlcHRoKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKHBhcmVudERhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50cztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2JFeHRlbmRzIChnaXRsYWJEYXRhOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IFtqb2JOYW1lLCBqb2JEYXRhXSBvZiBPYmplY3QuZW50cmllczxhbnk+KGdpdGxhYkRhdGEpKSB7XG4gICAgICAgIGlmIChKb2IuaWxsZWdhbEpvYk5hbWVzLmhhcyhqb2JOYW1lKSkgY29udGludWU7XG4gICAgICAgIGlmICghVXRpbHMuaXNPYmplY3Qoam9iRGF0YSkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBwYXJlbnREYXRhcyA9IGV4dGVuZHNSZWN1cnNlKGdpdGxhYkRhdGEsIGpvYk5hbWUsIGpvYkRhdGEsIFtdLCAwKTtcbiAgICAgICAgZ2l0bGFiRGF0YVtqb2JOYW1lXSA9IGRlZXBFeHRlbmQoe30sIC4uLnBhcmVudERhdGFzLCBqb2JEYXRhKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtqb2JOYW1lLCBqb2JEYXRhXSBvZiBPYmplY3QuZW50cmllczxhbnk+KGdpdGxhYkRhdGEpKSB7XG4gICAgICAgIGlmIChKb2IuaWxsZWdhbEpvYk5hbWVzLmhhcyhqb2JOYW1lKSkgY29udGludWU7XG4gICAgICAgIGlmICghVXRpbHMuaXNPYmplY3Qoam9iRGF0YSkpIGNvbnRpbnVlO1xuICAgICAgICBkZWxldGUgam9iRGF0YS5leHRlbmRzO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZmVyZW5jZSAoZ2l0bGFiRGF0YTogYW55LCByZWN1cnNlRGF0YTogYW55KSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXM8YW55PihyZWN1cnNlRGF0YSB8fCB7fSkpIHtcbiAgICAgICAgaWYgKHZhbHVlPy5yZWZlcmVuY2VEYXRhKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICByZWN1cnNlRGF0YVtrZXldID0gey4uLmdldFN1YkRhdGFCeVJlZmVyZW5jZShnaXRsYWJEYXRhLCB2YWx1ZS5yZWZlcmVuY2VEYXRhKSwgLi4ucmVjdXJzZURhdGFba2V5XX07XG4gICAgICAgICAgICAgICAgZGVsZXRlIHJlY3Vyc2VEYXRhW2tleV0ucmVmZXJlbmNlRGF0YTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVjdXJzZURhdGFba2V5XSA9IGdldFN1YkRhdGFCeVJlZmVyZW5jZShnaXRsYWJEYXRhLCB2YWx1ZS5yZWZlcmVuY2VEYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZShnaXRsYWJEYXRhLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzQ2lyY3VsYXJDaGFpbihyZWN1cnNlRGF0YSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7bWVzc2FnZTogYCFyZWZlcmVuY2UgY2lyY3VsYXIgY2hhaW4gZGV0ZWN0ZWQgWyR7dmFsdWUucmVmZXJlbmNlRGF0YX1dYH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBnZXRTdWJEYXRhQnlSZWZlcmVuY2UgPSAoZ2l0bGFiRGF0YTogYW55LCByZWZlcmVuY2VEYXRhOiBzdHJpbmdbXSkgPT4ge1xuICAgIGxldCBnaXRsYWJTdWJEYXRhID0gZ2l0bGFiRGF0YTtcbiAgICByZWZlcmVuY2VEYXRhLmZvckVhY2goKHJlZmVyZW5jZVBvaW50ZXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KGdpdGxhYlN1YkRhdGFbcmVmZXJlbmNlUG9pbnRlcl0gIT0gbnVsbCwgYCFyZWZlcmVuY2UgWyR7cmVmZXJlbmNlRGF0YS5qb2luKFwiLCBcIil9XSBpcyB1bmRlZmluZWRgKTtcbiAgICAgICAgZ2l0bGFiU3ViRGF0YSA9IGdpdGxhYlN1YkRhdGFbcmVmZXJlbmNlUG9pbnRlcl07XG4gICAgfSk7XG4gICAgcmV0dXJuIGdpdGxhYlN1YkRhdGE7XG59O1xuXG5mdW5jdGlvbiBoYXNDaXJjdWxhckNoYWluIChkYXRhOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgICBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgVHlwZUVycm9yICYmIGUubWVzc2FnZS5zdGFydHNXaXRoKFwiQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTlwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAgVHJhbnNmb3JtIHRoZSBnbG9iYWxseSBkZWZpbmVkIFtcImltYWdlXCIsIFwic2VydmljZXNcIiwgXCJjYWNoZVwiLCBcImJlZm9yZV9zY3JpcHRcIiwgXCJhZnRlcl9zY3JpcHRcIl0gaW50byB0aGUgZGVmYXVsdC54IHN5bnRheFxuICBodHRwczovL2RvY3MuZ2l0bGFiLmNvbS9lZS9jaS95YW1sL2luZGV4Lmh0bWwjZ2xvYmFsbHktZGVmaW5lZC1pbWFnZS1zZXJ2aWNlcy1jYWNoZS1iZWZvcmVfc2NyaXB0LWFmdGVyX3NjcmlwdFxuKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1EZXByZWNhdGVkR2xvYmFsRGVmYXVsdFN5bnRheCAoZ2l0bGFiRGF0YTogYW55KSB7XG4gICAgY29uc3QgR0lUTEFCX0RFUFJFQ0FURURfR0xPQkFMTFlfREVGSU5FRF9LRVlXT1JEUyA9IFtcImltYWdlXCIsIFwic2VydmljZXNcIiwgXCJjYWNoZVwiLCBcImJlZm9yZV9zY3JpcHRcIiwgXCJhZnRlcl9zY3JpcHRcIl07XG5cbiAgICBnaXRsYWJEYXRhLmRlZmF1bHQgPSBnaXRsYWJEYXRhLmRlZmF1bHQgPz8ge307XG4gICAgZm9yIChjb25zdCBnIG9mIEdJVExBQl9ERVBSRUNBVEVEX0dMT0JBTExZX0RFRklORURfS0VZV09SRFMpIHtcbiAgICAgICAgaWYgKGdpdGxhYkRhdGFbZ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZ2l0bGFiRGF0YS5kZWZhdWx0W2ddID0gZ2l0bGFiRGF0YVtnXTtcbiAgICAgICAgICAgIGRlbGV0ZSBnaXRsYWJEYXRhW2ddOyAvLyBTaW5jZSB0aGlzIGlzIGRlcHJlY2F0ZWQsIGRlbGV0aW5nIGl0IHRvIHByZXZlbnQgdXMgZnJvbSB1c2luZyBpdCBpbnRlcm5hbGx5XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUgKGdpdGxhYkRhdGE6IGFueSkge1xuICAgIG5vcm1hbGl6ZUdsb2JhbFZhcmlhYmxlcyhnaXRsYWJEYXRhKTtcblxuICAgIGZvciAoY29uc3QgW2pvYk5hbWUsIGpvYkRhdGFdIG9mIE9iamVjdC5lbnRyaWVzPGFueT4oZ2l0bGFiRGF0YSkpIHtcbiAgICAgICAgaWYgKEpvYi5pbGxlZ2FsSm9iTmFtZXMuaGFzKGpvYk5hbWUpIHx8IGpvYk5hbWUuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuICAgICAgICBuZWVkc0VhY2goam9iTmFtZSwgZ2l0bGFiRGF0YSk7XG4gICAgICAgIGNhY2hlRWFjaChqb2JOYW1lLCBnaXRsYWJEYXRhKTtcbiAgICAgICAgc2VydmljZXNFYWNoKGpvYk5hbWUsIGdpdGxhYkRhdGEpO1xuICAgICAgICBpbWFnZUVhY2goam9iTmFtZSwgZ2l0bGFiRGF0YSk7XG5cbiAgICAgICAgam9iRGF0YS5hZnRlcl9zY3JpcHQgPSAodHlwZW9mIGpvYkRhdGEuYWZ0ZXJfc2NyaXB0ID09PSBcInN0cmluZ1wiICYmIGpvYkRhdGEuYWZ0ZXJfc2NyaXB0ICE9PSBcIlwiKSA/IFtqb2JEYXRhLmFmdGVyX3NjcmlwdF0gOiBqb2JEYXRhLmFmdGVyX3NjcmlwdDtcbiAgICAgICAgam9iRGF0YS5iZWZvcmVfc2NyaXB0ID0gKHR5cGVvZiBqb2JEYXRhLmJlZm9yZV9zY3JpcHQgPT09IFwic3RyaW5nXCIgJiYgam9iRGF0YS5iZWZvcmVfc2NyaXB0ICE9PSBcIlwiKSA/IFtqb2JEYXRhLmJlZm9yZV9zY3JpcHRdIDogam9iRGF0YS5iZWZvcmVfc2NyaXB0O1xuICAgICAgICBqb2JEYXRhLnNjcmlwdCA9ICh0eXBlb2Ygam9iRGF0YS5zY3JpcHQgPT09IFwic3RyaW5nXCIgJiYgam9iRGF0YS5zY3JpcHQgIT09IFwiXCIpID8gW2pvYkRhdGEuc2NyaXB0XSA6IGpvYkRhdGEuc2NyaXB0O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZWRzQ29tcGxleCAoZGF0YTogYW55KSB7XG4gICAgY29uc3QgbmVlZHM6IE5lZWQgPSB7XG4gICAgICAgIGpvYjogZGF0YS5qb2IgPz8gZGF0YSxcbiAgICAgICAgYXJ0aWZhY3RzOiBkYXRhLmFydGlmYWN0cyA/PyB0cnVlLFxuICAgICAgICAuLi4oZGF0YS5waXBlbGluZSA/IHtwaXBlbGluZTogZGF0YS5waXBlbGluZX0gOiB7fSksXG4gICAgICAgIC4uLihkYXRhLnByb2plY3QgPyB7cHJvamVjdDogZGF0YS5wcm9qZWN0fSA6IHt9KSxcbiAgICAgICAgLi4uKGRhdGEucmVmID8ge3JlZjogZGF0YS5yZWZ9IDoge30pLFxuICAgICAgICAuLi4oZGF0YS5vcHRpb25hbCA/IHtvcHRpb25hbDogZGF0YS5vcHRpb25hbH0gOiB7fSksXG4gICAgfTtcblxuICAgIC8vIEluIG5lZWRzOnByb2plY3QvbmVlZHM6cGlwZWxpbmUsIGBvcHRpb25hbGAgaXMgbm90IGFuIGFsbG93ZWQgcHJvcGVydHlcbiAgICBpZiAoIWRhdGEucHJvamVjdCAmJiAhZGF0YS5waXBlbGluZSAmJiBkYXRhLm9wdGlvbmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmVlZHMub3B0aW9uYWwgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG5lZWRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNFYWNoIChqb2JOYW1lOiBzdHJpbmcsIGdpdGxhYkRhdGE6IGFueSkge1xuICAgIGNvbnN0IGpvYkRhdGEgPSBnaXRsYWJEYXRhW2pvYk5hbWVdO1xuICAgIGlmICgham9iRGF0YS5uZWVkcykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBbaSwgbl0gb2YgT2JqZWN0LmVudHJpZXM8YW55Pihqb2JEYXRhLm5lZWRzKSkge1xuICAgICAgICBqb2JEYXRhLm5lZWRzW2ldID0gbmVlZHNDb21wbGV4KG4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlQ29tcGxleCAoZGF0YTogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBkYXRhLmtleSxcbiAgICAgICAgcGF0aHM6IGRhdGEucGF0aHMsXG4gICAgICAgIHBvbGljeTogZGF0YS5wb2xpY3kgPz8gXCJwdWxsLXB1c2hcIixcbiAgICAgICAgd2hlbjogZGF0YS53aGVuID8/IFwib25fc3VjY2Vzc1wiLFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUVhY2ggKGpvYk5hbWU6IHN0cmluZywgZ2l0bGFiRGF0YTogYW55KSB7XG4gICAgY29uc3Qgam9iRGF0YSA9IGdpdGxhYkRhdGFbam9iTmFtZV07XG4gICAgY29uc3QgY2FjaGUgPSBqb2JEYXRhLmNhY2hlO1xuICAgIGlmICghY2FjaGUpIHJldHVybjtcblxuICAgIGpvYkRhdGEuY2FjaGUgPSBBcnJheS5pc0FycmF5KGNhY2hlKSA/IGNhY2hlIDogW2NhY2hlXTtcbiAgICBmb3IgKGNvbnN0IFtpLCBjXSBvZiBPYmplY3QuZW50cmllczxhbnk+KGpvYkRhdGEuY2FjaGUpKSB7XG4gICAgICAgIGlmIChjLmtleT8uZmlsZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgYXNzZXJ0KGMua2V5LmZpbGVzLmxlbmd0aCA9PT0gMSB8fCBjLmtleS5maWxlcy5sZW5ndGggPT09IDIsIGBjYWNoZTprZXk6ZmlsZXMgc2hvdWxkIGJlIGFuIGFycmF5IG9mIG9uZSBvciB0d28gZmlsZSBwYXRocy4gR290ICR7Yy5rZXkuZmlsZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGpvYkRhdGEuY2FjaGVbaV0gPSBjYWNoZUNvbXBsZXgoYyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGNhY2hlIGVsZW1lbnRzIHdpdGggZW1wdHkgcGF0aHMgYXJyYXkgKGdpdGxhYi5jb20gd29ya3MgdGhlIHNhbWUgd2F5LilcbiAgICBqb2JEYXRhLmNhY2hlID0gam9iRGF0YS5jYWNoZS5maWx0ZXIoKGM6IGFueSkgPT4gYy5wYXRocz8ubGVuZ3RoICE9PSB1bmRlZmluZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZXNDb21wbGV4IChkYXRhOiBhbnkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IGRhdGEgOiBkYXRhLm5hbWUsXG4gICAgICAgIGVudHJ5cG9pbnQ6IGRhdGEuZW50cnlwb2ludCxcbiAgICAgICAgY29tbWFuZDogZGF0YS5jb21tYW5kLFxuICAgICAgICBhbGlhczogZGF0YS5hbGlhcyxcbiAgICAgICAgdmFyaWFibGVzOiBkYXRhLnZhcmlhYmxlcyxcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZXNFYWNoIChqb2JOYW1lOiBzdHJpbmcsIGdpdGxhYkRhdGE6IGFueSkge1xuICAgIGNvbnN0IGpvYkRhdGEgPSBnaXRsYWJEYXRhW2pvYk5hbWVdO1xuICAgIGNvbnN0IHNlcnZpY2VzID0gam9iRGF0YS5zZXJ2aWNlcztcbiAgICBpZiAoIXNlcnZpY2VzKSByZXR1cm47XG5cbiAgICBqb2JEYXRhLnNlcnZpY2VzID0gQXJyYXkuaXNBcnJheShzZXJ2aWNlcykgPyBzZXJ2aWNlcyA6IFtzZXJ2aWNlc107XG5cbiAgICBmb3IgKGNvbnN0IFtpLCBzXSBvZiBPYmplY3QuZW50cmllczxhbnk+KGpvYkRhdGEuc2VydmljZXMpKSB7XG4gICAgICAgIGpvYkRhdGEuc2VydmljZXNbaV0gPSBzZXJ2aWNlc0NvbXBsZXgocyk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VDb21wbGV4IChkYXRhOiBhbnkpIHtcbiAgICBpZiAoZGF0YSA9PSBudWxsKSByZXR1cm4gZGF0YTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IGRhdGEgOiBkYXRhLm5hbWUsXG4gICAgICAgIGVudHJ5cG9pbnQ6IGRhdGEuZW50cnlwb2ludCxcbiAgICAgICAgLi4uKGRhdGEuZG9ja2VyPy51c2VyID8ge2RvY2tlcjoge3VzZXI6IGRhdGEuZG9ja2VyPy51c2VyfX0gOiB7fSksXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlRWFjaCAoam9iTmFtZTogc3RyaW5nLCBnaXRsYWJEYXRhOiBhbnkpIHtcbiAgICBjb25zdCBqb2JEYXRhID0gZ2l0bGFiRGF0YVtqb2JOYW1lXTtcbiAgICBjb25zdCBpbWFnZSA9IGpvYkRhdGEuaW1hZ2U7XG4gICAgaWYgKCFpbWFnZSkgcmV0dXJuO1xuXG4gICAgam9iRGF0YS5pbWFnZSA9IGltYWdlQ29tcGxleChqb2JEYXRhLmltYWdlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaGVyaXREZWZhdWx0IChnaXRsYWJEYXRhOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IFtqb2JOYW1lLCBqb2JEYXRhXSBvZiBPYmplY3QuZW50cmllczxhbnk+KGdpdGxhYkRhdGEpKSB7XG4gICAgICAgIGlmIChqb2JEYXRhLmluaGVyaXQ/LmRlZmF1bHQgPT09IGZhbHNlKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoSm9iLmlsbGVnYWxKb2JOYW1lcy5oYXMoam9iTmFtZSkgfHwgam9iTmFtZS5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgICAgICAgLy8gc2tpcCBoaWRkZW4gam9icyBhcyB0aGV5IG1pZ2h0IGp1c3QgY29udGFpbiBzaGFyZWQgeWFtbFxuICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9maXJlY293L2dpdGxhYi1jaS1sb2NhbC9pc3N1ZXMvMTI3N1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBrZXl3b3Jkc1RvSW5oZXJpdEZyb20gPSAoQXJyYXkuaXNBcnJheShqb2JEYXRhLmluaGVyaXQ/LmRlZmF1bHQpKSA/XG4gICAgICAgICAgICBqb2JEYXRhLmluaGVyaXQuZGVmYXVsdCA6XG4gICAgICAgICAgICBbXCJhcnRpZmFjdHNcIiwgXCJjYWNoZVwiLCBcInNlcnZpY2VzXCIsIFwiaW1hZ2VcIiwgXCJiZWZvcmVfc2NyaXB0XCIsIFwiYWZ0ZXJfc2NyaXB0XCJdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5d29yZCBvZiBrZXl3b3Jkc1RvSW5oZXJpdEZyb20pIHtcbiAgICAgICAgICAgIGlmIChnaXRsYWJEYXRhLmRlZmF1bHRba2V5d29yZF0gIT09IHVuZGVmaW5lZCkgam9iRGF0YVtrZXl3b3JkXSA9IGpvYkRhdGFba2V5d29yZF0gPz8gZ2l0bGFiRGF0YS5kZWZhdWx0W2tleXdvcmRdO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVHbG9iYWxWYXJpYWJsZXMgKGdpdGxhYkRhdGE6IGFueSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzPGFueT4oZ2l0bGFiRGF0YS52YXJpYWJsZXMgPz8ge30pKSB7XG4gICAgICAgIGdpdGxhYkRhdGEudmFyaWFibGVzW2tleV0gPSBVdGlscy5ub3JtYWxpemVWYXJpYWJsZXModmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5MaXN0cyAoZ2l0bGFiRGF0YTogYW55KSB7XG4gICAgdHJhdmVyc2UoZ2l0bGFiRGF0YSwgKHtwYXJlbnQsIGtleSwgdmFsdWUsIG1ldGF9KSA9PiB7XG4gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgYXNzZXJ0KCF2YWx1ZS5mbGF0KDkpLnNvbWUoQXJyYXkuaXNBcnJheSksIGNoYWxrYFRoaXMgR2l0bGFiIENJIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZDoge2JsdWVCcmlnaHQgJHttZXRhLm5vZGVQYXRofX0gY29uZmlnIHNob3VsZCBiZSBzdHJpbmcgb3IgYSBuZXN0ZWQgYXJyYXkgb2Ygc3RyaW5ncyB1cCB0byAxMCBsZXZlbCBkZWVwYCk7XG4gICAgICAgIH1cbiAgICB9LCB7Y3ljbGVIYW5kbGluZzogdHJ1ZX0pO1xuXG4gICAgdHJhdmVyc2UoZ2l0bGFiRGF0YSwgKHtwYXJlbnQsIGtleSwgdmFsdWV9KSA9PiB7XG4gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcGFyZW50W2tleV0gPSB2YWx1ZS5mbGF0KDkpO1xuICAgICAgICB9XG4gICAgfSwge2N5Y2xlSGFuZGxpbmc6IGZhbHNlfSk7XG59XG4iXX0=
|