appium 2.0.0-beta.34 → 2.0.0-beta.35
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/build/lib/cli/driver-command.d.ts +3 -3
- package/build/lib/cli/driver-command.d.ts.map +1 -1
- package/build/lib/cli/driver-command.js +8 -8
- package/build/lib/cli/extension-command.d.ts +22 -17
- package/build/lib/cli/extension-command.d.ts.map +1 -1
- package/build/lib/cli/extension-command.js +35 -36
- package/build/lib/cli/plugin-command.d.ts +9 -15
- package/build/lib/cli/plugin-command.d.ts.map +1 -1
- package/build/lib/cli/plugin-command.js +8 -8
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/cli/driver-command.js +45 -20
- package/lib/cli/extension-command.js +229 -123
- package/lib/cli/plugin-command.js +33 -18
- package/package.json +2 -2
- package/lib/appium-config.schema.json +0 -278
|
@@ -157,12 +157,11 @@ class ExtensionCommand {
|
|
|
157
157
|
}
|
|
158
158
|
|
|
159
159
|
async _install({
|
|
160
|
-
|
|
160
|
+
installSpec,
|
|
161
161
|
installType,
|
|
162
162
|
packageName
|
|
163
163
|
}) {
|
|
164
164
|
let extData;
|
|
165
|
-
let installSpec = ext;
|
|
166
165
|
|
|
167
166
|
if (packageName && [_extensionConfig.INSTALL_TYPE_LOCAL, _extensionConfig.INSTALL_TYPE_NPM].includes(installType)) {
|
|
168
167
|
throw new Error(`When using --source=${installType}, cannot also use --package`);
|
|
@@ -178,13 +177,13 @@ class ExtensionCommand {
|
|
|
178
177
|
}
|
|
179
178
|
|
|
180
179
|
extData = await this.installViaNpm({
|
|
181
|
-
|
|
180
|
+
installSpec,
|
|
182
181
|
pkgName: packageName
|
|
183
182
|
});
|
|
184
183
|
} else if (installType === _extensionConfig.INSTALL_TYPE_GIT) {
|
|
185
184
|
installSpec = installSpec.replace(/\.git$/, '');
|
|
186
185
|
extData = await this.installViaNpm({
|
|
187
|
-
|
|
186
|
+
installSpec,
|
|
188
187
|
pkgName: packageName
|
|
189
188
|
});
|
|
190
189
|
} else {
|
|
@@ -218,7 +217,7 @@ class ExtensionCommand {
|
|
|
218
217
|
}
|
|
219
218
|
|
|
220
219
|
extData = await this.installViaNpm({
|
|
221
|
-
|
|
220
|
+
installSpec,
|
|
222
221
|
pkgName,
|
|
223
222
|
pkgVer
|
|
224
223
|
});
|
|
@@ -249,19 +248,19 @@ class ExtensionCommand {
|
|
|
249
248
|
}
|
|
250
249
|
|
|
251
250
|
async installViaNpm({
|
|
252
|
-
|
|
251
|
+
installSpec,
|
|
253
252
|
pkgName,
|
|
254
253
|
pkgVer
|
|
255
254
|
}) {
|
|
256
255
|
const npmSpec = `${pkgName}${pkgVer ? '@' + pkgVer : ''}`;
|
|
257
|
-
const specMsg = npmSpec ===
|
|
258
|
-
const msg = `Installing '${
|
|
256
|
+
const specMsg = npmSpec === installSpec ? '' : ` using NPM install spec '${npmSpec}'`;
|
|
257
|
+
const msg = `Installing '${installSpec}'${specMsg}`;
|
|
259
258
|
|
|
260
259
|
try {
|
|
261
260
|
const pkgJsonData = await (0, _utils.spinWith)(this.isJsonOutput, msg, async () => await _support.npm.installPackage(this.config.appiumHome, pkgName, {
|
|
262
261
|
pkgVer
|
|
263
262
|
}));
|
|
264
|
-
return this.getExtensionFields(pkgJsonData);
|
|
263
|
+
return this.getExtensionFields(pkgJsonData, installSpec);
|
|
265
264
|
} catch (err) {
|
|
266
265
|
throw new Error(`Encountered an error when installing package: ${err.message}`);
|
|
267
266
|
}
|
|
@@ -271,7 +270,7 @@ class ExtensionCommand {
|
|
|
271
270
|
throw new Error('Must be implemented in final class');
|
|
272
271
|
}
|
|
273
272
|
|
|
274
|
-
getExtensionFields(pkgJsonData) {
|
|
273
|
+
getExtensionFields(pkgJsonData, installSpec) {
|
|
275
274
|
if (!pkgJsonData.appium) {
|
|
276
275
|
throw new Error(`Installed driver did not have an 'appium' section in its ` + `package.json file as expected`);
|
|
277
276
|
}
|
|
@@ -281,7 +280,7 @@ class ExtensionCommand {
|
|
|
281
280
|
name,
|
|
282
281
|
version
|
|
283
282
|
} = pkgJsonData;
|
|
284
|
-
this.validateExtensionFields(appium);
|
|
283
|
+
this.validateExtensionFields(appium, installSpec);
|
|
285
284
|
const result = { ...appium,
|
|
286
285
|
pkgName: name,
|
|
287
286
|
version
|
|
@@ -289,40 +288,40 @@ class ExtensionCommand {
|
|
|
289
288
|
return result;
|
|
290
289
|
}
|
|
291
290
|
|
|
292
|
-
validateExtensionFields(
|
|
291
|
+
validateExtensionFields(extMetadata, installSpec) {
|
|
293
292
|
throw new Error('Must be implemented in final class');
|
|
294
293
|
}
|
|
295
294
|
|
|
296
295
|
async _uninstall({
|
|
297
|
-
|
|
296
|
+
installSpec
|
|
298
297
|
}) {
|
|
299
|
-
if (!this.config.isInstalled(
|
|
300
|
-
throw new Error(`Can't uninstall ${this.type} '${
|
|
298
|
+
if (!this.config.isInstalled(installSpec)) {
|
|
299
|
+
throw new Error(`Can't uninstall ${this.type} '${installSpec}'; it is not installed`);
|
|
301
300
|
}
|
|
302
301
|
|
|
303
|
-
const installPath = this.config.getInstallPath(
|
|
302
|
+
const installPath = this.config.getInstallPath(installSpec);
|
|
304
303
|
|
|
305
304
|
try {
|
|
306
305
|
await _support.fs.rimraf(installPath);
|
|
307
306
|
} finally {
|
|
308
|
-
await this.config.removeExtension(
|
|
307
|
+
await this.config.removeExtension(installSpec);
|
|
309
308
|
}
|
|
310
309
|
|
|
311
|
-
(0, _utils.log)(this.isJsonOutput, `Successfully uninstalled ${this.type} '${
|
|
310
|
+
(0, _utils.log)(this.isJsonOutput, `Successfully uninstalled ${this.type} '${installSpec}'`.green);
|
|
312
311
|
return this.config.installedExtensions;
|
|
313
312
|
}
|
|
314
313
|
|
|
315
314
|
async _update({
|
|
316
|
-
|
|
315
|
+
installSpec,
|
|
317
316
|
unsafe
|
|
318
317
|
}) {
|
|
319
|
-
const shouldUpdateAll =
|
|
318
|
+
const shouldUpdateAll = installSpec === UPDATE_ALL;
|
|
320
319
|
|
|
321
|
-
if (!shouldUpdateAll && !this.config.isInstalled(
|
|
322
|
-
throw new Error(`The ${this.type} '${
|
|
320
|
+
if (!shouldUpdateAll && !this.config.isInstalled(installSpec)) {
|
|
321
|
+
throw new Error(`The ${this.type} '${installSpec}' was not installed, so can't be updated`);
|
|
323
322
|
}
|
|
324
323
|
|
|
325
|
-
const extsToUpdate = shouldUpdateAll ? Object.keys(this.config.installedExtensions) : [
|
|
324
|
+
const extsToUpdate = shouldUpdateAll ? Object.keys(this.config.installedExtensions) : [installSpec];
|
|
326
325
|
const errors = {};
|
|
327
326
|
const updates = {};
|
|
328
327
|
|
|
@@ -408,46 +407,46 @@ class ExtensionCommand {
|
|
|
408
407
|
};
|
|
409
408
|
}
|
|
410
409
|
|
|
411
|
-
async updateExtension(
|
|
410
|
+
async updateExtension(installSpec, version) {
|
|
412
411
|
const {
|
|
413
412
|
pkgName
|
|
414
|
-
} = this.config.installedExtensions[
|
|
415
|
-
await _support.fs.rimraf(this.config.getInstallPath(
|
|
413
|
+
} = this.config.installedExtensions[installSpec];
|
|
414
|
+
await _support.fs.rimraf(this.config.getInstallPath(installSpec));
|
|
416
415
|
const extData = await this.installViaNpm({
|
|
417
|
-
|
|
416
|
+
installSpec,
|
|
418
417
|
pkgName,
|
|
419
418
|
pkgVer: version
|
|
420
419
|
});
|
|
421
420
|
delete extData[`${this.type}Name`];
|
|
422
|
-
await this.config.updateExtension(
|
|
421
|
+
await this.config.updateExtension(installSpec, extData);
|
|
423
422
|
}
|
|
424
423
|
|
|
425
424
|
async _run({
|
|
426
|
-
|
|
425
|
+
installSpec,
|
|
427
426
|
scriptName
|
|
428
427
|
}) {
|
|
429
|
-
if (!_lodash.default.has(this.config.installedExtensions,
|
|
428
|
+
if (!_lodash.default.has(this.config.installedExtensions, installSpec)) {
|
|
430
429
|
throw new Error(`please install the ${this.type} first`);
|
|
431
430
|
}
|
|
432
431
|
|
|
433
|
-
const extConfig = this.config.installedExtensions[
|
|
432
|
+
const extConfig = this.config.installedExtensions[installSpec];
|
|
434
433
|
|
|
435
434
|
if (!extConfig.scripts) {
|
|
436
|
-
throw new Error(`The ${this.type} named '${
|
|
435
|
+
throw new Error(`The ${this.type} named '${installSpec}' does not contain the ` + `"scripts" field underneath the "appium" field in its package.json`);
|
|
437
436
|
}
|
|
438
437
|
|
|
439
438
|
const extScripts = extConfig.scripts;
|
|
440
439
|
|
|
441
440
|
if (!_lodash.default.isPlainObject(extScripts)) {
|
|
442
|
-
throw new Error(`The ${this.type} named '${
|
|
441
|
+
throw new Error(`The ${this.type} named '${installSpec}' "scripts" field must be a plain object`);
|
|
443
442
|
}
|
|
444
443
|
|
|
445
444
|
if (!_lodash.default.has(extScripts, scriptName)) {
|
|
446
|
-
throw new Error(`The ${this.type} named '${
|
|
445
|
+
throw new Error(`The ${this.type} named '${installSpec}' does not support the script: '${scriptName}'`);
|
|
447
446
|
}
|
|
448
447
|
|
|
449
448
|
const runner = new _teen_process.SubProcess(process.execPath, [extScripts[scriptName]], {
|
|
450
|
-
cwd: this.config.getInstallPath(
|
|
449
|
+
cwd: this.config.getInstallPath(installSpec)
|
|
451
450
|
});
|
|
452
451
|
const output = new _utils.RingBuffer(50);
|
|
453
452
|
runner.on('stream-line', line => {
|
|
@@ -476,4 +475,4 @@ class ExtensionCommand {
|
|
|
476
475
|
exports.ExtensionCommand = ExtensionCommand;
|
|
477
476
|
var _default = ExtensionCommand;
|
|
478
477
|
exports.default = _default;
|
|
479
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVUERBVEVfQUxMIiwiTm90VXBkYXRhYmxlRXJyb3IiLCJFcnJvciIsIk5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIiwiRXh0ZW5zaW9uQ29tbWFuZCIsImNvbmZpZyIsImtub3duRXh0ZW5zaW9ucyIsImlzSnNvbk91dHB1dCIsImNvbnN0cnVjdG9yIiwianNvbiIsInR5cGUiLCJleHRlbnNpb25UeXBlIiwiZXhlY3V0ZSIsImFyZ3MiLCJjbWQiLCJfIiwiaXNGdW5jdGlvbiIsImV4ZWN1dGVDbWQiLCJiaW5kIiwibGlzdCIsInNob3dJbnN0YWxsZWQiLCJzaG93VXBkYXRlcyIsImxzTXNnIiwiaW5zdGFsbGVkTmFtZXMiLCJPYmplY3QiLCJrZXlzIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsImtub3duTmFtZXMiLCJleHRzIiwicmVkdWNlIiwiYWNjIiwibmFtZSIsImluY2x1ZGVzIiwiaW5zdGFsbGVkIiwicGtnTmFtZSIsImV4dCIsImRhdGEiLCJ0b1BhaXJzIiwiaW5zdGFsbFR5cGUiLCJJTlNUQUxMX1RZUEVfTlBNIiwidXBkYXRlcyIsImNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIiwidXBkYXRlVmVyc2lvbiIsInNhZmVVcGRhdGUiLCJ1bnNhZmVVcGRhdGVWZXJzaW9uIiwidW5zYWZlVXBkYXRlIiwidXBUb0RhdGUiLCJsaXN0RGF0YSIsImluc3RhbGxUeHQiLCJncmV5IiwidXBkYXRlVHh0IiwidXBUb0RhdGVUeHQiLCJ1bnNhZmVVcGRhdGVUeHQiLCJpbnN0YWxsU3BlYyIsInZlcnNpb24iLCJ0eXBlVHh0IiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRV9HSVRIVUIiLCJ5ZWxsb3ciLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJtYWdlbnRhIiwiZ3JlZW4iLCJjeWFuIiwiY29uc29sZSIsImxvZyIsIl9pbnN0YWxsIiwicGFja2FnZU5hbWUiLCJleHREYXRhIiwic3BsaXQiLCJsZW5ndGgiLCJpbnN0YWxsVmlhTnBtIiwicmVwbGFjZSIsInBrZ1ZlciIsInBhdGgiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsInNwbGl0cyIsIm1zZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJleHROYW1lIiwiaXNJbnN0YWxsZWQiLCJleHRNYW5pZmVzdCIsImFkZEV4dGVuc2lvbiIsImVudiIsImhhc0FwcGl1bURlcGVuZGVuY3kiLCJhcHBpdW1Ib21lIiwiZ2V0UG9zdEluc3RhbGxUZXh0IiwibnBtU3BlYyIsInNwZWNNc2ciLCJwa2dKc29uRGF0YSIsIm5wbSIsImluc3RhbGxQYWNrYWdlIiwiZ2V0RXh0ZW5zaW9uRmllbGRzIiwiZXJyIiwibWVzc2FnZSIsImFwcGl1bSIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwicmVzdWx0IiwiYXBwaXVtUGtnRGF0YSIsIl91bmluc3RhbGwiLCJpbnN0YWxsUGF0aCIsImdldEluc3RhbGxQYXRoIiwiZnMiLCJyaW1yYWYiLCJyZW1vdmVFeHRlbnNpb24iLCJfdXBkYXRlIiwidW5zYWZlIiwic2hvdWxkVXBkYXRlQWxsIiwiZXh0c1RvVXBkYXRlIiwiZXJyb3JzIiwiZSIsInVwZGF0ZSIsImN1cnJlbnQiLCJ1cGRhdGVWZXIiLCJ1cGRhdGVFeHRlbnNpb24iLCJmcm9tIiwidG8iLCJyZWQiLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TGF0ZXN0U2FmZVVwZ3JhZGVWZXJzaW9uIiwidXRpbCIsImNvbXBhcmVWZXJzaW9ucyIsIl9ydW4iLCJzY3JpcHROYW1lIiwiaGFzIiwiZXh0Q29uZmlnIiwic2NyaXB0cyIsImV4dFNjcmlwdHMiLCJpc1BsYWluT2JqZWN0IiwicnVubmVyIiwiU3ViUHJvY2VzcyIsInByb2Nlc3MiLCJleGVjUGF0aCIsImN3ZCIsIm91dHB1dCIsIlJpbmdCdWZmZXIiLCJvbiIsImxpbmUiLCJlbnF1ZXVlIiwic3RhcnQiLCJqb2luIiwiZ2V0QnVmZiIsImVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NsaS9leHRlbnNpb24tY29tbWFuZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IG5wbSwgZnMsIHV0aWwsIGVudiB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBsb2csIHNwaW5XaXRoLCBSaW5nQnVmZmVyIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IElOU1RBTExfVFlQRV9OUE0sIElOU1RBTExfVFlQRV9HSVQsIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gICAgICAgICBJTlNUQUxMX1RZUEVfTE9DQUwgfSBmcm9tICcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQgeyBwYWNrYWdlRGlkQ2hhbmdlIH0gZnJvbSAnLi4vZXh0ZW5zaW9uL3BhY2thZ2UtY2hhbmdlZCc7XG5cbmNvbnN0IFVQREFURV9BTEwgPSAnaW5zdGFsbGVkJztcblxuY2xhc3MgTm90VXBkYXRhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuY2xhc3MgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICovXG5jbGFzcyBFeHRlbnNpb25Db21tYW5kIHtcbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIGBEcml2ZXJDb25maWdgIG9yIGBQbHVnaW5Db25maWdgLCBkZXBlbmRpbmcgb24gYEV4dFR5cGVgLlxuICAgKiBAdHlwZSB7RXh0ZW5zaW9uQ29uZmlnPEV4dFR5cGU+fVxuICAgKi9cbiAgY29uZmlnO1xuXG4gIC8qKlxuICAgKiB7QGxpbmtjb2RlIFJlY29yZH0gb2Ygb2ZmaWNpYWwgcGx1Z2lucyBvciBkcml2ZXJzLlxuICAgKiBAdHlwZSB7S25vd25FeHRlbnNpb25zPEV4dFR5cGU+fVxuICAgKi9cbiAga25vd25FeHRlbnNpb25zO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGNvbW1hbmQgb3V0cHV0IGhhcyBiZWVuIHJlcXVlc3RlZCBhcyBKU09OLlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGlzSnNvbk91dHB1dDtcblxuICAvKipcbiAgICogQnVpbGQgYW4gRXh0ZW5zaW9uQ29tbWFuZFxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbW1hbmRPcHRpb25zPEV4dFR5cGU+fSBvcHRzXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoe2NvbmZpZywganNvbn0pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmlzSnNvbk91dHB1dCA9IGpzb247XG4gIH1cblxuICAvKipcbiAgICogYGRyaXZlcmAgb3IgYHBsdWdpbmAsIGRlcGVuZGluZyBvbiB0aGUgYEV4dGVuc2lvbkNvbmZpZ2AuXG4gICAqL1xuICBnZXQgdHlwZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmV4dGVuc2lvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhIENMSSBwYXJzZSBhbmQgcnVuIGFuIGV4dGVuc2lvbiBjb21tYW5kIGJhc2VkIG9uIGl0cyB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gYSBrZXkvdmFsdWUgb2JqZWN0IHdpdGggQ0xJIGZsYWdzIGFuZCB2YWx1ZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTxvYmplY3Q+fSB0aGUgcmVzdWx0IG9mIHRoZSBzcGVjaWZpYyBjb21tYW5kIHdoaWNoIGlzIGV4ZWN1dGVkXG4gICAqL1xuICBhc3luYyBleGVjdXRlIChhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYXJnc1tgJHt0aGlzLnR5cGV9Q29tbWFuZGBdO1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKHRoaXNbY21kXSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGhhbmRsZSAke3RoaXMudHlwZX0gY29tbWFuZCAke2NtZH1gKTtcbiAgICB9XG4gICAgY29uc3QgZXhlY3V0ZUNtZCA9IHRoaXNbY21kXS5iaW5kKHRoaXMpO1xuICAgIHJldHVybiBhd2FpdCBleGVjdXRlQ21kKGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIExpc3RPcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd0luc3RhbGxlZCAtIHdoZXRoZXIgc2hvdWxkIHNob3cgb25seSBpbnN0YWxsZWQgZXh0ZW5zaW9uc1xuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dVcGRhdGVzIC0gd2hldGhlciBzaG91bGQgc2hvdyBhdmFpbGFibGUgdXBkYXRlc1xuICAgKi9cblxuICAvKipcbiAgICogTGlzdCBleHRlbnNpb25zXG4gICAqXG4gICAqIEBwYXJhbSB7TGlzdE9wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxFeHRlbnNpb25MaXN0RGF0YT59IG1hcCBvZiBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIGxpc3QgKHtzaG93SW5zdGFsbGVkLCBzaG93VXBkYXRlc30pIHtcbiAgICBjb25zdCBsc01zZyA9IGBMaXN0aW5nICR7c2hvd0luc3RhbGxlZCA/ICdpbnN0YWxsZWQnIDogJ2F2YWlsYWJsZSd9ICR7dGhpcy50eXBlfXNgO1xuICAgIGNvbnN0IGluc3RhbGxlZE5hbWVzID0gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucyk7XG4gICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICBjb25zdCBleHRzID0gWy4uLmluc3RhbGxlZE5hbWVzLCAuLi5rbm93bk5hbWVzXS5yZWR1Y2UoKGFjYywgbmFtZSkgPT4ge1xuICAgICAgaWYgKCFhY2NbbmFtZV0pIHtcbiAgICAgICAgaWYgKGluc3RhbGxlZE5hbWVzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgYWNjW25hbWVdID0gey4uLnRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbbmFtZV0sIGluc3RhbGxlZDogdHJ1ZX07XG4gICAgICAgIH0gZWxzZSBpZiAoIXNob3dJbnN0YWxsZWQpIHtcbiAgICAgICAgICBhY2NbbmFtZV0gPSB7cGtnTmFtZTogdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV0sIGluc3RhbGxlZDogZmFsc2V9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVGhpcyBhY2N1bXVsYXRvciBjb250YWlucyBlaXRoZXIge0BsaW5rY29kZSBVbmluc3RhbGxlZEV4dGVuc2lvbkxJc3REYXRhfSBfb3JfXG4gICAgICoge0BsaW5rY29kZSBJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YX0gd2l0aG91dCB1cGdyYWRlIGluZm9ybWF0aW9uICh3aGljaCBpcyBhZGRlZCBieSB0aGUgYmVsb3cgY29kZSBibG9jaylcbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQYXJ0aWFsPEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPnxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn1cbiAgICAgKi8oe30pKTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBpZiAoIWRhdGEuaW5zdGFsbGVkIHx8IGRhdGEuaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIGV4dHMgdGhhdCBhcmVuJ3QgaW5zdGFsbGVkXG4gICAgICAgICAgLy8gYWxzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIG5vbi1ucG0gZXh0c1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGV4dCk7XG4gICAgICAgIGRhdGEudXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51bnNhZmVVcGRhdGVWZXJzaW9uID0gdXBkYXRlcy51bnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudXBUb0RhdGUgPSB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaXN0RGF0YSA9IC8qKiBAdHlwZSB7RXh0ZW5zaW9uTGlzdERhdGF9ICovKGV4dHMpO1xuXG4gICAgLy8gaWYgd2UncmUganVzdCBnZXR0aW5nIHRoZSBkYXRhLCBzaG9ydCBjaXJjdWl0IHJldHVybiBoZXJlIHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55XG4gICAgLy8gZm9ybWF0dGluZyBsb2dpY1xuICAgIGlmICh0aGlzLmlzSnNvbk91dHB1dCkge1xuICAgICAgcmV0dXJuIGxpc3REYXRhO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW1xuICAgICAgbmFtZSxcbiAgICAgIGRhdGFcbiAgICBdIG9mIF8udG9QYWlycyhsaXN0RGF0YSkpIHtcbiAgICAgIGxldCBpbnN0YWxsVHh0ID0gJyBbbm90IGluc3RhbGxlZF0nLmdyZXk7XG4gICAgICBsZXQgdXBkYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdXBUb0RhdGVUeHQgPSAnJztcbiAgICAgIGxldCB1bnNhZmVVcGRhdGVUeHQgPSAnJztcbiAgICAgIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICBjb25zdCB7aW5zdGFsbFR5cGUsIGluc3RhbGxTcGVjLCB1cGRhdGVWZXJzaW9uLCB1bnNhZmVVcGRhdGVWZXJzaW9uLCB2ZXJzaW9uLCB1cFRvRGF0ZX0gPSBkYXRhO1xuICAgICAgICBsZXQgdHlwZVR4dDtcbiAgICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVRIVUI6XG4gICAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0xPQ0FMOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUeHQgPSBgQCR7dmVyc2lvbi55ZWxsb3d9ICR7KCdbaW5zdGFsbGVkICcgKyB0eXBlVHh0ICsgJ10nKS5ncmVlbn1gO1xuXG4gICAgICAgIGlmIChzaG93VXBkYXRlcykge1xuICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1cGRhdGVUeHQgPSBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cFRvRGF0ZSkge1xuICAgICAgICAgICAgdXBUb0RhdGVUeHQgPSBgIFtVcCB0byBkYXRlXWAuZ3JlZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1bnNhZmVVcGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1bnNhZmVVcGRhdGVUeHQgPSBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKGAtICR7bmFtZS55ZWxsb3d9JHtpbnN0YWxsVHh0fSR7dXBkYXRlVHh0fSR7dXBUb0RhdGVUeHR9JHt1bnNhZmVVcGRhdGVUeHR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3REYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYW4gZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7SW5zdGFsbEFyZ3N9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZTxFeHRSZWNvcmQ8RXh0VHlwZT4+fSBtYXAgb2YgYWxsIGluc3RhbGxlZCBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIF9pbnN0YWxsICh7ZXh0LCBpbnN0YWxsVHlwZSwgcGFja2FnZU5hbWV9KSB7XG4gICAgbGV0IGV4dERhdGE7XG4gICAgbGV0IGluc3RhbGxTcGVjID0gZXh0O1xuXG4gICAgaWYgKHBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfTE9DQUwsIElOU1RBTExfVFlQRV9OUE1dLmluY2x1ZGVzKGluc3RhbGxUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaGVuIHVzaW5nIC0tc291cmNlPSR7aW5zdGFsbFR5cGV9LCBjYW5ub3QgYWxzbyB1c2UgLS1wYWNrYWdlYCk7XG4gICAgfVxuXG4gICAgaWYgKCFwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0dJVCwgSU5TVEFMTF9UWVBFX0dJVEhVQl0uaW5jbHVkZXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIG11c3QgYWxzbyB1c2UgLS1wYWNrYWdlYCk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUSFVCKSB7XG4gICAgICBpZiAoaW5zdGFsbFNwZWMuc3BsaXQoJy8nKS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHaXRodWIgJHt0aGlzLnR5cGV9IHNwZWMgJHtpbnN0YWxsU3BlY30gYXBwZWFyZWQgdG8gYmUgaW52YWxpZDsgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnaXQgc2hvdWxkIGJlIG9mIHRoZSBmb3JtIDxvcmc+LzxyZXBvPicpO1xuICAgICAgfVxuICAgICAgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0OiBpbnN0YWxsU3BlYywgcGtnTmFtZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhY2thZ2VOYW1lKX0pO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9HSVQpIHtcbiAgICAgIC8vIGdpdCB1cmxzIGNhbiBoYXZlICcuZ2l0JyBhdCB0aGUgZW5kLCBidXQgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGFuZCB3b3VsZCBjb21wbGljYXRlIHRoZVxuICAgICAgLy8gd2F5IHdlIGRvd25sb2FkIGFuZCBuYW1lIGRpcmVjdG9yaWVzLCBzbyB3ZSBjYW4ganVzdCByZW1vdmUgaXRcbiAgICAgIGluc3RhbGxTcGVjID0gaW5zdGFsbFNwZWMucmVwbGFjZSgvXFwuZ2l0JC8sICcnKTtcbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2V4dDogaW5zdGFsbFNwZWMsIHBrZ05hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyhwYWNrYWdlTmFtZSl9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBrZ05hbWUsIHBrZ1ZlcjtcbiAgICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0xPQ0FMKSB7XG4gICAgICAgIHBrZ05hbWUgPSBwYXRoLmlzQWJzb2x1dGUoaW5zdGFsbFNwZWMpID8gaW5zdGFsbFNwZWMgOiBwYXRoLnJlc29sdmUoaW5zdGFsbFNwZWMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBoYXZlIGVpdGhlciBhbiBucG0gcGFja2FnZSBvciBhbiBhcHBpdW0gdmVyaWZpZWQgZXh0ZW5zaW9uXG4gICAgICAgIC8vIG5hbWUgb3IgYSBsb2NhbCBwYXRoLiBib3RoIG9mIHdoaWNoIHdpbGwgYmUgaW5zdGFsbGVkIHZpYSBucG0uXG4gICAgICAgIC8vIGV4dGVuc2lvbnMgaW5zdGFsbGVkIHZpYSBucG0gY2FuIGluY2x1ZGUgdmVyc2lvbnMgb3IgdGFncyBhZnRlciB0aGUgJ0AnXG4gICAgICAgIC8vIHNpZ24sIHNvIGNoZWNrIGZvciB0aGF0LiBXZSBhbHNvIG5lZWQgdG8gYmUgY2FyZWZ1bCB0aGF0IHBhY2thZ2UgbmFtZXMgdGhlbXNlbHZlcyBjYW5cbiAgICAgICAgLy8gY29udGFpbiB0aGUgJ0AnIHN5bWJvbCwgYXMgaW4gYG5wbSBpbnN0YWxsIEBhcHBpdW0vZmFrZS1kcml2ZXJAMS4yLjBgXG4gICAgICAgIGxldCBuYW1lO1xuICAgICAgICBjb25zdCBzcGxpdHMgPSBpbnN0YWxsU3BlYy5zcGxpdCgnQCcpO1xuICAgICAgICBpZiAoaW5zdGFsbFNwZWNbMF0gPT09ICdAJykge1xuICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhbiBucG0gb3JnIGluY2x1ZGVkIGluIHRoZSBwYWNrYWdlIG5hbWVcbiAgICAgICAgICBbbmFtZSwgcGtnVmVyXSA9IFtgQCR7c3BsaXRzWzFdfWAsIHNwbGl0c1syXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aXRob3V0IGFuIG5wbSBvcmdcbiAgICAgICAgICBbbmFtZSwgcGtnVmVyXSA9IHNwbGl0cztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBwYWNrYWdlIGZyb20gbnBtLCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrXG4gICAgICAgICAgLy8gYWdhaW5zdCB0aGUgYXBwaXVtIGV4dGVuc2lvbiBsaXN0OyBqdXN0IHVzZSB0aGUgaW5zdGFsbFNwZWMgYXMgaXNcbiAgICAgICAgICBwa2dOYW1lID0gbmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiB3ZSdyZSBpbnN0YWxsaW5nIGEgbmFtZWQgYXBwaXVtIGRyaXZlciAobGlrZSAneGN1aXRlc3QnKSB3ZSBuZWVkIHRvXG4gICAgICAgICAgLy8gZGVyZWZlcmVuY2UgdGhlIGFjdHVhbCBucG0gcGFja2FnZSAoJ2FwcGl1cG0teGN1aXRlc3QtZHJpdmVyJyksIHNvXG4gICAgICAgICAgLy8gY2hlY2sgaXQgZXhpc3RzIGFuZCBnZXQgdGhlIGNvcnJlY3QgcGFja2FnZVxuICAgICAgICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgICAgICAgaWYgKCFfLmluY2x1ZGVzKGtub3duTmFtZXMsIG5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgQ291bGQgbm90IHJlc29sdmUgJHt0aGlzLnR5cGV9OyBhcmUgeW91IHN1cmUgaXQncyBpbiB0aGUgbGlzdCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBvZiBzdXBwb3J0ZWQgJHt0aGlzLnR5cGV9cz8gJHtKU09OLnN0cmluZ2lmeShrbm93bk5hbWVzKX1gO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBrZ05hbWUgPSB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXTtcbiAgICAgICAgICAvLyBnaXZlbiB0aGF0IHdlJ2xsIHVzZSB0aGUgaW5zdGFsbCB0eXBlIGluIHRoZSBkcml2ZXIganNvbiwgc3RvcmUgaXQgYXNcbiAgICAgICAgICAvLyAnbnBtJyBub3dcbiAgICAgICAgICBpbnN0YWxsVHlwZSA9IElOU1RBTExfVFlQRV9OUE07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZXh0RGF0YSA9IGF3YWl0IHRoaXMuaW5zdGFsbFZpYU5wbSh7ZXh0LCBwa2dOYW1lLCBwa2dWZXJ9KTtcbiAgICB9XG5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8oYCR7dGhpcy50eXBlfU5hbWVgKV07XG4gICAgZGVsZXRlIGV4dERhdGFbLyoqIEB0eXBlIHtzdHJpbmd9ICovKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgJHt0aGlzLnR5cGV9IG5hbWVkICcke2V4dE5hbWV9JyBpcyBhbHJlYWR5IGluc3RhbGxlZC4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYERpZCB5b3UgbWVhbiB0byB1cGRhdGU/ICdhcHBpdW0gJHt0aGlzLnR5cGV9IHVwZGF0ZScuIFNlZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgaW5zdGFsbGVkICR7dGhpcy50eXBlfXMgd2l0aCAnYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkJy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRNYW5pZmVzdCA9IHsuLi5leHREYXRhLCBpbnN0YWxsVHlwZSwgaW5zdGFsbFNwZWN9O1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLmFkZEV4dGVuc2lvbihleHROYW1lLCBleHRNYW5pZmVzdCk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIGlmIHdlJ3ZlIGNoYW5nZWQgdGhlIGxvY2FsIGBwYWNrYWdlLmpzb25gXG4gICAgaWYgKGF3YWl0IGVudi5oYXNBcHBpdW1EZXBlbmRlbmN5KHRoaXMuY29uZmlnLmFwcGl1bUhvbWUpKSB7XG4gICAgICBhd2FpdCBwYWNrYWdlRGlkQ2hhbmdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUpO1xuICAgIH1cblxuICAgIC8vIGxvZyBpbmZvIGZvciB0aGUgdXNlclxuICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgdGhpcy5nZXRQb3N0SW5zdGFsbFRleHQoe2V4dE5hbWUsIGV4dERhdGF9KSk7XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvbiB2aWEgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7SW5zdGFsbFZpYU5wbUFyZ3N9IGFyZ3NcbiAgICovXG4gIGFzeW5jIGluc3RhbGxWaWFOcG0gKHtleHQsIHBrZ05hbWUsIHBrZ1Zlcn0pIHtcbiAgICBjb25zdCBucG1TcGVjID0gYCR7cGtnTmFtZX0ke3BrZ1ZlciA/ICdAJyArIHBrZ1ZlciA6ICcnfWA7XG4gICAgY29uc3Qgc3BlY01zZyA9IG5wbVNwZWMgPT09IGV4dCA/ICcnIDogYCB1c2luZyBOUE0gaW5zdGFsbCBzcGVjICcke25wbVNwZWN9J2A7XG4gICAgY29uc3QgbXNnID0gYEluc3RhbGxpbmcgJyR7ZXh0fScke3NwZWNNc2d9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiAoXG4gICAgICAgIGF3YWl0IG5wbS5pbnN0YWxsUGFja2FnZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lLCBwa2dOYW1lLCB7XG4gICAgICAgICAgcGtnVmVyXG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICAgIHJldHVybiB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gaW5zdGFsbGluZyBwYWNrYWdlOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRleHQgd2hpY2ggc2hvdWxkIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhZnRlciBhbiBleHRlbnNpb24gaGFzIGJlZW4gaW5zdGFsbGVkLiBUaGlzXG4gICAqIGlzIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgZHJpdmVycy9wbHVnaW5zIHdpdGggdGhlaXIgb3duIHBhcnRpY3VsYXIgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25BcmdzfSBhcmdzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0UG9zdEluc3RhbGxUZXh0IChhcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhbiBOUE0gbW9kdWxlJ3MgcGFja2FnZS5qc29uIGFuZCBleHRyYWN0IEFwcGl1bSBkcml2ZXIgaW5mb3JtYXRpb24gZnJvbSBhIHNwZWNpYWxcbiAgICogJ2FwcGl1bScgZmllbGQgaW4gdGhlIEpTT04gZGF0YS4gV2UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIHRvIGUuZy4gZGV0ZXJtaW5lIHdoaWNoIGNsYXNzIHRvXG4gICAqIGxvYWQgYXMgdGhlIG1haW4gZHJpdmVyIGNsYXNzLCBvciB0byBiZSBhYmxlIHRvIGRldGVjdCBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIGRyaXZlciBhbmRcbiAgICogYXBwaXVtIHZlcnNpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dFBhY2thZ2VKc29uPEV4dFR5cGU+fSBwa2dKc29uRGF0YSAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlblxuICAgKiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqIEByZXR1cm5zIHtFeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59XG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMgKHBrZ0pzb25EYXRhKSB7XG4gICAgaWYgKCFwa2dKc29uRGF0YS5hcHBpdW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdGFsbGVkIGRyaXZlciBkaWQgbm90IGhhdmUgYW4gJ2FwcGl1bScgc2VjdGlvbiBpbiBpdHMgYCArXG4gICAgICAgICAgICAgICAgICAgICAgYHBhY2thZ2UuanNvbiBmaWxlIGFzIGV4cGVjdGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb259ID0gcGtnSnNvbkRhdGE7XG4gICAgdGhpcy52YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhhcHBpdW0pO1xuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7Li4uYXBwaXVtLCBwa2dOYW1lOiBuYW1lLCB2ZXJzaW9ufTtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtFeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59ICovKHJlc3VsdCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBwYWNrYWdlLmpzb24gZmllbGRzIHdoaWNoIGEgcGFydGljdWxhciB0eXBlIG9mIGV4dGVuc2lvbiByZXF1aXJlcywgdmFsaWRhdGUgdGhlXG4gICAqIHByZXNlbmNlIGFuZCBmb3JtIG9mIHRob3NlIGZpZWxkcyBvbiB0aGUgcGFja2FnZS5qc29uIGRhdGEsIHRocm93aW5nIGFuIGVycm9yIGlmIGFueXRoaW5nIGlzXG4gICAqIGFtaXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dE1ldGFkYXRhPEV4dFR5cGU+fSBhcHBpdW1Qa2dEYXRhIC0gdGhlIGRhdGEgaW4gdGhlIFwiYXBwaXVtXCIgZmllbGQgb2YgcGFja2FnZS5qc29uIGZvciBhbiBleHRlbnNpb25cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyAoYXBwaXVtUGtnRGF0YSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuaW5zdGFsbCBhbiBleHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtVbmluc3RhbGxPcHRzfSBvcHRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0UmVjb3JkPEV4dFR5cGU+Pn0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBfdW5pbnN0YWxsICh7ZXh0fSkge1xuICAgIGlmICghdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1bmluc3RhbGwgJHt0aGlzLnR5cGV9ICcke2V4dH0nOyBpdCBpcyBub3QgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbGxQYXRoID0gdGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoZXh0KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKGluc3RhbGxQYXRoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5jb25maWcucmVtb3ZlRXh0ZW5zaW9uKGV4dCk7XG4gICAgfVxuICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYFN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAke3RoaXMudHlwZX0gJyR7ZXh0fSdgLmdyZWVuKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHRvIHVwZGF0ZSBvbmUgb3IgbW9yZSBkcml2ZXJzIHVzaW5nIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblVwZGF0ZU9wdHN9IHVwZGF0ZVNwZWNcbiAgICogQHJldHVybiB7UHJvbWlzZTxFeHRlbnNpb25VcGRhdGVSZXN1bHQ+fVxuICAgKi9cbiAgYXN5bmMgX3VwZGF0ZSAoe2V4dCwgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGV4dCA9PT0gVVBEQVRFX0FMTDtcbiAgICAvLyBpZiB3ZSdyZSBzcGVjaWZpY2FsbHkgcmVxdWVzdGluZyBhbiB1cGRhdGUgZm9yIGFuIGV4dGVuc2lvbiwgbWFrZSBzdXJlIGl0J3MgaW5zdGFsbGVkXG4gICAgaWYgKCFzaG91bGRVcGRhdGVBbGwgJiYgIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSAnJHtleHR9JyB3YXMgbm90IGluc3RhbGxlZCwgc28gY2FuJ3QgYmUgdXBkYXRlZGApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGwgPyBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKSA6IFtleHRdO1xuXG4gICAgLy8gJ2Vycm9ycycgd2lsbCBoYXZlIGV4dCBuYW1lcyBhcyBrZXlzIGFuZCBlcnJvciBvYmplY3RzIGFzIHZhbHVlc1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxFcnJvcj59ICovXG4gICAgY29uc3QgZXJyb3JzID0ge307XG5cbiAgICAvLyAndXBkYXRlcycgd2lsbCBoYXZlIGV4dCBuYW1lcyBhcyBrZXlzIGFuZCB1cGRhdGUgb2JqZWN0cyBhcyB2YWx1ZXMsIHdoZXJlIGFuIHVwZGF0ZVxuICAgIC8vIG9iamVjdCBpcyBvZiB0aGUgZm9ybSB7ZnJvbTogdmVyc2lvblN0cmluZywgdG86IHZlcnNpb25TdHJpbmd9XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFVwZGF0ZVJlcG9ydD59ICovXG4gICAgY29uc3QgdXBkYXRlcyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBlIG9mIGV4dHNUb1VwZGF0ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIGlzIHVwZGF0YWJsZWAsICgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tlXS5pbnN0YWxsVHlwZSAhPT0gSU5TVEFMTF9UWVBFX05QTSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFVwZGF0YWJsZUVycm9yKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgc3BpbldpdGgodGhpcy5pc0pzb25PdXRwdXQsIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIG5lZWRzIGFuIHVwZGF0ZWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGUgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGUpO1xuICAgICAgICAgIGlmICghKHVwZGF0ZS5zYWZlVXBkYXRlIHx8IHVwZGF0ZS51bnNhZmVVcGRhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdW5zYWZlICYmICF1cGRhdGUuc2FmZVVwZGF0ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID0gdW5zYWZlICYmIHVwZGF0ZS51bnNhZmVVcGRhdGUgPyB1cGRhdGUudW5zYWZlVXBkYXRlIDogdXBkYXRlLnNhZmVVcGRhdGU7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBVcGRhdGluZyBkcml2ZXIgJyR7ZX0nIGZyb20gJHt1cGRhdGUuY3VycmVudH0gdG8gJHt1cGRhdGVWZXJ9YCxcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnVwZGF0ZUV4dGVuc2lvbihlLCB1cGRhdGVWZXIpXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZXNbZV0gPSB7ZnJvbTogdXBkYXRlLmN1cnJlbnQsIHRvOiB1cGRhdGVWZXJ9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVycm9yc1tlXSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsICdVcGRhdGUgcmVwb3J0OicpO1xuICAgIGZvciAoY29uc3QgW2UsIHVwZGF0ZV0gb2YgXy50b1BhaXJzKHVwZGF0ZXMpKSB7XG4gICAgICBsb2codGhpcy5pc0pzb25PdXRwdXQsIGAtICR7dGhpcy50eXBlfSAke2V9IHVwZGF0ZWQ6ICR7dXBkYXRlLmZyb219ID0+ICR7dXBkYXRlLnRvfWAuZ3JlZW4pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtlLCBlcnJdIG9mIF8udG9QYWlycyhlcnJvcnMpKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90VXBkYXRhYmxlRXJyb3IpIHtcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmb3IgdXBkYXRlc2AueWVsbG93KTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IpIHtcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgaGFkIG5vIHVwZGF0ZXMgYXZhaWxhYmxlYC55ZWxsb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBtYWtlIGl0IHBvcCB3aXRoIHJlZCFcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgZmFpbGVkIHRvIHVwZGF0ZTogJHtlcnJ9YC5yZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7dXBkYXRlcywgZXJyb3JzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBleHRlbnNpb24gbmFtZSwgZmlndXJlIG91dCB3aGF0IGl0cyBoaWdoZXN0IHBvc3NpYmxlIHZlcnNpb24gdXBncmFkZSBpcywgYW5kIGFsc28gdGhlXG4gICAqIGhpZ2hlc3QgcG9zc2libGUgc2FmZSB1cGdyYWRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0IC0gbmFtZSBvZiBleHRlbnNpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxQb3NzaWJsZVVwZGF0ZXM+fVxuICAgKi9cbiAgYXN5bmMgY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUgKGV4dCkge1xuICAgIC8vIFRPRE8gZGVjaWRlIGhvdyB3ZSB3YW50IHRvIGhhbmRsZSBiZXRhIHZlcnNpb25zP1xuICAgIC8vIHRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLCAnZXh0JyBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgaW5zdGFsbGVkIGhlcmUsIGFuZCBvZiB0aGUgbnBtXG4gICAgLy8gaW5zdGFsbCB0eXBlXG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWV9ID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuICAgIGxldCB1bnNhZmVVcGRhdGUgPSBhd2FpdCBucG0uZ2V0TGF0ZXN0VmVyc2lvbih0aGlzLmNvbmZpZy5hcHBpdW1Ib21lLCBwa2dOYW1lKTtcbiAgICBsZXQgc2FmZVVwZGF0ZSA9IGF3YWl0IG5wbS5nZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24odGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSwgdmVyc2lvbik7XG4gICAgaWYgKCF1dGlsLmNvbXBhcmVWZXJzaW9ucyh1bnNhZmVVcGRhdGUsICc+JywgdmVyc2lvbikpIHtcbiAgICAgIC8vIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24sIHNvIHRoZXJlJ3Mgbm8gcG9zc2libGUgdXBkYXRlXG4gICAgICB1bnNhZmVVcGRhdGUgPSBudWxsO1xuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh1bnNhZmVVcGRhdGUgJiYgdW5zYWZlVXBkYXRlID09PSBzYWZlVXBkYXRlKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHVwZGF0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgc2FmZSB1cGRhdGUsIHdoaWNoIG1lYW5zIGl0J3Mgbm90IGFjdHVhbGx5IHVuc2FmZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHNhZmVVcGRhdGUgJiYgIXV0aWwuY29tcGFyZVZlcnNpb25zKHNhZmVVcGRhdGUsICc+JywgdmVyc2lvbikpIHtcbiAgICAgIC8vIGV2ZW4gdGhlIHNhZmUgdXBkYXRlIGlzIG5vdCBsYXRlciB0aGFuIHRoZSBjdXJyZW50LCBzbyBpdCBpcyBub3QgYWN0dWFsbHkgYW4gdXBkYXRlXG4gICAgICBzYWZlVXBkYXRlID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtjdXJyZW50OiB2ZXJzaW9uLCBzYWZlVXBkYXRlLCB1bnNhZmVVcGRhdGV9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGx5IHVwZGF0ZSBhbiBleHRlbnNpb24gaW5zdGFsbGVkIGJ5IE5QTSwgdXNpbmcgdGhlIE5QTSBjbGkuIEFuZCB1cGRhdGUgdGhlIGluc3RhbGxhdGlvblxuICAgKiBtYW5pZmVzdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dCAtIG5hbWUgb2YgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIHZlcnNpb24gc3RyaW5nIGlkZW50aWZpZXIgdG8gdXBkYXRlIGV4dGVuc2lvbiB0b1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUV4dGVuc2lvbiAoZXh0LCB2ZXJzaW9uKSB7XG4gICAgY29uc3Qge3BrZ05hbWV9ID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuICAgIGF3YWl0IGZzLnJpbXJhZih0aGlzLmNvbmZpZy5nZXRJbnN0YWxsUGF0aChleHQpKTtcbiAgICBjb25zdCBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtleHQsIHBrZ05hbWUsIHBrZ1ZlcjogdmVyc2lvbn0pO1xuICAgIGRlbGV0ZSBleHREYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyhgJHt0aGlzLnR5cGV9TmFtZWApXTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy51cGRhdGVFeHRlbnNpb24oZXh0LCBleHREYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc2NyaXB0IGNhY2hlZCBpbnNpZGUgdGhlIFwic2NyaXB0c1wiIGZpZWxkIHVuZGVyIFwiYXBwaXVtXCJcbiAgICogaW5zaWRlIG9mIHRoZSBkcml2ZXIvcGx1Z2lucyBcInBhY2thZ2UuanNvblwiIGZpbGUuIFdpbGwgdGhyb3dcbiAgICogYW4gZXJyb3IgaWYgdGhlIGRyaXZlci9wbHVnaW4gZG9lcyBub3QgY29udGFpbiBhIFwic2NyaXB0c1wiIGZpZWxkXG4gICAqIHVuZGVybmVhdGggdGhlIFwiYXBwaXVtXCIgZmllbGQgaW4gaXRzIHBhY2thZ2UuanNvbiwgaWYgdGhlXG4gICAqIFwic2NyaXB0c1wiIGZpZWxkIGlzIG5vdCBhIHBsYWluIG9iamVjdCwgb3IgaWYgdGhlIHNjcmlwdE5hbWUgaXNcbiAgICogbm90IGZvdW5kIHdpdGhpbiBcInNjcmlwdHNcIiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7UnVuT3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJ1bk91dHB1dD59XG4gICAqL1xuICBhc3luYyBfcnVuICh7ZXh0LCBzY3JpcHROYW1lfSkge1xuICAgIGlmICghXy5oYXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucywgZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwbGVhc2UgaW5zdGFsbCB0aGUgJHt0aGlzLnR5cGV9IGZpcnN0YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0Q29uZmlnID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuXG4gICAgLy8gbm90ZTogVFMgY2Fubm90IHVuZGVyc3RhbmQgdGhhdCBfLmhhcygpIGlzIGEgdHlwZSBndWFyZFxuICAgIGlmICghZXh0Q29uZmlnLnNjcmlwdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBkb2VzIG5vdCBjb250YWluIHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgXCJzY3JpcHRzXCIgZmllbGQgdW5kZXJuZWF0aCB0aGUgXCJhcHBpdW1cIiBmaWVsZCBpbiBpdHMgcGFja2FnZS5qc29uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0U2NyaXB0cyA9IGV4dENvbmZpZy5zY3JpcHRzO1xuXG4gICAgaWYgKCFfLmlzUGxhaW5PYmplY3QoZXh0U2NyaXB0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtleHR9JyBcInNjcmlwdHNcIiBmaWVsZCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0YCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmhhcyhleHRTY3JpcHRzLCBzY3JpcHROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2V4dH0nIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNjcmlwdDogJyR7c2NyaXB0TmFtZX0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVubmVyID0gbmV3IFN1YlByb2Nlc3MocHJvY2Vzcy5leGVjUGF0aCwgW1xuICAgICAgZXh0U2NyaXB0c1tzY3JpcHROYW1lXVxuICAgIF0sIHtcbiAgICAgIGN3ZDogdGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoZXh0KVxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gbmV3IFJpbmdCdWZmZXIoNTApO1xuXG4gICAgcnVubmVyLm9uKCdzdHJlYW0tbGluZScsIChsaW5lKSA9PiB7XG4gICAgICBvdXRwdXQuZW5xdWV1ZShsaW5lKTtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgbGluZSk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBydW5uZXIuc3RhcnQoMCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVubmVyLmpvaW4oKTtcbiAgICAgIGxvZyh0aGlzLmlzSnNvbk91dHB1dCwgYCR7c2NyaXB0TmFtZX0gc3VjY2Vzc2Z1bGx5IHJhbmAuZ3JlZW4pO1xuICAgICAgcmV0dXJuIHtvdXRwdXQ6IG91dHB1dC5nZXRCdWZmKCl9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgRW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiBydW5uaW5nICcke3NjcmlwdE5hbWV9JzogJHtlcnIubWVzc2FnZX1gLnJlZCk7XG4gICAgICByZXR1cm4ge2Vycm9yOiBlcnIubWVzc2FnZSwgb3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXh0ZW5zaW9uQ29tbWFuZDtcbmV4cG9ydCB7RXh0ZW5zaW9uQ29tbWFuZH07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZH0gY29uc3RydWN0b3JcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29tbWFuZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RXh0ZW5zaW9uQ29uZmlnPEV4dFR5cGU+fSBjb25maWcgLSB0aGUgYERyaXZlckNvbmZpZ2Agb3IgYFBsdWdpbkNvbmZpZ2AgaW5zdGFuY2UgdXNlZCBmb3IgdGhpcyBjb21tYW5kXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGpzb24gLSB3aGV0aGVyIHRoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5kIHNob3VsZCBiZSBKU09OIG9yIHRleHRcbiAqL1xuXG4vKipcbiAqIEV4dHJhIHN0dWZmIGFib3V0IGV4dGVuc2lvbnM7IHVzZWQgaW5kaXJlY3RseSBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH0uXG4gKlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uTWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaW5zdGFsbGVkIC0gSWYgYHRydWVgLCB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZFxuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1cGRhdGVWZXJzaW9uIC0gSWYgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQsIHRoZSB2ZXJzaW9uIGl0IGNhbiBiZSB1cGRhdGVkIHRvXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVuc2FmZVVwZGF0ZVZlcnNpb24gLSBTYW1lIGFzIGFib3ZlLCBidXQgYSBtYWpvciB2ZXJzaW9uIGJ1bXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXBUb0RhdGUgLSBJZiB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBhbmQgdGhlIGxhdGVzdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcycpLkRyaXZlclR5cGV9IERyaXZlclR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzJykuUGx1Z2luVHlwZX0gUGx1Z2luVHlwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5FeHRSZWNvcmQ8RXh0VHlwZT59IEV4dFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gRXh0ZW5zaW9uQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2V4dGVybmFsLW1hbmlmZXN0JykuRXh0TWV0YWRhdGE8RXh0VHlwZT59IEV4dE1ldGFkYXRhXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2FwcGl1bS1tYW5pZmVzdCcpLkV4dE1hbmlmZXN0PEV4dFR5cGU+fSBFeHRNYW5pZmVzdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9leHRlcm5hbC1tYW5pZmVzdCcpLkV4dFBhY2thZ2VKc29uPEV4dFR5cGU+fSBFeHRQYWNrYWdlSnNvblxuICovXG5cbi8qKlxuICogUG9zc2libGUgcmV0dXJuIHZhbHVlIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH1cbiAqIEB0eXBlZGVmIFVuaW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2dOYW1lXG4gKiBAcHJvcGVydHkge2ZhbHNlfSBpbnN0YWxsZWRcbiAqL1xuXG4vKipcbiAqIFBvc3NpYmxlIHJldHVybiB2YWx1ZSBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmxpc3R9XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5JbnRlcm5hbE1ldGFkYXRhICYgRXh0ZW5zaW9uTWV0YWRhdGF9IEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmxpc3R9LlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF8VW5pbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YT59IEV4dGVuc2lvbkxpc3REYXRhXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3J1bn0uXG4gKiBAdHlwZWRlZiBSdW5PcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIHJ1biBhIHNjcmlwdCBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2NyaXB0TmFtZSAtIG5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW5cbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3J1bn1cbiAqXG4gKiBAdHlwZWRlZiBSdW5PdXRwdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JdIC0gZXJyb3IgbWVzc2FnZSBpZiBzY3JpcHQgcmFuIHVuc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgdW5kZWZpbmVkXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBvdXRwdXQgLSBzY3JpcHQgb3V0cHV0XG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VwZGF0ZX0uXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25VcGRhdGVPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdW5zYWZlIC0gaWYgdHJ1ZSwgd2lsbCBwZXJmb3JtIHVuc2FmZSB1cGRhdGVzIHBhc3QgbWFqb3IgcmV2aXNpb24gYm91bmRhcmllc1xuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIEV4dGVuc2lvblVwZGF0ZVJlc3VsdFxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLEVycm9yPn0gZXJyb3JzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byBlcnJvciBvYmplY3RzXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsVXBkYXRlUmVwb3J0Pn0gdXBkYXRlcyAtIG1hcCBvZiBleHQgbmFtZXMgdG8ge0BsaW5rY29kZSBVcGRhdGVSZXBvcnR9c1xuICovXG5cbi8qKlxuICogUGFydCBvZiByZXN1bHQgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91cGRhdGV9LlxuICogQHR5cGVkZWYgVXBkYXRlUmVwb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZnJvbSAtIHZlcnNpb24gdGhlIGV4dGVuc2lvbiB3YXMgdXBkYXRlZCBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdG8gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgdG9cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdW5pbnN0YWxsfS5cbiAqIEB0eXBlZGVmIFVuaW5zdGFsbE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHQgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byB1bmluc3RhbGxcbiAqL1xuXG4vKipcbiAqIFVzZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmdldFBvc3RJbnN0YWxsVGV4dH1cbiAqIEB0eXBlZGVmIEV4dGVuc2lvbkFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHROYW1lIC0gdGhlIG5hbWUgb2YgYW4gZXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkge29iamVjdH0gZXh0RGF0YSAtIHRoZSBkYXRhIGZvciBhbiBpbnN0YWxsZWQgZXh0ZW5zaW9uXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuaW5zdGFsbFZpYU5wbX1cbiAqIEB0eXBlZGVmIEluc3RhbGxWaWFOcG1BcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXh0IC0gdGhlIG5hbWUgb3Igc3BlYyBvZiBhbiBleHRlbnNpb24gdG8gaW5zdGFsbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZ05hbWUgLSB0aGUgTlBNIHBhY2thZ2UgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BrZ1Zlcl0gLSB0aGUgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgTlBNIHBhY2thZ2VcbiAqL1xuXG4vKipcbiAqIE9iamVjdCByZXR1cm5lZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGV9XG4gKiBAdHlwZWRlZiBQb3NzaWJsZVVwZGF0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjdXJyZW50IC0gY3VycmVudCB2ZXJzaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHNhZmVVcGRhdGUgLSB2ZXJzaW9uIHdlIGNhbiBzYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICogQHByb3BlcnR5IHtzdHJpbmc/fSB1bnNhZmVVcGRhdGUgLSB2ZXJzaW9uIHdlIGNhbiB1bnNhZmVseSB1cGRhdGUgdG8gaWYgaXQgZXhpc3RzLCBvciBudWxsXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX2luc3RhbGx9XG4gKiBAdHlwZWRlZiBJbnN0YWxsQXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dCAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5JbnN0YWxsVHlwZX0gaW5zdGFsbFR5cGUgLSBob3cgdG8gaW5zdGFsbCB0aGlzIGV4dGVuc2lvbi4gT25lIG9mIHRoZSBJTlNUQUxMX1RZUEVTXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIGZvciBnaXQvZ2l0aHViIGluc3RhbGxzLCB0aGUgZXh0ZW5zaW9uIG5vZGUgcGFja2FnZSBuYW1lXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5lZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuZ2V0RXh0ZW5zaW9uRmllbGRzfVxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7RXh0TWV0YWRhdGE8RXh0VHlwZT4gJiB7IHBrZ05hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nIH0gJiBpbXBvcnQoJy4uLy4uL3R5cGVzL2V4dGVybmFsLW1hbmlmZXN0JykuQ29tbW9uTWV0YWRhdGF9IEV4dGVuc2lvbkZpZWxkc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7RXh0VHlwZSBleHRlbmRzIERyaXZlclR5cGUgPyB0eXBlb2YgaW1wb3J0KCcuLi9jb25zdGFudHMnKS5LTk9XTl9EUklWRVJTIDogRXh0VHlwZSBleHRlbmRzIFBsdWdpblR5cGUgPyB0eXBlb2YgaW1wb3J0KCcuLi9jb25zdGFudHMnKS5LTk9XTl9QTFVHSU5TIDogbmV2ZXJ9IEtub3duRXh0ZW5zaW9uc1xuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLFdBQW5COztBQUVBLE1BQU1DLGlCQUFOLFNBQWdDQyxLQUFoQyxDQUFzQzs7QUFDdEMsTUFBTUMsdUJBQU4sU0FBc0NELEtBQXRDLENBQTRDOztBQUs1QyxNQUFNRSxnQkFBTixDQUF1QjtFQUtyQkMsTUFBTTtFQU1OQyxlQUFlO0VBTWZDLFlBQVk7O0VBTVpDLFdBQVcsQ0FBRTtJQUFDSCxNQUFEO0lBQVNJO0VBQVQsQ0FBRixFQUFrQjtJQUMzQixLQUFLSixNQUFMLEdBQWNBLE1BQWQ7SUFDQSxLQUFLRSxZQUFMLEdBQW9CRSxJQUFwQjtFQUNEOztFQUtPLElBQUpDLElBQUksR0FBSTtJQUNWLE9BQU8sS0FBS0wsTUFBTCxDQUFZTSxhQUFuQjtFQUNEOztFQVFZLE1BQVBDLE9BQU8sQ0FBRUMsSUFBRixFQUFRO0lBQ25CLE1BQU1DLEdBQUcsR0FBR0QsSUFBSSxDQUFFLEdBQUUsS0FBS0gsSUFBSyxTQUFkLENBQWhCOztJQUNBLElBQUksQ0FBQ0ssZ0JBQUVDLFVBQUYsQ0FBYSxLQUFLRixHQUFMLENBQWIsQ0FBTCxFQUE4QjtNQUM1QixNQUFNLElBQUlaLEtBQUosQ0FBVyxpQkFBZ0IsS0FBS1EsSUFBSyxZQUFXSSxHQUFJLEVBQXBELENBQU47SUFDRDs7SUFDRCxNQUFNRyxVQUFVLEdBQUcsS0FBS0gsR0FBTCxFQUFVSSxJQUFWLENBQWUsSUFBZixDQUFuQjtJQUNBLE9BQU8sTUFBTUQsVUFBVSxDQUFDSixJQUFELENBQXZCO0VBQ0Q7O0VBY1MsTUFBSk0sSUFBSSxDQUFFO0lBQUNDLGFBQUQ7SUFBZ0JDO0VBQWhCLENBQUYsRUFBZ0M7SUFDeEMs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
|
|
478
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVUERBVEVfQUxMIiwiTm90VXBkYXRhYmxlRXJyb3IiLCJFcnJvciIsIk5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIiwiRXh0ZW5zaW9uQ29tbWFuZCIsImNvbmZpZyIsImtub3duRXh0ZW5zaW9ucyIsImlzSnNvbk91dHB1dCIsImNvbnN0cnVjdG9yIiwianNvbiIsInR5cGUiLCJleHRlbnNpb25UeXBlIiwiZXhlY3V0ZSIsImFyZ3MiLCJjbWQiLCJfIiwiaXNGdW5jdGlvbiIsImV4ZWN1dGVDbWQiLCJiaW5kIiwibGlzdCIsInNob3dJbnN0YWxsZWQiLCJzaG93VXBkYXRlcyIsImxzTXNnIiwiaW5zdGFsbGVkTmFtZXMiLCJPYmplY3QiLCJrZXlzIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsImtub3duTmFtZXMiLCJleHRzIiwicmVkdWNlIiwiYWNjIiwibmFtZSIsImluY2x1ZGVzIiwiaW5zdGFsbGVkIiwicGtnTmFtZSIsImV4dCIsImRhdGEiLCJ0b1BhaXJzIiwiaW5zdGFsbFR5cGUiLCJJTlNUQUxMX1RZUEVfTlBNIiwidXBkYXRlcyIsImNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIiwidXBkYXRlVmVyc2lvbiIsInNhZmVVcGRhdGUiLCJ1bnNhZmVVcGRhdGVWZXJzaW9uIiwidW5zYWZlVXBkYXRlIiwidXBUb0RhdGUiLCJsaXN0RGF0YSIsImluc3RhbGxUeHQiLCJncmV5IiwidXBkYXRlVHh0IiwidXBUb0RhdGVUeHQiLCJ1bnNhZmVVcGRhdGVUeHQiLCJpbnN0YWxsU3BlYyIsInZlcnNpb24iLCJ0eXBlVHh0IiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRV9HSVRIVUIiLCJ5ZWxsb3ciLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJtYWdlbnRhIiwiZ3JlZW4iLCJjeWFuIiwiY29uc29sZSIsImxvZyIsIl9pbnN0YWxsIiwicGFja2FnZU5hbWUiLCJleHREYXRhIiwic3BsaXQiLCJsZW5ndGgiLCJpbnN0YWxsVmlhTnBtIiwicmVwbGFjZSIsInBrZ1ZlciIsInBhdGgiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsInNwbGl0cyIsIm1zZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJleHROYW1lIiwiaXNJbnN0YWxsZWQiLCJleHRNYW5pZmVzdCIsImFkZEV4dGVuc2lvbiIsImVudiIsImhhc0FwcGl1bURlcGVuZGVuY3kiLCJhcHBpdW1Ib21lIiwiZ2V0UG9zdEluc3RhbGxUZXh0IiwibnBtU3BlYyIsInNwZWNNc2ciLCJwa2dKc29uRGF0YSIsIm5wbSIsImluc3RhbGxQYWNrYWdlIiwiZ2V0RXh0ZW5zaW9uRmllbGRzIiwiZXJyIiwibWVzc2FnZSIsImFwcGl1bSIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwicmVzdWx0IiwiZXh0TWV0YWRhdGEiLCJfdW5pbnN0YWxsIiwiaW5zdGFsbFBhdGgiLCJnZXRJbnN0YWxsUGF0aCIsImZzIiwicmltcmFmIiwicmVtb3ZlRXh0ZW5zaW9uIiwiX3VwZGF0ZSIsInVuc2FmZSIsInNob3VsZFVwZGF0ZUFsbCIsImV4dHNUb1VwZGF0ZSIsImVycm9ycyIsImUiLCJ1cGRhdGUiLCJjdXJyZW50IiwidXBkYXRlVmVyIiwidXBkYXRlRXh0ZW5zaW9uIiwiZnJvbSIsInRvIiwicmVkIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbiIsInV0aWwiLCJjb21wYXJlVmVyc2lvbnMiLCJfcnVuIiwic2NyaXB0TmFtZSIsImhhcyIsImV4dENvbmZpZyIsInNjcmlwdHMiLCJleHRTY3JpcHRzIiwiaXNQbGFpbk9iamVjdCIsInJ1bm5lciIsIlN1YlByb2Nlc3MiLCJwcm9jZXNzIiwiZXhlY1BhdGgiLCJjd2QiLCJvdXRwdXQiLCJSaW5nQnVmZmVyIiwib24iLCJsaW5lIiwiZW5xdWV1ZSIsInN0YXJ0Iiwiam9pbiIsImdldEJ1ZmYiLCJlcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge25wbSwgZnMsIHV0aWwsIGVudn0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7bG9nLCBzcGluV2l0aCwgUmluZ0J1ZmZlcn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge1N1YlByb2Nlc3N9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBJTlNUQUxMX1RZUEVfTlBNLFxuICBJTlNUQUxMX1RZUEVfR0lULFxuICBJTlNUQUxMX1RZUEVfR0lUSFVCLFxuICBJTlNUQUxMX1RZUEVfTE9DQUwsXG59IGZyb20gJy4uL2V4dGVuc2lvbi9leHRlbnNpb24tY29uZmlnJztcbmltcG9ydCB7cGFja2FnZURpZENoYW5nZX0gZnJvbSAnLi4vZXh0ZW5zaW9uL3BhY2thZ2UtY2hhbmdlZCc7XG5cbmNvbnN0IFVQREFURV9BTEwgPSAnaW5zdGFsbGVkJztcblxuY2xhc3MgTm90VXBkYXRhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuY2xhc3MgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICovXG5jbGFzcyBFeHRlbnNpb25Db21tYW5kIHtcbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIGBEcml2ZXJDb25maWdgIG9yIGBQbHVnaW5Db25maWdgLCBkZXBlbmRpbmcgb24gYEV4dFR5cGVgLlxuICAgKiBAdHlwZSB7RXh0ZW5zaW9uQ29uZmlnPEV4dFR5cGU+fVxuICAgKi9cbiAgY29uZmlnO1xuXG4gIC8qKlxuICAgKiB7QGxpbmtjb2RlIFJlY29yZH0gb2Ygb2ZmaWNpYWwgcGx1Z2lucyBvciBkcml2ZXJzLlxuICAgKiBAdHlwZSB7S25vd25FeHRlbnNpb25zPEV4dFR5cGU+fVxuICAgKi9cbiAga25vd25FeHRlbnNpb25zO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGNvbW1hbmQgb3V0cHV0IGhhcyBiZWVuIHJlcXVlc3RlZCBhcyBKU09OLlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIGlzSnNvbk91dHB1dDtcblxuICAvKipcbiAgICogQnVpbGQgYW4gRXh0ZW5zaW9uQ29tbWFuZFxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbW1hbmRPcHRpb25zPEV4dFR5cGU+fSBvcHRzXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoe2NvbmZpZywganNvbn0pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmlzSnNvbk91dHB1dCA9IGpzb247XG4gIH1cblxuICAvKipcbiAgICogYGRyaXZlcmAgb3IgYHBsdWdpbmAsIGRlcGVuZGluZyBvbiB0aGUgYEV4dGVuc2lvbkNvbmZpZ2AuXG4gICAqL1xuICBnZXQgdHlwZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmV4dGVuc2lvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhIENMSSBwYXJzZSBhbmQgcnVuIGFuIGV4dGVuc2lvbiBjb21tYW5kIGJhc2VkIG9uIGl0cyB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gYSBrZXkvdmFsdWUgb2JqZWN0IHdpdGggQ0xJIGZsYWdzIGFuZCB2YWx1ZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTxvYmplY3Q+fSB0aGUgcmVzdWx0IG9mIHRoZSBzcGVjaWZpYyBjb21tYW5kIHdoaWNoIGlzIGV4ZWN1dGVkXG4gICAqL1xuICBhc3luYyBleGVjdXRlIChhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYXJnc1tgJHt0aGlzLnR5cGV9Q29tbWFuZGBdO1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKHRoaXNbY21kXSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGhhbmRsZSAke3RoaXMudHlwZX0gY29tbWFuZCAke2NtZH1gKTtcbiAgICB9XG4gICAgY29uc3QgZXhlY3V0ZUNtZCA9IHRoaXNbY21kXS5iaW5kKHRoaXMpO1xuICAgIHJldHVybiBhd2FpdCBleGVjdXRlQ21kKGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIExpc3RPcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd0luc3RhbGxlZCAtIHdoZXRoZXIgc2hvdWxkIHNob3cgb25seSBpbnN0YWxsZWQgZXh0ZW5zaW9uc1xuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dVcGRhdGVzIC0gd2hldGhlciBzaG91bGQgc2hvdyBhdmFpbGFibGUgdXBkYXRlc1xuICAgKi9cblxuICAvKipcbiAgICogTGlzdCBleHRlbnNpb25zXG4gICAqXG4gICAqIEBwYXJhbSB7TGlzdE9wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxFeHRlbnNpb25MaXN0RGF0YT59IG1hcCBvZiBleHRlbnNpb24gbmFtZXMgdG8gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIGFzeW5jIGxpc3QgKHtzaG93SW5zdGFsbGVkLCBzaG93VXBkYXRlc30pIHtcbiAgICBjb25zdCBsc01zZyA9IGBMaXN0aW5nICR7c2hvd0luc3RhbGxlZCA/ICdpbnN0YWxsZWQnIDogJ2F2YWlsYWJsZSd9ICR7XG4gICAgICB0aGlzLnR5cGVcbiAgICB9c2A7XG4gICAgY29uc3QgaW5zdGFsbGVkTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zKTtcbiAgICBjb25zdCBrbm93bk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5rbm93bkV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGV4dHMgPSBbLi4uaW5zdGFsbGVkTmFtZXMsIC4uLmtub3duTmFtZXNdLnJlZHVjZShcbiAgICAgIChhY2MsIG5hbWUpID0+IHtcbiAgICAgICAgaWYgKCFhY2NbbmFtZV0pIHtcbiAgICAgICAgICBpZiAoaW5zdGFsbGVkTmFtZXMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgIGFjY1tuYW1lXSA9IHtcbiAgICAgICAgICAgICAgLi4udGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tuYW1lXSxcbiAgICAgICAgICAgICAgaW5zdGFsbGVkOiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFzaG93SW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBhY2NbbmFtZV0gPSB7cGtnTmFtZTogdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV0sIGluc3RhbGxlZDogZmFsc2V9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBhY2N1bXVsYXRvciBjb250YWlucyBlaXRoZXIge0BsaW5rY29kZSBVbmluc3RhbGxlZEV4dGVuc2lvbkxJc3REYXRhfSBfb3JfXG4gICAgICAgKiB7QGxpbmtjb2RlIEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfSB3aXRob3V0IHVwZ3JhZGUgaW5mb3JtYXRpb24gKHdoaWNoIGlzIGFkZGVkIGJ5IHRoZSBiZWxvdyBjb2RlIGJsb2NrKVxuICAgICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsUGFydGlhbDxJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YT58VW5pbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YT59XG4gICAgICAgKi8gKHt9KVxuICAgICk7XG5cbiAgICAvLyBpZiB3ZSB3YW50IHRvIHNob3cgd2hldGhlciB1cGRhdGVzIGFyZSBhdmFpbGFibGUsIHB1dCB0aGF0IGJlaGluZCBhIHNwaW5uZXJcbiAgICBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbHNNc2csIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc2hvd1VwZGF0ZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBbZXh0LCBkYXRhXSBvZiBfLnRvUGFpcnMoZXh0cykpIHtcbiAgICAgICAgaWYgKCFkYXRhLmluc3RhbGxlZCB8fCBkYXRhLmluc3RhbGxUeXBlICE9PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdXBkYXRlcyBvbiBleHRzIHRoYXQgYXJlbid0IGluc3RhbGxlZFxuICAgICAgICAgIC8vIGFsc28gZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdXBkYXRlcyBvbiBub24tbnBtIGV4dHNcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVzID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpO1xuICAgICAgICBkYXRhLnVwZGF0ZVZlcnNpb24gPSB1cGRhdGVzLnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudW5zYWZlVXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMudW5zYWZlVXBkYXRlO1xuICAgICAgICBkYXRhLnVwVG9EYXRlID1cbiAgICAgICAgICB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaXN0RGF0YSA9IC8qKiBAdHlwZSB7RXh0ZW5zaW9uTGlzdERhdGF9ICovIChleHRzKTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBsaXN0RGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBfLnRvUGFpcnMobGlzdERhdGEpKSB7XG4gICAgICBsZXQgaW5zdGFsbFR4dCA9ICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgbGV0IHVwZGF0ZVR4dCA9ICcnO1xuICAgICAgbGV0IHVwVG9EYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdW5zYWZlVXBkYXRlVHh0ID0gJyc7XG4gICAgICBpZiAoZGF0YS5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGluc3RhbGxUeXBlLFxuICAgICAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgICAgIHVwZGF0ZVZlcnNpb24sXG4gICAgICAgICAgdW5zYWZlVXBkYXRlVmVyc2lvbixcbiAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICAgIHVwVG9EYXRlLFxuICAgICAgICB9ID0gZGF0YTtcbiAgICAgICAgbGV0IHR5cGVUeHQ7XG4gICAgICAgIHN3aXRjaCAoaW5zdGFsbFR5cGUpIHtcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVQ6XG4gICAgICAgICAgY2FzZSBJTlNUQUxMX1RZUEVfR0lUSFVCOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAoY2xvbmVkIGZyb20gJHtpbnN0YWxsU3BlY30pYC55ZWxsb3c7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9MT0NBTDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSBgKGxpbmtlZCBmcm9tICR7aW5zdGFsbFNwZWN9KWAubWFnZW50YTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0eXBlVHh0ID0gJyhOUE0pJztcbiAgICAgICAgfVxuICAgICAgICBpbnN0YWxsVHh0ID0gYEAke3ZlcnNpb24ueWVsbG93fSAke1xuICAgICAgICAgICgnW2luc3RhbGxlZCAnICsgdHlwZVR4dCArICddJykuZ3JlZW5cbiAgICAgICAgfWA7XG5cbiAgICAgICAgaWYgKHNob3dVcGRhdGVzKSB7XG4gICAgICAgICAgaWYgKHVwZGF0ZVZlcnNpb24pIHtcbiAgICAgICAgICAgIHVwZGF0ZVR4dCA9IGAgWyR7dXBkYXRlVmVyc2lvbn0gYXZhaWxhYmxlXWAubWFnZW50YTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHVwVG9EYXRlKSB7XG4gICAgICAgICAgICB1cFRvRGF0ZVR4dCA9IGAgW1VwIHRvIGRhdGVdYC5ncmVlbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHVuc2FmZVVwZGF0ZVZlcnNpb24pIHtcbiAgICAgICAgICAgIHVuc2FmZVVwZGF0ZVR4dCA9XG4gICAgICAgICAgICAgIGAgWyR7dW5zYWZlVXBkYXRlVmVyc2lvbn0gYXZhaWxhYmxlIChwb3RlbnRpYWxseSB1bnNhZmUpXWAuY3lhbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGAtICR7bmFtZS55ZWxsb3d9JHtpbnN0YWxsVHh0fSR7dXBkYXRlVHh0fSR7dXBUb0RhdGVUeHR9JHt1bnNhZmVVcGRhdGVUeHR9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdERhdGE7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0YWxsQXJnc30gYXJnc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgX2luc3RhbGwgKHtpbnN0YWxsU3BlYywgaW5zdGFsbFR5cGUsIHBhY2thZ2VOYW1lfSkge1xuICAgIC8qKiBAdHlwZSB7RXh0ZW5zaW9uRmllbGRzPHR5cGVvZiB0aGlzLnR5cGU+fSAqL1xuICAgIGxldCBleHREYXRhO1xuXG4gICAgaWYgKFxuICAgICAgcGFja2FnZU5hbWUgJiZcbiAgICAgIFtJTlNUQUxMX1RZUEVfTE9DQUwsIElOU1RBTExfVFlQRV9OUE1dLmluY2x1ZGVzKGluc3RhbGxUeXBlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV2hlbiB1c2luZyAtLXNvdXJjZT0ke2luc3RhbGxUeXBlfSwgY2Fubm90IGFsc28gdXNlIC0tcGFja2FnZWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIXBhY2thZ2VOYW1lICYmXG4gICAgICBbSU5TVEFMTF9UWVBFX0dJVCwgSU5TVEFMTF9UWVBFX0dJVEhVQl0uaW5jbHVkZXMoaW5zdGFsbFR5cGUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBXaGVuIHVzaW5nIC0tc291cmNlPSR7aW5zdGFsbFR5cGV9LCBtdXN0IGFsc28gdXNlIC0tcGFja2FnZWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUSFVCKSB7XG4gICAgICBpZiAoaW5zdGFsbFNwZWMuc3BsaXQoJy8nKS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBHaXRodWIgJHt0aGlzLnR5cGV9IHNwZWMgJHtpbnN0YWxsU3BlY30gYXBwZWFyZWQgdG8gYmUgaW52YWxpZDsgYCArXG4gICAgICAgICAgICAnaXQgc2hvdWxkIGJlIG9mIHRoZSBmb3JtIDxvcmc+LzxyZXBvPidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe1xuICAgICAgICBpbnN0YWxsU3BlYyxcbiAgICAgICAgcGtnTmFtZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYWNrYWdlTmFtZSksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUKSB7XG4gICAgICAvLyBnaXQgdXJscyBjYW4gaGF2ZSAnLmdpdCcgYXQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhbmQgd291bGQgY29tcGxpY2F0ZSB0aGVcbiAgICAgIC8vIHdheSB3ZSBkb3dubG9hZCBhbmQgbmFtZSBkaXJlY3Rvcmllcywgc28gd2UgY2FuIGp1c3QgcmVtb3ZlIGl0XG4gICAgICBpbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtcbiAgICAgICAgaW5zdGFsbFNwZWMsXG4gICAgICAgIHBrZ05hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFja2FnZU5hbWUpLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwa2dOYW1lLCBwa2dWZXI7XG4gICAgICBpZiAoaW5zdGFsbFR5cGUgPT09IElOU1RBTExfVFlQRV9MT0NBTCkge1xuICAgICAgICBwa2dOYW1lID0gcGF0aC5pc0Fic29sdXRlKGluc3RhbGxTcGVjKVxuICAgICAgICAgID8gaW5zdGFsbFNwZWNcbiAgICAgICAgICA6IHBhdGgucmVzb2x2ZShpbnN0YWxsU3BlYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZWl0aGVyIGFuIG5wbSBwYWNrYWdlIG9yIGFuIGFwcGl1bSB2ZXJpZmllZCBleHRlbnNpb25cbiAgICAgICAgLy8gbmFtZSBvciBhIGxvY2FsIHBhdGguIGJvdGggb2Ygd2hpY2ggd2lsbCBiZSBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAgICAgLy8gZXh0ZW5zaW9ucyBpbnN0YWxsZWQgdmlhIG5wbSBjYW4gaW5jbHVkZSB2ZXJzaW9ucyBvciB0YWdzIGFmdGVyIHRoZSAnQCdcbiAgICAgICAgLy8gc2lnbiwgc28gY2hlY2sgZm9yIHRoYXQuIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgcGFja2FnZSBuYW1lcyB0aGVtc2VsdmVzIGNhblxuICAgICAgICAvLyBjb250YWluIHRoZSAnQCcgc3ltYm9sLCBhcyBpbiBgbnBtIGluc3RhbGwgQGFwcGl1bS9mYWtlLWRyaXZlckAxLjIuMGBcbiAgICAgICAgbGV0IG5hbWU7XG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IGluc3RhbGxTcGVjLnNwbGl0KCdAJyk7XG4gICAgICAgIGlmIChpbnN0YWxsU3BlY1swXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGFuIG5wbSBvcmcgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gW2BAJHtzcGxpdHNbMV19YCwgc3BsaXRzWzJdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdpdGhvdXQgYW4gbnBtIG9yZ1xuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gc3BsaXRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIHBhY2thZ2UgZnJvbSBucG0sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2tcbiAgICAgICAgICAvLyBhZ2FpbnN0IHRoZSBhcHBpdW0gZXh0ZW5zaW9uIGxpc3Q7IGp1c3QgdXNlIHRoZSBpbnN0YWxsU3BlYyBhcyBpc1xuICAgICAgICAgIHBrZ05hbWUgPSBuYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBhcHBpdW0gZHJpdmVyIChsaWtlICd4Y3VpdGVzdCcpIHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBkZXJlZmVyZW5jZSB0aGUgYWN0dWFsIG5wbSBwYWNrYWdlICgnYXBwaXVwbS14Y3VpdGVzdC1kcml2ZXInKSwgc29cbiAgICAgICAgICAvLyBjaGVjayBpdCBleGlzdHMgYW5kIGdldCB0aGUgY29ycmVjdCBwYWNrYWdlXG4gICAgICAgICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICAgICAgICBpZiAoIV8uaW5jbHVkZXMoa25vd25OYW1lcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgcmVzb2x2ZSAke3RoaXMudHlwZX07IGFyZSB5b3Ugc3VyZSBpdCdzIGluIHRoZSBsaXN0IGAgK1xuICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe2luc3RhbGxTcGVjLCBwa2dOYW1lLCBwa2dWZXJ9KTtcbiAgICB9XG5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGRlbGV0ZSBleHREYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYCR7dGhpcy50eXBlfU5hbWVgKV07XG5cbiAgICBpZiAodGhpcy5jb25maWcuaXNJbnN0YWxsZWQoZXh0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEEgJHt0aGlzLnR5cGV9IG5hbWVkICcke2V4dE5hbWV9JyBpcyBhbHJlYWR5IGluc3RhbGxlZC4gYCArXG4gICAgICAgICAgYERpZCB5b3UgbWVhbiB0byB1cGRhdGU/ICdhcHBpdW0gJHt0aGlzLnR5cGV9IHVwZGF0ZScuIFNlZSBgICtcbiAgICAgICAgICBgaW5zdGFsbGVkICR7dGhpcy50eXBlfXMgd2l0aCAnYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkJy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dE1hbmlmZXN0ID0gey4uLmV4dERhdGEsIGluc3RhbGxUeXBlLCBpbnN0YWxsU3BlY307XG4gICAgYXdhaXQgdGhpcy5jb25maWcuYWRkRXh0ZW5zaW9uKGV4dE5hbWUsIGV4dE1hbmlmZXN0KTtcblxuICAgIC8vIHVwZGF0ZSB0aGUgaWYgd2UndmUgY2hhbmdlZCB0aGUgbG9jYWwgYHBhY2thZ2UuanNvbmBcbiAgICBpZiAoYXdhaXQgZW52Lmhhc0FwcGl1bURlcGVuZGVuY3kodGhpcy5jb25maWcuYXBwaXVtSG9tZSkpIHtcbiAgICAgIGF3YWl0IHBhY2thZ2VEaWRDaGFuZ2UodGhpcy5jb25maWcuYXBwaXVtSG9tZSk7XG4gICAgfVxuXG4gICAgLy8gbG9nIGluZm8gZm9yIHRoZSB1c2VyXG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCB0aGlzLmdldFBvc3RJbnN0YWxsVGV4dCh7ZXh0TmFtZSwgZXh0RGF0YX0pKTtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYW4gZXh0ZW5zaW9uIHZpYSBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0YWxsVmlhTnBtQXJnc30gYXJnc1xuICAgKi9cbiAgYXN5bmMgaW5zdGFsbFZpYU5wbSAoe2luc3RhbGxTcGVjLCBwa2dOYW1lLCBwa2dWZXJ9KSB7XG4gICAgY29uc3QgbnBtU3BlYyA9IGAke3BrZ05hbWV9JHtwa2dWZXIgPyAnQCcgKyBwa2dWZXIgOiAnJ31gO1xuICAgIGNvbnN0IHNwZWNNc2cgPVxuICAgICAgbnBtU3BlYyA9PT0gaW5zdGFsbFNwZWMgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2luc3RhbGxTcGVjfScke3NwZWNNc2d9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aChcbiAgICAgICAgdGhpcy5pc0pzb25PdXRwdXQsXG4gICAgICAgIG1zZyxcbiAgICAgICAgYXN5bmMgKCkgPT5cbiAgICAgICAgICBhd2FpdCBucG0uaW5zdGFsbFBhY2thZ2UodGhpcy5jb25maWcuYXBwaXVtSG9tZSwgcGtnTmFtZSwge1xuICAgICAgICAgICAgcGtnVmVyLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RXh0ZW5zaW9uRmllbGRzKHBrZ0pzb25EYXRhLCBpbnN0YWxsU3BlYyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRleHQgd2hpY2ggc2hvdWxkIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhZnRlciBhbiBleHRlbnNpb24gaGFzIGJlZW4gaW5zdGFsbGVkLiBUaGlzXG4gICAqIGlzIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgZHJpdmVycy9wbHVnaW5zIHdpdGggdGhlaXIgb3duIHBhcnRpY3VsYXIgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25BcmdzfSBhcmdzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0UG9zdEluc3RhbGxUZXh0IChhcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhbiBOUE0gbW9kdWxlJ3MgcGFja2FnZS5qc29uIGFuZCBleHRyYWN0IEFwcGl1bSBkcml2ZXIgaW5mb3JtYXRpb24gZnJvbSBhIHNwZWNpYWxcbiAgICogJ2FwcGl1bScgZmllbGQgaW4gdGhlIEpTT04gZGF0YS4gV2UgbmVlZCB0aGlzIGluZm9ybWF0aW9uIHRvIGUuZy4gZGV0ZXJtaW5lIHdoaWNoIGNsYXNzIHRvXG4gICAqIGxvYWQgYXMgdGhlIG1haW4gZHJpdmVyIGNsYXNzLCBvciB0byBiZSBhYmxlIHRvIGRldGVjdCBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIGRyaXZlciBhbmRcbiAgICogYXBwaXVtIHZlcnNpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dFBhY2thZ2VKc29uPEV4dFR5cGU+fSBwa2dKc29uRGF0YSAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlbiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlY1xuICAgKiBAcmV0dXJucyB7RXh0ZW5zaW9uRmllbGRzPEV4dFR5cGU+fVxuICAgKi9cbiAgZ2V0RXh0ZW5zaW9uRmllbGRzIChwa2dKc29uRGF0YSwgaW5zdGFsbFNwZWMpIHtcbiAgICBpZiAoIXBrZ0pzb25EYXRhLmFwcGl1bSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW5zdGFsbGVkIGRyaXZlciBkaWQgbm90IGhhdmUgYW4gJ2FwcGl1bScgc2VjdGlvbiBpbiBpdHMgYCArXG4gICAgICAgICAgYHBhY2thZ2UuanNvbiBmaWxlIGFzIGV4cGVjdGVkYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qge2FwcGl1bSwgbmFtZSwgdmVyc2lvbn0gPSBwa2dKc29uRGF0YTtcbiAgICB0aGlzLnZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzKGFwcGl1bSwgaW5zdGFsbFNwZWMpO1xuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7Li4uYXBwaXVtLCBwa2dOYW1lOiBuYW1lLCB2ZXJzaW9ufTtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtFeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59ICovIChyZXN1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgcGFja2FnZS5qc29uIGZpZWxkcyB3aGljaCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBleHRlbnNpb24gcmVxdWlyZXMsIHZhbGlkYXRlIHRoZVxuICAgKiBwcmVzZW5jZSBhbmQgZm9ybSBvZiB0aG9zZSBmaWVsZHMgb24gdGhlIHBhY2thZ2UuanNvbiBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuXG4gIC8qKlxuICAgKiBGb3IgYW55IGBwYWNrYWdlLmpzb25gIGZpZWxkcyB3aGljaCBhIHBhcnRpY3VsYXIgdHlwZSBvZiBleHRlbnNpb24gcmVxdWlyZXMsIHZhbGlkYXRlIHRoZVxuICAgKiBwcmVzZW5jZSBhbmQgZm9ybSBvZiB0aG9zZSBmaWVsZHMgb24gdGhlIGBwYWNrYWdlLmpzb25gIGRhdGEsIHRocm93aW5nIGFuIGVycm9yIGlmIGFueXRoaW5nIGlzXG4gICAqIGFtaXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dE1ldGFkYXRhPEV4dFR5cGU+fSBleHRNZXRhZGF0YSAtIHRoZSBkYXRhIGluIHRoZSBcImFwcGl1bVwiIGZpZWxkIG9mIGBwYWNrYWdlLmpzb25gIGZvciBhbiBleHRlbnNpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbGxTcGVjIC0gRXh0ZW5zaW9uIG5hbWUvc3BlY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIChleHRNZXRhZGF0YSwgaW5zdGFsbFNwZWMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgaW1wbGVtZW50ZWQgaW4gZmluYWwgY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgYW4gZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsT3B0c30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgX3VuaW5zdGFsbCAoe2luc3RhbGxTcGVjfSkge1xuICAgIGlmICghdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoaW5zdGFsbFNwZWMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW4ndCB1bmluc3RhbGwgJHt0aGlzLnR5cGV9ICcke2luc3RhbGxTcGVjfSc7IGl0IGlzIG5vdCBpbnN0YWxsZWRgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsUGF0aCA9IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGluc3RhbGxTcGVjKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKGluc3RhbGxQYXRoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5jb25maWcucmVtb3ZlRXh0ZW5zaW9uKGluc3RhbGxTcGVjKTtcbiAgICB9XG4gICAgbG9nKFxuICAgICAgdGhpcy5pc0pzb25PdXRwdXQsXG4gICAgICBgU3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkICR7dGhpcy50eXBlfSAnJHtpbnN0YWxsU3BlY30nYC5ncmVlblxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byB1cGRhdGUgb25lIG9yIG1vcmUgZHJpdmVycyB1c2luZyBOUE1cbiAgICpcbiAgICogQHBhcmFtIHtFeHRlbnNpb25VcGRhdGVPcHRzfSB1cGRhdGVTcGVjXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0ZW5zaW9uVXBkYXRlUmVzdWx0Pn1cbiAgICovXG4gIGFzeW5jIF91cGRhdGUgKHtpbnN0YWxsU3BlYywgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGluc3RhbGxTcGVjID09PSBVUERBVEVfQUxMO1xuICAgIC8vIGlmIHdlJ3JlIHNwZWNpZmljYWxseSByZXF1ZXN0aW5nIGFuIHVwZGF0ZSBmb3IgYW4gZXh0ZW5zaW9uLCBtYWtlIHN1cmUgaXQncyBpbnN0YWxsZWRcbiAgICBpZiAoIXNob3VsZFVwZGF0ZUFsbCAmJiAhdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoaW5zdGFsbFNwZWMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgJHt0aGlzLnR5cGV9ICcke2luc3RhbGxTcGVjfScgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGxcbiAgICAgID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgIDogW2luc3RhbGxTcGVjXTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsRXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxVcGRhdGVSZXBvcnQ+fSAqL1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIGlzIHVwZGF0YWJsZWAsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2VdLmluc3RhbGxUeXBlICE9PVxuICAgICAgICAgICAgICBJTlNUQUxMX1RZUEVfTlBNXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFVwZGF0YWJsZUVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBhd2FpdCBzcGluV2l0aChcbiAgICAgICAgICB0aGlzLmlzSnNvbk91dHB1dCxcbiAgICAgICAgICBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBuZWVkcyBhbiB1cGRhdGVgLFxuICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHRoaXMuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUoZSk7XG4gICAgICAgICAgICBpZiAoISh1cGRhdGUuc2FmZVVwZGF0ZSB8fCB1cGRhdGUudW5zYWZlVXBkYXRlKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGU7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXVuc2FmZSAmJiAhdXBkYXRlLnNhZmVVcGRhdGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID1cbiAgICAgICAgICB1bnNhZmUgJiYgdXBkYXRlLnVuc2FmZVVwZGF0ZVxuICAgICAgICAgICAgPyB1cGRhdGUudW5zYWZlVXBkYXRlXG4gICAgICAgICAgICA6IHVwZGF0ZS5zYWZlVXBkYXRlO1xuICAgICAgICBhd2FpdCBzcGluV2l0aChcbiAgICAgICAgICB0aGlzLmlzSnNvbk91dHB1dCxcbiAgICAgICAgICBgVXBkYXRpbmcgZHJpdmVyICcke2V9JyBmcm9tICR7dXBkYXRlLmN1cnJlbnR9IHRvICR7dXBkYXRlVmVyfWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy51cGRhdGVFeHRlbnNpb24oZSwgdXBkYXRlVmVyKVxuICAgICAgICApO1xuICAgICAgICB1cGRhdGVzW2VdID0ge2Zyb206IHVwZGF0ZS5jdXJyZW50LCB0bzogdXBkYXRlVmVyfTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlcnJvcnNbZV0gPSBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCAnVXBkYXRlIHJlcG9ydDonKTtcbiAgICBmb3IgKGNvbnN0IFtlLCB1cGRhdGVdIG9mIF8udG9QYWlycyh1cGRhdGVzKSkge1xuICAgICAgbG9nKFxuICAgICAgICB0aGlzLmlzSnNvbk91dHB1dCxcbiAgICAgICAgYC0gJHt0aGlzLnR5cGV9ICR7ZX0gdXBkYXRlZDogJHt1cGRhdGUuZnJvbX0gPT4gJHt1cGRhdGUudG99YC5ncmVlblxuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIGxvZyhcbiAgICAgICAgICB0aGlzLmlzSnNvbk91dHB1dCxcbiAgICAgICAgICBgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgK1xuICAgICAgICAgICAgYGZvciB1cGRhdGVzYC55ZWxsb3dcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgTm9VcGRhdGVzQXZhaWxhYmxlRXJyb3IpIHtcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgaGFkIG5vIHVwZGF0ZXMgYXZhaWxhYmxlYC55ZWxsb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBtYWtlIGl0IHBvcCB3aXRoIHJlZCFcbiAgICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgLSAnJHtlfScgZmFpbGVkIHRvIHVwZGF0ZTogJHtlcnJ9YC5yZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7dXBkYXRlcywgZXJyb3JzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBleHRlbnNpb24gbmFtZSwgZmlndXJlIG91dCB3aGF0IGl0cyBoaWdoZXN0IHBvc3NpYmxlIHZlcnNpb24gdXBncmFkZSBpcywgYW5kIGFsc28gdGhlXG4gICAqIGhpZ2hlc3QgcG9zc2libGUgc2FmZSB1cGdyYWRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0IC0gbmFtZSBvZiBleHRlbnNpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxQb3NzaWJsZVVwZGF0ZXM+fVxuICAgKi9cbiAgYXN5bmMgY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUgKGV4dCkge1xuICAgIC8vIFRPRE8gZGVjaWRlIGhvdyB3ZSB3YW50IHRvIGhhbmRsZSBiZXRhIHZlcnNpb25zP1xuICAgIC8vIHRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kLCAnZXh0JyBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgaW5zdGFsbGVkIGhlcmUsIGFuZCBvZiB0aGUgbnBtXG4gICAgLy8gaW5zdGFsbCB0eXBlXG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWV9ID0gdGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHRdO1xuICAgIGxldCB1bnNhZmVVcGRhdGUgPSBhd2FpdCBucG0uZ2V0TGF0ZXN0VmVyc2lvbihcbiAgICAgIHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsXG4gICAgICBwa2dOYW1lXG4gICAgKTtcbiAgICBsZXQgc2FmZVVwZGF0ZSA9IGF3YWl0IG5wbS5nZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24oXG4gICAgICB0aGlzLmNvbmZpZy5hcHBpdW1Ib21lLFxuICAgICAgcGtnTmFtZSxcbiAgICAgIHZlcnNpb25cbiAgICApO1xuICAgIGlmICghdXRpbC5jb21wYXJlVmVyc2lvbnModW5zYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyB0aGVyZSdzIG5vIHBvc3NpYmxlIHVwZGF0ZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodW5zYWZlVXBkYXRlICYmIHVuc2FmZVVwZGF0ZSA9PT0gc2FmZVVwZGF0ZSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB1cGRhdGUgaXMgdGhlIHNhbWUgYXMgdGhlIHNhZmUgdXBkYXRlLCB3aGljaCBtZWFucyBpdCdzIG5vdCBhY3R1YWxseSB1bnNhZmVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzYWZlVXBkYXRlICYmICF1dGlsLmNvbXBhcmVWZXJzaW9ucyhzYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyBldmVuIHRoZSBzYWZlIHVwZGF0ZSBpcyBub3QgbGF0ZXIgdGhhbiB0aGUgY3VycmVudCwgc28gaXQgaXMgbm90IGFjdHVhbGx5IGFuIHVwZGF0ZVxuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7Y3VycmVudDogdmVyc2lvbiwgc2FmZVVwZGF0ZSwgdW5zYWZlVXBkYXRlfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxseSB1cGRhdGUgYW4gZXh0ZW5zaW9uIGluc3RhbGxlZCBieSBOUE0sIHVzaW5nIHRoZSBOUE0gY2xpLiBBbmQgdXBkYXRlIHRoZSBpbnN0YWxsYXRpb25cbiAgICogbWFuaWZlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIG5hbWUgb2YgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIHZlcnNpb24gc3RyaW5nIGlkZW50aWZpZXIgdG8gdXBkYXRlIGV4dGVuc2lvbiB0b1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUV4dGVuc2lvbiAoaW5zdGFsbFNwZWMsIHZlcnNpb24pIHtcbiAgICBjb25zdCB7cGtnTmFtZX0gPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXTtcbiAgICBhd2FpdCBmcy5yaW1yYWYodGhpcy5jb25maWcuZ2V0SW5zdGFsbFBhdGgoaW5zdGFsbFNwZWMpKTtcbiAgICBjb25zdCBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKHtcbiAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgcGtnTmFtZSxcbiAgICAgIHBrZ1ZlcjogdmVyc2lvbixcbiAgICB9KTtcbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnVwZGF0ZUV4dGVuc2lvbihpbnN0YWxsU3BlYywgZXh0RGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHNjcmlwdCBjYWNoZWQgaW5zaWRlIHRoZSBcInNjcmlwdHNcIiBmaWVsZCB1bmRlciBcImFwcGl1bVwiXG4gICAqIGluc2lkZSBvZiB0aGUgZHJpdmVyL3BsdWdpbnMgXCJwYWNrYWdlLmpzb25cIiBmaWxlLiBXaWxsIHRocm93XG4gICAqIGFuIGVycm9yIGlmIHRoZSBkcml2ZXIvcGx1Z2luIGRvZXMgbm90IGNvbnRhaW4gYSBcInNjcmlwdHNcIiBmaWVsZFxuICAgKiB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb24sIGlmIHRoZVxuICAgKiBcInNjcmlwdHNcIiBmaWVsZCBpcyBub3QgYSBwbGFpbiBvYmplY3QsIG9yIGlmIHRoZSBzY3JpcHROYW1lIGlzXG4gICAqIG5vdCBmb3VuZCB3aXRoaW4gXCJzY3JpcHRzXCIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge1J1bk9wdGlvbnN9IG9wdHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSdW5PdXRwdXQ+fVxuICAgKi9cbiAgYXN5bmMgX3J1biAoe2luc3RhbGxTcGVjLCBzY3JpcHROYW1lfSkge1xuICAgIGlmICghXy5oYXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucywgaW5zdGFsbFNwZWMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHBsZWFzZSBpbnN0YWxsIHRoZSAke3RoaXMudHlwZX0gZmlyc3RgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRDb25maWcgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXTtcblxuICAgIC8vIG5vdGU6IFRTIGNhbm5vdCB1bmRlcnN0YW5kIHRoYXQgXy5oYXMoKSBpcyBhIHR5cGUgZ3VhcmRcbiAgICBpZiAoIWV4dENvbmZpZy5zY3JpcHRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2luc3RhbGxTcGVjfScgZG9lcyBub3QgY29udGFpbiB0aGUgYCArXG4gICAgICAgICAgYFwic2NyaXB0c1wiIGZpZWxkIHVuZGVybmVhdGggdGhlIFwiYXBwaXVtXCIgZmllbGQgaW4gaXRzIHBhY2thZ2UuanNvbmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0U2NyaXB0cyA9IGV4dENvbmZpZy5zY3JpcHRzO1xuXG4gICAgaWYgKCFfLmlzUGxhaW5PYmplY3QoZXh0U2NyaXB0cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSAke3RoaXMudHlwZX0gbmFtZWQgJyR7aW5zdGFsbFNwZWN9JyBcInNjcmlwdHNcIiBmaWVsZCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaGFzKGV4dFNjcmlwdHMsIHNjcmlwdE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2luc3RhbGxTcGVjfScgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2NyaXB0OiAnJHtzY3JpcHROYW1lfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBTdWJQcm9jZXNzKHByb2Nlc3MuZXhlY1BhdGgsIFtleHRTY3JpcHRzW3NjcmlwdE5hbWVdXSwge1xuICAgICAgY3dkOiB0aGlzLmNvbmZpZy5nZXRJbnN0YWxsUGF0aChpbnN0YWxsU3BlYyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgUmluZ0J1ZmZlcig1MCk7XG5cbiAgICBydW5uZXIub24oJ3N0cmVhbS1saW5lJywgKGxpbmUpID0+IHtcbiAgICAgIG91dHB1dC5lbnF1ZXVlKGxpbmUpO1xuICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBsaW5lKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHJ1bm5lci5zdGFydCgwKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBydW5uZXIuam9pbigpO1xuICAgICAgbG9nKHRoaXMuaXNKc29uT3V0cHV0LCBgJHtzY3JpcHROYW1lfSBzdWNjZXNzZnVsbHkgcmFuYC5ncmVlbik7XG4gICAgICByZXR1cm4ge291dHB1dDogb3V0cHV0LmdldEJ1ZmYoKX07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2coXG4gICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICBgRW5jb3VudGVyZWQgYW4gZXJyb3Igd2hlbiBydW5uaW5nICcke3NjcmlwdE5hbWV9JzogJHtlcnIubWVzc2FnZX1gLnJlZFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7ZXJyb3I6IGVyci5tZXNzYWdlLCBvdXRwdXQ6IG91dHB1dC5nZXRCdWZmKCl9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFeHRlbnNpb25Db21tYW5kO1xuZXhwb3J0IHtFeHRlbnNpb25Db21tYW5kfTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kfSBjb25zdHJ1Y3RvclxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25Db21tYW5kT3B0aW9uc1xuICogQHByb3BlcnR5IHtFeHRlbnNpb25Db25maWc8RXh0VHlwZT59IGNvbmZpZyAtIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCBpbnN0YW5jZSB1c2VkIGZvciB0aGlzIGNvbW1hbmRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ganNvbiAtIHdoZXRoZXIgdGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgc2hvdWxkIGJlIEpTT04gb3IgdGV4dFxuICovXG5cbi8qKlxuICogRXh0cmEgc3R1ZmYgYWJvdXQgZXh0ZW5zaW9uczsgdXNlZCBpbmRpcmVjdGx5IGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25NZXRhZGF0YVxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnN0YWxsZWQgLSBJZiBgdHJ1ZWAsIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVwZGF0ZVZlcnNpb24gLSBJZiB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCwgdGhlIHZlcnNpb24gaXQgY2FuIGJlIHVwZGF0ZWQgdG9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdW5zYWZlVXBkYXRlVmVyc2lvbiAtIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIG1ham9yIHZlcnNpb24gYnVtcFxuICogQHByb3BlcnR5IHtib29sZWFufSB1cFRvRGF0ZSAtIElmIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkIGFuZCB0aGUgbGF0ZXN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzJykuRHJpdmVyVHlwZX0gRHJpdmVyVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMnKS5QbHVnaW5UeXBlfSBQbHVnaW5UeXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2FwcGl1bS1tYW5pZmVzdCcpLkV4dFJlY29yZDxFeHRUeXBlPn0gRXh0UmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9leHRlbnNpb24tY29uZmlnJykuRXh0ZW5zaW9uQ29uZmlnPEV4dFR5cGU+fSBFeHRlbnNpb25Db25maWdcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvZXh0ZXJuYWwtbWFuaWZlc3QnKS5FeHRNZXRhZGF0YTxFeHRUeXBlPn0gRXh0TWV0YWRhdGFcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0TWFuaWZlc3Q8RXh0VHlwZT59IEV4dE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2V4dGVybmFsLW1hbmlmZXN0JykuRXh0UGFja2FnZUpzb248RXh0VHlwZT59IEV4dFBhY2thZ2VKc29uXG4gKi9cblxuLyoqXG4gKiBQb3NzaWJsZSByZXR1cm4gdmFsdWUgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fVxuICogQHR5cGVkZWYgVW5pbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBrZ05hbWVcbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IGluc3RhbGxlZFxuICovXG5cbi8qKlxuICogUG9zc2libGUgcmV0dXJuIHZhbHVlIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2FwcGl1bS1tYW5pZmVzdCcpLkludGVybmFsTWV0YWRhdGEgJiBFeHRlbnNpb25NZXRhZGF0YX0gSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGFcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQubGlzdH0uXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZyxJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YXxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn0gRXh0ZW5zaW9uTGlzdERhdGFcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fcnVufS5cbiAqIEB0eXBlZGVmIFJ1bk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byBydW4gYSBzY3JpcHQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjcmlwdE5hbWUgLSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gcnVuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gdmFsdWUgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9ydW59XG4gKlxuICogQHR5cGVkZWYgUnVuT3V0cHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yXSAtIGVycm9yIG1lc3NhZ2UgaWYgc2NyaXB0IHJhbiB1bnN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIHVuZGVmaW5lZFxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gb3V0cHV0IC0gc2NyaXB0IG91dHB1dFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91cGRhdGV9LlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uVXBkYXRlT3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxTcGVjIC0gdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0byB1cGRhdGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdW5zYWZlIC0gaWYgdHJ1ZSwgd2lsbCBwZXJmb3JtIHVuc2FmZSB1cGRhdGVzIHBhc3QgbWFqb3IgcmV2aXNpb24gYm91bmRhcmllc1xuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIEV4dGVuc2lvblVwZGF0ZVJlc3VsdFxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLEVycm9yPn0gZXJyb3JzIC0gbWFwIG9mIGV4dCBuYW1lcyB0byBlcnJvciBvYmplY3RzXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsVXBkYXRlUmVwb3J0Pn0gdXBkYXRlcyAtIG1hcCBvZiBleHQgbmFtZXMgdG8ge0BsaW5rY29kZSBVcGRhdGVSZXBvcnR9c1xuICovXG5cbi8qKlxuICogUGFydCBvZiByZXN1bHQgb2Yge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl91cGRhdGV9LlxuICogQHR5cGVkZWYgVXBkYXRlUmVwb3J0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZnJvbSAtIHZlcnNpb24gdGhlIGV4dGVuc2lvbiB3YXMgdXBkYXRlZCBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdG8gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgdG9cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdW5pbnN0YWxsfS5cbiAqIEB0eXBlZGVmIFVuaW5zdGFsbE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIHVuaW5zdGFsbFxuICovXG5cbi8qKlxuICogVXNlZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuZ2V0UG9zdEluc3RhbGxUZXh0fVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4dE5hbWUgLSB0aGUgbmFtZSBvZiBhbiBleHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBleHREYXRhIC0gdGhlIGRhdGEgZm9yIGFuIGluc3RhbGxlZCBleHRlbnNpb25cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5pbnN0YWxsVmlhTnBtfVxuICogQHR5cGVkZWYgSW5zdGFsbFZpYU5wbUFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2dOYW1lIC0gdGhlIE5QTSBwYWNrYWdlIG5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwa2dWZXJdIC0gdGhlIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIE5QTSBwYWNrYWdlXG4gKi9cblxuLyoqXG4gKiBPYmplY3QgcmV0dXJuZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlfVxuICogQHR5cGVkZWYgUG9zc2libGVVcGRhdGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3VycmVudCAtIGN1cnJlbnQgdmVyc2lvblxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBzYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdW5zYWZlVXBkYXRlIC0gdmVyc2lvbiB3ZSBjYW4gdW5zYWZlbHkgdXBkYXRlIHRvIGlmIGl0IGV4aXN0cywgb3IgbnVsbFxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9pbnN0YWxsfVxuICogQHR5cGVkZWYgSW5zdGFsbEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9yIHNwZWMgb2YgYW4gZXh0ZW5zaW9uIHRvIGluc3RhbGxcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5JbnN0YWxsVHlwZX0gaW5zdGFsbFR5cGUgLSBob3cgdG8gaW5zdGFsbCB0aGlzIGV4dGVuc2lvbi4gT25lIG9mIHRoZSBJTlNUQUxMX1RZUEVTXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhY2thZ2VOYW1lXSAtIGZvciBnaXQvZ2l0aHViIGluc3RhbGxzLCB0aGUgZXh0ZW5zaW9uIG5vZGUgcGFja2FnZSBuYW1lXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5lZCBieSB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuZ2V0RXh0ZW5zaW9uRmllbGRzfVxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7RXh0TWV0YWRhdGE8RXh0VHlwZT4gJiB7IHBrZ05hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nIH0gJiBpbXBvcnQoJy4uLy4uL3R5cGVzL2V4dGVybmFsLW1hbmlmZXN0JykuQ29tbW9uTWV0YWRhdGF9IEV4dGVuc2lvbkZpZWxkc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7RXh0VHlwZSBleHRlbmRzIERyaXZlclR5cGUgPyB0eXBlb2YgaW1wb3J0KCcuLi9jb25zdGFudHMnKS5LTk9XTl9EUklWRVJTIDogRXh0VHlwZSBleHRlbmRzIFBsdWdpblR5cGUgPyB0eXBlb2YgaW1wb3J0KCcuLi9jb25zdGFudHMnKS5LTk9XTl9QTFVHSU5TIDogbmV2ZXJ9IEtub3duRXh0ZW5zaW9uc1xuICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBTUE7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLFdBQW5COztBQUVBLE1BQU1DLGlCQUFOLFNBQWdDQyxLQUFoQyxDQUFzQzs7QUFDdEMsTUFBTUMsdUJBQU4sU0FBc0NELEtBQXRDLENBQTRDOztB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
|
|
@@ -1,22 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @extends {ExtensionCommand<PluginType>}
|
|
3
|
+
*/
|
|
4
|
+
export default class PluginCommand extends ExtensionCommand<"plugin"> {
|
|
2
5
|
/**
|
|
3
6
|
*
|
|
4
|
-
* @param {
|
|
7
|
+
* @param {import('./extension-command').ExtensionCommandOptions<PluginType>} opts
|
|
5
8
|
*/
|
|
6
|
-
constructor({ config, json }:
|
|
7
|
-
knownExtensions: Readonly<{
|
|
8
|
-
readonly images: "@appium/images-plugin";
|
|
9
|
-
readonly 'execute-driver': "@appium/execute-driver-plugin";
|
|
10
|
-
readonly 'relaxed-caps': "@appium/relaxed-caps-plugin";
|
|
11
|
-
}>;
|
|
9
|
+
constructor({ config, json }: import('./extension-command').ExtensionCommandOptions<PluginType>);
|
|
12
10
|
install({ plugin, installType, packageName }: {
|
|
13
11
|
plugin: any;
|
|
14
12
|
installType: any;
|
|
15
13
|
packageName: any;
|
|
16
|
-
}): Promise<import("./extension-command").ExtRecord<
|
|
14
|
+
}): Promise<import("./extension-command").ExtRecord<"plugin">>;
|
|
17
15
|
uninstall({ plugin }: {
|
|
18
16
|
plugin: any;
|
|
19
|
-
}): Promise<import("./extension-command").ExtRecord<
|
|
17
|
+
}): Promise<import("./extension-command").ExtRecord<"plugin">>;
|
|
20
18
|
update({ plugin, unsafe }: {
|
|
21
19
|
plugin: any;
|
|
22
20
|
unsafe: any;
|
|
@@ -29,11 +27,7 @@ export default class PluginCommand extends ExtensionCommand<any> {
|
|
|
29
27
|
extName: any;
|
|
30
28
|
extData: any;
|
|
31
29
|
}): string;
|
|
32
|
-
validateExtensionFields(appiumPkgData: any): void;
|
|
33
30
|
}
|
|
34
|
-
export type
|
|
35
|
-
config: import('../extension/extension-config').ExtensionConfig<import('../extension/manifest').PluginType>;
|
|
36
|
-
json: boolean;
|
|
37
|
-
};
|
|
31
|
+
export type PluginType = import('appium/types').PluginType;
|
|
38
32
|
import ExtensionCommand from "./extension-command";
|
|
39
33
|
//# sourceMappingURL=plugin-command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-command.d.ts","sourceRoot":"","sources":["../../../lib/cli/plugin-command.js"],"names":[],"mappings":"AAMA;
|
|
1
|
+
{"version":3,"file":"plugin-command.d.ts","sourceRoot":"","sources":["../../../lib/cli/plugin-command.js"],"names":[],"mappings":"AAMA;;GAEG;AACH;IACE;;;OAGG;IACH,8BAFW,OAAO,qBAAqB,EAAE,uBAAuB,CAAC,UAAU,CAAC,EAK3E;IAED;;;;mEAMC;IAED;;mEAEC;IAED;;;qEAEC;IAED;;;yDAEC;IAED;;;eAEC;CAyBF;yBAGY,OAAO,cAAc,EAAE,UAAU"}
|
|
@@ -35,7 +35,7 @@ class PluginCommand extends _extensionCommand.default {
|
|
|
35
35
|
packageName
|
|
36
36
|
}) {
|
|
37
37
|
return await super._install({
|
|
38
|
-
|
|
38
|
+
installSpec: plugin,
|
|
39
39
|
installType,
|
|
40
40
|
packageName
|
|
41
41
|
});
|
|
@@ -45,7 +45,7 @@ class PluginCommand extends _extensionCommand.default {
|
|
|
45
45
|
plugin
|
|
46
46
|
}) {
|
|
47
47
|
return await super._uninstall({
|
|
48
|
-
|
|
48
|
+
installSpec: plugin
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -54,7 +54,7 @@ class PluginCommand extends _extensionCommand.default {
|
|
|
54
54
|
unsafe
|
|
55
55
|
}) {
|
|
56
56
|
return await super._update({
|
|
57
|
-
|
|
57
|
+
installSpec: plugin,
|
|
58
58
|
unsafe
|
|
59
59
|
});
|
|
60
60
|
}
|
|
@@ -64,7 +64,7 @@ class PluginCommand extends _extensionCommand.default {
|
|
|
64
64
|
scriptName
|
|
65
65
|
}) {
|
|
66
66
|
return await super._run({
|
|
67
|
-
|
|
67
|
+
installSpec: plugin,
|
|
68
68
|
scriptName
|
|
69
69
|
});
|
|
70
70
|
}
|
|
@@ -76,15 +76,15 @@ class PluginCommand extends _extensionCommand.default {
|
|
|
76
76
|
return `Plugin ${extName}@${extData.version} successfully installed`.green;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
validateExtensionFields(
|
|
80
|
-
const missingFields = REQ_PLUGIN_FIELDS.reduce((acc, field) =>
|
|
79
|
+
validateExtensionFields(pluginMetadata, installSpec) {
|
|
80
|
+
const missingFields = REQ_PLUGIN_FIELDS.reduce((acc, field) => pluginMetadata[field] ? acc : [...acc, field], []);
|
|
81
81
|
|
|
82
82
|
if (!_lodash.default.isEmpty(missingFields)) {
|
|
83
|
-
throw new Error(`Installed plugin did not expose correct fields for compability ` + `with Appium. Missing fields: ${JSON.stringify(missingFields)}`);
|
|
83
|
+
throw new Error(`Installed plugin "${installSpec}" did not expose correct fields for compability ` + `with Appium. Missing fields: ${JSON.stringify(missingFields)}`);
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
exports.default = PluginCommand;
|
|
90
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
90
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSRVFfUExVR0lOX0ZJRUxEUyIsIlBsdWdpbkNvbW1hbmQiLCJFeHRlbnNpb25Db21tYW5kIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJqc29uIiwia25vd25FeHRlbnNpb25zIiwiS05PV05fUExVR0lOUyIsImluc3RhbGwiLCJwbHVnaW4iLCJpbnN0YWxsVHlwZSIsInBhY2thZ2VOYW1lIiwiX2luc3RhbGwiLCJpbnN0YWxsU3BlYyIsInVuaW5zdGFsbCIsIl91bmluc3RhbGwiLCJ1cGRhdGUiLCJ1bnNhZmUiLCJfdXBkYXRlIiwicnVuIiwic2NyaXB0TmFtZSIsIl9ydW4iLCJnZXRQb3N0SW5zdGFsbFRleHQiLCJleHROYW1lIiwiZXh0RGF0YSIsInZlcnNpb24iLCJncmVlbiIsInZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzIiwicGx1Z2luTWV0YWRhdGEiLCJtaXNzaW5nRmllbGRzIiwicmVkdWNlIiwiYWNjIiwiZmllbGQiLCJfIiwiaXNFbXB0eSIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvcGx1Z2luLWNvbW1hbmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBFeHRlbnNpb25Db21tYW5kIGZyb20gJy4vZXh0ZW5zaW9uLWNvbW1hbmQnO1xuaW1wb3J0IHtLTk9XTl9QTFVHSU5TfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5jb25zdCBSRVFfUExVR0lOX0ZJRUxEUyA9IFsncGx1Z2luTmFtZScsICdtYWluQ2xhc3MnXTtcblxuLyoqXG4gKiBAZXh0ZW5kcyB7RXh0ZW5zaW9uQ29tbWFuZDxQbHVnaW5UeXBlPn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luQ29tbWFuZCBleHRlbmRzIEV4dGVuc2lvbkNvbW1hbmQge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4vZXh0ZW5zaW9uLWNvbW1hbmQnKS5FeHRlbnNpb25Db21tYW5kT3B0aW9uczxQbHVnaW5UeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3IgKHtjb25maWcsIGpzb259KSB7XG4gICAgc3VwZXIoe2NvbmZpZywganNvbn0pO1xuICAgIHRoaXMua25vd25FeHRlbnNpb25zID0gS05PV05fUExVR0lOUztcbiAgfVxuXG4gIGFzeW5jIGluc3RhbGwgKHtwbHVnaW4sIGluc3RhbGxUeXBlLCBwYWNrYWdlTmFtZX0pIHtcbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuX2luc3RhbGwoe1xuICAgICAgaW5zdGFsbFNwZWM6IHBsdWdpbixcbiAgICAgIGluc3RhbGxUeXBlLFxuICAgICAgcGFja2FnZU5hbWUsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1bmluc3RhbGwgKHtwbHVnaW59KSB7XG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLl91bmluc3RhbGwoe2luc3RhbGxTcGVjOiBwbHVnaW59KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZSAoe3BsdWdpbiwgdW5zYWZlfSkge1xuICAgIHJldHVybiBhd2FpdCBzdXBlci5fdXBkYXRlKHtpbnN0YWxsU3BlYzogcGx1Z2luLCB1bnNhZmV9KTtcbiAgfVxuXG4gIGFzeW5jIHJ1biAoe3BsdWdpbiwgc2NyaXB0TmFtZX0pIHtcbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuX3J1bih7aW5zdGFsbFNwZWM6IHBsdWdpbiwgc2NyaXB0TmFtZX0pO1xuICB9XG5cbiAgZ2V0UG9zdEluc3RhbGxUZXh0ICh7ZXh0TmFtZSwgZXh0RGF0YX0pIHtcbiAgICByZXR1cm4gYFBsdWdpbiAke2V4dE5hbWV9QCR7ZXh0RGF0YS52ZXJzaW9ufSBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkYC5ncmVlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgZmllbGRzIGluIGBhcHBpdW1gIGZpZWxkIG9mIGBkcml2ZXJNZXRhZGF0YWBcbiAgICpcbiAgICogRm9yIGFueSBgcGFja2FnZS5qc29uYCBmaWVsZHMgd2hpY2ggYSBkcml2ZXIgcmVxdWlyZXMsIHZhbGlkYXRlIHRoZSB0eXBlIG9mXG4gICAqIHRob3NlIGZpZWxkcyBvbiB0aGUgYHBhY2thZ2UuanNvbmAgZGF0YSwgdGhyb3dpbmcgYW4gZXJyb3IgaWYgYW55dGhpbmcgaXNcbiAgICogYW1pc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRNZXRhZGF0YTxQbHVnaW5UeXBlPn0gcGx1Z2luTWV0YWRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbGxTcGVjXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgdmFsaWRhdGVFeHRlbnNpb25GaWVsZHMgKHBsdWdpbk1ldGFkYXRhLCBpbnN0YWxsU3BlYykge1xuICAgIGNvbnN0IG1pc3NpbmdGaWVsZHMgPSBSRVFfUExVR0lOX0ZJRUxEUy5yZWR1Y2UoXG4gICAgICAoYWNjLCBmaWVsZCkgPT4gKHBsdWdpbk1ldGFkYXRhW2ZpZWxkXSA/IGFjYyA6IFsuLi5hY2MsIGZpZWxkXSksXG4gICAgICBbXVxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eShtaXNzaW5nRmllbGRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW5zdGFsbGVkIHBsdWdpbiBcIiR7aW5zdGFsbFNwZWN9XCIgZGlkIG5vdCBleHBvc2UgY29ycmVjdCBmaWVsZHMgZm9yIGNvbXBhYmlsaXR5IGAgK1xuICAgICAgICAgIGB3aXRoIEFwcGl1bS4gTWlzc2luZyBmaWVsZHM6ICR7SlNPTi5zdHJpbmdpZnkobWlzc2luZ0ZpZWxkcyl9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5QbHVnaW5UeXBlfSBQbHVnaW5UeXBlXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxpQkFBaUIsR0FBRyxDQUFDLFlBQUQsRUFBZSxXQUFmLENBQTFCOztBQUtlLE1BQU1DLGFBQU4sU0FBNEJDLHlCQUE1QixDQUE2QztFQUsxREMsV0FBVyxDQUFFO0lBQUNDLE1BQUQ7SUFBU0M7RUFBVCxDQUFGLEVBQWtCO0lBQzNCLE1BQU07TUFBQ0QsTUFBRDtNQUFTQztJQUFULENBQU47SUFDQSxLQUFLQyxlQUFMLEdBQXVCQyx3QkFBdkI7RUFDRDs7RUFFWSxNQUFQQyxPQUFPLENBQUU7SUFBQ0MsTUFBRDtJQUFTQyxXQUFUO0lBQXNCQztFQUF0QixDQUFGLEVBQXNDO0lBQ2pELE9BQU8sTUFBTSxNQUFNQyxRQUFOLENBQWU7TUFDMUJDLFdBQVcsRUFBRUosTUFEYTtNQUUxQkMsV0FGMEI7TUFHMUJDO0lBSDBCLENBQWYsQ0FBYjtFQUtEOztFQUVjLE1BQVRHLFNBQVMsQ0FBRTtJQUFDTDtFQUFELENBQUYsRUFBWTtJQUN6QixPQUFPLE1BQU0sTUFBTU0sVUFBTixDQUFpQjtNQUFDRixXQUFXLEVBQUVKO0lBQWQsQ0FBakIsQ0FBYjtFQUNEOztFQUVXLE1BQU5PLE1BQU0sQ0FBRTtJQUFDUCxNQUFEO0lBQVNRO0VBQVQsQ0FBRixFQUFvQjtJQUM5QixPQUFPLE1BQU0sTUFBTUMsT0FBTixDQUFjO01BQUNMLFdBQVcsRUFBRUosTUFBZDtNQUFzQlE7SUFBdEIsQ0FBZCxDQUFiO0VBQ0Q7O0VBRVEsTUFBSEUsR0FBRyxDQUFFO0lBQUNWLE1BQUQ7SUFBU1c7RUFBVCxDQUFGLEVBQXdCO0lBQy9CLE9BQU8sTUFBTSxNQUFNQyxJQUFOLENBQVc7TUFBQ1IsV0FBVyxFQUFFSixNQUFkO01BQXNCVztJQUF0QixDQUFYLENBQWI7RUFDRDs7RUFFREUsa0JBQWtCLENBQUU7SUFBQ0MsT0FBRDtJQUFVQztFQUFWLENBQUYsRUFBc0I7SUFDdEMsT0FBUSxVQUFTRCxPQUFRLElBQUdDLE9BQU8sQ0FBQ0MsT0FBUSx5QkFBckMsQ0FBOERDLEtBQXJFO0VBQ0Q7O0VBWURDLHVCQUF1QixDQUFFQyxjQUFGLEVBQWtCZixXQUFsQixFQUErQjtJQUNwRCxNQUFNZ0IsYUFBYSxHQUFHN0IsaUJBQWlCLENBQUM4QixNQUFsQixDQUNwQixDQUFDQyxHQUFELEVBQU1DLEtBQU4sS0FBaUJKLGNBQWMsQ0FBQ0ksS0FBRCxDQUFkLEdBQXdCRCxHQUF4QixHQUE4QixDQUFDLEdBQUdBLEdBQUosRUFBU0MsS0FBVCxDQUQzQixFQUVwQixFQUZvQixDQUF0Qjs7SUFLQSxJQUFJLENBQUNDLGdCQUFFQyxPQUFGLENBQVVMLGFBQVYsQ0FBTCxFQUErQjtNQUM3QixNQUFNLElBQUlNLEtBQUosQ0FDSCxxQkFBb0J0QixXQUFZLGtEQUFqQyxHQUNHLGdDQUErQnVCLElBQUksQ0FBQ0MsU0FBTCxDQUFlUixhQUFmLENBQThCLEVBRjVELENBQU47SUFJRDtFQUNGOztBQXhEeUQifQ==
|