yds-tool 1.1.4 → 2.0.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/bin/main.js +46 -130
- package/package.json +1 -1
- package/src/main.ts +47 -141
package/bin/main.js
CHANGED
|
@@ -139,125 +139,64 @@ class Main {
|
|
|
139
139
|
}`);
|
|
140
140
|
configFileCreated = true;
|
|
141
141
|
}
|
|
142
|
-
logger.info(`<<<<<<<<<<<<<<检测
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
yield execCmd(`${wget}
|
|
152
|
-
logger.info(
|
|
153
|
-
yield execCmd(`"${unzip}" "${gitZipFile}" -d "${dir}"`);
|
|
154
|
-
}
|
|
155
|
-
logger.info(`git 安装完成`);
|
|
156
|
-
}
|
|
157
|
-
logger.info(`<<<<<<<<<<<<<<检测git安装结束>>>>>>>>>>>>>>>>>`);
|
|
158
|
-
logger.info(`<<<<<<<<<<<<<<检测java安装开始>>>>>>>>>>>>>>>>>`);
|
|
159
|
-
const javaExists = yield vweb_core_1.util.cmd.exists('java');
|
|
160
|
-
logger.info(`检查是否安装了java >> ${javaExists ? '已安装' : '未安装'}`);
|
|
161
|
-
let javaHome = process.env.JAVA_HOME;
|
|
162
|
-
if (!javaExists) {
|
|
163
|
-
javaHome = `${dir}/jdk1.8.0_471`;
|
|
164
|
-
if (!fs.existsSync(javaHome)) {
|
|
165
|
-
logger.info('未找到java,准备安装java,开始下载jdk');
|
|
166
|
-
const jdkZipName = 'jdk-8u471-windows-x64.zip';
|
|
167
|
-
if (!fs.existsSync(`${dir}/${jdkZipName}`)) {
|
|
168
|
-
logger.info(`下载jdk 安装包 ${jdkZipName}`);
|
|
169
|
-
yield execCmd(`${wget} ${RS_URL}/${jdkZipName} -O "${dir}/${jdkZipName}"`);
|
|
170
|
-
logger.info(`下载jdk 安装包 ${dir}/${jdkZipName} 已完成`);
|
|
171
|
-
}
|
|
172
|
-
logger.info(`解压jdk 安装包 ${dir}/${jdkZipName}`);
|
|
173
|
-
yield execCmd(`"${unzip}" "${dir}/${jdkZipName}"`, dir);
|
|
174
|
-
logger.info(`jdk安装完成`);
|
|
142
|
+
logger.info(`<<<<<<<<<<<<<<检测YDS IDE安装>>>>>>>>>>>>>>>>>`);
|
|
143
|
+
const codeDir = `${dir}/yds-1.0.3`;
|
|
144
|
+
const devkitDir = `${codeDir}/devkit`;
|
|
145
|
+
if (!fs.existsSync(codeDir)) {
|
|
146
|
+
const codeZipName = 'yds-1.0.3-jdk-8-windows-x86_64.zip';
|
|
147
|
+
logger.info(`安装YDS IDE ${codeZipName}`);
|
|
148
|
+
const codeZipFile = `${dir}/${codeZipName}`;
|
|
149
|
+
if (!fs.existsSync(codeZipFile)) {
|
|
150
|
+
logger.info(`下载YDS IDE 安装包 ${codeZipFile}`);
|
|
151
|
+
yield execCmd(`${wget} https://yoncommunity.yonyoucloud.com/YDSDownload/Window/x64/${codeZipName} -O "${codeZipFile}"`);
|
|
152
|
+
logger.info(`下载YDS IDE 安装包 ${codeZipFile} 已完成`);
|
|
175
153
|
}
|
|
154
|
+
yield execCmd(`"${unzip}" "${codeZipFile}" -d "${codeDir}"`);
|
|
155
|
+
yield new Promise((resolve) => setTimeout(resolve, 5000));
|
|
176
156
|
}
|
|
177
|
-
|
|
178
|
-
logger.error('未找到java,请检查是否安装java并设置JAVA_HOME环境变量');
|
|
179
|
-
yield execCmd(`setx JAVA_HOME "${javaHome}" && set JAVA_HOME="${javaHome}"`);
|
|
180
|
-
process.env.JAVA_HOME = javaHome;
|
|
181
|
-
}
|
|
182
|
-
yield execCmd(`"${javaHome}/bin/java" -version`);
|
|
183
|
-
logger.info(`<<<<<<<<<<<<<<检测java安装结束>>>>>>>>>>>>>>>>>`);
|
|
157
|
+
logger.info(`<<<<<<<<<<<<<<YDS IDE 安装完成>>>>>>>>>>>>>>>>>`);
|
|
184
158
|
logger.info(`<<<<<<<<<<<<<<导入java证书开始>>>>>>>>>>>>>>>>>`);
|
|
159
|
+
let javaHome = `${devkitDir}/jdk8.0.452-win_x64`;
|
|
160
|
+
let keytoolCmd = `${javaHome}/bin/keytool`;
|
|
185
161
|
let certsFilename = 'lib/security/cacerts';
|
|
186
|
-
let certsFile = `${javaHome}/${certsFilename}`;
|
|
187
|
-
if (!fs.existsSync(certsFile)) {
|
|
188
|
-
certsFile = `${javaHome}/jre/${certsFilename}`;
|
|
189
|
-
}
|
|
162
|
+
let certsFile = `${javaHome}/jre/${certsFilename}`;
|
|
190
163
|
logger.info(`检查java证书目录 ${certsFile}`);
|
|
191
164
|
if (fs.existsSync(certsFile)) {
|
|
192
|
-
const keytoolCmd = `"${javaHome}/bin/keytool"`;
|
|
193
165
|
try {
|
|
194
|
-
yield execCmd(
|
|
166
|
+
yield execCmd(`"${keytoolCmd}" -list -v -keystore "${certsFile}" -storepass changeit --alias yyrd`);
|
|
195
167
|
logger.info(`yyrd.crt 证书已存在`);
|
|
196
168
|
}
|
|
197
169
|
catch (e) {
|
|
198
170
|
logger.info(`导入 yyrd.crt 证书到java ${certsFile}`);
|
|
199
|
-
yield execCmd(
|
|
171
|
+
yield execCmd(`"${keytoolCmd}" -importcert -file "${path.join(__dirname, '../yyrd.crt')}" -keystore "${certsFile}" -storepass changeit -noprompt --alias yyrd`);
|
|
200
172
|
logger.info(`yyrd.crt 证书导入完成`);
|
|
201
173
|
}
|
|
202
174
|
}
|
|
203
175
|
logger.info(`<<<<<<<<<<<<<<导入java证书结束>>>>>>>>>>>>>>>>>`);
|
|
204
176
|
logger.info(`<<<<<<<<<<<<<<检测maven安装开始>>>>>>>>>>>>>>>>>`);
|
|
205
|
-
const
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
if (!mavenExists) {
|
|
209
|
-
if (!fs.existsSync(mavenHome)) {
|
|
210
|
-
const mavenZipName = 'maven-3.8.6.zip';
|
|
211
|
-
logger.info(`安装maven ${mavenZipName}`);
|
|
212
|
-
const mavenZipFile = `${dir}/${mavenZipName}`;
|
|
213
|
-
if (!fs.existsSync(mavenZipFile)) {
|
|
214
|
-
logger.info(`下载maven 安装包 ${mavenZipFile}`);
|
|
215
|
-
yield execCmd(`${wget} ${RS_URL}/${mavenZipName} -O "${mavenZipFile}"`);
|
|
216
|
-
logger.info(`下载maven 安装包 ${mavenZipFile} 已完成`);
|
|
217
|
-
}
|
|
218
|
-
logger.info(`解压安装包 ${mavenZipFile}`);
|
|
219
|
-
yield execCmd(`"${unzip}" "${mavenZipFile}" -d "${dir}"`);
|
|
220
|
-
logger.info(`maven 安装完成`);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
else if (!fs.existsSync(`${dir}/settings.xml`)) {
|
|
177
|
+
const mavenHome = `${devkitDir}/apache-maven-3.9.9`;
|
|
178
|
+
const settingsFile = `${dir}/settings.xml`;
|
|
179
|
+
if (!fs.existsSync(settingsFile)) {
|
|
224
180
|
logger.info(`下载settings.xml`);
|
|
225
181
|
yield execCmd(`${wget} ${RS_URL}/settings.xml`);
|
|
226
182
|
logger.info(`下载settings.xml完成`);
|
|
227
183
|
}
|
|
184
|
+
const mavenSettingsFile = path.resolve(mavenHome, 'conf/settings.xml');
|
|
185
|
+
fs.rmSync(mavenSettingsFile);
|
|
186
|
+
fs.cpSync(settingsFile, mavenSettingsFile);
|
|
228
187
|
logger.info(`<<<<<<<<<<<<<<检测maven安装完成>>>>>>>>>>>>>>>>>`);
|
|
229
188
|
logger.info(`<<<<<<<<<<<<<<初始化node环境 >>>>>>>>>>>>>>>>>`);
|
|
230
189
|
yield execCmd('npm install -g typescript --registry=https://registry.npmmirror.com');
|
|
231
190
|
logger.info(`<<<<<<<<<<<<<<初始化node环境完成>>>>>>>>>>>>>>>>>`);
|
|
232
|
-
logger.info(`<<<<<<<<<<<<<<检测YDS IDE安装>>>>>>>>>>>>>>>>>`);
|
|
233
|
-
const codeDir = `${dir}/yds-1.0.3`;
|
|
234
|
-
if (!fs.existsSync(codeDir)) {
|
|
235
|
-
const codeZipName = 'yds-1.0.3-jdk-8-windows-x86_64.zip';
|
|
236
|
-
logger.info(`安装YDS IDE ${codeZipName}`);
|
|
237
|
-
const codeZipFile = `${dir}/${codeZipName}`;
|
|
238
|
-
if (!fs.existsSync(codeZipFile)) {
|
|
239
|
-
logger.info(`下载YDS IDE 安装包 ${codeZipFile}`);
|
|
240
|
-
yield execCmd(`${wget} https://yoncommunity.yonyoucloud.com/YDSDownload/Window/x64/${codeZipName} -O "${codeZipFile}"`);
|
|
241
|
-
logger.info(`下载YDS IDE 安装包 ${codeZipFile} 已完成`);
|
|
242
|
-
}
|
|
243
|
-
yield execCmd(`"${unzip}" "${codeZipFile}" -d "${codeDir}"`);
|
|
244
|
-
yield new Promise((resolve) => setTimeout(resolve, 5000));
|
|
245
|
-
}
|
|
246
|
-
logger.info(`<<<<<<<<<<<<<<YDS IDE 安装完成>>>>>>>>>>>>>>>>>`);
|
|
247
191
|
logger.info(`<<<<<<<<<<<<<<初始化YDS IDE 全局配置>>>>>>>>>>>>>>>>>`);
|
|
248
192
|
const settingsJson = `${codeDir}/Code/data/user-data/User/settings.json`;
|
|
249
193
|
let settingsJsonObj = {};
|
|
250
194
|
if (fs.existsSync(settingsJson)) {
|
|
251
195
|
settingsJsonObj = JSON.parse(fs.readFileSync(settingsJson).toString('utf-8'));
|
|
252
196
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
}
|
|
256
|
-
let settingXml = path.resolve(`${dir}/settings.xml`);
|
|
257
|
-
if (!fs.existsSync(settingXml)) {
|
|
258
|
-
settingXml = path.resolve(`${mavenHome}/conf/settings.xml`);
|
|
259
|
-
settingsJsonObj['maven.executable.path'] = path.resolve(`${mavenHome}/bin/mvn.cmd`);
|
|
260
|
-
}
|
|
197
|
+
settingsJsonObj["java.configuration.runtimes"] = [{ "name": "JavaSE-1.8", "path": javaHome, "default": true }];
|
|
198
|
+
let settingXml = path.resolve(settingsFile);
|
|
199
|
+
settingsJsonObj['maven.executable.path'] = path.resolve(`${mavenHome}/bin/mvn.cmd`);
|
|
261
200
|
settingsJsonObj["java.configuration.maven.globalSettings"] = settingXml;
|
|
262
201
|
settingsJsonObj["java.configuration.maven.userSettings"] = settingXml;
|
|
263
202
|
settingsJsonObj["maven.settingsFile"] = settingXml;
|
|
@@ -289,6 +228,12 @@ class Main {
|
|
|
289
228
|
.description('启动制盘环境,catalog表示需要制盘的模块,对应配置文件中catalogs的key值,用于指定需要出盘的信息,workdir表示制盘工作目录,如果不指定则使用当前目录')
|
|
290
229
|
.action((catalog_1, ...args_1) => __awaiter(this, [catalog_1, ...args_1], void 0, function* (catalog, workdir = path.resolve(process.cwd()), options) {
|
|
291
230
|
const dir = path.resolve(workdir);
|
|
231
|
+
const ideDir = path.resolve(dir, 'yds-1.0.3');
|
|
232
|
+
const devKitDir = path.resolve(ideDir, 'devkit');
|
|
233
|
+
if (!fs.existsSync(ideDir)) {
|
|
234
|
+
logger.error(`未找到IDE ${ideDir}, 请先执行 init 初始化制盘环境`);
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
292
237
|
let ydsJson;
|
|
293
238
|
if (options.file) {
|
|
294
239
|
ydsJson = path.resolve(options.file);
|
|
@@ -305,43 +250,13 @@ class Main {
|
|
|
305
250
|
}
|
|
306
251
|
}
|
|
307
252
|
logger.info(`开始制盘 ${catalog} 工作目录:${dir}`);
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
gitCmd = `${dir}/git-for-windows/bin/git.exe`;
|
|
313
|
-
if (!fs.existsSync(gitCmd)) {
|
|
314
|
-
logger.error(`未找到git命令 ${gitCmd}, 请先执行 init 初始化制盘环境`);
|
|
315
|
-
process.exit(1);
|
|
316
|
-
}
|
|
317
|
-
gitCmd = `"${gitCmd}"`;
|
|
318
|
-
}
|
|
319
|
-
let settingXml = path.resolve(`${dir}/settings.xml`);
|
|
320
|
-
let mvnCmd = 'mvn';
|
|
321
|
-
let mavenHome = `${dir}/maven-3.8.6`;
|
|
322
|
-
if (!fs.existsSync(mavenHome)) {
|
|
323
|
-
let mvnExists = yield vweb_core_1.util.cmd.exists(mvnCmd);
|
|
324
|
-
if (!mvnExists) {
|
|
325
|
-
logger.error(`未找到mvn命令 ${mvnCmd}, 请先执行 init 初始化制盘环境`);
|
|
326
|
-
process.exit(1);
|
|
327
|
-
}
|
|
328
|
-
if (!fs.existsSync(settingXml)) {
|
|
329
|
-
logger.warn(`未找到maven配置文件 ${settingXml}, 下载settings.xml文件`);
|
|
330
|
-
yield execCmd(`${wget} ${RS_URL}/settings.xml`, dir);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
mvnCmd = `"${mavenHome}/bin/mvn.cmd"`;
|
|
335
|
-
settingXml = `${mavenHome}/conf/settings.xml`;
|
|
336
|
-
}
|
|
337
|
-
let idePath = `${dir}/yds-1.0.3`;
|
|
338
|
-
if (!fs.existsSync(idePath)) {
|
|
339
|
-
logger.error(`未找到IDE ${idePath}, 请先执行 init 初始化制盘环境`);
|
|
340
|
-
process.exit(1);
|
|
341
|
-
}
|
|
342
|
-
logger.info(`制盘环境检测完成`);
|
|
253
|
+
const settingXml = path.resolve(dir, 'settings.xml');
|
|
254
|
+
const mvnCmd = path.resolve(devKitDir, 'apache-maven-3.9.9/bin/mvn.cmd');
|
|
255
|
+
const gitCmd = `${devKitDir}/Git/bin/git.exe`;
|
|
256
|
+
logger.info(`Maven命令: ${mvnCmd} Settings:${settingXml} Git:${gitCmd}`);
|
|
343
257
|
let ydsJsonStr = fs.readFileSync(ydsJson).toString('utf-8');
|
|
344
258
|
ydsJsonStr = ydsJsonStr.replace(/^#.*/gm, '');
|
|
259
|
+
logger.info(`检查配置文件 ${ydsJson} 是否完整-开始`);
|
|
345
260
|
let config;
|
|
346
261
|
const checkConfigError = () => {
|
|
347
262
|
logger.error(`配置文件 ${ydsJson} 格式错误 参考示例:${confEg}`);
|
|
@@ -366,6 +281,7 @@ class Main {
|
|
|
366
281
|
logger.error(`配置文件 ${ydsJson} catalogs.${catalog}.hrcpe 或 catalogs.${catalog}.fecode 字段缺失`);
|
|
367
282
|
process.exit(1);
|
|
368
283
|
}
|
|
284
|
+
logger.info(`检查配置文件 ${ydsJson} 是否完整-结束`);
|
|
369
285
|
const namespace = `${dir}/${catalog}`;
|
|
370
286
|
if (!fs.existsSync(namespace)) {
|
|
371
287
|
logger.info(`创建目录 ${namespace}`);
|
|
@@ -381,7 +297,7 @@ class Main {
|
|
|
381
297
|
logger.info(`开始拉取后端服务仓库 ${hrcpeUrl}`);
|
|
382
298
|
if (fs.existsSync(`${namespace}/.git`)) {
|
|
383
299
|
logger.info(`目录 ${namespace} 已存在,开始更新仓库`);
|
|
384
|
-
yield execCmd(
|
|
300
|
+
yield execCmd(`"${gitCmd}" pull`, namespace);
|
|
385
301
|
}
|
|
386
302
|
else {
|
|
387
303
|
logger.info(`目录 ${namespace} 不存在,开始创建仓库`);
|
|
@@ -431,7 +347,7 @@ class Main {
|
|
|
431
347
|
logger.info('初始化项目maven环境');
|
|
432
348
|
let mvnConfigDir = `${namespace}/.mvn`;
|
|
433
349
|
if (!fs.existsSync(mvnConfigDir)) {
|
|
434
|
-
yield execCmd(
|
|
350
|
+
yield execCmd(`"${mvnCmd}" -N io.takari:maven:wrapper -Dmaven=3.8.6`, namespace);
|
|
435
351
|
}
|
|
436
352
|
let configFile = `${mvnConfigDir}/maven.config`;
|
|
437
353
|
if (fs.existsSync(configFile)) {
|
|
@@ -439,9 +355,9 @@ class Main {
|
|
|
439
355
|
}
|
|
440
356
|
fs.writeFileSync(`${mvnConfigDir}/maven.config`, `-s\n${settingXml}\n-Dmaven.wagon.http.ssl.insecure=true\n-Dmaven.wagon.http.ssl.allowall=true`);
|
|
441
357
|
logger.info(`当前maven信息`);
|
|
442
|
-
yield execCmd(
|
|
358
|
+
yield execCmd(`"${mvnCmd}" --version`, namespace);
|
|
443
359
|
logger.info('项目maven清理');
|
|
444
|
-
yield execCmd(
|
|
360
|
+
yield execCmd(`"${mvnCmd}" clean compile install -DskipTests`, `${namespace}/${domainKey}-be`);
|
|
445
361
|
logger.info('处理前端构建,增加构建文件');
|
|
446
362
|
let feDir = `${namespace}/${domainKey}-fe`;
|
|
447
363
|
let feBuildJs = `${feDir}/build.js`;
|
|
@@ -511,7 +427,7 @@ class Main {
|
|
|
511
427
|
fs.rmSync(gitZipFile);
|
|
512
428
|
}
|
|
513
429
|
logger.info('启动IDE');
|
|
514
|
-
yield execCmd(`"${
|
|
430
|
+
yield execCmd(`"${ideDir}/Code/bin/code" --no-sandbox --log debug --goto "${ideDir}/Code/data/user-data/User/settings.json" "${namespace}"`);
|
|
515
431
|
yield new Promise(resolve => setTimeout(resolve, 3000));
|
|
516
432
|
logger.info('已启动IDE,点击左侧菜单选择“YDS”,请按照文档说明进行制盘操作');
|
|
517
433
|
})).hook('postAction', () => process.exit(0));
|
|
@@ -519,4 +435,4 @@ class Main {
|
|
|
519
435
|
}
|
|
520
436
|
}
|
|
521
437
|
exports.default = Main;
|
|
522
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQWtDO0FBQ2xDLGlEQUFtQztBQUNuQyx5Q0FBOEM7QUFDOUMsZ0RBQWtDO0FBQ2xDLGtFQUFvRDtBQUNwRCw0Q0FBOEI7QUFDOUIsNENBQThCO0FBQzlCLG1DQUFpQztBQUVqQyxNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztBQUMxQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN2QyxNQUFNLE1BQU0sR0FBRyw2QkFBNkIsQ0FBQztBQUU3QyxNQUFNLE1BQU0sR0FBVyx5QkFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV0RCxNQUFNLE9BQU8sR0FBRyxDQUFPLE9BQWUsRUFBRSxHQUFZLEVBQUUsRUFBRTtJQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRCxJQUFJLEtBQUssR0FBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDeEIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7UUFDNUIsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPO1FBQ3RCLE9BQU8sRUFBRSxDQUFDO1FBQ1YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDbkIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLE9BQU8saUJBQWlCLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFBO0FBQ3hFLENBQUMsQ0FBQSxDQUFBO0FBRUQsTUFBTSxRQUFR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QUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZELEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDekIsQ0FBQztZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckIsTUFBTSxPQUFPLENBQUMsSUFBSSxPQUFPLG9EQUFvRCxPQUFPLDZDQUE2QyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBRS9JLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDdkQsTUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakQsbUJBQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQy9CLENBQUM7Q0FDSjtBQTVkRCx1QkE0ZEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3Byb2dyYW19IGZyb20gXCJjb21tYW5kZXJcIjtcclxuaW1wb3J0ICogYXMgcHJvY2VzcyBmcm9tIFwicHJvY2Vzc1wiO1xyXG5pbXBvcnQge0xvZ2dlckZhY3RvcnksIHV0aWx9IGZyb20gXCJ2d2ViLWNvcmVcIjtcclxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XHJcbmltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xyXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xyXG5pbXBvcnQgKiBhcyBvcyBmcm9tICdub2RlOm9zJztcclxuaW1wb3J0IHtyYW5kb21VVUlEfSBmcm9tICdjcnlwdG8nXHJcblxyXG5jb25zdCBkb21haW5LZXkgPSAncC1oY2MtaTAwMC1wMDBhLWhyY3BlJztcclxuY29uc3QgcGtnID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XHJcbmNvbnN0IFJTX1VSTCA9ICdodHRwczovL2Rmcy56aGlwZXIuY29tL3YzcjYnO1xyXG5cclxuY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcignWURTJyk7XHJcblxyXG5jb25zdCBleGVjQ21kID0gYXN5bmMgKGNvbW1hbmQ6IHN0cmluZywgY3dkPzogc3RyaW5nKSA9PiB7XHJcbiAgICBsb2dnZXIuaW5mbyhg5omn6KGM5ZG95LukICR7Y29tbWFuZH0gJHtjd2QgPyBg77yM5omn6KGM55uu5b2V5Li6JHtjd2R9YCA6Jyd9YCk7XHJcbiAgICBsZXQgc3RhcnQgID0gRGF0ZS5ub3coKTtcclxuICAgIGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoY29tbWFuZCwge1xyXG4gICAgICAgIGN3ZCwgZW5jb2Rpbmc6ICd1dGYtOCcsXHJcbiAgICAgICAgdGltZW91dDogMCwgLy8g6K6+5Li65LiN6L+H5pyf77yM5LiL6L296YCf5bqm6L+H5oWi5Lya5a+86Ie06LaF5pe2XHJcbiAgICAgICAgc3RkaW86IFswLCAxLCAyXVxyXG4gICAgfSk7XHJcbiAgICBsb2dnZXIuaW5mbyhg5omn6KGM5ZG95LukICR7Y29tbWFuZH0g6ICX5pe2IFxceDFCWzM0bSA8JHtEYXRlLm5vdygpIC0gc3RhcnR9bXM+YClcclxufVxyXG5cclxuY29uc3QgcGxhdGZvcm0gPSBvcy5wbGF0Zm9ybSgpXHJcbmlmIChwbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xyXG4gICAgbG9nZ2VyLmVycm9yKCflvZPliY3lt6Xlhbfku4XmlK/mjIF3aW5kb3dz57O757ufJyk7XHJcbiAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbn1cclxuXHJcbmNvbnN0IGlzQWRtaW4gPSAoKSA9PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIOWwneivleaJp+ihjOS4gOS4quWPquacieeuoeeQhuWRmOaJjeiDvei/kOihjOeahOWRveS7pFxyXG4gICAgICAgIC8vIOS9v+eUqCA+bnVsIDI+JjEg5p2l5oqR5Yi26L6T5Ye6XHJcbiAgICAgICAgY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnbmV0IHNlc3Npb24gPm51bCAyPiYxJyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIOaIkOWKn+aJp+ihjFxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyDmiafooYzlpLHotKXvvIzmnYPpmZDkuI3otrNcclxuICAgIH1cclxufVxyXG5cclxubGV0IHdnZXQgPSBwYXRoLmpvaW4oX19kaXJuYW1lICwnLi4vd2dldC5leGUnKTtcclxubGV0IHppcCA9IHBhdGguam9pbihfX2Rpcm5hbWUgLCcuLi96aXAuZXhlJyk7XHJcbmxldCB1bnppcCA9IHBhdGguam9pbihfX2Rpcm5hbWUgLCcuLi91bnppcC5leGUnKTtcclxuXHJcbnByb2dyYW0ubmFtZShcInlkc1wiKVxyXG4gICAgLnVzYWdlKFwiW2NvbW1hbmRdIFtvcHRpb25zXVwiKVxyXG4gICAgLmRlc2NyaXB0aW9uKFwieWRzIOWItuebmOW3peWFtyDlpoLmnpzlkb3ku6Tlj4LmlbDkuK3lrZjlnKjnqbrmoLwg5L2/55So5Y+M5byV5Y+3XFxcIlxcXCLljIXoo7lcIilcclxuICAgIC52ZXJzaW9uKGB5ZHMgJHtwa2cudmVyc2lvbn1gKTtcclxuXHJcbnR5cGUgTWljcm9TZXJ2aWNlID0gJ2hyY3BlJyB8ICdmZWNvZGUnO1xyXG5cclxudHlwZSBHaXQgPSB7XHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIGJyYW5jaDogc3RyaW5nXHJcbn1cclxuXHJcbnR5cGUgWWRzQ29uZmlnID0ge1xyXG4gICAgaG9zdHM6IEFycmF5PHN0cmluZz47XHJcbiAgICBnaXQ6IFJlY29yZDxNaWNyb1NlcnZpY2UsIHN0cmluZz47XHJcbiAgICBjYXRhbG9nczoge1xyXG4gICAgICAgIFtjYXRhbG9nOiBzdHJpbmddOiBSZWNvcmQ8TWljcm9TZXJ2aWNlLCBzdHJpbmcgfCBHaXQ+XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZFZyA9IGB7XHJcbiAgICBob3N0cz86IEFycmF5PHN0cmluZz47XHJcbiAgICBnaXQ6IFJlY29yZDwnaHJjcGUnIHwgJ2ZlY29kZScsIHN0cmluZz47XHJcbiAgICBjYXRhbG9nczoge1xyXG4gICAgICAgIFtjYXRhbG9nOiBzdHJpbmddOiBSZWNvcmQ8J2hyY3BlJyB8ICdmZWNvZGUnLCBzdHJpbmcgfCB7IHVybDogc3RyaW5nLCBicmFuY2g6IHN0cmluZyB9PlxyXG4gICAgfVxyXG59YFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFpbiB7XHJcblxyXG4gICAgc3RhcnR1cCgpIHtcclxuICAgICAgICBwcm9ncmFtXHJcbiAgICAgICAgICAgIC5jb21tYW5kKCdjbGVhbiBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAudXNhZ2UoJ2NsZWFuIFt3b3JrZGlyXScpXHJcbiAgICAgICAgICAgIC5kZXNjcmlwdGlvbign5riF55CG5Yi255uY5bel5L2c55uu5b2VLCB3b3JrZGly6KGo56S65Yi255uY5bel5L2c55uu5b2V77yM5aaC5p6c5LiN5oyH5a6a5YiZ5L2/55So5b2T5YmN55uu5b2VJylcclxuICAgICAgICAgICAgLmFjdGlvbihhc3luYyAod29ya2Rpcjogc3RyaW5nID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUod29ya2Rpcik7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5riF55CG5Yi255uY5bel5L2c55uu5b2VICR7ZGlyfWApO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBmcy5yZWFkZGlyU3luYyhkaXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVTdGF0ID0gZnMuc3RhdFN5bmMoZmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMucm1TeW5jKGZpbGUsIHtyZWN1cnNpdmU6IGZpbGVTdGF0LmlzRGlyZWN0b3J5KCl9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDliLbnm5jlt6XkvZznm67lvZXmuIXnkIblrozmiJBgKTtcclxuICAgICAgICAgICAgfSkuaG9vaygncG9zdEFjdGlvbicsICgpID0+IHByb2Nlc3MuZXhpdCgwKSk7XHJcblxyXG4gICAgICAgIHByb2dyYW1cclxuICAgICAgICAgICAgLmNvbW1hbmQoJ2luaXQgW3dvcmtkaXJdJylcclxuICAgICAgICAgICAgLnVzYWdlKCdpbml0IFt3b3JrZGlyXScpXHJcbiAgICAgICAgICAgIC5kZXNjcmlwdGlvbign5Yid5aeL5YyWWURT5Yi255uY546v5aKDLCB3b3JrZGly6KGo56S65Yi255uY5bel5L2c55uu5b2V77yM5aaC5p6c5LiN5oyH5a6a5YiZ5L2/55So5b2T5YmN55uu5b2VJylcclxuICAgICAgICAgICAgLmFjdGlvbihhc3luYyAod29ya2Rpcjogc3RyaW5nID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUod29ya2Rpcik7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yid5aeL5YyWWURT5Yi255uY546v5aKDIOW3peS9nOebruW9le+8miR7ZGlyfWApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjb25maWdGaWxlID0gcGF0aC5yZXNvbHZlKGRpciwgJ3lkcy5qc29uJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnRmlsZUNyZWF0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdGaWxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDnlJ/miJDphY3nva7mlofku7YgeWRzLmpzb25gKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ0ZpbGUsIGAj6K+35qC55o2u6K+05piO5L+u5pS56YWN572u5paH5Lu25bm25Yig6Zmk5omA5pyJ5rOo6YeK6K+05piO5ZCO5L+d5a2YXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImhvc3RzXCI6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwi5aaC5p6c5L2/55So5LqGeWRzLmJhdOWIneWni+eOr+Wig++8jOW3sue7j+a3u+WKoOS6hiAxOTIuMTY4LjUwLjQwIHJlcG8ueXlyZC5jb20gMTkyLjE2OC41MC40MSBiaXA1LnpoaXBlci5jb20gMTkyLjE2OC41MC40MiBiaXAzLnpoaXBlci5jb20gaG9zdHPphY3nva7pobnlj6/ku6XliKDpmaRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibWF2ZW7ku5PlupPnp4HmnI3lr7nlupTnmoRob3N05pig5bCEXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlzduW8gOWPkeeOr+Wig+WvueW6lOeahGhvc3TmmKDlsIRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImdpdFwiOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImhyY3BlXCI6IFwi5ZCO56uv5pyN5Yqh5a+55bqU55qEZ2l05Zyw5Z2AXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZlY29kZVwiOiBcIuaKpeWRiuacjeWKoeWvueW6lGdpdOWcsOWdgFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0YWxvZ3NcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyDlrqLmiLfku6PnoIHvvIznlKjkuo7lkK/liqjlkb3ku6TnmoRjYXRhbG9n5Y+C5pWwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImdlZXJcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaHJjcGVcIjogXCLlkI7nq6/mnI3liqHliIbmlK9cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZlY29kZVwiOiBcIuaKpeWRiuacjeWKoeWIhuaUr1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZUNyZWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POajgOa1i2dpdOWuieijheW8gOWniz4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdpdEV4aXN0cyA9IGF3YWl0IHV0aWwuY21kLmV4aXN0cygnZ2l0Jyk7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5qOA5p+l5piv5ZCm5a6J6KOF5LqGZ2l0ID4+ICR7Z2l0RXhpc3RzID8gJ+W3suWuieijhScgOiAn5pyq5a6J6KOFJ31gKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdpdEhvbWUgPSBgJHtkaXJ9L2dpdC1mb3Itd2luZG93c2BcclxuICAgICAgICAgICAgICAgIGlmICghZ2l0RXhpc3RzICYmICFmcy5leGlzdHNTeW5jKGdpdEhvbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2l0WmlwTmFtZSA9ICdnaXQtZm9yLXdpbmRvd3MuemlwJ1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkuIvovb1naXQg5a6J6KOF5YyFICR7Z2l0WmlwTmFtZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnaXRaaXBGaWxlID0gYCR7ZGlyfS8ke2dpdFppcE5hbWV9YDtcclxuICAgICAgICAgICAgICAgICAgICAvLyDmo4Dmn6XmmK/lkKblt7Lnu4/lrZjlnKjlronoo4XljIUg5aaC5p6c5pyJ5YWI5Yig6ZmkXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGdpdFppcEZpbGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS4i+i9veWuieijheWMheW5tui+k+WHuuaXpeW/l1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke3dnZXR9ICR7UlNfVVJMfS8ke2dpdFppcE5hbWV9IC1PIFwiJHtnaXRaaXBGaWxlfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDop6Pljovlronoo4XljIUgJHtnaXRaaXBGaWxlfWApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHt1bnppcH1cIiBcIiR7Z2l0WmlwRmlsZX1cIiAtZCBcIiR7ZGlyfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBnaXQg5a6J6KOF5a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgPDw8PDw8PDw8PDw8PDzmo4DmtYtnaXTlronoo4Xnu5PmnZ8+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85qOA5rWLamF2YeWuieijheW8gOWniz4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGphdmFFeGlzdHMgPSBhd2FpdCB1dGlsLmNtZC5leGlzdHMoJ2phdmEnKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmo4Dmn6XmmK/lkKblronoo4XkuoZqYXZhID4+ICR7amF2YUV4aXN0cyA/ICflt7Llronoo4UnIDogJ+acquWuieijhSd9YCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgamF2YUhvbWUgPSBwcm9jZXNzLmVudi5KQVZBX0hPTUU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWphdmFFeGlzdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBqYXZhSG9tZSA9IGAke2Rpcn0vamRrMS44LjBfNDcxYDtcclxuICAgICAgICAgICAgICAgICAgICBpZighZnMuZXhpc3RzU3luYyhqYXZhSG9tZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ+acquaJvuWIsGphdmHvvIzlh4blpIflronoo4VqYXZh77yM5byA5aeL5LiL6L29amRrJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpka1ppcE5hbWUgPSAnamRrLTh1NDcxLXdpbmRvd3MteDY0LnppcCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGAke2Rpcn0vJHtqZGtaaXBOYW1lfWApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5LiL6L29amRrIOWuieijheWMhSAke2pka1ppcE5hbWV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke3dnZXR9ICR7UlNfVVJMfS8ke2pka1ppcE5hbWV9IC1PIFwiJHtkaXJ9LyR7amRrWmlwTmFtZX1cImApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS4i+i9vWpkayDlronoo4XljIUgJHtkaXJ9LyR7amRrWmlwTmFtZX0g5bey5a6M5oiQYClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg6Kej5Y6LamRrIOWuieijheWMhSAke2Rpcn0vJHtqZGtaaXBOYW1lfWApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHt1bnppcH1cIiBcIiR7ZGlyfS8ke2pka1ppcE5hbWV9XCJgLCBkaXIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYGpka+WuieijheWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzcy5lbnYuSkFWQV9IT01FKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCfmnKrmib7liLBqYXZh77yM6K+35qOA5p+l5piv5ZCm5a6J6KOFamF2YeW5tuiuvue9rkpBVkFfSE9NReeOr+Wig+WPmOmHjycpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOiuvue9rkpBVkFfSE9NRSDnjq/looPlj5jph49cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBzZXR4IEpBVkFfSE9NRSBcIiR7amF2YUhvbWV9XCIgJiYgc2V0IEpBVkFfSE9NRT1cIiR7amF2YUhvbWV9XCJgKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5KQVZBX0hPTUUgPSBqYXZhSG9tZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHtqYXZhSG9tZX0vYmluL2phdmFcIiAtdmVyc2lvbmApO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85qOA5rWLamF2YeWuieijhee7k+adnz4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDlr7zlhaXor4HkuabliLBqYXZhIOWmguaenGphdmHmmK8xLjjniYjmnKwg6ZyA6KaB5a+85YWl5YiwIEpBVkFfSE9NRS9qcmUvbGliL3NlY3VyaXR5L2NhY2VydHMg5aaC5p6c5pivMTHniYjmnKwg6ZyA6KaB5a+85YWl5YiwIEpBVkFfSE9NRS9saWIvc2VjdXJpdHkvY2FjZXJ0c1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85a+85YWlamF2YeivgeS5puW8gOWniz4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuICAgICAgICAgICAgICAgIGxldCBjZXJ0c0ZpbGVuYW1lID0gJ2xpYi9zZWN1cml0eS9jYWNlcnRzJztcclxuICAgICAgICAgICAgICAgIGxldCBjZXJ0c0ZpbGUgPSBgJHtqYXZhSG9tZX0vJHtjZXJ0c0ZpbGVuYW1lfWA7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2VydHNGaWxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlcnRzRmlsZSA9IGAke2phdmFIb21lfS9qcmUvJHtjZXJ0c0ZpbGVuYW1lfWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5qOA5p+lamF2YeivgeS5puebruW9lSAke2NlcnRzRmlsZX1gKTtcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNlcnRzRmlsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXl0b29sQ21kID0gYFwiJHtqYXZhSG9tZX0vYmluL2tleXRvb2xcImA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5Yik5pat6K+B5Lmm5piv5ZCm5bey57uP5a+85YWlXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHtrZXl0b29sQ21kfSAtbGlzdCAtdiAta2V5c3RvcmUgXCIke2NlcnRzRmlsZX1cIiAtc3RvcmVwYXNzIGNoYW5nZWl0IC0tYWxpYXMgeXlyZGApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGB5eXJkLmNydCDor4Hkuablt7LlrZjlnKhgKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOivgeS5puS4jeWtmOWcqFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5a+85YWlIHl5cmQuY3J0IOivgeS5puWIsGphdmEgJHtjZXJ0c0ZpbGV9YCk7IC8vICR7ZGlyfS95eXJkLmNydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke2tleXRvb2xDbWR9IC1pbXBvcnRjZXJ0IC1maWxlIFwiJHtwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4veXlyZC5jcnQnKX1cIiAta2V5c3RvcmUgXCIke2NlcnRzRmlsZX1cIiAtc3RvcmVwYXNzIGNoYW5nZWl0IC1ub3Byb21wdCAtLWFsaWFzIHl5cmRgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYHl5cmQuY3J0IOivgeS5puWvvOWFpeWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POWvvOWFpWphdmHor4Hkuabnu5PmnZ8+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85qOA5rWLbWF2ZW7lronoo4XlvIDlp4s+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXZlbkV4aXN0cyA9IGF3YWl0IHV0aWwuY21kLmV4aXN0cygnbXZuJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXZlbkhvbWUgPSBgJHtkaXJ9L21hdmVuLTMuOC42YDtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmo4Dmn6XmmK/lkKblronoo4XkuoZtYXZlbiA+PiAke21hdmVuRXhpc3RzID8gJ+W3suWuieijhScgOiAn5pyq5a6J6KOFJ31gKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF2ZW5FeGlzdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobWF2ZW5Ib21lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXZlblppcE5hbWUgPSAnbWF2ZW4tMy44LjYuemlwJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5a6J6KOFbWF2ZW4gJHttYXZlblppcE5hbWV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdmVuWmlwRmlsZSA9IGAke2Rpcn0vJHttYXZlblppcE5hbWV9YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5qOA5p+l5piv5ZCm5bey57uP5a2Y5Zyo5a6J6KOF5YyFIOWmguaenOacieWFiOWIoOmZpFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobWF2ZW5aaXBGaWxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS4i+i9vW1hdmVuIOWuieijheWMhSAke21hdmVuWmlwRmlsZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS4i+i9veWuieijheWMheW5tui+k+WHuuaXpeW/l1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHt3Z2V0fSAke1JTX1VSTH0vJHttYXZlblppcE5hbWV9IC1PIFwiJHttYXZlblppcEZpbGV9XCJgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkuIvovb1tYXZlbiDlronoo4XljIUgJHttYXZlblppcEZpbGV9IOW3suWujOaIkGApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOino+WOi+WuieijheWMhSAke21hdmVuWmlwRmlsZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7dW56aXB9XCIgXCIke21hdmVuWmlwRmlsZX1cIiAtZCBcIiR7ZGlyfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBtYXZlbiDlronoo4XlrozmiJBgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmcy5leGlzdHNTeW5jKGAke2Rpcn0vc2V0dGluZ3MueG1sYCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5LiL6L29c2V0dGluZ3MueG1sYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHt3Z2V0fSAke1JTX1VSTH0vc2V0dGluZ3MueG1sYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS4i+i9vXNldHRpbmdzLnhtbOWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85qOA5rWLbWF2ZW7lronoo4XlrozmiJA+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85Yid5aeL5YyWbm9kZeeOr+WigyAgPj4+Pj4+Pj4+Pj4+Pj4+Pj5gKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoJ25wbSBpbnN0YWxsIC1nIHR5cGVzY3JpcHQgLS1yZWdpc3RyeT1odHRwczovL3JlZ2lzdHJ5Lm5wbW1pcnJvci5jb20nKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POWIneWni+WMlm5vZGXnjq/looPlrozmiJA+Pj4+Pj4+Pj4+Pj4+Pj4+PmApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POajgOa1i1lEUyBJREXlronoo4U+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlRGlyID0gYCR7ZGlyfS95ZHMtMS4wLjNgO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvZGVEaXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZVppcE5hbWUgPSAneWRzLTEuMC4zLWpkay04LXdpbmRvd3MteDg2XzY0LnppcCdcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5a6J6KOFWURTIElERSAke2NvZGVaaXBOYW1lfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVaaXBGaWxlID0gYCR7ZGlyfS8ke2NvZGVaaXBOYW1lfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvZGVaaXBGaWxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5LiL6L29WURTIElERSDlronoo4XljIUgJHtjb2RlWmlwRmlsZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5LiL6L295a6J6KOF5YyF5bm26L6T5Ye65pel5b+XXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7d2dldH0gaHR0cHM6Ly95b25jb21tdW5pdHkueW9ueW91Y2xvdWQuY29tL1lEU0Rvd25sb2FkL1dpbmRvdy94NjQvJHtjb2RlWmlwTmFtZX0gLU8gXCIke2NvZGVaaXBGaWxlfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkuIvovb1ZRFMgSURFIOWuieijheWMhSAke2NvZGVaaXBGaWxlfSDlt7LlrozmiJBgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke3VuemlwfVwiIFwiJHtjb2RlWmlwRmlsZX1cIiAtZCBcIiR7Y29kZURpcn1cImApO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMDApKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw8WURTIElERSDlronoo4XlrozmiJA+Pj4+Pj4+Pj4+Pj4+Pj4+PmApO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgPDw8PDw8PDw8PDw8PDzliJ3lp4vljJZZRFMgSURFIOWFqOWxgOmFjee9rj4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzSnNvbiA9IGAke2NvZGVEaXJ9L0NvZGUvZGF0YS91c2VyLWRhdGEvVXNlci9zZXR0aW5ncy5qc29uYDtcclxuICAgICAgICAgICAgICAgIGxldCBzZXR0aW5nc0pzb25PYmogPSB7fTtcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHNldHRpbmdzSnNvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc0pzb25PYmogPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhzZXR0aW5nc0pzb24pLnRvU3RyaW5nKCd1dGYtOCcpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghamF2YUV4aXN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOaJi+WKqOS4i+i9veeahGphdmEg6ZyA6KaB6YWN572uc2V0dGluZ3Mg5ZCm5YiZeWRz5peg5rOV5ZCv5YqoXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqW1wiamF2YS5jb25maWd1cmF0aW9uLnJ1bnRpbWVzXCJdPVt7XCJuYW1lXCI6IFwiSmF2YVNFLTEuOFwiLFwicGF0aFwiOiBqYXZhSG9tZX1dXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0dGluZ1htbCA9IHBhdGgucmVzb2x2ZShgJHtkaXJ9L3NldHRpbmdzLnhtbGApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHNldHRpbmdYbWwpKSB7IC8vIOWmguaenOWtmOWcqOWFqOWxgOWRveS7pOWImeS9v+eUqOeahOaYr+agueebruW9leS4i+eahHNldHRpbmdzLnhtbCDlkKbliJnkvb/nlKjmoLnnm67lvZXkuIttYXZlbueahHNldHRpbmdzLnhtbFxyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdYbWwgPSBwYXRoLnJlc29sdmUoYCR7bWF2ZW5Ib21lfS9jb25mL3NldHRpbmdzLnhtbGApO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzSnNvbk9ialsnbWF2ZW4uZXhlY3V0YWJsZS5wYXRoJ10gPSBwYXRoLnJlc29sdmUoYCR7bWF2ZW5Ib21lfS9iaW4vbXZuLmNtZGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqW1wiamF2YS5jb25maWd1cmF0aW9uLm1hdmVuLmdsb2JhbFNldHRpbmdzXCJdID0gc2V0dGluZ1htbDtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzSnNvbk9ialtcImphdmEuY29uZmlndXJhdGlvbi5tYXZlbi51c2VyU2V0dGluZ3NcIl0gPSBzZXR0aW5nWG1sO1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqW1wibWF2ZW4uc2V0dGluZ3NGaWxlXCJdID0gc2V0dGluZ1htbDtcclxuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NKc29uLCBKU09OLnN0cmluZ2lmeShzZXR0aW5nc0pzb25PYmosIG51bGwsIDQpKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POWIneWni+WMlllEUyBJREUg5YWo5bGA6YWN572u5a6M5oiQPj4+Pj4+Pj4+Pj4+Pj4+Pj5gKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDmo4Dmn6XlvZPliY3nlKjmiLfnm67lvZXkuIsuc3No5piv5ZCm5a2Y5ZyoIGlkX2VkMjU1MTkucHViIOWvhumSpeaWh+S7tu+8jOWmguaenOayoeacieWImeaUvuWIsC5zc2gg55uu5b2V5LiLXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzc2hEaXIgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEUsICcuc3NoJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc3NoRGlyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhzc2hEaXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGAke3NzaERpcn0vaWRfZWQyNTUxOS5wdWJgKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmi7fotJ3lr4bpkqXmlofku7ZgKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2lkX2VkMjU1MTkucHViJyksIGAke3NzaERpcn0vaWRfZWQyNTUxOS5wdWJgKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2lkX2VkMjU1MTknKSwgYCR7c3NoRGlyfS9pZF9lZDI1NTE5YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOaLt+i0neWvhumSpeaWh+S7tuWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWdGaWxlQ3JlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDphY3nva7mlofku7Z5ZHMuanNvbuW3sue7j+eUn+aIkO+8jOivt+S9v+eUqOe8lui+keWZqOWvuemFjee9ruWGheWuuei/m+ihjOS/ruaUuWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yid5aeL5YyWWURT5Yi255uY546v5aKD5a6M5oiQ77yM5aaC5p6c5piv6aaW5qyh5omn6KGM6K+35YWz6Zet5b2T5YmN56qX5Y+j77yM5bm26YeN5paw5omT5byAYClcclxuICAgICAgICAgICAgfSkuaG9vaygncG9zdEFjdGlvbicsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlpoLmnpzmiafooYzov4fnqIvkuK3lh7rnjrDmiqXplJnor7flhbPpl63lvZPliY3nu4jnq6/vvIzph43lkK/nu4jnq6/lkI7miafooYwgeWRzIGluaXQg55u05Yiw5peg5oql6ZSZ5YaF5a655Li65q2iYClcclxuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHByb2dyYW1cclxuICAgICAgICAgICAgLmNvbW1hbmQoJ3N0YXJ0IDxjYXRhbG9nPiBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAudXNhZ2UoJ3N0YXJ0IDxjYXRhbG9nPiBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAub3B0aW9uKCctZiwgLS1maWxlIDxmaWxlPicsICfphY3nva7mlofku7YnKVxyXG4gICAgICAgICAgICAuYWRkSGVscFRleHQoJ2FmdGVyJywgYOmFjee9ruaWh+S7tuWGheWuueekuuS+i++8miR7Y29uZkVnfWApXHJcbiAgICAgICAgICAgIC5kZXNjcmlwdGlvbign5ZCv5Yqo5Yi255uY546v5aKD77yMY2F0YWxvZ+ihqOekuumcgOimgeWItuebmOeahOaooeWdl++8jOWvueW6lOmFjee9ruaWh+S7tuS4rWNhdGFsb2dz55qEa2V55YC877yM55So5LqO5oyH5a6a6ZyA6KaB5Ye655uY55qE5L+h5oGv77yMd29ya2RpcuihqOekuuWItuebmOW3peS9nOebruW9le+8jOWmguaenOS4jeaMh+WumuWImeS9v+eUqOW9k+WJjeebruW9lScpXHJcbiAgICAgICAgICAgIC5hY3Rpb24oYXN5bmMgKGNhdGFsb2c6IHN0cmluZywgd29ya2Rpcjogc3RyaW5nID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpLCBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICBmaWxlOiBzdHJpbmdcclxuICAgICAgICAgICAgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKHdvcmtkaXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIOWmguaenOacquaMh+WumumFjee9ruaWh+S7tlxyXG4gICAgICAgICAgICAgICAgbGV0IHlkc0pzb246IHN0cmluZztcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB5ZHNKc29uID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMuZmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g6K+75Y+W6YWN572u5paH5Lu2XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHlkc0pzb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg5pyq5om+5Yiw6YWN572u5paH5Lu2ICR7eWRzSnNvbn1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeWRzSnNvbiA9IHBhdGgucmVzb2x2ZShgJHtkaXJ9L3lkcy5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g6K+75Y+W6YWN572u5paH5Lu2XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHlkc0pzb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6K+36YCa6L+H5Y+C5pWwIC1mIOaMh+WumumcgOimgeS9v+eUqOeahOmFjee9ruaWh+S7tuaIluiAheWcqOW9k+WJjeebruW9leS4i+WIm+W7unlkcy5qc29u5paH5Lu277yM5YaF5a655Y+C6ICDJHtjb25mRWd9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOW8gOWni+WItuebmCAke2NhdGFsb2d9IOW3peS9nOebruW9le+8miR7ZGlyfWApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlvIDlp4vmo4DmtYvliLbnm5jnjq/looPmo4DmtYtgKTtcclxuICAgICAgICAgICAgICAgIGxldCBnaXRDbWQgPSAnZ2l0JztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdpdEV4aXN0cyA9IGF3YWl0IHV0aWwuY21kLmV4aXN0cyhnaXRDbWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFnaXRFeGlzdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBnaXRDbWQgPSBgJHtkaXJ9L2dpdC1mb3Itd2luZG93cy9iaW4vZ2l0LmV4ZWA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGdpdENtZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDmnKrmib7liLBnaXTlkb3ku6QgJHtnaXRDbWR9LCDor7flhYjmiafooYwgaW5pdCDliJ3lp4vljJbliLbnm5jnjq/looNgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGdpdENtZCA9IGBcIiR7Z2l0Q21kfVwiYDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0dGluZ1htbCA9IHBhdGgucmVzb2x2ZShgJHtkaXJ9L3NldHRpbmdzLnhtbGApO1xyXG4gICAgICAgICAgICAgICAgbGV0IG12bkNtZCA9ICdtdm4nO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1hdmVuSG9tZSA9IGAke2Rpcn0vbWF2ZW4tMy44LjZgO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG1hdmVuSG9tZSkpIHsgLy8g5L2/55So5YWo5bGAbWF2ZW5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbXZuRXhpc3RzID0gYXdhaXQgdXRpbC5jbWQuZXhpc3RzKG12bkNtZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtdm5FeGlzdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDmnKrmib7liLBtdm7lkb3ku6QgJHttdm5DbWR9LCDor7flhYjmiafooYwgaW5pdCDliJ3lp4vljJbliLbnm5jnjq/looNgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOayoeaciXNldHRpbmdzIOS4i+i9vVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhzZXR0aW5nWG1sKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2Fybihg5pyq5om+5YiwbWF2ZW7phY3nva7mlofku7YgJHtzZXR0aW5nWG1sfSwg5LiL6L29c2V0dGluZ3MueG1s5paH5Lu2YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7d2dldH0gJHtSU19VUkx9L3NldHRpbmdzLnhtbGAsIGRpcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBtdm5DbWQgPSBgXCIke21hdmVuSG9tZX0vYmluL212bi5jbWRcImA7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ1htbCA9IGAke21hdmVuSG9tZX0vY29uZi9zZXR0aW5ncy54bWxgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpZGVQYXRoID0gYCR7ZGlyfS95ZHMtMS4wLjNgXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoaWRlUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOacquaJvuWIsElERSAke2lkZVBhdGh9LCDor7flhYjmiafooYwgaW5pdCDliJ3lp4vljJbliLbnm5jnjq/looNgKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSlcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yi255uY546v5aKD5qOA5rWL5a6M5oiQYClcclxuICAgICAgICAgICAgICAgIGxldCB5ZHNKc29uU3RyID0gZnMucmVhZEZpbGVTeW5jKHlkc0pzb24pLnRvU3RyaW5nKCd1dGYtOCcpO1xyXG4gICAgICAgICAgICAgICAgLy8g5pu/5o2i5omA5pyJIyDlvIDlpLTnmoTms6jph4ror7TmmI7ooYxcclxuICAgICAgICAgICAgICAgIHlkc0pzb25TdHIgPSB5ZHNKc29uU3RyLnJlcGxhY2UoL14jLiovZ20sICcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDmo4DmtYvphY3nva7mlofku7bmmK/lkKblrozmlbRcclxuICAgICAgICAgICAgICAgIGxldCBjb25maWc6IFlkc0NvbmZpZztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQ29uZmlnRXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSDmoLzlvI/plJnor68g5Y+C6ICD56S65L6L77yaJHtjb25mRWd9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKHlkc0pzb25TdHIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmNhdGFsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ29uZmlnRXJyb3IoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0NvbmZpZ0Vycm9yKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGdpdCA9IGNvbmZpZy5naXQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYXRhbG9nQ29uZmlnID0gY29uZmlnLmNhdGFsb2dzW2NhdGFsb2ddO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXRhbG9nQ29uZmlnID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6YWN572u5paH5Lu2ICR7eWRzSnNvbn0g5om+5LiN5YiwIGNhdGFsb2dzLiR7Y2F0YWxvZ30g5YWI5YWz6YWN572uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXRhbG9nQ29uZmlnLmhyY3BlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgY2F0YWxvZ0NvbmZpZy5mZWNvZGUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSBjYXRhbG9ncy4ke2NhdGFsb2d9LmhyY3BlIOaIliBjYXRhbG9ncy4ke2NhdGFsb2d9LmZlY29kZSDlrZfmrrXnvLrlpLFgKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gYCR7ZGlyfS8ke2NhdGFsb2d9YDtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhuYW1lc3BhY2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWIm+W7uuebruW9lSAke25hbWVzcGFjZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmMobmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOebruW9lSAke25hbWVzcGFjZX0g5bey5a2Y5ZyoYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgaHJjcGVVcmwgPSB0eXBlb2YgY2F0YWxvZ0NvbmZpZy5ocmNwZSA9PT0gJ3N0cmluZycgPyBnaXQ/LmhyY3BlIDogY2F0YWxvZ0NvbmZpZy5ocmNwZS51cmw7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhyY3BlVXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSBjYXRhbG9ncy4ke2NhdGFsb2d9IOWQjuerr+acjeWKoSDmnKrmjIflrprku5PlupPlnLDlnYDvvIzor7fpgJrov4cgZ2l0LmhyY3BlIOaIluiAhSBjYXRhbG9ncy4ke2NhdGFsb2d9LmhyY3BlLnVybCDmjIflrprku5PlupPlnLDlnYBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlvIDlp4vmi4nlj5blkI7nq6/mnI3liqHku5PlupMgJHtocmNwZVVybH1gKTtcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGAke25hbWVzcGFjZX0vLmdpdGApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOebruW9lSAke25hbWVzcGFjZX0g5bey5a2Y5Zyo77yM5byA5aeL5pu05paw5LuT5bqTYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHtnaXRDbWR9IHB1bGxgLCBuYW1lc3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55uu5b2VICR7bmFtZXNwYWNlfSDkuI3lrZjlnKjvvIzlvIDlp4vliJvlu7rku5PlupNgKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYnJhbmNoID0gdHlwZW9mIGNhdGFsb2dDb25maWcuaHJjcGUgPT09ICdzdHJpbmcnID8gY2F0YWxvZ0NvbmZpZy5ocmNwZSA6IGNhdGFsb2dDb25maWcuaHJjcGUuYnJhbmNoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYnJhbmNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6YWN572u5paH5Lu2ICR7eWRzSnNvbn0gY2F0YWxvZ3MuJHtjYXRhbG9nfSDlkI7nq6/mnI3liqEg5pyq5oyH5a6a5YiG5pSv77yM6K+36YCa6L+HIGdpdC5ocmNwZSDmiJbogIUgY2F0YWxvZ3MuJHtjYXRhbG9nfS5ocmNwZS5icmFuY2gg6YWN572u5YiG5pSvYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHtnaXRDbWR9IGNsb25lIC1iICR7YnJhbmNofSAke2hyY3BlVXJsfSAke25hbWVzcGFjZX1gLCBuYW1lc3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOaLieWPluWQjuerr+acjeWKoeS7k+W6k+WujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgbGV0IGJvb3N0cmFwUG9tWG1sID0gYCR7bmFtZXNwYWNlfS8ke2RvbWFpbktleX0tYmUvZGV2LSR7ZG9tYWluS2V5fS1ib290c3RyYXAvcG9tLnhtbGA7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5pu/5o2i5paH5Lu2ICR7Ym9vc3RyYXBQb21YbWx9IOS4reeahFJPT1TkuLpkb21haW5LZXnvvIzlkKbliJnkvJrlr7zoh7TliLbnm5jlpLHotKXvvIzml6Dms5Xmib7liLDliLblk4FgKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0cmFwUG9tWG1sU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGJvb3N0cmFwUG9tWG1sKS50b1N0cmluZygndXRmLTgnKTtcclxuICAgICAgICAgICAgICAgIGlmIChib29zdHJhcFBvbVhtbFN0cmluZy5pbmNsdWRlcygnUk9PVCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhib29zdHJhcFBvbVhtbCwgYm9vc3RyYXBQb21YbWxTdHJpbmcucmVwbGFjZSgvUk9PVC9nLCBkb21haW5LZXkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmhvc3RzICYmIGNvbmZpZy5ob3N0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5a2Y5ZyoaG9zdHPphY3nva7vvIzmo4DmtYvns7vnu59ob3N0c+mFjee9ruaWh+S7tuaYr+WQpuW3sue7j+mFjee9rmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBob3N0c0ZpbGUgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuV0lORElSLCAnU3lzdGVtMzInLCAnZHJpdmVycycsICdldGMnLCAnaG9zdHMnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0TGlzdCA9IGZzLnJlYWRGaWxlU3luYyhob3N0c0ZpbGUpLnRvU3RyaW5nKCd1dGYtOCcpLnNwbGl0KCdcXG4nKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYXBwZW5kSG9zdHMgPSBbLi4uY29uZmlnLmhvc3RzXVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGhvc3RJdGVtIG9mIGhvc3RMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvIy8udGVzdChob3N0SXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGFwcGVuZEhvc3Qgb2YgY29uZmlnLmhvc3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbaXAsIGRvbWFpbl0gPSBhcHBlbmRIb3N0LnNwbGl0KCcgJykuZmlsdGVyKGl0ZW0gPT4gaXRlbSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3N0SXRlbS5pbmNsdWRlcyhpcCkgJiYgaG9zdEl0ZW0uaW5jbHVkZXMoZG9tYWluKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDns7vnu59ob3N0c+mFjee9ruaWh+S7tuW3suWtmOWcqCAke2FwcGVuZEhvc3R9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kSG9zdHMucmVtb3ZlKGFwcGVuZEhvc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOivu+WPluezu+e7n2hvc3Rz6YWN572u5paH5Lu2XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcGVuZEhvc3RzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBZG1pbigpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5hcHBlbmRGaWxlU3luYyhob3N0c0ZpbGUsIGBcXG4ke2FwcGVuZEhvc3RzLmpvaW4oJ1xcbicpfVxcbmAsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogJ3V0Zi04J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg5b2T5YmN6Z2e566h55CG5ZGY5ZCv5Yqo5peg5rOV5pu05pS5aG9zdHPmlofku7bvvIzor7fkvb/nlKjnrqHnkIblkZjlkK/liqjmiJbogIXmiYvliqjmt7vliqAgJHthcHBlbmRIb3N0cy5qb2luKCdcXG4nKX0g5Yiw5paH5Lu2ICR7aG9zdHNGaWxlfWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBob3N0cyDphY3nva7mo4DmtYvlrozmiJBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn5Yid5aeL5YyW6aG555uubWF2ZW7njq/looMnKTtcclxuICAgICAgICAgICAgICAgIGxldCBtdm5Db25maWdEaXIgPSBgJHtuYW1lc3BhY2V9Ly5tdm5gO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG12bkNvbmZpZ0RpcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke212bkNtZH0gLU4gaW8udGFrYXJpOm1hdmVuOndyYXBwZXIgLURtYXZlbj0zLjguNmAsIG5hbWVzcGFjZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyDlhpnlhaVtYXZlbumFjee9ruWIsCAubXZuL21hdmVuLmNvbmZpZ1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZ0ZpbGUgPSBgJHttdm5Db25maWdEaXJ9L21hdmVuLmNvbmZpZ2A7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdGaWxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLnJtU3luYyhjb25maWdGaWxlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhgJHttdm5Db25maWdEaXJ9L21hdmVuLmNvbmZpZ2AsIGAtc1xcbiR7c2V0dGluZ1htbH1cXG4tRG1hdmVuLndhZ29uLmh0dHAuc3NsLmluc2VjdXJlPXRydWVcXG4tRG1hdmVuLndhZ29uLmh0dHAuc3NsLmFsbG93YWxsPXRydWVgKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlvZPliY1tYXZlbuS/oeaBr2ApXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke212bkNtZH0gLS12ZXJzaW9uYCwgbmFtZXNwYWNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn6aG555uubWF2ZW7muIXnkIYnKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHttdm5DbWR9IGNsZWFuIC1Ec2tpcFRlc3RzYCwgYCR7bmFtZXNwYWNlfS8ke2RvbWFpbktleX0tYmVgKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn5aSE55CG5YmN56uv5p6E5bu677yM5aKe5Yqg5p6E5bu65paH5Lu2Jyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmVEaXIgPSBgJHtuYW1lc3BhY2V9LyR7ZG9tYWluS2V5fS1mZWA7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmVCdWlsZEpzID0gYCR7ZmVEaXJ9L2J1aWxkLmpzYDtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmZUJ1aWxkSnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMuY3BTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUgLCcuLi9mZS1idWlsZC5qcycpLCBmZUJ1aWxkSnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGZlUGFja2FnZUpzb24gPSBgJHtmZURpcn0vcGFja2FnZS5qc29uYDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhY2thZ2VTdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZmVQYWNrYWdlSnNvbikudG9TdHJpbmcoJ3V0Zi04Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXBhY2thZ2VTdHJpbmcuaW5jbHVkZXMoJ2J1aWxkLmpzJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5L+u5pS5JHtmZVBhY2thZ2VKc29ufWApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlU3RyaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSnNvbi5zY3JpcHRzWydidWlsZDpleHRlbmQnXSArPSAnICYmIG5vZGUgYnVpbGQuanMnO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmVQYWNrYWdlSnNvbiwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDQpKTtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5L+u5pS5JHtmZVBhY2thZ2VKc29ufeWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZmVjb2RlVXJsID0gdHlwZW9mIGNhdGFsb2dDb25maWcuZmVjb2RlID09PSAnc3RyaW5nJyA/IGdpdD8uZmVjb2RlIDogY2F0YWxvZ0NvbmZpZy5mZWNvZGUudXJsO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmZWNvZGVVcmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOmFjee9ruaWh+S7tiAke3lkc0pzb259IGNhdGFsb2dzLiR7Y2F0YWxvZ30g5ZCO56uv5pyN5YqhIOacquaMh+WumuS7k+W6k+WcsOWdgO+8jOivt+mAmui/hyBnaXQuZmVjb2RlIOaIluiAhSBjYXRhbG9ncy4ke2NhdGFsb2d9LmZlY29kZS51cmwg5oyH5a6a5LuT5bqT5Zyw5Z2AYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5byA5aeL5ouJ5Y+W5oql5ZGK5pyN5Yqh5LuT5bqTICR7ZmVjb2RlVXJsfWApO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlcG9ydE5hbWVzcGFjZSA9IGAke25hbWVzcGFjZX0veW9uYmlwLXlpc3YtaXpwMS1kZXYtZmVjb2RlYDtcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGAke3JlcG9ydE5hbWVzcGFjZX0vLmdpdGApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOebruW9lSAke3JlcG9ydE5hbWVzcGFjZX0g5bey5a2Y5Zyo77yM5byA5aeL5pu05paw5LuT5bqTYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHtnaXRDbWR9IHB1bGxgLCByZXBvcnROYW1lc3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55uu5b2VICR7cmVwb3J0TmFtZXNwYWNlfSDkuI3lrZjlnKjvvIzlvIDlp4vliJvlu7rku5PlupNgKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYnJhbmNoID0gdHlwZW9mIGNhdGFsb2dDb25maWcuZmVjb2RlID09PSAnc3RyaW5nJyA/IGNhdGFsb2dDb25maWcuZmVjb2RlIDogY2F0YWxvZ0NvbmZpZy5mZWNvZGUuYnJhbmNoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYnJhbmNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6YWN572u5paH5Lu2ICR7eWRzSnNvbn0gY2F0YWxvZ3MuJHtjYXRhbG9nfSDmiqXlkYrmnI3liqHmnKrmjIflrprliIbmlK/vvIzor7fpgJrov4cgZ2l0LmZlY29kZSDmiJbogIUgY2F0YWxvZ3MuJHtjYXRhbG9nfS5mZWNvZGUuYnJhbmNoIOmFjee9ruWIhuaUr2ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7Z2l0Q21kfSBjbG9uZSAtYiAke2JyYW5jaH0gJHtmZWNvZGVVcmx9ICR7cmVwb3J0TmFtZXNwYWNlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOaLieWPluaKpeWRiuacjeWKoeS7k+W6k+WujOaIkGApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCflpITnkIbmiqXlkYrmnoTlu7rvvIzlop7liqDmnoTlu7rmlofku7YnKTtcclxuICAgICAgICAgICAgICAgIGxldCBmZWNvZGVCdWlsZEpzID0gYCR7cmVwb3J0TmFtZXNwYWNlfS9idWlsZC5qc2A7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmVjb2RlQnVpbGRKcykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jcFN5bmMocGF0aC5qb2luKF9fZGlybmFtZSAsJy4uL2ZlY29kZS1idWlsZC5qcycpLCBmZWNvZGVCdWlsZEpzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBmZWNvZGVQYWNrYWdlSnNvbiA9IGAke3JlcG9ydE5hbWVzcGFjZX0vcGFja2FnZS5qc29uYDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZlY29kZVBhY2thZ2VTdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZmVjb2RlUGFja2FnZUpzb24pLnRvU3RyaW5nKCd1dGYtOCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmZWNvZGVQYWNrYWdlU3RyaW5nLmluY2x1ZGVzKCdidWlsZC5qcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS/ruaUuSR7ZmVjb2RlUGFja2FnZUpzb259YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZlY29kZVBhY2thZ2VTdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VKc29uLnNjcmlwdHNbJ2J1aWxkJ10gKz0gJyAmJiBub2RlIGJ1aWxkLmpzJztcclxuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSnNvbi5kb21haW5LZXkgPSBkb21haW5LZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5Yig6Zmk5q2k5L6d6LWWIOS8muWvvOiHtG5wbSBpIOWksei0pVxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMuemxpYlxyXG4gICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmVjb2RlUGFja2FnZUpzb24sIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCA0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS/ruaUuSR7ZmVjb2RlUGFja2FnZUpzb2595a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWuieijheaKpeWRiuacjeWKoeS+nei1lmApO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZCgnbnBtIGknLCByZXBvcnROYW1lc3BhY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDnlJ/miJB2ZXJzaW9uLmpzb24g5paH5Lu2YClcclxuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSByYW5kb21VVUlEKCkudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhgJHtyZXBvcnROYW1lc3BhY2V9L3ZlcnNpb24uanNvbmAsIGB7XCJ2ZXJzaW9uXCI6IFwiJHt1dWlkfVwifWApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCfliJ3lp4vljJbpobnnm67njq/looPotYTmupAnKTtcclxuICAgICAgICAgICAgICAgIC8vIOWmguaenCBuYW1lc3BhY2UvKGRpc2t8ZGlza3MpIOWmguaenOWtmOWcqCDot7Pov4dcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGAke25hbWVzcGFjZX0vZGlza2ApIHx8IGZzLmV4aXN0c1N5bmMoYCR7bmFtZXNwYWNlfS9kaXNrc2ApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOW3suWtmOWcqO+8jOi3s+i/h+eOr+Wig+i1hOa6kOaWh+S7tuS4i+i9vWApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2Rmcy56aGlwZXIuY29tL3YzcjYvZW52LnppcFxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlvIDlp4vkuIvovb3pobnnm67njq/looPotYTmupDmlofku7ZgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBnaXRaaXBGaWxlID0gYCR7bmFtZXNwYWNlfS9lbnYuemlwYDtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke3dnZXR9ICR7UlNfVVJMfS9lbnYuemlwIC1PIFwiJHtnaXRaaXBGaWxlfVwiYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDop6PljovotYTmupDmlofku7bljIUgJHtnaXRaaXBGaWxlfWApXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke3VuemlwfVwiIFwiJHtnaXRaaXBGaWxlfVwiYCwgbmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5ybVN5bmMoZ2l0WmlwRmlsZSlcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn5ZCv5YqoSURFJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7aWRlUGF0aH0vQ29kZS9iaW4vY29kZVwiIC0tbm8tc2FuZGJveCAtLWxvZyBkZWJ1ZyAtLWdvdG8gXCIke2lkZVBhdGh9L0NvZGUvZGF0YS91c2VyLWRhdGEvVXNlci9zZXR0aW5ncy5qc29uXCIgXCIke25hbWVzcGFjZX1cImApO1xyXG4gICAgICAgICAgICAgICAgLy8g6ZyA6KaB562J5b6FSURF5ZCv5Yqo5a6M5oiQ5ZCO5YWz6ZetXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMzAwMCkpXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn5bey5ZCv5YqoSURF77yM54K55Ye75bem5L6n6I+c5Y2V6YCJ5oup4oCcWURT4oCd77yM6K+35oyJ54Wn5paH5qGj6K+05piO6L+b6KGM5Yi255uY5pON5L2cJyk7XHJcbiAgICAgICAgICAgIH0pLmhvb2soJ3Bvc3RBY3Rpb24nLCAoKSA9PiBwcm9jZXNzLmV4aXQoMCkpO1xyXG5cclxuICAgICAgICBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndilcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
438
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQWtDO0FBQ2xDLGlEQUFtQztBQUNuQyx5Q0FBOEM7QUFDOUMsZ0RBQWtDO0FBQ2xDLGtFQUFvRDtBQUNwRCw0Q0FBOEI7QUFDOUIsNENBQThCO0FBQzlCLG1DQUFpQztBQUVqQyxNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztBQUMxQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN2QyxNQUFNLE1BQU0sR0FBRyw2QkFBNkIsQ0FBQztBQUU3QyxNQUFNLE1BQU0sR0FBVyx5QkFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV0RCxNQUFNLE9BQU8sR0FBRyxDQUFPLE9BQWUsRUFBRSxHQUFZLEVBQUUsRUFBRTtJQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRCxJQUFJLEtBQUssR0FBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDeEIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7UUFDNUIsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPO1FBQ3RCLE9BQU8sRUFBRSxDQUFDO1FBQ1YsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDbkIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLE9BQU8saUJBQWlCLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFBO0FBQ3hFLENBQUMsQ0FBQSxDQUFBO0FBRUQsTUFBTSxRQUFR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QyxDQUFDO2dCQUN2RCxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3pCLENBQUM7WUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sT0FBTyxDQUFDLElBQUksTUFBTSxvREFBb0QsTUFBTSw2Q0FBNkMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUU3SSxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpELG1CQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMvQixDQUFDO0NBQ0o7QUE5WEQsdUJBOFhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtwcm9ncmFtfSBmcm9tIFwiY29tbWFuZGVyXCI7XHJcbmltcG9ydCAqIGFzIHByb2Nlc3MgZnJvbSBcInByb2Nlc3NcIjtcclxuaW1wb3J0IHtMb2dnZXJGYWN0b3J5LCB1dGlsfSBmcm9tIFwidndlYi1jb3JlXCI7XHJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xyXG5pbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcclxuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcclxuaW1wb3J0ICogYXMgb3MgZnJvbSAnbm9kZTpvcyc7XHJcbmltcG9ydCB7cmFuZG9tVVVJRH0gZnJvbSAnY3J5cHRvJ1xyXG5cclxuY29uc3QgZG9tYWluS2V5ID0gJ3AtaGNjLWkwMDAtcDAwYS1ocmNwZSc7XHJcbmNvbnN0IHBrZyA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xyXG5jb25zdCBSU19VUkwgPSAnaHR0cHM6Ly9kZnMuemhpcGVyLmNvbS92M3I2JztcclxuXHJcbmNvbnN0IGxvZ2dlcjogTG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoJ1lEUycpO1xyXG5cclxuY29uc3QgZXhlY0NtZCA9IGFzeW5jIChjb21tYW5kOiBzdHJpbmcsIGN3ZD86IHN0cmluZykgPT4ge1xyXG4gICAgbG9nZ2VyLmluZm8oYOaJp+ihjOWRveS7pCAke2NvbW1hbmR9ICR7Y3dkID8gYO+8jOaJp+ihjOebruW9leS4uiR7Y3dkfWAgOicnfWApO1xyXG4gICAgbGV0IHN0YXJ0ICA9IERhdGUubm93KCk7XHJcbiAgICBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKGNvbW1hbmQsIHtcclxuICAgICAgICBjd2QsIGVuY29kaW5nOiAndXRmLTgnLFxyXG4gICAgICAgIHRpbWVvdXQ6IDAsIC8vIOiuvuS4uuS4jei/h+acn++8jOS4i+i9vemAn+W6pui/h+aFouS8muWvvOiHtOi2heaXtlxyXG4gICAgICAgIHN0ZGlvOiBbMCwgMSwgMl1cclxuICAgIH0pO1xyXG4gICAgbG9nZ2VyLmluZm8oYOaJp+ihjOWRveS7pCAke2NvbW1hbmR9IOiAl+aXtiBcXHgxQlszNG0gPCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zPmApXHJcbn1cclxuXHJcbmNvbnN0IHBsYXRmb3JtID0gb3MucGxhdGZvcm0oKVxyXG5pZiAocGxhdGZvcm0gIT09ICd3aW4zMicpIHtcclxuICAgIGxvZ2dlci5lcnJvcign5b2T5YmN5bel5YW35LuF5pSv5oyBd2luZG93c+ezu+e7nycpO1xyXG4gICAgcHJvY2Vzcy5leGl0KDEpO1xyXG59XHJcblxyXG5jb25zdCBpc0FkbWluID0gKCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyDlsJ3or5XmiafooYzkuIDkuKrlj6rmnInnrqHnkIblkZjmiY3og73ov5DooYznmoTlkb3ku6RcclxuICAgICAgICAvLyDkvb/nlKggPm51bCAyPiYxIOadpeaKkeWItui+k+WHulxyXG4gICAgICAgIGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ25ldCBzZXNzaW9uID5udWwgMj4mMScpO1xyXG4gICAgICAgIHJldHVybiB0cnVlOyAvLyDmiJDlip/miafooYxcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8g5omn6KGM5aSx6LSl77yM5p2D6ZmQ5LiN6LazXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCB3Z2V0ID0gcGF0aC5qb2luKF9fZGlybmFtZSAsJy4uL3dnZXQuZXhlJyk7XHJcbmxldCB6aXAgPSBwYXRoLmpvaW4oX19kaXJuYW1lICwnLi4vemlwLmV4ZScpO1xyXG5sZXQgdW56aXAgPSBwYXRoLmpvaW4oX19kaXJuYW1lICwnLi4vdW56aXAuZXhlJyk7XHJcblxyXG5wcm9ncmFtLm5hbWUoXCJ5ZHNcIilcclxuICAgIC51c2FnZShcIltjb21tYW5kXSBbb3B0aW9uc11cIilcclxuICAgIC5kZXNjcmlwdGlvbihcInlkcyDliLbnm5jlt6Xlhbcg5aaC5p6c5ZG95Luk5Y+C5pWw5Lit5a2Y5Zyo56m65qC8IOS9v+eUqOWPjOW8leWPt1xcXCJcXFwi5YyF6KO5XCIpXHJcbiAgICAudmVyc2lvbihgeWRzICR7cGtnLnZlcnNpb259YCk7XHJcblxyXG50eXBlIE1pY3JvU2VydmljZSA9ICdocmNwZScgfCAnZmVjb2RlJztcclxuXHJcbnR5cGUgR2l0ID0ge1xyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBicmFuY2g6IHN0cmluZ1xyXG59XHJcblxyXG50eXBlIFlkc0NvbmZpZyA9IHtcclxuICAgIGhvc3RzOiBBcnJheTxzdHJpbmc+O1xyXG4gICAgZ2l0OiBSZWNvcmQ8TWljcm9TZXJ2aWNlLCBzdHJpbmc+O1xyXG4gICAgY2F0YWxvZ3M6IHtcclxuICAgICAgICBbY2F0YWxvZzogc3RyaW5nXTogUmVjb3JkPE1pY3JvU2VydmljZSwgc3RyaW5nIHwgR2l0PlxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBjb25mRWcgPSBge1xyXG4gICAgaG9zdHM/OiBBcnJheTxzdHJpbmc+O1xyXG4gICAgZ2l0OiBSZWNvcmQ8J2hyY3BlJyB8ICdmZWNvZGUnLCBzdHJpbmc+O1xyXG4gICAgY2F0YWxvZ3M6IHtcclxuICAgICAgICBbY2F0YWxvZzogc3RyaW5nXTogUmVjb3JkPCdocmNwZScgfCAnZmVjb2RlJywgc3RyaW5nIHwgeyB1cmw6IHN0cmluZywgYnJhbmNoOiBzdHJpbmcgfT5cclxuICAgIH1cclxufWBcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1haW4ge1xyXG5cclxuICAgIHN0YXJ0dXAoKSB7XHJcbiAgICAgICAgcHJvZ3JhbVxyXG4gICAgICAgICAgICAuY29tbWFuZCgnY2xlYW4gW3dvcmtkaXJdJylcclxuICAgICAgICAgICAgLnVzYWdlKCdjbGVhbiBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAuZGVzY3JpcHRpb24oJ+a4heeQhuWItuebmOW3peS9nOebruW9lSwgd29ya2RpcuihqOekuuWItuebmOW3peS9nOebruW9le+8jOWmguaenOS4jeaMh+WumuWImeS9v+eUqOW9k+WJjeebruW9lScpXHJcbiAgICAgICAgICAgIC5hY3Rpb24oYXN5bmMgKHdvcmtkaXI6IHN0cmluZyA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKHdvcmtkaXIpO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOa4heeQhuWItuebmOW3peS9nOebruW9lSAke2Rpcn1gKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoZGlyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlU3RhdCA9IGZzLnN0YXRTeW5jKGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLnJtU3luYyhmaWxlLCB7cmVjdXJzaXZlOiBmaWxlU3RhdC5pc0RpcmVjdG9yeSgpfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yi255uY5bel5L2c55uu5b2V5riF55CG5a6M5oiQYCk7XHJcbiAgICAgICAgICAgIH0pLmhvb2soJ3Bvc3RBY3Rpb24nLCAoKSA9PiBwcm9jZXNzLmV4aXQoMCkpO1xyXG5cclxuICAgICAgICBwcm9ncmFtXHJcbiAgICAgICAgICAgIC5jb21tYW5kKCdpbml0IFt3b3JrZGlyXScpXHJcbiAgICAgICAgICAgIC51c2FnZSgnaW5pdCBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAuZGVzY3JpcHRpb24oJ+WIneWni+WMlllEU+WItuebmOeOr+Wigywgd29ya2RpcuihqOekuuWItuebmOW3peS9nOebruW9le+8jOWmguaenOS4jeaMh+WumuWImeS9v+eUqOW9k+WJjeebruW9lScpXHJcbiAgICAgICAgICAgIC5hY3Rpb24oYXN5bmMgKHdvcmtkaXI6IHN0cmluZyA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKHdvcmtkaXIpO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWIneWni+WMlllEU+WItuebmOeOr+WigyDlt6XkvZznm67lvZXvvJoke2Rpcn1gKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnRmlsZSA9IHBhdGgucmVzb2x2ZShkaXIsICd5ZHMuanNvbicpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZ0ZpbGVDcmVhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55Sf5oiQ6YWN572u5paH5Lu2IHlkcy5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdGaWxlLCBgI+ivt+agueaNruivtOaYjuS/ruaUuemFjee9ruaWh+S7tuW5tuWIoOmZpOaJgOacieazqOmHiuivtOaYjuWQjuS/neWtmFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJob3N0c1wiOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIuWmguaenOS9v+eUqOS6hnlkcy5iYXTliJ3lp4vnjq/looPvvIzlt7Lnu4/mt7vliqDkuoYgMTkyLjE2OC41MC40MCByZXBvLnl5cmQuY29tIDE5Mi4xNjguNTAuNDEgYmlwNS56aGlwZXIuY29tIDE5Mi4xNjguNTAuNDIgYmlwMy56aGlwZXIuY29tIGhvc3Rz6YWN572u6aG55Y+v5Lul5Yig6ZmkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1hdmVu5LuT5bqT56eB5pyN5a+55bqU55qEaG9zdOaYoOWwhFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpc3blvIDlj5Hnjq/looPlr7nlupTnmoRob3N05pig5bCEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJnaXRcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJocmNwZVwiOiBcIuWQjuerr+acjeWKoeWvueW6lOeahGdpdOWcsOWdgFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmZWNvZGVcIjogXCLmiqXlkYrmnI3liqHlr7nlupRnaXTlnLDlnYBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGFsb2dzXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICMg5a6i5oi35Luj56CB77yM55So5LqO5ZCv5Yqo5ZG95Luk55qEY2F0YWxvZ+WPguaVsFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnZWVyXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImhyY3BlXCI6IFwi5ZCO56uv5pyN5Yqh5YiG5pSvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmZWNvZGVcIjogXCLmiqXlkYrmnI3liqHliIbmlK9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVDcmVhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgPDw8PDw8PDw8PDw8PDzmo4DmtYtZRFMgSURF5a6J6KOFPj4+Pj4+Pj4+Pj4+Pj4+Pj5gKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29kZURpciA9IGAke2Rpcn0veWRzLTEuMC4zYDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRldmtpdERpciA9IGAke2NvZGVEaXJ9L2RldmtpdGA7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29kZURpcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2RlWmlwTmFtZSA9ICd5ZHMtMS4wLjMtamRrLTgtd2luZG93cy14ODZfNjQuemlwJ1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlronoo4VZRFMgSURFICR7Y29kZVppcE5hbWV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZVppcEZpbGUgPSBgJHtkaXJ9LyR7Y29kZVppcE5hbWV9YDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29kZVppcEZpbGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkuIvovb1ZRFMgSURFIOWuieijheWMhSAke2NvZGVaaXBGaWxlfWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDkuIvovb3lronoo4XljIXlubbovpPlh7rml6Xlv5dcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHt3Z2V0fSBodHRwczovL3lvbmNvbW11bml0eS55b255b3VjbG91ZC5jb20vWURTRG93bmxvYWQvV2luZG93L3g2NC8ke2NvZGVaaXBOYW1lfSAtTyBcIiR7Y29kZVppcEZpbGV9XCJgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS4i+i9vVlEUyBJREUg5a6J6KOF5YyFICR7Y29kZVppcEZpbGV9IOW3suWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7dW56aXB9XCIgXCIke2NvZGVaaXBGaWxlfVwiIC1kIFwiJHtjb2RlRGlyfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwMCkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgPDw8PDw8PDw8PDw8PDxZRFMgSURFIOWuieijheWujOaIkD4+Pj4+Pj4+Pj4+Pj4+Pj4+YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8g5a+85YWl6K+B5Lmm5YiwamF2YSDlpoLmnpxqYXZh5pivMS4454mI5pysIOmcgOimgeWvvOWFpeWIsCBKQVZBX0hPTUUvanJlL2xpYi9zZWN1cml0eS9jYWNlcnRzIOWmguaenOaYrzEx54mI5pysIOmcgOimgeWvvOWFpeWIsCBKQVZBX0hPTUUvbGliL3NlY3VyaXR5L2NhY2VydHNcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POWvvOWFpWphdmHor4HkuablvIDlp4s+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcbiAgICAgICAgICAgICAgICBsZXQgamF2YUhvbWUgPSBgJHtkZXZraXREaXJ9L2pkazguMC40NTItd2luX3g2NGA7XHJcbiAgICAgICAgICAgICAgICBsZXQga2V5dG9vbENtZCA9IGAke2phdmFIb21lfS9iaW4va2V5dG9vbGBcclxuICAgICAgICAgICAgICAgIGxldCBjZXJ0c0ZpbGVuYW1lID0gJ2xpYi9zZWN1cml0eS9jYWNlcnRzJztcclxuICAgICAgICAgICAgICAgIGxldCBjZXJ0c0ZpbGUgPSBgJHtqYXZhSG9tZX0vanJlLyR7Y2VydHNGaWxlbmFtZX1gO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOajgOafpWphdmHor4Hkuabnm67lvZUgJHtjZXJ0c0ZpbGV9YCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhjZXJ0c0ZpbGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5Yik5pat6K+B5Lmm5piv5ZCm5bey57uP5a+85YWlXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke2tleXRvb2xDbWR9XCIgLWxpc3QgLXYgLWtleXN0b3JlIFwiJHtjZXJ0c0ZpbGV9XCIgLXN0b3JlcGFzcyBjaGFuZ2VpdCAtLWFsaWFzIHl5cmRgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgeXlyZC5jcnQg6K+B5Lmm5bey5a2Y5ZyoYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDor4HkuabkuI3lrZjlnKhcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWvvOWFpSB5eXJkLmNydCDor4HkuabliLBqYXZhICR7Y2VydHNGaWxlfWApOyAvLyAke2Rpcn0veXlyZC5jcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke2tleXRvb2xDbWR9XCIgLWltcG9ydGNlcnQgLWZpbGUgXCIke3BhdGguam9pbihfX2Rpcm5hbWUsICcuLi95eXJkLmNydCcpfVwiIC1rZXlzdG9yZSBcIiR7Y2VydHNGaWxlfVwiIC1zdG9yZXBhc3MgY2hhbmdlaXQgLW5vcHJvbXB0IC0tYWxpYXMgeXlyZGApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgeXlyZC5jcnQg6K+B5Lmm5a+85YWl5a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85a+85YWlamF2YeivgeS5pue7k+adnz4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgPDw8PDw8PDw8PDw8PDzmo4DmtYttYXZlbuWuieijheW8gOWniz4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdmVuSG9tZSA9IGAke2RldmtpdERpcn0vYXBhY2hlLW1hdmVuLTMuOS45YDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzRmlsZSA9IGAke2Rpcn0vc2V0dGluZ3MueG1sYDtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhzZXR0aW5nc0ZpbGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS4i+i9vXNldHRpbmdzLnhtbGApO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7d2dldH0gJHtSU19VUkx9L3NldHRpbmdzLnhtbGApO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkuIvovb1zZXR0aW5ncy54bWzlrozmiJBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdmVuU2V0dGluZ3NGaWxlID0gcGF0aC5yZXNvbHZlKG1hdmVuSG9tZSwgJ2NvbmYvc2V0dGluZ3MueG1sJyk7XHJcbiAgICAgICAgICAgICAgICBmcy5ybVN5bmMobWF2ZW5TZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgICAgICAgICAgZnMuY3BTeW5jKHNldHRpbmdzRmlsZSwgbWF2ZW5TZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85qOA5rWLbWF2ZW7lronoo4XlrozmiJA+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85Yid5aeL5YyWbm9kZeeOr+WigyAgPj4+Pj4+Pj4+Pj4+Pj4+Pj5gKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoJ25wbSBpbnN0YWxsIC1nIHR5cGVzY3JpcHQgLS1yZWdpc3RyeT1odHRwczovL3JlZ2lzdHJ5Lm5wbW1pcnJvci5jb20nKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POWIneWni+WMlm5vZGXnjq/looPlrozmiJA+Pj4+Pj4+Pj4+Pj4+Pj4+PmApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POWIneWni+WMlllEUyBJREUg5YWo5bGA6YWN572uPj4+Pj4+Pj4+Pj4+Pj4+Pj5gKVxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3NKc29uID0gYCR7Y29kZURpcn0vQ29kZS9kYXRhL3VzZXItZGF0YS9Vc2VyL3NldHRpbmdzLmpzb25gO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNldHRpbmdzSnNvbk9iaiA9IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoc2V0dGluZ3NKc29uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzSnNvbk9iaiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHNldHRpbmdzSnNvbikudG9TdHJpbmcoJ3V0Zi04JykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHNldHRpbmdzSnNvbk9ialtcImphdmEuY29uZmlndXJhdGlvbi5ydW50aW1lc1wiXT1be1wibmFtZVwiOiBcIkphdmFTRS0xLjhcIixcInBhdGhcIjogamF2YUhvbWUsXCJkZWZhdWx0XCI6IHRydWV9XVxyXG4gICAgICAgICAgICAgICAgbGV0IHNldHRpbmdYbWwgPSBwYXRoLnJlc29sdmUoc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzSnNvbk9ialsnbWF2ZW4uZXhlY3V0YWJsZS5wYXRoJ10gPSBwYXRoLnJlc29sdmUoYCR7bWF2ZW5Ib21lfS9iaW4vbXZuLmNtZGApO1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqW1wiamF2YS5jb25maWd1cmF0aW9uLm1hdmVuLmdsb2JhbFNldHRpbmdzXCJdID0gc2V0dGluZ1htbDtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzSnNvbk9ialtcImphdmEuY29uZmlndXJhdGlvbi5tYXZlbi51c2VyU2V0dGluZ3NcIl0gPSBzZXR0aW5nWG1sO1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqW1wibWF2ZW4uc2V0dGluZ3NGaWxlXCJdID0gc2V0dGluZ1htbDtcclxuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NKc29uLCBKU09OLnN0cmluZ2lmeShzZXR0aW5nc0pzb25PYmosIG51bGwsIDQpKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POWIneWni+WMlllEUyBJREUg5YWo5bGA6YWN572u5a6M5oiQPj4+Pj4+Pj4+Pj4+Pj4+Pj5gKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDmo4Dmn6XlvZPliY3nlKjmiLfnm67lvZXkuIsuc3No5piv5ZCm5a2Y5ZyoIGlkX2VkMjU1MTkucHViIOWvhumSpeaWh+S7tu+8jOWmguaenOayoeacieWImeaUvuWIsC5zc2gg55uu5b2V5LiLXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzc2hEaXIgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEUsICcuc3NoJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc3NoRGlyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhzc2hEaXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGAke3NzaERpcn0vaWRfZWQyNTUxOS5wdWJgKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmi7fotJ3lr4bpkqXmlofku7ZgKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2lkX2VkMjU1MTkucHViJyksIGAke3NzaERpcn0vaWRfZWQyNTUxOS5wdWJgKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2lkX2VkMjU1MTknKSwgYCR7c3NoRGlyfS9pZF9lZDI1NTE5YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOaLt+i0neWvhumSpeaWh+S7tuWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWdGaWxlQ3JlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDphY3nva7mlofku7Z5ZHMuanNvbuW3sue7j+eUn+aIkO+8jOivt+S9v+eUqOe8lui+keWZqOWvuemFjee9ruWGheWuuei/m+ihjOS/ruaUuWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yid5aeL5YyWWURT5Yi255uY546v5aKD5a6M5oiQ77yM5aaC5p6c5piv6aaW5qyh5omn6KGM6K+35YWz6Zet5b2T5YmN56qX5Y+j77yM5bm26YeN5paw5omT5byAYClcclxuICAgICAgICAgICAgfSkuaG9vaygncG9zdEFjdGlvbicsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlpoLmnpzmiafooYzov4fnqIvkuK3lh7rnjrDmiqXplJnor7flhbPpl63lvZPliY3nu4jnq6/vvIzph43lkK/nu4jnq6/lkI7miafooYwgeWRzIGluaXQg55u05Yiw5peg5oql6ZSZ5YaF5a655Li65q2iYClcclxuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHByb2dyYW1cclxuICAgICAgICAgICAgLmNvbW1hbmQoJ3N0YXJ0IDxjYXRhbG9nPiBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAudXNhZ2UoJ3N0YXJ0IDxjYXRhbG9nPiBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAub3B0aW9uKCctZiwgLS1maWxlIDxmaWxlPicsICfphY3nva7mlofku7YnKVxyXG4gICAgICAgICAgICAuYWRkSGVscFRleHQoJ2FmdGVyJywgYOmFjee9ruaWh+S7tuWGheWuueekuuS+i++8miR7Y29uZkVnfWApXHJcbiAgICAgICAgICAgIC5kZXNjcmlwdGlvbign5ZCv5Yqo5Yi255uY546v5aKD77yMY2F0YWxvZ+ihqOekuumcgOimgeWItuebmOeahOaooeWdl++8jOWvueW6lOmFjee9ruaWh+S7tuS4rWNhdGFsb2dz55qEa2V55YC877yM55So5LqO5oyH5a6a6ZyA6KaB5Ye655uY55qE5L+h5oGv77yMd29ya2RpcuihqOekuuWItuebmOW3peS9nOebruW9le+8jOWmguaenOS4jeaMh+WumuWImeS9v+eUqOW9k+WJjeebruW9lScpXHJcbiAgICAgICAgICAgIC5hY3Rpb24oYXN5bmMgKGNhdGFsb2c6IHN0cmluZywgd29ya2Rpcjogc3RyaW5nID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpLCBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICBmaWxlOiBzdHJpbmdcclxuICAgICAgICAgICAgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKHdvcmtkaXIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaWRlRGlyID0gcGF0aC5yZXNvbHZlKGRpciwgJ3lkcy0xLjAuMycpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZXZLaXREaXIgPSBwYXRoLnJlc29sdmUoaWRlRGlyLCAnZGV2a2l0Jyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGlkZURpcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOacquaJvuWIsElERSAke2lkZURpcn0sIOivt+WFiOaJp+ihjCBpbml0IOWIneWni+WMluWItuebmOeOr+Wig2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIOWmguaenOacquaMh+WumumFjee9ruaWh+S7tlxyXG4gICAgICAgICAgICAgICAgbGV0IHlkc0pzb246IHN0cmluZztcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB5ZHNKc29uID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMuZmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g6K+75Y+W6YWN572u5paH5Lu2XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHlkc0pzb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg5pyq5om+5Yiw6YWN572u5paH5Lu2ICR7eWRzSnNvbn1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeWRzSnNvbiA9IHBhdGgucmVzb2x2ZShgJHtkaXJ9L3lkcy5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g6K+75Y+W6YWN572u5paH5Lu2XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHlkc0pzb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6K+36YCa6L+H5Y+C5pWwIC1mIOaMh+WumumcgOimgeS9v+eUqOeahOmFjee9ruaWh+S7tuaIluiAheWcqOW9k+WJjeebruW9leS4i+WIm+W7unlkcy5qc29u5paH5Lu277yM5YaF5a655Y+C6ICDJHtjb25mRWd9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5byA5aeL5Yi255uYICR7Y2F0YWxvZ30g5bel5L2c55uu5b2V77yaJHtkaXJ9YCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5nWG1sID0gcGF0aC5yZXNvbHZlKGRpciwgJ3NldHRpbmdzLnhtbCcpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbXZuQ21kID0gcGF0aC5yZXNvbHZlKGRldktpdERpciwgJ2FwYWNoZS1tYXZlbi0zLjkuOS9iaW4vbXZuLmNtZCcpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2l0Q21kID0gYCR7ZGV2S2l0RGlyfS9HaXQvYmluL2dpdC5leGVgO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBNYXZlbuWRveS7pO+8miAke212bkNtZH0gU2V0dGluZ3PvvJoke3NldHRpbmdYbWx9IEdpdO+8miR7Z2l0Q21kfWApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB5ZHNKc29uU3RyID0gZnMucmVhZEZpbGVTeW5jKHlkc0pzb24pLnRvU3RyaW5nKCd1dGYtOCcpO1xyXG4gICAgICAgICAgICAgICAgLy8g5pu/5o2i5omA5pyJIyDlvIDlpLTnmoTms6jph4ror7TmmI7ooYxcclxuICAgICAgICAgICAgICAgIHlkc0pzb25TdHIgPSB5ZHNKc29uU3RyLnJlcGxhY2UoL14jLiovZ20sICcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDmo4DmtYvphY3nva7mlofku7bmmK/lkKblrozmlbRcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmo4Dmn6XphY3nva7mlofku7YgJHt5ZHNKc29ufSDmmK/lkKblrozmlbQt5byA5aeLYClcclxuICAgICAgICAgICAgICAgIGxldCBjb25maWc6IFlkc0NvbmZpZztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQ29uZmlnRXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSDmoLzlvI/plJnor68g5Y+C6ICD56S65L6L77yaJHtjb25mRWd9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKHlkc0pzb25TdHIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmNhdGFsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ29uZmlnRXJyb3IoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0NvbmZpZ0Vycm9yKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGdpdCA9IGNvbmZpZy5naXQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYXRhbG9nQ29uZmlnID0gY29uZmlnLmNhdGFsb2dzW2NhdGFsb2ddO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXRhbG9nQ29uZmlnID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6YWN572u5paH5Lu2ICR7eWRzSnNvbn0g5om+5LiN5YiwIGNhdGFsb2dzLiR7Y2F0YWxvZ30g5YWI5YWz6YWN572uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXRhbG9nQ29uZmlnLmhyY3BlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgY2F0YWxvZ0NvbmZpZy5mZWNvZGUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSBjYXRhbG9ncy4ke2NhdGFsb2d9LmhyY3BlIOaIliBjYXRhbG9ncy4ke2NhdGFsb2d9LmZlY29kZSDlrZfmrrXnvLrlpLFgKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5qOA5p+l6YWN572u5paH5Lu2ICR7eWRzSnNvbn0g5piv5ZCm5a6M5pW0Lee7k+adn2ApXHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gYCR7ZGlyfS8ke2NhdGFsb2d9YDtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhuYW1lc3BhY2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWIm+W7uuebruW9lSAke25hbWVzcGFjZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmMobmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOebruW9lSAke25hbWVzcGFjZX0g5bey5a2Y5ZyoYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgaHJjcGVVcmwgPSB0eXBlb2YgY2F0YWxvZ0NvbmZpZy5ocmNwZSA9PT0gJ3N0cmluZycgPyBnaXQ/LmhyY3BlIDogY2F0YWxvZ0NvbmZpZy5ocmNwZS51cmw7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhyY3BlVXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSBjYXRhbG9ncy4ke2NhdGFsb2d9IOWQjuerr+acjeWKoSDmnKrmjIflrprku5PlupPlnLDlnYDvvIzor7fpgJrov4cgZ2l0LmhyY3BlIOaIluiAhSBjYXRhbG9ncy4ke2NhdGFsb2d9LmhyY3BlLnVybCDmjIflrprku5PlupPlnLDlnYBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlvIDlp4vmi4nlj5blkI7nq6/mnI3liqHku5PlupMgJHtocmNwZVVybH1gKTtcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGAke25hbWVzcGFjZX0vLmdpdGApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOebruW9lSAke25hbWVzcGFjZX0g5bey5a2Y5Zyo77yM5byA5aeL5pu05paw5LuT5bqTYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke2dpdENtZH1cIiBwdWxsYCwgbmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOebruW9lSAke25hbWVzcGFjZX0g5LiN5a2Y5Zyo77yM5byA5aeL5Yib5bu65LuT5bqTYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5jaCA9IHR5cGVvZiBjYXRhbG9nQ29uZmlnLmhyY3BlID09PSAnc3RyaW5nJyA/IGNhdGFsb2dDb25maWcuaHJjcGUgOiBjYXRhbG9nQ29uZmlnLmhyY3BlLmJyYW5jaDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJyYW5jaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOmFjee9ruaWh+S7tiAke3lkc0pzb259IGNhdGFsb2dzLiR7Y2F0YWxvZ30g5ZCO56uv5pyN5YqhIOacquaMh+WumuWIhuaUr++8jOivt+mAmui/hyBnaXQuaHJjcGUg5oiW6ICFIGNhdGFsb2dzLiR7Y2F0YWxvZ30uaHJjcGUuYnJhbmNoIOmFjee9ruWIhuaUr2ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7Z2l0Q21kfSBjbG9uZSAtYiAke2JyYW5jaH0gJHtocmNwZVVybH0gJHtuYW1lc3BhY2V9YCwgbmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmi4nlj5blkI7nq6/mnI3liqHku5PlupPlrozmiJBgKTtcclxuICAgICAgICAgICAgICAgIGxldCBib29zdHJhcFBvbVhtbCA9IGAke25hbWVzcGFjZX0vJHtkb21haW5LZXl9LWJlL2Rldi0ke2RvbWFpbktleX0tYm9vdHN0cmFwL3BvbS54bWxgO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOabv+aNouaWh+S7tiAke2Jvb3N0cmFwUG9tWG1sfSDkuK3nmoRST09U5Li6ZG9tYWluS2V577yM5ZCm5YiZ5Lya5a+86Ie05Yi255uY5aSx6LSl77yM5peg5rOV5om+5Yiw5Yi25ZOBYCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib29zdHJhcFBvbVhtbFN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhib29zdHJhcFBvbVhtbCkudG9TdHJpbmcoJ3V0Zi04Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9vc3RyYXBQb21YbWxTdHJpbmcuaW5jbHVkZXMoJ1JPT1QnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoYm9vc3RyYXBQb21YbWwsIGJvb3N0cmFwUG9tWG1sU3RyaW5nLnJlcGxhY2UoL1JPT1QvZywgZG9tYWluS2V5KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5ob3N0cyAmJiBjb25maWcuaG9zdHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWtmOWcqGhvc3Rz6YWN572u77yM5qOA5rWL57O757ufaG9zdHPphY3nva7mlofku7bmmK/lkKblt7Lnu4/phY3nva5gKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdHNGaWxlID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LldJTkRJUiwgJ1N5c3RlbTMyJywgJ2RyaXZlcnMnLCAnZXRjJywgJ2hvc3RzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9zdExpc3QgPSBmcy5yZWFkRmlsZVN5bmMoaG9zdHNGaWxlKS50b1N0cmluZygndXRmLTgnKS5zcGxpdCgnXFxuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwcGVuZEhvc3RzID0gWy4uLmNvbmZpZy5ob3N0c11cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBob3N0SXRlbSBvZiBob3N0TGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLyMvLnRlc3QoaG9zdEl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhcHBlbmRIb3N0IG9mIGNvbmZpZy5ob3N0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2lwLCBkb21haW5dID0gYXBwZW5kSG9zdC5zcGxpdCgnICcpLmZpbHRlcihpdGVtID0+IGl0ZW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9zdEl0ZW0uaW5jbHVkZXMoaXApICYmIGhvc3RJdGVtLmluY2x1ZGVzKGRvbWFpbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg57O757ufaG9zdHPphY3nva7mlofku7blt7LlrZjlnKggJHthcHBlbmRIb3N0fWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEhvc3RzLnJlbW92ZShhcHBlbmRIb3N0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyDor7vlj5bns7vnu59ob3N0c+mFjee9ruaWh+S7tlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHBlbmRIb3N0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWRtaW4oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuYXBwZW5kRmlsZVN5bmMoaG9zdHNGaWxlLCBgXFxuJHthcHBlbmRIb3N0cy5qb2luKCdcXG4nKX1cXG5gLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6ICd1dGYtOCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOW9k+WJjemdnueuoeeQhuWRmOWQr+WKqOaXoOazleabtOaUuWhvc3Rz5paH5Lu277yM6K+35L2/55So566h55CG5ZGY5ZCv5Yqo5oiW6ICF5omL5Yqo5re75YqgICR7YXBwZW5kSG9zdHMuam9pbignXFxuJyl9IOWIsOaWh+S7tiAke2hvc3RzRmlsZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgaG9zdHMg6YWN572u5qOA5rWL5a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ+WIneWni+WMlumhueebrm1hdmVu546v5aKDJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgbXZuQ29uZmlnRGlyID0gYCR7bmFtZXNwYWNlfS8ubXZuYDtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhtdm5Db25maWdEaXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke212bkNtZH1cIiAtTiBpby50YWthcmk6bWF2ZW46d3JhcHBlciAtRG1hdmVuPTMuOC42YCwgbmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIOWGmeWFpW1hdmVu6YWN572u5YiwIC5tdm4vbWF2ZW4uY29uZmlnXHJcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnRmlsZSA9IGAke212bkNvbmZpZ0Rpcn0vbWF2ZW4uY29uZmlnYDtcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMucm1TeW5jKGNvbmZpZ0ZpbGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGAke212bkNvbmZpZ0Rpcn0vbWF2ZW4uY29uZmlnYCwgYC1zXFxuJHtzZXR0aW5nWG1sfVxcbi1EbWF2ZW4ud2Fnb24uaHR0cC5zc2wuaW5zZWN1cmU9dHJ1ZVxcbi1EbWF2ZW4ud2Fnb24uaHR0cC5zc2wuYWxsb3dhbGw9dHJ1ZWApO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOW9k+WJjW1hdmVu5L+h5oGvYClcclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHttdm5DbWR9XCIgLS12ZXJzaW9uYCwgbmFtZXNwYWNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn6aG555uubWF2ZW7muIXnkIYnKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke212bkNtZH1cIiBjbGVhbiBjb21waWxlIGluc3RhbGwgLURza2lwVGVzdHNgLCBgJHtuYW1lc3BhY2V9LyR7ZG9tYWluS2V5fS1iZWApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCflpITnkIbliY3nq6/mnoTlu7rvvIzlop7liqDmnoTlu7rmlofku7YnKTtcclxuICAgICAgICAgICAgICAgIGxldCBmZURpciA9IGAke25hbWVzcGFjZX0vJHtkb21haW5LZXl9LWZlYDtcclxuICAgICAgICAgICAgICAgIGxldCBmZUJ1aWxkSnMgPSBgJHtmZURpcn0vYnVpbGQuanNgO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZlQnVpbGRKcykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jcFN5bmMocGF0aC5qb2luKF9fZGlybmFtZSAsJy4uL2ZlLWJ1aWxkLmpzJyksIGZlQnVpbGRKcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZmVQYWNrYWdlSnNvbiA9IGAke2ZlRGlyfS9wYWNrYWdlLmpzb25gO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2FnZVN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhmZVBhY2thZ2VKc29uKS50b1N0cmluZygndXRmLTgnKTtcclxuICAgICAgICAgICAgICAgIGlmICghcGFja2FnZVN0cmluZy5pbmNsdWRlcygnYnVpbGQuanMnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkv67mlLkke2ZlUGFja2FnZUpzb259YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VTdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VKc29uLnNjcmlwdHNbJ2J1aWxkOmV4dGVuZCddICs9ICcgJiYgbm9kZSBidWlsZC5qcyc7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmZVBhY2thZ2VKc29uLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgNCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkv67mlLkke2ZlUGFja2FnZUpzb2595a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBmZWNvZGVVcmwgPSB0eXBlb2YgY2F0YWxvZ0NvbmZpZy5mZWNvZGUgPT09ICdzdHJpbmcnID8gZ2l0Py5mZWNvZGUgOiBjYXRhbG9nQ29uZmlnLmZlY29kZS51cmw7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZlY29kZVVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6YWN572u5paH5Lu2ICR7eWRzSnNvbn0gY2F0YWxvZ3MuJHtjYXRhbG9nfSDlkI7nq6/mnI3liqEg5pyq5oyH5a6a5LuT5bqT5Zyw5Z2A77yM6K+36YCa6L+HIGdpdC5mZWNvZGUg5oiW6ICFIGNhdGFsb2dzLiR7Y2F0YWxvZ30uZmVjb2RlLnVybCDmjIflrprku5PlupPlnLDlnYBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlvIDlp4vmi4nlj5bmiqXlkYrmnI3liqHku5PlupMgJHtmZWNvZGVVcmx9YCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVwb3J0TmFtZXNwYWNlID0gYCR7bmFtZXNwYWNlfS95b25iaXAteWlzdi1penAxLWRldi1mZWNvZGVgO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7cmVwb3J0TmFtZXNwYWNlfS8uZ2l0YCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55uu5b2VICR7cmVwb3J0TmFtZXNwYWNlfSDlt7LlrZjlnKjvvIzlvIDlp4vmm7TmlrDku5PlupNgKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke2dpdENtZH0gcHVsbGAsIHJlcG9ydE5hbWVzcGFjZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDnm67lvZUgJHtyZXBvcnROYW1lc3BhY2V9IOS4jeWtmOWcqO+8jOW8gOWni+WIm+W7uuS7k+W6k2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBicmFuY2ggPSB0eXBlb2YgY2F0YWxvZ0NvbmZpZy5mZWNvZGUgPT09ICdzdHJpbmcnID8gY2F0YWxvZ0NvbmZpZy5mZWNvZGUgOiBjYXRhbG9nQ29uZmlnLmZlY29kZS5icmFuY2g7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFicmFuY2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSBjYXRhbG9ncy4ke2NhdGFsb2d9IOaKpeWRiuacjeWKoeacquaMh+WumuWIhuaUr++8jOivt+mAmui/hyBnaXQuZmVjb2RlIOaIluiAhSBjYXRhbG9ncy4ke2NhdGFsb2d9LmZlY29kZS5icmFuY2gg6YWN572u5YiG5pSvYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHtnaXRDbWR9IGNsb25lIC1iICR7YnJhbmNofSAke2ZlY29kZVVybH0gJHtyZXBvcnROYW1lc3BhY2V9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5ouJ5Y+W5oql5ZGK5pyN5Yqh5LuT5bqT5a6M5oiQYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ+WkhOeQhuaKpeWRiuaehOW7uu+8jOWinuWKoOaehOW7uuaWh+S7ticpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZlY29kZUJ1aWxkSnMgPSBgJHtyZXBvcnROYW1lc3BhY2V9L2J1aWxkLmpzYDtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmZWNvZGVCdWlsZEpzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNwU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lICwnLi4vZmVjb2RlLWJ1aWxkLmpzJyksIGZlY29kZUJ1aWxkSnMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGZlY29kZVBhY2thZ2VKc29uID0gYCR7cmVwb3J0TmFtZXNwYWNlfS9wYWNrYWdlLmpzb25gO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmVjb2RlUGFja2FnZVN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhmZWNvZGVQYWNrYWdlSnNvbikudG9TdHJpbmcoJ3V0Zi04Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZlY29kZVBhY2thZ2VTdHJpbmcuaW5jbHVkZXMoJ2J1aWxkLmpzJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5L+u5pS5JHtmZWNvZGVQYWNrYWdlSnNvbn1gKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZmVjb2RlUGFja2FnZVN0cmluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja2FnZUpzb24uc2NyaXB0c1snYnVpbGQnXSArPSAnICYmIG5vZGUgYnVpbGQuanMnO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VKc29uLmRvbWFpbktleSA9IGRvbWFpbktleTtcclxuICAgICAgICAgICAgICAgICAgICAvLyDliKDpmaTmraTkvp3otZYg5Lya5a+86Ie0bnBtIGkg5aSx6LSlXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcy56bGliXHJcbiAgICAgICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmZWNvZGVQYWNrYWdlSnNvbiwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDQpKTtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5L+u5pS5JHtmZWNvZGVQYWNrYWdlSnNvbn3lrozmiJBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5a6J6KOF5oql5ZGK5pyN5Yqh5L6d6LWWYCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKCducG0gaScsIHJlcG9ydE5hbWVzcGFjZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOeUn+aIkHZlcnNpb24uanNvbiDmlofku7ZgKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IHJhbmRvbVVVSUQoKS50b1N0cmluZygpXHJcbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGAke3JlcG9ydE5hbWVzcGFjZX0vdmVyc2lvbi5qc29uYCwgYHtcInZlcnNpb25cIjogXCIke3V1aWR9XCJ9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ+WIneWni+WMlumhueebrueOr+Wig+i1hOa6kCcpO1xyXG4gICAgICAgICAgICAgICAgLy8g5aaC5p6cIG5hbWVzcGFjZS8oZGlza3xkaXNrcykg5aaC5p6c5a2Y5ZyoIOi3s+i/h1xyXG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7bmFtZXNwYWNlfS9kaXNrYCkgfHwgZnMuZXhpc3RzU3luYyhgJHtuYW1lc3BhY2V9L2Rpc2tzYCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5bey5a2Y5Zyo77yM6Lez6L+H546v5aKD6LWE5rqQ5paH5Lu25LiL6L29YCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZGZzLnpoaXBlci5jb20vdjNyNi9lbnYuemlwXHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOW8gOWni+S4i+i9vemhueebrueOr+Wig+i1hOa6kOaWh+S7tmApXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdpdFppcEZpbGUgPSBgJHtuYW1lc3BhY2V9L2Vudi56aXBgO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7d2dldH0gJHtSU19VUkx9L2Vudi56aXAgLU8gXCIke2dpdFppcEZpbGV9XCJgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOino+WOi+i1hOa6kOaWh+S7tuWMhSAke2dpdFppcEZpbGV9YClcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7dW56aXB9XCIgXCIke2dpdFppcEZpbGV9XCJgLCBuYW1lc3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLnJtU3luYyhnaXRaaXBGaWxlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCflkK/liqhJREUnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHtpZGVEaXJ9L0NvZGUvYmluL2NvZGVcIiAtLW5vLXNhbmRib3ggLS1sb2cgZGVidWcgLS1nb3RvIFwiJHtpZGVEaXJ9L0NvZGUvZGF0YS91c2VyLWRhdGEvVXNlci9zZXR0aW5ncy5qc29uXCIgXCIke25hbWVzcGFjZX1cImApO1xyXG4gICAgICAgICAgICAgICAgLy8g6ZyA6KaB562J5b6FSURF5ZCv5Yqo5a6M5oiQ5ZCO5YWz6ZetXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMzAwMCkpXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn5bey5ZCv5YqoSURF77yM54K55Ye75bem5L6n6I+c5Y2V6YCJ5oup4oCcWURT4oCd77yM6K+35oyJ54Wn5paH5qGj6K+05piO6L+b6KGM5Yi255uY5pON5L2cJyk7XHJcbiAgICAgICAgICAgIH0pLmhvb2soJ3Bvc3RBY3Rpb24nLCAoKSA9PiBwcm9jZXNzLmV4aXQoMCkpO1xyXG5cclxuICAgICAgICBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndilcclxuICAgIH1cclxufVxyXG4iXX0=
|
package/package.json
CHANGED
package/src/main.ts
CHANGED
|
@@ -124,141 +124,72 @@ export default class Main {
|
|
|
124
124
|
configFileCreated = true;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
logger.info(`<<<<<<<<<<<<<<检测
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if (!fs.existsSync(gitZipFile)) {
|
|
127
|
+
logger.info(`<<<<<<<<<<<<<<检测YDS IDE安装>>>>>>>>>>>>>>>>>`)
|
|
128
|
+
const codeDir = `${dir}/yds-1.0.3`;
|
|
129
|
+
const devkitDir = `${codeDir}/devkit`;
|
|
130
|
+
if (!fs.existsSync(codeDir)) {
|
|
131
|
+
const codeZipName = 'yds-1.0.3-jdk-8-windows-x86_64.zip'
|
|
132
|
+
logger.info(`安装YDS IDE ${codeZipName}`);
|
|
133
|
+
const codeZipFile = `${dir}/${codeZipName}`;
|
|
134
|
+
if (!fs.existsSync(codeZipFile)) {
|
|
135
|
+
logger.info(`下载YDS IDE 安装包 ${codeZipFile}`);
|
|
137
136
|
// 下载安装包并输出日志
|
|
138
|
-
await execCmd(`${wget}
|
|
139
|
-
logger.info(
|
|
140
|
-
await execCmd(`"${unzip}" "${gitZipFile}" -d "${dir}"`);
|
|
141
|
-
}
|
|
142
|
-
logger.info(`git 安装完成`);
|
|
143
|
-
}
|
|
144
|
-
logger.info(`<<<<<<<<<<<<<<检测git安装结束>>>>>>>>>>>>>>>>>`)
|
|
145
|
-
|
|
146
|
-
logger.info(`<<<<<<<<<<<<<<检测java安装开始>>>>>>>>>>>>>>>>>`)
|
|
147
|
-
const javaExists = await util.cmd.exists('java');
|
|
148
|
-
logger.info(`检查是否安装了java >> ${javaExists ? '已安装' : '未安装'}`);
|
|
149
|
-
let javaHome = process.env.JAVA_HOME;
|
|
150
|
-
if (!javaExists) {
|
|
151
|
-
javaHome = `${dir}/jdk1.8.0_471`;
|
|
152
|
-
if(!fs.existsSync(javaHome)) {
|
|
153
|
-
logger.info('未找到java,准备安装java,开始下载jdk');
|
|
154
|
-
const jdkZipName = 'jdk-8u471-windows-x64.zip'
|
|
155
|
-
if (!fs.existsSync(`${dir}/${jdkZipName}`)) {
|
|
156
|
-
logger.info(`下载jdk 安装包 ${jdkZipName}`);
|
|
157
|
-
await execCmd(`${wget} ${RS_URL}/${jdkZipName} -O "${dir}/${jdkZipName}"`);
|
|
158
|
-
logger.info(`下载jdk 安装包 ${dir}/${jdkZipName} 已完成`)
|
|
159
|
-
}
|
|
160
|
-
logger.info(`解压jdk 安装包 ${dir}/${jdkZipName}`)
|
|
161
|
-
await execCmd(`"${unzip}" "${dir}/${jdkZipName}"`, dir);
|
|
162
|
-
|
|
163
|
-
logger.info(`jdk安装完成`);
|
|
137
|
+
await execCmd(`${wget} https://yoncommunity.yonyoucloud.com/YDSDownload/Window/x64/${codeZipName} -O "${codeZipFile}"`);
|
|
138
|
+
logger.info(`下载YDS IDE 安装包 ${codeZipFile} 已完成`);
|
|
164
139
|
}
|
|
140
|
+
await execCmd(`"${unzip}" "${codeZipFile}" -d "${codeDir}"`);
|
|
141
|
+
await new Promise((resolve) => setTimeout(resolve, 5000))
|
|
165
142
|
}
|
|
166
|
-
|
|
167
|
-
logger.error('未找到java,请检查是否安装java并设置JAVA_HOME环境变量');
|
|
168
|
-
// 设置JAVA_HOME 环境变量
|
|
169
|
-
await execCmd(`setx JAVA_HOME "${javaHome}" && set JAVA_HOME="${javaHome}"`);
|
|
170
|
-
process.env.JAVA_HOME = javaHome;
|
|
171
|
-
}
|
|
172
|
-
await execCmd(`"${javaHome}/bin/java" -version`);
|
|
173
|
-
logger.info(`<<<<<<<<<<<<<<检测java安装结束>>>>>>>>>>>>>>>>>`)
|
|
143
|
+
logger.info(`<<<<<<<<<<<<<<YDS IDE 安装完成>>>>>>>>>>>>>>>>>`);
|
|
174
144
|
|
|
175
145
|
// 导入证书到java 如果java是1.8版本 需要导入到 JAVA_HOME/jre/lib/security/cacerts 如果是11版本 需要导入到 JAVA_HOME/lib/security/cacerts
|
|
176
146
|
logger.info(`<<<<<<<<<<<<<<导入java证书开始>>>>>>>>>>>>>>>>>`)
|
|
147
|
+
let javaHome = `${devkitDir}/jdk8.0.452-win_x64`;
|
|
148
|
+
let keytoolCmd = `${javaHome}/bin/keytool`
|
|
177
149
|
let certsFilename = 'lib/security/cacerts';
|
|
178
|
-
let certsFile = `${javaHome}/${certsFilename}`;
|
|
179
|
-
if (!fs.existsSync(certsFile)) {
|
|
180
|
-
certsFile = `${javaHome}/jre/${certsFilename}`;
|
|
181
|
-
}
|
|
150
|
+
let certsFile = `${javaHome}/jre/${certsFilename}`;
|
|
182
151
|
logger.info(`检查java证书目录 ${certsFile}`);
|
|
183
152
|
if (fs.existsSync(certsFile)) {
|
|
184
|
-
const keytoolCmd = `"${javaHome}/bin/keytool"`;
|
|
185
153
|
// 判断证书是否已经导入
|
|
186
154
|
try {
|
|
187
|
-
await execCmd(
|
|
155
|
+
await execCmd(`"${keytoolCmd}" -list -v -keystore "${certsFile}" -storepass changeit --alias yyrd`)
|
|
188
156
|
logger.info(`yyrd.crt 证书已存在`);
|
|
189
157
|
} catch (e) {
|
|
190
158
|
// 证书不存在
|
|
191
159
|
logger.info(`导入 yyrd.crt 证书到java ${certsFile}`); // ${dir}/yyrd.crt
|
|
192
|
-
await execCmd(
|
|
160
|
+
await execCmd(`"${keytoolCmd}" -importcert -file "${path.join(__dirname, '../yyrd.crt')}" -keystore "${certsFile}" -storepass changeit -noprompt --alias yyrd`);
|
|
193
161
|
logger.info(`yyrd.crt 证书导入完成`);
|
|
194
162
|
}
|
|
195
163
|
}
|
|
196
164
|
logger.info(`<<<<<<<<<<<<<<导入java证书结束>>>>>>>>>>>>>>>>>`)
|
|
197
165
|
|
|
198
166
|
logger.info(`<<<<<<<<<<<<<<检测maven安装开始>>>>>>>>>>>>>>>>>`)
|
|
199
|
-
const
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
if (!mavenExists) {
|
|
203
|
-
if (!fs.existsSync(mavenHome)) {
|
|
204
|
-
const mavenZipName = 'maven-3.8.6.zip'
|
|
205
|
-
logger.info(`安装maven ${mavenZipName}`);
|
|
206
|
-
const mavenZipFile = `${dir}/${mavenZipName}`;
|
|
207
|
-
// 检查是否已经存在安装包 如果有先删除
|
|
208
|
-
if (!fs.existsSync(mavenZipFile)) {
|
|
209
|
-
logger.info(`下载maven 安装包 ${mavenZipFile}`);
|
|
210
|
-
// 下载安装包并输出日志
|
|
211
|
-
await execCmd(`${wget} ${RS_URL}/${mavenZipName} -O "${mavenZipFile}"`);
|
|
212
|
-
logger.info(`下载maven 安装包 ${mavenZipFile} 已完成`)
|
|
213
|
-
}
|
|
214
|
-
logger.info(`解压安装包 ${mavenZipFile}`)
|
|
215
|
-
await execCmd(`"${unzip}" "${mavenZipFile}" -d "${dir}"`);
|
|
216
|
-
logger.info(`maven 安装完成`);
|
|
217
|
-
}
|
|
218
|
-
} else if (!fs.existsSync(`${dir}/settings.xml`)) {
|
|
167
|
+
const mavenHome = `${devkitDir}/apache-maven-3.9.9`;
|
|
168
|
+
const settingsFile = `${dir}/settings.xml`;
|
|
169
|
+
if (!fs.existsSync(settingsFile)) {
|
|
219
170
|
logger.info(`下载settings.xml`);
|
|
220
171
|
await execCmd(`${wget} ${RS_URL}/settings.xml`);
|
|
221
172
|
logger.info(`下载settings.xml完成`);
|
|
222
173
|
}
|
|
174
|
+
const mavenSettingsFile = path.resolve(mavenHome, 'conf/settings.xml');
|
|
175
|
+
fs.rmSync(mavenSettingsFile);
|
|
176
|
+
fs.cpSync(settingsFile, mavenSettingsFile);
|
|
223
177
|
logger.info(`<<<<<<<<<<<<<<检测maven安装完成>>>>>>>>>>>>>>>>>`)
|
|
224
178
|
|
|
225
179
|
logger.info(`<<<<<<<<<<<<<<初始化node环境 >>>>>>>>>>>>>>>>>`);
|
|
226
180
|
await execCmd('npm install -g typescript --registry=https://registry.npmmirror.com');
|
|
227
181
|
logger.info(`<<<<<<<<<<<<<<初始化node环境完成>>>>>>>>>>>>>>>>>`);
|
|
228
182
|
|
|
229
|
-
logger.info(`<<<<<<<<<<<<<<检测YDS IDE安装>>>>>>>>>>>>>>>>>`)
|
|
230
|
-
const codeDir = `${dir}/yds-1.0.3`;
|
|
231
|
-
if (!fs.existsSync(codeDir)) {
|
|
232
|
-
const codeZipName = 'yds-1.0.3-jdk-8-windows-x86_64.zip'
|
|
233
|
-
logger.info(`安装YDS IDE ${codeZipName}`);
|
|
234
|
-
const codeZipFile = `${dir}/${codeZipName}`;
|
|
235
|
-
if (!fs.existsSync(codeZipFile)) {
|
|
236
|
-
logger.info(`下载YDS IDE 安装包 ${codeZipFile}`);
|
|
237
|
-
// 下载安装包并输出日志
|
|
238
|
-
await execCmd(`${wget} https://yoncommunity.yonyoucloud.com/YDSDownload/Window/x64/${codeZipName} -O "${codeZipFile}"`);
|
|
239
|
-
logger.info(`下载YDS IDE 安装包 ${codeZipFile} 已完成`);
|
|
240
|
-
}
|
|
241
|
-
await execCmd(`"${unzip}" "${codeZipFile}" -d "${codeDir}"`);
|
|
242
|
-
await new Promise((resolve) => setTimeout(resolve, 5000))
|
|
243
|
-
}
|
|
244
|
-
logger.info(`<<<<<<<<<<<<<<YDS IDE 安装完成>>>>>>>>>>>>>>>>>`);
|
|
245
|
-
|
|
246
|
-
|
|
247
183
|
logger.info(`<<<<<<<<<<<<<<初始化YDS IDE 全局配置>>>>>>>>>>>>>>>>>`)
|
|
248
184
|
const settingsJson = `${codeDir}/Code/data/user-data/User/settings.json`;
|
|
249
185
|
let settingsJsonObj = {};
|
|
250
186
|
if (fs.existsSync(settingsJson)) {
|
|
251
187
|
settingsJsonObj = JSON.parse(fs.readFileSync(settingsJson).toString('utf-8'));
|
|
252
188
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
}
|
|
257
|
-
let settingXml = path.resolve(`${dir}/settings.xml`);
|
|
258
|
-
if (!fs.existsSync(settingXml)) { // 如果存在全局命令则使用的是根目录下的settings.xml 否则使用根目录下maven的settings.xml
|
|
259
|
-
settingXml = path.resolve(`${mavenHome}/conf/settings.xml`);
|
|
260
|
-
settingsJsonObj['maven.executable.path'] = path.resolve(`${mavenHome}/bin/mvn.cmd`);
|
|
261
|
-
}
|
|
189
|
+
|
|
190
|
+
settingsJsonObj["java.configuration.runtimes"]=[{"name": "JavaSE-1.8","path": javaHome,"default": true}]
|
|
191
|
+
let settingXml = path.resolve(settingsFile);
|
|
192
|
+
settingsJsonObj['maven.executable.path'] = path.resolve(`${mavenHome}/bin/mvn.cmd`);
|
|
262
193
|
settingsJsonObj["java.configuration.maven.globalSettings"] = settingXml;
|
|
263
194
|
settingsJsonObj["java.configuration.maven.userSettings"] = settingXml;
|
|
264
195
|
settingsJsonObj["maven.settingsFile"] = settingXml;
|
|
@@ -296,6 +227,13 @@ export default class Main {
|
|
|
296
227
|
file: string
|
|
297
228
|
}) => {
|
|
298
229
|
const dir = path.resolve(workdir);
|
|
230
|
+
const ideDir = path.resolve(dir, 'yds-1.0.3')
|
|
231
|
+
const devKitDir = path.resolve(ideDir, 'devkit');
|
|
232
|
+
|
|
233
|
+
if (!fs.existsSync(ideDir)) {
|
|
234
|
+
logger.error(`未找到IDE ${ideDir}, 请先执行 init 初始化制盘环境`);
|
|
235
|
+
process.exit(1)
|
|
236
|
+
}
|
|
299
237
|
|
|
300
238
|
// 如果未指定配置文件
|
|
301
239
|
let ydsJson: string;
|
|
@@ -314,52 +252,19 @@ export default class Main {
|
|
|
314
252
|
process.exit(1);
|
|
315
253
|
}
|
|
316
254
|
}
|
|
317
|
-
|
|
318
255
|
logger.info(`开始制盘 ${catalog} 工作目录:${dir}`);
|
|
256
|
+
const settingXml = path.resolve(dir, 'settings.xml');
|
|
257
|
+
const mvnCmd = path.resolve(devKitDir, 'apache-maven-3.9.9/bin/mvn.cmd');
|
|
258
|
+
const gitCmd = `${devKitDir}/Git/bin/git.exe`;
|
|
319
259
|
|
|
320
|
-
logger.info(
|
|
321
|
-
let gitCmd = 'git';
|
|
322
|
-
const gitExists = await util.cmd.exists(gitCmd);
|
|
323
|
-
if (!gitExists) {
|
|
324
|
-
gitCmd = `${dir}/git-for-windows/bin/git.exe`;
|
|
325
|
-
if (!fs.existsSync(gitCmd)) {
|
|
326
|
-
logger.error(`未找到git命令 ${gitCmd}, 请先执行 init 初始化制盘环境`);
|
|
327
|
-
process.exit(1)
|
|
328
|
-
}
|
|
329
|
-
gitCmd = `"${gitCmd}"`;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
let settingXml = path.resolve(`${dir}/settings.xml`);
|
|
333
|
-
let mvnCmd = 'mvn';
|
|
334
|
-
let mavenHome = `${dir}/maven-3.8.6`;
|
|
335
|
-
if (!fs.existsSync(mavenHome)) { // 使用全局maven
|
|
336
|
-
let mvnExists = await util.cmd.exists(mvnCmd);
|
|
337
|
-
if (!mvnExists) {
|
|
338
|
-
logger.error(`未找到mvn命令 ${mvnCmd}, 请先执行 init 初始化制盘环境`);
|
|
339
|
-
process.exit(1)
|
|
340
|
-
}
|
|
341
|
-
// 没有settings 下载
|
|
342
|
-
if (!fs.existsSync(settingXml)) {
|
|
343
|
-
logger.warn(`未找到maven配置文件 ${settingXml}, 下载settings.xml文件`);
|
|
344
|
-
await execCmd(`${wget} ${RS_URL}/settings.xml`, dir);
|
|
345
|
-
}
|
|
346
|
-
} else {
|
|
347
|
-
mvnCmd = `"${mavenHome}/bin/mvn.cmd"`;
|
|
348
|
-
settingXml = `${mavenHome}/conf/settings.xml`;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
let idePath = `${dir}/yds-1.0.3`
|
|
352
|
-
if (!fs.existsSync(idePath)) {
|
|
353
|
-
logger.error(`未找到IDE ${idePath}, 请先执行 init 初始化制盘环境`);
|
|
354
|
-
process.exit(1)
|
|
355
|
-
}
|
|
260
|
+
logger.info(`Maven命令: ${mvnCmd} Settings:${settingXml} Git:${gitCmd}`);
|
|
356
261
|
|
|
357
|
-
logger.info(`制盘环境检测完成`)
|
|
358
262
|
let ydsJsonStr = fs.readFileSync(ydsJson).toString('utf-8');
|
|
359
263
|
// 替换所有# 开头的注释说明行
|
|
360
264
|
ydsJsonStr = ydsJsonStr.replace(/^#.*/gm, '');
|
|
361
265
|
|
|
362
266
|
// 检测配置文件是否完整
|
|
267
|
+
logger.info(`检查配置文件 ${ydsJson} 是否完整-开始`)
|
|
363
268
|
let config: YdsConfig;
|
|
364
269
|
const checkConfigError = () => {
|
|
365
270
|
logger.error(`配置文件 ${ydsJson} 格式错误 参考示例:${confEg}`);
|
|
@@ -383,6 +288,7 @@ export default class Main {
|
|
|
383
288
|
logger.error(`配置文件 ${ydsJson} catalogs.${catalog}.hrcpe 或 catalogs.${catalog}.fecode 字段缺失`);
|
|
384
289
|
process.exit(1);
|
|
385
290
|
}
|
|
291
|
+
logger.info(`检查配置文件 ${ydsJson} 是否完整-结束`)
|
|
386
292
|
|
|
387
293
|
const namespace = `${dir}/${catalog}`;
|
|
388
294
|
if (!fs.existsSync(namespace)) {
|
|
@@ -398,7 +304,7 @@ export default class Main {
|
|
|
398
304
|
logger.info(`开始拉取后端服务仓库 ${hrcpeUrl}`);
|
|
399
305
|
if (fs.existsSync(`${namespace}/.git`)) {
|
|
400
306
|
logger.info(`目录 ${namespace} 已存在,开始更新仓库`);
|
|
401
|
-
await execCmd(
|
|
307
|
+
await execCmd(`"${gitCmd}" pull`, namespace);
|
|
402
308
|
} else {
|
|
403
309
|
logger.info(`目录 ${namespace} 不存在,开始创建仓库`);
|
|
404
310
|
let branch = typeof catalogConfig.hrcpe === 'string' ? catalogConfig.hrcpe : catalogConfig.hrcpe.branch;
|
|
@@ -449,7 +355,7 @@ export default class Main {
|
|
|
449
355
|
logger.info('初始化项目maven环境');
|
|
450
356
|
let mvnConfigDir = `${namespace}/.mvn`;
|
|
451
357
|
if (!fs.existsSync(mvnConfigDir)) {
|
|
452
|
-
await execCmd(
|
|
358
|
+
await execCmd(`"${mvnCmd}" -N io.takari:maven:wrapper -Dmaven=3.8.6`, namespace);
|
|
453
359
|
}
|
|
454
360
|
// 写入maven配置到 .mvn/maven.config
|
|
455
361
|
let configFile = `${mvnConfigDir}/maven.config`;
|
|
@@ -458,10 +364,10 @@ export default class Main {
|
|
|
458
364
|
}
|
|
459
365
|
fs.writeFileSync(`${mvnConfigDir}/maven.config`, `-s\n${settingXml}\n-Dmaven.wagon.http.ssl.insecure=true\n-Dmaven.wagon.http.ssl.allowall=true`);
|
|
460
366
|
logger.info(`当前maven信息`)
|
|
461
|
-
await execCmd(
|
|
367
|
+
await execCmd(`"${mvnCmd}" --version`, namespace);
|
|
462
368
|
|
|
463
369
|
logger.info('项目maven清理')
|
|
464
|
-
await execCmd(
|
|
370
|
+
await execCmd(`"${mvnCmd}" clean compile install -DskipTests`, `${namespace}/${domainKey}-be`);
|
|
465
371
|
|
|
466
372
|
logger.info('处理前端构建,增加构建文件');
|
|
467
373
|
let feDir = `${namespace}/${domainKey}-fe`;
|
|
@@ -541,7 +447,7 @@ export default class Main {
|
|
|
541
447
|
}
|
|
542
448
|
|
|
543
449
|
logger.info('启动IDE');
|
|
544
|
-
await execCmd(`"${
|
|
450
|
+
await execCmd(`"${ideDir}/Code/bin/code" --no-sandbox --log debug --goto "${ideDir}/Code/data/user-data/User/settings.json" "${namespace}"`);
|
|
545
451
|
// 需要等待IDE启动完成后关闭
|
|
546
452
|
await new Promise(resolve => setTimeout(resolve, 3000))
|
|
547
453
|
logger.info('已启动IDE,点击左侧菜单选择“YDS”,请按照文档说明进行制盘操作');
|