@tricoteuses/assemblee 1.7.0 → 1.7.1
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 +9 -27
- package/lib/bugs/acteur-00010/plugin.test.js +4 -4
- package/lib/bugs/acteur-00010/plugin.test.mjs +1 -1
- package/lib/bugs/acteur-00010.js +15 -16
- package/lib/bugs/acteur-00010.mjs +1 -1
- package/lib/bugs/agenda-00002/plugin.test.js +4 -4
- package/lib/bugs/agenda-00002/plugin.test.mjs +1 -1
- package/lib/bugs/agenda-00002.js +27 -28
- package/lib/bugs/agenda-00002.mjs +3 -3
- package/lib/bugs/agenda-00008/plugin.test.js +4 -4
- package/lib/bugs/agenda-00008/plugin.test.mjs +1 -1
- package/lib/bugs/agenda-00008.js +15 -16
- package/lib/bugs/agenda-00008.mjs +1 -1
- package/lib/bugs/agenda-00011/plugin.test.js +5 -5
- package/lib/bugs/agenda-00011/plugin.test.mjs +1 -1
- package/lib/bugs/agenda-00011.js +21 -22
- package/lib/bugs/agenda-00011.mjs +3 -3
- package/lib/bugs.js +17 -19
- package/lib/bugs.mjs +3 -3
- package/lib/cleaners/actes_legislatifs.js +5 -5
- package/lib/cleaners/acteurs.js +5 -5
- package/lib/cleaners/acteurs.mjs +1 -1
- package/lib/cleaners/amendements.js +5 -5
- package/lib/cleaners/documents.js +5 -5
- package/lib/cleaners/dossiers_legislatifs.js +5 -5
- package/lib/cleaners/organes.js +2 -2
- package/lib/cleaners/reunions.js +5 -5
- package/lib/cleaners/scrutins.js +8 -8
- package/lib/cleaners/xml.js +8 -8
- package/lib/cleaners/xml.mjs +1 -1
- package/lib/datasets.d.ts +2 -2
- package/lib/datasets.js +53 -132
- package/lib/datasets.mjs +40 -118
- package/lib/dates.js +1 -2
- package/lib/dossiers_legislatifs.js +8 -8
- package/lib/file_systems.js +15 -14
- package/lib/file_systems.mjs +3 -3
- package/lib/git.d.ts +1 -0
- package/lib/git.js +21 -5
- package/lib/git.mjs +16 -1
- package/lib/inserters.js +3 -3
- package/lib/loaders.d.ts +14 -40
- package/lib/loaders.js +580 -1086
- package/lib/loaders.mjs +110 -353
- package/lib/parsers/documents.js +10 -10
- package/lib/parsers/documents.mjs +1 -1
- package/lib/parsers/recherche_amendements.js +17 -15
- package/lib/parsers/recherche_amendements.mjs +1 -1
- package/lib/raw_types/acteurs_et_organes.js +9 -9
- package/lib/raw_types/acteurs_et_organes.mjs +1 -1
- package/lib/raw_types/agendas.js +9 -9
- package/lib/raw_types/agendas.mjs +1 -1
- package/lib/raw_types/amendements.js +9 -9
- package/lib/raw_types/amendements.mjs +1 -1
- package/lib/raw_types/debats.d.ts +26 -78
- package/lib/raw_types/debats.js +49 -242
- package/lib/raw_types/debats.mjs +41 -234
- package/lib/raw_types/dossiers_legislatifs.js +9 -9
- package/lib/raw_types/dossiers_legislatifs.mjs +1 -1
- package/lib/raw_types/questions.js +9 -9
- package/lib/raw_types/questions.mjs +1 -1
- package/lib/raw_types/scrutins.js +9 -9
- package/lib/raw_types/scrutins.mjs +1 -1
- package/lib/scripts/bugs_helper.js +17 -18
- package/lib/scripts/bugs_helper.mjs +3 -3
- package/lib/scripts/clean_reorganized_data.js +183 -561
- package/lib/scripts/clean_reorganized_data.mjs +111 -410
- package/lib/scripts/diff_amendements.js +11 -24
- package/lib/scripts/diff_amendements.mjs +3 -17
- package/lib/scripts/document_dossiers_legislatifs.js +24 -27
- package/lib/scripts/document_dossiers_legislatifs.mjs +3 -3
- package/lib/scripts/get_today_reunions.js +5 -8
- package/lib/scripts/get_today_reunions.mjs +3 -7
- package/lib/scripts/merge_scrutins.js +11 -24
- package/lib/scripts/merge_scrutins.mjs +3 -17
- package/lib/scripts/parse_textes_lois.js +8 -38
- package/lib/scripts/parse_textes_lois.mjs +3 -33
- package/lib/scripts/raw_types_from_amendements.js +14 -27
- package/lib/scripts/raw_types_from_amendements.mjs +3 -17
- package/lib/scripts/reorganize_data.js +204 -456
- package/lib/scripts/reorganize_data.mjs +68 -260
- package/lib/scripts/retrieve_deputes_photos.d.ts +3 -1
- package/lib/scripts/retrieve_deputes_photos.js +146 -172
- package/lib/scripts/retrieve_deputes_photos.mjs +74 -98
- package/lib/scripts/retrieve_documents.js +207 -156
- package/lib/scripts/retrieve_documents.mjs +116 -128
- package/lib/scripts/retrieve_open_data.js +272 -249
- package/lib/scripts/retrieve_open_data.mjs +109 -123
- package/lib/scripts/retrieve_pending_amendments.js +16 -67
- package/lib/scripts/retrieve_pending_amendments.mjs +4 -55
- package/lib/scripts/retrieve_senateurs_photos.js +20 -77
- package/lib/scripts/retrieve_senateurs_photos.mjs +5 -61
- package/lib/scripts/retrieve_textes_lois.js +18 -46
- package/lib/scripts/retrieve_textes_lois.mjs +3 -33
- package/lib/scripts/shared/cli_helpers.d.ts +66 -0
- package/lib/scripts/shared/cli_helpers.js +90 -0
- package/lib/scripts/shared/cli_helpers.mjs +72 -0
- package/lib/scripts/test_iter_load.d.ts +1 -0
- package/lib/scripts/test_iter_load.js +154 -0
- package/lib/scripts/test_iter_load.mjs +71 -0
- package/lib/scripts/test_load.js +4 -15
- package/lib/scripts/test_load.mjs +3 -14
- package/lib/scripts/test_load_big_files.js +4 -15
- package/lib/scripts/test_load_big_files.mjs +3 -14
- package/lib/scripts/validate_json.js +15 -16
- package/lib/scripts/validate_json.mjs +3 -3
- package/lib/types/acteurs_et_organes.js +9 -9
- package/lib/types/acteurs_et_organes.mjs +1 -1
- package/lib/types/agendas.js +9 -9
- package/lib/types/agendas.mjs +1 -1
- package/lib/types/amendements.js +9 -9
- package/lib/types/amendements.mjs +1 -1
- package/lib/types/debats.d.ts +27 -79
- package/lib/types/debats.js +48 -241
- package/lib/types/debats.mjs +40 -233
- package/lib/types/dossiers_legislatifs.js +9 -9
- package/lib/types/dossiers_legislatifs.mjs +1 -1
- package/lib/types/legislatures.d.ts +4 -4
- package/lib/types/legislatures.js +5 -5
- package/lib/types/legislatures.mjs +5 -5
- package/lib/types/questions.js +9 -9
- package/lib/types/questions.mjs +1 -1
- package/lib/types/scrutins.js +9 -9
- package/lib/types/scrutins.mjs +1 -1
- package/lib/urls.js +2 -2
- package/lib/urls.mjs +1 -1
- package/package.json +9 -7
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import assert from "assert";
|
|
2
1
|
import { execSync } from "child_process";
|
|
3
2
|
import commandLineArgs from "command-line-args";
|
|
4
3
|
import fs from "fs-extra";
|
|
5
4
|
import path from "path";
|
|
6
5
|
import { cleanActeur, cleanAmendement, cleanDocumentOrDivision, cleanDossierParlementaire, cleanOrgane, cleanReunion, cleanScrutin, cleanQuestion, cleanCompteRendu } from "../cleaners/index.mjs";
|
|
7
|
-
import { datasets, EnabledDatasets, filterByLegislature } from "../datasets.mjs";
|
|
6
|
+
import { datasets, EnabledDatasets, getEnabledDatasets, filterByLegislature } from "../datasets.mjs";
|
|
8
7
|
import { existingDateToJson, patchedDateToJson } from "../dates.mjs";
|
|
9
8
|
import { walkDir } from "../file_systems.mjs";
|
|
10
9
|
import * as git from "../git.mjs";
|
|
@@ -15,78 +14,85 @@ import { Convert as DossiersLegislatifsConvert } from "../types/dossiers_legisla
|
|
|
15
14
|
import { Convert as ScrutinsConvert } from "../types/scrutins.mjs";
|
|
16
15
|
import { Convert as QuestionsConvert } from "../types/questions.mjs";
|
|
17
16
|
import { Convert as ComptesRendusConvert } from "../types/debats.mjs";
|
|
17
|
+
import { cloneOption, commitOption, remoteOption, legislatureOption, categoriesOption, dataDirDefaultOption, silentOption, verboseOption, pullOption } from "./shared/cli_helpers.mjs";
|
|
18
18
|
function parseArgs(argv) {
|
|
19
|
-
const optionsDefinitions = [{
|
|
20
|
-
alias: "C",
|
|
21
|
-
help: "clone repositories from given group (or organization) git URL",
|
|
22
|
-
name: "clone",
|
|
23
|
-
type: String
|
|
24
|
-
}, {
|
|
25
|
-
alias: "c",
|
|
26
|
-
help: "commit clean files",
|
|
27
|
-
name: "commit",
|
|
28
|
-
type: Boolean
|
|
29
|
-
}, {
|
|
19
|
+
const optionsDefinitions = [cloneOption, commitOption, remoteOption, legislatureOption, categoriesOption, silentOption, verboseOption, dataDirDefaultOption, pullOption, {
|
|
30
20
|
alias: "d",
|
|
31
21
|
help: "single dataset to reorganize",
|
|
32
22
|
name: "dataset",
|
|
33
23
|
type: String
|
|
34
|
-
}, {
|
|
35
|
-
alias: "k",
|
|
36
|
-
defaultValue: ["All"],
|
|
37
|
-
help: "categories of datasets to reorganize",
|
|
38
|
-
multiple: true,
|
|
39
|
-
name: "categories",
|
|
40
|
-
type: String
|
|
41
|
-
}, {
|
|
42
|
-
alias: "l",
|
|
43
|
-
help: "legislatures of categories of datasets to retrieve; leave empty or use 0 for all",
|
|
44
|
-
multiple: true,
|
|
45
|
-
name: "legislature",
|
|
46
|
-
type: Number
|
|
47
|
-
}, {
|
|
48
|
-
alias: "p",
|
|
49
|
-
help: "pull repositories before proceeding",
|
|
50
|
-
name: "pull",
|
|
51
|
-
type: Boolean
|
|
52
|
-
}, {
|
|
53
|
-
alias: "r",
|
|
54
|
-
help: "push commit to given remote",
|
|
55
|
-
multiple: true,
|
|
56
|
-
name: "remote",
|
|
57
|
-
type: String
|
|
58
|
-
}, {
|
|
59
|
-
alias: "s",
|
|
60
|
-
help: "don't log anything",
|
|
61
|
-
name: "silent",
|
|
62
|
-
type: Boolean
|
|
63
24
|
}, {
|
|
64
25
|
help: "do not reset --hard after commit to save I/O if the working tree is to be discarded",
|
|
65
26
|
name: "no-reset-after-commit",
|
|
66
27
|
type: Boolean
|
|
67
28
|
}, {
|
|
68
|
-
alias: "
|
|
69
|
-
help: "
|
|
70
|
-
name: "
|
|
29
|
+
alias: "V",
|
|
30
|
+
help: "don't validate data",
|
|
31
|
+
name: "no-validate",
|
|
71
32
|
type: Boolean
|
|
72
|
-
}, {
|
|
73
|
-
defaultOption: true,
|
|
74
|
-
help: "directory containing Assemblée open data files",
|
|
75
|
-
name: "dataDir",
|
|
76
|
-
type: String
|
|
77
33
|
}];
|
|
78
34
|
const options = commandLineArgs(optionsDefinitions, {
|
|
79
35
|
argv: argv
|
|
80
36
|
});
|
|
81
37
|
return options;
|
|
82
38
|
}
|
|
39
|
+
function cloneGit(gitGroupUrl, datasetName, dataDir) {
|
|
40
|
+
if (gitGroupUrl !== undefined) {
|
|
41
|
+
execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
|
|
42
|
+
cwd: dataDir,
|
|
43
|
+
env: process.env,
|
|
44
|
+
encoding: "utf-8",
|
|
45
|
+
stdio: ["ignore", "ignore", "pipe"]
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function commitGit(datasetCleanDir, options, exitCode, subdirectories) {
|
|
50
|
+
if (options.commit) {
|
|
51
|
+
const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
|
|
52
|
+
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
53
|
+
exitCode = errorCode;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (commitAndPushUid(datasetCleanDir, options, subdirectories) && (exitCode === 0 || exitCode === 10)) {
|
|
57
|
+
exitCode = 1;
|
|
58
|
+
}
|
|
59
|
+
return exitCode;
|
|
60
|
+
}
|
|
61
|
+
function cleanAndValidateData(data, cleaner, fromJson, toJson, noValidate) {
|
|
62
|
+
cleaner(data);
|
|
63
|
+
const jsonData = JSON.stringify(data, null, 2);
|
|
64
|
+
if (!noValidate) {
|
|
65
|
+
return jsonData;
|
|
66
|
+
} else {
|
|
67
|
+
const validatedData = fromJson(jsonData);
|
|
68
|
+
return toJson(validatedData);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function processFiles(datasetRawDir, datasetCleanDir, walkDirParams, cleaner, dataConverter, options) {
|
|
72
|
+
for (const filePathArray of walkDir(datasetRawDir, walkDirParams)) {
|
|
73
|
+
const filename = filePathArray[filePathArray.length - 1];
|
|
74
|
+
if (!filename.endsWith(".json")) continue;
|
|
75
|
+
const rawFilePath = path.join(datasetRawDir, ...filePathArray);
|
|
76
|
+
const rawJson = fs.readFileSync(rawFilePath, {
|
|
77
|
+
encoding: "utf8"
|
|
78
|
+
});
|
|
79
|
+
if (options.verbose) console.log(`Cleaning file: ${rawFilePath}...`);
|
|
80
|
+
const data = JSON.parse(rawJson);
|
|
81
|
+
const validateData = !options["no-validate"];
|
|
82
|
+
const cleanJson = cleanAndValidateData(data, cleaner, dataConverter.fromJson, dataConverter.toJson, validateData);
|
|
83
|
+
const cleanFilePath = path.join(datasetCleanDir, ...filePathArray);
|
|
84
|
+
fs.ensureDirSync(path.dirname(cleanFilePath));
|
|
85
|
+
fs.writeFileSync(cleanFilePath, cleanJson, {
|
|
86
|
+
encoding: "utf8"
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
83
90
|
function cleanReorganizedData(options) {
|
|
84
91
|
const dataDir = options.dataDir;
|
|
85
92
|
Date.prototype.toJSON = patchedDateToJson;
|
|
86
93
|
let exitCode = options.commit ? 10 : 0;
|
|
87
|
-
const gitGroupUrl = options.clone
|
|
88
|
-
options.categories
|
|
89
|
-
const enabledDatasets = options.categories.reduce((enabledDatasets, datasetName) => enabledDatasets | EnabledDatasets[datasetName], EnabledDatasets.None);
|
|
94
|
+
const gitGroupUrl = options.clone?.trim().replace(/\/+$/, "");
|
|
95
|
+
const enabledDatasets = getEnabledDatasets(options.categories);
|
|
90
96
|
let chosenDatasets = filterByLegislature(datasets, options.legislature);
|
|
91
97
|
if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
|
|
92
98
|
for (const dataset of chosenDatasets.acteursEtOrganes) {
|
|
@@ -94,90 +100,22 @@ function cleanReorganizedData(options) {
|
|
|
94
100
|
if (options.dataset && datasetName !== options.dataset) {
|
|
95
101
|
continue;
|
|
96
102
|
}
|
|
97
|
-
|
|
98
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
|
|
99
|
-
cwd: dataDir,
|
|
100
|
-
env: process.env,
|
|
101
|
-
encoding: "utf-8",
|
|
102
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
103
|
-
});
|
|
104
|
-
}
|
|
103
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
105
104
|
const datasetRawDir = path.join(dataDir, datasetName);
|
|
106
105
|
const datasetCleanDir = datasetRawDir + "_nettoye";
|
|
107
106
|
if (options.pull) {
|
|
108
|
-
|
|
109
|
-
cwd: datasetCleanDir,
|
|
110
|
-
env: process.env,
|
|
111
|
-
encoding: "utf-8",
|
|
112
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
113
|
-
});
|
|
114
|
-
execSync(`git pull --rebase`, {
|
|
115
|
-
cwd: datasetCleanDir,
|
|
116
|
-
env: process.env,
|
|
117
|
-
encoding: "utf-8",
|
|
118
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
119
|
-
});
|
|
107
|
+
git.resetAndPull(datasetCleanDir);
|
|
120
108
|
}
|
|
121
109
|
analyzeAndRemove(datasetName, options);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const acteurRawJson = fs.readFileSync(acteurRawFilePath, {
|
|
132
|
-
encoding: "utf8"
|
|
133
|
-
});
|
|
134
|
-
const acteur = JSON.parse(acteurRawJson);
|
|
135
|
-
cleanActeur(acteur);
|
|
136
|
-
const acteurJson = JSON.stringify(acteur, null, 2);
|
|
137
|
-
|
|
138
|
-
// Validate generated JSON.
|
|
139
|
-
const acteurClean = ActeursEtOrganesConvert.toActeur(acteurJson);
|
|
140
|
-
const acteurCleanJson = ActeursEtOrganesConvert.acteurToJson(acteurClean);
|
|
141
|
-
const acteurCleanFilePath = path.join(datasetCleanDir, ...acteurSplitPath);
|
|
142
|
-
fs.ensureDirSync(path.dirname(acteurCleanFilePath));
|
|
143
|
-
fs.writeFileSync(acteurCleanFilePath, acteurCleanJson, {
|
|
144
|
-
encoding: "utf8"
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
for (const organeSplitPath of walkDir(datasetRawDir, ["organes"])) {
|
|
148
|
-
const organeFilename = organeSplitPath[organeSplitPath.length - 1];
|
|
149
|
-
if (!organeFilename.endsWith(".json")) {
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
const organeRawFilePath = path.join(datasetRawDir, ...organeSplitPath);
|
|
153
|
-
if (options.verbose) {
|
|
154
|
-
console.log(` Cleaning file: ${organeRawFilePath}…`);
|
|
155
|
-
}
|
|
156
|
-
const organeRawJson = fs.readFileSync(organeRawFilePath, {
|
|
157
|
-
encoding: "utf8"
|
|
158
|
-
});
|
|
159
|
-
const organe = JSON.parse(organeRawJson);
|
|
160
|
-
cleanOrgane(organe);
|
|
161
|
-
const organeJson = JSON.stringify(organe, null, 2);
|
|
162
|
-
|
|
163
|
-
// Validate generated JSON.
|
|
164
|
-
const organeClean = ActeursEtOrganesConvert.toOrgane(organeJson);
|
|
165
|
-
const organeCleanJson = ActeursEtOrganesConvert.organeToJson(organeClean);
|
|
166
|
-
const organeCleanFilePath = path.join(datasetCleanDir, ...organeSplitPath);
|
|
167
|
-
fs.ensureDirSync(path.dirname(organeCleanFilePath));
|
|
168
|
-
fs.writeFileSync(organeCleanFilePath, organeCleanJson, {
|
|
169
|
-
encoding: "utf8"
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
if (options.commit) {
|
|
173
|
-
const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
|
|
174
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
175
|
-
exitCode = errorCode;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
if (commitAndPushUid(datasetCleanDir, options, ["acteurs", "organes"]) && (exitCode === 0 || exitCode === 10)) {
|
|
179
|
-
exitCode = 1;
|
|
180
|
-
}
|
|
110
|
+
processFiles(datasetRawDir, datasetCleanDir, ["acteurs"], cleanActeur, {
|
|
111
|
+
fromJson: ActeursEtOrganesConvert.toActeur,
|
|
112
|
+
toJson: ActeursEtOrganesConvert.acteurToJson
|
|
113
|
+
}, options);
|
|
114
|
+
processFiles(datasetRawDir, datasetCleanDir, ["organes"], cleanOrgane, {
|
|
115
|
+
fromJson: ActeursEtOrganesConvert.toOrgane,
|
|
116
|
+
toJson: ActeursEtOrganesConvert.organeToJson
|
|
117
|
+
}, options);
|
|
118
|
+
exitCode = commitGit(datasetCleanDir, options, exitCode, ["acteurs", "organes"]);
|
|
181
119
|
}
|
|
182
120
|
}
|
|
183
121
|
if (enabledDatasets & EnabledDatasets.Agendas) {
|
|
@@ -186,51 +124,15 @@ function cleanReorganizedData(options) {
|
|
|
186
124
|
if (options.dataset && datasetName !== options.dataset) {
|
|
187
125
|
continue;
|
|
188
126
|
}
|
|
189
|
-
|
|
190
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
|
|
191
|
-
cwd: dataDir,
|
|
192
|
-
env: process.env,
|
|
193
|
-
encoding: "utf-8",
|
|
194
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
195
|
-
});
|
|
196
|
-
}
|
|
127
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
197
128
|
analyzeAndRemove(datasetName, options);
|
|
198
129
|
const datasetRawDir = path.join(dataDir, datasetName);
|
|
199
130
|
const datasetCleanDir = datasetRawDir + "_nettoye";
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const reunionRawFilePath = path.join(datasetRawDir, ...reunionSplitPath);
|
|
206
|
-
if (options.verbose) {
|
|
207
|
-
console.log(` Cleaning file: ${reunionRawFilePath}…`);
|
|
208
|
-
}
|
|
209
|
-
const reunionRawJson = fs.readFileSync(reunionRawFilePath, {
|
|
210
|
-
encoding: "utf8"
|
|
211
|
-
});
|
|
212
|
-
const reunion = JSON.parse(reunionRawJson);
|
|
213
|
-
cleanReunion(reunion);
|
|
214
|
-
const reunionJson = JSON.stringify(reunion, null, 2);
|
|
215
|
-
|
|
216
|
-
// Validate generated JSON.
|
|
217
|
-
const reunionClean = AgendasConvert.toReunion(reunionJson);
|
|
218
|
-
const reunionCleanJson = AgendasConvert.reunionToJson(reunionClean);
|
|
219
|
-
const reunionCleanFilePath = path.join(datasetCleanDir, ...reunionSplitPath);
|
|
220
|
-
fs.ensureDirSync(path.dirname(reunionCleanFilePath));
|
|
221
|
-
fs.writeFileSync(reunionCleanFilePath, reunionCleanJson, {
|
|
222
|
-
encoding: "utf8"
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
if (options.commit) {
|
|
226
|
-
const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
|
|
227
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
228
|
-
exitCode = errorCode;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
if (commitAndPushUid(datasetCleanDir, options, ["."]) && (exitCode === 0 || exitCode === 10)) {
|
|
232
|
-
exitCode = 1;
|
|
233
|
-
}
|
|
131
|
+
processFiles(datasetRawDir, datasetCleanDir, [], cleanReunion, {
|
|
132
|
+
fromJson: AgendasConvert.toReunion,
|
|
133
|
+
toJson: AgendasConvert.reunionToJson
|
|
134
|
+
}, options);
|
|
135
|
+
exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
|
|
234
136
|
}
|
|
235
137
|
}
|
|
236
138
|
if (enabledDatasets & EnabledDatasets.Amendements) {
|
|
@@ -239,51 +141,15 @@ function cleanReorganizedData(options) {
|
|
|
239
141
|
if (options.dataset && datasetName !== options.dataset) {
|
|
240
142
|
continue;
|
|
241
143
|
}
|
|
242
|
-
|
|
243
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
|
|
244
|
-
cwd: dataDir,
|
|
245
|
-
env: process.env,
|
|
246
|
-
encoding: "utf-8",
|
|
247
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
248
|
-
});
|
|
249
|
-
}
|
|
144
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
250
145
|
analyzeAndRemove(datasetName, options);
|
|
251
146
|
const datasetRawDir = path.join(dataDir, datasetName);
|
|
252
147
|
const datasetCleanDir = datasetRawDir + "_nettoye";
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
const amendementRawFilePath = path.join(datasetRawDir, ...amendementSplitPath);
|
|
259
|
-
if (options.verbose) {
|
|
260
|
-
console.log(` Cleaning file: ${amendementRawFilePath}…`);
|
|
261
|
-
}
|
|
262
|
-
const amendementRawJson = fs.readFileSync(amendementRawFilePath, {
|
|
263
|
-
encoding: "utf8"
|
|
264
|
-
});
|
|
265
|
-
const amendement = JSON.parse(amendementRawJson);
|
|
266
|
-
cleanAmendement(amendement);
|
|
267
|
-
const amendementJson = JSON.stringify(amendement, null, 2);
|
|
268
|
-
|
|
269
|
-
// Validate generated JSON.
|
|
270
|
-
const amendementClean = AmendementsConvert.toAmendement(amendementJson);
|
|
271
|
-
const amendementCleanJson = AmendementsConvert.amendementToJson(amendementClean);
|
|
272
|
-
const amendementCleanFilePath = path.join(datasetCleanDir, ...amendementSplitPath);
|
|
273
|
-
fs.ensureDirSync(path.dirname(amendementCleanFilePath));
|
|
274
|
-
fs.writeFileSync(amendementCleanFilePath, amendementCleanJson, {
|
|
275
|
-
encoding: "utf8"
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
if (options.commit) {
|
|
279
|
-
const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
|
|
280
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
281
|
-
exitCode = errorCode;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
if (commitAndPushUid(datasetCleanDir, options, ["."]) && (exitCode === 0 || exitCode === 10)) {
|
|
285
|
-
exitCode = 1;
|
|
286
|
-
}
|
|
148
|
+
processFiles(datasetRawDir, datasetCleanDir, [], cleanAmendement, {
|
|
149
|
+
fromJson: AmendementsConvert.toAmendement,
|
|
150
|
+
toJson: AmendementsConvert.amendementToJson
|
|
151
|
+
}, options);
|
|
152
|
+
exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
|
|
287
153
|
}
|
|
288
154
|
}
|
|
289
155
|
if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
|
|
@@ -292,76 +158,19 @@ function cleanReorganizedData(options) {
|
|
|
292
158
|
if (options.dataset && datasetName !== options.dataset) {
|
|
293
159
|
continue;
|
|
294
160
|
}
|
|
295
|
-
|
|
296
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
|
|
297
|
-
cwd: dataDir,
|
|
298
|
-
env: process.env,
|
|
299
|
-
encoding: "utf-8",
|
|
300
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
301
|
-
});
|
|
302
|
-
}
|
|
161
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
303
162
|
analyzeAndRemove(datasetName, options);
|
|
304
163
|
const datasetRawDir = path.join(dataDir, datasetName);
|
|
305
164
|
const datasetCleanDir = datasetRawDir + "_nettoye";
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
const documentRawJson = fs.readFileSync(documentRawFilePath, {
|
|
316
|
-
encoding: "utf8"
|
|
317
|
-
});
|
|
318
|
-
const document = JSON.parse(documentRawJson);
|
|
319
|
-
cleanDocumentOrDivision(document);
|
|
320
|
-
const documentJson = JSON.stringify(document, null, 2);
|
|
321
|
-
|
|
322
|
-
// Validate generated JSON.
|
|
323
|
-
const documentClean = DossiersLegislatifsConvert.toDocument(documentJson);
|
|
324
|
-
const documentCleanJson = DossiersLegislatifsConvert.documentToJson(documentClean);
|
|
325
|
-
const documentCleanFilePath = path.join(datasetCleanDir, ...documentSplitPath);
|
|
326
|
-
fs.ensureDirSync(path.dirname(documentCleanFilePath));
|
|
327
|
-
fs.writeFileSync(documentCleanFilePath, documentCleanJson, {
|
|
328
|
-
encoding: "utf8"
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
for (const dossierSplitPath of walkDir(datasetRawDir, ["dossiers"])) {
|
|
332
|
-
const dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
|
|
333
|
-
if (!dossierFilename.endsWith(".json")) {
|
|
334
|
-
continue;
|
|
335
|
-
}
|
|
336
|
-
const dossierRawFilePath = path.join(datasetRawDir, ...dossierSplitPath);
|
|
337
|
-
if (options.verbose) {
|
|
338
|
-
console.log(` Cleaning file: ${dossierRawFilePath}…`);
|
|
339
|
-
}
|
|
340
|
-
const dossierRawJson = fs.readFileSync(dossierRawFilePath, {
|
|
341
|
-
encoding: "utf8"
|
|
342
|
-
});
|
|
343
|
-
const dossier = JSON.parse(dossierRawJson);
|
|
344
|
-
cleanDossierParlementaire(dossier);
|
|
345
|
-
const dossierJson = JSON.stringify(dossier, null, 2);
|
|
346
|
-
|
|
347
|
-
// Validate generated JSON.
|
|
348
|
-
const dossierClean = DossiersLegislatifsConvert.toDossierParlementaire(dossierJson);
|
|
349
|
-
const dossierCleanJson = DossiersLegislatifsConvert.dossierParlementaireToJson(dossierClean);
|
|
350
|
-
const dossierCleanFilePath = path.join(datasetCleanDir, ...dossierSplitPath);
|
|
351
|
-
fs.ensureDirSync(path.dirname(dossierCleanFilePath));
|
|
352
|
-
fs.writeFileSync(dossierCleanFilePath, dossierCleanJson, {
|
|
353
|
-
encoding: "utf8"
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
if (options.commit) {
|
|
357
|
-
const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
|
|
358
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
359
|
-
exitCode = errorCode;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
if (commitAndPushUid(datasetCleanDir, options, ["documents", "dossiers"]) && (exitCode === 0 || exitCode === 10)) {
|
|
363
|
-
exitCode = 1;
|
|
364
|
-
}
|
|
165
|
+
processFiles(datasetRawDir, datasetCleanDir, ["documents"], cleanDocumentOrDivision, {
|
|
166
|
+
fromJson: DossiersLegislatifsConvert.toDocument,
|
|
167
|
+
toJson: DossiersLegislatifsConvert.documentToJson
|
|
168
|
+
}, options);
|
|
169
|
+
processFiles(datasetRawDir, datasetCleanDir, ["dossiers"], cleanDossierParlementaire, {
|
|
170
|
+
fromJson: DossiersLegislatifsConvert.toDossierParlementaire,
|
|
171
|
+
toJson: DossiersLegislatifsConvert.dossierParlementaireToJson
|
|
172
|
+
}, options);
|
|
173
|
+
exitCode = commitGit(datasetCleanDir, options, exitCode, ["documents", "dossiers"]);
|
|
365
174
|
}
|
|
366
175
|
}
|
|
367
176
|
if (enabledDatasets & EnabledDatasets.Scrutins) {
|
|
@@ -370,51 +179,15 @@ function cleanReorganizedData(options) {
|
|
|
370
179
|
if (options.dataset && datasetName !== options.dataset) {
|
|
371
180
|
continue;
|
|
372
181
|
}
|
|
373
|
-
|
|
374
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
|
|
375
|
-
cwd: dataDir,
|
|
376
|
-
env: process.env,
|
|
377
|
-
encoding: "utf-8",
|
|
378
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
379
|
-
});
|
|
380
|
-
}
|
|
182
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
381
183
|
analyzeAndRemove(datasetName, options);
|
|
382
184
|
const datasetRawDir = path.join(dataDir, datasetName);
|
|
383
185
|
const datasetCleanDir = datasetRawDir + "_nettoye";
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
const scrutinRawFilePath = path.join(datasetRawDir, ...scrutinSplitPath);
|
|
390
|
-
if (options.verbose) {
|
|
391
|
-
console.log(` Cleaning file: ${scrutinRawFilePath}…`);
|
|
392
|
-
}
|
|
393
|
-
const scrutinRawJson = fs.readFileSync(scrutinRawFilePath, {
|
|
394
|
-
encoding: "utf8"
|
|
395
|
-
});
|
|
396
|
-
const scrutin = JSON.parse(scrutinRawJson);
|
|
397
|
-
cleanScrutin(scrutin);
|
|
398
|
-
const scrutinJson = JSON.stringify(scrutin, null, 2);
|
|
399
|
-
|
|
400
|
-
// Validate generated JSON.
|
|
401
|
-
const scrutinClean = ScrutinsConvert.toScrutin(scrutinJson);
|
|
402
|
-
const scrutinCleanJson = ScrutinsConvert.scrutinToJson(scrutinClean);
|
|
403
|
-
const scrutinCleanFilePath = path.join(datasetCleanDir, ...scrutinSplitPath);
|
|
404
|
-
fs.ensureDirSync(path.dirname(scrutinCleanFilePath));
|
|
405
|
-
fs.writeFileSync(scrutinCleanFilePath, scrutinCleanJson, {
|
|
406
|
-
encoding: "utf8"
|
|
407
|
-
});
|
|
408
|
-
}
|
|
409
|
-
if (options.commit) {
|
|
410
|
-
const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
|
|
411
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
412
|
-
exitCode = errorCode;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
if (commitAndPushUid(datasetCleanDir, options, ["."]) && (exitCode === 0 || exitCode === 10)) {
|
|
416
|
-
exitCode = 1;
|
|
417
|
-
}
|
|
186
|
+
processFiles(datasetRawDir, datasetCleanDir, [], cleanScrutin, {
|
|
187
|
+
fromJson: ScrutinsConvert.toScrutin,
|
|
188
|
+
toJson: ScrutinsConvert.scrutinToJson
|
|
189
|
+
}, options);
|
|
190
|
+
exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
|
|
418
191
|
}
|
|
419
192
|
}
|
|
420
193
|
if (enabledDatasets & EnabledDatasets.Questions) {
|
|
@@ -423,51 +196,15 @@ function cleanReorganizedData(options) {
|
|
|
423
196
|
if (options.dataset && datasetName !== options.dataset) {
|
|
424
197
|
continue;
|
|
425
198
|
}
|
|
426
|
-
|
|
427
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
|
|
428
|
-
cwd: dataDir,
|
|
429
|
-
env: process.env,
|
|
430
|
-
encoding: "utf-8",
|
|
431
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
432
|
-
});
|
|
433
|
-
}
|
|
199
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
434
200
|
analyzeAndRemove(datasetName, options);
|
|
435
201
|
const datasetRawDir = path.join(dataDir, datasetName);
|
|
436
202
|
const datasetCleanDir = datasetRawDir + "_nettoye";
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
const questionRawFilePath = path.join(datasetRawDir, ...questionsSplitPath);
|
|
443
|
-
if (options.verbose) {
|
|
444
|
-
console.log(` Cleaning file: ${questionRawFilePath}…`);
|
|
445
|
-
}
|
|
446
|
-
const questionRawJson = fs.readFileSync(questionRawFilePath, {
|
|
447
|
-
encoding: "utf8"
|
|
448
|
-
});
|
|
449
|
-
const question = JSON.parse(questionRawJson);
|
|
450
|
-
cleanQuestion(question);
|
|
451
|
-
const questionJson = JSON.stringify(question, null, 2);
|
|
452
|
-
|
|
453
|
-
// Validate generated JSON.
|
|
454
|
-
const questionClean = QuestionsConvert.toQuestion(questionJson);
|
|
455
|
-
const questionCleanJson = QuestionsConvert.questionToJson(questionClean);
|
|
456
|
-
const questionCleanFilePath = path.join(datasetCleanDir, ...questionsSplitPath);
|
|
457
|
-
fs.ensureDirSync(path.dirname(questionCleanFilePath));
|
|
458
|
-
fs.writeFileSync(questionCleanFilePath, questionCleanJson, {
|
|
459
|
-
encoding: "utf8"
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
if (options.commit) {
|
|
463
|
-
const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
|
|
464
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
465
|
-
exitCode = errorCode;
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
if (commitAndPushUid(datasetCleanDir, options, ["."]) && (exitCode === 0 || exitCode === 10)) {
|
|
469
|
-
exitCode = 1;
|
|
470
|
-
}
|
|
203
|
+
processFiles(datasetRawDir, datasetCleanDir, [], cleanQuestion, {
|
|
204
|
+
fromJson: QuestionsConvert.toQuestion,
|
|
205
|
+
toJson: QuestionsConvert.questionToJson
|
|
206
|
+
}, options);
|
|
207
|
+
exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
|
|
471
208
|
}
|
|
472
209
|
}
|
|
473
210
|
if (enabledDatasets & EnabledDatasets.ComptesRendusSeances) {
|
|
@@ -476,51 +213,15 @@ function cleanReorganizedData(options) {
|
|
|
476
213
|
if (options.dataset && datasetName !== options.dataset) {
|
|
477
214
|
continue;
|
|
478
215
|
}
|
|
479
|
-
|
|
480
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}_nettoye.git`, {
|
|
481
|
-
cwd: dataDir,
|
|
482
|
-
env: process.env,
|
|
483
|
-
encoding: "utf-8",
|
|
484
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
485
|
-
});
|
|
486
|
-
}
|
|
216
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
487
217
|
analyzeAndRemove(datasetName, options);
|
|
488
218
|
const datasetRawDir = path.join(dataDir, datasetName);
|
|
489
219
|
const datasetCleanDir = datasetRawDir + "_nettoye";
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
const compteRenduRawFilePath = path.join(datasetRawDir, ...comptesRendusSplitPath);
|
|
496
|
-
if (options.verbose) {
|
|
497
|
-
console.log(` Cleaning file: ${compteRenduRawFilePath}…`);
|
|
498
|
-
}
|
|
499
|
-
const compteRenduRawJson = fs.readFileSync(compteRenduRawFilePath, {
|
|
500
|
-
encoding: "utf8"
|
|
501
|
-
});
|
|
502
|
-
const compteRendu = JSON.parse(compteRenduRawJson);
|
|
503
|
-
cleanCompteRendu(compteRendu);
|
|
504
|
-
const compteRenduJson = JSON.stringify(compteRendu, null, 2);
|
|
505
|
-
|
|
506
|
-
// Validate generated JSON.
|
|
507
|
-
const compteRenduClean = ComptesRendusConvert.toCompteRendu(compteRenduJson);
|
|
508
|
-
const compteRenduCleanJson = ComptesRendusConvert.compteRenduToJson(compteRenduClean);
|
|
509
|
-
const compteRenduCleanFilePath = path.join(datasetCleanDir, ...comptesRendusSplitPath);
|
|
510
|
-
fs.ensureDirSync(path.dirname(compteRenduCleanFilePath));
|
|
511
|
-
fs.writeFileSync(compteRenduCleanFilePath, compteRenduCleanJson, {
|
|
512
|
-
encoding: "utf8"
|
|
513
|
-
});
|
|
514
|
-
}
|
|
515
|
-
if (options.commit) {
|
|
516
|
-
const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
|
|
517
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
518
|
-
exitCode = errorCode;
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
if (commitAndPushUid(datasetCleanDir, options, ["."]) && (exitCode === 0 || exitCode === 10)) {
|
|
522
|
-
exitCode = 1;
|
|
523
|
-
}
|
|
220
|
+
processFiles(datasetRawDir, datasetCleanDir, [], cleanCompteRendu, {
|
|
221
|
+
fromJson: ComptesRendusConvert.toCompteRendu,
|
|
222
|
+
toJson: ComptesRendusConvert.compteRenduToJson
|
|
223
|
+
}, options);
|
|
224
|
+
exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
|
|
524
225
|
}
|
|
525
226
|
}
|
|
526
227
|
|
|
@@ -565,4 +266,4 @@ function main(argv) {
|
|
|
565
266
|
|
|
566
267
|
/* istanbul ignore if */
|
|
567
268
|
if (process.argv[1].endsWith("clean_reorganized_data.ts")) process.exit(main(process.argv));
|
|
568
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImNsZWFuQWN0ZXVyIiwiY2xlYW5BbWVuZGVtZW50IiwiY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24iLCJjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiY2xlYW5PcmdhbmUiLCJjbGVhblJldW5pb24iLCJjbGVhblNjcnV0aW4iLCJjbGVhblF1ZXN0aW9uIiwiY2xlYW5Db21wdGVSZW5kdSIsImRhdGFzZXRzIiwiRW5hYmxlZERhdGFzZXRzIiwiZmlsdGVyQnlMZWdpc2xhdHVyZSIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsImdpdCIsIkNvbnZlcnQiLCJBY3RldXJzRXRPcmdhbmVzQ29udmVydCIsIkFnZW5kYXNDb252ZXJ0IiwiQW1lbmRlbWVudHNDb252ZXJ0IiwiRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQiLCJTY3J1dGluc0NvbnZlcnQiLCJRdWVzdGlvbnNDb252ZXJ0IiwiQ29tcHRlc1JlbmR1c0NvbnZlcnQiLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJOdW1iZXIiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsImNsZWFuUmVvcmdhbml6ZWREYXRhIiwiZGF0YURpciIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJleGl0Q29kZSIsImNvbW1pdCIsImdpdEdyb3VwVXJsIiwiY2xvbmUiLCJ0cmltIiwicmVwbGFjZSIsInVuZGVmaW5lZCIsImNhdGVnb3JpZXMiLCJtYXAiLCJkYXRhc2V0TmFtZSIsIm5vdFN0cmljdEVxdWFsIiwiZW5hYmxlZERhdGFzZXRzIiwicmVkdWNlIiwiTm9uZSIsImNob3NlbkRhdGFzZXRzIiwibGVnaXNsYXR1cmUiLCJBY3RldXJzRXRPcmdhbmVzIiwiZGF0YXNldCIsImFjdGV1cnNFdE9yZ2FuZXMiLCJiYXNlbmFtZSIsImZpbGVuYW1lIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJkYXRhc2V0UmF3RGlyIiwiam9pbiIsImRhdGFzZXRDbGVhbkRpciIsInB1bGwiLCJhbmFseXplQW5kUmVtb3ZlIiwiYWN0ZXVyU3BsaXRQYXRoIiwiYWN0ZXVyRmlsZW5hbWUiLCJsZW5ndGgiLCJlbmRzV2l0aCIsImFjdGV1clJhd0ZpbGVQYXRoIiwidmVyYm9zZSIsImNvbnNvbGUiLCJsb2ciLCJhY3RldXJSYXdKc29uIiwicmVhZEZpbGVTeW5jIiwiYWN0ZXVyIiwiSlNPTiIsInBhcnNlIiwiYWN0ZXVySnNvbiIsInN0cmluZ2lmeSIsImFjdGV1ckNsZWFuIiwidG9BY3RldXIiLCJhY3RldXJDbGVhbkpzb24iLCJhY3RldXJUb0pzb24iLCJhY3RldXJDbGVhbkZpbGVQYXRoIiwiZW5zdXJlRGlyU3luYyIsImRpcm5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwib3JnYW5lU3BsaXRQYXRoIiwib3JnYW5lRmlsZW5hbWUiLCJvcmdhbmVSYXdGaWxlUGF0aCIsIm9yZ2FuZVJhd0pzb24iLCJvcmdhbmUiLCJvcmdhbmVKc29uIiwib3JnYW5lQ2xlYW4iLCJ0b09yZ2FuZSIsIm9yZ2FuZUNsZWFuSnNvbiIsIm9yZ2FuZVRvSnNvbiIsIm9yZ2FuZUNsZWFuRmlsZVBhdGgiLCJlcnJvckNvZGUiLCJjb21taXRBbmRQdXNoIiwicmVtb3RlIiwiY29tbWl0QW5kUHVzaFVpZCIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwicmV1bmlvblNwbGl0UGF0aCIsInJldW5pb25GaWxlbmFtZSIsInJldW5pb25SYXdGaWxlUGF0aCIsInJldW5pb25SYXdKc29uIiwicmV1bmlvbiIsInJldW5pb25Kc29uIiwicmV1bmlvbkNsZWFuIiwidG9SZXVuaW9uIiwicmV1bmlvbkNsZWFuSnNvbiIsInJldW5pb25Ub0pzb24iLCJyZXVuaW9uQ2xlYW5GaWxlUGF0aCIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJhbWVuZGVtZW50U3BsaXRQYXRoIiwiYW1lbmRlbWVudEZpbGVuYW1lIiwiYW1lbmRlbWVudFJhd0ZpbGVQYXRoIiwiYW1lbmRlbWVudFJhd0pzb24iLCJhbWVuZGVtZW50IiwiYW1lbmRlbWVudEpzb24iLCJhbWVuZGVtZW50Q2xlYW4iLCJ0b0FtZW5kZW1lbnQiLCJhbWVuZGVtZW50Q2xlYW5Kc29uIiwiYW1lbmRlbWVudFRvSnNvbiIsImFtZW5kZW1lbnRDbGVhbkZpbGVQYXRoIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb2N1bWVudFNwbGl0UGF0aCIsImRvY3VtZW50RmlsZW5hbWUiLCJkb2N1bWVudFJhd0ZpbGVQYXRoIiwiZG9jdW1lbnRSYXdKc29uIiwiZG9jdW1lbnQiLCJkb2N1bWVudEpzb24iLCJkb2N1bWVudENsZWFuIiwidG9Eb2N1bWVudCIsImRvY3VtZW50Q2xlYW5Kc29uIiwiZG9jdW1lbnRUb0pzb24iLCJkb2N1bWVudENsZWFuRmlsZVBhdGgiLCJkb3NzaWVyU3BsaXRQYXRoIiwiZG9zc2llckZpbGVuYW1lIiwiZG9zc2llclJhd0ZpbGVQYXRoIiwiZG9zc2llclJhd0pzb24iLCJkb3NzaWVyIiwiZG9zc2llckpzb24iLCJkb3NzaWVyQ2xlYW4iLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llckNsZWFuSnNvbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uIiwiZG9zc2llckNsZWFuRmlsZVBhdGgiLCJTY3J1dGlucyIsInNjcnV0aW5zIiwic2NydXRpblNwbGl0UGF0aCIsInNjcnV0aW5GaWxlbmFtZSIsInNjcnV0aW5SYXdGaWxlUGF0aCIsInNjcnV0aW5SYXdKc29uIiwic2NydXRpbiIsInNjcnV0aW5Kc29uIiwic2NydXRpbkNsZWFuIiwidG9TY3J1dGluIiwic2NydXRpbkNsZWFuSnNvbiIsInNjcnV0aW5Ub0pzb24iLCJzY3J1dGluQ2xlYW5GaWxlUGF0aCIsIlF1ZXN0aW9ucyIsInF1ZXN0aW9ucyIsInF1ZXN0aW9uc1NwbGl0UGF0aCIsInF1ZXN0aW9uRmlsZW5hbWUiLCJxdWVzdGlvblJhd0ZpbGVQYXRoIiwicXVlc3Rpb25SYXdKc29uIiwicXVlc3Rpb24iLCJxdWVzdGlvbkpzb24iLCJxdWVzdGlvbkNsZWFuIiwidG9RdWVzdGlvbiIsInF1ZXN0aW9uQ2xlYW5Kc29uIiwicXVlc3Rpb25Ub0pzb24iLCJxdWVzdGlvbkNsZWFuRmlsZVBhdGgiLCJDb21wdGVzUmVuZHVzU2VhbmNlcyIsImNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwiY29tcHRlc1JlbmR1c1NwbGl0UGF0aCIsImNvbXB0ZVJlbmR1RmlsZW5hbWUiLCJjb21wdGVSZW5kdVJhd0ZpbGVQYXRoIiwiY29tcHRlUmVuZHVSYXdKc29uIiwiY29tcHRlUmVuZHUiLCJjb21wdGVSZW5kdUpzb24iLCJjb21wdGVSZW5kdUNsZWFuIiwidG9Db21wdGVSZW5kdSIsImNvbXB0ZVJlbmR1Q2xlYW5Kc29uIiwiY29tcHRlUmVuZHVUb0pzb24iLCJjb21wdGVSZW5kdUNsZWFuRmlsZVBhdGgiLCJzaWxlbnQiLCJyZWFkZGlyU3luYyIsInBhdGhuYW1lIiwicmVtb3ZlU3luYyIsInJlcG9zaXRvcnlEaXIiLCJzdWJkaXJlY3RvcmllcyIsImVycm9yIiwidWlkQnJhbmNoVXBkYXRlIiwicnVuIiwiY2hpbGRQcm9jZXNzIiwibWFpbiIsImV4aXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9jbGVhbl9yZW9yZ2FuaXplZF9kYXRhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5pbXBvcnQge1xuICBjbGVhbkFjdGV1cixcbiAgY2xlYW5BbWVuZGVtZW50LFxuICBjbGVhbkRvY3VtZW50T3JEaXZpc2lvbixcbiAgY2xlYW5Eb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgY2xlYW5PcmdhbmUsXG4gIGNsZWFuUmV1bmlvbixcbiAgY2xlYW5TY3J1dGluLFxuICBjbGVhblF1ZXN0aW9uLFxuICBjbGVhbkNvbXB0ZVJlbmR1LFxufSBmcm9tIFwiLi4vY2xlYW5lcnNcIlxuaW1wb3J0IHsgZGF0YXNldHMsIEVuYWJsZWREYXRhc2V0cywgZmlsdGVyQnlMZWdpc2xhdHVyZSB9IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyBleGlzdGluZ0RhdGVUb0pzb24sIHBhdGNoZWREYXRlVG9Kc29uIH0gZnJvbSBcIi4uL2RhdGVzXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCAqIGFzIGdpdCBmcm9tIFwiLi4vZ2l0XCJcbmltcG9ydCB7XG4gIEFjdGV1cixcbiAgQ29udmVydCBhcyBBY3RldXJzRXRPcmdhbmVzQ29udmVydCxcbiAgT3JnYW5lLFxufSBmcm9tIFwiLi4vdHlwZXMvYWN0ZXVyc19ldF9vcmdhbmVzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWdlbmRhc0NvbnZlcnQsIFJldW5pb24gfSBmcm9tIFwiLi4vdHlwZXMvYWdlbmRhc1wiXG5pbXBvcnQgeyBBbWVuZGVtZW50LCBDb252ZXJ0IGFzIEFtZW5kZW1lbnRzQ29udmVydCB9IGZyb20gXCIuLi90eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQge1xuICBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LFxuICBEb2N1bWVudCxcbiAgRG9zc2llclBhcmxlbWVudGFpcmUsXG59IGZyb20gXCIuLi90eXBlcy9kb3NzaWVyc19sZWdpc2xhdGlmc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFNjcnV0aW5zQ29udmVydCwgU2NydXRpbiB9IGZyb20gXCIuLi90eXBlcy9zY3J1dGluc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFF1ZXN0aW9uc0NvbnZlcnQsIFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3R5cGVzL3F1ZXN0aW9uc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIENvbXB0ZXNSZW5kdXNDb252ZXJ0LCBDb21wdGVSZW5kdSB9IGZyb20gXCIuLi90eXBlcy9kZWJhdHNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAge1xuICAgICAgYWxpYXM6IFwiQ1wiLFxuICAgICAgaGVscDogXCJjbG9uZSByZXBvc2l0b3JpZXMgZnJvbSBnaXZlbiBncm91cCAob3Igb3JnYW5pemF0aW9uKSBnaXQgVVJMXCIsXG4gICAgICBuYW1lOiBcImNsb25lXCIsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJjXCIsXG4gICAgICBoZWxwOiBcImNvbW1pdCBjbGVhbiBmaWxlc1wiLFxuICAgICAgbmFtZTogXCJjb21taXRcIixcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgfSxcbiAgICB7XG4gICAgICBhbGlhczogXCJkXCIsXG4gICAgICBoZWxwOiBcInNpbmdsZSBkYXRhc2V0IHRvIHJlb3JnYW5pemVcIixcbiAgICAgIG5hbWU6IFwiZGF0YXNldFwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwia1wiLFxuICAgICAgZGVmYXVsdFZhbHVlOiBbXCJBbGxcIl0sXG4gICAgICBoZWxwOiBcImNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmVvcmdhbml6ZVwiLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBuYW1lOiBcImNhdGVnb3JpZXNcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcImxcIixcbiAgICAgIGhlbHA6IFwibGVnaXNsYXR1cmVzIG9mIGNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmV0cmlldmU7IGxlYXZlIGVtcHR5IG9yIHVzZSAwIGZvciBhbGxcIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJsZWdpc2xhdHVyZVwiLFxuICAgICAgdHlwZTogTnVtYmVyLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwicFwiLFxuICAgICAgaGVscDogXCJwdWxsIHJlcG9zaXRvcmllcyBiZWZvcmUgcHJvY2VlZGluZ1wiLFxuICAgICAgbmFtZTogXCJwdWxsXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiclwiLFxuICAgICAgaGVscDogXCJwdXNoIGNvbW1pdCB0byBnaXZlbiByZW1vdGVcIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJyZW1vdGVcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInNcIixcbiAgICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgICBuYW1lOiBcInNpbGVudFwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHA6IFwiZG8gbm90IHJlc2V0IC0taGFyZCBhZnRlciBjb21taXQgdG8gc2F2ZSBJL08gaWYgdGhlIHdvcmtpbmcgdHJlZSBpcyB0byBiZSBkaXNjYXJkZWRcIixcbiAgICAgIG5hbWU6IFwibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwidlwiLFxuICAgICAgaGVscDogXCJ2ZXJib3NlIGxvZ3NcIixcbiAgICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgICBuYW1lOiBcImRhdGFEaXJcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICBdXG4gIGNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zLCB7XG4gICAgYXJndjogYXJndixcbiAgfSlcbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gY2xlYW5SZW9yZ2FuaXplZERhdGEob3B0aW9uczogYW55KTogbnVtYmVyIHtcbiAgY29uc3QgZGF0YURpcjogc3RyaW5nID0gb3B0aW9ucy5kYXRhRGlyXG5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gcGF0Y2hlZERhdGVUb0pzb25cblxuICBsZXQgZXhpdENvZGUgPSBvcHRpb25zLmNvbW1pdCA/IDEwIDogMFxuICBjb25zdCBnaXRHcm91cFVybCA9IG9wdGlvbnMuY2xvbmVcbiAgICA/IG9wdGlvbnMuY2xvbmUudHJpbSgpLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICA6IHVuZGVmaW5lZFxuXG4gIG9wdGlvbnMuY2F0ZWdvcmllcy5tYXAoKGRhdGFzZXROYW1lOiBzdHJpbmcpID0+XG4gICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKFxuICAgICAgKEVuYWJsZWREYXRhc2V0cyBhcyBhbnkgYXMgeyBbbmFtZTogc3RyaW5nXTogRW5hYmxlZERhdGFzZXRzIH0pW1xuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgXSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBVbmtub3duIG5hbWUgb2YgZGF0YXNldDogJHtkYXRhc2V0TmFtZX1gLFxuICAgICksXG4gIClcbiAgY29uc3QgZW5hYmxlZERhdGFzZXRzID0gb3B0aW9ucy5jYXRlZ29yaWVzLnJlZHVjZShcbiAgICAoZW5hYmxlZERhdGFzZXRzOiBFbmFibGVkRGF0YXNldHMsIGRhdGFzZXROYW1lOiBzdHJpbmcpOiBFbmFibGVkRGF0YXNldHMgPT5cbiAgICAgIGVuYWJsZWREYXRhc2V0cyB8XG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgIEVuYWJsZWREYXRhc2V0cy5Ob25lLFxuICApXG5cbiAgbGV0IGNob3NlbkRhdGFzZXRzID0gZmlsdGVyQnlMZWdpc2xhdHVyZShkYXRhc2V0cywgb3B0aW9ucy5sZWdpc2xhdHVyZSlcblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGlmIChvcHRpb25zLnB1bGwpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCByZXNldCAtLWhhcmQgb3JpZ2luL21hc3RlcmAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgcHVsbCAtLXJlYmFzZWAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBmb3IgKGNvbnN0IGFjdGV1clNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIsIFtcImFjdGV1cnNcIl0pKSB7XG4gICAgICAgIGNvbnN0IGFjdGV1ckZpbGVuYW1lID0gYWN0ZXVyU3BsaXRQYXRoW2FjdGV1clNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFjdGV1ckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGV1clJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLmFjdGV1clNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7YWN0ZXVyUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoYWN0ZXVyUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGFjdGV1ciA9IEpTT04ucGFyc2UoYWN0ZXVyUmF3SnNvbilcbiAgICAgICAgY2xlYW5BY3RldXIoYWN0ZXVyKVxuICAgICAgICBjb25zdCBhY3RldXJKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShhY3RldXIsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGFjdGV1ckNsZWFuOiBBY3RldXIgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b0FjdGV1cihhY3RldXJKc29uKVxuICAgICAgICBjb25zdCBhY3RldXJDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQuYWN0ZXVyVG9Kc29uKGFjdGV1ckNsZWFuKVxuXG4gICAgICAgIGNvbnN0IGFjdGV1ckNsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uYWN0ZXVyU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGFjdGV1ckNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGFjdGV1ckNsZWFuRmlsZVBhdGgsIGFjdGV1ckNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBvcmdhbmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJvcmdhbmVzXCJdKSkge1xuICAgICAgICBjb25zdCBvcmdhbmVGaWxlbmFtZSA9IG9yZ2FuZVNwbGl0UGF0aFtvcmdhbmVTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFvcmdhbmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdhbmVSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5vcmdhbmVTcGxpdFBhdGgpXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICBDbGVhbmluZyBmaWxlOiAke29yZ2FuZVJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JnYW5lUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKG9yZ2FuZVJhd0ZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBvcmdhbmUgPSBKU09OLnBhcnNlKG9yZ2FuZVJhd0pzb24pXG4gICAgICAgIGNsZWFuT3JnYW5lKG9yZ2FuZSlcbiAgICAgICAgY29uc3Qgb3JnYW5lSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGdlbmVyYXRlZCBKU09OLlxuICAgICAgICBjb25zdCBvcmdhbmVDbGVhbjogT3JnYW5lID0gQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9PcmdhbmUob3JnYW5lSnNvbilcbiAgICAgICAgY29uc3Qgb3JnYW5lQ2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0Lm9yZ2FuZVRvSnNvbihvcmdhbmVDbGVhbilcblxuICAgICAgICBjb25zdCBvcmdhbmVDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLm9yZ2FuZVNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShvcmdhbmVDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhvcmdhbmVDbGVhbkZpbGVQYXRoLCBvcmdhbmVDbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgXCJOb3V2ZWxsZSBtb2lzc29uXCIsXG4gICAgICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgICAgIClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDAgJiYgZXJyb3JDb2RlICE9PSAwICYmIGVycm9yQ29kZSAhPT0gMTApXG4gICAgICAgICkge1xuICAgICAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcImFjdGV1cnNcIiwgXCJvcmdhbmVzXCJdKSAmJlxuICAgICAgICAoZXhpdENvZGUgPT09IDAgfHwgZXhpdENvZGUgPT09IDEwKVxuICAgICAgKSB7XG4gICAgICAgIGV4aXRDb2RlID0gMVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3QgcmV1bmlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IHJldW5pb25GaWxlbmFtZSA9IHJldW5pb25TcGxpdFBhdGhbcmV1bmlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIXJldW5pb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXVuaW9uUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4ucmV1bmlvblNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7cmV1bmlvblJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV1bmlvblJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhyZXVuaW9uUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHJldW5pb24gPSBKU09OLnBhcnNlKHJldW5pb25SYXdKc29uKVxuICAgICAgICBjbGVhblJldW5pb24ocmV1bmlvbilcbiAgICAgICAgY29uc3QgcmV1bmlvbkpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHJldW5pb24sIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IHJldW5pb25DbGVhbjogUmV1bmlvbiA9IEFnZW5kYXNDb252ZXJ0LnRvUmV1bmlvbihyZXVuaW9uSnNvbilcbiAgICAgICAgY29uc3QgcmV1bmlvbkNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBBZ2VuZGFzQ29udmVydC5yZXVuaW9uVG9Kc29uKHJldW5pb25DbGVhbilcblxuICAgICAgICBjb25zdCByZXVuaW9uQ2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5yZXVuaW9uU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKHJldW5pb25DbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXVuaW9uQ2xlYW5GaWxlUGF0aCwgcmV1bmlvbkNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdpdC5jb21taXRBbmRQdXNoKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICBcIk5vdXZlbGxlIG1vaXNzb25cIixcbiAgICAgICAgICBvcHRpb25zLnJlbW90ZSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV4aXRDb2RlID09PSAxMCAmJiBlcnJvckNvZGUgIT09IDEwKSB8fFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXhpdENvZGUgPSBlcnJvckNvZGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkgJiZcbiAgICAgICAgKGV4aXRDb2RlID09PSAwIHx8IGV4aXRDb2RlID09PSAxMClcbiAgICAgICkge1xuICAgICAgICBleGl0Q29kZSA9IDFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFtZW5kZW1lbnRzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFtZW5kZW1lbnRzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRGaWxlbmFtZSA9XG4gICAgICAgICAgYW1lbmRlbWVudFNwbGl0UGF0aFthbWVuZGVtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghYW1lbmRlbWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnRSYXdGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICAgIC4uLmFtZW5kZW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7YW1lbmRlbWVudFJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudFJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICBhbWVuZGVtZW50UmF3RmlsZVBhdGgsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgYW1lbmRlbWVudCA9IEpTT04ucGFyc2UoYW1lbmRlbWVudFJhd0pzb24pXG4gICAgICAgIGNsZWFuQW1lbmRlbWVudChhbWVuZGVtZW50KVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50SnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoYW1lbmRlbWVudCwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudENsZWFuOiBBbWVuZGVtZW50ID1cbiAgICAgICAgICBBbWVuZGVtZW50c0NvbnZlcnQudG9BbWVuZGVtZW50KGFtZW5kZW1lbnRKc29uKVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50Q2xlYW5Kc29uOiBzdHJpbmcgPVxuICAgICAgICAgIEFtZW5kZW1lbnRzQ29udmVydC5hbWVuZGVtZW50VG9Kc29uKGFtZW5kZW1lbnRDbGVhbilcblxuICAgICAgICBjb25zdCBhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5hbWVuZGVtZW50U3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGFtZW5kZW1lbnRDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhhbWVuZGVtZW50Q2xlYW5GaWxlUGF0aCwgYW1lbmRlbWVudENsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdpdC5jb21taXRBbmRQdXNoKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICBcIk5vdXZlbGxlIG1vaXNzb25cIixcbiAgICAgICAgICBvcHRpb25zLnJlbW90ZSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV4aXRDb2RlID09PSAxMCAmJiBlcnJvckNvZGUgIT09IDEwKSB8fFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXhpdENvZGUgPSBlcnJvckNvZGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkgJiZcbiAgICAgICAgKGV4aXRDb2RlID09PSAwIHx8IGV4aXRDb2RlID09PSAxMClcbiAgICAgICkge1xuICAgICAgICBleGl0Q29kZSA9IDFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IGRvY3VtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldFJhd0RpciwgW1wiZG9jdW1lbnRzXCJdKSkge1xuICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVuYW1lID0gZG9jdW1lbnRTcGxpdFBhdGhbZG9jdW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFkb2N1bWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50UmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgICAuLi5kb2N1bWVudFNwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtkb2N1bWVudFJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jdW1lbnRSYXdKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZG9jdW1lbnRSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBKU09OLnBhcnNlKGRvY3VtZW50UmF3SnNvbilcbiAgICAgICAgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24oZG9jdW1lbnQpXG4gICAgICAgIGNvbnN0IGRvY3VtZW50SnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnQsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGRvY3VtZW50Q2xlYW46IERvY3VtZW50ID1cbiAgICAgICAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0RvY3VtZW50KGRvY3VtZW50SnNvbilcbiAgICAgICAgY29uc3QgZG9jdW1lbnRDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQuZG9jdW1lbnRUb0pzb24oZG9jdW1lbnRDbGVhbilcblxuICAgICAgICBjb25zdCBkb2N1bWVudENsZWFuRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgLi4uZG9jdW1lbnRTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoZG9jdW1lbnRDbGVhbkZpbGVQYXRoKSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhkb2N1bWVudENsZWFuRmlsZVBhdGgsIGRvY3VtZW50Q2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRvc3NpZXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCBbXCJkb3NzaWVyc1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9zc2llckZpbGVuYW1lID0gZG9zc2llclNwbGl0UGF0aFtkb3NzaWVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9zc2llckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvc3NpZXJSYXdGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0UmF3RGlyLCAuLi5kb3NzaWVyU3BsaXRQYXRoKVxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgQ2xlYW5pbmcgZmlsZTogJHtkb3NzaWVyUmF3RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb3NzaWVyUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGRvc3NpZXJSYXdGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9zc2llciA9IEpTT04ucGFyc2UoZG9zc2llclJhd0pzb24pXG4gICAgICAgIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUoZG9zc2llcilcbiAgICAgICAgY29uc3QgZG9zc2llckpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRvc3NpZXIsIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbjogRG9zc2llclBhcmxlbWVudGFpcmUgPVxuICAgICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LnRvRG9zc2llclBhcmxlbWVudGFpcmUoZG9zc2llckpzb24pXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQuZG9zc2llclBhcmxlbWVudGFpcmVUb0pzb24oZG9zc2llckNsZWFuKVxuXG4gICAgICAgIGNvbnN0IGRvc3NpZXJDbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLmRvc3NpZXJTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoZG9zc2llckNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRvc3NpZXJDbGVhbkZpbGVQYXRoLCBkb3NzaWVyQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2l0LmNvbW1pdEFuZFB1c2goXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIFwiTm91dmVsbGUgbW9pc3NvblwiLFxuICAgICAgICAgIG9wdGlvbnMucmVtb3RlLFxuICAgICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDEwICYmIGVycm9yQ29kZSAhPT0gMTApIHx8XG4gICAgICAgICAgKGV4aXRDb2RlID09PSAwICYmIGVycm9yQ29kZSAhPT0gMCAmJiBlcnJvckNvZGUgIT09IDEwKVxuICAgICAgICApIHtcbiAgICAgICAgICBleGl0Q29kZSA9IGVycm9yQ29kZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCJkb2N1bWVudHNcIiwgXCJkb3NzaWVyc1wiXSkgJiZcbiAgICAgICAgKGV4aXRDb2RlID09PSAwIHx8IGV4aXRDb2RlID09PSAxMClcbiAgICAgICkge1xuICAgICAgICBleGl0Q29kZSA9IDFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlNjcnV0aW5zKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLnNjcnV0aW5zKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3Qgc2NydXRpblNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IHNjcnV0aW5GaWxlbmFtZSA9IHNjcnV0aW5TcGxpdFBhdGhbc2NydXRpblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIXNjcnV0aW5GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY3J1dGluUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldFJhd0RpciwgLi4uc2NydXRpblNwbGl0UGF0aClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7c2NydXRpblJhd0ZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NydXRpblJhd0pzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhzY3J1dGluUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHNjcnV0aW4gPSBKU09OLnBhcnNlKHNjcnV0aW5SYXdKc29uKVxuICAgICAgICBjbGVhblNjcnV0aW4oc2NydXRpbilcbiAgICAgICAgY29uc3Qgc2NydXRpbkpzb246IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHNjcnV0aW4sIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbjogU2NydXRpbiA9IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW4oc2NydXRpbkpzb24pXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbkpzb246IHN0cmluZyA9XG4gICAgICAgICAgU2NydXRpbnNDb252ZXJ0LnNjcnV0aW5Ub0pzb24oc2NydXRpbkNsZWFuKVxuXG4gICAgICAgIGNvbnN0IHNjcnV0aW5DbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLnNjcnV0aW5TcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoc2NydXRpbkNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHNjcnV0aW5DbGVhbkZpbGVQYXRoLCBzY3J1dGluQ2xlYW5Kc29uLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2l0LmNvbW1pdEFuZFB1c2goXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIFwiTm91dmVsbGUgbW9pc3NvblwiLFxuICAgICAgICAgIG9wdGlvbnMucmVtb3RlLFxuICAgICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDEwICYmIGVycm9yQ29kZSAhPT0gMTApIHx8XG4gICAgICAgICAgKGV4aXRDb2RlID09PSAwICYmIGVycm9yQ29kZSAhPT0gMCAmJiBlcnJvckNvZGUgIT09IDEwKVxuICAgICAgICApIHtcbiAgICAgICAgICBleGl0Q29kZSA9IGVycm9yQ29kZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbW1pdEFuZFB1c2hVaWQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBbXCIuXCJdKSAmJlxuICAgICAgICAoZXhpdENvZGUgPT09IDAgfHwgZXhpdENvZGUgPT09IDEwKVxuICAgICAgKSB7XG4gICAgICAgIGV4aXRDb2RlID0gMVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuUXVlc3Rpb25zKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLnF1ZXN0aW9ucykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9X25ldHRveWUuZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBmb3IgKGNvbnN0IHF1ZXN0aW9uc1NwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uRmlsZW5hbWUgPVxuICAgICAgICAgIHF1ZXN0aW9uc1NwbGl0UGF0aFtxdWVzdGlvbnNTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFxdWVzdGlvbkZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uUmF3RmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgICAuLi5xdWVzdGlvbnNTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7cXVlc3Rpb25SYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uUmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHF1ZXN0aW9uUmF3RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gSlNPTi5wYXJzZShxdWVzdGlvblJhd0pzb24pXG4gICAgICAgIGNsZWFuUXVlc3Rpb24ocXVlc3Rpb24pXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uSnNvbjogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocXVlc3Rpb24sIG51bGwsIDIpXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZ2VuZXJhdGVkIEpTT04uXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uQ2xlYW46IFF1ZXN0aW9uID1cbiAgICAgICAgICBRdWVzdGlvbnNDb252ZXJ0LnRvUXVlc3Rpb24ocXVlc3Rpb25Kc29uKVxuICAgICAgICBjb25zdCBxdWVzdGlvbkNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBRdWVzdGlvbnNDb252ZXJ0LnF1ZXN0aW9uVG9Kc29uKHF1ZXN0aW9uQ2xlYW4pXG5cbiAgICAgICAgY29uc3QgcXVlc3Rpb25DbGVhbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICAgIC4uLnF1ZXN0aW9uc1NwbGl0UGF0aCxcbiAgICAgICAgKVxuICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShxdWVzdGlvbkNsZWFuRmlsZVBhdGgpKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHF1ZXN0aW9uQ2xlYW5GaWxlUGF0aCwgcXVlc3Rpb25DbGVhbkpzb24sIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgICAgXCJOb3V2ZWxsZSBtb2lzc29uXCIsXG4gICAgICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgICAgIClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDAgJiYgZXJyb3JDb2RlICE9PSAwICYmIGVycm9yQ29kZSAhPT0gMTApXG4gICAgICAgICkge1xuICAgICAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29tbWl0QW5kUHVzaFVpZChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIFtcIi5cIl0pICYmXG4gICAgICAgIChleGl0Q29kZSA9PT0gMCB8fCBleGl0Q29kZSA9PT0gMTApXG4gICAgICApIHtcbiAgICAgICAgZXhpdENvZGUgPSAxXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Db21wdGVzUmVuZHVzU2VhbmNlcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5jb21wdGVzUmVuZHVzU2VhbmNlcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLnhtbFwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX1fbmV0dG95ZS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGZvciAoY29uc3QgY29tcHRlc1JlbmR1c1NwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXRSYXdEaXIpKSB7XG4gICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1RmlsZW5hbWUgPVxuICAgICAgICAgIGNvbXB0ZXNSZW5kdXNTcGxpdFBhdGhbY29tcHRlc1JlbmR1c1NwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWNvbXB0ZVJlbmR1RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcHRlUmVuZHVSYXdGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICAgIC4uLmNvbXB0ZXNSZW5kdXNTcGxpdFBhdGgsXG4gICAgICAgIClcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgIENsZWFuaW5nIGZpbGU6ICR7Y29tcHRlUmVuZHVSYXdGaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1UmF3SnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgIGNvbXB0ZVJlbmR1UmF3RmlsZVBhdGgsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgY29tcHRlUmVuZHUgPSBKU09OLnBhcnNlKGNvbXB0ZVJlbmR1UmF3SnNvbilcbiAgICAgICAgY2xlYW5Db21wdGVSZW5kdShjb21wdGVSZW5kdSlcbiAgICAgICAgY29uc3QgY29tcHRlUmVuZHVKc29uOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShjb21wdGVSZW5kdSwgbnVsbCwgMilcblxuICAgICAgICAvLyBWYWxpZGF0ZSBnZW5lcmF0ZWQgSlNPTi5cbiAgICAgICAgY29uc3QgY29tcHRlUmVuZHVDbGVhbjogQ29tcHRlUmVuZHUgPVxuICAgICAgICAgIENvbXB0ZXNSZW5kdXNDb252ZXJ0LnRvQ29tcHRlUmVuZHUoY29tcHRlUmVuZHVKc29uKVxuICAgICAgICBjb25zdCBjb21wdGVSZW5kdUNsZWFuSnNvbjogc3RyaW5nID1cbiAgICAgICAgICBDb21wdGVzUmVuZHVzQ29udmVydC5jb21wdGVSZW5kdVRvSnNvbihjb21wdGVSZW5kdUNsZWFuKVxuXG4gICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1Q2xlYW5GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICAuLi5jb21wdGVzUmVuZHVzU3BsaXRQYXRoLFxuICAgICAgICApXG4gICAgICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGNvbXB0ZVJlbmR1Q2xlYW5GaWxlUGF0aCkpXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoY29tcHRlUmVuZHVDbGVhbkZpbGVQYXRoLCBjb21wdGVSZW5kdUNsZWFuSnNvbiwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdpdC5jb21taXRBbmRQdXNoKFxuICAgICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgICBcIk5vdXZlbGxlIG1vaXNzb25cIixcbiAgICAgICAgICBvcHRpb25zLnJlbW90ZSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV4aXRDb2RlID09PSAxMCAmJiBlcnJvckNvZGUgIT09IDEwKSB8fFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXhpdENvZGUgPSBlcnJvckNvZGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgW1wiLlwiXSkgJiZcbiAgICAgICAgKGV4aXRDb2RlID09PSAwIHx8IGV4aXRDb2RlID09PSAxMClcbiAgICAgICkge1xuICAgICAgICBleGl0Q29kZSA9IDFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXN0b3JlIHN0YW5kYXJkIGNvbnZlcnNpb24gb2YgZGF0ZXMgdG8gSlNPTi5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZXhpc3RpbmdEYXRlVG9Kc29uXG5cbiAgcmV0dXJuIGV4aXRDb2RlXG59XG5cbmZ1bmN0aW9uIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWU6IHN0cmluZywgb3B0aW9uczogYW55KTogYW55IHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgY29uc29sZS5sb2coYENsZWFuaW5nIGRpcmVjdG9yeTogJHtkYXRhc2V0Q2xlYW5EaXJ94oCmYClcbiAgfVxuICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRDbGVhbkRpcilcbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpKSB7XG4gICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgcGF0aG5hbWUgPSBwYXRoLmpvaW4oZGF0YXNldENsZWFuRGlyLCBmaWxlbmFtZSlcbiAgICBmcy5yZW1vdmVTeW5jKHBhdGhuYW1lKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEFuZFB1c2hVaWQoXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgb3B0aW9uczogYW55LFxuICBzdWJkaXJlY3RvcmllczogYW55LFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIGdpdC51aWRCcmFuY2hVcGRhdGUoXG4gICAgICByZXBvc2l0b3J5RGlyLFxuICAgICAgc3ViZGlyZWN0b3JpZXMsXG4gICAgICBvcHRpb25zW1wibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCJdLFxuICAgIClcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiBvcHRpb25zLnJlbW90ZSB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2l0LnJ1bihyZXBvc2l0b3J5RGlyLCBgcHVzaCAtLXF1aWV0ICR7cmVtb3RlfSB1aWQ6dWlkYClcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIG1haW4oYXJndjogYW55KTogbnVtYmVyIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlQXJncyhhcmd2KVxuICByZXR1cm4gY2xlYW5SZW9yZ2FuaXplZERhdGEob3B0aW9ucylcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwiY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50c1wiKSlcbiAgcHJvY2Vzcy5leGl0KG1haW4ocHJvY2Vzcy5hcmd2KSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFDM0IsU0FBU0MsUUFBUSxRQUFRLGVBQWU7QUFDeEMsT0FBT0MsZUFBZSxNQUFNLG1CQUFtQjtBQUMvQyxPQUFPQyxFQUFFLE1BQU0sVUFBVTtBQUN6QixPQUFPQyxJQUFJLE1BQU0sTUFBTTtBQUFBLFNBR3JCQyxXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsdUJBQXVCLEVBQ3ZCQyx5QkFBeUIsRUFDekJDLFdBQVcsRUFDWEMsWUFBWSxFQUNaQyxZQUFZLEVBQ1pDLGFBQWEsRUFDYkMsZ0JBQWdCO0FBQUEsU0FFVEMsUUFBUSxFQUFFQyxlQUFlLEVBQUVDLG1CQUFtQjtBQUFBLFNBQzlDQyxrQkFBa0IsRUFBRUMsaUJBQWlCO0FBQUEsU0FDckNDLE9BQU87QUFBQSxPQUNULEtBQUtDLEdBQUc7QUFBQSxTQUdiQyxPQUFPLElBQUlDLHVCQUF1QjtBQUFBLFNBRzNCRCxPQUFPLElBQUlFLGNBQWM7QUFBQSxTQUNiRixP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
|
|
269
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImNsZWFuQWN0ZXVyIiwiY2xlYW5BbWVuZGVtZW50IiwiY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24iLCJjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiY2xlYW5PcmdhbmUiLCJjbGVhblJldW5pb24iLCJjbGVhblNjcnV0aW4iLCJjbGVhblF1ZXN0aW9uIiwiY2xlYW5Db21wdGVSZW5kdSIsImRhdGFzZXRzIiwiRW5hYmxlZERhdGFzZXRzIiwiZ2V0RW5hYmxlZERhdGFzZXRzIiwiZmlsdGVyQnlMZWdpc2xhdHVyZSIsImV4aXN0aW5nRGF0ZVRvSnNvbiIsInBhdGNoZWREYXRlVG9Kc29uIiwid2Fsa0RpciIsImdpdCIsIkNvbnZlcnQiLCJBY3RldXJzRXRPcmdhbmVzQ29udmVydCIsIkFnZW5kYXNDb252ZXJ0IiwiQW1lbmRlbWVudHNDb252ZXJ0IiwiRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQiLCJTY3J1dGluc0NvbnZlcnQiLCJRdWVzdGlvbnNDb252ZXJ0IiwiQ29tcHRlc1JlbmR1c0NvbnZlcnQiLCJjbG9uZU9wdGlvbiIsImNvbW1pdE9wdGlvbiIsInJlbW90ZU9wdGlvbiIsImxlZ2lzbGF0dXJlT3B0aW9uIiwiY2F0ZWdvcmllc09wdGlvbiIsImRhdGFEaXJEZWZhdWx0T3B0aW9uIiwic2lsZW50T3B0aW9uIiwidmVyYm9zZU9wdGlvbiIsInB1bGxPcHRpb24iLCJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJTdHJpbmciLCJCb29sZWFuIiwib3B0aW9ucyIsImNsb25lR2l0IiwiZ2l0R3JvdXBVcmwiLCJkYXRhc2V0TmFtZSIsImRhdGFEaXIiLCJ1bmRlZmluZWQiLCJjd2QiLCJlbnYiLCJwcm9jZXNzIiwiZW5jb2RpbmciLCJzdGRpbyIsImNvbW1pdEdpdCIsImRhdGFzZXRDbGVhbkRpciIsImV4aXRDb2RlIiwic3ViZGlyZWN0b3JpZXMiLCJjb21taXQiLCJlcnJvckNvZGUiLCJjb21taXRBbmRQdXNoIiwicmVtb3RlIiwiY29tbWl0QW5kUHVzaFVpZCIsImNsZWFuQW5kVmFsaWRhdGVEYXRhIiwiZGF0YSIsImNsZWFuZXIiLCJmcm9tSnNvbiIsInRvSnNvbiIsIm5vVmFsaWRhdGUiLCJqc29uRGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2YWxpZGF0ZWREYXRhIiwicHJvY2Vzc0ZpbGVzIiwiZGF0YXNldFJhd0RpciIsIndhbGtEaXJQYXJhbXMiLCJkYXRhQ29udmVydGVyIiwiZmlsZVBhdGhBcnJheSIsImZpbGVuYW1lIiwibGVuZ3RoIiwiZW5kc1dpdGgiLCJyYXdGaWxlUGF0aCIsImpvaW4iLCJyYXdKc29uIiwicmVhZEZpbGVTeW5jIiwidmVyYm9zZSIsImNvbnNvbGUiLCJsb2ciLCJwYXJzZSIsInZhbGlkYXRlRGF0YSIsImNsZWFuSnNvbiIsImNsZWFuRmlsZVBhdGgiLCJlbnN1cmVEaXJTeW5jIiwiZGlybmFtZSIsIndyaXRlRmlsZVN5bmMiLCJjbGVhblJlb3JnYW5pemVkRGF0YSIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJjbG9uZSIsInRyaW0iLCJyZXBsYWNlIiwiZW5hYmxlZERhdGFzZXRzIiwiY2F0ZWdvcmllcyIsImNob3NlbkRhdGFzZXRzIiwibGVnaXNsYXR1cmUiLCJBY3RldXJzRXRPcmdhbmVzIiwiZGF0YXNldCIsImFjdGV1cnNFdE9yZ2FuZXMiLCJiYXNlbmFtZSIsInB1bGwiLCJyZXNldEFuZFB1bGwiLCJhbmFseXplQW5kUmVtb3ZlIiwidG9BY3RldXIiLCJhY3RldXJUb0pzb24iLCJ0b09yZ2FuZSIsIm9yZ2FuZVRvSnNvbiIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwidG9SZXVuaW9uIiwicmV1bmlvblRvSnNvbiIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJ0b0FtZW5kZW1lbnQiLCJhbWVuZGVtZW50VG9Kc29uIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvc3NpZXJzTGVnaXNsYXRpZnMiLCJ0b0RvY3VtZW50IiwiZG9jdW1lbnRUb0pzb24iLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llclBhcmxlbWVudGFpcmVUb0pzb24iLCJTY3J1dGlucyIsInNjcnV0aW5zIiwidG9TY3J1dGluIiwic2NydXRpblRvSnNvbiIsIlF1ZXN0aW9ucyIsInF1ZXN0aW9ucyIsInRvUXVlc3Rpb24iLCJxdWVzdGlvblRvSnNvbiIsIkNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwiY29tcHRlc1JlbmR1c1NlYW5jZXMiLCJ0b0NvbXB0ZVJlbmR1IiwiY29tcHRlUmVuZHVUb0pzb24iLCJzaWxlbnQiLCJyZWFkZGlyU3luYyIsInBhdGhuYW1lIiwicmVtb3ZlU3luYyIsInJlcG9zaXRvcnlEaXIiLCJlcnJvciIsInVpZEJyYW5jaFVwZGF0ZSIsInJ1biIsImNoaWxkUHJvY2VzcyIsIm1haW4iLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHtcbiAgY2xlYW5BY3RldXIsXG4gIGNsZWFuQW1lbmRlbWVudCxcbiAgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24sXG4gIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUsXG4gIGNsZWFuT3JnYW5lLFxuICBjbGVhblJldW5pb24sXG4gIGNsZWFuU2NydXRpbixcbiAgY2xlYW5RdWVzdGlvbixcbiAgY2xlYW5Db21wdGVSZW5kdSxcbn0gZnJvbSBcIi4uL2NsZWFuZXJzXCJcbmltcG9ydCB7XG4gIGRhdGFzZXRzLFxuICBFbmFibGVkRGF0YXNldHMsXG4gIGdldEVuYWJsZWREYXRhc2V0cyxcbiAgZmlsdGVyQnlMZWdpc2xhdHVyZSxcbn0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHtcbiAgQWN0ZXVyLFxuICBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LFxuICBPcmdhbmUsXG59IGZyb20gXCIuLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzQ29udmVydCwgUmV1bmlvbiB9IGZyb20gXCIuLi90eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IEFtZW5kZW1lbnQsIENvbnZlcnQgYXMgQW1lbmRlbWVudHNDb252ZXJ0IH0gZnJvbSBcIi4uL3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7XG4gIENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQsXG4gIERvY3VtZW50LFxuICBEb3NzaWVyUGFybGVtZW50YWlyZSxcbn0gZnJvbSBcIi4uL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNDb252ZXJ0LCBTY3J1dGluIH0gZnJvbSBcIi4uL3R5cGVzL3NjcnV0aW5zXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgUXVlc3Rpb25zQ29udmVydCwgUXVlc3Rpb24gfSBmcm9tIFwiLi4vdHlwZXMvcXVlc3Rpb25zXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQ29tcHRlc1JlbmR1c0NvbnZlcnQsIENvbXB0ZVJlbmR1IH0gZnJvbSBcIi4uL3R5cGVzL2RlYmF0c1wiXG5pbXBvcnQge1xuICBjbG9uZU9wdGlvbixcbiAgY29tbWl0T3B0aW9uLFxuICByZW1vdGVPcHRpb24sXG4gIGxlZ2lzbGF0dXJlT3B0aW9uLFxuICBjYXRlZ29yaWVzT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAgc2lsZW50T3B0aW9uLFxuICB2ZXJib3NlT3B0aW9uLFxuICBwdWxsT3B0aW9uLFxufSBmcm9tIFwiLi9zaGFyZWQvY2xpX2hlbHBlcnNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAgY2xvbmVPcHRpb24sXG4gICAgY29tbWl0T3B0aW9uLFxuICAgIHJlbW90ZU9wdGlvbixcbiAgICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgICBjYXRlZ29yaWVzT3B0aW9uLFxuICAgIHNpbGVudE9wdGlvbixcbiAgICB2ZXJib3NlT3B0aW9uLFxuICAgIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICAgIHB1bGxPcHRpb24sXG4gICAge1xuICAgICAgYWxpYXM6IFwiZFwiLFxuICAgICAgaGVscDogXCJzaW5nbGUgZGF0YXNldCB0byByZW9yZ2FuaXplXCIsXG4gICAgICBuYW1lOiBcImRhdGFzZXRcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHA6IFwiZG8gbm90IHJlc2V0IC0taGFyZCBhZnRlciBjb21taXQgdG8gc2F2ZSBJL08gaWYgdGhlIHdvcmtpbmcgdHJlZSBpcyB0byBiZSBkaXNjYXJkZWRcIixcbiAgICAgIG5hbWU6IFwibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiVlwiLFxuICAgICAgaGVscDogXCJkb24ndCB2YWxpZGF0ZSBkYXRhXCIsXG4gICAgICBuYW1lOiBcIm5vLXZhbGlkYXRlXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBjbG9uZUdpdChcbiAgZ2l0R3JvdXBVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGF0YXNldE5hbWU6IHN0cmluZyxcbiAgZGF0YURpcjogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfV9uZXR0b3llLmdpdGAsIHtcbiAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRHaXQoXG4gIGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nLFxuICBvcHRpb25zOiBhbnksXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN1YmRpcmVjdG9yaWVzOiBhbnksXG4pOiBudW1iZXIge1xuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgIFwiTm91dmVsbGUgbW9pc3NvblwiLFxuICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgKVxuICAgIGlmIChcbiAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICApIHtcbiAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgfVxuICB9XG4gIGlmIChcbiAgICBjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgc3ViZGlyZWN0b3JpZXMpICYmXG4gICAgKGV4aXRDb2RlID09PSAwIHx8IGV4aXRDb2RlID09PSAxMClcbiAgKSB7XG4gICAgZXhpdENvZGUgPSAxXG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlXG59XG5cbmZ1bmN0aW9uIGNsZWFuQW5kVmFsaWRhdGVEYXRhPFQ+KFxuICBkYXRhOiBhbnksXG4gIGNsZWFuZXI6IChkYXRhOiBUKSA9PiB2b2lkLFxuICBmcm9tSnNvbjogKGpzb246IHN0cmluZykgPT4gVCxcbiAgdG9Kc29uOiAoZGF0YTogVCkgPT4gc3RyaW5nLFxuICBub1ZhbGlkYXRlOiBCb29sZWFuLFxuKTogc3RyaW5nIHtcbiAgY2xlYW5lcihkYXRhKVxuICBjb25zdCBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpXG4gIGlmICghbm9WYWxpZGF0ZSkge1xuICAgIHJldHVybiBqc29uRGF0YVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHZhbGlkYXRlZERhdGE6IFQgPSBmcm9tSnNvbihqc29uRGF0YSlcbiAgICByZXR1cm4gdG9Kc29uKHZhbGlkYXRlZERhdGEpXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0ZpbGVzPFQ+KFxuICBkYXRhc2V0UmF3RGlyOiBzdHJpbmcsXG4gIGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nLFxuICB3YWxrRGlyUGFyYW1zOiBhbnlbXSxcbiAgY2xlYW5lcjogYW55LFxuICBkYXRhQ29udmVydGVyOiB7IGZyb21Kc29uOiBhbnk7IHRvSnNvbjogYW55IH0sXG4gIG9wdGlvbnM6IGFueSxcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoQXJyYXkgb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCB3YWxrRGlyUGFyYW1zKSkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZVBhdGhBcnJheVtmaWxlUGF0aEFycmF5Lmxlbmd0aCAtIDFdXG4gICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSBjb250aW51ZVxuICAgIGNvbnN0IHJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLmZpbGVQYXRoQXJyYXkpXG4gICAgY29uc3QgcmF3SnNvbiA9IGZzLnJlYWRGaWxlU3luYyhyYXdGaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICBpZiAob3B0aW9ucy52ZXJib3NlKSBjb25zb2xlLmxvZyhgQ2xlYW5pbmcgZmlsZTogJHtyYXdGaWxlUGF0aH0uLi5gKVxuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhd0pzb24pXG4gICAgY29uc3QgdmFsaWRhdGVEYXRhID0gIW9wdGlvbnNbXCJuby12YWxpZGF0ZVwiXVxuICAgIGNvbnN0IGNsZWFuSnNvbiA9IGNsZWFuQW5kVmFsaWRhdGVEYXRhPFQ+KFxuICAgICAgZGF0YSxcbiAgICAgIGNsZWFuZXIsXG4gICAgICBkYXRhQ29udmVydGVyLmZyb21Kc29uLFxuICAgICAgZGF0YUNvbnZlcnRlci50b0pzb24sXG4gICAgICB2YWxpZGF0ZURhdGEsXG4gICAgKVxuICAgIGNvbnN0IGNsZWFuRmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldENsZWFuRGlyLCAuLi5maWxlUGF0aEFycmF5KVxuICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGNsZWFuRmlsZVBhdGgpKVxuICAgIGZzLndyaXRlRmlsZVN5bmMoY2xlYW5GaWxlUGF0aCwgY2xlYW5Kc29uLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFuUmVvcmdhbml6ZWREYXRhKG9wdGlvbnM6IGFueSk6IG51bWJlciB7XG4gIGNvbnN0IGRhdGFEaXI6IHN0cmluZyA9IG9wdGlvbnMuZGF0YURpclxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBwYXRjaGVkRGF0ZVRvSnNvblxuICBsZXQgZXhpdENvZGUgPSBvcHRpb25zLmNvbW1pdCA/IDEwIDogMFxuICBjb25zdCBnaXRHcm91cFVybCA9IG9wdGlvbnMuY2xvbmU/LnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gIGNvbnN0IGVuYWJsZWREYXRhc2V0cyA9IGdldEVuYWJsZWREYXRhc2V0cyhvcHRpb25zLmNhdGVnb3JpZXMpXG4gIGxldCBjaG9zZW5EYXRhc2V0cyA9IGZpbHRlckJ5TGVnaXNsYXR1cmUoZGF0YXNldHMsIG9wdGlvbnMubGVnaXNsYXR1cmUpXG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcblxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG4gICAgICBpZiAob3B0aW9ucy5wdWxsKSB7XG4gICAgICAgIGdpdC5yZXNldEFuZFB1bGwoZGF0YXNldENsZWFuRGlyKVxuICAgICAgfVxuXG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgcHJvY2Vzc0ZpbGVzPEFjdGV1cj4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW1wiYWN0ZXVyc1wiXSxcbiAgICAgICAgY2xlYW5BY3RldXIsXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9BY3RldXIsXG4gICAgICAgICAgdG9Kc29uOiBBY3RldXJzRXRPcmdhbmVzQ29udmVydC5hY3RldXJUb0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG4gICAgICBwcm9jZXNzRmlsZXM8T3JnYW5lPihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXCJvcmdhbmVzXCJdLFxuICAgICAgICBjbGVhbk9yZ2FuZSxcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b09yZ2FuZSxcbiAgICAgICAgICB0b0pzb246IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0Lm9yZ2FuZVRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcblxuICAgICAgZXhpdENvZGUgPSBjb21taXRHaXQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBleGl0Q29kZSwgW1xuICAgICAgICBcImFjdGV1cnNcIixcbiAgICAgICAgXCJvcmdhbmVzXCIsXG4gICAgICBdKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcblxuICAgICAgcHJvY2Vzc0ZpbGVzPFJldW5pb24+KFxuICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGVhblJldW5pb24sXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogQWdlbmRhc0NvbnZlcnQudG9SZXVuaW9uLFxuICAgICAgICAgIHRvSnNvbjogQWdlbmRhc0NvbnZlcnQucmV1bmlvblRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcblxuICAgICAgZXhpdENvZGUgPSBjb21taXRHaXQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBleGl0Q29kZSwgW1wiLlwiXSlcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFtZW5kZW1lbnRzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFtZW5kZW1lbnRzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcblxuICAgICAgcHJvY2Vzc0ZpbGVzPEFtZW5kZW1lbnQ+KFxuICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGVhbkFtZW5kZW1lbnQsXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogQW1lbmRlbWVudHNDb252ZXJ0LnRvQW1lbmRlbWVudCxcbiAgICAgICAgICB0b0pzb246IEFtZW5kZW1lbnRzQ29udmVydC5hbWVuZGVtZW50VG9Kc29uLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuXG4gICAgICBleGl0Q29kZSA9IGNvbW1pdEdpdChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIGV4aXRDb2RlLCBbXCIuXCJdKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuRG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5kb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcblxuICAgICAgcHJvY2Vzc0ZpbGVzPERvY3VtZW50PihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXCJkb2N1bWVudHNcIl0sXG4gICAgICAgIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uLFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbUpzb246IERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LnRvRG9jdW1lbnQsXG4gICAgICAgICAgdG9Kc29uOiBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC5kb2N1bWVudFRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcbiAgICAgIHByb2Nlc3NGaWxlczxEb3NzaWVyUGFybGVtZW50YWlyZT4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW1wiZG9zc2llcnNcIl0sXG4gICAgICAgIGNsZWFuRG9zc2llclBhcmxlbWVudGFpcmUsXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgICAgICAgICB0b0pzb246IERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LmRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuXG4gICAgICBleGl0Q29kZSA9IGNvbW1pdEdpdChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIGV4aXRDb2RlLCBbXG4gICAgICAgIFwiZG9jdW1lbnRzXCIsXG4gICAgICAgIFwiZG9zc2llcnNcIixcbiAgICAgIF0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5zY3J1dGlucykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG5cbiAgICAgIHByb2Nlc3NGaWxlczxTY3J1dGluPihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXSxcbiAgICAgICAgY2xlYW5TY3J1dGluLFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbUpzb246IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW4sXG4gICAgICAgICAgdG9Kc29uOiBTY3J1dGluc0NvbnZlcnQuc2NydXRpblRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcblxuICAgICAgZXhpdENvZGUgPSBjb21taXRHaXQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBleGl0Q29kZSwgW1wiLlwiXSlcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlF1ZXN0aW9ucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5xdWVzdGlvbnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuXG4gICAgICBwcm9jZXNzRmlsZXM8UXVlc3Rpb24+KFxuICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGVhblF1ZXN0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbUpzb246IFF1ZXN0aW9uc0NvbnZlcnQudG9RdWVzdGlvbixcbiAgICAgICAgICB0b0pzb246IFF1ZXN0aW9uc0NvbnZlcnQucXVlc3Rpb25Ub0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIGV4aXRDb2RlID0gY29tbWl0R2l0KGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgZXhpdENvZGUsIFtcIi5cIl0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Db21wdGVzUmVuZHVzU2VhbmNlcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5jb21wdGVzUmVuZHVzU2VhbmNlcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLnhtbFwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcblxuICAgICAgcHJvY2Vzc0ZpbGVzPENvbXB0ZVJlbmR1PihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXSxcbiAgICAgICAgY2xlYW5Db21wdGVSZW5kdSxcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBDb21wdGVzUmVuZHVzQ29udmVydC50b0NvbXB0ZVJlbmR1LFxuICAgICAgICAgIHRvSnNvbjogQ29tcHRlc1JlbmR1c0NvbnZlcnQuY29tcHRlUmVuZHVUb0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIGV4aXRDb2RlID0gY29tbWl0R2l0KGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgZXhpdENvZGUsIFtcIi5cIl0pXG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuXG4gIHJldHVybiBleGl0Q29kZVxufVxuXG5mdW5jdGlvbiBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IGFueSB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUubG9nKGBDbGVhbmluZyBkaXJlY3Rvcnk6ICR7ZGF0YXNldENsZWFuRGlyfeKApmApXG4gIH1cbiAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpXG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldENsZWFuRGlyKSkge1xuICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHBhdGhuYW1lID0gcGF0aC5qb2luKGRhdGFzZXRDbGVhbkRpciwgZmlsZW5hbWUpXG4gICAgZnMucmVtb3ZlU3luYyhwYXRobmFtZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBbmRQdXNoVWlkKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbiAgc3ViZGlyZWN0b3JpZXM6IGFueSxcbik6IGJvb2xlYW4ge1xuICBsZXQgZXJyb3IgPSBmYWxzZVxuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICBnaXQudWlkQnJhbmNoVXBkYXRlKFxuICAgICAgcmVwb3NpdG9yeURpcixcbiAgICAgIHN1YmRpcmVjdG9yaWVzLFxuICAgICAgb3B0aW9uc1tcIm5vLXJlc2V0LWFmdGVyLWNvbW1pdFwiXSxcbiAgICApXG4gICAgZm9yIChjb25zdCByZW1vdGUgb2Ygb3B0aW9ucy5yZW1vdGUgfHwgW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGdpdC5ydW4ocmVwb3NpdG9yeURpciwgYHB1c2ggLS1xdWlldCAke3JlbW90ZX0gdWlkOnVpZGApXG4gICAgICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBlcnJvclxufVxuXG5mdW5jdGlvbiBtYWluKGFyZ3Y6IGFueSk6IG51bWJlciB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUFyZ3MoYXJndilcbiAgcmV0dXJuIGNsZWFuUmVvcmdhbml6ZWREYXRhKG9wdGlvbnMpXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHByb2Nlc3MuYXJndlsxXS5lbmRzV2l0aChcImNsZWFuX3Jlb3JnYW5pemVkX2RhdGEudHNcIikpXG4gIHByb2Nlc3MuZXhpdChtYWluKHByb2Nlc3MuYXJndikpXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsUUFBUSxlQUFlO0FBQ3hDLE9BQU9DLGVBQWUsTUFBTSxtQkFBbUI7QUFDL0MsT0FBT0MsRUFBRSxNQUFNLFVBQVU7QUFDekIsT0FBT0MsSUFBSSxNQUFNLE1BQU07QUFBQSxTQUVyQkMsV0FBVyxFQUNYQyxlQUFlLEVBQ2ZDLHVCQUF1QixFQUN2QkMseUJBQXlCLEVBQ3pCQyxXQUFXLEVBQ1hDLFlBQVksRUFDWkMsWUFBWSxFQUNaQyxhQUFhLEVBQ2JDLGdCQUFnQjtBQUFBLFNBR2hCQyxRQUFRLEVBQ1JDLGVBQWUsRUFDZkMsa0JBQWtCLEVBQ2xCQyxtQkFBbUI7QUFBQSxTQUVaQyxrQkFBa0IsRUFBRUMsaUJBQWlCO0FBQUEsU0FDckNDLE9B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
|