discord-player 6.6.6 → 6.6.7-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +26 -1
- package/dist/index.js +63 -12
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -513,7 +513,7 @@ var _Track = class _Track {
|
|
|
513
513
|
extractor: this.extractor?.identifier ?? null,
|
|
514
514
|
metadata: this.metadata,
|
|
515
515
|
$type: "track" /* Track */,
|
|
516
|
-
$encoder_version: "6.6.
|
|
516
|
+
$encoder_version: "6.6.7-dev.0"
|
|
517
517
|
};
|
|
518
518
|
}
|
|
519
519
|
/**
|
|
@@ -636,7 +636,7 @@ var _Playlist = class _Playlist {
|
|
|
636
636
|
id: this.id,
|
|
637
637
|
url: this.url,
|
|
638
638
|
$type: "playlist" /* Playlist */,
|
|
639
|
-
$encoder_version: "6.6.
|
|
639
|
+
$encoder_version: "6.6.7-dev.0"
|
|
640
640
|
};
|
|
641
641
|
}
|
|
642
642
|
/**
|
|
@@ -1131,6 +1131,10 @@ var _BaseExtractor = class _BaseExtractor {
|
|
|
1131
1131
|
* Priority of this extractor. Higher value means higher priority (will be executed first).
|
|
1132
1132
|
*/
|
|
1133
1133
|
this.priority = 1;
|
|
1134
|
+
/**
|
|
1135
|
+
* A list of query protocols that this extractor supports.
|
|
1136
|
+
*/
|
|
1137
|
+
this.protocols = [];
|
|
1134
1138
|
/**
|
|
1135
1139
|
* Handle bridge query creation
|
|
1136
1140
|
* @param track The track to build query for
|
|
@@ -1259,6 +1263,9 @@ var _ExtractorExecutionContext = class _ExtractorExecutionContext extends Player
|
|
|
1259
1263
|
constructor(player) {
|
|
1260
1264
|
super(["error"]);
|
|
1261
1265
|
this.player = player;
|
|
1266
|
+
/**
|
|
1267
|
+
* The extractors store
|
|
1268
|
+
*/
|
|
1262
1269
|
this.store = new import_utils2.Collection();
|
|
1263
1270
|
}
|
|
1264
1271
|
/**
|
|
@@ -1405,6 +1412,30 @@ var _ExtractorExecutionContext = class _ExtractorExecutionContext extends Player
|
|
|
1405
1412
|
result: false
|
|
1406
1413
|
};
|
|
1407
1414
|
}
|
|
1415
|
+
/**
|
|
1416
|
+
* Check if extractor is disabled
|
|
1417
|
+
*/
|
|
1418
|
+
isDisabled(identifier) {
|
|
1419
|
+
return this.player.options.blockExtractors?.includes(identifier) ?? false;
|
|
1420
|
+
}
|
|
1421
|
+
/**
|
|
1422
|
+
* Check if extractor is enabled
|
|
1423
|
+
*/
|
|
1424
|
+
isEnabled(identifier) {
|
|
1425
|
+
return !this.isDisabled(identifier);
|
|
1426
|
+
}
|
|
1427
|
+
/**
|
|
1428
|
+
* Resolve extractor identifier
|
|
1429
|
+
*/
|
|
1430
|
+
resolveId(resolvable) {
|
|
1431
|
+
return typeof resolvable === "string" ? resolvable : resolvable.identifier;
|
|
1432
|
+
}
|
|
1433
|
+
/**
|
|
1434
|
+
* Resolve extractor
|
|
1435
|
+
*/
|
|
1436
|
+
resolve(resolvable) {
|
|
1437
|
+
return typeof resolvable === "string" ? this.get(resolvable) : resolvable;
|
|
1438
|
+
}
|
|
1408
1439
|
};
|
|
1409
1440
|
__name(_ExtractorExecutionContext, "ExtractorExecutionContext");
|
|
1410
1441
|
var ExtractorExecutionContext = _ExtractorExecutionContext;
|
|
@@ -3281,7 +3312,7 @@ var _GuildQueueStatistics = class _GuildQueueStatistics {
|
|
|
3281
3312
|
memoryUsage: process.memoryUsage(),
|
|
3282
3313
|
versions: {
|
|
3283
3314
|
node: process.version,
|
|
3284
|
-
player: "6.6.
|
|
3315
|
+
player: "6.6.7-dev.0"
|
|
3285
3316
|
}
|
|
3286
3317
|
};
|
|
3287
3318
|
}
|
|
@@ -4002,13 +4033,13 @@ performFinish_fn = /* @__PURE__ */ __name(function(resource) {
|
|
|
4002
4033
|
if (this.repeatMode === 1 /* TRACK */) {
|
|
4003
4034
|
if (this.hasDebugger)
|
|
4004
4035
|
this.debug("Repeat mode is set to track, repeating last track from the history...");
|
|
4005
|
-
this.__current =
|
|
4036
|
+
this.__current = this.history.tracks.dispatch() || track;
|
|
4006
4037
|
return this.node.play(this.__current, { queue: false });
|
|
4007
4038
|
}
|
|
4008
4039
|
if (this.repeatMode === 2 /* QUEUE */) {
|
|
4009
4040
|
if (this.hasDebugger)
|
|
4010
4041
|
this.debug("Repeat mode is set to queue, moving last track from the history to current queue...");
|
|
4011
|
-
this.tracks.add(
|
|
4042
|
+
this.tracks.add(this.history.tracks.dispatch() || track);
|
|
4012
4043
|
}
|
|
4013
4044
|
if (!this.tracks.size) {
|
|
4014
4045
|
if (this.repeatMode === 3 /* AUTOPLAY */) {
|
|
@@ -4968,16 +4999,34 @@ var _Player = class _Player extends PlayerEventsEmitter {
|
|
|
4968
4999
|
}
|
|
4969
5000
|
if (this.hasDebugger)
|
|
4970
5001
|
this.debug(`Searching ${searchQuery}`);
|
|
4971
|
-
let extractor = null;
|
|
5002
|
+
let extractor = null, protocol = null;
|
|
4972
5003
|
options.searchEngine ?? (options.searchEngine = QueryType.AUTO);
|
|
4973
5004
|
options.fallbackSearchEngine ?? (options.fallbackSearchEngine = QueryType.AUTO_SEARCH);
|
|
4974
5005
|
if (this.hasDebugger)
|
|
4975
5006
|
this.debug(`Search engine set to ${options.searchEngine}, fallback search engine set to ${options.fallbackSearchEngine}`);
|
|
5007
|
+
if (/^\w+:/.test(searchQuery)) {
|
|
5008
|
+
const [protocolName, ...query2] = searchQuery.split(":");
|
|
5009
|
+
if (this.hasDebugger)
|
|
5010
|
+
this.debug(`Protocol ${protocolName} detected in query`);
|
|
5011
|
+
const matchingExtractor = this.extractors.store.find((e) => !this.extractors.isDisabled(e.identifier) && e.protocols.includes(protocolName));
|
|
5012
|
+
if (matchingExtractor) {
|
|
5013
|
+
if (this.hasDebugger)
|
|
5014
|
+
this.debug(`Protocol ${protocolName} is supported by ${matchingExtractor.identifier} extractor!`);
|
|
5015
|
+
extractor = matchingExtractor;
|
|
5016
|
+
searchQuery = query2.join(":");
|
|
5017
|
+
protocol = protocolName;
|
|
5018
|
+
} else {
|
|
5019
|
+
if (this.hasDebugger)
|
|
5020
|
+
this.debug(`Could not find an extractor that supports ${protocolName} protocol. Falling back to default behavior...`);
|
|
5021
|
+
}
|
|
5022
|
+
}
|
|
4976
5023
|
const redirected = await QueryResolver.preResolve(searchQuery);
|
|
4977
5024
|
const { type: queryType, query } = options.searchEngine === QueryType.AUTO ? QueryResolver.resolve(redirected, options.fallbackSearchEngine) : { type: options.searchEngine, query: redirected };
|
|
4978
5025
|
if (this.hasDebugger)
|
|
4979
|
-
this.debug(`Query type identified as ${queryType}`);
|
|
5026
|
+
this.debug(`Query type identified as ${queryType}${extractor && protocol ? " but might not be used due to the presence of protocol" : ""}`);
|
|
4980
5027
|
if (options.searchEngine.startsWith("ext:")) {
|
|
5028
|
+
if (this.hasDebugger)
|
|
5029
|
+
this.debug(`Forcing ${options.searchEngine.substring(4)} extractor...`);
|
|
4981
5030
|
extractor = this.extractors.get(options.searchEngine.substring(4));
|
|
4982
5031
|
if (!extractor)
|
|
4983
5032
|
return new SearchResult(this, {
|
|
@@ -5026,7 +5075,8 @@ var _Player = class _Player extends PlayerEventsEmitter {
|
|
|
5026
5075
|
const res = await extractor.handle(query, {
|
|
5027
5076
|
type: queryType,
|
|
5028
5077
|
requestedBy: options.requestedBy,
|
|
5029
|
-
requestOptions: options.requestOptions
|
|
5078
|
+
requestOptions: options.requestOptions,
|
|
5079
|
+
protocol
|
|
5030
5080
|
}).catch(() => null);
|
|
5031
5081
|
if (res) {
|
|
5032
5082
|
if (this.hasDebugger)
|
|
@@ -5052,7 +5102,8 @@ var _Player = class _Player extends PlayerEventsEmitter {
|
|
|
5052
5102
|
async (ext) => !options.blockExtractors?.includes(ext.identifier) && await ext.validate(query) && ext.handle(query, {
|
|
5053
5103
|
type: queryType,
|
|
5054
5104
|
requestedBy: options.requestedBy,
|
|
5055
|
-
requestOptions: options.requestOptions
|
|
5105
|
+
requestOptions: options.requestOptions,
|
|
5106
|
+
protocol
|
|
5056
5107
|
})
|
|
5057
5108
|
);
|
|
5058
5109
|
if (!result?.result) {
|
|
@@ -5136,7 +5187,7 @@ _lagMonitorTimeout = new WeakMap();
|
|
|
5136
5187
|
_lagMonitorInterval = new WeakMap();
|
|
5137
5188
|
_onVoiceStateUpdate = new WeakMap();
|
|
5138
5189
|
__name(_Player, "Player");
|
|
5139
|
-
_Player.version = "6.6.
|
|
5190
|
+
_Player.version = "6.6.7-dev.0";
|
|
5140
5191
|
_Player._singletonKey = kSingleton;
|
|
5141
5192
|
var Player = _Player;
|
|
5142
5193
|
|
|
@@ -5285,7 +5336,7 @@ __name(useVolume, "useVolume");
|
|
|
5285
5336
|
// src/index.ts
|
|
5286
5337
|
var import_equalizer3 = require("@discord-player/equalizer");
|
|
5287
5338
|
var import_discord_voip7 = require("discord-voip");
|
|
5288
|
-
var version = "6.6.
|
|
5339
|
+
var version = "6.6.7-dev.0";
|
|
5289
5340
|
if (!import_discord6.version.startsWith("14")) {
|
|
5290
5341
|
process.emitWarning(`Discord.js v${import_discord6.version} is incompatible with Discord Player v${version}! Please use >=v14.x of Discord.js`);
|
|
5291
5342
|
}
|
|
@@ -5360,4 +5411,4 @@ if (!import_discord6.version.startsWith("14")) {
|
|
|
5360
5411
|
version,
|
|
5361
5412
|
...require("@discord-player/ffmpeg")
|
|
5362
5413
|
});
|
|
5363
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy91dGlscy9VdGlsLnRzIiwgIi4uL3NyYy9mYWJyaWMvVHJhY2sudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL3NlcmRlLnRzIiwgIi4uL3NyYy9mYWJyaWMvUGxheWxpc3QudHMiLCAiLi4vc3JjL3R5cGVzL3R5cGVzLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkTm9kZU1hbmFnZXIudHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGRRdWV1ZS50cyIsICIuLi9zcmMvVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlci50cyIsICIuLi9zcmMvbWFuYWdlci9Wb2ljZVJlY2VpdmVyTm9kZS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlUGxheWVyTm9kZS50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlSZXNvbHZlci50cyIsICIuLi9zcmMvdXRpbHMvQXN5bmNRdWV1ZS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9GRm1wZWdTdHJlYW0udHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9fY29udGFpbmVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vYWRkUGxheWVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vY2xlYXJQbGF5ZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9nZXRQbGF5ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0R2xvYmFsUmVnaXN0cnkudHMiLCAiLi4vc3JjL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5Q2FjaGUudHMiLCAiLi4vc3JjL1BsYXllci50cyIsICIuLi9zcmMvRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyLnRzIiwgIi4uL3NyYy91dGlscy9JUFJvdGF0b3IudHMiLCAiLi4vc3JjL2hvb2tzL2NvbW1vbi50cyIsICIuLi9zcmMvaG9va3MvdXNlSGlzdG9yeS50cyIsICIuLi9zcmMvaG9va3MvdXNlUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VRdWV1ZS50cyIsICIuLi9zcmMvaG9va3MvdXNlTWFpblBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlTWV0YWRhdGEudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVRpbWVsaW5lLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25BZnRlckNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQmVmb3JlQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy91c2VWb2x1bWUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5leHBvcnQgKiBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vaG9va3MnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9JUFJvdGF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zZXJkZSc7XG5leHBvcnQge1xuICAgIEF1ZGlvRmlsdGVycyBhcyBQQ01BdWRpb0ZpbHRlcnMsXG4gICAgdHlwZSBCaXF1YWRGaWx0ZXJzLFxuICAgIEZpbHRlclR5cGUgYXMgQmlxdWFkRmlsdGVyVHlwZSxcbiAgICB0eXBlIFBDTUZpbHRlcnMsXG4gICAgUV9CVVRURVJXT1JUSCxcbiAgICBWb2x1bWVUcmFuc2Zvcm1lcixcbiAgICBCQVNTX0VRX0JBTkRTLFxuICAgIEFGX05JR0hUQ09SRV9SQVRFLFxuICAgIEFGX1ZBUE9SV0FWRV9SQVRFLFxuICAgIEZpbHRlcnNDaGFpblxufSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmV4cG9ydCB7IGNyZWF0ZUF1ZGlvUGxheWVyLCBBdWRpb1BsYXllciwgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbmV4cG9ydCBjb25zdCB2ZXJzaW9uOiBzdHJpbmcgPSAnNi42LjYnO1xuXG5pZiAoIWRqc1ZlcnNpb24uc3RhcnRzV2l0aCgnMTQnKSkge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoYERpc2NvcmQuanMgdiR7ZGpzVmVyc2lvbn0gaXMgaW5jb21wYXRpYmxlIHdpdGggRGlzY29yZCBQbGF5ZXIgdiR7dmVyc2lvbn0hIFBsZWFzZSB1c2UgPj12MTQueCBvZiBEaXNjb3JkLmpzYCk7XG59XG4iLCAiaW1wb3J0IHsgRGVmYXVsdExpc3RlbmVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IExpc3RlbmVyU2lnbmF0dXJlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIFBsYXllckV2ZW50c0VtaXR0ZXI8TCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzIEV2ZW50RW1pdHRlcjxMPiB7XG4gICAgI2hhc0RlYnVnZ2VyID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgICAgICByZXR1cm4gc3VwZXIub2ZmKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgICAgIHJldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVyczxLIGV4dGVuZHMga2V5b2YgTD4obmFtZT86IEspIHtcbiAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUFsbExpc3RlbmVycyhuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgLi4uYXJnczogUGFyYW1ldGVyczxMW0tdPikge1xuICAgICAgICBpZiAodGhpcy5yZXF1aXJlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSAmJiAhdGhpcy5ldmVudE5hbWVzKCkuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICAgICAgIGBObyBldmVudCBsaXN0ZW5lciBmb3VuZCBmb3IgZXZlbnQgXCIke1N0cmluZyhuYW1lKX1cIi4gRXZlbnRzICR7dGhpcy5yZXF1aXJlZEV2ZW50cy5tYXAoKG0pID0+IGBcIiR7U3RyaW5nKG0pfVwiYCkuam9pbignLCAnKX0gbXVzdCBoYXZlIGV2ZW50IGxpc3RlbmVycy5gLFxuICAgICAgICAgICAgICAgICdVbmhhbmRsZWRFdmVudHNXYXJuaW5nJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5lbWl0KG5hbWUsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNoYXNEZWJ1Z2dlcjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFRpbWVEYXRhIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdjcnlwdG8nO1xuXG5jbGFzcyBVdGlsIHtcbiAgICAvKipcbiAgICAgKiBVdGlsc1xuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZHVyT2JqIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkdXJhdGlvblN0cmluZyhkdXJPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gKGlzTmFOKG0pID8gMCA6IG0pKVxuICAgICAgICAgICAgLmpvaW4oJzonKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIFRoZSB0aW1lIGluIG1zXG4gICAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZU1TKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgICAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlzOiByb3VuZChtaWxsaXNlY29uZHMgLyA4NjQwMDAwMCksXG4gICAgICAgICAgICBob3Vyczogcm91bmQobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDYwMDAwKSAlIDYwLFxuICAgICAgICAgICAgc2Vjb25kczogcm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCkgJSA2MFxuICAgICAgICB9IGFzIFRpbWVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLmZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLm1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgICAgICBjb25zdCBmaW5hbCA9IHBhcnNlZFxuICAgICAgICAgICAgLnNsaWNlKHBhcnNlZC5maW5kSW5kZXgoKHgpID0+IHggIT09IDApKVxuICAgICAgICAgICAgLm1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpO1xuXG4gICAgICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgbGFzdDxUID0gYW55PihhcnI6IFRbXSk6IFQge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICAgICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhZmVyIHJlcXVpcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgICAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vP1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgZGV0YWlsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICAgICAgcmV0dXJuIHNyY1tyYW5kb21JbnQoc3JjLmxlbmd0aCldO1xuICAgIH1cblxuICAgIHN0YXRpYyBhcnJheUNsb25lU2h1ZmZsZTxUPihzcmM6IFRbXSk6IFRbXSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHNyYy5zbGljZSgpO1xuXG4gICAgICAgIGxldCBtID0gYXJyLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAobSkge1xuICAgICAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG0tLSk7XG4gICAgICAgICAgICBbYXJyW21dLCBhcnJbaV1dID0gW2FycltpXSwgYXJyW21dXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKHF1ZXVlOiBHdWlsZFF1ZXVlLCBpdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10pID0+IHtcbiAgICBjb25zdCB0cmFja3MgPSBpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gaXRlbXMudHJhY2tzIDogQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtpdGVtc107XG5cbiAgICBpZiAocXVldWUubWF4U2l6ZSA8IDEgfHwgcXVldWUubWF4U2l6ZSA9PT0gSW5maW5pdHkpIHJldHVybjtcblxuICAgIGNvbnN0IG1heENhcCA9IHF1ZXVlLmdldENhcGFjaXR5KCk7XG5cbiAgICBpZiAobWF4Q2FwIDwgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfU1BBQ0UoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzLmxlbmd0aCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgVXRpbCB9O1xuIiwgImltcG9ydCB7IFVzZXIsIGVzY2FwZU1hcmtkb3duLCBTbm93Zmxha2VVdGlsLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIEFQSVVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFJhd1RyYWNrRGF0YSwgU2VhcmNoUXVlcnlUeXBlLCBUcmFja0pTT04gfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXIvR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgV2l0aE1ldGFkYXRhPFQgZXh0ZW5kcyBvYmplY3QsIE0+ID0gVCAmIHtcbiAgICBtZXRhZGF0YTogTTtcbiAgICByZXF1ZXN0TWV0YWRhdGEoKTogUHJvbWlzZTxNPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjayA9IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHZpZXdzOiBudW1iZXI7XG4gICAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gICAgcHVibGljIHF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGw7XG4gICAgcHVibGljIHJhdzogUmF3VHJhY2tEYXRhID0ge1xuICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknXG4gICAgfSBhcyBSYXdUcmFja0RhdGE7XG4gICAgcHVibGljIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX19yZXFNZXRhZGF0YUZuOiAoKSA9PiBQcm9taXNlPFQgfCBudWxsPjtcblxuICAgIC8qKlxuICAgICAqIFRyYWNrIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgVHJhY2tcbiAgICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllciwgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pIHtcbiAgICAgICAgdGhpcy50aXRsZSA9IGVzY2FwZU1hcmtkb3duKGRhdGEudGl0bGUgPz8gJycpO1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yID8/ICcnO1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsID8/ICcnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbiA/PyAnJztcbiAgICAgICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICAgICAgdGhpcy5xdWVyeVR5cGUgPSBkYXRhLnF1ZXJ5VHlwZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ZWRCeSA9IGRhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gICAgICAgIHRoaXMucmF3ID0gT2JqZWN0LmFzc2lnbih7fSwgeyBzb3VyY2U6IGRhdGEucmF3Py5zb3VyY2UgPz8gZGF0YS5zb3VyY2UgfSwgZGF0YS5yYXcgPz8gZGF0YSk7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGEgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPSBkYXRhLnJlcXVlc3RNZXRhZGF0YSB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlPFQgfCBudWxsPihudWxsKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0TWV0YWRhdGEoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICAgICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YSAhPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZSBpbiB3aGljaCB0aGlzIHRyYWNrIGlzIGxvY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT4gcS50cmFja3Muc29tZSgoYWIpID0+IGFiLmlkID09PSB0aGlzLmlkKSkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25NUygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IHRuID0gMTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZHVyYXRpb25cbiAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAubWFwKChtLCBpKSA9PiBwYXJzZUludChtKSAqIHRpbWVzKDYwLCBpKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb3JkIGh5cGVybGluayByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHRvSHlwZXJsaW5rKCk6IHN0cmluZyAvKiBub3QgdXNpbmcgYFske3N0cmluZ31dKCR7c3RyaW5nfSlgIHlldCAqLyB7XG4gICAgICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJhdyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKGhpZGVQbGF5bGlzdD86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgICAgICB9IGFzIFRyYWNrSlNPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVkIHRyYWNrIGRhdGEgdGhhdCBjYW4gYmUgcmVjb25zdHJ1Y3RlZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/IHRoaXMudGh1bWJuYWlsIDogdHJ5SW50b1RodW1ibmFpbFN0cmluZyh0aGlzLnRodW1ibmFpbCksXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHZpZXdzOiB0aGlzLnZpZXdzID8/IDAsXG4gICAgICAgICAgICByZXF1ZXN0ZWRfYnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpID8/IG51bGwsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBxdWVyeV90eXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogdGhpcy5leHRyYWN0b3I/LmlkZW50aWZpZXIgPz8gbnVsbCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlRyYWNrLFxuICAgICAgICAgICAgJGVuY29kZXJfdmVyc2lvbjogJzYuNi42J1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIHRyYWNrIGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAgICogQHBhcmFtIHBsYXllciBQbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21TZXJpYWxpemVkKHBsYXllcjogUGxheWVyLCBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pIHtcbiAgICAgICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlRyYWNrKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdkYXRhJywgJ1NlcmlhbGl6ZWRUcmFjaycsICdtYWxmb3JtZWQgZGF0YScpO1xuICAgICAgICBjb25zdCB0cmFjayA9IG5ldyBUcmFjayhwbGF5ZXIsIHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogZGF0YS5yZXF1ZXN0ZWRfYnlcbiAgICAgICAgICAgICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gZGF0YS5yZXF1ZXN0ZWRfYnkgYXMgQVBJVXNlcjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHBsYXllci5jbGllbnQudXNlcnMucmVzb2x2ZShyZXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpIHJldHVybiBwbGF5ZXIuY2xpZW50LnVzZXJzLmNhY2hlLmdldChyZXMuaWQpITtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pKClcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBxdWVyeVR5cGU6IGRhdGEucXVlcnlfdHlwZSA/PyB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJhY2suc2V0TWV0YWRhdGEoZGF0YS5tZXRhZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiZWxvbmdpbmcgcXVldWVzIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT4gbm9kZS50cmFja3Muc29tZSgodCkgPT4gdC5pZCA9PT0gdGhpcy5pZCkpO1xuXG4gICAgICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyB0cmFjayBzaGFsbCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPik6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBUeXBlVXRpbCB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcmV0dXJuIFR5cGVVdGlsO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgcHVibGljIHN0YXRpYyBpc0Z1bmN0aW9uKHQ6IHVua25vd24pOiB0IGlzIEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1N0cmluZyh0OiB1bmtub3duKTogdCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNCb29sZWFuKHQ6IHVua25vd24pOiB0IGlzIGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdib29sZWFuJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHQgPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQXJyYXkodDogdW5rbm93bik6IHQgaXMgdW5rbm93bltdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0Vycm9yKHQ6IHVua25vd24pOiB0IGlzIEVycm9yIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcjtcbiAgICB9XG59XG4iLCAiY29uc3QgRGlzY29yZFBsYXllckVycm9ycyA9IHtcbiAgICBFUlJfT1VUX09GX1NQQUNFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfT1VUX09GX1NQQUNFJyxcbiAgICAgICAgdHlwZTogUmFuZ2VFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGNhcGFjaXR5OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgICAgICAgdHlwZTogVHlwZUVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgZXhwZWN0YXRpb246IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBFeHBlY3RlZCAke3RhcmdldH0gdG8gYmUgXCIke2V4cGVjdGF0aW9ufVwiLCByZWNlaXZlZCBcIiR7Zm91bmR9XCJgO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fUkVTVUxUOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fUkVTVUxUJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke21lc3NhZ2V9YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PVF9JTVBMRU1FTlRFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT1RfRVhJU1RJTkc6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gJHt0YXJnZXR9IGRvZXMgbm90IGV4aXN0YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX09VVF9PRl9SQU5HRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gICAgICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtaW5pbXVtOiBzdHJpbmcsIG1heGltdW06IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWF4aW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcigpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArICdDYW5ub3QgdXNlIGRlc3Ryb3llZCB2b2ljZSBjb25uZWN0aW9uJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgJ0V4cGVjdGVkIGEgdm9pY2UgY2hhbm5lbCc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19SRUNFSVZFUjoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdObyB2b2ljZSByZWNlaXZlciBpcyBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfRkZNUEVHX0xPQ0FUT1I6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9GRk1QRUdfTE9DQVRPUicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19BVURJT19SRVNPVVJDRToge1xuICAgICAgICBuYW1lOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdFeHBlY3RlZCBhbiBhdWRpbyByZXNvdXJjZScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTERfUVVFVUU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRF9RVUVVRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTEQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCcpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5GT19SRVFVSVJFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX0lORk9fUkVRVUlSRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX1NFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XWAgKyBcIkRvbid0IGtub3cgaG93IHRvIHNlcmlhbGl6ZSB0aGlzIGRhdGFcIjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XWAgKyBcIkRvbid0IGtub3cgaG93IHRvIGRlc2VyaWFsaXplIHRoaXMgZGF0YVwiO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT046IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgYElsbGVnYWwgaW52b2NhdGlvbiBvZiAke3RhcmdldH0gaG9vay4ke21lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJyd9YDtcbiAgICAgICAgfVxuICAgIH1cbn0gYXMgY29uc3Q7XG5cbnR5cGUgRmluYWxFeGNlcHRpb248TyBleHRlbmRzICh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylba2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnNdPiA9IHtcbiAgICBuYW1lOiBPWyduYW1lJ107XG59ICYgSW5zdGFuY2VUeXBlPE9bJ3R5cGUnXT47XG5cbnR5cGUgRGlzY29yZFBsYXllckV4Y2VwdGlvbiA9IHtcbiAgICBbSyBpbiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc106ICguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ2NyZWF0ZUVycm9yJ10+KSA9PiBGaW5hbEV4Y2VwdGlvbjwodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdPjtcbn07XG5cbmNvbnN0IHRhcmdldCA9IHt9IGFzIERpc2NvcmRQbGF5ZXJFeGNlcHRpb247XG5cbmNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjx0eXBlb2YgdGFyZ2V0PiA9IHtcbiAgICBnZXQodGFyZ2V0LCBwOiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycywgcmVjZWl2ZXIpIHtcbiAgICAgICAgY29uc3QgZXJyID0gRGlzY29yZFBsYXllckVycm9yc1twXTtcblxuICAgICAgICBpZiAoIWVycikgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuXG4gICAgICAgIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIGVycilbJ2NyZWF0ZUVycm9yJ10+KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgZXJyLnR5cGUoZXJyLmNyZWF0ZUVycm9yKC4uLmFyZ3MpKTtcbiAgICAgICAgICAgIGV4Y2VwdGlvbi5uYW1lID0gZXJyLm5hbWU7XG5cbiAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEVycm9yQ29kZXMgPSAoKCkgPT4ge1xuICAgIHR5cGUgRXJyQ29kZXMgPSB7XG4gICAgICAgIC1yZWFkb25seSBbSyBpbiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc106ICh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ25hbWUnXTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGljdCA9IHt9IGFzIEVyckNvZGVzO1xuXG4gICAgZm9yIChjb25zdCBwcm9wIGluIERpc2NvcmRQbGF5ZXJFcnJvcnMpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBkaWN0W3Byb3BdID0gcHJvcDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShkaWN0KTtcbn0pKCk7XG5leHBvcnQgY29uc3QgRXhjZXB0aW9ucyA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgdHlwZSBTZXJpYWxpemVkVHJhY2ssIFRyYWNrLCBTZXJpYWxpemVkUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgZW51bSBTZXJpYWxpemVkVHlwZSB7XG4gICAgVHJhY2sgPSAndHJhY2snLFxuICAgIFBsYXlsaXN0ID0gJ3BsYXlsaXN0J1xufVxuXG5leHBvcnQgdHlwZSBFbmNvZGFibGUgPSBTZXJpYWxpemVkVHJhY2sgfCBTZXJpYWxpemVkUGxheWxpc3Q7XG5cbmNvbnN0IGlzVHJhY2sgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkVHJhY2sgPT4gZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+IGRhdGEuJHR5cGUgPT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFRyYWNrIHwgUGxheWxpc3QgfCBhbnkpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFRyYWNrKSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFBsYXlsaXN0KSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSlNPTigpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKHBsYXllcjogUGxheWVyLCBkYXRhOiBFbmNvZGFibGUpIHtcbiAgICBpZiAoaXNUcmFjayhkYXRhKSkgcmV0dXJuIFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG4gICAgaWYgKGlzUGxheWxpc3QoZGF0YSkpIHJldHVybiBQbGF5bGlzdC5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIGRhdGEpO1xuXG4gICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKGRhdGE6IEVuY29kYWJsZSkge1xuICAgIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IHN0ciA9IEJ1ZmZlci5mcm9tKGRhdGEsICdiYXNlNjQnKS50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUludG9UaHVtYm5haWxTdHJpbmcoZGF0YTogYW55KSB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNTdHJpbmcoZGF0YSkpIHJldHVybiBkYXRhO1xuICAgICAgICByZXR1cm4gZGF0YT8udXJsID8/IGRhdGE/LnRodW1ibmFpbD8udXJsID8/IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgUGxheWxpc3RJbml0RGF0YSwgUGxheWxpc3RKU09OLCBUcmFja0pTT04sIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQbGF5bGlzdCA9IFJldHVyblR5cGU8UGxheWxpc3RbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGNsYXNzIFBsYXlsaXN0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG4gICAgcHVibGljIHRyYWNrczogVHJhY2tbXTtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIHB1YmxpYyBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIHB1YmxpYyBhdXRob3I6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG4gICAgLyoqXG4gICAgICogUGxheWxpc3QgY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0ge1BsYXlsaXN0SW5pdERhdGF9IGRhdGEgVGhlIGRhdGFcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXllclxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNwbGF5ZXJcbiAgICAgICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRyYWNrcyBpbiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3RyYWNrc1xuICAgICAgICAgKiBAdHlwZSB7VHJhY2tbXX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJhY2tzID0gZGF0YS50cmFja3MgPz8gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3Igb2YgdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNhdXRob3JcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3I7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNkZXNjcmlwdGlvblxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aHVtYm5haWwgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0aHVtYm5haWxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOlxuICAgICAgICAgKiAtIGBhbGJ1bWBcbiAgICAgICAgICogLSBgcGxheWxpc3RgXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3R5cGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNvdXJjZSBvZiB0aGlzIHBsYXlsaXN0OlxuICAgICAgICAgKiAtIGB5b3V0dWJlYFxuICAgICAgICAgKiAtIGBzb3VuZGNsb3VkYFxuICAgICAgICAgKiAtIGBzcG90aWZ5YFxuICAgICAgICAgKiAtIGBhcmJpdHJhcnlgXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3NvdXJjZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2lkXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5pZDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN1cmxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3Jhd1BsYXlsaXN0XG4gICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICB9XG5cbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnRyYWNrcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5yZWR1Y2UoKHAsIGMpID0+IHAgKyBjLmR1cmF0aW9uTVMsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCBlc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoVHJhY2tzPXRydWVdIElmIGl0IHNob3VsZCBidWlsZCBqc29uIHdpdGggdHJhY2tzXG4gICAgICogQHJldHVybnMge1BsYXlsaXN0SlNPTn1cbiAgICAgKi9cbiAgICB0b0pTT04od2l0aFRyYWNrcyA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB0cmFja3M6IFtdIGFzIFRyYWNrSlNPTltdXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHdpdGhUcmFja3MpIHBheWxvYWQudHJhY2tzID0gdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhY2tzOiB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0uc2VyaWFsaXplKCkpLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID8gdGhpcy50aHVtYm5haWwgOiB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0LFxuICAgICAgICAgICAgJGVuY29kZXJfdmVyc2lvbjogJzYuNi42J1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIHRoaXMgcGxheWxpc3QgZnJvbSBzZXJpYWxpemVkIGRhdGFcbiAgICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFNlcmlhbGl6ZWRQbGF5bGlzdCkge1xuICAgICAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuUGxheWxpc3QpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2RhdGEnLCAnU2VyaWFsaXplZFBsYXlsaXN0JywgJ21hbGZvcm1lZCBkYXRhJyk7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWxpc3QocGxheWVyLCB7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgdHJhY2tzOiBkYXRhLnRyYWNrcy5tYXAoKG0pID0+IFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgbSkpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhpcyBwbGF5bGlzdCB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyBwbGF5bGlzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgcGxheWxpc3Qgc2hhbGwgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVzZXIsIFVzZXJSZXNvbHZhYmxlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHR5cGUgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgdHlwZSB7IGRvd25sb2FkT3B0aW9ucyB9IGZyb20gJ3l0ZGwtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHR5cGUgeyBJUFJvdGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvSVBSb3RhdG9yJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHR5cGUgeyBCcmlkZ2VQcm92aWRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJzTmFtZSA9IGtleW9mIFF1ZXVlRmlsdGVycztcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJTZWFyY2hSZXN1bHQge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICAgIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICAgIGJhc3Nib29zdD86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAgICc4RCc/OiBib29sZWFuO1xuICAgIHZhcG9yd2F2ZT86IGJvb2xlYW47XG4gICAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgICBwaGFzZXI/OiBib29sZWFuO1xuICAgIHRyZW1vbG8/OiBib29sZWFuO1xuICAgIHZpYnJhdG8/OiBib29sZWFuO1xuICAgIHJldmVyc2U/OiBib29sZWFuO1xuICAgIHRyZWJsZT86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICAgIHN1cnJvdW5kaW5nPzogYm9vbGVhbjtcbiAgICBwdWxzYXRvcj86IGJvb2xlYW47XG4gICAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICAgIGthcmFva2U/OiBib29sZWFuO1xuICAgIGZsYW5nZXI/OiBib29sZWFuO1xuICAgIGdhdGU/OiBib29sZWFuO1xuICAgIGhhYXM/OiBib29sZWFuO1xuICAgIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgICBtb25vPzogYm9vbGVhbjtcbiAgICBtc3Rscj86IGJvb2xlYW47XG4gICAgbXN0cnI/OiBib29sZWFuO1xuICAgIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICAgIGV4cGFuZGVyPzogYm9vbGVhbjtcbiAgICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gICAgY2hvcnVzPzogYm9vbGVhbjtcbiAgICBjaG9ydXMyZD86IGJvb2xlYW47XG4gICAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICAgIGZhZGVpbj86IGJvb2xlYW47XG4gICAgZGltPzogYm9vbGVhbjtcbiAgICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgICBsb2ZpPzogYm9vbGVhbjtcbiAgICBzaWxlbmNlcmVtb3ZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPSAnc291bmRjbG91ZCcgfCAneW91dHViZScgfCAnc3BvdGlmeScgfCAnYXBwbGVfbXVzaWMnIHwgJ2FyYml0cmFyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF3VHJhY2tEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uXG4gICAgICovXG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICAgKi9cbiAgICB2aWV3czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0XG4gICAgICovXG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgICAvKipcbiAgICAgKiBUaGUgc291cmNlXG4gICAgICovXG4gICAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZ2luZVxuICAgICAqL1xuICAgIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gICAgICovXG4gICAgbGl2ZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkYXRhXG4gICAgICovXG4gICAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgdHlwZVxuICAgICAqL1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGltZSBpbiBkYXlzXG4gICAgICovXG4gICAgZGF5czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gaG91cnNcbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gbWludXRlc1xuICAgICAqL1xuICAgIG1pbnV0ZXM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIHNlY29uZHNcbiAgICAgKi9cbiAgICBzZWNvbmRzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgcmVuZGVyIHRpbWUgY29kZXNcbiAgICAgKi9cbiAgICB0aW1lY29kZXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICAgKi9cbiAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGJhciBsZW5ndGhcbiAgICAgKi9cbiAgICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWxhcHNlZCB0aW1lIHRyYWNrXG4gICAgICovXG4gICAgcmlnaHRDaGFyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgICAqL1xuICAgIHNlcGFyYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRpbWVzdGFtcCBhbmQgbGluZVxuICAgICAqL1xuICAgIGluZGljYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kaWNhdG9yXG4gICAgICovXG4gICAgcXVldWU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICAgIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICAgIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gICAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gICAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gICAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgICBWSU1FTzogJ3ZpbWVvJyxcbiAgICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICAgIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gICAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICAgIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gICAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICAgIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgICBGSUxFOiAnZmlsZScsXG4gICAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gYW55O1xufVxuXG5leHBvcnQgZW51bSBQbGF5ZXJFdmVudCB7XG4gICAgZGVidWcgPSAnZGVidWcnLFxuICAgIGVycm9yID0gJ2Vycm9yJyxcbiAgICB2b2ljZVN0YXRlVXBkYXRlID0gJ3ZvaWNlU3RhdGVVcGRhdGUnXG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICAgKi9cbiAgICBmaWx0ZXJzVXBkYXRlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBGRm1wZWcgYXJncyBwYXNzZWQgdG8gZW5jb2RlclxuICAgICAqL1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogVGltZSB0byBzZWVrIHRvIGJlZm9yZSBwbGF5aW5nXG4gICAgICovXG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICAgKi9cbiAgICBpbW1lZGlhdGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBRdWVyeUV4dHJhY3RvclNlYXJjaCA9IGBleHQ6JHtzdHJpbmd9YDtcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgc2VhcmNoIGVuZ2luZSwgY2FuIGJlIGV4dHJhY3RvciBuYW1lIHRvIHRhcmdldCBzcGVjaWZpYyBvbmUgKGN1c3RvbSlcbiAgICAgKi9cbiAgICBzZWFyY2hFbmdpbmU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAgICovXG4gICAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAgICAgKi9cbiAgICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogRmFsbGJhY2sgc2VhcmNoIGVuZ2luZSB0byB1c2VcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJlcXVlc3RPcHRpb25zPzogYW55O1xuICAgIC8qKlxuICAgICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAgICovXG4gICAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbi8qKlxuICogVGhlIHF1ZXVlIHJlcGVhdCBtb2RlLiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIE9GRlxuICogLSBUUkFDS1xuICogLSBRVUVVRVxuICogLSBBVVRPUExBWVxuICovXG5leHBvcnQgZW51bSBRdWV1ZVJlcGVhdE1vZGUge1xuICAgIC8qKlxuICAgICAqIERpc2FibGUgcmVwZWF0IG1vZGUuXG4gICAgICovXG4gICAgT0ZGID0gMCxcbiAgICAvKipcbiAgICAgKiBSZXBlYXQgdGhlIGN1cnJlbnQgdHJhY2suXG4gICAgICovXG4gICAgVFJBQ0sgPSAxLFxuICAgIC8qKlxuICAgICAqIFJlcGVhdCB0aGUgZW50aXJlIHF1ZXVlLlxuICAgICAqL1xuICAgIFFVRVVFID0gMixcbiAgICAvKipcbiAgICAgKiBXaGVuIGxhc3QgdHJhY2sgZW5kcywgcGxheSBzaW1pbGFyIHRyYWNrcyBpbiB0aGUgZnV0dXJlIGlmIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEFVVE9QTEFZID0gM1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SW5pdERhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHRyYWNrczogVHJhY2tbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbFxuICAgICAqL1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgICAqL1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBzb3VyY2VcbiAgICAgKi9cbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICAgKi9cbiAgICBhdXRob3I6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgICAgICovXG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBwbGF5bGlzdCBkYXRhXG4gICAgICovXG4gICAgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGlkXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGR1cmF0aW9uXG4gICAgICovXG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbXNcbiAgICAgKi9cbiAgICBkdXJhdGlvbk1TOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIHZpZXdzXG4gICAgICovXG4gICAgdmlld3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBpZCB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICByZXF1ZXN0ZWRCeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gICAgICovXG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RKU09OIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbFxuICAgICAqL1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgICAqL1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBzb3VyY2VcbiAgICAgKi9cbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICAgKi9cbiAgICBhdXRob3I6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgICAgICovXG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrcyBkYXRhIChpZiBhbnkpXG4gICAgICovXG4gICAgdHJhY2tzOiBUcmFja0pTT05bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgcGFzc2VkIHRvIGB5dGRsLWNvcmVgLlxuICAgICAqL1xuICAgIHl0ZGxPcHRpb25zPzogZG93bmxvYWRPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIHRpbWVvdXRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAgICAgKi9cbiAgICBsYWdNb25pdG9yPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICAgKi9cbiAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHF1ZXJ5aW5nIG1ldGFkYXRhIGZyb21cbiAgICAgKi9cbiAgICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICAgICAqL1xuICAgIGJsb2NrU3RyZWFtRnJvbT86IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElnbm9yZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBpZ25vcmVJbnN0YW5jZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVXNlIGxlZ2FjeSB2ZXJzaW9uIG9mIGZmbXBlZ1xuICAgICAqL1xuICAgIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU2V0IGJyaWRnZSBwcm92aWRlclxuICAgICAqL1xuICAgIGJyaWRnZVByb3ZpZGVyPzogQnJpZGdlUHJvdmlkZXI7XG4gICAgLyoqXG4gICAgICogSVAgcm90YXRvciBjb25maWdcbiAgICAgKi9cbiAgICBpcGNvbmZpZz86IElQUm90YXRpb25Db25maWc7XG4gICAgLyoqXG4gICAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAgICovXG4gICAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2JlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA1MDAwLlxuICAgICAqL1xuICAgIHByb2JlVGltZW91dD86IG51bWJlcjtcbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBRdWVyeUV4dHJhY3RvclNlYXJjaCwgUXVlcnlUeXBlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHREYXRhIHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgICBleHRyYWN0b3I/OiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M/OiBUcmFja1tdO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHByaXZhdGUgX2RhdGE6IFNlYXJjaFJlc3VsdERhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFF1ZXJ5VHlwZSh0eXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCkge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZXF1ZXN0ZWRCeSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrcyByZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyYWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RlZCBieVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmUtZXhlY3V0ZSB0aGlzIHNlYXJjaFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgICAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9GaWx0ZXJzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgICAgIGJhc3Nib29zdF9sb3c6IGJhc3MoMTUpLFxuICAgICAgICBiYXNzYm9vc3Q6IGJhc3MoMjApLFxuICAgICAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgICAgICc4RCc6ICdhcHVsc2F0b3I9aHo9MC4wOScsXG4gICAgICAgIHZhcG9yd2F2ZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjgnLFxuICAgICAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgICAgIGxvZmk6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC45LGV4dHJhc3RlcmVvPW09Mi41OmM9ZGlzYWJsZWQnLFxuICAgICAgICBwaGFzZXI6ICdhcGhhc2VyPWluX2dhaW49MC40JyxcbiAgICAgICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgICAgICB2aWJyYXRvOiAndmlicmF0bz1mPTYuNScsXG4gICAgICAgIHJldmVyc2U6ICdhcmV2ZXJzZScsXG4gICAgICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgICAgICBub3JtYWxpemVyMjogJ2R5bmF1ZG5vcm09Zz0xMDEnLFxuICAgICAgICBub3JtYWxpemVyOiAnYWNvbXByZXNzb3InLFxuICAgICAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICAgICAgcHVsc2F0b3I6ICdhcHVsc2F0b3I9aHo9MScsXG4gICAgICAgIHN1YmJvb3N0OiAnYXN1YmJvb3N0JyxcbiAgICAgICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgICAgIGZsYW5nZXI6ICdmbGFuZ2VyJyxcbiAgICAgICAgZ2F0ZTogJ2FnYXRlJyxcbiAgICAgICAgaGFhczogJ2hhYXMnLFxuICAgICAgICBtY29tcGFuZDogJ21jb21wYW5kJyxcbiAgICAgICAgbW9ubzogJ3Bhbj1tb25vfGMwPS41KmMwKy41KmMxJyxcbiAgICAgICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICAgICAgbXN0cnI6ICdzdGVyZW90b29scz1tb2RlPW1zPnJyJyxcbiAgICAgICAgY29tcHJlc3NvcjogJ2NvbXBhbmQ9cG9pbnRzPS04MC8tMTA1fC02Mi8tODB8LTE1LjQvLTE1LjR8MC8tMTJ8MjAvLTcuNicsXG4gICAgICAgIGV4cGFuZGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tMTY5fC01NC8tODB8LTQ5LjUvLTY0LjZ8LTQxLjEvLTQxLjF8LTI1LjgvLTE1fC0xMC44Ly00LjV8MC8wfDIwLzguMycsXG4gICAgICAgIHNvZnRsaW1pdGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgICAgICBjaG9ydXM6ICdjaG9ydXM9MC43OjAuOTo1NTowLjQ6MC4yNToyJyxcbiAgICAgICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgICAgICBmYWRlaW46ICdhZmFkZT10PWluOnNzPTA6ZD0xMCcsXG4gICAgICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgICAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnLFxuICAgICAgICBzaWxlbmNlcmVtb3ZlOiAnc2lsZW5jZXJlbW92ZT0xOjA6LTUwZEInXG4gICAgfTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXM8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHsgbmFtZTogRmlsdGVyc05hbWU7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpbHRlcnMpKSB7XG4gICAgICAgICAgICB5aWVsZCB7IG5hbWU6IGsgYXMgRmlsdGVyc05hbWUsIHZhbHVlOiB2IGFzIHN0cmluZyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgbmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpIGFzIEZpbHRlcnNOYW1lW107XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLm1hcCgobSkgPT4gKHRoaXMgYXMgYW55KVttXSkuam9pbignLCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIGFyZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbHRlcnMgbmFtZVxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciBuYW1lXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KGZpbHRlcnM/OiBLW10pIHtcbiAgICAgICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gZmlsdGVyc1xuICAgICAgICAgICAgLmZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IHRoaXMuZ2V0KG0pKVxuICAgICAgICAgICAgLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGF1ZGlvIGZpbHRlclxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmUoZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyc1tmaWx0ZXJOYW1lIGFzIEZpbHRlcnNOYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbXVsdGlwbGUgYXVkaW8gZmlsdGVyc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJzQXJyYXkgQXJyYXkgb2YgZmlsdGVycyBjb250YWluaW5nIHRoZSBmaWx0ZXIgbmFtZSBhbmQgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZUJ1bGsoZmlsdGVyc0FycmF5OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pIHtcbiAgICAgICAgZmlsdGVyc0FycmF5LmZvckVhY2goKGFycikgPT4gdGhpcy5kZWZpbmUoYXJyLm5hbWUsIGFyci52YWx1ZSkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vbWFuYWdlcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclN0cmVhbWFibGUgPVxuICAgIHwgUmVhZGFibGVcbiAgICB8IHN0cmluZ1xuICAgIHwge1xuICAgICAgICAgICRmbXQ6IHN0cmluZztcbiAgICAgICAgICBzdHJlYW06IFJlYWRhYmxlO1xuICAgICAgfTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpZGVudGlmaWVyID0gJ2NvbS5kaXNjb3JkLXBsYXllci5leHRyYWN0b3InO1xuXG4gICAgLyoqXG4gICAgICogUHJpb3JpdHkgb2YgdGhpcyBleHRyYWN0b3IuIEhpZ2hlciB2YWx1ZSBtZWFucyBoaWdoZXIgcHJpb3JpdHkgKHdpbGwgYmUgZXhlY3V0ZWQgZmlyc3QpLlxuICAgICAqL1xuICAgIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYnJpZGdlIHF1ZXJ5IGNyZWF0aW9uXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlQnJpZGdlUXVlcnkgPSAodHJhY2s6IFRyYWNrKSA9PiBgJHt0cmFjay50aXRsZX0gYnkgJHt0cmFjay5hdXRob3J9IG9mZmljaWFsIGF1ZGlvYDtcblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RvciBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgcHVibGljIG9wdGlvbnM6IFQgPSA8VD57fSkge31cblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhpcyBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlkZW50aWZpZXIoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQmFzZUV4dHJhY3RvcikuaWRlbnRpZmllcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNvbmZpZ3VyZXMgdGhpcyBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgbmV3IG9wdGlvbnMgdG8gYXBwbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVjb25maWd1cmUob3B0aW9uczogVCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBhd2FpdCB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKSB7XG4gICAgICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaW5jb21pbmcgcXVlcnlcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHZhbGlkYXRlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHZhbGlkYXRlKHF1ZXJ5OiBzdHJpbmcsIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHZvaWQgdHlwZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0cmVhbSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gaW5mbyBUaGUgdHJhY2sgdG8gc3RyZWFtXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHN0cmVhbShpbmZvOiBUcmFjayk6IFByb21pc2U8RXh0cmFjdG9yU3RyZWFtYWJsZT4ge1xuICAgICAgICB2b2lkIGluZm87XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9JTVBMRU1FTlRFRChgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnN0cmVhbSgpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRoZSBnaXZlbiBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gaGFuZGxlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZShxdWVyeTogc3RyaW5nLCBjb250ZXh0OiBFeHRyYWN0b3JTZWFyY2hDb250ZXh0KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgY29udGV4dDtcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uaGFuZGxlKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcmVsYXRlZCB0cmFja3MgZm9yIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgc291cmNlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGdldFJlbGF0ZWRUcmFja3ModHJhY2s6IFRyYWNrLCBoaXN0b3J5OiBHdWlsZFF1ZXVlSGlzdG9yeSk6IFByb21pc2U8RXh0cmFjdG9ySW5mbz4ge1xuICAgICAgICB2b2lkIHRyYWNrO1xuICAgICAgICB2b2lkIGhpc3Rvcnk7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9JTVBMRU1FTlRFRChgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmdldFJlbGF0ZWRUcmFja3MoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3RyZWFtIG1pZGRsZXdhcmUgdG8gaGFuZGxlIHN0cmVhbXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHBsYXllclxuICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIGluY29taW5nIHN0cmVhbVxuICAgICAqIEBwYXJhbSBuZXh0IFRoZSBuZXh0IGZ1bmN0aW9uXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZVBvc3RTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXh0KG51bGwsIHN0cmVhbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsYXllclxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZGlzcGF0Y2hcbiAgICAgKiBAcGFyYW0gYXJncyBUaGUgZGF0YSB0byBkaXNwYXRjaFxuICAgICAqL1xuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBQbGF5ZXJFdmVudHM+KGV2ZW50OiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPFBsYXllckV2ZW50c1tLXT4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGV4dHJhY3RvciByZXNwb25zZVxuICAgICAqIEBwYXJhbSBwbGF5bGlzdCBUaGUgcGxheWxpc3RcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFjayBhcnJheVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVSZXNwb25zZShwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbCwgdHJhY2tzOiBUcmFja1tdID0gcGxheWxpc3Q/LnRyYWNrcyB8fCBbXSk6IEV4dHJhY3RvckluZm8ge1xuICAgICAgICByZXR1cm4geyBwbGF5bGlzdDogcGxheWxpc3QgfHwgbnVsbCwgdHJhY2tzIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgZGVidWcgbWVzc2FnZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5kZWJ1ZyhtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJUCByb3RhdG9yIGluc3RhbmNlLCBpZiBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvdXRlUGxhbm5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIucm91dGVQbGFubmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBpbmRpY2F0ZSBgRGVtdXhhYmxlYCBzdHJlYW0gc3VwcG9ydCBmb3IgYG9wdXNgL2BvZ2cvb3B1c2AvYHdlYm0vb3B1c2AgZm9ybWF0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN1cHBvcnRzRGVtdXgoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuY29udGV4dC5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTmV4dEZ1bmN0aW9uID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCBzdHJlYW0/OiBSZWFkYWJsZSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JJbmZvIHtcbiAgICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICAgIHRyYWNrczogVHJhY2tbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZWFyY2hDb250ZXh0IHtcbiAgICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbDtcbiAgICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICAgIHJlcXVlc3RPcHRpb25zPzogUmVxdWVzdE9wdGlvbnM7XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBrbm93bkV4dHJhY3RvcktleXMgPSBbXG4gICAgJ1Nwb3RpZnlFeHRyYWN0b3InLFxuICAgICdBcHBsZU11c2ljRXh0cmFjdG9yJyxcbiAgICAnU291bmRDbG91ZEV4dHJhY3RvcicsXG4gICAgJ1lvdVR1YmVFeHRyYWN0b3InLFxuICAgICdWaW1lb0V4dHJhY3RvcicsXG4gICAgJ1JldmVyYm5hdGlvbkV4dHJhY3RvcicsXG4gICAgJ0F0dGFjaG1lbnRFeHRyYWN0b3InXG5dIGFzIGNvbnN0O1xuY29uc3Qga25vd25FeHRyYWN0b3JMaWIgPSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvckxvYWRlck9wdGlvbkRpY3QgPSB7XG4gICAgLy8gQHRzLWlnbm9yZSB0eXBlc1xuICAgIFtLIGluICh0eXBlb2Yga25vd25FeHRyYWN0b3JLZXlzKVtudW1iZXJdXT86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgaW1wb3J0KCdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJylbS10+WzFdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25FdmVudHMge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICByZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyB1bnJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyB1bnJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICB1bnJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIGFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZGVhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgZmFpbHMgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZXJyb3I6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAgIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7XG4gICAgICAgIHN1cGVyKFsnZXJyb3InXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBkZWZhdWx0IGV4dHJhY3RvcnMgZnJvbSBgQGRpc2NvcmQtcGxheWVyL2V4dHJhY3RvcmBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbG9hZERlZmF1bHQoZmlsdGVyPzogKGV4dDogKHR5cGVvZiBrbm93bkV4dHJhY3RvcktleXMpW251bWJlcl0pID0+IGJvb2xlYW4gfCBudWxsLCBvcHRpb25zPzogRXh0cmFjdG9yTG9hZGVyT3B0aW9uRGljdCkge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBVdGlsLmltcG9ydChrbm93bkV4dHJhY3RvckxpYik7XG4gICAgICAgIGlmIChtb2QuZXJyb3IpIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbW9kLmVycm9yIGFzIEVycm9yIH07XG5cbiAgICAgICAgKGZpbHRlciA/IGtub3duRXh0cmFjdG9yS2V5cy5maWx0ZXIoZmlsdGVyKSA6IGtub3duRXh0cmFjdG9yS2V5cykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIW1vZC5tb2R1bGVba2V5XSkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB0eXBlc1xuICAgICAgICAgICAgdGhpcy5yZWdpc3Rlcig8dHlwZW9mIEJhc2VFeHRyYWN0b3I+bW9kLm1vZHVsZVtrZXldLCBvcHRpb25zPy5ba2V5XSB8fCB7fSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yOiBudWxsIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaWYgdGhlIGdpdmVuIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGV4dHJhY3RvciBpZGVudGlmaWVyXG4gICAgICovXG4gICAgcHVibGljIGlzUmVnaXN0ZXJlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuaGFzKGlkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzaXplIG9mIHJlZ2lzdGVyZWQgZXh0cmFjdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2luZ2xlIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgdG8gZ2V0XG4gICAgICovXG4gICAgcHVibGljIGdldChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0KGlkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHJlZ2lzdGVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBzdXBwbGllZCB0byB0aGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyPE8gZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyB0eXBlb2YgQmFzZUV4dHJhY3RvcjxPPj4oX2V4dHJhY3RvcjogVCwgb3B0aW9uczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFQ+WycxJ10pOiBQcm9taXNlPEluc3RhbmNlVHlwZTxUPiB8IG51bGw+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBfZXh0cmFjdG9yLmlkZW50aWZpZXIgIT09ICdzdHJpbmcnIHx8IHRoaXMuc3RvcmUuaGFzKF9leHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgX2V4dHJhY3Rvcih0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLnBsYXllci5vcHRpb25zLmJyaWRnZVByb3ZpZGVyKSBvcHRpb25zLmJyaWRnZVByb3ZpZGVyID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmJyaWRnZVByb3ZpZGVyO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGxvYWRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBhd2FpdCBleHRyYWN0b3IuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgYWN0aXZhdGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdhY3RpdmF0ZScsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdG9yIGFzIHVua25vd24gYXMgSW5zdGFuY2VUeXBlPFQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRlbGV0ZShfZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gYWN0aXZhdGUhIEVycm9yOiAke2V9YCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byB1bnJlZ2lzdGVyXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXI8SyBleHRlbmRzIHN0cmluZyB8IEJhc2VFeHRyYWN0b3I+KF9leHRyYWN0b3I6IEspIHtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yID0gdHlwZW9mIF9leHRyYWN0b3IgPT09ICdzdHJpbmcnID8gdGhpcy5zdG9yZS5nZXQoX2V4dHJhY3RvcikgOiB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgICAgICBpZiAoIWV4dHJhY3RvcikgcmV0dXJuO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBleHRyYWN0b3IuaWRlbnRpZmllciB8fCB0aGlzLnN0b3JlLmZpbmRLZXkoKGUpID0+IGUgPT09IGV4dHJhY3RvcikhO1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkaXNhYmxlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgndW5yZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgICAgIGF3YWl0IGV4dHJhY3Rvci5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGVhY3RpdmF0ZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGRlYWN0aXZhdGUhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXIgYWxsIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlckFsbCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuc3RvcmUubWFwKChlKSA9PiB0aGlzLnVucmVnaXN0ZXIoZSkpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHRoZSBleHRyYWN0b3JzXG4gICAgICogQHBhcmFtIGZuIFRoZSBydW5uZXIgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gZmlsdGVyQmxvY2tlZCBGaWx0ZXIgYmxvY2tlZCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oZm46IEV4dHJhY3RvckV4ZWN1dGlvbkZOPFQ+LCBmaWx0ZXJCbG9ja2VkID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz8gW107XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlLnNpemUpIHtcbiAgICAgICAgICAgIFV0aWwud2FybignU2tpcHBpbmcgZXh0cmFjdG9ycyBleGVjdXRpb24gc2luY2UgemVybyBleHRyYWN0b3JzIHdlcmUgcmVnaXN0ZXJlZCcsICdOb0V4dHJhY3RvcnMnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNvcnQgYnkgcHJpb3JpdHkgc28gdGhhdCBleHRyYWN0b3JzIHdpdGggaGlnaGVyIHByaW9yaXR5IGFyZSBleGVjdXRlZCBmaXJzdFxuICAgICAgICBjb25zdCBleHRyYWN0b3JzID0gdGhpcy5zdG9yZS5zb3J0KChhLCBiKSA9PiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eSk7XG5cbiAgICAgICAgbGV0IGVycjogRXJyb3IgfCBudWxsID0gbnVsbCxcbiAgICAgICAgICAgIGxhc3RFeHQ6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRyYWN0b3JzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyQmxvY2tlZCAmJiBibG9ja2VkLnNvbWUoKGUpID0+IGUgPT09IGV4dC5pZGVudGlmaWVyKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeGVjdXRpbmcgZXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9Li4uYCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihleHQpLnRoZW4oXG4gICAgICAgICAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB3aXRoIGVycm9yOiAke2V9YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVVdGlsLmlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGAke2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGFzdEV4dCA9IGV4dDtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAhVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSFgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogZXh0LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VD47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGVyciA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbGFzdEV4dCEsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGZhbHNlXG4gICAgICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxmYWxzZT47XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICAgIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcjtcbiAgICBlcnJvcjogRXJyb3IgfCBudWxsO1xuICAgIHJlc3VsdDogVDtcbn1cblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yRXhlY3V0aW9uRk48VCA9IHVua25vd24+ID0gKGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gUHJvbWlzZTxUIHwgYm9vbGVhbj47XG4iLCAiaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycywgQmlxdWFkRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciwgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZVJlcGVhdE1vZGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQgPSB1bmtub3duPiB7XG4gICAgc3RyYXRlZ3k/OiBRdWV1ZVN0cmF0ZWd5O1xuICAgIHZvbHVtZT86IG51bWJlcjtcbiAgICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgYV9maWx0ZXI/OiBQQ01GaWx0ZXJzW107XG4gICAgYmlxdWFkPzogQmlxdWFkRmlsdGVycztcbiAgICByZXNhbXBsZXI/OiBudW1iZXI7XG4gICAgZGlzYWJsZUhpc3Rvcnk/OiBib29sZWFuO1xuICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICAgIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bj86IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kPzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A/OiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ/OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0PzogYm9vbGVhbjtcbiAgICBtYXhTaXplPzogbnVtYmVyO1xuICAgIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YT86IGJvb2xlYW47XG4gICAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUZpbHRlcmVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG5leHBvcnQgY2xhc3MgR3VpbGROb2RlTWFuYWdlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSwgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KTogR3VpbGRRdWV1ZTxUPiB7XG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRCgnSW52YWxpZCBvciB1bmtub3duIGd1aWxkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoc2VydmVyLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHNlcnZlci5pZCkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICAgICAgb3B0aW9ucy52b2x1bWUgPz89IDEwMDtcbiAgICAgICAgb3B0aW9ucy5lcXVhbGl6ZXIgPz89IFtdO1xuICAgICAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMucmVzYW1wbGVyID8/PSA0ODAwMDtcbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICAgICAgb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0ID8/PSAxMDAwO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICAvLyB0b2RvKHR3bGl0ZSk6IG1heWJlIGRpc2FibGUgdGhlc2UgYnkgZGVmYXVsdD9cbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuXG4gICAgICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nKSAmJiAhb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgYXMgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICBndWlsZDogc2VydmVyLFxuICAgICAgICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgICAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICAgICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICAgICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgICAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW06IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0sXG4gICAgICAgICAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0sXG4gICAgICAgICAgICByZXBlYXRNb2RlOiBvcHRpb25zLnJlcGVhdE1vZGUsXG4gICAgICAgICAgICBsZWF2ZU9uRW1wdHk6IG9wdGlvbnMubGVhdmVPbkVtcHR5LFxuICAgICAgICAgICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24sXG4gICAgICAgICAgICBsZWF2ZU9uRW5kOiBvcHRpb25zLmxlYXZlT25FbmQsXG4gICAgICAgICAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duLFxuICAgICAgICAgICAgbGVhdmVPblN0b3A6IG9wdGlvbnMubGVhdmVPblN0b3AsXG4gICAgICAgICAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24sXG4gICAgICAgICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICAgICAgICBzZWxmRGVhZjogb3B0aW9ucy5zZWxmRGVhZixcbiAgICAgICAgICAgIGZmbXBlZ0ZpbHRlcnM6IG9wdGlvbnMuZGVmYXVsdEZGbXBlZ0ZpbHRlcnMgPz8gW10sXG4gICAgICAgICAgICBidWZmZXJpbmdUaW1lb3V0OiBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQsXG4gICAgICAgICAgICBub0VtaXRJbnNlcnQ6IG9wdGlvbnMubm9FbWl0SW5zZXJ0ID8/IGZhbHNlLFxuICAgICAgICAgICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSxcbiAgICAgICAgICAgIG1heEhpc3RvcnlTaXplOiBvcHRpb25zLm1heEhpc3RvcnlTaXplLFxuICAgICAgICAgICAgbWF4U2l6ZTogb3B0aW9ucy5tYXhTaXplLFxuICAgICAgICAgICAgcGF1c2VPbkVtcHR5OiBvcHRpb25zLnBhdXNlT25FbXB0eSxcbiAgICAgICAgICAgIGRpc2FibGVCaXF1YWQ6IG9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IG9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICAgIGRpc2FibGVGaWx0ZXJlcjogb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICAgICAgICBkaXNhYmxlVm9sdW1lOiBvcHRpb25zLmRpc2FibGVWb2x1bWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoc2VydmVyLmlkLCBxdWV1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBleGlzdGluZyBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0PFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICAgICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLmNhY2hlLmdldChxdWV1ZS5pZCkgYXMgR3VpbGRRdWV1ZTxUPikgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHF1ZXVlIGV4aXN0c1xuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGlkID0gbm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUgPyBub2RlLmlkIDogdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRF9RVUVVRSgnQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RpbmcgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG4gICAgICAgIHF1ZXVlLm5vZGUuc3RvcCh0cnVlKTtcbiAgICAgICAgcXVldWUuY29ubmVjdGlvbj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHF1ZXVlLmRpc3BhdGNoZXI/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICBxdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHF1ZXVlLnRpbWVvdXRzLmZvckVhY2goKHRtKSA9PiBjbGVhclRpbWVvdXQodG0pKTtcbiAgICAgICAgcXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgICAgICBxdWV1ZS50cmFja3MuY2xlYXIoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5kZWxldGUocXVldWUuaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgcXVldWVcbiAgICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmU8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQodGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhKSBhcyBHdWlsZFF1ZXVlPFQ+IHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgcXVldWUgaWRcbiAgICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmVJZChub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBxID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICByZXR1cm4gcT8uaWQgfHwgbnVsbDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zLCBUcmFja0xpa2UgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIEd1aWxkLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIFZvaWNlQmFzZWRDaGFubmVsLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBRdWV1ZSwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCaXF1YWRGaWx0ZXJzLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IHR5cGUgQXVkaW9QbGF5ZXIsIEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUsIFZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuL0d1aWxkUXVldWVIaXN0b3J5JztcbmltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcbmltcG9ydCB7IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnMgfSBmcm9tICcuL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlUmVwZWF0TW9kZSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlU3RhdGlzdGljcyB9IGZyb20gJy4vR3VpbGRRdWV1ZVN0YXRpc3RpY3MnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVJbml0PE1ldGEgPSB1bmtub3duPiB7XG4gICAgZ3VpbGQ6IEd1aWxkO1xuICAgIHF1ZXVlU3RyYXRlZ3k6IFF1ZXVlU3RyYXRlZ3k7XG4gICAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICAgIHZvbHVtZTogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBiaXF1YWQ6IEJpcXVhZEZpbHRlcnMgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBmaWx0ZXJlcjogUENNRmlsdGVyc1tdIHwgYm9vbGVhbjtcbiAgICBmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdO1xuICAgIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICAgIGxlYXZlT25FbXB0eTogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bjogbnVtYmVyO1xuICAgIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gICAgbGVhdmVPbkVuZENvb2xkb3duOiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A6IGJvb2xlYW47XG4gICAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXI7XG4gICAgc2VsZkRlYWY/OiBib29sZWFuO1xuICAgIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gICAgYnVmZmVyaW5nVGltZW91dDogbnVtYmVyO1xuICAgIG5vRW1pdEluc2VydDogYm9vbGVhbjtcbiAgICBtYXhTaXplPzogbnVtYmVyO1xuICAgIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YTogYm9vbGVhbjtcbiAgICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICAgIGRpc2FibGVWb2x1bWU6IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcjogYm9vbGVhbjtcbiAgICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gICAgZGlzYWJsZUJpcXVhZDogYm9vbGVhbjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlQ29ubmVjdENvbmZpZyB7XG4gICAgZGVhZj86IGJvb2xlYW47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvc3RQcm9jZXNzZWRSZXN1bHQge1xuICAgIHN0cmVhbTogUmVhZGFibGU7XG4gICAgdHlwZTogU3RyZWFtVHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gKHRyYWNrOiBUcmFjaywgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUsIHF1ZXVlOiBHdWlsZFF1ZXVlKSA9PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5leHBvcnQgdHlwZSBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChzdHJlYW06IFJlYWRhYmxlLCBxdWV1ZTogR3VpbGRRdWV1ZSkgPT4gUHJvbWlzZTxQb3N0UHJvY2Vzc2VkUmVzdWx0IHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIFBsYXllclRyaWdnZXJlZFJlYXNvbiA9ICdmaWx0ZXJzJyB8ICdub3JtYWwnO1xuXG5leHBvcnQgY29uc3QgR3VpbGRRdWV1ZUV2ZW50ID0ge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrQWRkOiAnYXVkaW9UcmFja0FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja1JlbW92ZTogJ2F1ZGlvVHJhY2tSZW1vdmUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc1JlbW92ZTogJ2F1ZGlvVHJhY2tzUmVtb3ZlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uRGVzdHJveWVkOiAnY29ubmVjdGlvbkRlc3Ryb3llZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0OiAnZGlzY29ubmVjdCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBzZW5kcyBhIGRlYnVnIGluZm9cbiAgICAgKi9cbiAgICBkZWJ1ZzogJ2RlYnVnJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcjogJ2Vycm9yJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBlbXB0eUNoYW5uZWw6ICdlbXB0eUNoYW5uZWwnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBlbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclN0YXJ0OiAncGxheWVyU3RhcnQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJFcnJvcjogJ3BsYXllckVycm9yJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJTa2lwOiAncGxheWVyU2tpcCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAgICovXG4gICAgcGxheWVyVHJpZ2dlcjogJ3BsYXllclRyaWdnZXInLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2Ugc3RhdGUgaXMgdXBkYXRlZC4gQ29uc3VtaW5nIHRoaXMgZXZlbnQgbWF5IGRpc2FibGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBgUGxheWVyLmlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKWAgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqL1xuICAgIHZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdm9sdW1lIGlzIHVwZGF0ZWRcbiAgICAgKi9cbiAgICB2b2x1bWVDaGFuZ2U6ICd2b2x1bWVDaGFuZ2UnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcGF1c2VkXG4gICAgICovXG4gICAgcGxheWVyUGF1c2U6ICdwbGF5ZXJQYXVzZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyByZXN1bWVkXG4gICAgICovXG4gICAgcGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgICAvKipcbiAgICAgKiBCaXF1YWQgRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBiaXF1YWRGaWx0ZXJzVXBkYXRlOiAnYmlxdWFkRmlsdGVyc1VwZGF0ZScsXG4gICAgLyoqXG4gICAgICogRXF1YWxpemVyIFVwZGF0ZVxuICAgICAqL1xuICAgIGVxdWFsaXplclVwZGF0ZTogJ2VxdWFsaXplclVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogRFNQIHVwZGF0ZVxuICAgICAqL1xuICAgIGRzcFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBhdWRpb0ZpbHRlcnNVcGRhdGU6ICdhdWRpb0ZpbHRlcnNVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEF1ZGlvIHBsYXllciB3aWxsIHBsYXkgbmV4dCB0cmFja1xuICAgICAqL1xuICAgIHdpbGxQbGF5VHJhY2s6ICd3aWxsUGxheVRyYWNrJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHJlcG9wdWxhdGVkXG4gICAgICovXG4gICAgY2hhbm5lbFBvcHVsYXRlOiAnY2hhbm5lbFBvcHVsYXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgICAqL1xuICAgIHF1ZXVlQ3JlYXRlOiAncXVldWVDcmVhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIGRlbGV0ZWRcbiAgICAgKi9cbiAgICBxdWV1ZURlbGV0ZTogJ3F1ZXVlRGVsZXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyB0cnlpbmcgdG8gYWRkIHNpbWlsYXIgdHJhY2sgZm9yIGF1dG9wbGF5XG4gICAgICovXG4gICAgd2lsbEF1dG9QbGF5OiAnd2lsbEF1dG9QbGF5J1xufSBhcyBjb25zdDtcblxuZXhwb3J0IGVudW0gVHJhY2tTa2lwUmVhc29uIHtcbiAgICBOb1N0cmVhbSA9ICdFUlJfTk9fU1RSRUFNJyxcbiAgICBNYW51YWwgPSAnTUFOVUFMJyxcbiAgICBTRUVLX09WRVJfVEhSRVNIT0xEID0gJ1NFRUtfT1ZFUl9USFJFU0hPTEQnLFxuICAgIEp1bXAgPSAnSlVNUEVEX1RPX0FOT1RIRVJfVFJBQ0snLFxuICAgIFNraXBUbyA9ICdTS0lQX1RPX0FOT1RIRVJfVFJBQ0snLFxuICAgIEhpc3RvcnlOZXh0ID0gJ0hJU1RPUllfTkVYVF9UUkFDSydcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUV2ZW50czxNZXRhID0gYW55PiB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrQWRkOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2tzIGFycmF5XG4gICAgICovXG4gICAgYXVkaW9UcmFja3NBZGQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgYXVkaW9UcmFja1JlbW92ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc1JlbW92ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uRGVzdHJveWVkOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0OiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBzZW5kcyBhIGRlYnVnIGluZm9cbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgICAqL1xuICAgIGRlYnVnOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG1lc3NhZ2U6IHN0cmluZykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICovXG4gICAgZXJyb3I6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGVtcHR5Q2hhbm5lbDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBlbXB0eVF1ZXVlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllclN0YXJ0OiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBlcnJvcnMgd2hpbGUgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllckVycm9yOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIGVycm9yOiBFcnJvciwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgYmVpbmcgc3RyZWFtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJGaW5pc2g6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2FzIHNraXBwZWRcbiAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHNraXBwaW5nXG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBmb3Igc2tpcHBpbmdcbiAgICAgKi9cbiAgICBwbGF5ZXJTa2lwOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaywgcmVhc29uOiBUcmFja1NraXBSZWFzb24sIGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB3aGljaCB3YXMgcGxheWVkIGluIHRoaXMgZXZlbnRcbiAgICAgKi9cbiAgICBwbGF5ZXJUcmlnZ2VyOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaywgcmVhc29uOiBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZFN0YXRlIFRoZSBvbGQgdm9pY2Ugc3RhdGVcbiAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgICAqL1xuICAgIHZvaWNlU3RhdGVVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIgaXMgcGF1c2VkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcGxheWVyUGF1c2U6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJSZXN1bWU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyJ3Mgdm9sdW1lIGlzIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkVm9sdW1lIFRoZSBvbGQgdm9sdW1lXG4gICAgICogQHBhcmFtIG5ld1ZvbHVtZSBUaGUgdXBkYXRlZCB2b2x1bWVcbiAgICAgKi9cbiAgICB2b2x1bWVDaGFuZ2U6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkVm9sdW1lOiBudW1iZXIsIG5ld1ZvbHVtZTogbnVtYmVyKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBlcXVhbGl6ZXIgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgZXF1YWxpemVyVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSwgbmV3RmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBiaXF1YWQgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGJpcXVhZEZpbHRlcnNVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwsIG5ld0ZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBkc3AgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGRzcFVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBQQ01GaWx0ZXJzW10sIG5ld0ZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZmZtcGVnIGF1ZGlvIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBhdWRpb0ZpbHRlcnNVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogRmlsdGVyc05hbWVbXSwgbmV3RmlsdGVyczogRmlsdGVyc05hbWVbXSkgPT4gdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHN0cmVhbWluZyBhbiBhdWRpbyB0cmFjay4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgc3RyZWFtIGNvbmZpZyBiZWZvcmUgcGxheWluZyBhIHRyYWNrLlxuICAgICAqIExpc3RlbmluZyB0byB0aGlzIGV2ZW50IHdpbGwgcGF1c2UgdGhlIGV4ZWN1dGlvbiBvZiBhdWRpbyBwbGF5ZXIgdW50aWwgYGRvbmUoKWAgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2lsbCBiZSBzdHJlYW1lZFxuICAgICAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbnMgZm9yIHN0cmVhbWluZ1xuICAgICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICAgKi9cbiAgICB3aWxsUGxheVRyYWNrOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjazx1bmtub3duPiwgY29uZmlnOiBTdHJlYW1Db25maWcsIGRvbmU6ICgpID0+IHZvaWQpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyBwb3B1bGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBjaGFubmVsUG9wdWxhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHF1ZXVlQ3JlYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBxdWV1ZURlbGV0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHRyeWluZyB0byBhZGQgc2ltaWxhciB0cmFjayBmb3IgYXV0b3BsYXlcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSBzaW1pbGFyIHRyYWNrcyB0aGF0IHdlcmUgZm91bmRcbiAgICAgKiBAcGFyYW0gZG9uZSBEb25lIGNhbGxiYWNrXG4gICAgICovXG4gICAgd2lsbEF1dG9QbGF5OiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrczogVHJhY2tbXSwgZG9uZTogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQpID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlPE1ldGEgPSB1bmtub3duPiB7XG4gICAgI3RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAjZGVsZXRlZCA9IGZhbHNlO1xuICAgICNzaHVmZmxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfX2N1cnJlbnQ6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHRyYWNrczogUXVldWU8VHJhY2s+O1xuICAgIHB1YmxpYyBoaXN0b3J5ID0gbmV3IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG5vZGUgPSBuZXcgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGZpbHRlcnMgPSBuZXcgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgb25CZWZvcmVDcmVhdGVTdHJlYW06IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jICgpID0+IG51bGw7XG4gICAgcHVibGljIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKHN0cmVhbSkgPT4gKHtcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICAgIH0pO1xuICAgIHB1YmxpYyByZXBlYXRNb2RlID0gUXVldWVSZXBlYXRNb2RlLk9GRjtcbiAgICBwdWJsaWMgdGltZW91dHMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PigpO1xuICAgIHB1YmxpYyBzdGF0cyA9IG5ldyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgdGFza3NRdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyLCBwdWJsaWMgb3B0aW9uczogR3VpbGROb2RlSW5pdDxNZXRhPikge1xuICAgICAgICB0aGlzLnRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4ob3B0aW9ucy5xdWV1ZVN0cmF0ZWd5KTtcbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkpIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pKSB0aGlzLm9uQWZ0ZXJDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW07XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpIHRoaXMucmVwZWF0TW9kZSA9IG9wdGlvbnMucmVwZWF0TW9kZTtcblxuICAgICAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wYXVzZU9uRW1wdHkgPz89IHRydWU7XG5cbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bGxpc2godGhpcy5vcHRpb25zLmJpcXVhZCkgJiYgIVR5cGVVdGlsLmlzQm9vbGVhbih0aGlzLm9wdGlvbnMuYmlxdWFkKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IHRoaXMub3B0aW9ucy5iaXF1YWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZXF1YWxpemVyKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IHRoaXMub3B0aW9ucy5lcXVhbGl6ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmlsdGVyZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IHRoaXMub3B0aW9ucy5maWx0ZXJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcih0aGlzLm9wdGlvbnMucmVzYW1wbGVyKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgPSB0aGlzLm9wdGlvbnMucmVzYW1wbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzQXJyYXkodGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuZmZtcGVnLnNldERlZmF1bHRzKHRoaXMub3B0aW9ucy5mZm1wZWdGaWx0ZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhTaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnW0d1aWxkTm9kZUluaXQubWF4U2l6ZV0nLCAnbnVtYmVyJywgdHlwZW9mIG9wdGlvbnMubWF4U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKG9wdGlvbnMubWF4SGlzdG9yeVNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdbR3VpbGROb2RlSW5pdC5tYXhIaXN0b3J5U2l6ZV0nLCAnbnVtYmVyJywgdHlwZW9mIG9wdGlvbnMubWF4SGlzdG9yeVNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4U2l6ZSA8IDEpIG9wdGlvbnMubWF4U2l6ZSA9IEluZmluaXR5O1xuICAgICAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgR3VpbGRRdWV1ZSBpbml0aWFsaXplZCBmb3IgZ3VpbGQgJHt0aGlzLm9wdGlvbnMuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMub3B0aW9ucy5ndWlsZC5pZH0pYCk7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucXVldWVDcmVhdGUsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnN0b3JlLnJlZHVjZSgoYSwgYykgPT4gYSArIGMuZHVyYXRpb25NUywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0dGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgICAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIHJlY2VpdmVyIGZvciB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2ljZVJlY2VpdmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5yZWNlaXZlciA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG0gVGhlIG1lc3NhZ2UgdG8gd3JpdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZGVidWcsIHRoaXMsIG0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRhZGF0YSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBtZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG0gTWV0YWRhdGEgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuX19jdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHF1ZXVlIHdhcyBkZWxldGVkIHByZXZpb3VzbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxldGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjaGFubmVsIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNoYW5uZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNoYW5uZWwoYzogVm9pY2VCYXNlZENoYW5uZWwgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmNoYW5uZWwgPSBjO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ3VpbGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ3VpbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZC5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdHJhbnNpdGlvbiBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VHJhbnNpdGlvbmluZyhzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLiN0cmFuc2l0aW9uaW5nID0gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaWYgdGhpcyBxdWV1ZSBpcyBjdXJyZW50bHkgdW5kZXIgdHJhbnNpdGlvbiBtb2RlXG4gICAgICovXG4gICAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zaXRpb25pbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHJlcGVhdCBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAgICovXG4gICAgcHVibGljIHNldFJlcGVhdE1vZGUobW9kZTogUXVldWVSZXBlYXRNb2RlKSB7XG4gICAgICAgIHRoaXMucmVwZWF0TW9kZSA9IG1vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhTaXplID8/IEluZmluaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBoaXN0b3J5IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4SGlzdG9yeVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldE1heEhpc3RvcnlTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhIaXN0b3J5U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWF4IGhpc3Rvcnkgc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNYXhIaXN0b3J5U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2l6ZSA8IDEpIHNpemUgPSBJbmZpbml0eTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtYXggc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNYXhTaXplKHNpemU6IG51bWJlcikge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnRyYWNrcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGhhcyBubyB0cmFja3MgbGVmdCBpbiBpdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBpcyBmdWxsXG4gICAgICovXG4gICAgcHVibGljIGlzRnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDYXBhY2l0eSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdWxsKCkpIHJldHVybiAwO1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgICAgIHJldHVybiBjYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBjdXJyZW50bHkgaG9sZHMgYWN0aXZlIGF1ZGlvIHJlc291cmNlXG4gICAgICovXG4gICAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmICF0aGlzLmRpc3BhdGNoZXIuYXVkaW9SZXNvdXJjZS5lbmRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHJhY2sgdG8gdGhlIHF1ZXVlLiBUaGlzIHdpbGwgZW1pdCBgYXVkaW9UcmFja3NBZGRgIHdoZW4gbXVsdGlwbGUgdHJhY2tzIGFyZSBhZGRlZCwgb3RoZXJ3aXNlIGBhdWRpb1RyYWNrQWRkYC5cbiAgICAgKiBAcGFyYW0gdHJhY2sgVHJhY2sgb3IgcGxheWxpc3Qgb3IgYXJyYXkgb2YgdHJhY2tzIHRvIGFkZFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRUcmFjayh0cmFjazogVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QpIHtcbiAgICAgICAgY29uc3QgdG9BZGQgPSB0cmFjayBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gdHJhY2sudHJhY2tzIDogdHJhY2s7XG4gICAgICAgIGNvbnN0IGlzTXVsdGkgPSBBcnJheS5pc0FycmF5KHRvQWRkKTtcblxuICAgICAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgdG9BZGQpO1xuXG4gICAgICAgIHRoaXMudHJhY2tzLmFkZCh0b0FkZCk7XG5cbiAgICAgICAgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja3NBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja0FkZCwgdGhpcywgdG9BZGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgdHJhY2sgZnJvbSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5yZW1vdmUodHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgdGhlIHRyYWNrIHRvIHRoZSBnaXZlbiBpbmRleFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnNlcnRUcmFjayh0cmFjazogVHJhY2ssIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm1vdmUodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgICAqL1xuICAgIHB1YmxpYyBjb3B5VHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuY29weSh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gc3JjIFRoZSBmaXJzdCB0cmFjayB0byBzd2FwXG4gICAgICogQHBhcmFtIGRlc3QgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAgICovXG4gICAgcHVibGljIHN3YXBUcmFja3Moc3JjOiBUcmFja1Jlc29sdmFibGUsIGRlc3Q6IFRyYWNrUmVzb2x2YWJsZSk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnN3YXAoc3JjLCBkZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgc3RyZWFtIGRpc3BhdGNoZXIgZnJvbSB0aGUgZ2l2ZW4gY29ubmVjdGlvblxuICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIHVzZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVEaXNwYXRjaGVyKGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiwgb3B0aW9uczogUGljazxWb2ljZUNvbm5lY3RDb25maWcsICdhdWRpb1BsYXllcicgfCAndGltZW91dCc+ID0ge30pIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5jYWNoZS5nZXQoY29ubmVjdGlvbi5qb2luQ29uZmlnLmNoYW5uZWxJZCEpO1xuICAgICAgICBpZiAoIWNoYW5uZWwpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1ZPSUNFX0NIQU5ORUwoKTtcbiAgICAgICAgaWYgKCFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdjaGFubmVsJywgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsIFN0cmluZyhjaGFubmVsPy50eXBlKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKGNvbm5lY3Rpb24sIGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMudGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQsIG9wdGlvbnMuYXVkaW9QbGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsXG4gICAgICogQHBhcmFtIGNoYW5uZWxSZXNvbHZhYmxlIFRoZSB2b2ljZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBKb2luIGNvbmZpZ1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KGNoYW5uZWxSZXNvbHZhYmxlOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIG9wdGlvbnM6IFZvaWNlQ29ubmVjdENvbmZpZyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsUmVzb2x2YWJsZSk7XG4gICAgICAgIGlmICghY2hhbm5lbCB8fCAhY2hhbm5lbC5pc1ZvaWNlQmFzZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2hhbm5lbCcsIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLCBTdHJpbmcoY2hhbm5lbD8udHlwZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjaGFubmVsLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSA/ICdzdGFnZScgOiAndm9pY2UnfSBjaGFubmVsICR7Y2hhbm5lbC5uYW1lfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlciAmJiBjaGFubmVsLmlkICE9PSB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0Rlc3Ryb3lpbmcgb2xkIGNvbm5lY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBhd2FpdCB0aGlzLnBsYXllci52b2ljZVV0aWxzLmNvbm5lY3QoY2hhbm5lbCwge1xuICAgICAgICAgICAgZGVhZjogb3B0aW9ucy5kZWFmID8/IHRoaXMub3B0aW9ucy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgICAgICAgbWF4VGltZTogb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgICAgICAgIHF1ZXVlOiB0aGlzLFxuICAgICAgICAgICAgYXVkaW9QbGF5ZXI6IG9wdGlvbnM/LmF1ZGlvUGxheWVyLFxuICAgICAgICAgICAgZ3JvdXA6IG9wdGlvbnMuZ3JvdXAgPz8gdGhpcy5wbGF5ZXIuY2xpZW50LnVzZXI/LmlkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY29ubmVjdGlvbiwgdGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbCEudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFN1cHByZXNzZWQoZmFsc2UpLmNhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNhdHRhY2hMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIGR5bmFtaWMgV2hldGhlciB0byBzaHVmZmxlIHRoZSBxdWV1ZSBkeW5hbWljYWxseS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIER5bmFtaWMgc2h1ZmZsaW5nIHdpbGwgc2h1ZmZsZSB0aGUgcXVldWUgd2hlbiB0aGUgY3VycmVudCB0cmFjayBlbmRzLCB3aXRob3V0IG11dGF0aW5nIHRoZSBxdWV1ZS5cbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgdGhlIHF1ZXVlIHdpbGwgYmUgc2h1ZmZsZWQgaW1tZWRpYXRlbHkgaW4tcGxhY2UsIHdoaWNoIGNhbm5vdCBiZSB1bmRvbmUuXG4gICAgICovXG4gICAgcHVibGljIGVuYWJsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICAgICAgaWYgKCFkeW5hbWljKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrcy5zaHVmZmxlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI3NodWZmbGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVNodWZmbGUoKSB7XG4gICAgICAgIHRoaXMuI3NodWZmbGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHJldHVybnMgV2hldGhlciBzaHVmZmxlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICAgICAgaWYgKGR5bmFtaWMpIHtcbiAgICAgICAgICAgIHRoaXMuI3NodWZmbGUgPSAhdGhpcy4jc2h1ZmZsZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmFja3Muc2h1ZmZsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHNodWZmbGUgbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIHF1ZXVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNTaHVmZmxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIGxhdGVuY3kgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbj8ucGluZy51ZHAgPz8gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXIubm9kZXMuZGVsZXRlKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLiNkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLm5vZGUudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgICAgICAgIHRoaXMudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldml2ZXMgdGhpcyBxdWV1ZVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHVibGljIHJldml2ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlbGV0ZWQgfHwgdGhpcy5wbGF5ZXIubm9kZXMuaGFzKHRoaXMuaWQpKSByZXR1cm47XG4gICAgICAgIHRoaXMuI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuc2V0KHRoaXMuaWQsIHRoaXMpO1xuICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucXVldWVDcmVhdGUsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIGRlYWZcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmRGVhZihtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldERlYWYobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgc2VsZiBtdXRlXG4gICAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAgICogQHBhcmFtIHJlYXNvbiBSZWFzb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2VsZk11dGUobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRNdXRlKG1vZGUsIHJlYXNvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSBhIHRyYWNrIGluIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJlIHBsYXllZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBub2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheSh0cmFjazogVHJhY2tMaWtlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxNZXRhPikge1xuICAgICAgICBpZiAoIXRoaXMuY2hhbm5lbCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5wbGF5KHRoaXMuY2hhbm5lbCwgdHJhY2ssIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXQgYW4gZXZlbnQgb24gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZW1pdFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmdzIGZvciB0aGUgZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgR3VpbGRRdWV1ZUV2ZW50czxNZXRhPj4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8R3VpbGRRdWV1ZUV2ZW50czxNZXRhPltLXT4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgICNhdHRhY2hMaXN0ZW5lcnMoZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVycm9yLCB0aGlzLCBlKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2RlYnVnJywgKG0pID0+IHRoaXMuaGFzRGVidWdnZXIgJiYgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kZWJ1ZywgdGhpcywgbSkpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2Rlc3Ryb3llZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyhkaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdkc3AnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXModGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kc3BVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2JpcXVhZCcsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCAhPT0gZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYmlxdWFkRmlsdGVyc1VwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVxdWFsaXplclVwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3ZvbHVtZScsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSAhPT0gZikgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC52b2x1bWVDaGFuZ2UsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsIGYpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IGY7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuaGFzRGVidWdnZXI7XG4gICAgfVxuXG4gICAgI3JlbW92ZUxpc3RlbmVyczxUIGV4dGVuZHMgeyByZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd24gfT4odGFyZ2V0OiBUKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAjcGVyZm9ybVN0YXJ0KHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuaXNUcmFuc2l0aW9uaW5nKCkgPyAnZmlsdGVycycgOiAnbm9ybWFsJztcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgYFBsYXllciB0cmlnZ2VyZWQgZm9yIFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICAgICB9KX1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgICAgICBpZiAodHJhY2sgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU3RhcnQsIHRoaXMsIHRyYWNrKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB9XG5cbiAgICAjZ2V0TmV4dFRyYWNrKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTaHVmZmxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLnRyYWNrcy5zdG9yZTtcblxuICAgICAgICBpZiAoIXN0b3JlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHRyYWNrID0gVXRpbC5yYW5kb21DaG9pY2Uoc3RvcmUpO1xuXG4gICAgICAgIHRoaXMudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHQuaWQgPT09IHRyYWNrLmlkO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdHJhY2s7XG4gICAgfVxuXG4gICAgI3BlcmZvcm1GaW5pc2gocmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgICAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICAgICAgICAgICAgfSl9IHdhcyBtYXJrZWQgYXMgZmluaXNoZWRgXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0FkZGluZyB0cmFjayB0byBoaXN0b3J5IGFuZCBlbWl0dGluZyBmaW5pc2ggZXZlbnQgc2luY2UgdHJhbnNpdGlvbiBtb2RlIGlzIGRpc2FibGVkLi4uJyk7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh0cmFjayk7XG4gICAgICAgICAgICB0aGlzLm5vZGUucmVzZXRQcm9ncmVzcygpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdObyBtb3JlIHRyYWNrcyBsZWZ0IGluIHRoZSBxdWV1ZSB0byBwbGF5IGFuZCByZXBlYXQgbW9kZSBpcyBvZmYsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlRSQUNLKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gdHJhY2ssIHJlcGVhdGluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSB8fCB0cmFjaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5RVUVVRSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHF1ZXVlLCBtb3ZpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5IHRvIGN1cnJlbnQgcXVldWUuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFja3MuYWRkKHRoaXMuI2dldE5leHRUcmFjaygpIHx8IHRyYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5BVVRPUExBWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBhdXRvcGxheSwgaW5pdGlhdGluZyBhdXRvcGxheSBoYW5kbGVyLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNoYW5kbGVBdXRvcGxheSh0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy4jZ2V0TmV4dFRyYWNrKCkhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUucGxheSh0aGlzLl9fY3VycmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgICNlbWl0RW5kKCkge1xuICAgICAgICB0aGlzLl9fY3VycmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlRdWV1ZSwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGVhdmVPbkVuZCkge1xuICAgICAgICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zLmxlYXZlT25FbmRDb29sZG93bikudW5yZWYoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jICNoYW5kbGVBdXRvcGxheSh0cmFjazogVHJhY2spIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBGaW5kaW5nIHJlbGF0ZWQgdHJhY2tzIGZvciBUcmFjayAke3RyYWNrLnRpdGxlfSAoJHt0cmFjay51cmx9KSBbZXh0OiR7dHJhY2suZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfV1gKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNrcyA9XG4gICAgICAgICAgICAgICAgKGF3YWl0IHRyYWNrLmV4dHJhY3Rvcj8uZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KSk/LnRyYWNrcyB8fFxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IFF1ZXJ5aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy50cmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy50cmFja3M7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8ucmVzdWx0IHx8XG4gICAgICAgICAgICAgICAgW107XG5cbiAgICAgICAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICAgICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oKHJlc29sdmUpID0+IChyZXNvbHZlciA9IHJlc29sdmUpKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQud2lsbEF1dG9QbGF5LCB0aGlzLCB0cmFja3MsIHJlc29sdmVyISk7XG5cbiAgICAgICAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIoXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZSA9IHRyYWNrcy5maWx0ZXIoKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlPy5bMF0gPz8gVXRpbC5yYW5kb21DaG9pY2UodHJhY2tzLnNsaWNlKDAsIDUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV4dFRyYWNrID0gYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgICAgICAgIGlmICghbmV4dFRyYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0F1dG9wbGF5ID4+IE5vIHRyYWNrIHdhcyBmb3VuZCwgaW5pdGlhdGluZyAjZW1pdEVuZCgpJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ05vIHRyYWNrIHdhcyBmb3VuZCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubm9kZS5wbGF5KG5leHRUcmFjaywge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrOiAwLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIEF1ZGlvUGxheWVyLFxuICAgIEF1ZGlvUGxheWVyRXJyb3IsXG4gICAgQXVkaW9QbGF5ZXJTdGF0dXMsXG4gICAgQXVkaW9SZXNvdXJjZSxcbiAgICBjcmVhdGVBdWRpb1BsYXllcixcbiAgICBjcmVhdGVBdWRpb1Jlc291cmNlLFxuICAgIGVudGVyc1N0YXRlLFxuICAgIFN0cmVhbVR5cGUsXG4gICAgVm9pY2VDb25uZWN0aW9uLFxuICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgICBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uXG59IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgQmlxdWFkRmlsdGVycywgUENNRmlsdGVycywgRmlsdGVyc0NoYWluIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFBvc3RQcm9jZXNzZWRSZXN1bHQgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IFZvaWNlUmVjZWl2ZXJOb2RlIH0gZnJvbSAnLi4vbWFuYWdlci9Wb2ljZVJlY2VpdmVyTm9kZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTdHJlYW1PcHMge1xuICAgIHR5cGU/OiBTdHJlYW1UeXBlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YT86IGFueTtcbiAgICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlRXF1YWxpemVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWRGaWx0ZXI/OiBCaXF1YWRGaWx0ZXJzO1xuICAgIGRpc2FibGVGaWx0ZXJzPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgICB2b2x1bWU/OiBudW1iZXI7XG4gICAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gICAgc2FtcGxlUmF0ZT86IG51bWJlcjtcbiAgICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUV2ZW50cyB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICAgIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgICBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55O1xuICAgIHN0YXJ0OiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gICAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gICAgZHNwOiAoZmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiBhbnk7XG4gICAgZXFCYW5kczogKGZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gYW55O1xuICAgIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBudW1iZXIpID0+IGFueTtcbiAgICBiaXF1YWQ6IChmaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzKSA9PiBhbnk7XG4gICAgdm9sdW1lOiAodm9sdW1lOiBudW1iZXIpID0+IGFueTtcbiAgICBkZXN0cm95ZWQ6ICgpID0+IGFueTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbn1cblxuY2xhc3MgU3RyZWFtRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxWb2ljZUV2ZW50cz4ge1xuICAgIHB1YmxpYyB2b2ljZUNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbjtcbiAgICBwdWJsaWMgYXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyO1xuICAgIHB1YmxpYyByZWNlaXZlciA9IG5ldyBWb2ljZVJlY2VpdmVyTm9kZSh0aGlzKTtcbiAgICBwdWJsaWMgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsO1xuICAgIHB1YmxpYyBhdWRpb1Jlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4gfCBudWxsO1xuICAgIHB1YmxpYyBkc3AgPSBuZXcgRmlsdGVyc0NoYWluKCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBjb25uZWN0aW9uIG9iamVjdFxuICAgICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSBjb25uZWN0ZWQgY2hhbm5lbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLCBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsIHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZSwgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXIgPSAyMDAwMCwgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcikge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgICAgICAgKiBAdHlwZSB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXVkaW8gcGxheWVyXG4gICAgICAgICAqIEB0eXBlIHtBdWRpb1BsYXllcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIgPVxuICAgICAgICAgICAgYXVkaW9QbGF5ZXIgfHxcbiAgICAgICAgICAgIGNyZWF0ZUF1ZGlvUGxheWVyKHtcbiAgICAgICAgICAgICAgICBkZWJ1ZzogdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlclxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICAgICAqIEB0eXBlIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcblxuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yIGFzIEF1ZGlvUGxheWVyRXJyb3IpKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpKTtcblxuICAgICAgICB0aGlzLmRzcC5vblVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kc3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKSB0aGlzLmVtaXQoJ2RzcCcsIHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVyKSB0aGlzLmVtaXQoJ2JpcXVhZCcsIHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5lcXVhbGl6ZXIpIHRoaXMuZW1pdCgnZXFCYW5kcycsIHRoaXMuZHNwLmVxdWFsaXplci5nZXRFUSgpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC52b2x1bWUpIHRoaXMuZW1pdCgndm9sdW1lJywgdGhpcy5kc3Audm9sdW1lLnZvbHVtZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AucmVzYW1wbGVyKSB0aGlzLmVtaXQoJ3NhbXBsZVJhdGUnLCB0aGlzLmRzcC5yZXNhbXBsZXIudGFyZ2V0U2FtcGxlUmF0ZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kc3Aub25FcnJvciA9IChlKSA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZSBhcyBBdWRpb1BsYXllckVycm9yKTtcblxuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvblxuICAgICAgICAgICAgLm9uKFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQsIGFzeW5jIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLk1hbnVhbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uV2ViU29ja2V0Q2xvc2UgJiYgbmV3U3RhdGUuY2xvc2VDb2RlID09PSA0MDE0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZSh0aGlzLnZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcsIHRoaXMuY29ubmVjdGlvblRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgVXRpbC53YWl0KCh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyArIDEpICogNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNvbm5lY3Rpb25EZXN0cm95ZWQsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignc3RhdGVDaGFuZ2UnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclBhdXNlLCB0aGlzLnF1ZXVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJSZXN1bWUsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSB8fCBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgICAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgICAqL1xuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkO1xuICAgIH1cblxuICAgIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgICAqL1xuICAgIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXVzZWQgfHwgdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkF1dG9QYXVzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nXG4gICAgICovXG4gICAgaXNCdWZmZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICAgKi9cbiAgICBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAgICovXG4gICAgaXNJZGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEZXN0cm95ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgICAqL1xuICAgIGlzUmVhZHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBzaWduYWxsaW5nXG4gICAgICovXG4gICAgaXNTaWduYWxsaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBjb25uZWN0aW5nXG4gICAgICovXG4gICAgaXNDb25uZWN0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgICAqIEBwYXJhbSB7UmVhZGFibGV9IHNyYyBUaGUgc3RyZWFtIHNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3BzXSBPcHRpb25zXG4gICAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlU3RyZWFtKHNyYzogUmVhZGFibGUsIG9wcz86IENyZWF0ZVN0cmVhbU9wcykge1xuICAgICAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSAhb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgICAgICAgPyB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICAgICAgICAgICAgICBkc3A6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBvcHM/LmRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVGaWx0ZXJzXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYmlxdWFkOiBvcHM/LmJpcXVhZEZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogb3BzLmJpcXVhZEZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQmlxdWFkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICByZXNhbXBsZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTYW1wbGVSYXRlOiBvcHM/LnNhbXBsZVJhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVJlc2FtcGxlclxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVxdWFsaXplcjoge1xuICAgICAgICAgICAgICAgICAgICAgIGJhbmRNdWx0aXBsaWVyOiBvcHM/LmVxLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVFcXVhbGl6ZXJcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB2b2x1bWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IG9wcz8udm9sdW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVWb2x1bWVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogc3JjO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdFeGVjdXRpbmcgb25BZnRlckNyZWF0ZVN0cmVhbSBob29rLi4uJyk7XG4gICAgICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLm9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUpLmNhdGNoKFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5XG4gICAgICAgICAgICAgICAgfSBhcyBQb3N0UHJvY2Vzc2VkUmVzdWx0KVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdQcmVwYXJpbmcgQXVkaW9SZXNvdXJjZS4uLicpO1xuICAgICAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBjcmVhdGVBdWRpb1Jlc291cmNlKHBvc3RTdHJlYW0/LnN0cmVhbSA/PyBzdHJlYW0sIHtcbiAgICAgICAgICAgIGlucHV0VHlwZTogcG9zdFN0cmVhbT8udHlwZSA/PyBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnksXG4gICAgICAgICAgICBtZXRhZGF0YTogb3BzPy5kYXRhLFxuICAgICAgICAgICAgLy8gdm9sdW1lIGNvbnRyb2xzIGhhcHBlbiBmcm9tIEF1ZGlvRmlsdGVyIERTUCB1dGlsaXR5XG4gICAgICAgICAgICBpbmxpbmVWb2x1bWU6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8ucmVzYW1wbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5maWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmVxdWFsaXplciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAgICogQHR5cGUge0F1ZGlvUGxheWVyU3RhdHVzfVxuICAgICAqL1xuICAgIGdldCBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyBmcm9tIHZvaWNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1ZGlvUGxheWVyKSB0aGlzLmF1ZGlvUGxheWVyLnN0b3AodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLnZvaWNlQ29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2gge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgZGlzcGF0Y2hlclxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95ZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgcGxheWVyXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZW5kKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1BsYXllci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhdXNlcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci5wYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2UpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWVzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSBzdHJlYW1cbiAgICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdXM9ZmFsc2VdIFdoZXRoZXIgb3Igbm90IHRvIHVzZSBvcHVzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAgICovXG4gICAgYXN5bmMgcGxheVN0cmVhbShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4gPSB0aGlzLmF1ZGlvUmVzb3VyY2UhKSB7XG4gICAgICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0FVRElPX1JFU09VUkNFKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc291cmNlLmVuZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHJlc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgdGhpcy5hdWRpb1Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZSh0aGlzLnZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5LCB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1BsYXllci5wbGF5KHJlc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHBsYXliYWNrIHZvbHVtZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdm9sdW1lIGFtb3VudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHNldFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUuc2V0Vm9sdW1lKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2b2x1bWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gMTAwO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnZvbHVtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWJhY2sgdGltZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5hdWRpb1Jlc291cmNlKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZS5wbGF5YmFja0R1cmF0aW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciBhcyBTdHJlYW1EaXNwYXRjaGVyIH07XG4iLCAiaW1wb3J0IHsgVXNlclJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBhc3NUaHJvdWdoLCB0eXBlIFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEVuZEJlaGF2aW9yVHlwZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgKiBhcyBwcmlzbSBmcm9tICdwcmlzbS1tZWRpYSc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBSYXdUcmFja0RhdGEgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZVJlY2VpdmVyT3B0aW9ucyB7XG4gICAgbW9kZT86ICdvcHVzJyB8ICdwY20nO1xuICAgIGVuZD86IEVuZEJlaGF2aW9yVHlwZTtcbiAgICBzaWxlbmNlRHVyYXRpb24/OiBudW1iZXI7XG4gICAgY3JjPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUmF3VHJhY2tJbml0ID0gUGFydGlhbDxPbWl0PFJhd1RyYWNrRGF0YSwgJ2F1dGhvcicgfCAncGxheWxpc3QnIHwgJ3NvdXJjZScgfCAnZW5naW5lJyB8ICdyYXcnIHwgJ3F1ZXJ5VHlwZScgfCAnZGVzY3JpcHRpb24nIHwgJ3ZpZXdzJz4+O1xuXG5leHBvcnQgY2xhc3MgVm9pY2VSZWNlaXZlck5vZGUge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge31cblxuICAgIHB1YmxpYyBjcmVhdGVSYXdUcmFjayhzdHJlYW06IFJlYWRhYmxlLCBkYXRhOiBSYXdUcmFja0luaXQgPSB7fSkge1xuICAgICAgICBkYXRhLnRpdGxlID8/PSBgUmVjb3JkaW5nICR7RGF0ZS5ub3coKX1gO1xuXG4gICAgICAgIHJldHVybiBuZXcgVHJhY2sodGhpcy5kaXNwYXRjaGVyLnF1ZXVlLnBsYXllciwge1xuICAgICAgICAgICAgYXV0aG9yOiAnRGlzY29yZCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS50aXRsZSxcbiAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxuICAgICAgICAgICAgZHVyYXRpb246IGRhdGEuZHVyYXRpb24gfHwgJzA6MDAnLFxuICAgICAgICAgICAgdmlld3M6IDAsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogZGF0YS5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgICAgIHRodW1ibmFpbDogZGF0YS50aHVtYm5haWwgfHwgJ2h0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2VtYmVkL2F2YXRhcnMvMC5wbmcnLFxuICAgICAgICAgICAgdXJsOiBkYXRhLnVybCB8fCAnaHR0cHM6Ly9kaXNjb3JkLmNvbScsXG4gICAgICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknLFxuICAgICAgICAgICAgcmF3OiB7XG4gICAgICAgICAgICAgICAgZW5naW5lOiBzdHJlYW0sXG4gICAgICAgICAgICAgICAgc291cmNlOiAnYXJiaXRyYXJ5J1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZSBtdWx0aXBsZSBzdHJlYW1zIHRvZ2V0aGVyXG4gICAgICogQHBhcmFtIHN0cmVhbXMgVGhlIGFycmF5IG9mIHN0cmVhbXMgdG8gbWVyZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbWVyZ2VSZWNvcmRpbmdzKHN0cmVhbXM6IFJlYWRhYmxlW10pIHtcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICB2b2lkIHN0cmVhbXM7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9JTVBMRU1FTlRFRChgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9Lm1lcmdlUmVjb3JkaW5ncygpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb3JkIGEgdXNlciBpbiB2b2ljZSBjaGFubmVsXG4gICAgICogQHBhcmFtIHVzZXIgVGhlIHVzZXIgdG8gcmVjb3JkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUmVjb3JkaW5nIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVjb3JkVXNlcihcbiAgICAgICAgdXNlcjogVXNlclJlc29sdmFibGUsXG4gICAgICAgIG9wdGlvbnM6IFZvaWNlUmVjZWl2ZXJPcHRpb25zID0ge1xuICAgICAgICAgICAgZW5kOiBFbmRCZWhhdmlvclR5cGUuQWZ0ZXJTaWxlbmNlLFxuICAgICAgICAgICAgbW9kZTogJ3BjbScsXG4gICAgICAgICAgICBzaWxlbmNlRHVyYXRpb246IDEwMDBcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICBjb25zdCBfdXNlciA9IHRoaXMuZGlzcGF0Y2hlci5xdWV1ZS5wbGF5ZXIuY2xpZW50LnVzZXJzLnJlc29sdmVJZCh1c2VyKTtcblxuICAgICAgICBjb25zdCBwYXNzVGhyb3VnaCA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgICAgICBjb25zdCByZWNlaXZlciA9IHRoaXMuZGlzcGF0Y2hlci52b2ljZUNvbm5lY3Rpb24ucmVjZWl2ZXI7XG5cbiAgICAgICAgaWYgKCFyZWNlaXZlcikgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVDRUlWRVIoKTtcblxuICAgICAgICByZWNlaXZlci5zcGVha2luZy5vbignc3RhcnQnLCAodXNlcklkKSA9PiB7XG4gICAgICAgICAgICBpZiAodXNlcklkID09PSBfdXNlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY2VpdmVTdHJlYW0gPSByZWNlaXZlci5zdWJzY3JpYmUoX3VzZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogb3B0aW9ucy5lbmQgfHwgRW5kQmVoYXZpb3JUeXBlLkFmdGVyU2lsZW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLnNpbGVuY2VEdXJhdGlvbiA/PyAxMDAwXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm1vZGUgPT09ICdwY20nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwY20gPSByZWNlaXZlU3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgKHByaXNtLm9wdXMgfHwgKDxhbnk+cHJpc20pLmRlZmF1bHQub3B1cykuRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemU6IDk2MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwY20ucGlwZShwYXNzVGhyb3VnaCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZVN0cmVhbS5waXBlKHBhc3NUaHJvdWdoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLnVucmVmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwYXNzVGhyb3VnaCBhcyBSZWFkYWJsZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUXVldWUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgdHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPignTElGTycpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCAoKHRoaXMucXVldWUgYXMgYW55KS5fX2N1cnJlbnQgYXMgVHJhY2sgfCBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHByZXZpb3VzVHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVIaXN0b3J5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHJhY2sgdG8gdHJhY2sgaGlzdG9yeVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIHB1c2godHJhY2s6IFRyYWNrIHwgVHJhY2tbXSkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnRyYWNrcy5hZGQodHJhY2spO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgaGlzdG9yeVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBuZXh0KCkge1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMubmV4dFRyYWNrO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ05vIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1ZXVlLm5vZGUuc2tpcCh7XG4gICAgICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5IaXN0b3J5TmV4dCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcHBlZCBieSBHdWlsZFF1ZXVlSGlzdG9yeS5uZXh0KCknXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdObyBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0cmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIGlmIChjdXJyZW50ICYmIHByZXNlcnZlQ3VycmVudCkgdGhpcy5xdWV1ZS5ub2RlLmluc2VydChjdXJyZW50LCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyB0byBbR3VpbGRRdWV1ZUhpc3RvcnldLnByZXZpb3VzKClcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFjayhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzKHByZXNlcnZlQ3VycmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplIGhpc3Rvcnkgc3RvcmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzaXplKCkge1xuICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy50cmFja3Muc3RvcmUubGVuZ3RoIDwgdGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50LCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyB3YWl0Rm9yIH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBDcmVhdGVTdHJlYW1PcHMgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IEV4dHJhY3RvclN0cmVhbWFibGUgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0ICogYXMgcHJpc20gZnJvbSAncHJpc20tbWVkaWEnO1xuaW1wb3J0IHsgT3B1c0RlY29kZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvb3B1cyc7XG5cbmV4cG9ydCBjb25zdCBGRk1QRUdfU1JBVEVfUkVHRVggPSAvYXNldHJhdGU9XFxkK1xcKihcXGQoXFwuXFxkKT8pLztcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBsYXlPcHRpb25zIHtcbiAgICBxdWV1ZT86IGJvb2xlYW47XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICB0cmFuc2l0aW9uTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2tpcE9wdGlvbnMge1xuICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyVGltZXN0YW1wIHtcbiAgICBjdXJyZW50OiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgfTtcbiAgICB0b3RhbDoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgIH07XG4gICAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Db25maWcge1xuICAgIGRpc3BhdGNoZXJDb25maWc6IENyZWF0ZVN0cmVhbU9wcztcbiAgICBwbGF5ZXJDb25maWc6IFJlc291cmNlUGxheU9wdGlvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gdW5rbm93bj4ge1xuICAgICNwcm9ncmVzcyA9IDA7XG4gICAgI2hhc0ZGbXBlZ09wdGltaXphdGlvbiA9IGZhbHNlO1xuICAgIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgICAgIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbiA9IC9saWJvcHVzOiAoeWVzfHRydWUpLy50ZXN0KHRoaXMucXVldWUucGxheWVyLnNjYW5EZXBzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGluIGlkbGUgbW9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0lkbGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNJZGxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nIHRoZSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBpc0J1ZmZlcmluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0J1ZmZlcmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmcgYSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQbGF5aW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkXG4gICAgICovXG4gICAgcHVibGljIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGF1c2VkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgcHJvZ3Jlc3MgaGlzdG9yeVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldFByb2dyZXNzKCkge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHBsYXllciBwcm9ncmVzc1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQcm9ncmVzcyhwcm9ncmVzczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVhbSB0aW1lIGZvciBjdXJyZW50IHNlc3Npb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnN0cmVhbVRpbWUgPz8gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHBsYXliYWNrIGR1cmF0aW9uIHdpdGggaGlzdG9yeSBpbmNsdWRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWJhY2tUaW1lKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLiNwcm9ncmVzcyArIHRoaXMuc3RyZWFtVGltZTtcblxuICAgICAgICByZXR1cm4gZHVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBkdXJhdGlvbiBtdWx0aXBsaWVyXG4gICAgICovXG4gICAgcHVibGljIGdldER1cmF0aW9uTXVsdGlwbGllcigpIHtcbiAgICAgICAgY29uc3Qgc3JhdGVGaWx0ZXJzID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy50b0FycmF5KCkuZmlsdGVyKChmZikgPT4gRkZNUEVHX1NSQVRFX1JFR0VYLnRlc3QoZmYpKTtcbiAgICAgICAgY29uc3QgbXVsdGlwbGllcnMgPSBzcmF0ZUZpbHRlcnNcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChGRk1QRUdfU1JBVEVfUkVHRVguZXhlYyhtKT8uWzFdIGFzIHN0cmluZyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoZikgPT4gIWlzTmFOKGYpKTtcblxuICAgICAgICByZXR1cm4gIW11bHRpcGxpZXJzLmxlbmd0aCA/IDEgOiBtdWx0aXBsaWVycy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBjdXJyZW50ICsgYWNjdW11bGF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCBwcm9ncmVzcyBvZiB0aGUgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWRQbGF5YmFja1RpbWUoKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMucGxheWJhY2tUaW1lO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLmdldER1cmF0aW9uTXVsdGlwbGllcigpICogZHVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgdG90YWwgZHVyYXRpb24gb2YgdGhlIHBsYXllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMudG90YWxEdXJhdGlvbjtcblxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkdXIgLyB0aGlzLmdldER1cmF0aW9uTXVsdGlwbGllcigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxEdXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgcHJlZmVyc0JyaWRnZWRNZXRhZGF0YSA9IHRoaXMucXVldWUub3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGE7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgaWYgKHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgJiYgdHJhY2s/Lm1ldGFkYXRhICE9IG51bGwgJiYgdHlwZW9mIHRyYWNrLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiAnYnJpZGdlJyBpbiB0cmFjay5tZXRhZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoXG4gICAgICAgICAgICAgICAgdHJhY2sgYXMgVHJhY2s8e1xuICAgICAgICAgICAgICAgICAgICBicmlkZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICkubWV0YWRhdGE/LmJyaWRnZS5kdXJhdGlvbjtcblxuICAgICAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKGR1cmF0aW9uKSkgcmV0dXJuIGR1cmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRyYWNrPy5kdXJhdGlvbk1TID8/IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHN0cmVhbSBwcm9ncmVzc1xuICAgICAqIEBwYXJhbSBpZ25vcmVGaWx0ZXJzIElnbm9yZSBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldFRpbWVzdGFtcChpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBQbGF5ZXJUaW1lc3RhbXAgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IGlnbm9yZUZpbHRlcnMgPyB0aGlzLnBsYXliYWNrVGltZSA6IHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lO1xuICAgICAgICBjb25zdCB0b3RhbCA9IGlnbm9yZUZpbHRlcnMgPyB0aGlzLnRvdGFsRHVyYXRpb24gOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJyZW50OiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVMoY3VycmVudCkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjdXJyZW50XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG90YWw6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0b3RhbCkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0b3RhbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb2dyZXNzOiBNYXRoLnJvdW5kKChjdXJyZW50IC8gdG90YWwpICogMTAwKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIGN1cnJlbnQgcHJvZ3Jlc3NcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQcm9ncmVzcyBiYXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQcm9ncmVzc0JhcihvcHRpb25zPzogUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuZ2V0VGltZXN0YW1wKCk7XG4gICAgICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBpbmRpY2F0b3IgPSAnXFx1ezFGNTE4fScsIGxlZnRDaGFyID0gJ1xcdTI1QUMnLCByaWdodENoYXIgPSAnXFx1MjVBQycsIGxlbmd0aCA9IDE1LCB0aW1lY29kZXMgPSB0cnVlLCBzZXBhcmF0b3IgPSAnXFx1MjUwMycgfSA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpIHx8IGxlbmd0aCA8IDAgfHwgIU51bWJlci5pc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfUkFOR0UoJ1tQbGF5ZXJQcm9ncmVzc0Jhck9wdGlvbnMubGVuZ3RoXScsIFN0cmluZyhsZW5ndGgpLCAnMCcsICdGaW5pdGUgTnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKCh0aW1lc3RhbXAuY3VycmVudC52YWx1ZSAvIHRpbWVzdGFtcC50b3RhbC52YWx1ZSkgKiBsZW5ndGgpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMSAmJiBpbmRleCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhciA9IGxlZnRDaGFyLnJlcGVhdChpbmRleCAtIDEpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIGJhci5wdXNoKGluZGljYXRvcik7XG4gICAgICAgICAgICBiYXIucHVzaChyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIGluZGV4KSk7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtiYXIuam9pbignJyl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YmFyLmpvaW4oJycpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIDEpfSAke3NlcGFyYXRvcn0gJHt0aW1lc3RhbXAudG90YWwubGFiZWx9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2luZGljYXRvcn0ke3JpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gMSl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlZWsgdGhlIHBsYXllclxuICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZWVrKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZHVyYXRpb24gPT09IHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGR1cmF0aW9uID4gdGhpcy50b3RhbER1cmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgICAgICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5TRUVLX09WRVJfVEhSRVNIT0xELFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfUkFOR0UoJ1tkdXJhdGlvbl0nLCBTdHJpbmcoZHVyYXRpb24pLCAnMCcsIFN0cmluZyh0aGlzLnRvdGFsRHVyYXRpb24pKS5tZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHVyYXRpb24gPCAwKSBkdXJhdGlvbiA9IDA7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB2b2x1bWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9sdW1lID8/IDEwMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdm9sdW1lXG4gICAgICogQHBhcmFtIHZvbCBWb2x1bWUgYW1vdW50IHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICBpZiAocmVzKSB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdm9sO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBiaXQgcmF0ZVxuICAgICAqIEBwYXJhbSByYXRlIFRoZSBiaXQgcmF0ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Qml0cmF0ZShyYXRlOiBudW1iZXIgfCAnYXV0bycpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5lbmNvZGVyPy5zZXRCaXRyYXRlKHJhdGUgPT09ICdhdXRvJyA/IHRoaXMucXVldWUuY2hhbm5lbD8uYml0cmF0ZSA/PyA2NDAwMCA6IHJhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3RhdGUpIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBhdXNlKHRydWUpIHx8IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXN1bWUoKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZCh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHJlc3VtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc2tpcChvcHRpb25zPzogU2tpcE9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICAgICAgaWYgKCF0cmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgICAgIGNvbnN0IHsgcmVhc29uLCBkZXNjcmlwdGlvbiB9ID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5NYW51YWwsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0cmFjayB3YXMgc2tpcHBlZCBtYW51YWxseSdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJTa2lwLCB0aGlzLnF1ZXVlLCB0cmFjaywgcmVhc29uLCBkZXNjcmlwdGlvbik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gdHJhY2sgZnJvbSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZSh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kVHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5maW5kKCh0LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICAgICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZm91bmRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB0LmlkID09PSBmb3VuZFRyYWNrLmlkKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tSZW1vdmUsIHRoaXMucXVldWUsIGZvdW5kVHJhY2spO1xuXG4gICAgICAgIHJldHVybiBmb3VuZFRyYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gc3BlY2lmaWMgdHJhY2sgb24gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBqdW1wIHRvIHdpdGhvdXQgcmVtb3Zpbmcgb3RoZXIgdHJhY2tzXG4gICAgICovXG4gICAgcHVibGljIGp1bXAodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUodHJhY2spO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUudW5zaGlmdChyZW1vdmVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5KdW1wLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdHJhY2sgd2FzIGp1bXBlZCB0byBtYW51YWxseSdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRyYWNrIHBvc2l0aW9uXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUcmFja1Bvc2l0aW9uKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MudG9BcnJheSgpLmZpbmRJbmRleCgodCwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNraXAgdG8gdGhlIGdpdmVuIHRyYWNrLCByZW1vdmluZyBvdGhlcnMgb24gdGhlIHdheVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gc2tpcCB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBza2lwVG8odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLmdldFRyYWNrUG9zaXRpb24odHJhY2spO1xuICAgICAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoaWR4KTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuZmlsdGVyKChfLCBpKSA9PiBpIDw9IGlkeCk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZSgwLCBpZHgsIHJlbW92ZWQpO1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tzUmVtb3ZlLCB0aGlzLnF1ZXVlLCB0b1JlbW92ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU2tpcFRvLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGxheWVyIHdhcyBza2lwcGVkIHRvIGFub3RoZXIgdHJhY2sgbWFudWFsbHknXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhIHRyYWNrIG9uIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdG8sIGRlZmF1bHRzIHRvIDAuXG4gICAgICovXG4gICAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgICAgICBpZiAoISh0cmFjayBpbnN0YW5jZW9mIFRyYWNrKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgndHJhY2sgdmFsdWUnLCAnaW5zdGFuY2Ugb2YgVHJhY2snLCBTdHJpbmcodHJhY2spKTtcbiAgICAgICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKGluZGV4LCAwLCB0cmFjayk7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLm5vRW1pdEluc2VydCkgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrQWRkLCB0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlKGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoZnJvbSk7XG4gICAgICAgIGlmICghcmVtb3ZlZCkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIHRyYWNrIHRvIG1vdmUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluc2VydChyZW1vdmVkLCB0byk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gdGhpcy5xdWV1ZS50cmFja3MuYXQodGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZyb20pKTtcbiAgICAgICAgaWYgKCFzcmMpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCB0cmFjayB0byBjb3B5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnQoc3JjLCB0byk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgICAqIEBwYXJhbSBzZWNvbmQgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAgICovXG4gICAgcHVibGljIHN3YXAoZmlyc3Q6IFRyYWNrUmVzb2x2YWJsZSwgc2Vjb25kOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZpcnN0KTtcbiAgICAgICAgaWYgKHNyYyA8IDApIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCBzcmMgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICAgICAgaWYgKGRlc3QgPCAwKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgZGVzdCB0cmFjayB0byBzd2FwJyk7XG5cbiAgICAgICAgY29uc3Qgc3JjVCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY107XG4gICAgICAgIGNvbnN0IGRlc3RUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF07XG5cbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXSA9IGRlc3RUO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XSA9IHNyY1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKiBAcGFyYW0gZm9yY2UgV2hldGhlciBvciBub3QgdG8gZm9yY2VmdWxseSBzdG9wIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBzdG9wKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcCkge1xuICAgICAgICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkgfHwgdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9LCB0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bikudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHJhdyBhdWRpbyByZXNvdXJjZVxuICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5UmF3KHJlc291cmNlOiBBdWRpb1Jlc291cmNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGxheVN0cmVhbShyZXNvdXJjZSBhcyBBdWRpb1Jlc291cmNlPFRyYWNrPik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gcmVzIFRoZSB0cmFjayB0byBwbGF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWluZyB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheShyZXM/OiBUcmFjayB8IG51bGwsIG9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBSZWNlaXZlZCBwbGF5IHJlcXVlc3QgZnJvbSBndWlsZCAke3RoaXMucXVldWUuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMucXVldWUuZ3VpbGQuaWR9KWApO1xuXG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcXVldWU6IHRoaXMucXVldWUuY3VycmVudFRyYWNrICE9IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWs6IDBcbiAgICAgICAgICAgIH0gYXMgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKSE7XG5cbiAgICAgICAgaWYgKHJlcyAmJiBvcHRpb25zLnF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBxdWV1ZSB0aGUgdHJhY2ssIGFkZGluZyB0aGUgZ2l2ZW4gdHJhY2sgdG8gcXVldWUgaW5zdGVhZC4uLicpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuYWRkVHJhY2socmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYWNrID0gcmVzIHx8IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdQbGF5IHJlcXVlc3QgcmVjZWl2ZWQgYnV0IHRyYWNrIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZXJyb3IsIHRoaXMucXVldWUsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdSZXF1ZXN0ZWQgb3B0aW9uIHJlcXVpcmVzIHRvIHBsYXkgdGhlIHRyYWNrLCBpbml0aWFsaXppbmcuLi4nKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEluaXRpYXRpbmcgc3RyZWFtIGV4dHJhY3Rpb24gcHJvY2Vzcy4uLmApO1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gdHJhY2sucmF3Py5zb3VyY2UgfHwgdHJhY2suc291cmNlO1xuICAgICAgICAgICAgY29uc3QgcXQ6IFNlYXJjaFF1ZXJ5VHlwZSA9IHRyYWNrLnF1ZXJ5VHlwZSB8fCAoc3JjID09PSAnc3BvdGlmeScgPyAnc3BvdGlmeVNvbmcnIDogc3JjID09PSAnYXBwbGVfbXVzaWMnID8gJ2FwcGxlTXVzaWNTb25nJyA6IHNyYyk7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgRXhlY3V0aW5nIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIGhvb2sgKFF1ZXJ5VHlwZTogJHtxdH0pLi4uYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbVNyYyA9IHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCBhcyBFcnJvciB8IG51bGwsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiBudWxsIGFzIEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm9uQmVmb3JlQ3JlYXRlU3RyZWFtPy4odHJhY2ssIHF0IHx8ICdhcmJpdHJhcnknLCB0aGlzLnF1ZXVlKS50aGVuKFxuICAgICAgICAgICAgICAgIChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGU6IEVycm9yKSA9PiAoc3RyZWFtU3JjLmVycm9yID0gZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgICAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdGYWlsZWQgdG8gZ2V0IHN0cmVhbSBmcm9tIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIScpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2spLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgIChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocj8ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IDxSZWFkYWJsZT5yLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyPy5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5lcnJvciA9IHIuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKGU6IEVycm9yKSA9PiAoc3RyZWFtU3JjLmVycm9yID0gZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHJldHVybiB0aGlzLiN0aHJvdyh0cmFjaywgc3RyZWFtU3JjLmVycm9yKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNlZWsgPT09ICdudW1iZXInICYmIG9wdGlvbnMuc2VlayA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBvcHRpb25zLnNlZWs7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIGNvbnN0IGNvb2tpZXMgPSB0cmFjay5yYXc/LnNvdXJjZSA9PT0gJ3lvdXR1YmUnID8gKDxhbnk+dGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy55dGRsT3B0aW9ucz8ucmVxdWVzdE9wdGlvbnMpPy5oZWFkZXJzPy5jb29raWUgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYWNrU3RyZWFtQ29uZmlnOiBTdHJlYW1Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hlckNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUVxdWFsaXplcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVWb2x1bWU6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlVm9sdW1lLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVJlc2FtcGxlcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGU6IHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSAnbnVtYmVyJyAmJiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID4gMCA/IHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGJpcXVhZEZpbHRlcjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGVxOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyczogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogdHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3LFxuICAgICAgICAgICAgICAgICAgICBza2lwRkZtcGVnOiB0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBsYXllckNvbmZpZzogb3B0aW9uc1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IHJlc29sdmVyOiAoKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gKHJlc29sdmVyID0gcmVzb2x2ZSkpO1xuXG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC53aWxsUGxheVRyYWNrLCB0aGlzLnF1ZXVlLCB0cmFjaywgdHJhY2tTdHJlYW1Db25maWcsIHJlc29sdmVyISk7XG5cbiAgICAgICAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSByZXNvbHZlcigpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnV2FpdGluZyBmb3Igd2lsbFBsYXlUcmFjayBldmVudCB0byByZXNvbHZlLi4uJyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVCaXF1YWQsXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZVZvbHVtZVxuICAgICAgICAgICAgXS5ldmVyeSgoZSkgPT4gISFlID09PSB0cnVlKTtcblxuICAgICAgICAgICAgY29uc3QgbmVlZHNGaWx0ZXJzID0gISF0cmFja1N0cmVhbUNvbmZpZy5wbGF5ZXJDb25maWcuc2VlayB8fCAhIXRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuYXJncy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRTa2lwRkZtcGVnID0gISF0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnNraXBGRm1wZWcgJiYgIW5lZWRzRmlsdGVycztcblxuICAgICAgICAgICAgbGV0IGZpbmFsU3RyZWFtOiBSZWFkYWJsZTtcblxuICAgICAgICAgICAgY29uc3QgZGVtdXhhYmxlID0gKGZtdDogc3RyaW5nKSA9PiBbU3RyZWFtVHlwZS5PcHVzLCBTdHJlYW1UeXBlLldlYm1PcHVzLCBTdHJlYW1UeXBlLk9nZ09wdXNdLmluY2x1ZGVzKGZtdCBhcyBTdHJlYW1UeXBlKTtcblxuICAgICAgICAgICAgLy8gc2tpcCBmZm1wZWcgd2hlbiBwb3NzaWJsZVxuICAgICAgICAgICAgaWYgKHNob3VsZFNraXBGRm1wZWcgJiYgIShzdHJlYW1TcmMuc3RyZWFtIGluc3RhbmNlb2YgUmVhZGFibGUpICYmIHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtICE9PSAnc3RyaW5nJyAmJiBkZW11eGFibGUoc3RyZWFtU3JjLnN0cmVhbS4kZm10KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgJGZtdCwgc3RyZWFtIH0gPSBzdHJlYW1TcmMuc3RyZWFtO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZFBDTSA9ICFkYXNwRGlzYWJsZWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1Zyhgc2tpcEZGbXBlZyBpcyBzZXQgdG8gdHJ1ZSBhbmQgc3RyZWFtIGlzIGRlbXV4YWJsZSwgY3JlYXRpbmcgc3RyZWFtIHdpdGggdHlwZSAke3Nob3VsZFBDTSA/ICdwY20nIDogJ29wdXMnfWApO1xuXG4gICAgICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B1c1N0cmVhbSA9ICRmbXQgPT09IFN0cmVhbVR5cGUuT3B1cyA/XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA6XG4gICAgICAgICAgICAgICAgICAgICRmbXQgPT09IFN0cmVhbVR5cGUuT2dnT3B1cyA/XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5waXBlKG5ldyBwcmlzbS5vcHVzLk9nZ0RlbXV4ZXIoKSkgOlxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucGlwZShuZXcgcHJpc20ub3B1cy5XZWJtRGVtdXhlcigpKTtcblxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRQQ00pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgZmlsdGVycyBlbmFibGVkLCB3ZSBuZWVkIHRvIGRlY29kZSB0aGUgb3B1cyBzdHJlYW0gdG8gcGNtXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsU3RyZWFtID0gb3B1c1N0cmVhbS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9wdXNEZWNvZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsczogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemU6IDk2MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiA0ODAwMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5SYXc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtO1xuICAgICAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLk9wdXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBvcHVzID0gZGFzcERpc2FibGVkICYmIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbjtcbiAgICAgICAgICAgICAgICAvLyBpZiAob3B1cyAmJiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNhYmxpbmcgUENNIG91dHB1dCBzaW5jZSBhbGwgZmlsdGVycyBhcmUgZGlzYWJsZWQgYW5kIG9wdXMgZW5jb2RpbmcgaXMgc3VwcG9ydGVkLi4uJyk7XG5cbiAgICAgICAgICAgICAgICBmaW5hbFN0cmVhbSA9IHRoaXMuI2NyZWF0ZUZGbXBlZ1N0cmVhbShcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlIHx8IHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtID09PSAnc3RyaW5nJyA/IHN0cmVhbVNyYy5zdHJlYW0gOiBzdHJlYW1TcmMuc3RyZWFtLnN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgdHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2VlayA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBjb29raWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIG9wdXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBPZ2dPcHVzIHJlc3VsdHMgaW4gc3RhdGljIG5vaXNlXG4gICAgICAgICAgICAgICAgLy8gdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gb3B1cyA/IFN0cmVhbVR5cGUuT2dnT3B1cyA6IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBUcmFuc2l0aW9uIG1vZGUgZGV0ZWN0ZWQsIHBsYXllciB3aWxsIHdhaXQgZm9yIGJ1ZmZlcmluZyB0aW1lb3V0IHRvIGV4cGlyZSAoVGltZW91dDogJHt0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dH1tcylgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0Rm9yKHRoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnQnVmZmVyaW5nIHRpbWVvdXQgaGFzIGV4cGlyZWQhJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBQcmVwYXJpbmcgZmluYWwgc3RyZWFtIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeSh0cmFja1N0cmVhbUNvbmZpZywgbnVsbCwgMil9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmNyZWF0ZVN0cmVhbShmaW5hbFN0cmVhbSwgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZyk7XG5cbiAgICAgICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyghIW9wdGlvbnMudHJhbnNpdGlvbk1vZGUpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwZXJmb3JtUGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdWRpbyBwbGF5ZXI6ICR7ZX1gKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjdGhyb3codHJhY2s6IFRyYWNrLCBlcnJvcj86IEVycm9yIHwgbnVsbCkge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY29uc3Qgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0ID0gKFxuICAgICAgICAgICAgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKGBDb3VsZCBub3QgZXh0cmFjdCBzdHJlYW0gZm9yIHRoaXMgdHJhY2ske2Vycm9yID8gYFxcblxcbiR7ZXJyb3Iuc3RhY2sgfHwgZXJyb3J9YCA6ICcnfWApXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJTa2lwLCB0aGlzLnF1ZXVlLCB0cmFjaywgVHJhY2tTa2lwUmVhc29uLk5vU3RyZWFtLCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQubWVzc2FnZSk7XG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyRXJyb3IsIHRoaXMucXVldWUsIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCwgdHJhY2spO1xuICAgICAgICBjb25zdCBuZXh0VHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAobmV4dFRyYWNrKSB0aGlzLnBsYXkobmV4dFRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYWxpemluZyBhdWRpbyBwbGF5ZXIuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyIS5wbGF5U3RyZWFtKHJlc291cmNlKTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoaW5nIGF1ZGlvLi4uJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZSgoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY2FuU3RyZWFtID0gYXdhaXQgZXh0cmFjdG9yLnZhbGlkYXRlKHRyYWNrLnVybCwgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpLnR5cGUpO1xuICAgICAgICAgICAgaWYgKCFjYW5TdHJlYW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKHRyYWNrKTtcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8ucmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcbiAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYFN0cmVhbSBleHRyYWN0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSAoRXh0cmFjdG9yOiAke3N0cmVhbUluZm8uZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfSlgKTtcblxuICAgICAgICByZXR1cm4gc3RyZWFtSW5mbztcbiAgICB9XG5cbiAgICAjY3JlYXRlRkZtcGVnU3RyZWFtKHN0cmVhbTogUmVhZGFibGUgfCBzdHJpbmcsIHRyYWNrOiBUcmFjaywgc2VlayA9IDAsIGNvb2tpZXM/OiBzdHJpbmcsIG9wdXM/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGZmbXBlZ1N0cmVhbSA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWdcbiAgICAgICAgICAgIC5jcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICAgICAgICAgICAgZW5jb2RlckFyZ3M6IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuYXJncyxcbiAgICAgICAgICAgICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgICAgICAgICAgICBmbXQ6IG9wdXMgPyAnb3B1cycgOiAnczE2bGUnLFxuICAgICAgICAgICAgICAgIGNvb2tpZXMsXG4gICAgICAgICAgICAgICAgdXNlTGVnYWN5RkZtcGVnOiAhIXRoaXMucXVldWUucGxheWVyLm9wdGlvbnMudXNlTGVnYWN5RkZtcGVnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtID0gYCR7ZXJyfWAudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gY2xvc2VkIGR1ZSB0byBhbiBlcnJvciBmcm9tIEZGbXBlZyBzdHJlYW06ICR7ZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlIHx8IGVycn1gKTtcblxuICAgICAgICAgICAgICAgIGlmIChtLmluY2x1ZGVzKCdwcmVtYXR1cmUgY2xvc2UnKSB8fCBtLmluY2x1ZGVzKCdlcGlwZScpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllckVycm9yLCB0aGlzLnF1ZXVlLCBlcnIsIHRyYWNrKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmZm1wZWdTdHJlYW07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAndW5kaWNpJztcblxuLy8gI3JlZ2lvbiBzY2FyeSB0aGluZ3MgYmVsb3cgKnNpZ2gqXG5jb25zdCBzcG90aWZ5U29uZ1JlZ2V4ID0gL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzp0cmFja1xcL3xcXD91cmk9c3BvdGlmeTp0cmFjazopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5UGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86cGxheWxpc3RcXC98XFw/dXJpPXNwb3RpZnk6cGxheWxpc3Q6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeUFsYnVtUmVnZXggPSAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OmFsYnVtXFwvfFxcP3VyaT1zcG90aWZ5OmFsYnVtOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHZpbWVvUmVnZXggPSAvXihodHRwfGh0dHBzKT86XFwvXFwvKHd3d1xcLnxwbGF5ZXJcXC4pP3ZpbWVvXFwuY29tXFwvKD86Y2hhbm5lbHNcXC8oPzpcXHcrXFwvKT98Z3JvdXBzXFwvKFteL10qKVxcL3ZpZGVvc1xcL3x2aWRlb1xcL3wpKFxcZCspKD86fFxcL1xcPykkLztcbmNvbnN0IHJldmVyYm5hdGlvblJlZ2V4ID0gL15odHRwczpcXC9cXC8od3d3Lik/cmV2ZXJibmF0aW9uLmNvbVxcLyguKylcXC9zb25nXFwvKC4rKSQvO1xuY29uc3QgYXR0YWNobWVudFJlZ2V4ID0gL15odHRwcz86XFwvXFwvLiskLztcbmNvbnN0IGFwcGxlTXVzaWNTb25nUmVnZXggPSAvXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvKHNvbmd8YWxidW0pXFwvLis/KFxcLy4rP1xcP2k9fFxcLykoWzAtOV0rKSQvO1xuY29uc3QgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvcGxheWxpc3RcXC8uK1xcL3BsXFwuKHUtfHBtLSk/W2EtekEtWjAtOV0rJC87XG5jb25zdCBhcHBsZU11c2ljQWxidW1SZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9hbGJ1bVxcLy4rXFwvKFswLTldKykkLztcbmNvbnN0IHNvdW5kY2xvdWRUcmFja1JlZ2V4ID0gL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvc2V0c1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHlvdXR1YmVQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvKHd3dy4pP3lvdXR1YmUuY29tXFwvcGxheWxpc3RcXD9saXN0PSgoUEx8Rkx8VVV8TEx8UkR8T0wpW2EtekEtWjAtOS1fXXsxNiw0MX0pJC87XG5jb25zdCB5b3V0dWJlVmlkZW9VUkxSZWdleCA9IC9eKCg/Omh0dHBzPzopP1xcL1xcLyk/KCg/Ond3d3xtKVxcLik/KCg/OnlvdXR1YmVcXC5jb218eW91dHUuYmUpKShcXC8oPzpbXFx3LV0rXFw/dj18ZW1iZWRcXC98dlxcLyk/KShbXFx3LV0rKShcXFMrKT8kLztcbmNvbnN0IHlvdXR1YmVWaWRlb0lkUmVnZXggPSAvXlthLXpBLVowLTktX117MTF9JC87XG4vLyAjZW5kcmVnaW9uIHNjYXJ5IHRoaW5ncyBhYm92ZSAqc2lnaCpcblxuY29uc3QgRG9tYWluc01hcCA9IHtcbiAgICBZb3VUdWJlOiBbJ3lvdXR1YmUuY29tJywgJ3lvdXR1LmJlJywgJ211c2ljLnlvdXR1YmUuY29tJywgJ2dhbWluZy55b3V0dWJlLmNvbScsICd3d3cueW91dHViZS5jb20nXSxcbiAgICBTcG90aWZ5OiBbJ29wZW4uc3BvdGlmeS5jb20nLCAnZW1iZWQuc3BvdGlmeS5jb20nXSxcbiAgICBWaW1lbzogWyd2aW1lby5jb20nLCAncGxheWVyLnZpbWVvLmNvbSddLFxuICAgIFJldmVyYk5hdGlvbjogWydyZXZlcmJuYXRpb24uY29tJ10sXG4gICAgU291bmRDbG91ZDogWydzb3VuZGNsb3VkLmNvbSddLFxuICAgIEFwcGxlTXVzaWM6IFsnbXVzaWMuYXBwbGUuY29tJ11cbn07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgcmVkaXJlY3REb21haW5zID0gbmV3IFNldChbXG4gICAgL15odHRwcz86XFwvXFwvc3BvdGlmeS5saW5rXFwvW0EtWmEtejAtOV0rJC8sXG5dKTtcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFF1ZXJ5IHtcbiAgICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gICAgcXVlcnk6IHN0cmluZztcbn1cblxuY2xhc3MgUXVlcnlSZXNvbHZlciB7XG4gICAgLyoqXG4gICAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAgIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcG90aWZ5QWxidW1SZWdleCxcbiAgICAgICAgICAgIHNwb3RpZnlQbGF5bGlzdFJlZ2V4LFxuICAgICAgICAgICAgc3BvdGlmeVNvbmdSZWdleCxcbiAgICAgICAgICAgIHZpbWVvUmVnZXgsXG4gICAgICAgICAgICByZXZlcmJuYXRpb25SZWdleCxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRSZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljU29uZ1JlZ2V4LFxuICAgICAgICAgICAgc291bmRjbG91ZFRyYWNrUmVnZXgsXG4gICAgICAgICAgICBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5bGlzdFJlZ2V4XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlLXJlc29sdmUgcmVkaXJlY3QgdXJsc1xuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBwcmVSZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIG1heERlcHRoID0gNSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiByZWRpcmVjdERvbWFpbnMpIHtcbiAgICAgICAgICAgIGlmIChkb21haW4udGVzdChxdWVyeSkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChxdWVyeSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93J1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy5vaykgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc3BvdGlmeSBkb2VzIG5vdCBcInJlZGlyZWN0XCIsIGl0IHJldHVybnMgYSBwYWdlIHdpdGgganMgdGhhdCByZWRpcmVjdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkuYXBwLmxpbmtcXC8oLispJC8udGVzdChyZXMudXJsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBib2R5LnNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uc3BsaXQoJz9zaT0nKVswXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8ke3RhcmdldH1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhEZXB0aCA8IDEgPyByZXMudXJsIDogdGhpcy5wcmVSZXNvbHZlKHJlcy51cmwsIG1heERlcHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gpOiBSZXNvbHZlZFF1ZXJ5IHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuICAgICAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5GT19SRVFVSVJFRCgncXVlcnknLCBTdHJpbmcocXVlcnkpKTtcblxuICAgICAgICBjb25zdCByZXNvbHZlciA9ICh0eXBlOiB0eXBlb2YgZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5OiBzdHJpbmcpID0+ICh7IHR5cGUsIHF1ZXJ5IH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHF1ZXJ5KTtcblxuICAgICAgICAgICAgaWYgKERvbWFpbnNNYXAuWW91VHViZS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoLyhtKHVzaWMpP3xnYW1pbmcpXFwuLywgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGF5bGlzdElkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ2xpc3QnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcbiAgICAgICAgICAgICAgICBpZiAocGxheWxpc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9JZCAmJiBwbGF5bGlzdElkLnN0YXJ0c1dpdGgoJ1JEJykpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9QTEFZTElTVCwgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JHt2aWRlb0lkfSZsaXN0PSR7cGxheWxpc3RJZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULCBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vcGxheWxpc3Q/bGlzdD0ke3BsYXlsaXN0SWR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfVklERU8sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5TcG90aWZ5LmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvaW50bC0oW2EtekEtWl0rKVxcLy8sICcnKTtcbiAgICAgICAgICAgICAgICBpZiAoc3BvdGlmeVBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKHNwb3RpZnlTb25nUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9TT05HLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuVmltZW8uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpbWVvUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuVklNRU8sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5SZXZlcmJOYXRpb24uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTiwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNvdW5kQ2xvdWQuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNPVU5EQ0xPVURfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLkFwcGxlTXVzaWMuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNTb25nUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfU09ORywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSwgcXVlcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHZpbWVvIGlkIGZyb20gdXJsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldFZpbWVvSUQocXVlcnk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5KS50eXBlID09PSBRdWVyeVR5cGUuVklNRU8gPyBxdWVyeS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlSWQocTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlVVJMKHE6IHN0cmluZykge1xuICAgICAgICByZXR1cm4geW91dHViZVZpZGVvVVJMUmVnZXgudGVzdChxKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfTtcbiIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQWJvcnRTaWduYWwgdG8gY2FuY2VsIHRoaXMgZW50cnlcbiAgICAgKi9cbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXIgPSAoZXhjZXB0aW9uOiBFcnJvcikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgICAqL1xuICAgIHB1YmxpYyBlbnRyaWVzOiBBcnJheTxBc3luY1F1ZXVlRW50cnk+ID0gW107XG5cbiAgICBwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcj86IEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgZW50cmllcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBjb25zdW1lIFdoZXRoZXIgb3Igbm90IHRvIGNvbnN1bWUgYWxsIGVudHJpZXMgYmVmb3JlIGNsZWFyaW5nXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGNvbnN1bWUgPSBmYWxzZSkge1xuICAgICAgICBpZiAoY29uc3VtZSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jb25zdW1lKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgcXVldWUuIFJldHVybnMgYDBgIGlmIG5vIGVudHJpZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjcXVpcmUgYW4gZW50cnkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSAvLyBsb2NrIHRoZSBxdWV1ZVxuICAgICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgICAqIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgICAqIC8vIG1ha2Ugc3VyZSB0byByZWxlYXNlIHRoZSBsb2NrIG9uY2UgZG9uZVxuICAgICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgQXN5bmNRdWV1ZUVudHJ5KHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpIGVudHJ5LmdldFRhc2soKS5jYXRjaCh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgICAgICB0aGlzLmVudHJpZXNbMF0/LmNvbnN1bWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgYWxsIGVudHJpZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgICAgICBjb25zdCBlbnRyeUlkeCA9IHRoaXMuZW50cmllcy5pbmRleE9mKGVudHJ5KTtcblxuICAgICAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVzb2x2ZSE6ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEFzeW5jUXVldWUsIHB1YmxpYyBvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnM/LnNpZ25hbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBYm9ydFNpZ25hbCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdW1lKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpO1xuICAgICAgICB0aGlzLnF1ZXVlLnJlbGVhc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuY2VsKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZWplY3QobmV3IEVycm9yKCdDYW5jZWxsZWQnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9uQWJvcnQpIHRoaXMuc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgICAgIHRoaXMuc2lnbmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGFzaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlRmlsdGVycyB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEF1ZGlvRmlsdGVycyB9IGZyb20gJy4uL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmlxdWFkRmlsdGVycywgRXF1YWxpemVyLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbnR5cGUgRmlsdGVycyA9IGtleW9mIHR5cGVvZiBBdWRpb0ZpbHRlcnMuZmlsdGVycztcblxuY29uc3QgbWFrZUJhbmRzID0gKGFycjogbnVtYmVyW10pID0+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAge1xuICAgICAgICAgICAgbGVuZ3RoOiBFcXVhbGl6ZXIuQkFORF9DT1VOVFxuICAgICAgICB9LFxuICAgICAgICAoXywgaSkgPT4gKHtcbiAgICAgICAgICAgIGJhbmQ6IGksXG4gICAgICAgICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICAgICAgfSlcbiAgICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gICAgRmxhdDogRXF1YWxpemVyQmFuZFtdO1xuICAgIENsYXNzaWNhbDogRXF1YWxpemVyQmFuZFtdO1xuICAgIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBEYW5jZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIEZ1bGxCYXNzOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBGdWxsVHJlYmxlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgSGVhZHBob25lczogRXF1YWxpemVyQmFuZFtdO1xuICAgIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICAgIExpdmU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBQYXJ0eTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICAgIFJlZ2dhZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgICBTb2Z0OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgU29mdFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgICBGbGF0OiBtYWtlQmFuZHMoW10pLFxuICAgIENsYXNzaWNhbDogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNy4yLCAtNy4yLCAtOS42XSksXG4gICAgQ2x1YjogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBEYW5jZTogbWFrZUJhbmRzKFs5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBGdWxsQmFzczogbWFrZUJhbmRzKFstOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdKSxcbiAgICBGdWxsQmFzc1RyZWJsZTogbWFrZUJhbmRzKFs3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF0pLFxuICAgIEZ1bGxUcmVibGU6IG1ha2VCYW5kcyhbLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XSksXG4gICAgSGVhZHBob25lczogbWFrZUJhbmRzKFs0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF0pLFxuICAgIExhcmdlSGFsbDogbWFrZUJhbmRzKFsxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIExpdmU6IG1ha2VCYW5kcyhbLTQuOCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgNS42LCA1LjYsIDQuMCwgMi40LCAyLjQsIDIuNF0pLFxuICAgIFBhcnR5OiBtYWtlQmFuZHMoWzcuMiwgNy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA3LjIsIDcuMl0pLFxuICAgIFBvcDogbWFrZUJhbmRzKFstMS42LCA0LjgsIDcuMiwgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTIuNCwgLTIuNCwgLTEuNiwgLTEuNl0pLFxuICAgIFJlZ2dhZTogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNS42LCAtMS4xMTAyMmUtMTUsIDYuNCwgNi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgICBTa2E6IG1ha2VCYW5kcyhbLTIuNCwgLTQuOCwgLTQuMCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgOC44LCA5LjYsIDExLjIsIDkuNl0pLFxuICAgIFNvZnQ6IG1ha2VCYW5kcyhbNC44LCAxLjYsIC0xLjExMDIyZS0xNSwgLTIuNCwgLTEuMTEwMjJlLTE1LCA0LjAsIDguMCwgOS42LCAxMS4yLCAxMi4wXSksXG4gICAgU29mdFJvY2s6IG1ha2VCYW5kcyhbNC4wLCA0LjAsIDIuNCwgLTEuMTEwMjJlLTE1LCAtNC4wLCAtNS42LCAtMy4yLCAtMS4xMTAyMmUtMTUsIDIuNCwgOC44XSksXG4gICAgVGVjaG5vOiBtYWtlQmFuZHMoWzguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC01LjYsIC00LjgsIC0xLjExMDIyZS0xNSwgOC4wLCA5LjYsIDkuNiwgOC44XSlcbn0pO1xuXG5leHBvcnQgY2xhc3MgRkZtcGVnRmlsdGVyZXI8TWV0YSA9IHVua25vd24+IHtcbiAgICAjZmZtcGVnRmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgI2lucHV0QXJnczogc3RyaW5nW10gPSBbXTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGFmOiBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZmZtcGVnIG1heSBiZSBza2lwcGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBza2lwcGFibGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYWYucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgICB9XG5cbiAgICAjc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAgICAgLy8gc2tpcCBpZiBmaWx0ZXJzIGFyZSB0aGUgc2FtZVxuICAgICAgICBpZiAoZmlsdGVycy5ldmVyeSgoZikgPT4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSkgJiYgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJiAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKTtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICAgICAgICBxdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb0ZpbHRlcnNVcGRhdGUsIHF1ZXVlLCBwcmV2LCB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SW5wdXRBcmdzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICAgICAgdGhpcy4jaW5wdXRBcmdzID0gYXJncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5wdXQgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRBcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVuY29kZXJBcmdzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVycy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYXJncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRBcmdzLmNvbmNhdCh0aGlzLmVuY29kZXJBcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIHN0cmVhbVxuICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU3RyZWFtKHNvdXJjZTogc3RyaW5nIHwgUmVhZGFibGUsIG9wdGlvbnM6IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuI2lucHV0QXJncy5sZW5ndGgpIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbLi4udGhpcy4jaW5wdXRBcmdzLCAuLi4ob3B0aW9ucy5lbmNvZGVyQXJncyB8fCBbXSldO1xuICAgICAgICByZXR1cm4gY3JlYXRlRkZtcGVnU3RyZWFtKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZmbXBlZyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBib29sZWFuKSB7XG4gICAgICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID8gW10gOiAoT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSBmaWx0ZXJzID0gW2ZpbHRlcnNdO1xuICAgICAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICAgICAgICBmcmVzaC5wdXNoKGYpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmYgRmlsdGVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMubmFtZXMuZmlsdGVyKChmKSA9PiAhdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBlbmFibGVkXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5oYXMoZmlsdGVyIGFzIEZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IChvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSkpO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUge1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICAgIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgICAgIGJpcXVhZDogbnVsbCxcbiAgICAgICAgZXF1YWxpemVyOiBbXSxcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHZvbHVtZTogMTAwLFxuICAgICAgICBzYW1wbGVSYXRlOiAtMVxuICAgIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyBpbiB0aGUgZnV0dXJlXG4gICAgLy8gcHVibGljIGdldCBmZm1wZWcoKTogRkZtcGVnRmlsdGVyZXI8TWV0YT4gfCBudWxsIHtcbiAgICAvLyAgICAgaWYgKHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZykge1xuICAgIC8vICAgICAgICAgaWYgKHRoaXMuI2ZmbXBlZykgdGhpcy4jZmZtcGVnID0gbnVsbDtcbiAgICAvLyAgICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKCF0aGlzLiNmZm1wZWcpIHtcbiAgICAvLyAgICAgICAgIHRoaXMuI2ZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiB0aGlzLiNmZm1wZWc7XG4gICAgLy8gfVxuXG4gICAgLyoqXG4gICAgICogVm9sdW1lIHRyYW5zZm9ybWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZXF1YWxpemVyIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlnaXRhbCBiaXF1YWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5iaXF1YWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEU1AgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXNhbXBsZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYXkgY3VycmVudCB0cmFjayBpbiB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gc2VlayBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB0cmlnZ2VyUmVwbGF5KHNlZWsgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaywge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFGaWx0ZXJHcmFwaDxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmZtcGVnPy5maWx0ZXJzID8/IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYWYuZXF1YWxpemVyPy5iYW5kTXVsdGlwbGllcnMgfHwgW10pLm1hcCgobSwgaSkgPT4gKHtcbiAgICAgICAgICAgIGJhbmQ6IGksXG4gICAgICAgICAgICBnYWluOiBtXG4gICAgICAgIH0pKSBhcyBFcXVhbGl6ZXJCYW5kW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hZi5iaXF1YWQ/LmdldEZpbHRlck5hbWUoKSBhcyBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsKSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmlsdGVycz8uZmlsdGVycyB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYudm9sdW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGR1bXAoKTogRmlsdGVyR3JhcGgge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmZtcGVnOiB0aGlzLmZmbXBlZyxcbiAgICAgICAgICAgIGVxdWFsaXplcjogdGhpcy5lcXVhbGl6ZXIsXG4gICAgICAgICAgICBiaXF1YWQ6IHRoaXMuYmlxdWFkLFxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAgICAgICAgc2FtcGxlUmF0ZTogdGhpcy5yZXNhbXBsZXI/LnRhcmdldFNhbXBsZVJhdGUgfHwgdGhpcy5yZXNhbXBsZXI/LnNhbXBsZVJhdGUgfHwgNDgwMDAsXG4gICAgICAgICAgICB2b2x1bWU6IHRoaXMudm9sdW1lPy52b2x1bWUgPz8gMTAwXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckdyYXBoIHtcbiAgICBmZm1wZWc6IEZpbHRlcnNbXTtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWQ6IEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IER1cGxleCwgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0ICogYXMgcHJpc20gZnJvbSAncHJpc20tbWVkaWEnO1xuaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRkZtcGVnU3RyZWFtT3B0aW9ucyB7XG4gICAgZm10Pzogc3RyaW5nO1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICBza2lwPzogYm9vbGVhbjtcbiAgICBjb29raWVzPzogc3RyaW5nO1xuICAgIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG59XG5cbmNvbnN0IGdldEZGbXBlZ1Byb3ZpZGVyID0gKGxlZ2FjeSA9IGZhbHNlKSA9PiAobGVnYWN5ID8gKHByaXNtIGFzIHR5cGVvZiBwcmlzbSAmIHsgZGVmYXVsdDogdHlwZW9mIHByaXNtIH0pLmRlZmF1bHQ/LkZGbXBlZyB8fCBwcmlzbS5GRm1wZWcgOiBGRm1wZWcpO1xuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICAnLXJlY29ubmVjdCcsXG4gICAgICAgICcxJyxcbiAgICAgICAgJy1yZWNvbm5lY3Rfc3RyZWFtZWQnLFxuICAgICAgICAnMScsXG4gICAgICAgICctcmVjb25uZWN0X2RlbGF5X21heCcsXG4gICAgICAgICc1JyxcbiAgICAgICAgJy1pJyxcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICAnLWFuYWx5emVkdXJhdGlvbicsXG4gICAgICAgICcwJyxcbiAgICAgICAgJy1sb2dsZXZlbCcsXG4gICAgICAgICcwJyxcbiAgICAgICAgJy1hcicsXG4gICAgICAgICc0ODAwMCcsXG4gICAgICAgICctYWMnLFxuICAgICAgICAnMicsXG4gICAgICAgICctZicsXG4gICAgICAgIGAke3R5cGVvZiBmbXQgPT09ICdzdHJpbmcnID8gZm10IDogJ3MxNmxlJ31gXG4gICAgXTtcblxuICAgIGlmIChmbXQgPT09ICdvcHVzJykge1xuICAgICAgICBhcmdzLnB1c2goJy1hY29kZWMnLCAnbGlib3B1cycpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29va2llcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9mZm1wZWcub3JnL2ZmbXBlZy1wcm90b2NvbHMuaHRtbCNIVFRQLUNvb2tpZXNcbiAgICAgICAgYXJncy5wdXNoKCctY29va2llcycsIGNvb2tpZXMuc3RhcnRzV2l0aCgnXCInKSA/IGNvb2tpZXMgOiBgXCIke2Nvb2tpZXN9XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAgICctYW5hbHl6ZWR1cmF0aW9uJyxcbiAgICAgICAgJzAnLFxuICAgICAgICAnLWxvZ2xldmVsJyxcbiAgICAgICAgJzAnLFxuICAgICAgICAnLWFyJyxcbiAgICAgICAgJzQ4MDAwJyxcbiAgICAgICAgJy1hYycsXG4gICAgICAgICcyJyxcbiAgICAgICAgJy1mJyxcbiAgICAgICAgYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgXTtcblxuICAgIGlmIChmbXQgPT09ICdvcHVzJykge1xuICAgICAgICBhcmdzLnB1c2goJy1hY29kZWMnLCAnbGlib3B1cycpO1xuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRkZtcGVnIHN0cmVhbVxuICogQHBhcmFtIHN0cmVhbSBUaGUgc291cmNlIHN0cmVhbVxuICogQHBhcmFtIG9wdGlvbnMgRkZtcGVnIHN0cmVhbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZywgb3B0aW9ucz86IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucz8uc2tpcCAmJiB0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cmVhbTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBjb25zdCBhcmdzID0gdHlwZW9mIHN0cmVhbSA9PT0gJ3N0cmluZycgPyBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtLCBvcHRpb25zLmZtdCwgb3B0aW9ucy5jb29raWVzKSA6IEZGTVBFR19BUkdTX1BJUEVEKG9wdGlvbnMuZm10KTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgICBjb25zdCBGRk1QRUcgPSBnZXRGRm1wZWdQcm92aWRlcighIW9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKTtcblxuICAgIGNvbnN0IHRyYW5zY29kZXIgPSBuZXcgRkZNUEVHKHsgc2hlbGw6IGZhbHNlLCBhcmdzIH0pO1xuXG4gICAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgICBpZiAodHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAgICAgc3RyZWFtLnBpcGUodHJhbnNjb2Rlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zY29kZXI7XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgICAgICBwbGF5aW5nOiBib29sZWFuO1xuICAgICAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgICAgIGlkbGU6IGJvb2xlYW47XG4gICAgfTtcbiAgICB0cmFja3NDb3VudDogbnVtYmVyO1xuICAgIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gICAgZXh0cmFjdG9yczogbnVtYmVyO1xuICAgIGxpc3RlbmVyczogbnVtYmVyO1xuICAgIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogc3RyaW5nO1xuICAgICAgICBwbGF5ZXI6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF0ZW5jeToge1xuICAgICAgICAgICAgICAgIGV2ZW50TG9vcDogdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRMb29wTGFnLFxuICAgICAgICAgICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgICAgICAgICBwbGF5aW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNQbGF5aW5nKCksXG4gICAgICAgICAgICAgICAgcGF1c2VkOiB0aGlzLnF1ZXVlLm5vZGUuaXNQYXVzZWQoKSxcbiAgICAgICAgICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICAgICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICAgICAgICBsaXN0ZW5lcnM6IHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoKG0pID0+ICFtLnVzZXIuYm90KS5zaXplIHx8IDAsXG4gICAgICAgICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgcGxheWVyOiAnNi42LjYnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBpbnN0YW5jZXMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIFBsYXllcj4oKTtcbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFBsYXllcihwbGF5ZXI6IFBsYXllcikge1xuICAgIGlmIChpbnN0YW5jZXMuaGFzKHBsYXllci5pZCkpIHJldHVybiB0cnVlO1xuXG4gICAgaW5zdGFuY2VzLnNldChwbGF5ZXIuaWQsIHBsYXllcik7XG5cbiAgICByZXR1cm4gaW5zdGFuY2VzLmhhcyhwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJQbGF5ZXIocGxheWVyOiBQbGF5ZXIpIHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmRlbGV0ZShwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbGF5ZXJzKCkge1xuICAgIHJldHVybiBpbnN0YW5jZXMuYXJyYXkoKTtcbn1cbiIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgICByZXR1cm4gZ2xvYmFsUmVnaXN0cnk7XG59XG4iLCAiaW1wb3J0IHsgVm9pY2VDaGFubmVsLCBTdGFnZUNoYW5uZWwsIFNub3dmbGFrZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciwgam9pblZvaWNlQ2hhbm5lbCwgVm9pY2VDb25uZWN0aW9uLCBnZXRWb2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cywgQXVkaW9QbGF5ZXIgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5jbGFzcyBWb2ljZVV0aWxzIHtcbiAgICAvKipcbiAgICAgKiBWb2ljZSBjb25uZWN0aW9uIGNhY2hlIHRvIHN0b3JlIHZvaWNlIGNvbm5lY3Rpb25zIG9mIHRoZSBQbGF5ZXIgY29tcG9uZW50cy5cbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAqIEl0IG9ubHkgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FjaGU6IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPiA9IG5ldyBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSB1dGlscyBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAgIC8qKlxuICAgICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgICAgICBxdWV1ZTogR3VpbGRRdWV1ZTtcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgICAgICAgICBncm91cD86IHN0cmluZztcbiAgICAgICAgfVxuICAgICk6IFByb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj4ge1xuICAgICAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRF9RVUVVRSgpO1xuICAgICAgICBjb25zdCBjb25uID0gYXdhaXQgdGhpcy5qb2luKGNoYW5uZWwsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdWIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihjb25uLCBjaGFubmVsLCBvcHRpb25zLnF1ZXVlLCBvcHRpb25zLm1heFRpbWUsIG9wdGlvbnMuYXVkaW9QbGF5ZXIpO1xuICAgICAgICByZXR1cm4gc3ViO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gW2NoYW5uZWxdIFRoZSB2b2ljZS9zdGFnZSBjaGFubmVsIHRvIGpvaW5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtWb2ljZUNvbm5lY3Rpb259XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGpvaW4oXG4gICAgICAgIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGRlYWY/OiBib29sZWFuO1xuICAgICAgICAgICAgbWF4VGltZT86IG51bWJlcjtcbiAgICAgICAgICAgIGdyb3VwPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbm4gPSBqb2luVm9pY2VDaGFubmVsKHtcbiAgICAgICAgICAgIGd1aWxkSWQ6IGNoYW5uZWwuZ3VpbGQuaWQsXG4gICAgICAgICAgICBjaGFubmVsSWQ6IGNoYW5uZWwuaWQsXG4gICAgICAgICAgICBhZGFwdGVyQ3JlYXRvcjogY2hhbm5lbC5ndWlsZC52b2ljZUFkYXB0ZXJDcmVhdG9yIGFzIHVua25vd24gYXMgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvcixcbiAgICAgICAgICAgIHNlbGZEZWFmOiBCb29sZWFuKG9wdGlvbnM/LmRlYWYpLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMucGxheWVyLmV2ZW50cy5saXN0ZW5lckNvdW50KCdkZWJ1ZycpID4gMCxcbiAgICAgICAgICAgIGdyb3VwOiBvcHRpb25zPy5ncm91cFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29ubjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzY29ubmVjdChjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24gfCBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcikgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBEaXNjb3JkIFBsYXllciB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgICAqIEByZXR1cm5zIHtTdHJlYW1EaXNwYXRjaGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UsIGdyb3VwPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQsIGdyb3VwKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZvaWNlVXRpbHMgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vZmFicmljL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZU9wdGlvbnMge1xuICAgIGNoZWNrSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbi8vIDVoXG5jb25zdCBERUZBVUxUX0VYUElSWV9USU1FT1VUID0gMThfMDAwXzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUHJvdmlkZXI8VD4ge1xuICAgIGdldERhdGEoKTogUHJvbWlzZTxEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUPltdPjtcbiAgICBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCk6IFByb21pc2U8dm9pZD47XG4gICAgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlDYWNoZSBpbXBsZW1lbnRzIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUcmFjaz4ge1xuICAgICNkZWZhdWx0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VHJhY2s+PigpO1xuICAgIHB1YmxpYyB0aW1lcjogTm9kZUpTLlRpbWVyO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICAgICAgICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjaGVja0ludGVydmFsOiBERUZBVUxUX0VYUElSWV9USU1FT1VUXG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKHRoaXMuY2xlYW51cC5iaW5kKHRoaXMpLCB0aGlzLmNoZWNrSW50ZXJ2YWwpLnVucmVmKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjaGVja0ludGVydmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNoZWNrSW50ZXJ2YWwgPz8gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiB0aGlzLiNkZWZhdWx0Q2FjaGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5oYXNFeHBpcmVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldERhdGEoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4jZGVmYXVsdENhY2hlLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpIHtcbiAgICAgICAgZGF0YS50cmFja3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2RlZmF1bHRDYWNoZS5oYXMoZC51cmwpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuc2V0KGQudXJsLCBuZXcgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGUoZCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2RlZmF1bHRDYWNoZS5nZXQoY29udGV4dC5xdWVyeSk7XG4gICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICAgICAgICB0cmFja3M6IFtyZXN1bHQuZGF0YV0sXG4gICAgICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBULCBleHBpcmVBZnRlcjogbnVtYmVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVCkge1xuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZUFmdGVyID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5leHBpcmVBZnRlciA9IERhdGUubm93KCkgKyBleHBpcmVBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNFeHBpcmVkKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZXhwaXJlQWZ0ZXIgIT09ICdudW1iZXInIHx8IGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8IHRoaXMuZXhwaXJlQWZ0ZXIgPCAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpIDw9IHRoaXMuZXhwaXJlQWZ0ZXI7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn1cbiIsICJpbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmltcG9ydCB7IENsaWVudCwgU25vd2ZsYWtlVXRpbCwgVm9pY2VTdGF0ZSwgSW50ZW50c0JpdEZpZWxkLCBVc2VyLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrLCBTZWFyY2hSZXN1bHQgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlRXZlbnRzLCBWb2ljZUNvbm5lY3RDb25maWcsIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnMsIEd1aWxkTm9kZU1hbmFnZXIsIEd1aWxkUXVldWUsIFJlc291cmNlUGxheU9wdGlvbnMsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vbWFuYWdlcic7XG5pbXBvcnQgeyBWb2ljZVV0aWxzIH0gZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzJztcbmltcG9ydCB7IFBsYXllckV2ZW50cywgUXVlcnlUeXBlLCBTZWFyY2hPcHRpb25zLCBQbGF5ZXJJbml0T3B0aW9ucywgUGxheWxpc3RJbml0RGF0YSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyLCBSZXNvbHZlZFF1ZXJ5IH0gZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEZXBlbmRlbmN5UmVwb3J0LCB2ZXJzaW9uIGFzIGRWb2ljZVZlcnNpb24gfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgKiBhcyBfaW50ZXJuYWxzIGZyb20gJy4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyIH0gZnJvbSAnLi9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXInO1xuaW1wb3J0IHsgSVBSb3RhdG9yIH0gZnJvbSAnLi91dGlscy9JUFJvdGF0b3InO1xuXG5jb25zdCBrU2luZ2xldG9uID0gU3ltYm9sKCdJbnN0YW5jZURpc2NvcmRQbGF5ZXJTaW5nbGV0b24nKTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VCA9IHVua25vd24+IHtcbiAgICB0cmFjazogVHJhY2s7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBzZWFyY2hSZXN1bHQ6IFNlYXJjaFJlc3VsdDtcbiAgICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tMaWtlID0gc3RyaW5nIHwgVHJhY2sgfCBTZWFyY2hSZXN1bHQgfCBUcmFja1tdIHwgUGxheWxpc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiBleHRlbmRzIFNlYXJjaE9wdGlvbnMge1xuICAgIG5vZGVPcHRpb25zPzogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPjtcbiAgICBjb25uZWN0aW9uT3B0aW9ucz86IFZvaWNlQ29ubmVjdENvbmZpZztcbiAgICBhdWRpb1BsYXllck9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgIGFmdGVyU2VhcmNoPzogKHJlc3VsdDogU2VhcmNoUmVzdWx0KSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCB0eXBlIFZvaWNlU3RhdGVIYW5kbGVyID0gKHBsYXllcjogUGxheWVyLCBxdWV1ZTogR3VpbGRRdWV1ZSwgb2xkVm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3Vm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gQXdhaXRlZDx2b2lkPjtcblxuZXhwb3J0IGNsYXNzIFBsYXllciBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8UGxheWVyRXZlbnRzPiB7XG4gICAgI2xhc3RMYXRlbmN5ID0gLTE7XG4gICAgI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lciA9IHRoaXMuaGFuZGxlVm9pY2VTdGF0ZS5iaW5kKHRoaXMpO1xuICAgICNsYWdNb25pdG9yVGltZW91dCE6IE5vZGVKUy5UaW1lb3V0O1xuICAgICNsYWdNb25pdG9ySW50ZXJ2YWwhOiBOb2RlSlMuVGltZXI7XG4gICAgI29uVm9pY2VTdGF0ZVVwZGF0ZTogVm9pY2VTdGF0ZUhhbmRsZXIgPSBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXI7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgPSAnNi42LjYnO1xuICAgIHB1YmxpYyBzdGF0aWMgX3NpbmdsZXRvbktleSA9IGtTaW5nbGV0b247XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHVibGljIHJlYWRvbmx5IGNsaWVudCE6IENsaWVudDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyE6IFBsYXllckluaXRPcHRpb25zO1xuICAgIHB1YmxpYyBub2RlcyA9IG5ldyBHdWlsZE5vZGVNYW5hZ2VyKHRoaXMpO1xuICAgIHB1YmxpYyByZWFkb25seSB2b2ljZVV0aWxzID0gbmV3IFZvaWNlVXRpbHModGhpcyk7XG4gICAgcHVibGljIGV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKTtcbiAgICBwdWJsaWMgZXZlbnRzID0gbmV3IFBsYXllckV2ZW50c0VtaXR0ZXI8R3VpbGRRdWV1ZUV2ZW50cz4oWydlcnJvcicsICdwbGF5ZXJFcnJvciddKTtcbiAgICBwdWJsaWMgcm91dGVQbGFubmVyOiBJUFJvdGF0b3IgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IERpc2NvcmQgUGxheWVyXG4gICAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICAgKiBAcGFyYW0ge1BsYXllckluaXRPcHRpb25zfSBbb3B0aW9uc10gVGhlIHBsYXllciBpbml0IG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUluc3RhbmNlICYmIGtTaW5nbGV0b24gaW4gUGxheWVyKSByZXR1cm4gKDxhbnk+UGxheWVyKVtrU2luZ2xldG9uXSBhcyBQbGF5ZXI7XG5cbiAgICAgICAgc3VwZXIoWydlcnJvciddKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpc2NvcmQuanMgY2xpZW50XG4gICAgICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcblxuICAgICAgICBjb25zdCBpYmYgPSB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgaW5zdGFuY2VvZiBJbnRlbnRzQml0RmllbGQgPyB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgOiBuZXcgSW50ZW50c0JpdEZpZWxkKHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyk7XG5cbiAgICAgICAgaWYgKCFpYmYuaGFzKEludGVudHNCaXRGaWVsZC5GbGFncy5HdWlsZFZvaWNlU3RhdGVzKSkge1xuICAgICAgICAgICAgVXRpbC53YXJuKCdjbGllbnQgaXMgbWlzc2luZyBcIkd1aWxkVm9pY2VTdGF0ZXNcIiBpbnRlbnQnLCAnSW52YWxpZEludGVudHNCaXRGaWVsZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICAgICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyOiBmYWxzZSxcbiAgICAgICAgICAgIGJsb2NrRXh0cmFjdG9yczogW10sXG4gICAgICAgICAgICBibG9ja1N0cmVhbUZyb206IFtdLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IDIwMDAwLFxuICAgICAgICAgICAgbGFnTW9uaXRvcjogMzAwMDAsXG4gICAgICAgICAgICBxdWVyeUNhY2hlOiBvcHRpb25zLnF1ZXJ5Q2FjaGUgPT09IG51bGwgPyBudWxsIDogb3B0aW9ucy5xdWVyeUNhY2hlIHx8IG5ldyBRdWVyeUNhY2hlKHRoaXMpLFxuICAgICAgICAgICAgdXNlTGVnYWN5RkZtcGVnOiBmYWxzZSxcbiAgICAgICAgICAgIHNraXBGRm1wZWc6IHRydWUsXG4gICAgICAgICAgICBwcm9iZVRpbWVvdXQ6IDUwMDAsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgeXRkbE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrOiAxIDw8IDI1LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMueXRkbE9wdGlvbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBQbGF5ZXJJbml0T3B0aW9ucztcblxuICAgICAgICB0aGlzLmNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA9PT0gJ251bWJlcicgJiYgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2ApO1xuICAgICAgICAgICAgICAgIH0sIDApLnVucmVmKCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGFnTW9uaXRvcikudW5yZWYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXBjb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVQbGFubmVyID0gbmV3IElQUm90YXRvcih0aGlzLm9wdGlvbnMuaXBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2ludGVybmFscy5hZGRQbGF5ZXIodGhpcyk7XG5cbiAgICAgICAgaWYgKCEoa1NpbmdsZXRvbiBpbiBQbGF5ZXIpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxheWVyLCBrU2luZ2xldG9uLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkaXNjb3JkLXBsYXllciBzaW5nbGV0b24gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGV0b24oY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IE9taXQ8UGxheWVySW5pdE9wdGlvbnMsICdpZ25vcmVJbnN0YW5jZSc+ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgaWdub3JlSW5zdGFuY2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGRpc2NvcmQtcGxheWVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBPbWl0PFBsYXllckluaXRPcHRpb25zLCAnaWdub3JlSW5zdGFuY2UnPiA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWVyKGNsaWVudCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIGlnbm9yZUluc3RhbmNlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgYWN0aXZlIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxQbGF5ZXJzKCkge1xuICAgICAgICByZXR1cm4gX2ludGVybmFscy5nZXRQbGF5ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckFsbFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiBfaW50ZXJuYWxzLmluc3RhbmNlcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5xdWVyeUNhY2hlID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gYFBsYXllci5ub2Rlc2AuXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc3RhdHMgPSBwbGF5ZXIuZ2VuZXJhdGVTdGF0aXN0aWNzKCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAgICpcbiAgICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAgICogLy8ge1xuICAgICAqIC8vICAgaW5zdGFuY2VzOiBudW1iZXIsXG4gICAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgICAqIC8vICAgcXVlcnlDYWNoZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgICogLy8gICBxdWV1ZXM6IFtcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIC4uLlxuICAgICAqIC8vICAgXVxuICAgICAqIC8vIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVTdGF0aXN0aWNzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5zdGFuY2VzOiBfaW50ZXJuYWxzLmluc3RhbmNlcy5zaXplLFxuICAgICAgICAgICAgcXVldWVzQ291bnQ6IHRoaXMucXVldWVzLmNhY2hlLnNpemUsXG4gICAgICAgICAgICBxdWVyeUNhY2hlRW5hYmxlZDogdGhpcy5xdWVyeUNhY2hlICE9IG51bGwsXG4gICAgICAgICAgICBxdWV1ZXM6IHRoaXMucXVldWVzLmNhY2hlLm1hcCgobSkgPT4gbS5zdGF0cy5nZW5lcmF0ZSgpKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgZXZlcnkgc2luZ2xlIHF1ZXVlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFzdGVyIHBsYXllciBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAgICogYXdhaXQgcGxheWVyLmRlc3Ryb3koKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcbiAgICAgICAgdGhpcy5jbGllbnQub2ZmKCd2b2ljZVN0YXRlVXBkYXRlJywgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KSBjbGVhckludGVydmFsKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KTtcbiAgICAgICAgX2ludGVybmFscy5jbGVhclBsYXllcih0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICAgICAgaWYgKCFxdWV1ZSB8fCAhcXVldWUuY29ubmVjdGlvbiB8fCAhcXVldWUuY2hhbm5lbCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGRpc3BhdGNoIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQudm9pY2VTdGF0ZVVwZGF0ZSwgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSh0aGlzLCBxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAgICpcbiAgICAgKiBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgICAqICAgcGxheWVyLmhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwga2VlcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciwgZXZlbiBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVubG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBzdG9wIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIHVubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYXRlIGF1ZGlvIHBsYXllclxuICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBtdXNpYyBzaG91bGQgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXllclxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgICAqIGNvbnN0IHF1ZXJ5ID0gJ3RoaXMgaXMgbXkgc3VwZXIgY29vbCBzZWFyY2ggcXVlcnkgdGhhdCBJIHdhbnQgdG8gcGxheSc7XG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgIGNvbnN0IHsgdHJhY2sgfSA9IGF3YWl0IHBsYXllci5wbGF5KHZvaWNlQ2hhbm5lbCwgcXVlcnkpO1xuICAgICAqICAgY29uc29sZS5sb2coYFx1RDgzQ1x1REY4OSBJIGFtIHBsYXlpbmcgJHt0cmFjay50aXRsZX0gXHVEODNDXHVERjg5YCk7XG4gICAgICogfSBjYXRjaChlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNEXHVERTJEIEZhaWxlZCB0byBwbGF5IGVycm9yIG9oIG5vOlxcblxcbiR7ZX1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgcXVlcnk6IFRyYWNrTGlrZSwgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9KTogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICAgICAgY29uc3QgdmMgPSB0aGlzLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWwpO1xuICAgICAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2hhbm5lbCcsICdWb2ljZUJhc2VkQ2hhbm5lbCcsICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YCk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPSBxdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCA/IHF1ZXJ5IDogYXdhaXQgdGhpcy5zZWFyY2gocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoYE5vIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtxdWVyeX1cIiAoRXh0cmFjdG9yOiAke3Jlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLm5vZGVzLmNyZWF0ZSh2Yy5ndWlsZCwgb3B0aW9ucy5ub2RlT3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gRW50cnkgJHtlbnRyeS5pZH0gd2FzIHJlc29sdmVkIWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC50cmFja3NbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSkgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICAgICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFjazogcmVzdWx0LnRyYWNrc1swXSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdDogcmVzdWx0LFxuICAgICAgICAgICAgcXVldWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggdHJhY2tzXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdH0gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeVxuICAgICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZWFyY2hSZXN1bHQ+fVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxheWVyLnNlYXJjaChzZWFyY2hRdWVyeSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZWFyY2goc2VhcmNoUXVlcnk6IHN0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0LCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgICAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHJldHVybiBzZWFyY2hRdWVyeTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0ZWRCeSAhPSBudWxsKSBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG4gICAgICAgIG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/PSB0aGlzLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IFtzZWFyY2hRdWVyeV0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICAgICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogc2VhcmNoUXVlcnkucXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LFxuICAgICAgICAgICAgICAgIHRyYWNrczogc2VhcmNoUXVlcnkudHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LnRyYWNrc1swXT8uZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPSBzZWFyY2hRdWVyeS5maWx0ZXIoKHQpID0+IHQgaW5zdGFuY2VvZiBUcmFjayk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiAnQEAjJXt7VXNlckxvYWRlZENvbnRlbnR9fSUjQEAnLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbnVsbCxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgICAgICBsZXQgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9LCBmYWxsYmFjayBzZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmV9YCk7XG5cbiAgICAgICAgY29uc3QgcmVkaXJlY3RlZCA9IGF3YWl0IFF1ZXJ5UmVzb2x2ZXIucHJlUmVzb2x2ZShzZWFyY2hRdWVyeSk7XG4gICAgICAgIGNvbnN0IHsgdHlwZTogcXVlcnlUeXBlLCBxdWVyeSB9ID1cbiAgICAgICAgICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID09PSBRdWVyeVR5cGUuQVVUTyA/IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShyZWRpcmVjdGVkLCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6ICh7IHR5cGU6IG9wdGlvbnMuc2VhcmNoRW5naW5lLCBxdWVyeTogcmVkaXJlY3RlZCB9IGFzIFJlc29sdmVkUXVlcnkpO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBRdWVyeSB0eXBlIGlkZW50aWZpZWQgYXMgJHtxdWVyeVR5cGV9YCk7XG5cbiAgICAgICAgLy8gZm9yY2UgcGFydGljdWxhciBleHRyYWN0b3JcbiAgICAgICAgaWYgKG9wdGlvbnMuc2VhcmNoRW5naW5lLnN0YXJ0c1dpdGgoJ2V4dDonKSkge1xuICAgICAgICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgICAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcXVlcnkgYWxsIGV4dHJhY3RvcnNcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgICAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDaGVja2luZyBjYWNoZS4uLmApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gY2FjaGUgaGl0XG4gICAgICAgICAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENhY2hlIGhpdCBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgICAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgICAgICAgIGV4dHJhY3RvciA9XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0LnZhbGlkYXRlKHF1ZXJ5LCBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApPy5leHRyYWN0b3IgfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIGV4dHJhY3RvcnMgYXZhaWxhYmxlXG4gICAgICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBFeGVjdXRpbmcgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dHJhY3RvclxuICAgICAgICAgICAgLmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9uc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKTtcblxuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwhJyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHJlcy5wbGF5bGlzdCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgcmVzdWx0IHVzaW5nIGFwcHJvcHJpYXRlIGV4dHJhY3Rvci4gUXVlcnlpbmcgYWxsIGV4dHJhY3RvcnMuLi4nKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihcbiAgICAgICAgICAgIGFzeW5jIChleHQpID0+XG4gICAgICAgICAgICAgICAgIW9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAgICAgICAoYXdhaXQgZXh0LnZhbGlkYXRlKHF1ZXJ5KSkgJiZcbiAgICAgICAgICAgICAgICBleHQuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZXN1bHQ/LnJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEZhaWxlZCB0byBxdWVyeSBtZXRhZGF0YSBxdWVyeSB1c2luZyAke3Jlc3VsdD8uZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgJ04vQSd9IGV4dHJhY3Rvci5gKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQ/LmV4dHJhY3RvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwgdXNpbmcgJHtyZXN1bHQuZXh0cmFjdG9yLmlkZW50aWZpZXJ9IWApO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgcGxheWxpc3Q6IHJlc3VsdC5yZXN1bHQucGxheWxpc3QsXG4gICAgICAgICAgICB0cmFja3M6IHJlc3VsdC5yZXN1bHQudHJhY2tzLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGBkaXNjb3JkLXZvaXBgIG1vZHVsZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnNvbGUubG9nKHBsYXllci5zY2FuRGVwcygpKTtcbiAgICAgKiAvLyAtPiBsb2dzIGRlcGVuZGVuY2llcyByZXBvcnRcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHB1YmxpYyBzY2FuRGVwcygpIHtcbiAgICAgICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuICAgICAgICBjb25zdCBydW50aW1lID0gJ0J1bicgaW4gZ2xvYmFsVGhpcyA/ICdCdW4nIDogJ0Rlbm8nIGluIGdsb2JhbFRoaXMgPyAnRGVubycgOiAnTm9kZSc7XG4gICAgICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBbXG4gICAgICAgICAgICAnRGlzY29yZCBQbGF5ZXInLFxuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIGAtIGRpc2NvcmQtcGxheWVyOiAke1BsYXllci52ZXJzaW9ufWAsXG4gICAgICAgICAgICBgLSBkaXNjb3JkLXZvaXA6ICR7ZFZvaWNlVmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gZGlzY29yZC5qczogJHtkanNWZXJzaW9ufWAsXG4gICAgICAgICAgICBgLSBOb2RlIHZlcnNpb246ICR7cHJvY2Vzcy52ZXJzaW9ufSAoRGV0ZWN0ZWQgUnVudGltZTogJHtydW50aW1lfSwgUGxhdGZvcm06ICR7cHJvY2Vzcy5wbGF0Zm9ybX0gWyR7cHJvY2Vzcy5hcmNofV0pYCxcbiAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VMZWdhY3lGRm1wZWcpIHJldHVybiAnLSBmZm1wZWc6IE4vQSAodXNpbmcgbGVnYWN5IGZmbXBlZyknO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBGRm1wZWcubG9jYXRlU2FmZSgpO1xuICAgICAgICAgICAgICAgIGlmICghaW5mbykgcmV0dXJuICdGRm1wZWcvQXZjb252IG5vdCBmb3VuZCc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gW2AtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCwgYC0gY29tbWFuZDogJHtpbmZvLmNvbW1hbmR9YCwgYC0gc3RhdGljOiAke2luZm8uaXNTdGF0aWN9YCwgYC0gbGlib3B1czogJHtpbmZvLm1ldGFkYXRhIS5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpfWBdLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgICdcXG4nLFxuICAgICAgICAgICAgJ0xvYWRlZCBFeHRyYWN0b3JzOicsXG4gICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlXG4gICAgICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5pZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpIHx8ICdOL0EnLFxuICAgICAgICAgICAgJ1xcblxcbmRpc2NvcmQtdm9pcCcsXG4gICAgICAgICAgICBnZW5lcmF0ZURlcGVuZGVuY3lSZXBvcnQoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiBkZXBzUmVwb3J0LmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLm5vZGVzLmNhY2hlLnZhbHVlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYFBsYXlsaXN0YCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQbGF5bGlzdChkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWxpc3QodGhpcywgZGF0YSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL21hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIocGxheWVyOiBQbGF5ZXIsIHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmICFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIG5vb3AgKi9cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdm9pZCBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRpc2Nvbm5lY3QsIHF1ZXVlKTtcbiAgICB9XG5cbiAgICBpZiAocXVldWUub3B0aW9ucy5wYXVzZU9uRW1wdHkpIHtcbiAgICAgICAgY29uc3QgaXNFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuXG4gICAgICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZCh0cnVlKTtcbiAgICAgICAgICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAocXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcGF1c2luZy4uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFJlZmxlY3QuZ2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JykpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgUmVmbGVjdC5zZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLmRlYnVnKCdWb2ljZSBjaGFubmVsIGlzIG5vdCBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcmVzdW1pbmcuLi4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zZXJ2ZXJNdXRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiYgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpIHtcbiAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnN1cHByZXNzKTtcbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgICAgIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICBpZiAocXVldWUuY29ubmVjdGlvbiAmJiBuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUuY29ubmVjdGlvbiAmJiAhVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAhPT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgaXAgZnJvbSAnaXAnO1xuXG5leHBvcnQgY2xhc3MgSVBCbG9jayB7XG4gICAgcHVibGljIHVzYWdlID0gMDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2lkcjogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBjaWRyU2l6ZTogbnVtYmVyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBibG9jazogc3RyaW5nKSB7XG4gICAgICAgIGlmIChpcC5pc1Y0Rm9ybWF0KGJsb2NrLnNwbGl0KCcvJylbMF0pICYmICFibG9jay5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgICBibG9jayArPSAnLzMyJztcbiAgICAgICAgfSBlbHNlIGlmIChpcC5pc1Y2Rm9ybWF0KGJsb2NrLnNwbGl0KCcvJylbMF0pICYmICFibG9jay5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgICBibG9jayArPSAnLzEyOCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNpZHIgPSBpcC5jaWRyKHRoaXMuYmxvY2spO1xuICAgICAgICB0aGlzLmNpZHJTaXplID0gaXAuY2lkclN1Ym5ldCh0aGlzLmJsb2NrKS5zdWJuZXRNYXNrTGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdW1lKCkge1xuICAgICAgICB0aGlzLnVzYWdlKys7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQUm90YXRpb25Db25maWcge1xuICAgIC8qKlxuICAgICAqIElQIGJsb2NrcyB0byB1c2VcbiAgICAgKi9cbiAgICBibG9ja3M6IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIElQcyB0byBleGNsdWRlXG4gICAgICovXG4gICAgZXhjbHVkZT86IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIE1heCByZXRyaWVzIHRvIGZpbmQgYW4gSVAgdGhhdCBpcyBub3QgZXhjbHVkZWRcbiAgICAgKi9cbiAgICBtYXhSZXRyaWVzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgSVBSb3RhdG9yIHtcbiAgICBwdWJsaWMgYmxvY2tzOiBJUEJsb2NrW10gPSBbXTtcbiAgICBwdWJsaWMgZmFpbHVyZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIHB1YmxpYyBNQVhfTkVYVF9SRVRSSUVTID0gMzA7XG4gICAgI3JldHJpZXMgPSAwO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb25maWc6IElQUm90YXRpb25Db25maWcpIHtcbiAgICAgICAgY29uZmlnLmV4Y2x1ZGUgPz89IFtdO1xuICAgICAgICB0aGlzLmJsb2NrcyA9IGNvbmZpZy5ibG9ja3MubWFwKChibG9jaykgPT4gbmV3IElQQmxvY2soYmxvY2spKTtcbiAgICAgICAgdGhpcy5NQVhfTkVYVF9SRVRSSUVTID0gY29uZmlnLm1heFJldHJpZXMgPz8gMTA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldElQKCk6IHsgaXA6IHN0cmluZzsgZmFtaWx5OiA0IHwgNiB9IHtcbiAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmJsb2Nrcy5zb3J0KChhLCBiKSA9PiBhLnVzYWdlIC0gYi51c2FnZSlbMF07XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gSVAgYmxvY2tzIGF2YWlsYWJsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZG9tID0gSVBSb3RhdG9yLmdldFJhbmRvbUlQKGJsb2NrLmNpZHIsIGJsb2NrLmNpZHJTaXplKTtcblxuICAgICAgICBpZiAodGhpcy5pc0ZhaWxlZE9yRXhjbHVkZWQocmFuZG9tKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3JldHJpZXMrKyA+IHRoaXMuTUFYX05FWFRfUkVUUklFUykge1xuICAgICAgICAgICAgICAgIHRoaXMuI3JldHJpZXMgPSAwO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgYW4gSVAgdGhhdCBpcyBub3QgZXhjbHVkZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SVAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI3JldHJpZXMgPSAwO1xuICAgICAgICBibG9jay5jb25zdW1lKCk7XG4gICAgICAgIHJldHVybiB7IGlwOiByYW5kb20sIGZhbWlseTogaXAuaXNWNEZvcm1hdChyYW5kb20pID8gNCA6IDYgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNGYWlsZWRPckV4Y2x1ZGVkKGlwOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZXMuaGFzKGlwKSB8fCAhIXRoaXMuY29uZmlnLmV4Y2x1ZGU/LmluY2x1ZGVzKGlwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmFpbGVkKGlwOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGFzdEZhaWxlZENvdW50ID0gdGhpcy5mYWlsdXJlcy5nZXQoaXApID8/IDA7XG5cbiAgICAgICAgdGhpcy5mYWlsdXJlcy5zZXQoaXAsIGxhc3RGYWlsZWRDb3VudCArIDEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmFuZG9tSVAoYWRkcmVzczogc3RyaW5nLCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKSB7XG4gICAgICAgIC8vIEF1dGhvcjogSmVzc2UgVGFuZSA8amVzc2UudGFuZUBnbWFpbC5jb20+XG4gICAgICAgIC8vIE5QTUpTOiBodHRwczovL25wbWpzLm9yZy9yYW5kb20taXBcblxuICAgICAgICBjb25zdCBieXRlcyA9IGlwLnRvQnVmZmVyKGFkZHJlc3MpO1xuICAgICAgICBjb25zdCBpcHY2ID0gYnl0ZXMubGVuZ3RoID09PSAxNjtcbiAgICAgICAgY29uc3QgYnl0ZXNpemUgPSA4O1xuXG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICAgICAgZW5kID0gdHlwZW9mIGVuZCAhPT0gJ3VuZGVmaW5lZCcgPyBlbmQgOiBieXRlcy5sZW5ndGggKiBieXRlc2l6ZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYml0ID0gaSAqIGJ5dGVzaXplO1xuXG4gICAgICAgICAgICBpZiAoYml0ICsgYnl0ZXNpemUgPCBzdGFydCB8fCBiaXQgPj0gZW5kKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBiID0gYnl0ZXNbaV07XG5cbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnl0ZXNpemU7IG4rKykge1xuICAgICAgICAgICAgICAgIGlmIChiaXQgPj0gc3RhcnQgJiYgYml0IDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpdHBvcyA9IGJ5dGVzaXplIC0gbiAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpdG1hc2sgPSAxIDw8IGJpdHBvcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCAwLjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgfD0gYml0bWFzaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgJj0gfmJpdG1hc2s7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYml0Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJ5dGVzW2ldID0gYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRldHMgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXB2Nikge1xuICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXRzW2kgPj4gMV0gPSAoKGJ5dGVzW2ldIDw8IGJ5dGVzaXplKSB8IGJ5dGVzW2kgKyAxXSkudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGV0c1tpXSA9IGJ5dGVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRldHMuam9pbihpcHY2ID8gJzonIDogJy4nKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmNvbnN0IHByZWZlcnJlZEluc3RhbmNlS2V5ID0gJ19fZGlzY29yZF9wbGF5ZXJfaG9va19pbnN0YW5jZV9jYWNoZV9fJztcblxuZXhwb3J0IGNvbnN0IGdldFBsYXllciA9ICgpID0+IHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmdldChwcmVmZXJyZWRJbnN0YW5jZUtleSkgfHwgaW5zdGFuY2VzLmZpcnN0KCkgfHwgbnVsbDtcbn07XG5cbi8qKlxuICogQmluZCBhIHBsYXllciBpbnN0YW5jZSB0byB0aGUgaG9vayBzeXN0ZW0sIGRlZmF1bHRzIHRvIHRoZSBmaXJzdCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGJpbmRIb29rID0gKHBsYXllcjogUGxheWVyKSA9PiB7XG4gICAgaW5zdGFuY2VzLnNldChwcmVmZXJyZWRJbnN0YW5jZUtleSwgcGxheWVyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRRdWV1ZSA9IDxUID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpID0+IHtcbiAgICBjb25zdCBwbGF5ZXIgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gKHBsYXllci5ub2Rlcy5yZXNvbHZlKG5vZGUpIGFzIEd1aWxkUXVldWU8VD4pIHx8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tEZWNsYXJhdGlvbkNvbnRleHQge1xuICAgIGdldFF1ZXVlOiB0eXBlb2YgZ2V0UXVldWU7XG4gICAgZ2V0UGxheWVyOiB0eXBlb2YgZ2V0UGxheWVyO1xuICAgIGluc3RhbmNlczogdHlwZW9mIGluc3RhbmNlcztcbn1cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IHR5cGUgSG9va0RlY2xhcmF0aW9uPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4gPSAoY29udGV4dDogSG9va0RlY2xhcmF0aW9uQ29udGV4dCkgPT4gVDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2s8VCBleHRlbmRzIEhvb2tEZWNsYXJhdGlvbjwoLi4uYXJnczogYW55W10pID0+IGFueT4+KGhvb2s6IFQpOiBSZXR1cm5UeXBlPFQ+IHtcbiAgICByZXR1cm4gaG9vayh7XG4gICAgICAgIGdldFF1ZXVlLFxuICAgICAgICBnZXRQbGF5ZXIsXG4gICAgICAgIGluc3RhbmNlc1xuICAgIH0pIGFzIFJldHVyblR5cGU8VD47XG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBoaXN0b3J5XG4gKiBAcGFyYW0gbm9kZSBndWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZS5oaXN0b3J5O1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBwbGF5ZXIgbm9kZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZS5ub2RlO1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlPE1ldGE+KG5vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHF1ZXVlO1xufVxuIiwgImltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgZ2V0UGxheWVyIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWFzdGVyUGxheWVyKCkge1xuICAgIFV0aWwud2FybigndXNlTWFzdGVyUGxheWVyKCkgaG9vayBpcyBkZXByZWNhdGVkLCB1c2UgdXNlTWFpblBsYXllcigpIGluc3RlYWQuJywgJ0RlcHJlY2F0aW9uV2FybmluZycpO1xuICAgIHJldHVybiB1c2VNYWluUGxheWVyKCk7XG59XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1haW5QbGF5ZXIoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OKCd1c2VNYWluUGxheWVyJywgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBjYWxsaW5nIFwidXNlTWFpblBsYXllclwiIGhvb2sgYmVmb3JlIGNyZWF0aW5nIGEgcGxheWVyIGluc3RhbmNlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbn1cbiIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGd1aWxkIHF1ZXVlIG1ldGFkYXRhXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8VD4obm9kZSk7XG4gICAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihtZXRhZGF0YSkpIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtnZXR0ZXIsIHNldHRlcl0gYXMgY29uc3Q7XG59XG4iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICAgIGlnbm9yZUZpbHRlcnM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRpbWVsaW5lIGRpc3BhdGNoZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG5vZGU6IE5vZGVSZXNvbHZhYmxlLCBvcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPikge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHtcbiAgICAgICAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChvcHRpb25zPy5pZ25vcmVGaWx0ZXJzKSE7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS52b2x1bWU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgdHJhY2soKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUuY3VycmVudFRyYWNrO1xuICAgICAgICB9LFxuICAgICAgICBwYXVzZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnBhdXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNlZWsodGltZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFmdGVyQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25CZWZvcmVDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQmVmb3JlQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufVxuIiwgImltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOID0gKHByZXZpb3VzOiBudW1iZXIpID0+IG51bWJlcjtcblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIHBsYXllciB2b2x1bWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZShub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUocXVldWUubm9kZS52b2x1bWUpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5ub2RlLnZvbHVtZSBhcyBudW1iZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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WUFBWSxlQUFlLGdCQUFBQSxPQUFVLHlDQUF5QyxPQUFPLG9DQUFvQztBQUNySTsiLAogICJuYW1lcyI6IFsiR3VpbGRRdWV1ZSIsICJpbXBvcnRfZGlzY29yZCIsICJ0YXJnZXQiLCAiU2VyaWFsaXplZFR5cGUiLCAiUGxheWVyRXZlbnQiLCAiUXVldWVSZXBlYXRNb2RlIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3N0cmVhbSIsICJ0YXJnZXQiLCAicXVlcnkiLCAiaW1wb3J0X3Byb21pc2VzIiwgImltcG9ydF9kaXNjb3JkIiwgInByaXNtIiwgIndhaXRGb3IiLCAib3B1cyIsICJpbXBvcnRfZXF1YWxpemVyIiwgInByaXNtIiwgIlRyYWNrU2tpcFJlYXNvbiIsICJ0YXJnZXQiLCAiR3VpbGRRdWV1ZSIsICJpbXBvcnRfdXRpbHMiLCAiR3VpbGRRdWV1ZSIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZmZtcGVnIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaXAiLCAiaGFuZGxlciIsICJyZXMiLCAicmVzdWx0IiwgImRWb2ljZVZlcnNpb24iLCAiZGpzVmVyc2lvbiIsICJoYW5kbGVyIiwgImhhbmRsZXIiLCAiaW1wb3J0X2VxdWFsaXplciIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImRqc1ZlcnNpb24iXQp9Cg==
|
|
5414
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy91dGlscy9VdGlsLnRzIiwgIi4uL3NyYy9mYWJyaWMvVHJhY2sudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL3NlcmRlLnRzIiwgIi4uL3NyYy9mYWJyaWMvUGxheWxpc3QudHMiLCAiLi4vc3JjL3R5cGVzL3R5cGVzLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkTm9kZU1hbmFnZXIudHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGRRdWV1ZS50cyIsICIuLi9zcmMvVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlci50cyIsICIuLi9zcmMvbWFuYWdlci9Wb2ljZVJlY2VpdmVyTm9kZS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlUGxheWVyTm9kZS50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlSZXNvbHZlci50cyIsICIuLi9zcmMvdXRpbHMvQXN5bmNRdWV1ZS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9GRm1wZWdTdHJlYW0udHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9fY29udGFpbmVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vYWRkUGxheWVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vY2xlYXJQbGF5ZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9nZXRQbGF5ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0R2xvYmFsUmVnaXN0cnkudHMiLCAiLi4vc3JjL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5Q2FjaGUudHMiLCAiLi4vc3JjL1BsYXllci50cyIsICIuLi9zcmMvRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyLnRzIiwgIi4uL3NyYy91dGlscy9JUFJvdGF0b3IudHMiLCAiLi4vc3JjL2hvb2tzL2NvbW1vbi50cyIsICIuLi9zcmMvaG9va3MvdXNlSGlzdG9yeS50cyIsICIuLi9zcmMvaG9va3MvdXNlUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VRdWV1ZS50cyIsICIuLi9zcmMvaG9va3MvdXNlTWFpblBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlTWV0YWRhdGEudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVRpbWVsaW5lLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25BZnRlckNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQmVmb3JlQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy91c2VWb2x1bWUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5leHBvcnQgKiBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vaG9va3MnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9JUFJvdGF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zZXJkZSc7XG5leHBvcnQge1xuICAgIEF1ZGlvRmlsdGVycyBhcyBQQ01BdWRpb0ZpbHRlcnMsXG4gICAgdHlwZSBCaXF1YWRGaWx0ZXJzLFxuICAgIEZpbHRlclR5cGUgYXMgQmlxdWFkRmlsdGVyVHlwZSxcbiAgICB0eXBlIFBDTUZpbHRlcnMsXG4gICAgUV9CVVRURVJXT1JUSCxcbiAgICBWb2x1bWVUcmFuc2Zvcm1lcixcbiAgICBCQVNTX0VRX0JBTkRTLFxuICAgIEFGX05JR0hUQ09SRV9SQVRFLFxuICAgIEFGX1ZBUE9SV0FWRV9SQVRFLFxuICAgIEZpbHRlcnNDaGFpblxufSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmV4cG9ydCB7IGNyZWF0ZUF1ZGlvUGxheWVyLCBBdWRpb1BsYXllciwgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbmV4cG9ydCBjb25zdCB2ZXJzaW9uOiBzdHJpbmcgPSAnNi42LjctZGV2LjAnO1xuXG5pZiAoIWRqc1ZlcnNpb24uc3RhcnRzV2l0aCgnMTQnKSkge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoYERpc2NvcmQuanMgdiR7ZGpzVmVyc2lvbn0gaXMgaW5jb21wYXRpYmxlIHdpdGggRGlzY29yZCBQbGF5ZXIgdiR7dmVyc2lvbn0hIFBsZWFzZSB1c2UgPj12MTQueCBvZiBEaXNjb3JkLmpzYCk7XG59XG4iLCAiaW1wb3J0IHsgRGVmYXVsdExpc3RlbmVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IExpc3RlbmVyU2lnbmF0dXJlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIFBsYXllckV2ZW50c0VtaXR0ZXI8TCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzIEV2ZW50RW1pdHRlcjxMPiB7XG4gICAgI2hhc0RlYnVnZ2VyID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgICAgICByZXR1cm4gc3VwZXIub2ZmKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgICAgIHJldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVyczxLIGV4dGVuZHMga2V5b2YgTD4obmFtZT86IEspIHtcbiAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUFsbExpc3RlbmVycyhuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgLi4uYXJnczogUGFyYW1ldGVyczxMW0tdPikge1xuICAgICAgICBpZiAodGhpcy5yZXF1aXJlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSAmJiAhdGhpcy5ldmVudE5hbWVzKCkuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICAgICAgIGBObyBldmVudCBsaXN0ZW5lciBmb3VuZCBmb3IgZXZlbnQgXCIke1N0cmluZyhuYW1lKX1cIi4gRXZlbnRzICR7dGhpcy5yZXF1aXJlZEV2ZW50cy5tYXAoKG0pID0+IGBcIiR7U3RyaW5nKG0pfVwiYCkuam9pbignLCAnKX0gbXVzdCBoYXZlIGV2ZW50IGxpc3RlbmVycy5gLFxuICAgICAgICAgICAgICAgICdVbmhhbmRsZWRFdmVudHNXYXJuaW5nJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5lbWl0KG5hbWUsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNoYXNEZWJ1Z2dlcjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFRpbWVEYXRhIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdjcnlwdG8nO1xuXG5jbGFzcyBVdGlsIHtcbiAgICAvKipcbiAgICAgKiBVdGlsc1xuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZHVyT2JqIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkdXJhdGlvblN0cmluZyhkdXJPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gKGlzTmFOKG0pID8gMCA6IG0pKVxuICAgICAgICAgICAgLmpvaW4oJzonKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIFRoZSB0aW1lIGluIG1zXG4gICAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZU1TKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgICAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlzOiByb3VuZChtaWxsaXNlY29uZHMgLyA4NjQwMDAwMCksXG4gICAgICAgICAgICBob3Vyczogcm91bmQobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDYwMDAwKSAlIDYwLFxuICAgICAgICAgICAgc2Vjb25kczogcm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCkgJSA2MFxuICAgICAgICB9IGFzIFRpbWVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLmZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLm1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgICAgICBjb25zdCBmaW5hbCA9IHBhcnNlZFxuICAgICAgICAgICAgLnNsaWNlKHBhcnNlZC5maW5kSW5kZXgoKHgpID0+IHggIT09IDApKVxuICAgICAgICAgICAgLm1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpO1xuXG4gICAgICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgbGFzdDxUID0gYW55PihhcnI6IFRbXSk6IFQge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICAgICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhZmVyIHJlcXVpcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgICAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vP1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgZGV0YWlsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICAgICAgcmV0dXJuIHNyY1tyYW5kb21JbnQoc3JjLmxlbmd0aCldO1xuICAgIH1cblxuICAgIHN0YXRpYyBhcnJheUNsb25lU2h1ZmZsZTxUPihzcmM6IFRbXSk6IFRbXSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHNyYy5zbGljZSgpO1xuXG4gICAgICAgIGxldCBtID0gYXJyLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAobSkge1xuICAgICAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG0tLSk7XG4gICAgICAgICAgICBbYXJyW21dLCBhcnJbaV1dID0gW2FycltpXSwgYXJyW21dXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKHF1ZXVlOiBHdWlsZFF1ZXVlLCBpdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10pID0+IHtcbiAgICBjb25zdCB0cmFja3MgPSBpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gaXRlbXMudHJhY2tzIDogQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtpdGVtc107XG5cbiAgICBpZiAocXVldWUubWF4U2l6ZSA8IDEgfHwgcXVldWUubWF4U2l6ZSA9PT0gSW5maW5pdHkpIHJldHVybjtcblxuICAgIGNvbnN0IG1heENhcCA9IHF1ZXVlLmdldENhcGFjaXR5KCk7XG5cbiAgICBpZiAobWF4Q2FwIDwgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfU1BBQ0UoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzLmxlbmd0aCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgVXRpbCB9O1xuIiwgImltcG9ydCB7IFVzZXIsIGVzY2FwZU1hcmtkb3duLCBTbm93Zmxha2VVdGlsLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIEFQSVVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFJhd1RyYWNrRGF0YSwgU2VhcmNoUXVlcnlUeXBlLCBUcmFja0pTT04gfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXIvR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgV2l0aE1ldGFkYXRhPFQgZXh0ZW5kcyBvYmplY3QsIE0+ID0gVCAmIHtcbiAgICBtZXRhZGF0YTogTTtcbiAgICByZXF1ZXN0TWV0YWRhdGEoKTogUHJvbWlzZTxNPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjayA9IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHZpZXdzOiBudW1iZXI7XG4gICAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gICAgcHVibGljIHF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGw7XG4gICAgcHVibGljIHJhdzogUmF3VHJhY2tEYXRhID0ge1xuICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknXG4gICAgfSBhcyBSYXdUcmFja0RhdGE7XG4gICAgcHVibGljIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX19yZXFNZXRhZGF0YUZuOiAoKSA9PiBQcm9taXNlPFQgfCBudWxsPjtcblxuICAgIC8qKlxuICAgICAqIFRyYWNrIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgVHJhY2tcbiAgICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllciwgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pIHtcbiAgICAgICAgdGhpcy50aXRsZSA9IGVzY2FwZU1hcmtkb3duKGRhdGEudGl0bGUgPz8gJycpO1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yID8/ICcnO1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsID8/ICcnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbiA/PyAnJztcbiAgICAgICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICAgICAgdGhpcy5xdWVyeVR5cGUgPSBkYXRhLnF1ZXJ5VHlwZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ZWRCeSA9IGRhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gICAgICAgIHRoaXMucmF3ID0gT2JqZWN0LmFzc2lnbih7fSwgeyBzb3VyY2U6IGRhdGEucmF3Py5zb3VyY2UgPz8gZGF0YS5zb3VyY2UgfSwgZGF0YS5yYXcgPz8gZGF0YSk7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGEgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPSBkYXRhLnJlcXVlc3RNZXRhZGF0YSB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlPFQgfCBudWxsPihudWxsKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0TWV0YWRhdGEoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICAgICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YSAhPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZSBpbiB3aGljaCB0aGlzIHRyYWNrIGlzIGxvY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT4gcS50cmFja3Muc29tZSgoYWIpID0+IGFiLmlkID09PSB0aGlzLmlkKSkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25NUygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IHRuID0gMTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZHVyYXRpb25cbiAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAubWFwKChtLCBpKSA9PiBwYXJzZUludChtKSAqIHRpbWVzKDYwLCBpKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb3JkIGh5cGVybGluayByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHRvSHlwZXJsaW5rKCk6IHN0cmluZyAvKiBub3QgdXNpbmcgYFske3N0cmluZ31dKCR7c3RyaW5nfSlgIHlldCAqLyB7XG4gICAgICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJhdyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKGhpZGVQbGF5bGlzdD86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgICAgICB9IGFzIFRyYWNrSlNPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVkIHRyYWNrIGRhdGEgdGhhdCBjYW4gYmUgcmVjb25zdHJ1Y3RlZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/IHRoaXMudGh1bWJuYWlsIDogdHJ5SW50b1RodW1ibmFpbFN0cmluZyh0aGlzLnRodW1ibmFpbCksXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHZpZXdzOiB0aGlzLnZpZXdzID8/IDAsXG4gICAgICAgICAgICByZXF1ZXN0ZWRfYnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpID8/IG51bGwsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBxdWVyeV90eXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogdGhpcy5leHRyYWN0b3I/LmlkZW50aWZpZXIgPz8gbnVsbCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlRyYWNrLFxuICAgICAgICAgICAgJGVuY29kZXJfdmVyc2lvbjogJzYuNi43LWRldi4wJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIHRyYWNrIGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAgICogQHBhcmFtIHBsYXllciBQbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21TZXJpYWxpemVkKHBsYXllcjogUGxheWVyLCBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pIHtcbiAgICAgICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlRyYWNrKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdkYXRhJywgJ1NlcmlhbGl6ZWRUcmFjaycsICdtYWxmb3JtZWQgZGF0YScpO1xuICAgICAgICBjb25zdCB0cmFjayA9IG5ldyBUcmFjayhwbGF5ZXIsIHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogZGF0YS5yZXF1ZXN0ZWRfYnlcbiAgICAgICAgICAgICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gZGF0YS5yZXF1ZXN0ZWRfYnkgYXMgQVBJVXNlcjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHBsYXllci5jbGllbnQudXNlcnMucmVzb2x2ZShyZXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpIHJldHVybiBwbGF5ZXIuY2xpZW50LnVzZXJzLmNhY2hlLmdldChyZXMuaWQpITtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pKClcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBxdWVyeVR5cGU6IGRhdGEucXVlcnlfdHlwZSA/PyB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJhY2suc2V0TWV0YWRhdGEoZGF0YS5tZXRhZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiZWxvbmdpbmcgcXVldWVzIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT4gbm9kZS50cmFja3Muc29tZSgodCkgPT4gdC5pZCA9PT0gdGhpcy5pZCkpO1xuXG4gICAgICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyB0cmFjayBzaGFsbCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPik6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBUeXBlVXRpbCB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcmV0dXJuIFR5cGVVdGlsO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgcHVibGljIHN0YXRpYyBpc0Z1bmN0aW9uKHQ6IHVua25vd24pOiB0IGlzIEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1N0cmluZyh0OiB1bmtub3duKTogdCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNCb29sZWFuKHQ6IHVua25vd24pOiB0IGlzIGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdib29sZWFuJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHQgPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQXJyYXkodDogdW5rbm93bik6IHQgaXMgdW5rbm93bltdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0Vycm9yKHQ6IHVua25vd24pOiB0IGlzIEVycm9yIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcjtcbiAgICB9XG59XG4iLCAiY29uc3QgRGlzY29yZFBsYXllckVycm9ycyA9IHtcbiAgICBFUlJfT1VUX09GX1NQQUNFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfT1VUX09GX1NQQUNFJyxcbiAgICAgICAgdHlwZTogUmFuZ2VFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGNhcGFjaXR5OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgICAgICAgdHlwZTogVHlwZUVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgZXhwZWN0YXRpb246IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBFeHBlY3RlZCAke3RhcmdldH0gdG8gYmUgXCIke2V4cGVjdGF0aW9ufVwiLCByZWNlaXZlZCBcIiR7Zm91bmR9XCJgO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fUkVTVUxUOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fUkVTVUxUJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke21lc3NhZ2V9YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PVF9JTVBMRU1FTlRFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT1RfRVhJU1RJTkc6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gJHt0YXJnZXR9IGRvZXMgbm90IGV4aXN0YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX09VVF9PRl9SQU5HRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gICAgICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtaW5pbXVtOiBzdHJpbmcsIG1heGltdW06IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWF4aW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcigpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArICdDYW5ub3QgdXNlIGRlc3Ryb3llZCB2b2ljZSBjb25uZWN0aW9uJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgJ0V4cGVjdGVkIGEgdm9pY2UgY2hhbm5lbCc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19SRUNFSVZFUjoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdObyB2b2ljZSByZWNlaXZlciBpcyBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfRkZNUEVHX0xPQ0FUT1I6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9GRk1QRUdfTE9DQVRPUicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19BVURJT19SRVNPVVJDRToge1xuICAgICAgICBuYW1lOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdFeHBlY3RlZCBhbiBhdWRpbyByZXNvdXJjZScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTERfUVVFVUU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRF9RVUVVRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTEQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCcpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5GT19SRVFVSVJFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX0lORk9fUkVRVUlSRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMubmFtZX1dIEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX1NFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XWAgKyBcIkRvbid0IGtub3cgaG93IHRvIHNlcmlhbGl6ZSB0aGlzIGRhdGFcIjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XWAgKyBcIkRvbid0IGtub3cgaG93IHRvIGRlc2VyaWFsaXplIHRoaXMgZGF0YVwiO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT046IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLm5hbWV9XSBgICsgYElsbGVnYWwgaW52b2NhdGlvbiBvZiAke3RhcmdldH0gaG9vay4ke21lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJyd9YDtcbiAgICAgICAgfVxuICAgIH1cbn0gYXMgY29uc3Q7XG5cbnR5cGUgRmluYWxFeGNlcHRpb248TyBleHRlbmRzICh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylba2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnNdPiA9IHtcbiAgICBuYW1lOiBPWyduYW1lJ107XG59ICYgSW5zdGFuY2VUeXBlPE9bJ3R5cGUnXT47XG5cbnR5cGUgRGlzY29yZFBsYXllckV4Y2VwdGlvbiA9IHtcbiAgICBbSyBpbiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc106ICguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ2NyZWF0ZUVycm9yJ10+KSA9PiBGaW5hbEV4Y2VwdGlvbjwodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdPjtcbn07XG5cbmNvbnN0IHRhcmdldCA9IHt9IGFzIERpc2NvcmRQbGF5ZXJFeGNlcHRpb247XG5cbmNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjx0eXBlb2YgdGFyZ2V0PiA9IHtcbiAgICBnZXQodGFyZ2V0LCBwOiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycywgcmVjZWl2ZXIpIHtcbiAgICAgICAgY29uc3QgZXJyID0gRGlzY29yZFBsYXllckVycm9yc1twXTtcblxuICAgICAgICBpZiAoIWVycikgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuXG4gICAgICAgIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIGVycilbJ2NyZWF0ZUVycm9yJ10+KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgZXJyLnR5cGUoZXJyLmNyZWF0ZUVycm9yKC4uLmFyZ3MpKTtcbiAgICAgICAgICAgIGV4Y2VwdGlvbi5uYW1lID0gZXJyLm5hbWU7XG5cbiAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEVycm9yQ29kZXMgPSAoKCkgPT4ge1xuICAgIHR5cGUgRXJyQ29kZXMgPSB7XG4gICAgICAgIC1yZWFkb25seSBbSyBpbiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc106ICh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ25hbWUnXTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGljdCA9IHt9IGFzIEVyckNvZGVzO1xuXG4gICAgZm9yIChjb25zdCBwcm9wIGluIERpc2NvcmRQbGF5ZXJFcnJvcnMpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBkaWN0W3Byb3BdID0gcHJvcDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShkaWN0KTtcbn0pKCk7XG5leHBvcnQgY29uc3QgRXhjZXB0aW9ucyA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgdHlwZSBTZXJpYWxpemVkVHJhY2ssIFRyYWNrLCBTZXJpYWxpemVkUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgZW51bSBTZXJpYWxpemVkVHlwZSB7XG4gICAgVHJhY2sgPSAndHJhY2snLFxuICAgIFBsYXlsaXN0ID0gJ3BsYXlsaXN0J1xufVxuXG5leHBvcnQgdHlwZSBFbmNvZGFibGUgPSBTZXJpYWxpemVkVHJhY2sgfCBTZXJpYWxpemVkUGxheWxpc3Q7XG5cbmNvbnN0IGlzVHJhY2sgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkVHJhY2sgPT4gZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+IGRhdGEuJHR5cGUgPT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFRyYWNrIHwgUGxheWxpc3QgfCBhbnkpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFRyYWNrKSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFBsYXlsaXN0KSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSlNPTigpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKHBsYXllcjogUGxheWVyLCBkYXRhOiBFbmNvZGFibGUpIHtcbiAgICBpZiAoaXNUcmFjayhkYXRhKSkgcmV0dXJuIFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG4gICAgaWYgKGlzUGxheWxpc3QoZGF0YSkpIHJldHVybiBQbGF5bGlzdC5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIGRhdGEpO1xuXG4gICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKGRhdGE6IEVuY29kYWJsZSkge1xuICAgIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IHN0ciA9IEJ1ZmZlci5mcm9tKGRhdGEsICdiYXNlNjQnKS50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUludG9UaHVtYm5haWxTdHJpbmcoZGF0YTogYW55KSB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNTdHJpbmcoZGF0YSkpIHJldHVybiBkYXRhO1xuICAgICAgICByZXR1cm4gZGF0YT8udXJsID8/IGRhdGE/LnRodW1ibmFpbD8udXJsID8/IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgUGxheWxpc3RJbml0RGF0YSwgUGxheWxpc3RKU09OLCBUcmFja0pTT04sIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQbGF5bGlzdCA9IFJldHVyblR5cGU8UGxheWxpc3RbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGNsYXNzIFBsYXlsaXN0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG4gICAgcHVibGljIHRyYWNrczogVHJhY2tbXTtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIHB1YmxpYyBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIHB1YmxpYyBhdXRob3I6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG4gICAgLyoqXG4gICAgICogUGxheWxpc3QgY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0ge1BsYXlsaXN0SW5pdERhdGF9IGRhdGEgVGhlIGRhdGFcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXllclxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNwbGF5ZXJcbiAgICAgICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRyYWNrcyBpbiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3RyYWNrc1xuICAgICAgICAgKiBAdHlwZSB7VHJhY2tbXX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJhY2tzID0gZGF0YS50cmFja3MgPz8gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3Igb2YgdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNhdXRob3JcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3I7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNkZXNjcmlwdGlvblxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aHVtYm5haWwgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0aHVtYm5haWxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOlxuICAgICAgICAgKiAtIGBhbGJ1bWBcbiAgICAgICAgICogLSBgcGxheWxpc3RgXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3R5cGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNvdXJjZSBvZiB0aGlzIHBsYXlsaXN0OlxuICAgICAgICAgKiAtIGB5b3V0dWJlYFxuICAgICAgICAgKiAtIGBzb3VuZGNsb3VkYFxuICAgICAgICAgKiAtIGBzcG90aWZ5YFxuICAgICAgICAgKiAtIGBhcmJpdHJhcnlgXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3NvdXJjZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2lkXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5pZDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN1cmxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3Jhd1BsYXlsaXN0XG4gICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICB9XG5cbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnRyYWNrcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5yZWR1Y2UoKHAsIGMpID0+IHAgKyBjLmR1cmF0aW9uTVMsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCBlc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoVHJhY2tzPXRydWVdIElmIGl0IHNob3VsZCBidWlsZCBqc29uIHdpdGggdHJhY2tzXG4gICAgICogQHJldHVybnMge1BsYXlsaXN0SlNPTn1cbiAgICAgKi9cbiAgICB0b0pTT04od2l0aFRyYWNrcyA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB0cmFja3M6IFtdIGFzIFRyYWNrSlNPTltdXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHdpdGhUcmFja3MpIHBheWxvYWQudHJhY2tzID0gdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhY2tzOiB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0uc2VyaWFsaXplKCkpLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID8gdGhpcy50aHVtYm5haWwgOiB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0LFxuICAgICAgICAgICAgJGVuY29kZXJfdmVyc2lvbjogJzYuNi43LWRldi4wJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIHRoaXMgcGxheWxpc3QgZnJvbSBzZXJpYWxpemVkIGRhdGFcbiAgICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFNlcmlhbGl6ZWRQbGF5bGlzdCkge1xuICAgICAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuUGxheWxpc3QpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2RhdGEnLCAnU2VyaWFsaXplZFBsYXlsaXN0JywgJ21hbGZvcm1lZCBkYXRhJyk7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWxpc3QocGxheWVyLCB7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgdHJhY2tzOiBkYXRhLnRyYWNrcy5tYXAoKG0pID0+IFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgbSkpXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhpcyBwbGF5bGlzdCB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyBwbGF5bGlzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgcGxheWxpc3Qgc2hhbGwgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVzZXIsIFVzZXJSZXNvbHZhYmxlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHR5cGUgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgdHlwZSB7IGRvd25sb2FkT3B0aW9ucyB9IGZyb20gJ3l0ZGwtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHR5cGUgeyBJUFJvdGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvSVBSb3RhdG9yJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHR5cGUgeyBCcmlkZ2VQcm92aWRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJzTmFtZSA9IGtleW9mIFF1ZXVlRmlsdGVycztcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJTZWFyY2hSZXN1bHQge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICAgIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICAgIGJhc3Nib29zdD86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAgICc4RCc/OiBib29sZWFuO1xuICAgIHZhcG9yd2F2ZT86IGJvb2xlYW47XG4gICAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgICBwaGFzZXI/OiBib29sZWFuO1xuICAgIHRyZW1vbG8/OiBib29sZWFuO1xuICAgIHZpYnJhdG8/OiBib29sZWFuO1xuICAgIHJldmVyc2U/OiBib29sZWFuO1xuICAgIHRyZWJsZT86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICAgIHN1cnJvdW5kaW5nPzogYm9vbGVhbjtcbiAgICBwdWxzYXRvcj86IGJvb2xlYW47XG4gICAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICAgIGthcmFva2U/OiBib29sZWFuO1xuICAgIGZsYW5nZXI/OiBib29sZWFuO1xuICAgIGdhdGU/OiBib29sZWFuO1xuICAgIGhhYXM/OiBib29sZWFuO1xuICAgIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgICBtb25vPzogYm9vbGVhbjtcbiAgICBtc3Rscj86IGJvb2xlYW47XG4gICAgbXN0cnI/OiBib29sZWFuO1xuICAgIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICAgIGV4cGFuZGVyPzogYm9vbGVhbjtcbiAgICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gICAgY2hvcnVzPzogYm9vbGVhbjtcbiAgICBjaG9ydXMyZD86IGJvb2xlYW47XG4gICAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICAgIGZhZGVpbj86IGJvb2xlYW47XG4gICAgZGltPzogYm9vbGVhbjtcbiAgICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgICBsb2ZpPzogYm9vbGVhbjtcbiAgICBzaWxlbmNlcmVtb3ZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPSAnc291bmRjbG91ZCcgfCAneW91dHViZScgfCAnc3BvdGlmeScgfCAnYXBwbGVfbXVzaWMnIHwgJ2FyYml0cmFyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF3VHJhY2tEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uXG4gICAgICovXG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICAgKi9cbiAgICB2aWV3czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0XG4gICAgICovXG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgICAvKipcbiAgICAgKiBUaGUgc291cmNlXG4gICAgICovXG4gICAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZ2luZVxuICAgICAqL1xuICAgIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gICAgICovXG4gICAgbGl2ZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkYXRhXG4gICAgICovXG4gICAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgdHlwZVxuICAgICAqL1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGltZSBpbiBkYXlzXG4gICAgICovXG4gICAgZGF5czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gaG91cnNcbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gbWludXRlc1xuICAgICAqL1xuICAgIG1pbnV0ZXM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIHNlY29uZHNcbiAgICAgKi9cbiAgICBzZWNvbmRzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgcmVuZGVyIHRpbWUgY29kZXNcbiAgICAgKi9cbiAgICB0aW1lY29kZXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICAgKi9cbiAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGJhciBsZW5ndGhcbiAgICAgKi9cbiAgICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWxhcHNlZCB0aW1lIHRyYWNrXG4gICAgICovXG4gICAgcmlnaHRDaGFyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgICAqL1xuICAgIHNlcGFyYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRpbWVzdGFtcCBhbmQgbGluZVxuICAgICAqL1xuICAgIGluZGljYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kaWNhdG9yXG4gICAgICovXG4gICAgcXVldWU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICAgIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICAgIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gICAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gICAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gICAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgICBWSU1FTzogJ3ZpbWVvJyxcbiAgICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICAgIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gICAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICAgIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gICAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICAgIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgICBGSUxFOiAnZmlsZScsXG4gICAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gYW55O1xufVxuXG5leHBvcnQgZW51bSBQbGF5ZXJFdmVudCB7XG4gICAgZGVidWcgPSAnZGVidWcnLFxuICAgIGVycm9yID0gJ2Vycm9yJyxcbiAgICB2b2ljZVN0YXRlVXBkYXRlID0gJ3ZvaWNlU3RhdGVVcGRhdGUnXG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICAgKi9cbiAgICBmaWx0ZXJzVXBkYXRlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBGRm1wZWcgYXJncyBwYXNzZWQgdG8gZW5jb2RlclxuICAgICAqL1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogVGltZSB0byBzZWVrIHRvIGJlZm9yZSBwbGF5aW5nXG4gICAgICovXG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICAgKi9cbiAgICBpbW1lZGlhdGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBRdWVyeUV4dHJhY3RvclNlYXJjaCA9IGBleHQ6JHtzdHJpbmd9YDtcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgc2VhcmNoIGVuZ2luZSwgY2FuIGJlIGV4dHJhY3RvciBuYW1lIHRvIHRhcmdldCBzcGVjaWZpYyBvbmUgKGN1c3RvbSlcbiAgICAgKi9cbiAgICBzZWFyY2hFbmdpbmU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAgICovXG4gICAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAgICAgKi9cbiAgICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogRmFsbGJhY2sgc2VhcmNoIGVuZ2luZSB0byB1c2VcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJlcXVlc3RPcHRpb25zPzogYW55O1xuICAgIC8qKlxuICAgICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAgICovXG4gICAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbi8qKlxuICogVGhlIHF1ZXVlIHJlcGVhdCBtb2RlLiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIE9GRlxuICogLSBUUkFDS1xuICogLSBRVUVVRVxuICogLSBBVVRPUExBWVxuICovXG5leHBvcnQgZW51bSBRdWV1ZVJlcGVhdE1vZGUge1xuICAgIC8qKlxuICAgICAqIERpc2FibGUgcmVwZWF0IG1vZGUuXG4gICAgICovXG4gICAgT0ZGID0gMCxcbiAgICAvKipcbiAgICAgKiBSZXBlYXQgdGhlIGN1cnJlbnQgdHJhY2suXG4gICAgICovXG4gICAgVFJBQ0sgPSAxLFxuICAgIC8qKlxuICAgICAqIFJlcGVhdCB0aGUgZW50aXJlIHF1ZXVlLlxuICAgICAqL1xuICAgIFFVRVVFID0gMixcbiAgICAvKipcbiAgICAgKiBXaGVuIGxhc3QgdHJhY2sgZW5kcywgcGxheSBzaW1pbGFyIHRyYWNrcyBpbiB0aGUgZnV0dXJlIGlmIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEFVVE9QTEFZID0gM1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SW5pdERhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHRyYWNrczogVHJhY2tbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbFxuICAgICAqL1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgICAqL1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBzb3VyY2VcbiAgICAgKi9cbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICAgKi9cbiAgICBhdXRob3I6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgICAgICovXG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBwbGF5bGlzdCBkYXRhXG4gICAgICovXG4gICAgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGlkXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGR1cmF0aW9uXG4gICAgICovXG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbXNcbiAgICAgKi9cbiAgICBkdXJhdGlvbk1TOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIHZpZXdzXG4gICAgICovXG4gICAgdmlld3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBpZCB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICByZXF1ZXN0ZWRCeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gICAgICovXG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RKU09OIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbFxuICAgICAqL1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgICAqL1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBzb3VyY2VcbiAgICAgKi9cbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICAgKi9cbiAgICBhdXRob3I6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgICAgICovXG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrcyBkYXRhIChpZiBhbnkpXG4gICAgICovXG4gICAgdHJhY2tzOiBUcmFja0pTT05bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgcGFzc2VkIHRvIGB5dGRsLWNvcmVgLlxuICAgICAqL1xuICAgIHl0ZGxPcHRpb25zPzogZG93bmxvYWRPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIHRpbWVvdXRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAgICAgKi9cbiAgICBsYWdNb25pdG9yPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICAgKi9cbiAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHF1ZXJ5aW5nIG1ldGFkYXRhIGZyb21cbiAgICAgKi9cbiAgICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICAgICAqL1xuICAgIGJsb2NrU3RyZWFtRnJvbT86IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElnbm9yZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBpZ25vcmVJbnN0YW5jZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVXNlIGxlZ2FjeSB2ZXJzaW9uIG9mIGZmbXBlZ1xuICAgICAqL1xuICAgIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU2V0IGJyaWRnZSBwcm92aWRlclxuICAgICAqL1xuICAgIGJyaWRnZVByb3ZpZGVyPzogQnJpZGdlUHJvdmlkZXI7XG4gICAgLyoqXG4gICAgICogSVAgcm90YXRvciBjb25maWdcbiAgICAgKi9cbiAgICBpcGNvbmZpZz86IElQUm90YXRpb25Db25maWc7XG4gICAgLyoqXG4gICAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAgICovXG4gICAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2JlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA1MDAwLlxuICAgICAqL1xuICAgIHByb2JlVGltZW91dD86IG51bWJlcjtcbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBRdWVyeUV4dHJhY3RvclNlYXJjaCwgUXVlcnlUeXBlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHREYXRhIHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgICBleHRyYWN0b3I/OiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M/OiBUcmFja1tdO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHByaXZhdGUgX2RhdGE6IFNlYXJjaFJlc3VsdERhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFF1ZXJ5VHlwZSh0eXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCkge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZXF1ZXN0ZWRCeSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrcyByZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyYWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RlZCBieVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmUtZXhlY3V0ZSB0aGlzIHNlYXJjaFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgICAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9GaWx0ZXJzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgICAgIGJhc3Nib29zdF9sb3c6IGJhc3MoMTUpLFxuICAgICAgICBiYXNzYm9vc3Q6IGJhc3MoMjApLFxuICAgICAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgICAgICc4RCc6ICdhcHVsc2F0b3I9aHo9MC4wOScsXG4gICAgICAgIHZhcG9yd2F2ZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjgnLFxuICAgICAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgICAgIGxvZmk6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC45LGV4dHJhc3RlcmVvPW09Mi41OmM9ZGlzYWJsZWQnLFxuICAgICAgICBwaGFzZXI6ICdhcGhhc2VyPWluX2dhaW49MC40JyxcbiAgICAgICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgICAgICB2aWJyYXRvOiAndmlicmF0bz1mPTYuNScsXG4gICAgICAgIHJldmVyc2U6ICdhcmV2ZXJzZScsXG4gICAgICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgICAgICBub3JtYWxpemVyMjogJ2R5bmF1ZG5vcm09Zz0xMDEnLFxuICAgICAgICBub3JtYWxpemVyOiAnYWNvbXByZXNzb3InLFxuICAgICAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICAgICAgcHVsc2F0b3I6ICdhcHVsc2F0b3I9aHo9MScsXG4gICAgICAgIHN1YmJvb3N0OiAnYXN1YmJvb3N0JyxcbiAgICAgICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgICAgIGZsYW5nZXI6ICdmbGFuZ2VyJyxcbiAgICAgICAgZ2F0ZTogJ2FnYXRlJyxcbiAgICAgICAgaGFhczogJ2hhYXMnLFxuICAgICAgICBtY29tcGFuZDogJ21jb21wYW5kJyxcbiAgICAgICAgbW9ubzogJ3Bhbj1tb25vfGMwPS41KmMwKy41KmMxJyxcbiAgICAgICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICAgICAgbXN0cnI6ICdzdGVyZW90b29scz1tb2RlPW1zPnJyJyxcbiAgICAgICAgY29tcHJlc3NvcjogJ2NvbXBhbmQ9cG9pbnRzPS04MC8tMTA1fC02Mi8tODB8LTE1LjQvLTE1LjR8MC8tMTJ8MjAvLTcuNicsXG4gICAgICAgIGV4cGFuZGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tMTY5fC01NC8tODB8LTQ5LjUvLTY0LjZ8LTQxLjEvLTQxLjF8LTI1LjgvLTE1fC0xMC44Ly00LjV8MC8wfDIwLzguMycsXG4gICAgICAgIHNvZnRsaW1pdGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgICAgICBjaG9ydXM6ICdjaG9ydXM9MC43OjAuOTo1NTowLjQ6MC4yNToyJyxcbiAgICAgICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgICAgICBmYWRlaW46ICdhZmFkZT10PWluOnNzPTA6ZD0xMCcsXG4gICAgICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgICAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnLFxuICAgICAgICBzaWxlbmNlcmVtb3ZlOiAnc2lsZW5jZXJlbW92ZT0xOjA6LTUwZEInXG4gICAgfTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXM8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHsgbmFtZTogRmlsdGVyc05hbWU7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpbHRlcnMpKSB7XG4gICAgICAgICAgICB5aWVsZCB7IG5hbWU6IGsgYXMgRmlsdGVyc05hbWUsIHZhbHVlOiB2IGFzIHN0cmluZyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgbmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpIGFzIEZpbHRlcnNOYW1lW107XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLm1hcCgobSkgPT4gKHRoaXMgYXMgYW55KVttXSkuam9pbignLCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIGFyZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbHRlcnMgbmFtZVxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciBuYW1lXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KGZpbHRlcnM/OiBLW10pIHtcbiAgICAgICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gZmlsdGVyc1xuICAgICAgICAgICAgLmZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IHRoaXMuZ2V0KG0pKVxuICAgICAgICAgICAgLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGF1ZGlvIGZpbHRlclxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmUoZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyc1tmaWx0ZXJOYW1lIGFzIEZpbHRlcnNOYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbXVsdGlwbGUgYXVkaW8gZmlsdGVyc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJzQXJyYXkgQXJyYXkgb2YgZmlsdGVycyBjb250YWluaW5nIHRoZSBmaWx0ZXIgbmFtZSBhbmQgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZUJ1bGsoZmlsdGVyc0FycmF5OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pIHtcbiAgICAgICAgZmlsdGVyc0FycmF5LmZvckVhY2goKGFycikgPT4gdGhpcy5kZWZpbmUoYXJyLm5hbWUsIGFyci52YWx1ZSkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vbWFuYWdlcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclN0cmVhbWFibGUgPVxuICAgIHwgUmVhZGFibGVcbiAgICB8IHN0cmluZ1xuICAgIHwge1xuICAgICAgICAgICRmbXQ6IHN0cmluZztcbiAgICAgICAgICBzdHJlYW06IFJlYWRhYmxlO1xuICAgICAgfTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpZGVudGlmaWVyID0gJ2NvbS5kaXNjb3JkLXBsYXllci5leHRyYWN0b3InO1xuXG4gICAgLyoqXG4gICAgICogUHJpb3JpdHkgb2YgdGhpcyBleHRyYWN0b3IuIEhpZ2hlciB2YWx1ZSBtZWFucyBoaWdoZXIgcHJpb3JpdHkgKHdpbGwgYmUgZXhlY3V0ZWQgZmlyc3QpLlxuICAgICAqL1xuICAgIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcXVlcnkgcHJvdG9jb2xzIHRoYXQgdGhpcyBleHRyYWN0b3Igc3VwcG9ydHMuXG4gICAgICovXG4gICAgcHVibGljIHByb3RvY29sczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJ1aWxkIHF1ZXJ5IGZvclxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+IGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdG9yIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBwdWJsaWMgb3B0aW9uczogVCA9IDxUPnt9KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCYXNlRXh0cmFjdG9yKS5pZGVudGlmaWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29uZmlndXJlcyB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWNvbmZpZ3VyZShvcHRpb25zOiBUKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgICAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBpbmNvbWluZyBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUocXVlcnk6IHN0cmluZywgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdm9pZCB0eXBlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc3RyZWFtKGluZm86IFRyYWNrKTogUHJvbWlzZTxFeHRyYWN0b3JTdHJlYW1hYmxlPiB7XG4gICAgICAgIHZvaWQgaW5mbztcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uc3RyZWFtKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIGdpdmVuIHF1ZXJ5XG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKHF1ZXJ5OiBzdHJpbmcsIGNvbnRleHQ6IEV4dHJhY3RvclNlYXJjaENvbnRleHQpOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICAgICAgdm9pZCBjb250ZXh0O1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5oYW5kbGUoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGVkIHRyYWNrcyBmb3IgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayBzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRlZFRyYWNrcyh0cmFjazogVHJhY2ssIGhpc3Rvcnk6IEd1aWxkUXVldWVIaXN0b3J5KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgdHJhY2s7XG4gICAgICAgIHZvaWQgaGlzdG9yeTtcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZ2V0UmVsYXRlZFRyYWNrcygpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5jb21pbmcgc3RyZWFtXG4gICAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlUG9zdFN0cmVhbShzdHJlYW06IFJlYWRhYmxlLCBuZXh0OiBOZXh0RnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBkaXNwYXRjaFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAgICovXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIFBsYXllckV2ZW50cz4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZXh0cmFjdG9yIHJlc3BvbnNlXG4gICAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsLCB0cmFja3M6IFRyYWNrW10gPSBwbGF5bGlzdD8udHJhY2tzIHx8IFtdKTogRXh0cmFjdG9ySW5mbyB7XG4gICAgICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElQIHJvdGF0b3IgaW5zdGFuY2UsIGlmIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm91dGVQbGFubmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5yb3V0ZVBsYW5uZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGluZGljYXRlIGBEZW11eGFibGVgIHN0cmVhbSBzdXBwb3J0IGZvciBgb3B1c2AvYG9nZy9vcHVzYC9gd2VibS9vcHVzYCBmb3JtYXRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jb250ZXh0LnBsYXllci5vcHRpb25zLnNraXBGRm1wZWc7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb24gPSAoZXJyb3I/OiBFcnJvciB8IG51bGwsIHN0cmVhbT86IFJlYWRhYmxlKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckluZm8ge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICAgIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbiAgICBwcm90b2NvbD86IHN0cmluZyB8IG51bGw7XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBrbm93bkV4dHJhY3RvcktleXMgPSBbXG4gICAgJ1Nwb3RpZnlFeHRyYWN0b3InLFxuICAgICdBcHBsZU11c2ljRXh0cmFjdG9yJyxcbiAgICAnU291bmRDbG91ZEV4dHJhY3RvcicsXG4gICAgJ1lvdVR1YmVFeHRyYWN0b3InLFxuICAgICdWaW1lb0V4dHJhY3RvcicsXG4gICAgJ1JldmVyYm5hdGlvbkV4dHJhY3RvcicsXG4gICAgJ0F0dGFjaG1lbnRFeHRyYWN0b3InXG5dIGFzIGNvbnN0O1xuY29uc3Qga25vd25FeHRyYWN0b3JMaWIgPSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvckxvYWRlck9wdGlvbkRpY3QgPSB7XG4gICAgLy8gQHRzLWlnbm9yZSB0eXBlc1xuICAgIFtLIGluICh0eXBlb2Yga25vd25FeHRyYWN0b3JLZXlzKVtudW1iZXJdXT86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgaW1wb3J0KCdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJylbS10+WzFdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25FdmVudHMge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICByZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyB1bnJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyB1bnJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICB1bnJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIGFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZGVhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgZmFpbHMgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZXJyb3I6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRyYWN0b3JzIHN0b3JlXG4gICAgICovXG4gICAgcHVibGljIHN0b3JlID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBCYXNlRXh0cmFjdG9yPigpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICBzdXBlcihbJ2Vycm9yJ10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgZGVmYXVsdCBleHRyYWN0b3JzIGZyb20gYEBkaXNjb3JkLXBsYXllci9leHRyYWN0b3JgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KGZpbHRlcj86IChleHQ6ICh0eXBlb2Yga25vd25FeHRyYWN0b3JLZXlzKVtudW1iZXJdKSA9PiBib29sZWFuIHwgbnVsbCwgb3B0aW9ucz86IEV4dHJhY3RvckxvYWRlck9wdGlvbkRpY3QpIHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgVXRpbC5pbXBvcnQoa25vd25FeHRyYWN0b3JMaWIpO1xuICAgICAgICBpZiAobW9kLmVycm9yKSByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1vZC5lcnJvciBhcyBFcnJvciB9O1xuXG4gICAgICAgIChmaWx0ZXIgPyBrbm93bkV4dHJhY3RvcktleXMuZmlsdGVyKGZpbHRlcikgOiBrbm93bkV4dHJhY3RvcktleXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtb2QubW9kdWxlW2tleV0pIHJldHVybjtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdHlwZXNcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoPHR5cGVvZiBCYXNlRXh0cmFjdG9yPm1vZC5tb2R1bGVba2V5XSwgb3B0aW9ucz8uW2tleV0gfHwge30pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGlmIHRoZSBnaXZlbiBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlZ2lzdGVyZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byByZWdpc3RlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcjxPIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgdHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4+KF9leHRyYWN0b3I6IFQsIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKTogUHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPiB7XG4gICAgICAgIGlmICh0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fCB0aGlzLnN0b3JlLmhhcyhfZXh0cmFjdG9yLmlkZW50aWZpZXIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IF9leHRyYWN0b3IodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXIub3B0aW9ucy5icmlkZ2VQcm92aWRlcikgb3B0aW9ucy5icmlkZ2VQcm92aWRlciA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5icmlkZ2VQcm92aWRlcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXQoX2V4dHJhY3Rvci5pZGVudGlmaWVyLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGFjdGl2YXRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RvciBhcyB1bmtub3duIGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGFjdGl2YXRlISBFcnJvcjogJHtlfWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gdW5yZWdpc3RlclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RvciA9IHR5cGVvZiBfZXh0cmFjdG9yID09PSAnc3RyaW5nJyA/IHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDogdGhpcy5zdG9yZS5maW5kKChyKSA9PiByID09PSBfZXh0cmFjdG9yKTtcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHJldHVybjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGlzYWJsZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBhd2FpdCBleHRyYWN0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBkZWFjdGl2YXRlIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVyIGFsbCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIGFsbCB0aGUgZXh0cmFjdG9yc1xuICAgICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KGZuOiBFeHRyYWN0b3JFeGVjdXRpb25GTjxUPiwgZmlsdGVyQmxvY2tlZCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgICAgIGlmICghdGhpcy5zdG9yZS5zaXplKSB7XG4gICAgICAgICAgICBVdGlsLndhcm4oJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLCAnTm9FeHRyYWN0b3JzJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzb3J0IGJ5IHByaW9yaXR5IHNvIHRoYXQgZXh0cmFjdG9ycyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgZXhlY3V0ZWQgZmlyc3RcbiAgICAgICAgY29uc3QgZXh0cmFjdG9ycyA9IHRoaXMuc3RvcmUuc29ydCgoYSwgYikgPT4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHkpO1xuXG4gICAgICAgIGxldCBlcnI6IEVycm9yIHwgbnVsbCA9IG51bGwsXG4gICAgICAgICAgICBsYXN0RXh0OiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBleHQgb2YgZXh0cmFjdG9ycy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKGZpbHRlckJsb2NrZWQgJiYgYmxvY2tlZC5zb21lKChlKSA9PiBlID09PSBleHQuaWRlbnRpZmllcikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfS4uLmApO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oZXh0KS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWApO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUeXBlVXRpbC5pc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihgJHtlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxhc3RFeHQgPSBleHQ7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIVR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBleGVjdXRlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3I6IGV4dCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQ+O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IGxhc3RFeHQhLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxuICAgICAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8ZmFsc2U+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBkaXNhYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGlkZW50aWZpZXIpID8/IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBlbmFibGVkXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlSWQocmVzb2x2YWJsZTogRXh0cmFjdG9yUmVzb2x2YWJsZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gcmVzb2x2YWJsZSA6IHJlc29sdmFibGUuaWRlbnRpZmllcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHRoaXMuZ2V0KHJlc29sdmFibGUpIDogcmVzb2x2YWJsZTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiBQcm9taXNlPFQgfCBib29sZWFuPjtcblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yUmVzb2x2YWJsZSA9IHN0cmluZyB8IEJhc2VFeHRyYWN0b3I7XG4iLCAiaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycywgQmlxdWFkRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciwgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZVJlcGVhdE1vZGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQgPSB1bmtub3duPiB7XG4gICAgc3RyYXRlZ3k/OiBRdWV1ZVN0cmF0ZWd5O1xuICAgIHZvbHVtZT86IG51bWJlcjtcbiAgICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgYV9maWx0ZXI/OiBQQ01GaWx0ZXJzW107XG4gICAgYmlxdWFkPzogQmlxdWFkRmlsdGVycztcbiAgICByZXNhbXBsZXI/OiBudW1iZXI7XG4gICAgZGlzYWJsZUhpc3Rvcnk/OiBib29sZWFuO1xuICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICAgIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bj86IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kPzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A/OiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd24/OiBudW1iZXI7XG4gICAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ/OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0PzogYm9vbGVhbjtcbiAgICBtYXhTaXplPzogbnVtYmVyO1xuICAgIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YT86IGJvb2xlYW47XG4gICAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUZpbHRlcmVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG5leHBvcnQgY2xhc3MgR3VpbGROb2RlTWFuYWdlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSwgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KTogR3VpbGRRdWV1ZTxUPiB7XG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRCgnSW52YWxpZCBvciB1bmtub3duIGd1aWxkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoc2VydmVyLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHNlcnZlci5pZCkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICAgICAgb3B0aW9ucy52b2x1bWUgPz89IDEwMDtcbiAgICAgICAgb3B0aW9ucy5lcXVhbGl6ZXIgPz89IFtdO1xuICAgICAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMucmVzYW1wbGVyID8/PSA0ODAwMDtcbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICAgICAgb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0ID8/PSAxMDAwO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICAvLyB0b2RvKHR3bGl0ZSk6IG1heWJlIGRpc2FibGUgdGhlc2UgYnkgZGVmYXVsdD9cbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuXG4gICAgICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nKSAmJiAhb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgYXMgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICBndWlsZDogc2VydmVyLFxuICAgICAgICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgICAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICAgICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICAgICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgICAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW06IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0sXG4gICAgICAgICAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0sXG4gICAgICAgICAgICByZXBlYXRNb2RlOiBvcHRpb25zLnJlcGVhdE1vZGUsXG4gICAgICAgICAgICBsZWF2ZU9uRW1wdHk6IG9wdGlvbnMubGVhdmVPbkVtcHR5LFxuICAgICAgICAgICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24sXG4gICAgICAgICAgICBsZWF2ZU9uRW5kOiBvcHRpb25zLmxlYXZlT25FbmQsXG4gICAgICAgICAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duLFxuICAgICAgICAgICAgbGVhdmVPblN0b3A6IG9wdGlvbnMubGVhdmVPblN0b3AsXG4gICAgICAgICAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24sXG4gICAgICAgICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICAgICAgICBzZWxmRGVhZjogb3B0aW9ucy5zZWxmRGVhZixcbiAgICAgICAgICAgIGZmbXBlZ0ZpbHRlcnM6IG9wdGlvbnMuZGVmYXVsdEZGbXBlZ0ZpbHRlcnMgPz8gW10sXG4gICAgICAgICAgICBidWZmZXJpbmdUaW1lb3V0OiBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQsXG4gICAgICAgICAgICBub0VtaXRJbnNlcnQ6IG9wdGlvbnMubm9FbWl0SW5zZXJ0ID8/IGZhbHNlLFxuICAgICAgICAgICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSxcbiAgICAgICAgICAgIG1heEhpc3RvcnlTaXplOiBvcHRpb25zLm1heEhpc3RvcnlTaXplLFxuICAgICAgICAgICAgbWF4U2l6ZTogb3B0aW9ucy5tYXhTaXplLFxuICAgICAgICAgICAgcGF1c2VPbkVtcHR5OiBvcHRpb25zLnBhdXNlT25FbXB0eSxcbiAgICAgICAgICAgIGRpc2FibGVCaXF1YWQ6IG9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IG9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICAgIGRpc2FibGVGaWx0ZXJlcjogb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICAgICAgICBkaXNhYmxlVm9sdW1lOiBvcHRpb25zLmRpc2FibGVWb2x1bWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoc2VydmVyLmlkLCBxdWV1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBleGlzdGluZyBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0PFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICAgICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLmNhY2hlLmdldChxdWV1ZS5pZCkgYXMgR3VpbGRRdWV1ZTxUPikgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHF1ZXVlIGV4aXN0c1xuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGlkID0gbm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUgPyBub2RlLmlkIDogdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRF9RVUVVRSgnQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RpbmcgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG4gICAgICAgIHF1ZXVlLm5vZGUuc3RvcCh0cnVlKTtcbiAgICAgICAgcXVldWUuY29ubmVjdGlvbj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHF1ZXVlLmRpc3BhdGNoZXI/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICBxdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgIHF1ZXVlLnRpbWVvdXRzLmZvckVhY2goKHRtKSA9PiBjbGVhclRpbWVvdXQodG0pKTtcbiAgICAgICAgcXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgICAgICBxdWV1ZS50cmFja3MuY2xlYXIoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5kZWxldGUocXVldWUuaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgcXVldWVcbiAgICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmU8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQodGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhKSBhcyBHdWlsZFF1ZXVlPFQ+IHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgcXVldWUgaWRcbiAgICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmVJZChub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBxID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICByZXR1cm4gcT8uaWQgfHwgbnVsbDtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zLCBUcmFja0xpa2UgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIEd1aWxkLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIFZvaWNlQmFzZWRDaGFubmVsLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBRdWV1ZSwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCaXF1YWRGaWx0ZXJzLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IHR5cGUgQXVkaW9QbGF5ZXIsIEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUsIFZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuL0d1aWxkUXVldWVIaXN0b3J5JztcbmltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcbmltcG9ydCB7IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnMgfSBmcm9tICcuL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlUmVwZWF0TW9kZSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlU3RhdGlzdGljcyB9IGZyb20gJy4vR3VpbGRRdWV1ZVN0YXRpc3RpY3MnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVJbml0PE1ldGEgPSB1bmtub3duPiB7XG4gICAgZ3VpbGQ6IEd1aWxkO1xuICAgIHF1ZXVlU3RyYXRlZ3k6IFF1ZXVlU3RyYXRlZ3k7XG4gICAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICAgIHZvbHVtZTogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBiaXF1YWQ6IEJpcXVhZEZpbHRlcnMgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBmaWx0ZXJlcjogUENNRmlsdGVyc1tdIHwgYm9vbGVhbjtcbiAgICBmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdO1xuICAgIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICAgIGxlYXZlT25FbXB0eTogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bjogbnVtYmVyO1xuICAgIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gICAgbGVhdmVPbkVuZENvb2xkb3duOiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A6IGJvb2xlYW47XG4gICAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXI7XG4gICAgc2VsZkRlYWY/OiBib29sZWFuO1xuICAgIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gICAgYnVmZmVyaW5nVGltZW91dDogbnVtYmVyO1xuICAgIG5vRW1pdEluc2VydDogYm9vbGVhbjtcbiAgICBtYXhTaXplPzogbnVtYmVyO1xuICAgIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YTogYm9vbGVhbjtcbiAgICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICAgIGRpc2FibGVWb2x1bWU6IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcjogYm9vbGVhbjtcbiAgICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gICAgZGlzYWJsZUJpcXVhZDogYm9vbGVhbjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlQ29ubmVjdENvbmZpZyB7XG4gICAgZGVhZj86IGJvb2xlYW47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvc3RQcm9jZXNzZWRSZXN1bHQge1xuICAgIHN0cmVhbTogUmVhZGFibGU7XG4gICAgdHlwZTogU3RyZWFtVHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gKHRyYWNrOiBUcmFjaywgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUsIHF1ZXVlOiBHdWlsZFF1ZXVlKSA9PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5leHBvcnQgdHlwZSBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChzdHJlYW06IFJlYWRhYmxlLCBxdWV1ZTogR3VpbGRRdWV1ZSkgPT4gUHJvbWlzZTxQb3N0UHJvY2Vzc2VkUmVzdWx0IHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIFBsYXllclRyaWdnZXJlZFJlYXNvbiA9ICdmaWx0ZXJzJyB8ICdub3JtYWwnO1xuXG5leHBvcnQgY29uc3QgR3VpbGRRdWV1ZUV2ZW50ID0ge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrQWRkOiAnYXVkaW9UcmFja0FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja1JlbW92ZTogJ2F1ZGlvVHJhY2tSZW1vdmUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc1JlbW92ZTogJ2F1ZGlvVHJhY2tzUmVtb3ZlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uRGVzdHJveWVkOiAnY29ubmVjdGlvbkRlc3Ryb3llZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0OiAnZGlzY29ubmVjdCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBzZW5kcyBhIGRlYnVnIGluZm9cbiAgICAgKi9cbiAgICBkZWJ1ZzogJ2RlYnVnJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcjogJ2Vycm9yJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBlbXB0eUNoYW5uZWw6ICdlbXB0eUNoYW5uZWwnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBlbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclN0YXJ0OiAncGxheWVyU3RhcnQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJFcnJvcjogJ3BsYXllckVycm9yJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJTa2lwOiAncGxheWVyU2tpcCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAgICovXG4gICAgcGxheWVyVHJpZ2dlcjogJ3BsYXllclRyaWdnZXInLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2Ugc3RhdGUgaXMgdXBkYXRlZC4gQ29uc3VtaW5nIHRoaXMgZXZlbnQgbWF5IGRpc2FibGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBgUGxheWVyLmlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKWAgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqL1xuICAgIHZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdm9sdW1lIGlzIHVwZGF0ZWRcbiAgICAgKi9cbiAgICB2b2x1bWVDaGFuZ2U6ICd2b2x1bWVDaGFuZ2UnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcGF1c2VkXG4gICAgICovXG4gICAgcGxheWVyUGF1c2U6ICdwbGF5ZXJQYXVzZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyByZXN1bWVkXG4gICAgICovXG4gICAgcGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgICAvKipcbiAgICAgKiBCaXF1YWQgRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBiaXF1YWRGaWx0ZXJzVXBkYXRlOiAnYmlxdWFkRmlsdGVyc1VwZGF0ZScsXG4gICAgLyoqXG4gICAgICogRXF1YWxpemVyIFVwZGF0ZVxuICAgICAqL1xuICAgIGVxdWFsaXplclVwZGF0ZTogJ2VxdWFsaXplclVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogRFNQIHVwZGF0ZVxuICAgICAqL1xuICAgIGRzcFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBhdWRpb0ZpbHRlcnNVcGRhdGU6ICdhdWRpb0ZpbHRlcnNVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEF1ZGlvIHBsYXllciB3aWxsIHBsYXkgbmV4dCB0cmFja1xuICAgICAqL1xuICAgIHdpbGxQbGF5VHJhY2s6ICd3aWxsUGxheVRyYWNrJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHJlcG9wdWxhdGVkXG4gICAgICovXG4gICAgY2hhbm5lbFBvcHVsYXRlOiAnY2hhbm5lbFBvcHVsYXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgICAqL1xuICAgIHF1ZXVlQ3JlYXRlOiAncXVldWVDcmVhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIGRlbGV0ZWRcbiAgICAgKi9cbiAgICBxdWV1ZURlbGV0ZTogJ3F1ZXVlRGVsZXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyB0cnlpbmcgdG8gYWRkIHNpbWlsYXIgdHJhY2sgZm9yIGF1dG9wbGF5XG4gICAgICovXG4gICAgd2lsbEF1dG9QbGF5OiAnd2lsbEF1dG9QbGF5J1xufSBhcyBjb25zdDtcblxuZXhwb3J0IGVudW0gVHJhY2tTa2lwUmVhc29uIHtcbiAgICBOb1N0cmVhbSA9ICdFUlJfTk9fU1RSRUFNJyxcbiAgICBNYW51YWwgPSAnTUFOVUFMJyxcbiAgICBTRUVLX09WRVJfVEhSRVNIT0xEID0gJ1NFRUtfT1ZFUl9USFJFU0hPTEQnLFxuICAgIEp1bXAgPSAnSlVNUEVEX1RPX0FOT1RIRVJfVFJBQ0snLFxuICAgIFNraXBUbyA9ICdTS0lQX1RPX0FOT1RIRVJfVFJBQ0snLFxuICAgIEhpc3RvcnlOZXh0ID0gJ0hJU1RPUllfTkVYVF9UUkFDSydcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUV2ZW50czxNZXRhID0gYW55PiB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrQWRkOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2tzIGFycmF5XG4gICAgICovXG4gICAgYXVkaW9UcmFja3NBZGQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgYXVkaW9UcmFja1JlbW92ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc1JlbW92ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uRGVzdHJveWVkOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0OiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBzZW5kcyBhIGRlYnVnIGluZm9cbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgICAqL1xuICAgIGRlYnVnOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG1lc3NhZ2U6IHN0cmluZykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICovXG4gICAgZXJyb3I6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGVtcHR5Q2hhbm5lbDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBlbXB0eVF1ZXVlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllclN0YXJ0OiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBlcnJvcnMgd2hpbGUgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllckVycm9yOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIGVycm9yOiBFcnJvciwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgYmVpbmcgc3RyZWFtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJGaW5pc2g6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2FzIHNraXBwZWRcbiAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHNraXBwaW5nXG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBmb3Igc2tpcHBpbmdcbiAgICAgKi9cbiAgICBwbGF5ZXJTa2lwOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaywgcmVhc29uOiBUcmFja1NraXBSZWFzb24sIGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB3aGljaCB3YXMgcGxheWVkIGluIHRoaXMgZXZlbnRcbiAgICAgKi9cbiAgICBwbGF5ZXJUcmlnZ2VyOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaywgcmVhc29uOiBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZFN0YXRlIFRoZSBvbGQgdm9pY2Ugc3RhdGVcbiAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgICAqL1xuICAgIHZvaWNlU3RhdGVVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIgaXMgcGF1c2VkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcGxheWVyUGF1c2U6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJSZXN1bWU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyJ3Mgdm9sdW1lIGlzIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkVm9sdW1lIFRoZSBvbGQgdm9sdW1lXG4gICAgICogQHBhcmFtIG5ld1ZvbHVtZSBUaGUgdXBkYXRlZCB2b2x1bWVcbiAgICAgKi9cbiAgICB2b2x1bWVDaGFuZ2U6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkVm9sdW1lOiBudW1iZXIsIG5ld1ZvbHVtZTogbnVtYmVyKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBlcXVhbGl6ZXIgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgZXF1YWxpemVyVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSwgbmV3RmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBiaXF1YWQgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGJpcXVhZEZpbHRlcnNVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwsIG5ld0ZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBkc3AgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGRzcFVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBQQ01GaWx0ZXJzW10sIG5ld0ZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZmZtcGVnIGF1ZGlvIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBhdWRpb0ZpbHRlcnNVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogRmlsdGVyc05hbWVbXSwgbmV3RmlsdGVyczogRmlsdGVyc05hbWVbXSkgPT4gdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHN0cmVhbWluZyBhbiBhdWRpbyB0cmFjay4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgc3RyZWFtIGNvbmZpZyBiZWZvcmUgcGxheWluZyBhIHRyYWNrLlxuICAgICAqIExpc3RlbmluZyB0byB0aGlzIGV2ZW50IHdpbGwgcGF1c2UgdGhlIGV4ZWN1dGlvbiBvZiBhdWRpbyBwbGF5ZXIgdW50aWwgYGRvbmUoKWAgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2lsbCBiZSBzdHJlYW1lZFxuICAgICAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbnMgZm9yIHN0cmVhbWluZ1xuICAgICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICAgKi9cbiAgICB3aWxsUGxheVRyYWNrOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjazx1bmtub3duPiwgY29uZmlnOiBTdHJlYW1Db25maWcsIGRvbmU6ICgpID0+IHZvaWQpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyBwb3B1bGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBjaGFubmVsUG9wdWxhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHF1ZXVlQ3JlYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBxdWV1ZURlbGV0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHRyeWluZyB0byBhZGQgc2ltaWxhciB0cmFjayBmb3IgYXV0b3BsYXlcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSBzaW1pbGFyIHRyYWNrcyB0aGF0IHdlcmUgZm91bmRcbiAgICAgKiBAcGFyYW0gZG9uZSBEb25lIGNhbGxiYWNrXG4gICAgICovXG4gICAgd2lsbEF1dG9QbGF5OiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrczogVHJhY2tbXSwgZG9uZTogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQpID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlPE1ldGEgPSB1bmtub3duPiB7XG4gICAgI3RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAjZGVsZXRlZCA9IGZhbHNlO1xuICAgICNzaHVmZmxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfX2N1cnJlbnQ6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHRyYWNrczogUXVldWU8VHJhY2s+O1xuICAgIHB1YmxpYyBoaXN0b3J5ID0gbmV3IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG5vZGUgPSBuZXcgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGZpbHRlcnMgPSBuZXcgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgb25CZWZvcmVDcmVhdGVTdHJlYW06IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jICgpID0+IG51bGw7XG4gICAgcHVibGljIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKHN0cmVhbSkgPT4gKHtcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICAgIH0pO1xuICAgIHB1YmxpYyByZXBlYXRNb2RlID0gUXVldWVSZXBlYXRNb2RlLk9GRjtcbiAgICBwdWJsaWMgdGltZW91dHMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PigpO1xuICAgIHB1YmxpYyBzdGF0cyA9IG5ldyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgdGFza3NRdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyLCBwdWJsaWMgb3B0aW9uczogR3VpbGROb2RlSW5pdDxNZXRhPikge1xuICAgICAgICB0aGlzLnRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4ob3B0aW9ucy5xdWV1ZVN0cmF0ZWd5KTtcbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkpIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pKSB0aGlzLm9uQWZ0ZXJDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW07XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpIHRoaXMucmVwZWF0TW9kZSA9IG9wdGlvbnMucmVwZWF0TW9kZTtcblxuICAgICAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wYXVzZU9uRW1wdHkgPz89IHRydWU7XG5cbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bGxpc2godGhpcy5vcHRpb25zLmJpcXVhZCkgJiYgIVR5cGVVdGlsLmlzQm9vbGVhbih0aGlzLm9wdGlvbnMuYmlxdWFkKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IHRoaXMub3B0aW9ucy5iaXF1YWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZXF1YWxpemVyKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IHRoaXMub3B0aW9ucy5lcXVhbGl6ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmlsdGVyZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IHRoaXMub3B0aW9ucy5maWx0ZXJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcih0aGlzLm9wdGlvbnMucmVzYW1wbGVyKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgPSB0aGlzLm9wdGlvbnMucmVzYW1wbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzQXJyYXkodGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuZmZtcGVnLnNldERlZmF1bHRzKHRoaXMub3B0aW9ucy5mZm1wZWdGaWx0ZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhTaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnW0d1aWxkTm9kZUluaXQubWF4U2l6ZV0nLCAnbnVtYmVyJywgdHlwZW9mIG9wdGlvbnMubWF4U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKG9wdGlvbnMubWF4SGlzdG9yeVNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdbR3VpbGROb2RlSW5pdC5tYXhIaXN0b3J5U2l6ZV0nLCAnbnVtYmVyJywgdHlwZW9mIG9wdGlvbnMubWF4SGlzdG9yeVNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4U2l6ZSA8IDEpIG9wdGlvbnMubWF4U2l6ZSA9IEluZmluaXR5O1xuICAgICAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgR3VpbGRRdWV1ZSBpbml0aWFsaXplZCBmb3IgZ3VpbGQgJHt0aGlzLm9wdGlvbnMuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMub3B0aW9ucy5ndWlsZC5pZH0pYCk7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucXVldWVDcmVhdGUsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnN0b3JlLnJlZHVjZSgoYSwgYykgPT4gYSArIGMuZHVyYXRpb25NUywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0dGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgICAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIHJlY2VpdmVyIGZvciB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2ljZVJlY2VpdmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5yZWNlaXZlciA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG0gVGhlIG1lc3NhZ2UgdG8gd3JpdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZGVidWcsIHRoaXMsIG0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRhZGF0YSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBtZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG0gTWV0YWRhdGEgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuX19jdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHF1ZXVlIHdhcyBkZWxldGVkIHByZXZpb3VzbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxldGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjaGFubmVsIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNoYW5uZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNoYW5uZWwoYzogVm9pY2VCYXNlZENoYW5uZWwgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmNoYW5uZWwgPSBjO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ3VpbGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ3VpbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZC5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdHJhbnNpdGlvbiBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VHJhbnNpdGlvbmluZyhzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLiN0cmFuc2l0aW9uaW5nID0gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaWYgdGhpcyBxdWV1ZSBpcyBjdXJyZW50bHkgdW5kZXIgdHJhbnNpdGlvbiBtb2RlXG4gICAgICovXG4gICAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zaXRpb25pbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHJlcGVhdCBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAgICovXG4gICAgcHVibGljIHNldFJlcGVhdE1vZGUobW9kZTogUXVldWVSZXBlYXRNb2RlKSB7XG4gICAgICAgIHRoaXMucmVwZWF0TW9kZSA9IG1vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhTaXplID8/IEluZmluaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBoaXN0b3J5IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4SGlzdG9yeVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldE1heEhpc3RvcnlTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhIaXN0b3J5U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWF4IGhpc3Rvcnkgc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNYXhIaXN0b3J5U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2l6ZSA8IDEpIHNpemUgPSBJbmZpbml0eTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtYXggc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNYXhTaXplKHNpemU6IG51bWJlcikge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnRyYWNrcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGhhcyBubyB0cmFja3MgbGVmdCBpbiBpdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBpcyBmdWxsXG4gICAgICovXG4gICAgcHVibGljIGlzRnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDYXBhY2l0eSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdWxsKCkpIHJldHVybiAwO1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgICAgIHJldHVybiBjYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBjdXJyZW50bHkgaG9sZHMgYWN0aXZlIGF1ZGlvIHJlc291cmNlXG4gICAgICovXG4gICAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmICF0aGlzLmRpc3BhdGNoZXIuYXVkaW9SZXNvdXJjZS5lbmRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHJhY2sgdG8gdGhlIHF1ZXVlLiBUaGlzIHdpbGwgZW1pdCBgYXVkaW9UcmFja3NBZGRgIHdoZW4gbXVsdGlwbGUgdHJhY2tzIGFyZSBhZGRlZCwgb3RoZXJ3aXNlIGBhdWRpb1RyYWNrQWRkYC5cbiAgICAgKiBAcGFyYW0gdHJhY2sgVHJhY2sgb3IgcGxheWxpc3Qgb3IgYXJyYXkgb2YgdHJhY2tzIHRvIGFkZFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRUcmFjayh0cmFjazogVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QpIHtcbiAgICAgICAgY29uc3QgdG9BZGQgPSB0cmFjayBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gdHJhY2sudHJhY2tzIDogdHJhY2s7XG4gICAgICAgIGNvbnN0IGlzTXVsdGkgPSBBcnJheS5pc0FycmF5KHRvQWRkKTtcblxuICAgICAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgdG9BZGQpO1xuXG4gICAgICAgIHRoaXMudHJhY2tzLmFkZCh0b0FkZCk7XG5cbiAgICAgICAgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja3NBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja0FkZCwgdGhpcywgdG9BZGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgdHJhY2sgZnJvbSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5yZW1vdmUodHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgdGhlIHRyYWNrIHRvIHRoZSBnaXZlbiBpbmRleFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnNlcnRUcmFjayh0cmFjazogVHJhY2ssIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm1vdmUodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgICAqL1xuICAgIHB1YmxpYyBjb3B5VHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuY29weSh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gc3JjIFRoZSBmaXJzdCB0cmFjayB0byBzd2FwXG4gICAgICogQHBhcmFtIGRlc3QgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAgICovXG4gICAgcHVibGljIHN3YXBUcmFja3Moc3JjOiBUcmFja1Jlc29sdmFibGUsIGRlc3Q6IFRyYWNrUmVzb2x2YWJsZSk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnN3YXAoc3JjLCBkZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgc3RyZWFtIGRpc3BhdGNoZXIgZnJvbSB0aGUgZ2l2ZW4gY29ubmVjdGlvblxuICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIHVzZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVEaXNwYXRjaGVyKGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiwgb3B0aW9uczogUGljazxWb2ljZUNvbm5lY3RDb25maWcsICdhdWRpb1BsYXllcicgfCAndGltZW91dCc+ID0ge30pIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5jYWNoZS5nZXQoY29ubmVjdGlvbi5qb2luQ29uZmlnLmNoYW5uZWxJZCEpO1xuICAgICAgICBpZiAoIWNoYW5uZWwpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1ZPSUNFX0NIQU5ORUwoKTtcbiAgICAgICAgaWYgKCFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdjaGFubmVsJywgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsIFN0cmluZyhjaGFubmVsPy50eXBlKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKGNvbm5lY3Rpb24sIGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMudGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQsIG9wdGlvbnMuYXVkaW9QbGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsXG4gICAgICogQHBhcmFtIGNoYW5uZWxSZXNvbHZhYmxlIFRoZSB2b2ljZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBKb2luIGNvbmZpZ1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KGNoYW5uZWxSZXNvbHZhYmxlOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIG9wdGlvbnM6IFZvaWNlQ29ubmVjdENvbmZpZyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsUmVzb2x2YWJsZSk7XG4gICAgICAgIGlmICghY2hhbm5lbCB8fCAhY2hhbm5lbC5pc1ZvaWNlQmFzZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2hhbm5lbCcsIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLCBTdHJpbmcoY2hhbm5lbD8udHlwZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjaGFubmVsLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSA/ICdzdGFnZScgOiAndm9pY2UnfSBjaGFubmVsICR7Y2hhbm5lbC5uYW1lfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlciAmJiBjaGFubmVsLmlkICE9PSB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0Rlc3Ryb3lpbmcgb2xkIGNvbm5lY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBhd2FpdCB0aGlzLnBsYXllci52b2ljZVV0aWxzLmNvbm5lY3QoY2hhbm5lbCwge1xuICAgICAgICAgICAgZGVhZjogb3B0aW9ucy5kZWFmID8/IHRoaXMub3B0aW9ucy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgICAgICAgbWF4VGltZTogb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgICAgICAgIHF1ZXVlOiB0aGlzLFxuICAgICAgICAgICAgYXVkaW9QbGF5ZXI6IG9wdGlvbnM/LmF1ZGlvUGxheWVyLFxuICAgICAgICAgICAgZ3JvdXA6IG9wdGlvbnMuZ3JvdXAgPz8gdGhpcy5wbGF5ZXIuY2xpZW50LnVzZXI/LmlkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY29ubmVjdGlvbiwgdGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbCEudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFN1cHByZXNzZWQoZmFsc2UpLmNhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNhdHRhY2hMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIGR5bmFtaWMgV2hldGhlciB0byBzaHVmZmxlIHRoZSBxdWV1ZSBkeW5hbWljYWxseS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIER5bmFtaWMgc2h1ZmZsaW5nIHdpbGwgc2h1ZmZsZSB0aGUgcXVldWUgd2hlbiB0aGUgY3VycmVudCB0cmFjayBlbmRzLCB3aXRob3V0IG11dGF0aW5nIHRoZSBxdWV1ZS5cbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgdGhlIHF1ZXVlIHdpbGwgYmUgc2h1ZmZsZWQgaW1tZWRpYXRlbHkgaW4tcGxhY2UsIHdoaWNoIGNhbm5vdCBiZSB1bmRvbmUuXG4gICAgICovXG4gICAgcHVibGljIGVuYWJsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICAgICAgaWYgKCFkeW5hbWljKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrcy5zaHVmZmxlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI3NodWZmbGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVNodWZmbGUoKSB7XG4gICAgICAgIHRoaXMuI3NodWZmbGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHJldHVybnMgV2hldGhlciBzaHVmZmxlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICAgICAgaWYgKGR5bmFtaWMpIHtcbiAgICAgICAgICAgIHRoaXMuI3NodWZmbGUgPSAhdGhpcy4jc2h1ZmZsZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmFja3Muc2h1ZmZsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHNodWZmbGUgbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIHF1ZXVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNTaHVmZmxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIGxhdGVuY3kgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbj8ucGluZy51ZHAgPz8gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXIubm9kZXMuZGVsZXRlKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLiNkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLm5vZGUudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgICAgICAgIHRoaXMudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldml2ZXMgdGhpcyBxdWV1ZVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHVibGljIHJldml2ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlbGV0ZWQgfHwgdGhpcy5wbGF5ZXIubm9kZXMuaGFzKHRoaXMuaWQpKSByZXR1cm47XG4gICAgICAgIHRoaXMuI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuc2V0KHRoaXMuaWQsIHRoaXMpO1xuICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucXVldWVDcmVhdGUsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIGRlYWZcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmRGVhZihtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldERlYWYobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgc2VsZiBtdXRlXG4gICAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAgICogQHBhcmFtIHJlYXNvbiBSZWFzb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2VsZk11dGUobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRNdXRlKG1vZGUsIHJlYXNvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSBhIHRyYWNrIGluIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJlIHBsYXllZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBub2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheSh0cmFjazogVHJhY2tMaWtlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxNZXRhPikge1xuICAgICAgICBpZiAoIXRoaXMuY2hhbm5lbCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5wbGF5KHRoaXMuY2hhbm5lbCwgdHJhY2ssIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXQgYW4gZXZlbnQgb24gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZW1pdFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmdzIGZvciB0aGUgZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgR3VpbGRRdWV1ZUV2ZW50czxNZXRhPj4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8R3VpbGRRdWV1ZUV2ZW50czxNZXRhPltLXT4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgICNhdHRhY2hMaXN0ZW5lcnMoZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVycm9yLCB0aGlzLCBlKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2RlYnVnJywgKG0pID0+IHRoaXMuaGFzRGVidWdnZXIgJiYgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kZWJ1ZywgdGhpcywgbSkpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2Rlc3Ryb3llZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyhkaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdkc3AnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXModGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kc3BVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2JpcXVhZCcsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCAhPT0gZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYmlxdWFkRmlsdGVyc1VwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVxdWFsaXplclVwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3ZvbHVtZScsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSAhPT0gZikgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC52b2x1bWVDaGFuZ2UsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsIGYpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IGY7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuaGFzRGVidWdnZXI7XG4gICAgfVxuXG4gICAgI3JlbW92ZUxpc3RlbmVyczxUIGV4dGVuZHMgeyByZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd24gfT4odGFyZ2V0OiBUKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAjcGVyZm9ybVN0YXJ0KHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuaXNUcmFuc2l0aW9uaW5nKCkgPyAnZmlsdGVycycgOiAnbm9ybWFsJztcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgYFBsYXllciB0cmlnZ2VyZWQgZm9yIFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICAgICB9KX1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgICAgICBpZiAodHJhY2sgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU3RhcnQsIHRoaXMsIHRyYWNrKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB9XG5cbiAgICAjZ2V0TmV4dFRyYWNrKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTaHVmZmxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLnRyYWNrcy5zdG9yZTtcblxuICAgICAgICBpZiAoIXN0b3JlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHRyYWNrID0gVXRpbC5yYW5kb21DaG9pY2Uoc3RvcmUpO1xuXG4gICAgICAgIHRoaXMudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHQuaWQgPT09IHRyYWNrLmlkO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdHJhY2s7XG4gICAgfVxuXG4gICAgI3BlcmZvcm1GaW5pc2gocmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgICAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICAgICAgICAgICAgfSl9IHdhcyBtYXJrZWQgYXMgZmluaXNoZWRgXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0FkZGluZyB0cmFjayB0byBoaXN0b3J5IGFuZCBlbWl0dGluZyBmaW5pc2ggZXZlbnQgc2luY2UgdHJhbnNpdGlvbiBtb2RlIGlzIGRpc2FibGVkLi4uJyk7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh0cmFjayk7XG4gICAgICAgICAgICB0aGlzLm5vZGUucmVzZXRQcm9ncmVzcygpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdObyBtb3JlIHRyYWNrcyBsZWZ0IGluIHRoZSBxdWV1ZSB0byBwbGF5IGFuZCByZXBlYXQgbW9kZSBpcyBvZmYsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlRSQUNLKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gdHJhY2ssIHJlcGVhdGluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUucGxheSh0aGlzLl9fY3VycmVudCEsIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuUVVFVUUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBxdWV1ZSwgbW92aW5nIGxhc3QgdHJhY2sgZnJvbSB0aGUgaGlzdG9yeSB0byBjdXJyZW50IHF1ZXVlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhY2tzLmFkZCh0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLkFVVE9QTEFZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIGF1dG9wbGF5LCBpbml0aWF0aW5nIGF1dG9wbGF5IGhhbmRsZXIuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdJbml0aWFsaXppbmcgbmV4dCB0cmFjayBvZiB0aGUgcXVldWUuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgI2VtaXRFbmQoKSB7XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eVF1ZXVlLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcoKSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duKS51bnJlZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEZpbmRpbmcgcmVsYXRlZCB0cmFja3MgZm9yIFRyYWNrICR7dHJhY2sudGl0bGV9ICgke3RyYWNrLnVybH0pIFtleHQ6JHt0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWApO1xuICAgICAgICAgICAgY29uc3QgdHJhY2tzID1cbiAgICAgICAgICAgICAgICAoYXdhaXQgdHJhY2suZXh0cmFjdG9yPy5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrLCB0aGlzLmhpc3RvcnkpKT8udHJhY2tzIHx8XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gUXVlcnlpbmcgZXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBleHQuZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB0byBwcm92aWRlIHJlc3VsdHMuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IHN1Y2Nlc3NmdWxseSByZXR1cm5lZCByZXN1bHRzLmApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzLnRyYWNrcztcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApPy5yZXN1bHQgfHxcbiAgICAgICAgICAgICAgICBbXTtcblxuICAgICAgICAgICAgbGV0IHJlc29sdmVyOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZCA9IFV0aWwubm9vcDtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVQcm9taXNlID0gbmV3IFByb21pc2U8VHJhY2sgfCBudWxsPigocmVzb2x2ZSkgPT4gKHJlc29sdmVyID0gcmVzb2x2ZSkpO1xuXG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC53aWxsQXV0b1BsYXksIHRoaXMsIHRyYWNrcywgcmVzb2x2ZXIhKTtcblxuICAgICAgICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlcihcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlID0gdHJhY2tzLmZpbHRlcigodHIpID0+ICF0aGlzLmhpc3RvcnkudHJhY2tzLmZpbmQoKHQpID0+IHQudXJsID09PSB0ci51cmwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmlxdWU/LlswXSA/PyBVdGlsLnJhbmRvbUNob2ljZSh0cmFja3Muc2xpY2UoMCwgNSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXh0VHJhY2sgPSBhd2FpdCBkb25lUHJvbWlzZTtcblxuICAgICAgICAgICAgaWYgKCFuZXh0VHJhY2spIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnQXV0b3BsYXkgPj4gTm8gdHJhY2sgd2FzIGZvdW5kLCBpbml0aWF0aW5nICNlbWl0RW5kKCknKTtcbiAgICAgICAgICAgICAgICB0aHJvdyAnTm8gdHJhY2sgd2FzIGZvdW5kJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ub2RlLnBsYXkobmV4dFRyYWNrLCB7XG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWs6IDAsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgQXVkaW9QbGF5ZXIsXG4gICAgQXVkaW9QbGF5ZXJFcnJvcixcbiAgICBBdWRpb1BsYXllclN0YXR1cyxcbiAgICBBdWRpb1Jlc291cmNlLFxuICAgIGNyZWF0ZUF1ZGlvUGxheWVyLFxuICAgIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gICAgZW50ZXJzU3RhdGUsXG4gICAgU3RyZWFtVHlwZSxcbiAgICBWb2ljZUNvbm5lY3Rpb24sXG4gICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICAgIFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb25cbn0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBFcXVhbGl6ZXJCYW5kLCBCaXF1YWRGaWx0ZXJzLCBQQ01GaWx0ZXJzLCBGaWx0ZXJzQ2hhaW4gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgUG9zdFByb2Nlc3NlZFJlc3VsdCB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgVm9pY2VSZWNlaXZlck5vZGUgfSBmcm9tICcuLi9tYW5hZ2VyL1ZvaWNlUmVjZWl2ZXJOb2RlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVN0cmVhbU9wcyB7XG4gICAgdHlwZT86IFN0cmVhbVR5cGU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhPzogYW55O1xuICAgIGRpc2FibGVWb2x1bWU/OiBib29sZWFuO1xuICAgIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICAgIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICAgIGVxPzogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZEZpbHRlcj86IEJpcXVhZEZpbHRlcnM7XG4gICAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICAgIGRlZmF1bHRGaWx0ZXJzPzogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZT86IG51bWJlcjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgICBzYW1wbGVSYXRlPzogbnVtYmVyO1xuICAgIHNraXBGRm1wZWc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlRXZlbnRzIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gICAgZXJyb3I6IChlcnJvcjogQXVkaW9QbGF5ZXJFcnJvcikgPT4gYW55O1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgICBmaW5pc2g6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgICBkc3A6IChmaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IGFueTtcbiAgICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gICAgc2FtcGxlUmF0ZTogKGZpbHRlcnM6IG51bWJlcikgPT4gYW55O1xuICAgIGJpcXVhZDogKGZpbHRlcnM6IEJpcXVhZEZpbHRlcnMpID0+IGFueTtcbiAgICB2b2x1bWU6ICh2b2x1bWU6IG51bWJlcikgPT4gYW55O1xuICAgIGRlc3Ryb3llZDogKCkgPT4gYW55O1xuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xufVxuXG5jbGFzcyBTdHJlYW1EaXNwYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPFZvaWNlRXZlbnRzPiB7XG4gICAgcHVibGljIHZvaWNlQ29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uO1xuICAgIHB1YmxpYyBhdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XG4gICAgcHVibGljIHJlY2VpdmVyID0gbmV3IFZvaWNlUmVjZWl2ZXJOb2RlKHRoaXMpO1xuICAgIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gICAgcHVibGljIGF1ZGlvUmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGw7XG4gICAgcHVibGljIGRzcCA9IG5ldyBGaWx0ZXJzQ2hhaW4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGNvbm5lY3Rpb24gb2JqZWN0XG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9IGNoYW5uZWwgVGhlIGNvbm5lY3RlZCBjaGFubmVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCwgcHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlLCBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlciA9IDIwMDAwLCBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAgICAgICAqIEB0eXBlIHtWb2ljZUNvbm5lY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdWRpbyBwbGF5ZXJcbiAgICAgICAgICogQHR5cGUge0F1ZGlvUGxheWVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdWRpb1BsYXllciA9XG4gICAgICAgICAgICBhdWRpb1BsYXllciB8fFxuICAgICAgICAgICAgY3JlYXRlQXVkaW9QbGF5ZXIoe1xuICAgICAgICAgICAgICAgIGRlYnVnOiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgICAgICogQHR5cGUge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IgYXMgQXVkaW9QbGF5ZXJFcnJvcikpO1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgICAgIHRoaXMuZHNwLm9uVXBkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRzcCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpIHRoaXMuZW1pdCgnZHNwJywgdGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycyk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuYmlxdWFkPy5maWx0ZXIpIHRoaXMuZW1pdCgnYmlxdWFkJywgdGhpcy5kc3AuYmlxdWFkPy5maWx0ZXIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmVxdWFsaXplcikgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLnZvbHVtZSkgdGhpcy5lbWl0KCd2b2x1bWUnLCB0aGlzLmRzcC52b2x1bWUudm9sdW1lKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpIHRoaXMuZW1pdCgnc2FtcGxlUmF0ZScsIHRoaXMuZHNwLnJlc2FtcGxlci50YXJnZXRTYW1wbGVSYXRlKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRzcC5vbkVycm9yID0gKGUpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uXG4gICAgICAgICAgICAub24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZCwgYXN5bmMgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uTWFudWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5XZWJTb2NrZXRDbG9zZSAmJiBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZywgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBVdGlsLndhaXQoKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzICsgMSkgKiA1MDAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY29ubmVjdGlvbkRlc3Ryb3llZCwgdGhpcy5xdWV1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdzdGF0ZUNoYW5nZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCAmJiBuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyUGF1c2UsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclJlc3VtZSwgdGhpcy5xdWV1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlIHx8IG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3N0YXJ0JywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgJiYgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdmaW5pc2gnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3Vic2NyaWJlKHRoaXMuYXVkaW9QbGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIGJlZW4gcGF1c2VkIG1hbnVhbGx5XG4gICAgICovXG4gICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQ7XG4gICAgfVxuXG4gICAgc2V0IHBhdXNlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdmFsID8gdGhpcy5wYXVzZSh0cnVlKSA6IHRoaXMucmVzdW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAgICovXG4gICAgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdXNlZCB8fCB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQXV0b1BhdXNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmdcbiAgICAgKi9cbiAgICBpc0J1ZmZlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZ1xuICAgICAqL1xuICAgIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGlkbGVcbiAgICAgKi9cbiAgICBpc0lkbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBpc0Rlc3Ryb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBpc0Rpc2Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyByZWFkeSB0byBwbGF5XG4gICAgICovXG4gICAgaXNSZWFkeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHNpZ25hbGxpbmdcbiAgICAgKi9cbiAgICBpc1NpZ25hbGxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5TaWduYWxsaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RpbmdcbiAgICAgKi9cbiAgICBpc0Nvbm5lY3RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgc3RyZWFtXG4gICAgICogQHBhcmFtIHtSZWFkYWJsZX0gc3JjIFRoZSBzdHJlYW0gc291cmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHNdIE9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7QXVkaW9SZXNvdXJjZX1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTdHJlYW0oc3JjOiBSZWFkYWJsZSwgb3BzPzogQ3JlYXRlU3RyZWFtT3BzKSB7XG4gICAgICAgIGlmICghb3BzPy5kaXNhYmxlRmlsdGVycyAmJiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdJbml0aWF0aW5nIERTUCBmaWx0ZXJzIHBpcGVsaW5lLi4uJyk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9ICFvcHM/LmRpc2FibGVGaWx0ZXJzXG4gICAgICAgICAgICA/IHRoaXMuZHNwLmNyZWF0ZShzcmMsIHtcbiAgICAgICAgICAgICAgICAgIGRzcDoge1xuICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IG9wcz8uZGVmYXVsdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBiaXF1YWQ6IG9wcz8uYmlxdWFkRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBvcHMuYmlxdWFkRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVCaXF1YWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHJlc2FtcGxlcjoge1xuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFNhbXBsZVJhdGU6IG9wcz8uc2FtcGxlUmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlUmVzYW1wbGVyXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZXF1YWxpemVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgYmFuZE11bHRpcGxpZXI6IG9wcz8uZXEsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUVxdWFsaXplclxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHZvbHVtZToge1xuICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTogb3BzPy52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVZvbHVtZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBzcmM7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0V4ZWN1dGluZyBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhvb2suLi4nKTtcbiAgICAgICAgY29uc3QgcG9zdFN0cmVhbSA9IGF3YWl0IHRoaXMucXVldWUub25BZnRlckNyZWF0ZVN0cmVhbT8uKHN0cmVhbSwgdGhpcy5xdWV1ZSkuY2F0Y2goXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbTogc3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnlcbiAgICAgICAgICAgICAgICB9IGFzIFBvc3RQcm9jZXNzZWRSZXN1bHQpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IGNyZWF0ZUF1ZGlvUmVzb3VyY2UocG9zdFN0cmVhbT8uc3RyZWFtID8/IHN0cmVhbSwge1xuICAgICAgICAgICAgaW5wdXRUeXBlOiBwb3N0U3RyZWFtPy50eXBlID8/IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHM/LmRhdGEsXG4gICAgICAgICAgICAvLyB2b2x1bWUgY29udHJvbHMgaGFwcGVuIGZyb20gQXVkaW9GaWx0ZXIgRFNQIHV0aWxpdHlcbiAgICAgICAgICAgIGlubGluZVZvbHVtZTogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uYmlxdWFkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uZXF1YWxpemVyIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllciBzdGF0dXNcbiAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9QbGF5ZXIpIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhpcyBkaXNwYXRjaGVyXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3BzIHRoZSBwbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBlbmQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnRlcnBvbGF0ZVNpbGVuY2U9ZmFsc2VdIElmIHRydWUsIHRoZSBwbGF5ZXIgd2lsbCBwbGF5IDUgcGFja2V0cyBvZiBzaWxlbmNlIGFmdGVyIHBhdXNpbmcgdG8gcHJldmVudCBhdWRpbyBnbGl0Y2hlcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBwYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2U/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnBhdXNlKGludGVycG9sYXRlU2lsZW5jZSk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3VtZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHJlc3VtZSgpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuYXVkaW9QbGF5ZXIudW5wYXVzZSgpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHN0cmVhbVxuICAgICAqIEBwYXJhbSB7QXVkaW9SZXNvdXJjZTxUcmFjaz59IFtyZXNvdXJjZT10aGlzLmF1ZGlvUmVzb3VyY2VdIFRoZSBhdWRpbyByZXNvdXJjZSB0byBwbGF5XG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B1cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gdXNlIG9wdXNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBwbGF5U3RyZWFtKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiA9IHRoaXMuYXVkaW9SZXNvdXJjZSEpIHtcbiAgICAgICAgaWYgKCFyZXNvdXJjZSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fQVVESU9fUkVTT1VSQ0UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzb3VyY2UuZW5kZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZmluaXNoJywgcmVzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5hdWRpb1Jlc291cmNlKSB0aGlzLmF1ZGlvUmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHksIHRoaXMuY29ubmVjdGlvblRpbWVvdXQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLnBsYXkocmVzb3VyY2UpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZSBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgcGxheWJhY2sgdm9sdW1lXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2b2x1bWUgYW1vdW50XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc2V0Vm9sdW1lKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS5zZXRWb2x1bWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZvbHVtZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiAxMDA7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUudm9sdW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5YmFjayB0aW1lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1Jlc291cmNlLnBsYXliYWNrRHVyYXRpb247XG4gICAgfVxufVxuXG5leHBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIGFzIFN0cmVhbURpc3BhdGNoZXIgfTtcbiIsICJpbXBvcnQgeyBVc2VyUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGFzc1Rocm91Z2gsIHR5cGUgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRW5kQmVoYXZpb3JUeXBlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCAqIGFzIHByaXNtIGZyb20gJ3ByaXNtLW1lZGlhJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFJhd1RyYWNrRGF0YSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlUmVjZWl2ZXJPcHRpb25zIHtcbiAgICBtb2RlPzogJ29wdXMnIHwgJ3BjbSc7XG4gICAgZW5kPzogRW5kQmVoYXZpb3JUeXBlO1xuICAgIHNpbGVuY2VEdXJhdGlvbj86IG51bWJlcjtcbiAgICBjcmM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBSYXdUcmFja0luaXQgPSBQYXJ0aWFsPE9taXQ8UmF3VHJhY2tEYXRhLCAnYXV0aG9yJyB8ICdwbGF5bGlzdCcgfCAnc291cmNlJyB8ICdlbmdpbmUnIHwgJ3JhdycgfCAncXVlcnlUeXBlJyB8ICdkZXNjcmlwdGlvbicgfCAndmlld3MnPj47XG5cbmV4cG9ydCBjbGFzcyBWb2ljZVJlY2VpdmVyTm9kZSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZVJhd1RyYWNrKHN0cmVhbTogUmVhZGFibGUsIGRhdGE6IFJhd1RyYWNrSW5pdCA9IHt9KSB7XG4gICAgICAgIGRhdGEudGl0bGUgPz89IGBSZWNvcmRpbmcgJHtEYXRlLm5vdygpfWA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUcmFjayh0aGlzLmRpc3BhdGNoZXIucXVldWUucGxheWVyLCB7XG4gICAgICAgICAgICBhdXRob3I6ICdEaXNjb3JkJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLnRpdGxlLFxuICAgICAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsXG4gICAgICAgICAgICBkdXJhdGlvbjogZGF0YS5kdXJhdGlvbiB8fCAnMDowMCcsXG4gICAgICAgICAgICB2aWV3czogMCxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgdGh1bWJuYWlsOiBkYXRhLnRodW1ibmFpbCB8fCAnaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vZW1iZWQvYXZhdGFycy8wLnBuZycsXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsIHx8ICdodHRwczovL2Rpc2NvcmQuY29tJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeScsXG4gICAgICAgICAgICByYXc6IHtcbiAgICAgICAgICAgICAgICBlbmdpbmU6IHN0cmVhbSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIG11bHRpcGxlIHN0cmVhbXMgdG9nZXRoZXJcbiAgICAgKiBAcGFyYW0gc3RyZWFtcyBUaGUgYXJyYXkgb2Ygc3RyZWFtcyB0byBtZXJnZVxuICAgICAqL1xuICAgIHB1YmxpYyBtZXJnZVJlY29yZGluZ3Moc3RyZWFtczogUmVhZGFibGVbXSkge1xuICAgICAgICAvLyBUT0RPXG4gICAgICAgIHZvaWQgc3RyZWFtcztcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubWVyZ2VSZWNvcmRpbmdzKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNvcmQgYSB1c2VyIGluIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlciB0byByZWNvcmRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBSZWNvcmRpbmcgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWNvcmRVc2VyKFxuICAgICAgICB1c2VyOiBVc2VyUmVzb2x2YWJsZSxcbiAgICAgICAgb3B0aW9uczogVm9pY2VSZWNlaXZlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBlbmQ6IEVuZEJlaGF2aW9yVHlwZS5BZnRlclNpbGVuY2UsXG4gICAgICAgICAgICBtb2RlOiAncGNtJyxcbiAgICAgICAgICAgIHNpbGVuY2VEdXJhdGlvbjogMTAwMFxuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IF91c2VyID0gdGhpcy5kaXNwYXRjaGVyLnF1ZXVlLnBsYXllci5jbGllbnQudXNlcnMucmVzb2x2ZUlkKHVzZXIpO1xuXG4gICAgICAgIGNvbnN0IHBhc3NUaHJvdWdoID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyID0gdGhpcy5kaXNwYXRjaGVyLnZvaWNlQ29ubmVjdGlvbi5yZWNlaXZlcjtcblxuICAgICAgICBpZiAoIXJlY2VpdmVyKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRUNFSVZFUigpO1xuXG4gICAgICAgIHJlY2VpdmVyLnNwZWFraW5nLm9uKCdzdGFydCcsICh1c2VySWQpID0+IHtcbiAgICAgICAgICAgIGlmICh1c2VySWQgPT09IF91c2VyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjZWl2ZVN0cmVhbSA9IHJlY2VpdmVyLnN1YnNjcmliZShfdXNlciwge1xuICAgICAgICAgICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiBvcHRpb25zLmVuZCB8fCBFbmRCZWhhdmlvclR5cGUuQWZ0ZXJTaWxlbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IG9wdGlvbnMuc2lsZW5jZUR1cmF0aW9uID8/IDEwMDBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubW9kZSA9PT0gJ3BjbScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjbSA9IHJlY2VpdmVTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyAocHJpc20ub3B1cyB8fCAoPGFueT5wcmlzbSkuZGVmYXVsdC5vcHVzKS5EZWNvZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZTogOTYwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiA0ODAwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBjbS5waXBlKHBhc3NUaHJvdWdoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXZlU3RyZWFtLnBpcGUocGFzc1Rocm91Z2gpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoIGFzIFJlYWRhYmxlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBRdWV1ZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyB0cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KCdMSUZPJyk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge31cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/Lm1ldGFkYXRhIHx8ICgodGhpcy5xdWV1ZSBhcyBhbnkpLl9fY3VycmVudCBhcyBUcmFjayB8IG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBuZXh0VHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcHJldmlvdXNUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgaGlzdG9yeSBpcyBkaXNhYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUhpc3Rvcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGhpc3RvcnkgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPCAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0cmFjayB0byB0cmFjayBoaXN0b3J5XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBhZGRcbiAgICAgKi9cbiAgICBwdWJsaWMgcHVzaCh0cmFjazogVHJhY2sgfCBUcmFja1tdKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudHJhY2tzLmFkZCh0cmFjayk7XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBoaXN0b3J5XG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnRyYWNrcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5uZXh0VHJhY2s7XG4gICAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnTm8gbmV4dCB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVldWUubm9kZS5za2lwKHtcbiAgICAgICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLkhpc3RvcnlOZXh0LFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwcGVkIGJ5IEd1aWxkUXVldWVIaXN0b3J5Lm5leHQoKSdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHByZXZpb3VzKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgcHJlc2VydmVDdXJyZW50KSB0aGlzLnF1ZXVlLm5vZGUuaW5zZXJ0KGN1cnJlbnQsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsaWFzIHRvIFtHdWlsZFF1ZXVlSGlzdG9yeV0ucHJldmlvdXMoKVxuICAgICAqL1xuICAgIHB1YmxpYyBiYWNrKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXMocHJlc2VydmVDdXJyZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemUgaGlzdG9yeSBzdG9yZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNpemUoKSB7XG4gICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnRyYWNrcy5zdG9yZS5sZW5ndGggPCB0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSByZXR1cm47XG4gICAgICAgIHRoaXMudHJhY2tzLnN0b3JlLnNwbGljZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHdhaXRGb3IgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IENyZWF0ZVN0cmVhbU9wcyB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgRXh0cmFjdG9yU3RyZWFtYWJsZSB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgKiBhcyBwcmlzbSBmcm9tICdwcmlzbS1tZWRpYSc7XG5pbXBvcnQgeyBPcHVzRGVjb2RlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9vcHVzJztcblxuZXhwb3J0IGNvbnN0IEZGTVBFR19TUkFURV9SRUdFWCA9IC9hc2V0cmF0ZT1cXGQrXFwqKFxcZChcXC5cXGQpPykvO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUGxheU9wdGlvbnMge1xuICAgIHF1ZXVlPzogYm9vbGVhbjtcbiAgICBzZWVrPzogbnVtYmVyO1xuICAgIHRyYW5zaXRpb25Nb2RlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTa2lwT3B0aW9ucyB7XG4gICAgcmVhc29uOiBUcmFja1NraXBSZWFzb247XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHRvdGFsOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgfTtcbiAgICBwcm9ncmVzczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbUNvbmZpZyB7XG4gICAgZGlzcGF0Y2hlckNvbmZpZzogQ3JlYXRlU3RyZWFtT3BzO1xuICAgIHBsYXllckNvbmZpZzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGEgPSB1bmtub3duPiB7XG4gICAgI3Byb2dyZXNzID0gMDtcbiAgICAjaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gZmFsc2U7XG4gICAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHtcbiAgICAgICAgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gL2xpYm9wdXM6ICh5ZXN8dHJ1ZSkvLnRlc3QodGhpcy5xdWV1ZS5wbGF5ZXIuc2NhbkRlcHMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaW4gaWRsZSBtb2RlXG4gICAgICovXG4gICAgcHVibGljIGlzSWRsZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGlzQnVmZmVyaW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzQnVmZmVyaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZyBhIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BsYXlpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwYXVzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAgICovXG4gICAgcHVibGljIHJlc2V0UHJvZ3Jlc3MoKSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcGxheWVyIHByb2dyZXNzXG4gICAgICovXG4gICAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWFtIHRpbWUgZm9yIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBwbGF5YmFja1RpbWUoKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMuI3Byb2dyZXNzICsgdGhpcy5zdHJlYW1UaW1lO1xuXG4gICAgICAgIHJldHVybiBkdXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGR1cmF0aW9uIG11bHRpcGxpZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgICAgICBjb25zdCBzcmF0ZUZpbHRlcnMgPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLnRvQXJyYXkoKS5maWx0ZXIoKGZmKSA9PiBGRk1QRUdfU1JBVEVfUkVHRVgudGVzdChmZikpO1xuICAgICAgICBjb25zdCBtdWx0aXBsaWVycyA9IHNyYXRlRmlsdGVyc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KEZGTVBFR19TUkFURV9SRUdFWC5leGVjKG0pPy5bMV0gYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKChmKSA9PiAhaXNOYU4oZikpO1xuXG4gICAgICAgIHJldHVybiAhbXVsdGlwbGllcnMubGVuZ3RoID8gMSA6IG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZFBsYXliYWNrVGltZSgpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy5wbGF5YmFja1RpbWU7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy50b3RhbER1cmF0aW9uO1xuXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGR1ciAvIHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldCB0b3RhbER1cmF0aW9uKCkge1xuICAgICAgICBjb25zdCBwcmVmZXJzQnJpZGdlZE1ldGFkYXRhID0gdGhpcy5xdWV1ZS5vcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YTtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcblxuICAgICAgICBpZiAocHJlZmVyc0JyaWRnZWRNZXRhZGF0YSAmJiB0cmFjaz8ubWV0YWRhdGEgIT0gbnVsbCAmJiB0eXBlb2YgdHJhY2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmICdicmlkZ2UnIGluIHRyYWNrLm1ldGFkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChcbiAgICAgICAgICAgICAgICB0cmFjayBhcyBUcmFjazx7XG4gICAgICAgICAgICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgKS5tZXRhZGF0YT8uYnJpZGdlLmR1cmF0aW9uO1xuXG4gICAgICAgICAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIoZHVyYXRpb24pKSByZXR1cm4gZHVyYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhY2s/LmR1cmF0aW9uTVMgPz8gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RyZWFtIHByb2dyZXNzXG4gICAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IFBsYXllclRpbWVzdGFtcCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/IHRoaXMucGxheWJhY2tUaW1lIDogdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWU7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaWdub3JlRmlsdGVycyA/IHRoaXMudG90YWxEdXJhdGlvbiA6IHRoaXMuZXN0aW1hdGVkRHVyYXRpb247XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyhjdXJyZW50KSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGN1cnJlbnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0b3RhbDoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRvdGFsKSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRvdGFsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvZ3Jlc3M6IE1hdGgucm91bmQoKGN1cnJlbnQgLyB0b3RhbCkgKiAxMDApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHByb2dyZXNzIGJhciBmb3IgY3VycmVudCBwcm9ncmVzc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFByb2dyZXNzIGJhciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVByb2dyZXNzQmFyKG9wdGlvbnM/OiBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5nZXRUaW1lc3RhbXAoKTtcbiAgICAgICAgaWYgKCF0aW1lc3RhbXApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IGluZGljYXRvciA9ICdcXHV7MUY1MTh9JywgbGVmdENoYXIgPSAnXFx1MjVBQycsIHJpZ2h0Q2hhciA9ICdcXHUyNUFDJywgbGVuZ3RoID0gMTUsIHRpbWVjb2RlcyA9IHRydWUsIHNlcGFyYXRvciA9ICdcXHUyNTAzJyB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkgfHwgbGVuZ3RoIDwgMCB8fCAhTnVtYmVyLmlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX09VVF9PRl9SQU5HRSgnW1BsYXllclByb2dyZXNzQmFyT3B0aW9ucy5sZW5ndGhdJywgU3RyaW5nKGxlbmd0aCksICcwJywgJ0Zpbml0ZSBOdW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoKHRpbWVzdGFtcC5jdXJyZW50LnZhbHVlIC8gdGltZXN0YW1wLnRvdGFsLnZhbHVlKSAqIGxlbmd0aCk7XG4gICAgICAgIGlmIChpbmRleCA+PSAxICYmIGluZGV4IDw9IGxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgYmFyID0gbGVmdENoYXIucmVwZWF0KGluZGV4IC0gMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgYmFyLnB1c2goaW5kaWNhdG9yKTtcbiAgICAgICAgICAgIGJhci5wdXNoKHJpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gaW5kZXgpKTtcbiAgICAgICAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2Jhci5qb2luKCcnKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtiYXIuam9pbignJyl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2luZGljYXRvcn0ke3JpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gMSl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlayB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlZWsoZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkdXJhdGlvbiA9PT0gdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWUpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoZHVyYXRpb24gPiB0aGlzLnRvdGFsRHVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICAgICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNFRUtfT1ZFUl9USFJFU0hPTEQsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IEV4Y2VwdGlvbnMuRVJSX09VVF9PRl9SQU5HRSgnW2R1cmF0aW9uXScsIFN0cmluZyhkdXJhdGlvbiksICcwJywgU3RyaW5nKHRoaXMudG90YWxEdXJhdGlvbikpLm1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdXJhdGlvbiA8IDApIGR1cmF0aW9uID0gMDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucXVldWUuZmlsdGVycy50cmlnZ2VyUmVwbGF5KGR1cmF0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHZvbHVtZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2x1bWUgPz8gMTAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB2b2x1bWVcbiAgICAgKiBAcGFyYW0gdm9sIFZvbHVtZSBhbW91bnQgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByZXMgPSB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuc2V0Vm9sdW1lKHZvbCk7XG4gICAgICAgIGlmIChyZXMpIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB2b2w7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGJpdCByYXRlXG4gICAgICogQHBhcmFtIHJhdGUgVGhlIGJpdCByYXRlIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRCaXRyYXRlKHJhdGU6IG51bWJlciB8ICdhdXRvJykge1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/LmVuY29kZXI/LnNldEJpdHJhdGUocmF0ZSA9PT0gJ2F1dG8nID8gdGhpcy5xdWV1ZS5jaGFubmVsPy5iaXRyYXRlID8/IDY0MDAwIDogcmF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHBhdXNlZCBzdGF0ZVxuICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UGF1c2VkKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzdGF0ZSkgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGF1c2UodHJ1ZSkgfHwgZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJlc3VtZSgpIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBwYXVzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3VtZSB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNraXAgY3VycmVudCB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBza2lwKG9wdGlvbnM/OiBTa2lwT3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuICAgICAgICBpZiAoIXRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICAgICAgY29uc3QgeyByZWFzb24sIGRlc2NyaXB0aW9uIH0gPSBvcHRpb25zIHx8IHtcbiAgICAgICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLk1hbnVhbCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBza2lwcGVkIG1hbnVhbGx5J1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclNraXAsIHRoaXMucXVldWUsIHRyYWNrLCByZWFzb24sIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBnaXZlbiB0cmFjayBmcm9tIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgZm91bmRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmZpbmQoKHQsIGlkeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2sgfHwgdHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgICAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmb3VuZFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHQuaWQgPT09IGZvdW5kVHJhY2suaWQpO1xuXG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja1JlbW92ZSwgdGhpcy5xdWV1ZSwgZm91bmRUcmFjayk7XG5cbiAgICAgICAgcmV0dXJuIGZvdW5kVHJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVtcCB0byBzcGVjaWZpYyB0cmFjayBvbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGp1bXAgdG8gd2l0aG91dCByZW1vdmluZyBvdGhlciB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMganVtcCh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZSh0cmFjayk7XG4gICAgICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS51bnNoaWZ0KHJlbW92ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLkp1bXAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0cmFjayB3YXMganVtcGVkIHRvIG1hbnVhbGx5J1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdHJhY2sgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldFRyYWNrUG9zaXRpb24odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICAgICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBza2lwIHRvXG4gICAgICovXG4gICAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgICAgIGlmIChpZHggPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5maWx0ZXIoKF8sIGkpID0+IGkgPD0gaWR4KTtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja3NSZW1vdmUsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5Ta2lwVG8sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwbGF5ZXIgd2FzIHNraXBwZWQgdG8gYW5vdGhlciB0cmFjayBtYW51YWxseSdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGEgdHJhY2sgb24gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0bywgZGVmYXVsdHMgdG8gMC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zZXJ0KHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKSB7XG4gICAgICAgIGlmICghKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCd0cmFjayB2YWx1ZScsICdpbnN0YW5jZSBvZiBUcmFjaycsIFN0cmluZyh0cmFjaykpO1xuICAgICAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5kZXgsIDAsIHRyYWNrKTtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLm9wdGlvbnMubm9FbWl0SW5zZXJ0KSB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tBZGQsIHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRvXG4gICAgICovXG4gICAgcHVibGljIG1vdmUoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShmcm9tKTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgdHJhY2sgdG8gbW92ZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zZXJ0KHJlbW92ZWQsIHRvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgICAqL1xuICAgIHB1YmxpYyBjb3B5KGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgICAgICBjb25zdCBzcmMgPSB0aGlzLnF1ZXVlLnRyYWNrcy5hdCh0aGlzLmdldFRyYWNrUG9zaXRpb24oZnJvbSkpO1xuICAgICAgICBpZiAoIXNyYykge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIHRyYWNrIHRvIGNvcHknKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluc2VydChzcmMsIHRvKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZpcnN0IFRoZSBmaXJzdCB0cmFjayB0byBzd2FwXG4gICAgICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3dhcChmaXJzdDogVHJhY2tSZXNvbHZhYmxlLCBzZWNvbmQ6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBzcmMgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oZmlyc3QpO1xuICAgICAgICBpZiAoc3JjIDwgMCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIHNyYyB0cmFjayB0byBzd2FwJyk7XG5cbiAgICAgICAgY29uc3QgZGVzdCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihzZWNvbmQpO1xuICAgICAgICBpZiAoZGVzdCA8IDApIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCBkZXN0IHRyYWNrIHRvIHN3YXAnKTtcblxuICAgICAgICBjb25zdCBzcmNUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXTtcbiAgICAgICAgY29uc3QgZGVzdFQgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdID0gZGVzdFQ7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdID0gc3JjVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wIHRoZSBwbGF5YmFja1xuICAgICAqIEBwYXJhbSBmb3JjZSBXaGV0aGVyIG9yIG5vdCB0byBmb3JjZWZ1bGx5IHN0b3AgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHN0b3AoZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuICAgICAgICB0aGlzLnF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wKSB7XG4gICAgICAgICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcoKSB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5zaXplKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0sIHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duKS51bnJlZigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgcmF3IGF1ZGlvIHJlc291cmNlXG4gICAgICogQHBhcmFtIHJlc291cmNlIFRoZSBhdWRpbyByZXNvdXJjZSB0byBwbGF5XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXlSYXcocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wbGF5U3RyZWFtKHJlc291cmNlIGFzIEF1ZGlvUmVzb3VyY2U8VHJhY2s+KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSByZXMgVGhlIHRyYWNrIHRvIHBsYXlcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBwbGF5aW5nIHRoZSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KHJlcz86IFRyYWNrIHwgbnVsbCwgb3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvaWNlQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFJlY2VpdmVkIHBsYXkgcmVxdWVzdCBmcm9tIGd1aWxkICR7dGhpcy5xdWV1ZS5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5xdWV1ZS5ndWlsZC5pZH0pYCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2sgIT0gbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMFxuICAgICAgICAgICAgfSBhcyBSZXNvdXJjZVBsYXlPcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApITtcblxuICAgICAgICBpZiAocmVzICYmIG9wdGlvbnMucXVldWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdSZXF1ZXN0ZWQgb3B0aW9uIHJlcXVpcmVzIHRvIHF1ZXVlIHRoZSB0cmFjaywgYWRkaW5nIHRoZSBnaXZlbiB0cmFjayB0byBxdWV1ZSBpbnN0ZWFkLi4uJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5hZGRUcmFjayhyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXMgfHwgdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5lcnJvciwgdGhpcy5xdWV1ZSwgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcGxheSB0aGUgdHJhY2ssIGluaXRpYWxpemluZy4uLicpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgSW5pdGlhdGluZyBzdHJlYW0gZXh0cmFjdGlvbiBwcm9jZXNzLi4uYCk7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSB0cmFjay5yYXc/LnNvdXJjZSB8fCB0cmFjay5zb3VyY2U7XG4gICAgICAgICAgICBjb25zdCBxdDogU2VhcmNoUXVlcnlUeXBlID0gdHJhY2sucXVlcnlUeXBlIHx8IChzcmMgPT09ICdzcG90aWZ5JyA/ICdzcG90aWZ5U29uZycgOiBzcmMgPT09ICdhcHBsZV9tdXNpYycgPyAnYXBwbGVNdXNpY1NvbmcnIDogc3JjKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RyZWFtU3JjID0ge1xuICAgICAgICAgICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzdHJlYW06IG51bGwgYXMgRXh0cmFjdG9yU3RyZWFtYWJsZSB8IG51bGxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUub25CZWZvcmVDcmVhdGVTdHJlYW0/Lih0cmFjaywgcXQgfHwgJ2FyYml0cmFyeScsIHRoaXMucXVldWUpLnRoZW4oXG4gICAgICAgICAgICAgICAgKHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZTogRXJyb3IpID0+IChzdHJlYW1TcmMuZXJyb3IgPSBlKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gdGhyb3cgaWYgJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBwYW5pY3NcbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSAmJiBzdHJlYW1TcmMuZXJyb3IpIHJldHVybiB0aGlzLiN0aHJvdyh0cmFjaywgc3RyZWFtU3JjLmVycm9yKTtcblxuICAgICAgICAgICAgLy8gZGVmYXVsdCBiZWhhdmlvciB3aGVuICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgZGlkIG5vdCBwYW5pY1xuICAgICAgICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0ZhaWxlZCB0byBnZXQgc3RyZWFtIGZyb20gb25CZWZvcmVDcmVhdGVTdHJlYW0hJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjaykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyPy5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gPFJlYWRhYmxlPnIucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzdHJlYW1TcmMuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZTogRXJyb3IpID0+IChzdHJlYW1TcmMuZXJyb3IgPSBlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IG9wdGlvbnMuc2VlaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3QgY29va2llcyA9IHRyYWNrLnJhdz8uc291cmNlID09PSAneW91dHViZScgPyAoPGFueT50aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnl0ZGxPcHRpb25zPy5yZXF1ZXN0T3B0aW9ucyk/LmhlYWRlcnM/LmNvb2tpZSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgY29uc3QgdHJhY2tTdHJlYW1Db25maWc6IFN0cmVhbUNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaGVyQ29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVCaXF1YWQ6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVZvbHVtZTogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVGaWx0ZXJzOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogdHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPT09ICdudW1iZXInICYmIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPiAwID8gdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgYmlxdWFkRmlsdGVyOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgZXE6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB0cmFjayxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogU3RyZWFtVHlwZS5SYXcsXG4gICAgICAgICAgICAgICAgICAgIHNraXBGRm1wZWc6IHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGxheWVyQ29uZmlnOiBvcHRpb25zXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgcmVzb2x2ZXI6ICgpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICAgICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVzb2x2ZXIgPSByZXNvbHZlKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LndpbGxQbGF5VHJhY2ssIHRoaXMucXVldWUsIHRyYWNrLCB0cmFja1N0cmVhbUNvbmZpZywgcmVzb2x2ZXIhKTtcblxuICAgICAgICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHJlc29sdmVyKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdXYWl0aW5nIGZvciB3aWxsUGxheVRyYWNrIGV2ZW50IHRvIHJlc29sdmUuLi4nKTtcblxuICAgICAgICAgICAgYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZGFzcERpc2FibGVkID0gW1xuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlRmlsdGVycyxcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlVm9sdW1lXG4gICAgICAgICAgICBdLmV2ZXJ5KChlKSA9PiAhIWUgPT09IHRydWUpO1xuXG4gICAgICAgICAgICBjb25zdCBuZWVkc0ZpbHRlcnMgPSAhIXRyYWNrU3RyZWFtQ29uZmlnLnBsYXllckNvbmZpZy5zZWVrIHx8ICEhdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5hcmdzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFNraXBGRm1wZWcgPSAhIXRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuc2tpcEZGbXBlZyAmJiAhbmVlZHNGaWx0ZXJzO1xuXG4gICAgICAgICAgICBsZXQgZmluYWxTdHJlYW06IFJlYWRhYmxlO1xuXG4gICAgICAgICAgICBjb25zdCBkZW11eGFibGUgPSAoZm10OiBzdHJpbmcpID0+IFtTdHJlYW1UeXBlLk9wdXMsIFN0cmVhbVR5cGUuV2VibU9wdXMsIFN0cmVhbVR5cGUuT2dnT3B1c10uaW5jbHVkZXMoZm10IGFzIFN0cmVhbVR5cGUpO1xuXG4gICAgICAgICAgICAvLyBza2lwIGZmbXBlZyB3aGVuIHBvc3NpYmxlXG4gICAgICAgICAgICBpZiAoc2hvdWxkU2tpcEZGbXBlZyAmJiAhKHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSkgJiYgdHlwZW9mIHN0cmVhbVNyYy5zdHJlYW0gIT09ICdzdHJpbmcnICYmIGRlbXV4YWJsZShzdHJlYW1TcmMuc3RyZWFtLiRmbXQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyAkZm10LCBzdHJlYW0gfSA9IHN0cmVhbVNyYy5zdHJlYW07XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkUENNID0gIWRhc3BEaXNhYmxlZDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBza2lwRkZtcGVnIGlzIHNldCB0byB0cnVlIGFuZCBzdHJlYW0gaXMgZGVtdXhhYmxlLCBjcmVhdGluZyBzdHJlYW0gd2l0aCB0eXBlICR7c2hvdWxkUENNID8gJ3BjbScgOiAnb3B1cyd9YCk7XG5cbiAgICAgICAgICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBvcHVzU3RyZWFtID0gJGZtdCA9PT0gU3RyZWFtVHlwZS5PcHVzID9cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDpcbiAgICAgICAgICAgICAgICAgICAgJGZtdCA9PT0gU3RyZWFtVHlwZS5PZ2dPcHVzID9cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnBpcGUobmV3IHByaXNtLm9wdXMuT2dnRGVtdXhlcigpKSA6XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5waXBlKG5ldyBwcmlzbS5vcHVzLldlYm1EZW11eGVyKCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFBDTSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBmaWx0ZXJzIGVuYWJsZWQsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBvcHVzIHN0cmVhbSB0byBwY21cbiAgICAgICAgICAgICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT3B1c0RlY29kZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZTogOTYwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU6IDQ4MDAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuT3B1cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IG9wdXMgPSBkYXNwRGlzYWJsZWQgJiYgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uO1xuICAgICAgICAgICAgICAgIC8vIGlmIChvcHVzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc2FibGluZyBQQ00gb3V0cHV0IHNpbmNlIGFsbCBmaWx0ZXJzIGFyZSBkaXNhYmxlZCBhbmQgb3B1cyBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuLi4nKTtcblxuICAgICAgICAgICAgICAgIGZpbmFsU3RyZWFtID0gdGhpcy4jY3JlYXRlRkZtcGVnU3RyZWFtKFxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtIGluc3RhbmNlb2YgUmVhZGFibGUgfHwgdHlwZW9mIHN0cmVhbVNyYy5zdHJlYW0gPT09ICdzdHJpbmcnID8gc3RyZWFtU3JjLnN0cmVhbSA6IHN0cmVhbVNyYy5zdHJlYW0uc3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICB0cmFjayxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZWVrID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gb3B1c1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5SYXc7XG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IE9nZ09wdXMgcmVzdWx0cyBpbiBzdGF0aWMgbm9pc2VcbiAgICAgICAgICAgICAgICAvLyB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBvcHVzID8gU3RyZWFtVHlwZS5PZ2dPcHVzIDogU3RyZWFtVHlwZS5SYXc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25Nb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFRyYW5zaXRpb24gbW9kZSBkZXRlY3RlZCwgcGxheWVyIHdpbGwgd2FpdCBmb3IgYnVmZmVyaW5nIHRpbWVvdXQgdG8gZXhwaXJlIChUaW1lb3V0OiAke3RoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0fW1zKWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdCdWZmZXJpbmcgdGltZW91dCBoYXMgZXhwaXJlZCEnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFByZXBhcmluZyBmaW5hbCBzdHJlYW0gY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KHRyYWNrU3RyZWFtQ29uZmlnLCBudWxsLCAyKX1gKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuY3JlYXRlU3RyZWFtKGZpbmFsU3RyZWFtLCB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnKTtcblxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKCEhb3B0aW9ucy50cmFuc2l0aW9uTW9kZSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3BlcmZvcm1QbGF5KHJlc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEZhaWxlZCB0byBpbml0aWFsaXplIGF1ZGlvIHBsYXllcjogJHtlfWApO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjb25zdCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQgPSAoXG4gICAgICAgICAgICBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoYENvdWxkIG5vdCBleHRyYWN0IHN0cmVhbSBmb3IgdGhpcyB0cmFjayR7ZXJyb3IgPyBgXFxuXFxuJHtlcnJvci5zdGFjayB8fCBlcnJvcn1gIDogJyd9YClcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclNraXAsIHRoaXMucXVldWUsIHRyYWNrLCBUcmFja1NraXBSZWFzb24uTm9TdHJlYW0sIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdC5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0LCB0cmFjayk7XG4gICAgICAgIGNvbnN0IG5leHRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgIGlmIChuZXh0VHJhY2spIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXN5bmMgI3BlcmZvcm1QbGF5KHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhbGl6aW5nIGF1ZGlvIHBsYXllci4uLicpO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIhLnBsYXlTdHJlYW0ocmVzb3VyY2UpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzcGF0Y2hpbmcgYXVkaW8uLi4nKTtcbiAgICB9XG5cbiAgICBhc3luYyAjY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIHJlZ2lzdGVyZWQgZXh0cmFjdG9yc2ApO1xuICAgICAgICBjb25zdCBzdHJlYW1JbmZvID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dHJhY3RvcikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuYmxvY2tTdHJlYW1Gcm9tPy5zb21lKChleHQpID0+IGV4dCA9PT0gZXh0cmFjdG9yLmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBjYW5TdHJlYW0gPSBhd2FpdCBleHRyYWN0b3IudmFsaWRhdGUodHJhY2sudXJsLCB0cmFjay5xdWVyeVR5cGUgfHwgUXVlcnlSZXNvbHZlci5yZXNvbHZlKHRyYWNrLnVybCkudHlwZSk7XG4gICAgICAgICAgICBpZiAoIWNhblN0cmVhbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0odHJhY2spO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgIGlmICghc3RyZWFtSW5mbyB8fCAhc3RyZWFtSW5mby5yZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIHJlZ2lzdGVyZWQgZXh0cmFjdG9yc2ApO1xuICAgICAgICAgICAgcmV0dXJuIHN0cmVhbUluZm8gfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgU3RyZWFtIGV4dHJhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IChFeHRyYWN0b3I6ICR7c3RyZWFtSW5mby5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuXG4gICAgICAgIHJldHVybiBzdHJlYW1JbmZvO1xuICAgIH1cblxuICAgICNjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IHN0cmluZywgdHJhY2s6IFRyYWNrLCBzZWVrID0gMCwgY29va2llcz86IHN0cmluZywgb3B1cz86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgZmZtcGVnU3RyZWFtID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZ1xuICAgICAgICAgICAgLmNyZWF0ZVN0cmVhbShzdHJlYW0sIHtcbiAgICAgICAgICAgICAgICBlbmNvZGVyQXJnczogdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5hcmdzLFxuICAgICAgICAgICAgICAgIHNlZWs6IHNlZWsgLyAxMDAwLFxuICAgICAgICAgICAgICAgIGZtdDogb3B1cyA/ICdvcHVzJyA6ICdzMTZsZScsXG4gICAgICAgICAgICAgICAgY29va2llcyxcbiAgICAgICAgICAgICAgICB1c2VMZWdhY3lGRm1wZWc6ICEhdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy51c2VMZWdhY3lGRm1wZWdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBgJHtlcnJ9YC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFN0cmVhbSBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIGZyb20gRkZtcGVnIHN0cmVhbTogJHtlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKG0uaW5jbHVkZXMoJ3ByZW1hdHVyZSBjbG9zZScpIHx8IG0uaW5jbHVkZXMoJ2VwaXBlJykpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyRXJyb3IsIHRoaXMucXVldWUsIGVyciwgdHJhY2spO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZmbXBlZ1N0cmVhbTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZmV0Y2ggfSBmcm9tICd1bmRpY2knO1xuXG4vLyAjcmVnaW9uIHNjYXJ5IHRoaW5ncyBiZWxvdyAqc2lnaCpcbmNvbnN0IHNwb3RpZnlTb25nUmVnZXggPSAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnRyYWNrXFwvfFxcP3VyaT1zcG90aWZ5OnRyYWNrOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86YWxidW1cXC98XFw/dXJpPXNwb3RpZnk6YWxidW06KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3QgdmltZW9SZWdleCA9IC9eKGh0dHB8aHR0cHMpPzpcXC9cXC8od3d3XFwufHBsYXllclxcLik/dmltZW9cXC5jb21cXC8oPzpjaGFubmVsc1xcLyg/OlxcdytcXC8pP3xncm91cHNcXC8oW14vXSopXFwvdmlkZW9zXFwvfHZpZGVvXFwvfCkoXFxkKykoPzp8XFwvXFw/KSQvO1xuY29uc3QgcmV2ZXJibmF0aW9uUmVnZXggPSAvXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC8oc29uZ3xhbGJ1bSlcXC8uKz8oXFwvLis/XFw/aT18XFwvKShbMC05XSspJC87XG5jb25zdCBhcHBsZU11c2ljUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9wbGF5bGlzdFxcLy4rXFwvcGxcXC4odS18cG0tKT9bYS16QS1aMC05XSskLztcbmNvbnN0IGFwcGxlTXVzaWNBbGJ1bVJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL2FsYnVtXFwvLitcXC8oWzAtOV0rKSQvO1xuY29uc3Qgc291bmRjbG91ZFRyYWNrUmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC9zZXRzXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3QgeW91dHViZVBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8od3d3Lik/eW91dHViZS5jb21cXC9wbGF5bGlzdFxcP2xpc3Q9KChQTHxGTHxVVXxMTHxSRHxPTClbYS16QS1aMC05LV9dezE2LDQxfSkkLztcbmNvbnN0IHlvdXR1YmVWaWRlb1VSTFJlZ2V4ID0gL14oKD86aHR0cHM/Oik/XFwvXFwvKT8oKD86d3d3fG0pXFwuKT8oKD86eW91dHViZVxcLmNvbXx5b3V0dS5iZSkpKFxcLyg/OltcXHctXStcXD92PXxlbWJlZFxcL3x2XFwvKT8pKFtcXHctXSspKFxcUyspPyQvO1xuY29uc3QgeW91dHViZVZpZGVvSWRSZWdleCA9IC9eW2EtekEtWjAtOS1fXXsxMX0kLztcbi8vICNlbmRyZWdpb24gc2NhcnkgdGhpbmdzIGFib3ZlICpzaWdoKlxuXG5jb25zdCBEb21haW5zTWFwID0ge1xuICAgIFlvdVR1YmU6IFsneW91dHViZS5jb20nLCAneW91dHUuYmUnLCAnbXVzaWMueW91dHViZS5jb20nLCAnZ2FtaW5nLnlvdXR1YmUuY29tJywgJ3d3dy55b3V0dWJlLmNvbSddLFxuICAgIFNwb3RpZnk6IFsnb3Blbi5zcG90aWZ5LmNvbScsICdlbWJlZC5zcG90aWZ5LmNvbSddLFxuICAgIFZpbWVvOiBbJ3ZpbWVvLmNvbScsICdwbGF5ZXIudmltZW8uY29tJ10sXG4gICAgUmV2ZXJiTmF0aW9uOiBbJ3JldmVyYm5hdGlvbi5jb20nXSxcbiAgICBTb3VuZENsb3VkOiBbJ3NvdW5kY2xvdWQuY29tJ10sXG4gICAgQXBwbGVNdXNpYzogWydtdXNpYy5hcHBsZS5jb20nXVxufTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCByZWRpcmVjdERvbWFpbnMgPSBuZXcgU2V0KFtcbiAgICAvXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmxpbmtcXC9bQS1aYS16MC05XSskLyxcbl0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUXVlcnkge1xuICAgIHR5cGU6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbiAgICBxdWVyeTogc3RyaW5nO1xufVxuXG5jbGFzcyBRdWVyeVJlc29sdmVyIHtcbiAgICAvKipcbiAgICAgKiBRdWVyeSByZXNvbHZlclxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGdldCByZWdleCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNwb3RpZnlBbGJ1bVJlZ2V4LFxuICAgICAgICAgICAgc3BvdGlmeVBsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICBzcG90aWZ5U29uZ1JlZ2V4LFxuICAgICAgICAgICAgdmltZW9SZWdleCxcbiAgICAgICAgICAgIHJldmVyYm5hdGlvblJlZ2V4LFxuICAgICAgICAgICAgYXR0YWNobWVudFJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY0FsYnVtUmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljUGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNTb25nUmVnZXgsXG4gICAgICAgICAgICBzb3VuZGNsb3VkVHJhY2tSZWdleCxcbiAgICAgICAgICAgIHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LFxuICAgICAgICAgICAgeW91dHViZVBsYXlsaXN0UmVnZXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmUtcmVzb2x2ZSByZWRpcmVjdCB1cmxzXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHByZVJlc29sdmUocXVlcnk6IHN0cmluZywgbWF4RGVwdGggPSA1KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZG9tYWluIG9mIHJlZGlyZWN0RG9tYWlucykge1xuICAgICAgICAgICAgaWYgKGRvbWFpbi50ZXN0KHF1ZXJ5KSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAvLyBzcG90aWZ5IGRvZXMgbm90IFwicmVkaXJlY3RcIiwgaXQgcmV0dXJucyBhIHBhZ2Ugd2l0aCBqcyB0aGF0IHJlZGlyZWN0c1xuICAgICAgICAgICAgICAgICAgICBpZiAoL15odHRwcz86XFwvXFwvc3BvdGlmeS5hcHAubGlua1xcLyguKykkLy50ZXN0KHJlcy51cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGJvZHkuc3BsaXQoJ2h0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8nKVsxXS5zcGxpdCgnP3NpPScpWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly9vcGVuLnNwb3RpZnkuY29tL3RyYWNrLyR7dGFyZ2V0fWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1heERlcHRoIDwgMSA/IHJlcy51cmwgOiB0aGlzLnByZVJlc29sdmUocmVzLnVybCwgbWF4RGVwdGggLSAxKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmUocXVlcnk6IHN0cmluZywgZmFsbGJhY2tTZWFyY2hFbmdpbmU6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXSA9IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSCk6IFJlc29sdmVkUXVlcnkge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzU3RyaW5nKHF1ZXJ5KSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRShxdWVyeSwgJ3N0cmluZycsIHR5cGVvZiBxdWVyeSk7XG4gICAgICAgIGlmICghcXVlcnkubGVuZ3RoKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTkZPX1JFUVVJUkVEKCdxdWVyeScsIFN0cmluZyhxdWVyeSkpO1xuXG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gKHR5cGU6IHR5cGVvZiBmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnk6IHN0cmluZykgPT4gKHsgdHlwZSwgcXVlcnkgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocXVlcnkpO1xuXG4gICAgICAgICAgICBpZiAoRG9tYWluc01hcC5Zb3VUdWJlLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvKG0odXNpYyk/fGdhbWluZylcXC4vLCAnJykudHJpbSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYXlsaXN0SWQgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgnbGlzdCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvSWQgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgndicpO1xuICAgICAgICAgICAgICAgIGlmIChwbGF5bGlzdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb0lkICYmIHBsYXlsaXN0SWQuc3RhcnRzV2l0aCgnUkQnKSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULCBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0ke3ZpZGVvSWR9Jmxpc3Q9JHtwbGF5bGlzdElkfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsIGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9wbGF5bGlzdD9saXN0PSR7cGxheWxpc3RJZH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVJZChxdWVyeSkgfHwgUXVlcnlSZXNvbHZlci52YWxpZGF0ZVVSTChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9WSURFTywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNwb3RpZnkuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9pbnRsLShbYS16QS1aXSspXFwvLywgJycpO1xuICAgICAgICAgICAgICAgIGlmIChzcG90aWZ5UGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKHNwb3RpZnlBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoc3BvdGlmeVNvbmdSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5WaW1lby5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodmltZW9SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5WSU1FTywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlJldmVyYk5hdGlvbi5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAocmV2ZXJibmF0aW9uUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuUkVWRVJCTkFUSU9OLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU291bmRDbG91ZC5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291bmRjbG91ZFBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChzb3VuZGNsb3VkVHJhY2tSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TT1VORENMT1VEX1RSQUNLLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuQXBwbGVNdXNpYy5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXBwbGVNdXNpY0FsYnVtUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoYXBwbGVNdXNpY1NvbmdSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19TT05HLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVJCSVRSQVJZLCBxdWVyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdmltZW8gaWQgZnJvbSB1cmxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBRdWVyeVJlc29sdmVyLnJlc29sdmUocXVlcnkpLnR5cGUgPT09IFF1ZXJ5VHlwZS5WSU1FTyA/IHF1ZXJ5LnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLnBvcCgpIDogbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVJZChxOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHlvdXR1YmVWaWRlb0lkUmVnZXgudGVzdChxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB5b3V0dWJlVmlkZW9VUkxSZWdleC50ZXN0KHEpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9O1xuIiwgImltcG9ydCB7IFNub3dmbGFrZVV0aWwgfSBmcm9tICdkaXNjb3JkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBYm9ydFNpZ25hbCB0byBjYW5jZWwgdGhpcyBlbnRyeVxuICAgICAqL1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5leHBvcnQgdHlwZSBBc3luY1F1ZXVlRXhjZXB0aW9uSGFuZGxlciA9IChleGNlcHRpb246IEVycm9yKSA9PiB2b2lkO1xuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXVlZCBlbnRyaWVzXG4gICAgICovXG4gICAgcHVibGljIGVudHJpZXM6IEFycmF5PEFzeW5jUXVldWVFbnRyeT4gPSBbXTtcblxuICAgIHB1YmxpYyBleGNlcHRpb25IYW5kbGVyPzogQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBlbnRyaWVzIHF1ZXVlXG4gICAgICogQHBhcmFtIGNvbnN1bWUgV2hldGhlciBvciBub3QgdG8gY29uc3VtZSBhbGwgZW50cmllcyBiZWZvcmUgY2xlYXJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoY29uc3VtZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChjb25zdW1lKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNvbnN1bWUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBxdWV1ZS4gUmV0dXJucyBgMGAgaWYgbm8gZW50cmllcyBhcmUgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWNxdWlyZSBhbiBlbnRyeS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIC8vIGxvY2sgdGhlIHF1ZXVlXG4gICAgICogY29uc3QgZW50cnkgPSBhc3luY1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgKiAvLyB3YWl0IHVudGlsIHByZXZpb3VzIHRhc2sgaXMgY29tcGxldGVkXG4gICAgICogYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgICAqIC8vIGRvIHNvbWV0aGluZyBleHBlbnNpdmVcbiAgICAgKiBhd2FpdCBwZXJmb3JtU29tZXRoaW5nRXhwZW5zaXZlKCk7XG4gICAgICogLy8gbWFrZSBzdXJlIHRvIHJlbGVhc2UgdGhlIGxvY2sgb25jZSBkb25lXG4gICAgICogYXN5bmNRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICpcbiAgICAgKi9cbiAgICBwdWJsaWMgYWNxdWlyZShvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBBc3luY1F1ZXVlRW50cnkodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXhjZXB0aW9uSGFuZGxlcikgZW50cnkuZ2V0VGFzaygpLmNhdGNoKHRoaXMuZXhjZXB0aW9uSGFuZGxlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIGVudHJ5LmNvbnN1bWUoKTtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbGVhc2UgdGhlIGN1cnJlbnQgYWNxdWlzaXRpb24gYW5kIG1vdmUgdG8gbmV4dCBlbnRyeS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNoaWZ0KCk7XG4gICAgICAgIHRoaXMuZW50cmllc1swXT8uY29uc3VtZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbmNlbCBhbGwgZW50cmllc1xuICAgICAqL1xuICAgIHB1YmxpYyBjYW5jZWxBbGwoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY2FuY2VsKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZW50cnkgVGhlIGVudHJ5IHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVFbnRyeShlbnRyeTogQXN5bmNRdWV1ZUVudHJ5KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5SWR4ID0gdGhpcy5lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuXG4gICAgICAgIGlmIChlbnRyeUlkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zcGxpY2UoZW50cnlJZHgsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZUVudHJ5IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8dm9pZD47XG4gICAgcHVibGljIHNpZ25hbDogQWJvcnRTaWduYWwgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgb25BYm9ydDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZXNvbHZlITogKCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIHJlamVjdCE6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogQXN5bmNRdWV1ZSwgcHVibGljIG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKSB7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucz8uc2lnbmFsKSB7XG4gICAgICAgICAgICB0aGlzLnNldEFib3J0U2lnbmFsKHRoaXMub3B0aW9ucy5zaWduYWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldEFib3J0U2lnbmFsKHNpZ25hbDogQWJvcnRTaWduYWwpIHtcbiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2lnbmFsID0gc2lnbmFsO1xuICAgICAgICB0aGlzLm9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnJlbW92ZUVudHJ5KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN1bWUoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICB0aGlzLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsZWFzZSgpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKCk7XG4gICAgICAgIHRoaXMucXVldWUucmVsZWFzZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICB0aGlzLnJlamVjdChuZXcgRXJyb3IoJ0NhbmNlbGxlZCcpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW51cCgpIHtcbiAgICAgICAgaWYgKHRoaXMub25BYm9ydCkgdGhpcy5zaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICAgICAgdGhpcy5zaWduYWwgPSBudWxsO1xuICAgICAgICB0aGlzLm9uQWJvcnQgPSBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUYXNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVGaWx0ZXJzIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCaXF1YWRGaWx0ZXJzLCBFcXVhbGl6ZXIsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEZGbXBlZ1N0cmVhbU9wdGlvbnMsIGNyZWF0ZUZGbXBlZ1N0cmVhbSB9IGZyb20gJy4uL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICB7XG4gICAgICAgICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgICAgIH0sXG4gICAgICAgIChfLCBpKSA9PiAoe1xuICAgICAgICAgICAgYmFuZDogaSxcbiAgICAgICAgICAgIGdhaW46IGFycltpXSA/IGFycltpXSAvIDMwIDogMFxuICAgICAgICB9KVxuICAgICkgYXMgRXF1YWxpemVyQmFuZFtdO1xufTtcblxudHlwZSBFUVByZXNldCA9IHtcbiAgICBGbGF0OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgQ2xhc3NpY2FsOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgQ2x1YjogRXF1YWxpemVyQmFuZFtdO1xuICAgIERhbmNlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgRnVsbEJhc3M6IEVxdWFsaXplckJhbmRbXTtcbiAgICBGdWxsQmFzc1RyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIEZ1bGxUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBIZWFkcGhvbmVzOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgTGFyZ2VIYWxsOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgTGl2ZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFBhcnR5OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgUG9wOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgUmVnZ2FlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgUm9jazogRXF1YWxpemVyQmFuZFtdO1xuICAgIFNrYTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFNvZnQ6IEVxdWFsaXplckJhbmRbXTtcbiAgICBTb2Z0Um9jazogRXF1YWxpemVyQmFuZFtdO1xuICAgIFRlY2hubzogRXF1YWxpemVyQmFuZFtdO1xufTtcblxuZXhwb3J0IGNvbnN0IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQ6IFJlYWRvbmx5PEVRUHJlc2V0PiA9IE9iamVjdC5mcmVlemUoe1xuICAgIEZsYXQ6IG1ha2VCYW5kcyhbXSksXG4gICAgQ2xhc3NpY2FsOiBtYWtlQmFuZHMoWy0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC03LjIsIC03LjIsIC03LjIsIC05LjZdKSxcbiAgICBDbHViOiBtYWtlQmFuZHMoWy0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA4LjAsIDUuNiwgNS42LCA1LjYsIDMuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIERhbmNlOiBtYWtlQmFuZHMoWzkuNiwgNy4yLCAyLjQsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNy4yLCAtNy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIEZ1bGxCYXNzOiBtYWtlQmFuZHMoWy04LjAsIDkuNiwgOS42LCA1LjYsIDEuNiwgLTQuMCwgLTguMCwgLTEwLjQsIC0xMS4yLCAtMTEuMl0pLFxuICAgIEZ1bGxCYXNzVHJlYmxlOiBtYWtlQmFuZHMoWzcuMiwgNS42LCAtMS4xMTAyMmUtMTUsIC03LjIsIC00LjgsIDEuNiwgOC4wLCAxMS4yLCAxMi4wLCAxMi4wXSksXG4gICAgRnVsbFRyZWJsZTogbWFrZUJhbmRzKFstOS42LCAtOS42LCAtOS42LCAtNC4wLCAyLjQsIDExLjIsIDE2LjAsIDE2LjAsIDE2LjAsIDE2LjhdKSxcbiAgICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoWzQuOCwgMTEuMiwgNS42LCAtMy4yLCAtMi40LCAxLjYsIDQuOCwgOS42LCAxMi44LCAxNC40XSksXG4gICAgTGFyZ2VIYWxsOiBtYWtlQmFuZHMoWzEwLjQsIDEwLjQsIDUuNiwgNS42LCAtMS4xMTAyMmUtMTUsIC00LjgsIC00LjgsIC00LjgsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgTGl2ZTogbWFrZUJhbmRzKFstNC44LCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA1LjYsIDUuNiwgNC4wLCAyLjQsIDIuNCwgMi40XSksXG4gICAgUGFydHk6IG1ha2VCYW5kcyhbNy4yLCA3LjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIDcuMiwgNy4yXSksXG4gICAgUG9wOiBtYWtlQmFuZHMoWy0xLjYsIDQuOCwgNy4yLCA4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMi40LCAtMS42LCAtMS42XSksXG4gICAgUmVnZ2FlOiBtYWtlQmFuZHMoWy0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC0xLjExMDIyZS0xNSwgNi40LCA2LjQsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBSb2NrOiBtYWtlQmFuZHMoWzguMCwgNC44LCAtNS42LCAtOC4wLCAtMy4yLCA0LjAsIDguOCwgMTEuMiwgMTEuMiwgMTEuMl0pLFxuICAgIFNrYTogbWFrZUJhbmRzKFstMi40LCAtNC44LCAtNC4wLCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA4LjgsIDkuNiwgMTEuMiwgOS42XSksXG4gICAgU29mdDogbWFrZUJhbmRzKFs0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdKSxcbiAgICBTb2Z0Um9jazogbWFrZUJhbmRzKFs0LjAsIDQuMCwgMi40LCAtMS4xMTAyMmUtMTUsIC00LjAsIC01LjYsIC0zLjIsIC0xLjExMDIyZS0xNSwgMi40LCA4LjhdKSxcbiAgICBUZWNobm86IG1ha2VCYW5kcyhbOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTQuOCwgLTEuMTEwMjJlLTE1LCA4LjAsIDkuNiwgOS42LCA4LjhdKVxufSk7XG5cbmV4cG9ydCBjbGFzcyBGRm1wZWdGaWx0ZXJlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgICNmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgICAjaW5wdXRBcmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBmZm1wZWcgbWF5IGJlIHNraXBwZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNraXBwYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5hZi5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICAgIH1cblxuICAgICNzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgICAgICAvLyBza2lwIGlmIGZpbHRlcnMgYXJlIHRoZSBzYW1lXG4gICAgICAgIGlmIChmaWx0ZXJzLmV2ZXJ5KChmKSA9PiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGYpKSAmJiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmV2ZXJ5KChmKSA9PiBmaWx0ZXJzLmluY2x1ZGVzKGYpKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIGNvbnN0IGlnbm9yZUZpbHRlcnMgPSB0aGlzLmZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpICYmICFmaWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKTtcbiAgICAgICAgY29uc3Qgc2Vla1RpbWUgPSBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChpZ25vcmVGaWx0ZXJzKT8uY3VycmVudC52YWx1ZSB8fCAwO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgICAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gWy4uLm5ldyBTZXQoZmlsdGVycyldO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFmLnRyaWdnZXJSZXBsYXkoc2Vla1RpbWUpLnRoZW4oKHQpID0+IHtcbiAgICAgICAgICAgIHF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvRmlsdGVyc1VwZGF0ZSwgcXVldWUsIHByZXYsIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKSk7XG4gICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGlucHV0IGFyZ3MgZm9yIEZGbXBlZ1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRJbnB1dEFyZ3MoYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKCFhcmdzLmV2ZXJ5KChhcmcpID0+IHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnYXJncycsICdBcnJheTxzdHJpbmc+JywgJ2ludmFsaWQgaXRlbShzKScpO1xuICAgICAgICB0aGlzLiNpbnB1dEFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBpbnB1dCBhcmdzXG4gICAgICovXG4gICAgcHVibGljIGdldCBpbnB1dEFyZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpbnB1dEFyZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGVuY29kZXIgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZW5jb2RlckFyZ3MoKSB7XG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJzLmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgICAgIHJldHVybiBbJy1hZicsIHRoaXMudG9TdHJpbmcoKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGZpbmFsIGZmbXBlZyBhcmdzXG4gICAgICovXG4gICAgcHVibGljIGdldCBhcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dEFyZ3MuY29uY2F0KHRoaXMuZW5jb2RlckFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBmZm1wZWcgc3RyZWFtXG4gICAgICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyZWFtIHNvdXJjZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzdHJlYW0gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVTdHJlYW0oc291cmNlOiBzdHJpbmcgfCBSZWFkYWJsZSwgb3B0aW9uczogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy4jaW5wdXRBcmdzLmxlbmd0aCkgb3B0aW9ucy5lbmNvZGVyQXJncyA9IFsuLi50aGlzLiNpbnB1dEFyZ3MsIC4uLihvcHRpb25zLmVuY29kZXJBcmdzIHx8IFtdKV07XG4gICAgICAgIHJldHVybiBjcmVhdGVGRm1wZWdTdHJlYW0oc291cmNlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZmZtcGVnIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSB8IFJlY29yZDxGaWx0ZXJzLCBib29sZWFuPiB8IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IF9maWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgICAgICAgaWYgKHR5cGVvZiBmaWx0ZXJzID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIF9maWx0ZXJzID0gIWZpbHRlcnMgPyBbXSA6IChPYmplY3Qua2V5cyhBdWRpb0ZpbHRlcnMuZmlsdGVycykgYXMgRmlsdGVyc1tdKTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigocmVzKSA9PiByZXNbMV0gPT09IHRydWUpXG4gICAgICAgICAgICAgICAgLm1hcCgobSkgPT4gbVswXSkgYXMgRmlsdGVyc1tdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnMoX2ZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnRseSBhY3RpdmUgZmZtcGVnIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgdGhpcy5zZXRGaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZSBnaXZlbiBmZm1wZWcgZmlsdGVyKHMpXG4gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcihzKVxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoZmlsdGVyczogRmlsdGVyc1tdIHwgRmlsdGVycykge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIGZpbHRlcnMgPSBbZmlsdGVyc107XG4gICAgICAgIGNvbnN0IGZyZXNoOiBGaWx0ZXJzW10gPSBbXTtcblxuICAgICAgICBmaWx0ZXJzLmZvckVhY2goKGYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuaW5jbHVkZXMoZikpIHJldHVybjtcbiAgICAgICAgICAgIGZyZXNoLnB1c2goZik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuZmlsdGVyKChyKSA9PiAhZmlsdGVycy5pbmNsdWRlcyhyKSkuY29uY2F0KGZyZXNoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGRlZmF1bHQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBmZiBGaWx0ZXJzIGxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RGVmYXVsdHMoZmY6IEZpbHRlcnNbXSkge1xuICAgICAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gZmY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZW5hYmxlZCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldEZpbHRlcnNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbGlzdCBvZiBkaXNhYmxlZCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldEZpbHRlcnNEaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5uYW1lcy5maWx0ZXIoKGYpID0+ICF0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGYpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmlsdGVyIGlzIGVuYWJsZWRcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbmFibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZmlsdGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmlsdGVyIGlzIGRpc2FibGVkXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGlzRGlzYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNFbmFibGVkKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBhIHZhbGlkIGZpbHRlclxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byB0ZXN0XG4gICAgICovXG4gICAgcHVibGljIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiBmaWx0ZXIgaXMgRmlsdGVyc05hbWUge1xuICAgICAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLmhhcyhmaWx0ZXIgYXMgRmlsdGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gYXJyYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9BcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBKU09OIG9iamVjdFxuICAgICAqL1xuICAgIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9IGFzIFJlY29yZDxrZXlvZiBRdWV1ZUZpbHRlcnMsIHN0cmluZz47XG5cbiAgICAgICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4gKG9ialtmaWx0ZXJdID0gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKSk7XG5cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLmNyZWF0ZSh0aGlzLmZpbHRlcnMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlQUZpbHRlcnNDYWNoZSB7XG4gICAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgYmlxdWFkOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbDtcbiAgICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lOiBudW1iZXI7XG4gICAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBncmFwaCA9IG5ldyBBRmlsdGVyR3JhcGg8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgZXF1YWxpemVyUHJlc2V0cyA9IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQ7XG4gICAgcHVibGljIF9sYXN0RmlsdGVyc0NhY2hlOiBHdWlsZFF1ZXVlQUZpbHRlcnNDYWNoZSA9IHtcbiAgICAgICAgYmlxdWFkOiBudWxsLFxuICAgICAgICBlcXVhbGl6ZXI6IFtdLFxuICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgdm9sdW1lOiAxMDAsXG4gICAgICAgIHNhbXBsZVJhdGU6IC0xXG4gICAgfTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnZvbHVtZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdGhpcy5xdWV1ZS5vcHRpb25zLnZvbHVtZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IGVuYWJsZSB0aGlzIGluIHRoZSBmdXR1cmVcbiAgICAvLyBwdWJsaWMgZ2V0IGZmbXBlZygpOiBGRm1wZWdGaWx0ZXJlcjxNZXRhPiB8IG51bGwge1xuICAgIC8vICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnKSB7XG4gICAgLy8gICAgICAgICBpZiAodGhpcy4jZmZtcGVnKSB0aGlzLiNmZm1wZWcgPSBudWxsO1xuICAgIC8vICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBpZiAoIXRoaXMuI2ZmbXBlZykge1xuICAgIC8vICAgICAgICAgdGhpcy4jZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZztcbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaWdpdGFsIGJpcXVhZCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERTUCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJlc2FtcGxlciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBzZWVrIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWssXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgIHB1YmxpYyBnZXQgZmZtcGVnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWc/LmZpbHRlcnMgPz8gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hZi5lcXVhbGl6ZXI/LmJhbmRNdWx0aXBsaWVycyB8fCBbXSkubWFwKChtLCBpKSA9PiAoe1xuICAgICAgICAgICAgYmFuZDogaSxcbiAgICAgICAgICAgIGdhaW46IG1cbiAgICAgICAgfSkpIGFzIEVxdWFsaXplckJhbmRbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFmLmJpcXVhZD8uZ2V0RmlsdGVyTmFtZSgpIGFzIEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGwpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5maWx0ZXJzPy5maWx0ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi52b2x1bWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFmLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVtcCgpOiBGaWx0ZXJHcmFwaCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmZm1wZWc6IHRoaXMuZmZtcGVnLFxuICAgICAgICAgICAgZXF1YWxpemVyOiB0aGlzLmVxdWFsaXplcixcbiAgICAgICAgICAgIGJpcXVhZDogdGhpcy5iaXF1YWQsXG4gICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgICBzYW1wbGVSYXRlOiB0aGlzLnJlc2FtcGxlcj8udGFyZ2V0U2FtcGxlUmF0ZSB8fCB0aGlzLnJlc2FtcGxlcj8uc2FtcGxlUmF0ZSB8fCA0ODAwMCxcbiAgICAgICAgICAgIHZvbHVtZTogdGhpcy52b2x1bWU/LnZvbHVtZSA/PyAxMDBcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JhcGgge1xuICAgIGZmbXBlZzogRmlsdGVyc1tdO1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbDtcbiAgICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lOiBudW1iZXI7XG4gICAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgKiBhcyBwcmlzbSBmcm9tICdwcmlzbS1tZWRpYSc7XG5pbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdTdHJlYW1PcHRpb25zIHtcbiAgICBmbXQ/OiBzdHJpbmc7XG4gICAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgICBzZWVrPzogbnVtYmVyO1xuICAgIHNraXA/OiBib29sZWFuO1xuICAgIGNvb2tpZXM/OiBzdHJpbmc7XG4gICAgdXNlTGVnYWN5RkZtcGVnPzogYm9vbGVhbjtcbn1cblxuY29uc3QgZ2V0RkZtcGVnUHJvdmlkZXIgPSAobGVnYWN5ID0gZmFsc2UpID0+IChsZWdhY3kgPyAocHJpc20gYXMgdHlwZW9mIHByaXNtICYgeyBkZWZhdWx0OiB0eXBlb2YgcHJpc20gfSkuZGVmYXVsdD8uRkZtcGVnIHx8IHByaXNtLkZGbXBlZyA6IEZGbXBlZyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtOiBzdHJpbmcsIGZtdD86IHN0cmluZywgY29va2llcz86IHN0cmluZykge1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAgICctcmVjb25uZWN0JyxcbiAgICAgICAgJzEnLFxuICAgICAgICAnLXJlY29ubmVjdF9zdHJlYW1lZCcsXG4gICAgICAgICcxJyxcbiAgICAgICAgJy1yZWNvbm5lY3RfZGVsYXlfbWF4JyxcbiAgICAgICAgJzUnLFxuICAgICAgICAnLWknLFxuICAgICAgICBzdHJlYW0sXG4gICAgICAgICctYW5hbHl6ZWR1cmF0aW9uJyxcbiAgICAgICAgJzAnLFxuICAgICAgICAnLWxvZ2xldmVsJyxcbiAgICAgICAgJzAnLFxuICAgICAgICAnLWFyJyxcbiAgICAgICAgJzQ4MDAwJyxcbiAgICAgICAgJy1hYycsXG4gICAgICAgICcyJyxcbiAgICAgICAgJy1mJyxcbiAgICAgICAgYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWBcbiAgICBdO1xuXG4gICAgaWYgKGZtdCA9PT0gJ29wdXMnKSB7XG4gICAgICAgIGFyZ3MucHVzaCgnLWFjb2RlYycsICdsaWJvcHVzJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb29raWVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBodHRwczovL2ZmbXBlZy5vcmcvZmZtcGVnLXByb3RvY29scy5odG1sI0hUVFAtQ29va2llc1xuICAgICAgICBhcmdzLnB1c2goJy1jb29raWVzJywgY29va2llcy5zdGFydHNXaXRoKCdcIicpID8gY29va2llcyA6IGBcIiR7Y29va2llc31cImApO1xuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfUElQRUQoZm10Pzogc3RyaW5nKSB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICAgJy1hbmFseXplZHVyYXRpb24nLFxuICAgICAgICAnMCcsXG4gICAgICAgICctbG9nbGV2ZWwnLFxuICAgICAgICAnMCcsXG4gICAgICAgICctYXInLFxuICAgICAgICAnNDgwMDAnLFxuICAgICAgICAnLWFjJyxcbiAgICAgICAgJzInLFxuICAgICAgICAnLWYnLFxuICAgICAgICBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBdO1xuXG4gICAgaWYgKGZtdCA9PT0gJ29wdXMnKSB7XG4gICAgICAgIGFyZ3MucHVzaCgnLWFjb2RlYycsICdsaWJvcHVzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ3M7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBGRm1wZWcgc3RyZWFtXG4gKiBAcGFyYW0gc3RyZWFtIFRoZSBzb3VyY2Ugc3RyZWFtXG4gKiBAcGFyYW0gb3B0aW9ucyBGRm1wZWcgc3RyZWFtIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW06IFJlYWRhYmxlIHwgRHVwbGV4IHwgc3RyaW5nLCBvcHRpb25zPzogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zPy5za2lwICYmIHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSByZXR1cm4gc3RyZWFtO1xuICAgIG9wdGlvbnMgPz89IHt9O1xuICAgIGNvbnN0IGFyZ3MgPSB0eXBlb2Ygc3RyZWFtID09PSAnc3RyaW5nJyA/IEZGTVBFR19BUkdTX1NUUklORyhzdHJlYW0sIG9wdGlvbnMuZm10LCBvcHRpb25zLmNvb2tpZXMpIDogRkZNUEVHX0FSR1NfUElQRUQob3B0aW9ucy5mbXQpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNOYU4ob3B0aW9ucy5zZWVrKSkgYXJncy51bnNoaWZ0KCctc3MnLCBTdHJpbmcob3B0aW9ucy5zZWVrKSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5lbmNvZGVyQXJncykpIGFyZ3MucHVzaCguLi5vcHRpb25zLmVuY29kZXJBcmdzKTtcblxuICAgIGNvbnN0IEZGTVBFRyA9IGdldEZGbXBlZ1Byb3ZpZGVyKCEhb3B0aW9ucy51c2VMZWdhY3lGRm1wZWcpO1xuXG4gICAgY29uc3QgdHJhbnNjb2RlciA9IG5ldyBGRk1QRUcoeyBzaGVsbDogZmFsc2UsIGFyZ3MgfSk7XG5cbiAgICB0cmFuc2NvZGVyLm9uKCdjbG9zZScsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcblxuICAgIGlmICh0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuICAgICAgICBzdHJlYW0ucGlwZSh0cmFuc2NvZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNjb2Rlcjtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhIHtcbiAgICBsYXRlbmN5OiB7XG4gICAgICAgIGV2ZW50TG9vcDogbnVtYmVyO1xuICAgICAgICB2b2ljZUNvbm5lY3Rpb246IG51bWJlcjtcbiAgICB9O1xuICAgIHN0YXR1czoge1xuICAgICAgICBidWZmZXJpbmc6IGJvb2xlYW47XG4gICAgICAgIHBsYXlpbmc6IGJvb2xlYW47XG4gICAgICAgIHBhdXNlZDogYm9vbGVhbjtcbiAgICAgICAgaWRsZTogYm9vbGVhbjtcbiAgICB9O1xuICAgIHRyYWNrc0NvdW50OiBudW1iZXI7XG4gICAgaGlzdG9yeVNpemU6IG51bWJlcjtcbiAgICBleHRyYWN0b3JzOiBudW1iZXI7XG4gICAgbGlzdGVuZXJzOiBudW1iZXI7XG4gICAgbWVtb3J5VXNhZ2U6IE5vZGVKUy5NZW1vcnlVc2FnZTtcbiAgICB2ZXJzaW9uczoge1xuICAgICAgICBub2RlOiBzdHJpbmc7XG4gICAgICAgIHBsYXllcjogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBzdGF0aXN0aWNzIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYXRlbmN5OiB7XG4gICAgICAgICAgICAgICAgZXZlbnRMb29wOiB0aGlzLnF1ZXVlLnBsYXllci5ldmVudExvb3BMYWcsXG4gICAgICAgICAgICAgICAgdm9pY2VDb25uZWN0aW9uOiB0aGlzLnF1ZXVlLnBpbmdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBidWZmZXJpbmc6IHRoaXMucXVldWUubm9kZS5pc0J1ZmZlcmluZygpLFxuICAgICAgICAgICAgICAgIHBsYXlpbmc6IHRoaXMucXVldWUubm9kZS5pc1BsYXlpbmcoKSxcbiAgICAgICAgICAgICAgICBwYXVzZWQ6IHRoaXMucXVldWUubm9kZS5pc1BhdXNlZCgpLFxuICAgICAgICAgICAgICAgIGlkbGU6IHRoaXMucXVldWUubm9kZS5pc0lkbGUoKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYWNrc0NvdW50OiB0aGlzLnF1ZXVlLnRyYWNrcy5zaXplLFxuICAgICAgICAgICAgaGlzdG9yeVNpemU6IHRoaXMucXVldWUuaGlzdG9yeS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGV4dHJhY3RvcnM6IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuc2l6ZSxcbiAgICAgICAgICAgIGxpc3RlbmVyczogdGhpcy5xdWV1ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5jaGFubmVsPy5tZW1iZXJzLmZpbHRlcigobSkgPT4gIW0udXNlci5ib3QpLnNpemUgfHwgMCxcbiAgICAgICAgICAgIG1lbW9yeVVzYWdlOiBwcm9jZXNzLm1lbW9yeVVzYWdlKCksXG4gICAgICAgICAgICB2ZXJzaW9uczoge1xuICAgICAgICAgICAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgICAgICAgICBwbGF5ZXI6ICc2LjYuNy1kZXYuMCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGluc3RhbmNlcyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgUGxheWVyPigpO1xuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCB1bmtub3duPigpO1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkUGxheWVyKHBsYXllcjogUGxheWVyKSB7XG4gICAgaWYgKGluc3RhbmNlcy5oYXMocGxheWVyLmlkKSkgcmV0dXJuIHRydWU7XG5cbiAgICBpbnN0YW5jZXMuc2V0KHBsYXllci5pZCwgcGxheWVyKTtcblxuICAgIHJldHVybiBpbnN0YW5jZXMuaGFzKHBsYXllci5pZCk7XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vLi4vUGxheWVyJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclBsYXllcihwbGF5ZXI6IFBsYXllcikge1xuICAgIHJldHVybiBpbnN0YW5jZXMuZGVsZXRlKHBsYXllci5pZCk7XG59XG4iLCAiaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBsYXllcnMoKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlcy5hcnJheSgpO1xufVxuIiwgImltcG9ydCB7IGdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbFJlZ2lzdHJ5KCkge1xuICAgIHJldHVybiBnbG9iYWxSZWdpc3RyeTtcbn1cbiIsICJpbXBvcnQgeyBWb2ljZUNoYW5uZWwsIFN0YWdlQ2hhbm5lbCwgU25vd2ZsYWtlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLCBqb2luVm9pY2VDaGFubmVsLCBWb2ljZUNvbm5lY3Rpb24sIGdldFZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLCBBdWRpb1BsYXllciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmNsYXNzIFZvaWNlVXRpbHMge1xuICAgIC8qKlxuICAgICAqIFZvaWNlIGNvbm5lY3Rpb24gY2FjaGUgdG8gc3RvcmUgdm9pY2UgY29ubmVjdGlvbnMgb2YgdGhlIFBsYXllciBjb21wb25lbnRzLlxuICAgICAqIFRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4gICAgICogSXQgb25seSBleGlzdHMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWNoZTogQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+ID0gbmV3IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPigpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIHV0aWxzIGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsLCBjcmVhdGluZyBiYXNpYyBzdHJlYW0gZGlzcGF0Y2ggbWFuYWdlclxuICAgICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gICAgICAgIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGRlYWY/OiBib29sZWFuO1xuICAgICAgICAgICAgbWF4VGltZT86IG51bWJlcjtcbiAgICAgICAgICAgIHF1ZXVlOiBHdWlsZFF1ZXVlO1xuICAgICAgICAgICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbiAgICAgICAgICAgIGdyb3VwPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgKTogUHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPiB7XG4gICAgICAgIGlmICghb3B0aW9ucz8ucXVldWUpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0dVSUxEX1FVRVVFKCk7XG4gICAgICAgIGNvbnN0IGNvbm4gPSBhd2FpdCB0aGlzLmpvaW4oY2hhbm5lbCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHN1YiA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKGNvbm4sIGNoYW5uZWwsIG9wdGlvbnMucXVldWUsIG9wdGlvbnMubWF4VGltZSwgb3B0aW9ucy5hdWRpb1BsYXllcik7XG4gICAgICAgIHJldHVybiBzdWI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsXG4gICAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBbY2hhbm5lbF0gVGhlIHZvaWNlL3N0YWdlIGNoYW5uZWwgdG8gam9pblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAgICogQHJldHVybnMge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgam9pbihcbiAgICAgICAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgZGVhZj86IGJvb2xlYW47XG4gICAgICAgICAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgICAgICAgICAgZ3JvdXA/OiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgY29uc3QgY29ubiA9IGpvaW5Wb2ljZUNoYW5uZWwoe1xuICAgICAgICAgICAgZ3VpbGRJZDogY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgICAgICAgIGNoYW5uZWxJZDogY2hhbm5lbC5pZCxcbiAgICAgICAgICAgIGFkYXB0ZXJDcmVhdG9yOiBjaGFubmVsLmd1aWxkLnZvaWNlQWRhcHRlckNyZWF0b3IgYXMgdW5rbm93biBhcyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICAgICAgICAgICAgc2VsZkRlYWY6IEJvb2xlYW4ob3B0aW9ucz8uZGVhZiksXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5wbGF5ZXIuZXZlbnRzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJykgPiAwLFxuICAgICAgICAgICAgZ3JvdXA6IG9wdGlvbnM/Lmdyb3VwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNjb25uZWN0KGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiB8IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24gaW5zdGFuY2VvZiBTdHJlYW1EaXNwYXRjaGVyKSBjb25uZWN0aW9uID0gY29ubmVjdGlvbi52b2ljZUNvbm5lY3Rpb247XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgcmV0dXJuIGNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIERpc2NvcmQgUGxheWVyIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1Nub3dmbGFrZX0gZ3VpbGQgVGhlIGd1aWxkIGlkXG4gICAgICogQHJldHVybnMge1N0cmVhbURpc3BhdGNoZXJ9XG4gICAgICovXG4gICAgcHVibGljIGdldENvbm5lY3Rpb24oZ3VpbGQ6IFNub3dmbGFrZSwgZ3JvdXA/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGdldFZvaWNlQ29ubmVjdGlvbihndWlsZCwgZ3JvdXApO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgVm9pY2VVdGlscyB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9mYWJyaWMvU2VhcmNoUmVzdWx0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlT3B0aW9ucyB7XG4gICAgY2hlY2tJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLy8gNWhcbmNvbnN0IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQgPSAxOF8wMDBfMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUPiB7XG4gICAgZ2V0RGF0YSgpOiBQcm9taXNlPERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQ+W10+O1xuICAgIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KTogUHJvbWlzZTx2b2lkPjtcbiAgICByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUNhY2hlIGltcGxlbWVudHMgUXVlcnlDYWNoZVByb3ZpZGVyPFRyYWNrPiB7XG4gICAgI2RlZmF1bHRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUcmFjaz4+KCk7XG4gICAgcHVibGljIHRpbWVyOiBOb2RlSlMuVGltZXI7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGxheWVyOiBQbGF5ZXIsXG4gICAgICAgIHB1YmxpYyBvcHRpb25zOiBRdWVyeUNhY2hlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNoZWNrSW50ZXJ2YWw6IERFRkFVTFRfRVhQSVJZX1RJTUVPVVRcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5jbGVhbnVwLmJpbmQodGhpcyksIHRoaXMuY2hlY2tJbnRlcnZhbCkudW5yZWYoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNoZWNrSW50ZXJ2YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY2hlY2tJbnRlcnZhbCA/PyBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhbnVwKCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIHRoaXMuI2RlZmF1bHRDYWNoZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmhhc0V4cGlyZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5kZWxldGUoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFyKCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLiNkZWZhdWx0Q2FjaGUudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCkge1xuICAgICAgICBkYXRhLnRyYWNrcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy4jZGVmYXVsdENhY2hlLmhhcyhkLnVybCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5zZXQoZC51cmwsIG5ldyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZShkKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZGVmYXVsdENhY2hlLmdldChjb250ZXh0LnF1ZXJ5KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgICAgICAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgICAgICAgIHRyYWNrczogW3Jlc3VsdC5kYXRhXSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGV4cGlyZUFmdGVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGRhdGE6IFQsIGV4cGlyZUFmdGVyOiBudW1iZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZXhwaXJlQWZ0ZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGlyZUFmdGVyID0gRGF0ZS5ub3coKSArIGV4cGlyZUFmdGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0V4cGlyZWQoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5leHBpcmVBZnRlciAhPT0gJ251bWJlcicgfHwgaXNOYU4odGhpcy5leHBpcmVBZnRlcikgfHwgdGhpcy5leHBpcmVBZnRlciA8IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIERhdGUubm93KCkgPD0gdGhpcy5leHBpcmVBZnRlcjtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCB7XG4gICAgcXVlcnk6IHN0cmluZztcbiAgICByZXF1ZXN0ZWRCeT86IFVzZXI7XG4gICAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgYGV4dDoke3N0cmluZ31gO1xufVxuIiwgImltcG9ydCB7IEZGbXBlZyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuaW1wb3J0IHsgQ2xpZW50LCBTbm93Zmxha2VVdGlsLCBWb2ljZVN0YXRlLCBJbnRlbnRzQml0RmllbGQsIFVzZXIsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgdmVyc2lvbiBhcyBkanNWZXJzaW9uIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2ssIFNlYXJjaFJlc3VsdCB9IGZyb20gJy4vZmFicmljJztcbmltcG9ydCB7IEd1aWxkUXVldWVFdmVudHMsIFZvaWNlQ29ubmVjdENvbmZpZywgR3VpbGROb2RlQ3JlYXRlT3B0aW9ucywgR3VpbGROb2RlTWFuYWdlciwgR3VpbGRRdWV1ZSwgUmVzb3VyY2VQbGF5T3B0aW9ucywgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9tYW5hZ2VyJztcbmltcG9ydCB7IFZvaWNlVXRpbHMgfSBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzLCBRdWVyeVR5cGUsIFNlYXJjaE9wdGlvbnMsIFBsYXllckluaXRPcHRpb25zLCBQbGF5bGlzdEluaXREYXRhLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIsIFJlc29sdmVkUXVlcnkgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlcGVuZGVuY3lSZXBvcnQsIHZlcnNpb24gYXMgZFZvaWNlVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCAqIGFzIF9pbnRlcm5hbHMgZnJvbSAnLi91dGlscy9fX2ludGVybmFsX18nO1xuaW1wb3J0IHsgUXVlcnlDYWNoZSB9IGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIgfSBmcm9tICcuL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcic7XG5pbXBvcnQgeyBJUFJvdGF0b3IgfSBmcm9tICcuL3V0aWxzL0lQUm90YXRvcic7XG5cbmNvbnN0IGtTaW5nbGV0b24gPSBTeW1ib2woJ0luc3RhbmNlRGlzY29yZFBsYXllclNpbmdsZXRvbicpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICAgIHRyYWNrOiBUcmFjaztcbiAgICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICAgIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlPFQ+O1xufVxuXG5leHBvcnQgdHlwZSBUcmFja0xpa2UgPSBzdHJpbmcgfCBUcmFjayB8IFNlYXJjaFJlc3VsdCB8IFRyYWNrW10gfCBQbGF5bGlzdDtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+IGV4dGVuZHMgU2VhcmNoT3B0aW9ucyB7XG4gICAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICAgIGNvbm5lY3Rpb25PcHRpb25zPzogVm9pY2VDb25uZWN0Q29uZmlnO1xuICAgIGF1ZGlvUGxheWVyT3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnM7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgYWZ0ZXJTZWFyY2g/OiAocmVzdWx0OiBTZWFyY2hSZXN1bHQpID0+IFByb21pc2U8U2VhcmNoUmVzdWx0Pjtcbn1cblxuZXhwb3J0IHR5cGUgVm9pY2VTdGF0ZUhhbmRsZXIgPSAocGxheWVyOiBQbGF5ZXIsIHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRWb2ljZVN0YXRlOiBWb2ljZVN0YXRlLCBuZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlKSA9PiBBd2FpdGVkPHZvaWQ+O1xuXG5leHBvcnQgY2xhc3MgUGxheWVyIGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxQbGF5ZXJFdmVudHM+IHtcbiAgICAjbGFzdExhdGVuY3kgPSAtMTtcbiAgICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICAgI2xhZ01vbml0b3JUaW1lb3V0ITogTm9kZUpTLlRpbWVvdXQ7XG4gICAgI2xhZ01vbml0b3JJbnRlcnZhbCE6IE5vZGVKUy5UaW1lcjtcbiAgICAjb25Wb2ljZVN0YXRlVXBkYXRlOiBWb2ljZVN0YXRlSGFuZGxlciA9IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyA9ICc2LjYuNy1kZXYuMCc7XG4gICAgcHVibGljIHN0YXRpYyBfc2luZ2xldG9uS2V5ID0ga1NpbmdsZXRvbjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50ITogQ2xpZW50O1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zITogUGxheWVySW5pdE9wdGlvbnM7XG4gICAgcHVibGljIG5vZGVzID0gbmV3IEd1aWxkTm9kZU1hbmFnZXIodGhpcyk7XG4gICAgcHVibGljIHJlYWRvbmx5IHZvaWNlVXRpbHMgPSBuZXcgVm9pY2VVdGlscyh0aGlzKTtcbiAgICBwdWJsaWMgZXh0cmFjdG9ycyA9IG5ldyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0KHRoaXMpO1xuICAgIHB1YmxpYyBldmVudHMgPSBuZXcgUGxheWVyRXZlbnRzRW1pdHRlcjxHdWlsZFF1ZXVlRXZlbnRzPihbJ2Vycm9yJywgJ3BsYXllckVycm9yJ10pO1xuICAgIHB1YmxpYyByb3V0ZVBsYW5uZXI6IElQUm90YXRvciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgRGlzY29yZCBQbGF5ZXJcbiAgICAgKiBAcGFyYW0ge0NsaWVudH0gY2xpZW50IFRoZSBEaXNjb3JkIENsaWVudFxuICAgICAqIEBwYXJhbSB7UGxheWVySW5pdE9wdGlvbnN9IFtvcHRpb25zXSBUaGUgcGxheWVyIGluaXQgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgb3B0aW9uczogUGxheWVySW5pdE9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlSW5zdGFuY2UgJiYga1NpbmdsZXRvbiBpbiBQbGF5ZXIpIHJldHVybiAoPGFueT5QbGF5ZXIpW2tTaW5nbGV0b25dIGFzIFBsYXllcjtcblxuICAgICAgICBzdXBlcihbJ2Vycm9yJ10pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGlzY29yZC5qcyBjbGllbnRcbiAgICAgICAgICogQHR5cGUge0NsaWVudH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuXG4gICAgICAgIGNvbnN0IGliZiA9IHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyBpbnN0YW5jZW9mIEludGVudHNCaXRGaWVsZCA/IHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyA6IG5ldyBJbnRlbnRzQml0RmllbGQodGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzKTtcblxuICAgICAgICBpZiAoIWliZi5oYXMoSW50ZW50c0JpdEZpZWxkLkZsYWdzLkd1aWxkVm9pY2VTdGF0ZXMpKSB7XG4gICAgICAgICAgICBVdGlsLndhcm4oJ2NsaWVudCBpcyBtaXNzaW5nIFwiR3VpbGRWb2ljZVN0YXRlc1wiIGludGVudCcsICdJbnZhbGlkSW50ZW50c0JpdEZpZWxkJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI6IGZhbHNlLFxuICAgICAgICAgICAgYmxvY2tFeHRyYWN0b3JzOiBbXSxcbiAgICAgICAgICAgIGJsb2NrU3RyZWFtRnJvbTogW10sXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogMjAwMDAsXG4gICAgICAgICAgICBsYWdNb25pdG9yOiAzMDAwMCxcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGU6IG9wdGlvbnMucXVlcnlDYWNoZSA9PT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLnF1ZXJ5Q2FjaGUgfHwgbmV3IFF1ZXJ5Q2FjaGUodGhpcyksXG4gICAgICAgICAgICB1c2VMZWdhY3lGRm1wZWc6IGZhbHNlLFxuICAgICAgICAgICAgc2tpcEZGbXBlZzogdHJ1ZSxcbiAgICAgICAgICAgIHByb2JlVGltZW91dDogNTAwMCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB5dGRsT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IDEgPDwgMjUsXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucy55dGRsT3B0aW9uc1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIFBsYXllckluaXRPcHRpb25zO1xuXG4gICAgICAgIHRoaXMuY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID09PSAnbnVtYmVyJyAmJiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2xhc3RMYXRlbmN5ID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtMYWcgTW9uaXRvcl0gRXZlbnQgbG9vcCBsYXRlbmN5OiAke3RoaXMuI2xhc3RMYXRlbmN5fW1zYCk7XG4gICAgICAgICAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pcGNvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZVBsYW5uZXIgPSBuZXcgSVBSb3RhdG9yKHRoaXMub3B0aW9ucy5pcGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBfaW50ZXJuYWxzLmFkZFBsYXllcih0aGlzKTtcblxuICAgICAgICBpZiAoIShrU2luZ2xldG9uIGluIFBsYXllcikpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShQbGF5ZXIsIGtTaW5nbGV0b24sIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcyxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlclxuICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gICAgICovXG4gICAgcHVibGljIG9uVm9pY2VTdGF0ZVVwZGF0ZShoYW5kbGVyOiBWb2ljZVN0YXRlSGFuZGxlcikge1xuICAgICAgICB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUgPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZGVidWcnLCBtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGRpc2NvcmQtcGxheWVyIHNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFRoZSBjbGllbnQgdGhhdCBpbnN0YW50aWF0ZWQgcGxheWVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHNpbmdsZXRvbihjbGllbnQ6IENsaWVudCwgb3B0aW9uczogT21pdDxQbGF5ZXJJbml0T3B0aW9ucywgJ2lnbm9yZUluc3RhbmNlJz4gPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFBsYXllcihjbGllbnQsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBpZ25vcmVJbnN0YW5jZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgZGlzY29yZC1wbGF5ZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IE9taXQ8UGxheWVySW5pdE9wdGlvbnMsICdpZ25vcmVJbnN0YW5jZSc+ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgaWdub3JlSW5zdGFuY2U6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBhY3RpdmUgbWFzdGVyIHBsYXllciBpbnN0YW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiBfaW50ZXJuYWxzLmdldFBsYXllcnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgbWFzdGVyIHBsYXllciBpbnN0YW5jZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyQWxsUGxheWVycygpIHtcbiAgICAgICAgcmV0dXJuIF9pbnRlcm5hbHMuaW5zdGFuY2VzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgcXVlcnkgY2FjaGUgcHJvdmlkZXIgaW4gdXNlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeUNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgbG9vcCBsYXRlbmN5IGluIG1zLiBJZiB5b3VyIGJvdCBpcyBsYWdneSBhbmQgdGhpcyByZXR1cm5zIGEgbnVtYmVyIGFib3ZlIDIwbXMgZm9yIGV4YW1wbGUsXG4gICAgICogc29tZSBleHBlbnNpdmUgdGFzayBpcyBiZWluZyBleGVjdXRlZCBvbiB0aGUgY3VycmVudCB0aHJlYWQgd2hpY2ggaXMgc2xvd2luZyBkb3duIHRoZSBldmVudCBsb29wLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHVibGljIGdldCBldmVudExvb3BMYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXN0TGF0ZW5jeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgc3RhdGlzdGljcyB0aGF0IGNvdWxkIGJlIHVzZWZ1bC4gU3RhdGlzdGljcyBnZW5lcmF0b3IgaXMgc3RpbGwgZXhwZXJpbWVudGFsLlxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHN0YXRzKTtcbiAgICAgKlxuICAgICAqIC8vIG91dHB1dHMgc29tZXRoaW5nIGxpa2VcbiAgICAgKiAvLyB7XG4gICAgICogLy8gICBpbnN0YW5jZXM6IG51bWJlcixcbiAgICAgKiAvLyAgIHF1ZXVlc0NvdW50OiBudW1iZXIsXG4gICAgICogLy8gICBxdWVyeUNhY2hlRW5hYmxlZDogYm9vbGVhbixcbiAgICAgKiAvLyAgIHF1ZXVlczogW1xuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgLi4uXG4gICAgICogLy8gICBdXG4gICAgICogLy8gfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnN0YW5jZXM6IF9pbnRlcm5hbHMuaW5zdGFuY2VzLnNpemUsXG4gICAgICAgICAgICBxdWV1ZXNDb3VudDogdGhpcy5xdWV1ZXMuY2FjaGUuc2l6ZSxcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiB0aGlzLnF1ZXJ5Q2FjaGUgIT0gbnVsbCxcbiAgICAgICAgICAgIHF1ZXVlczogdGhpcy5xdWV1ZXMuY2FjaGUubWFwKChtKSA9PiBtLnN0YXRzLmdlbmVyYXRlKCkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSBldmVyeSBzaW5nbGUgcXVldWVzIG1hbmFnZWQgYnkgdGhpcyBtYXN0ZXIgcGxheWVyIGluc3RhbmNlXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHVzZSBtZSB3aGVuIHlvdSB3YW50IHRvIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZSBldmVyeSBzaW5nbGUgcXVldWVzIGluIGV4aXN0ZW5jZSBcdUQ4M0RcdUREMkFcbiAgICAgKiBhd2FpdCBwbGF5ZXIuZGVzdHJveSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLm5vZGVzLmNhY2hlLmZvckVhY2goKG5vZGUpID0+IG5vZGUuZGVsZXRlKCkpO1xuICAgICAgICB0aGlzLmNsaWVudC5vZmYoJ3ZvaWNlU3RhdGVVcGRhdGUnLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnVucmVnaXN0ZXJBbGwoKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpO1xuICAgICAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICAgICAgICBfaW50ZXJuYWxzLmNsZWFyUGxheWVyKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5nZXQob2xkU3RhdGUuZ3VpbGQuaWQpO1xuICAgICAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAgICAgLy8gZGlzcGF0Y2ggdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgICAgIGNvbnN0IHdhc0hhbmRsZWQgPSB0aGlzLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC52b2ljZVN0YXRlVXBkYXRlLCBxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgICAgLy8gaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCByZXR1cm4gYXNzdW1pbmcgdGhlIGxpc3RlbmVyIGltcGxlbWVudGVkIGFsbCBvZiB0aGUgbG9naWMgYmVsb3dcbiAgICAgICAgaWYgKHdhc0hhbmRsZWQgJiYgIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIpIHJldHVybjtcblxuICAgICAgICByZXR1cm4gdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlKHRoaXMsIHF1ZXVlLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHBhc3Npbmcgdm9pY2Ugc3RhdGUgdXBkYXRlIGRhdGEgdG8gdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHZvaWNlIHN0YXRlIGhhbmRsZXJcbiAgICAgKlxuICAgICAqIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgKiAgIC8vIHRoaXMgaXMgZGVmaW5pdGVseSBhIHJvY2tldCBzY2llbmNlLCByaWdodCBoZXJlXG4gICAgICogICBwbGF5ZXIuaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyLCBldmVuIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIGxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5sb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIHN0b3AgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdW5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdm9pY2Ugc3RhdGUgaGFuZGxlciBpcyBsb2NrZWQuXG4gICAgICovXG4gICAgcHVibGljIGlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhdGUgYXVkaW8gcGxheWVyXG4gICAgICogQHBhcmFtIGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhlIG11c2ljIHNob3VsZCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHRyYWNrIG9yIHNvdXJjZSB0byBwbGF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWVyXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcXVldWUgbWFuYWdlbWVudCwganVzdCB1c2UgdGhpcyBtZXRob2QgXHVEODNEXHVERTA0XG4gICAgICogY29uc3QgcXVlcnkgPSAndGhpcyBpcyBteSBzdXBlciBjb29sIHNlYXJjaCBxdWVyeSB0aGF0IEkgd2FudCB0byBwbGF5JztcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICAgY29uc3QgeyB0cmFjayB9ID0gYXdhaXQgcGxheWVyLnBsYXkodm9pY2VDaGFubmVsLCBxdWVyeSk7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNDXHVERjg5IEkgYW0gcGxheWluZyAke3RyYWNrLnRpdGxlfSBcdUQ4M0NcdURGODlgKTtcbiAgICAgKiB9IGNhdGNoKGUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0RcdURFMkQgRmFpbGVkIHRvIHBsYXkgZXJyb3Igb2ggbm86XFxuXFxuJHtlfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBxdWVyeTogVHJhY2tMaWtlLCBvcHRpb25zOiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+ID0ge30pOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCB2YyA9IHRoaXMuY2xpZW50LmNoYW5uZWxzLnJlc29sdmUoY2hhbm5lbCk7XG4gICAgICAgIGlmICghdmM/LmlzVm9pY2VCYXNlZCgpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdjaGFubmVsJywgJ1ZvaWNlQmFzZWRDaGFubmVsJywgIXZjID8gJ3VuZGVmaW5lZCcgOiBgY2hhbm5lbCB0eXBlICR7dmMudHlwZX1gKTtcblxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlc3VsdCA9IHF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0ID8gcXVlcnkgOiBhd2FpdCB0aGlzLnNlYXJjaChxdWVyeSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCBvcHRpb25zLmFmdGVyU2VhcmNoPy4ob3JpZ2luYWxSZXN1bHQpKSB8fCBvcmlnaW5hbFJlc3VsdDtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVChgTm8gcmVzdWx0cyBmb3VuZCBmb3IgXCIke3F1ZXJ5fVwiIChFeHRyYWN0b3I6ICR7cmVzdWx0LmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuY3JlYXRlKHZjLmd1aWxkLCBvcHRpb25zLm5vZGVPcHRpb25zKTtcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEFjcXVpcmluZyBhbiBlbnRyeS4uLmApO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHF1ZXVlLnRhc2tzUXVldWUuYWNxdWlyZSh7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gRW50cnkgJHtlbnRyeS5pZH0gd2FzIGFjcXVpcmVkIHN1Y2Nlc3NmdWxseSFgKTtcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFdhaXRpbmcgZm9yIHRoZSBxdWV1ZSB0byByZXNvbHZlLi4uYCk7XG4gICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgcmVzb2x2ZWQhYCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghcXVldWUuY2hhbm5lbCkgYXdhaXQgcXVldWUuY29ubmVjdCh2Yywgb3B0aW9ucy5jb25uZWN0aW9uT3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmICghcmVzdWx0LnBsYXlsaXN0KSB7XG4gICAgICAgICAgICAgICAgcXVldWUuYWRkVHJhY2socmVzdWx0LnRyYWNrc1swXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC5wbGF5bGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXF1ZXVlLmlzUGxheWluZygpKSBhd2FpdCBxdWV1ZS5ub2RlLnBsYXkobnVsbCwgb3B0aW9ucy5hdWRpb1BsYXllck9wdGlvbnMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBSZWxlYXNpbmcgYW4gZW50cnkgZnJvbSB0aGUgcXVldWUuLi5gKTtcbiAgICAgICAgICAgIHF1ZXVlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRyYWNrOiByZXN1bHQudHJhY2tzWzBdLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgICAgICAgc2VhcmNoUmVzdWx0OiByZXN1bHQsXG4gICAgICAgICAgICBxdWV1ZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCB0cmFja3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0fSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtTZWFyY2hPcHRpb25zfSBvcHRpb25zIFRoZSBzZWFyY2ggb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFNlYXJjaFJlc3VsdD59XG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gJ3Bhc3MgdXJsIG9yIHRleHQgb3IgZGlzY29yZC1wbGF5ZXIgdHJhY2sgY29uc3RydWN0YWJsZSBvYmplY3RzLCB3ZSBnb3QgeW91IGNvdmVyZWQgXHVEODNEXHVERTBFJztcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBwbGF5ZXIuc2VhcmNoKHNlYXJjaFF1ZXJ5KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8vIExvZ3MgYFNlYXJjaFJlc3VsdGAgb2JqZWN0XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaChzZWFyY2hRdWVyeTogc3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHQsIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJlcXVlc3RlZEJ5ICE9IG51bGwpIG9wdGlvbnMucmVxdWVzdGVkQnkgPSB0aGlzLmNsaWVudC51c2Vycy5yZXNvbHZlKG9wdGlvbnMucmVxdWVzdGVkQnkpITtcbiAgICAgICAgb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz89IHRoaXMub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM7XG4gICAgICAgIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSDtcblxuICAgICAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiBzZWFyY2hRdWVyeS5wbGF5bGlzdCB8fCBudWxsLFxuICAgICAgICAgICAgICAgIHRyYWNrczogW3NlYXJjaFF1ZXJ5XSxcbiAgICAgICAgICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBzZWFyY2hRdWVyeS5leHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBzZWFyY2hRdWVyeS5xdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgUGxheWxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnksXG4gICAgICAgICAgICAgICAgdHJhY2tzOiBzZWFyY2hRdWVyeS50cmFja3MsXG4gICAgICAgICAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICAgICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkudHJhY2tzWzBdPy5leHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWFyY2hRdWVyeSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNrcyA9IHNlYXJjaFF1ZXJ5LmZpbHRlcigodCkgPT4gdCBpbnN0YW5jZW9mIFRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFja3MsXG4gICAgICAgICAgICAgICAgcXVlcnk6ICdAQCMle3tVc2VyTG9hZGVkQ29udGVudH19JSNAQCcsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBudWxsLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaGluZyAke3NlYXJjaFF1ZXJ5fWApO1xuXG4gICAgICAgIGxldCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbCxcbiAgICAgICAgICAgIHByb3RvY29sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBvcHRpb25zLnNlYXJjaEVuZ2luZSA/Pz0gUXVlcnlUeXBlLkFVVE87XG4gICAgICAgIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSDtcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgU2VhcmNoIGVuZ2luZSBzZXQgdG8gJHtvcHRpb25zLnNlYXJjaEVuZ2luZX0sIGZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZX1gKTtcblxuICAgICAgICBpZiAoL15cXHcrOi8udGVzdChzZWFyY2hRdWVyeSkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtwcm90b2NvbE5hbWUsIC4uLnF1ZXJ5XSA9IHNlYXJjaFF1ZXJ5LnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgUHJvdG9jb2wgJHtwcm90b2NvbE5hbWV9IGRldGVjdGVkIGluIHF1ZXJ5YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nRXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLnN0b3JlLmZpbmQoKGUpID0+ICF0aGlzLmV4dHJhY3RvcnMuaXNEaXNhYmxlZChlLmlkZW50aWZpZXIpICYmIGUucHJvdG9jb2xzLmluY2x1ZGVzKHByb3RvY29sTmFtZSkpO1xuXG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdFeHRyYWN0b3IpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgUHJvdG9jb2wgJHtwcm90b2NvbE5hbWV9IGlzIHN1cHBvcnRlZCBieSAke21hdGNoaW5nRXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciFgKTtcbiAgICAgICAgICAgICAgICBleHRyYWN0b3IgPSBtYXRjaGluZ0V4dHJhY3RvcjtcbiAgICAgICAgICAgICAgICBzZWFyY2hRdWVyeSA9IHF1ZXJ5LmpvaW4oJzonKTtcbiAgICAgICAgICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sTmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENvdWxkIG5vdCBmaW5kIGFuIGV4dHJhY3RvciB0aGF0IHN1cHBvcnRzICR7cHJvdG9jb2xOYW1lfSBwcm90b2NvbC4gRmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgYmVoYXZpb3IuLi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0ZWQgPSBhd2FpdCBRdWVyeVJlc29sdmVyLnByZVJlc29sdmUoc2VhcmNoUXVlcnkpO1xuICAgICAgICBjb25zdCB7IHR5cGU6IHF1ZXJ5VHlwZSwgcXVlcnkgfSA9XG4gICAgICAgICAgICBvcHRpb25zLnNlYXJjaEVuZ2luZSA9PT0gUXVlcnlUeXBlLkFVVE8gPyBRdWVyeVJlc29sdmVyLnJlc29sdmUocmVkaXJlY3RlZCwgb3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZSkgOiAoeyB0eXBlOiBvcHRpb25zLnNlYXJjaEVuZ2luZSwgcXVlcnk6IHJlZGlyZWN0ZWQgfSBhcyBSZXNvbHZlZFF1ZXJ5KTtcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgUXVlcnkgdHlwZSBpZGVudGlmaWVkIGFzICR7cXVlcnlUeXBlfSR7ZXh0cmFjdG9yICYmIHByb3RvY29sID8gJyBidXQgbWlnaHQgbm90IGJlIHVzZWQgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiBwcm90b2NvbCcgOiAnJ31gKTtcblxuICAgICAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgICAgICBpZiAob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3RhcnRzV2l0aCgnZXh0OicpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgRm9yY2luZyAke29wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KX0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICAgICAgICBleHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuZ2V0KG9wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KSkhO1xuICAgICAgICAgICAgaWYgKCFleHRyYWN0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgICAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgICAgICAgLy8gY2FjaGUgdmFsaWRhdGlvblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENoZWNraW5nIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBjYWNoZSBoaXRcbiAgICAgICAgICAgICAgICBpZiAocmVzPy5oYXNUcmFja3MoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgaGl0IGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBtaXNzIGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvcnMuLi5gKTtcblxuICAgICAgICAgICAgLy8gY2FjaGUgbWlzc1xuICAgICAgICAgICAgZXh0cmFjdG9yID1cbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHQudmFsaWRhdGUocXVlcnksIHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk/LmV4dHJhY3RvciB8fCBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm8gZXh0cmFjdG9ycyBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdGYWlsZWQgdG8gZmluZCBhcHByb3ByaWF0ZSBleHRyYWN0b3InKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0cmFjdG9yXG4gICAgICAgICAgICAuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgICAgIHByb3RvY29sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpO1xuXG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCEnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogcmVzLnBsYXlsaXN0LFxuICAgICAgICAgICAgICAgIHRyYWNrczogcmVzLnRyYWNrcyxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEocmVzdWx0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdGYWlsZWQgdG8gZmluZCByZXN1bHQgdXNpbmcgYXBwcm9wcmlhdGUgZXh0cmFjdG9yLiBRdWVyeWluZyBhbGwgZXh0cmFjdG9ycy4uLicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICAgICAgICAgICAhb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBleHQudmFsaWRhdGUocXVlcnkpKSAmJlxuICAgICAgICAgICAgICAgIGV4dC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZXN1bHQ/LnJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEZhaWxlZCB0byBxdWVyeSBtZXRhZGF0YSBxdWVyeSB1c2luZyAke3Jlc3VsdD8uZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgJ04vQSd9IGV4dHJhY3Rvci5gKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQ/LmV4dHJhY3RvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwgdXNpbmcgJHtyZXN1bHQuZXh0cmFjdG9yLmlkZW50aWZpZXJ9IWApO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgcGxheWxpc3Q6IHJlc3VsdC5yZXN1bHQucGxheWxpc3QsXG4gICAgICAgICAgICB0cmFja3M6IHJlc3VsdC5yZXN1bHQudHJhY2tzLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGBkaXNjb3JkLXZvaXBgIG1vZHVsZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnNvbGUubG9nKHBsYXllci5zY2FuRGVwcygpKTtcbiAgICAgKiAvLyAtPiBsb2dzIGRlcGVuZGVuY2llcyByZXBvcnRcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHB1YmxpYyBzY2FuRGVwcygpIHtcbiAgICAgICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuICAgICAgICBjb25zdCBydW50aW1lID0gJ0J1bicgaW4gZ2xvYmFsVGhpcyA/ICdCdW4nIDogJ0Rlbm8nIGluIGdsb2JhbFRoaXMgPyAnRGVubycgOiAnTm9kZSc7XG4gICAgICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBbXG4gICAgICAgICAgICAnRGlzY29yZCBQbGF5ZXInLFxuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIGAtIGRpc2NvcmQtcGxheWVyOiAke1BsYXllci52ZXJzaW9ufWAsXG4gICAgICAgICAgICBgLSBkaXNjb3JkLXZvaXA6ICR7ZFZvaWNlVmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gZGlzY29yZC5qczogJHtkanNWZXJzaW9ufWAsXG4gICAgICAgICAgICBgLSBOb2RlIHZlcnNpb246ICR7cHJvY2Vzcy52ZXJzaW9ufSAoRGV0ZWN0ZWQgUnVudGltZTogJHtydW50aW1lfSwgUGxhdGZvcm06ICR7cHJvY2Vzcy5wbGF0Zm9ybX0gWyR7cHJvY2Vzcy5hcmNofV0pYCxcbiAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VMZWdhY3lGRm1wZWcpIHJldHVybiAnLSBmZm1wZWc6IE4vQSAodXNpbmcgbGVnYWN5IGZmbXBlZyknO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBGRm1wZWcubG9jYXRlU2FmZSgpO1xuICAgICAgICAgICAgICAgIGlmICghaW5mbykgcmV0dXJuICdGRm1wZWcvQXZjb252IG5vdCBmb3VuZCc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gW2AtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCwgYC0gY29tbWFuZDogJHtpbmZvLmNvbW1hbmR9YCwgYC0gc3RhdGljOiAke2luZm8uaXNTdGF0aWN9YCwgYC0gbGlib3B1czogJHtpbmZvLm1ldGFkYXRhIS5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpfWBdLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgICdcXG4nLFxuICAgICAgICAgICAgJ0xvYWRlZCBFeHRyYWN0b3JzOicsXG4gICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlXG4gICAgICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5pZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpIHx8ICdOL0EnLFxuICAgICAgICAgICAgJ1xcblxcbmRpc2NvcmQtdm9pcCcsXG4gICAgICAgICAgICBnZW5lcmF0ZURlcGVuZGVuY3lSZXBvcnQoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiBkZXBzUmVwb3J0LmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLm5vZGVzLmNhY2hlLnZhbHVlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYFBsYXlsaXN0YCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQbGF5bGlzdChkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWxpc3QodGhpcywgZGF0YSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL21hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIocGxheWVyOiBQbGF5ZXIsIHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmICFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIG5vb3AgKi9cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdm9pZCBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRpc2Nvbm5lY3QsIHF1ZXVlKTtcbiAgICB9XG5cbiAgICBpZiAocXVldWUub3B0aW9ucy5wYXVzZU9uRW1wdHkpIHtcbiAgICAgICAgY29uc3QgaXNFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuXG4gICAgICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZCh0cnVlKTtcbiAgICAgICAgICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAocXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcGF1c2luZy4uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFJlZmxlY3QuZ2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JykpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgUmVmbGVjdC5zZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLmRlYnVnKCdWb2ljZSBjaGFubmVsIGlzIG5vdCBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcmVzdW1pbmcuLi4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zZXJ2ZXJNdXRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiYgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpIHtcbiAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnN1cHByZXNzKTtcbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgICAgIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICBpZiAocXVldWUuY29ubmVjdGlvbiAmJiBuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUuY29ubmVjdGlvbiAmJiAhVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAhPT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgaXAgZnJvbSAnaXAnO1xuXG5leHBvcnQgY2xhc3MgSVBCbG9jayB7XG4gICAgcHVibGljIHVzYWdlID0gMDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2lkcjogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBjaWRyU2l6ZTogbnVtYmVyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBibG9jazogc3RyaW5nKSB7XG4gICAgICAgIGlmIChpcC5pc1Y0Rm9ybWF0KGJsb2NrLnNwbGl0KCcvJylbMF0pICYmICFibG9jay5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgICBibG9jayArPSAnLzMyJztcbiAgICAgICAgfSBlbHNlIGlmIChpcC5pc1Y2Rm9ybWF0KGJsb2NrLnNwbGl0KCcvJylbMF0pICYmICFibG9jay5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgICBibG9jayArPSAnLzEyOCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNpZHIgPSBpcC5jaWRyKHRoaXMuYmxvY2spO1xuICAgICAgICB0aGlzLmNpZHJTaXplID0gaXAuY2lkclN1Ym5ldCh0aGlzLmJsb2NrKS5zdWJuZXRNYXNrTGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdW1lKCkge1xuICAgICAgICB0aGlzLnVzYWdlKys7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQUm90YXRpb25Db25maWcge1xuICAgIC8qKlxuICAgICAqIElQIGJsb2NrcyB0byB1c2VcbiAgICAgKi9cbiAgICBibG9ja3M6IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIElQcyB0byBleGNsdWRlXG4gICAgICovXG4gICAgZXhjbHVkZT86IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIE1heCByZXRyaWVzIHRvIGZpbmQgYW4gSVAgdGhhdCBpcyBub3QgZXhjbHVkZWRcbiAgICAgKi9cbiAgICBtYXhSZXRyaWVzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgSVBSb3RhdG9yIHtcbiAgICBwdWJsaWMgYmxvY2tzOiBJUEJsb2NrW10gPSBbXTtcbiAgICBwdWJsaWMgZmFpbHVyZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIHB1YmxpYyBNQVhfTkVYVF9SRVRSSUVTID0gMzA7XG4gICAgI3JldHJpZXMgPSAwO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb25maWc6IElQUm90YXRpb25Db25maWcpIHtcbiAgICAgICAgY29uZmlnLmV4Y2x1ZGUgPz89IFtdO1xuICAgICAgICB0aGlzLmJsb2NrcyA9IGNvbmZpZy5ibG9ja3MubWFwKChibG9jaykgPT4gbmV3IElQQmxvY2soYmxvY2spKTtcbiAgICAgICAgdGhpcy5NQVhfTkVYVF9SRVRSSUVTID0gY29uZmlnLm1heFJldHJpZXMgPz8gMTA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldElQKCk6IHsgaXA6IHN0cmluZzsgZmFtaWx5OiA0IHwgNiB9IHtcbiAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmJsb2Nrcy5zb3J0KChhLCBiKSA9PiBhLnVzYWdlIC0gYi51c2FnZSlbMF07XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gSVAgYmxvY2tzIGF2YWlsYWJsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZG9tID0gSVBSb3RhdG9yLmdldFJhbmRvbUlQKGJsb2NrLmNpZHIsIGJsb2NrLmNpZHJTaXplKTtcblxuICAgICAgICBpZiAodGhpcy5pc0ZhaWxlZE9yRXhjbHVkZWQocmFuZG9tKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3JldHJpZXMrKyA+IHRoaXMuTUFYX05FWFRfUkVUUklFUykge1xuICAgICAgICAgICAgICAgIHRoaXMuI3JldHJpZXMgPSAwO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgYW4gSVAgdGhhdCBpcyBub3QgZXhjbHVkZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SVAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI3JldHJpZXMgPSAwO1xuICAgICAgICBibG9jay5jb25zdW1lKCk7XG4gICAgICAgIHJldHVybiB7IGlwOiByYW5kb20sIGZhbWlseTogaXAuaXNWNEZvcm1hdChyYW5kb20pID8gNCA6IDYgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNGYWlsZWRPckV4Y2x1ZGVkKGlwOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZXMuaGFzKGlwKSB8fCAhIXRoaXMuY29uZmlnLmV4Y2x1ZGU/LmluY2x1ZGVzKGlwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmFpbGVkKGlwOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGFzdEZhaWxlZENvdW50ID0gdGhpcy5mYWlsdXJlcy5nZXQoaXApID8/IDA7XG5cbiAgICAgICAgdGhpcy5mYWlsdXJlcy5zZXQoaXAsIGxhc3RGYWlsZWRDb3VudCArIDEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmFuZG9tSVAoYWRkcmVzczogc3RyaW5nLCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKSB7XG4gICAgICAgIC8vIEF1dGhvcjogSmVzc2UgVGFuZSA8amVzc2UudGFuZUBnbWFpbC5jb20+XG4gICAgICAgIC8vIE5QTUpTOiBodHRwczovL25wbWpzLm9yZy9yYW5kb20taXBcblxuICAgICAgICBjb25zdCBieXRlcyA9IGlwLnRvQnVmZmVyKGFkZHJlc3MpO1xuICAgICAgICBjb25zdCBpcHY2ID0gYnl0ZXMubGVuZ3RoID09PSAxNjtcbiAgICAgICAgY29uc3QgYnl0ZXNpemUgPSA4O1xuXG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICAgICAgZW5kID0gdHlwZW9mIGVuZCAhPT0gJ3VuZGVmaW5lZCcgPyBlbmQgOiBieXRlcy5sZW5ndGggKiBieXRlc2l6ZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYml0ID0gaSAqIGJ5dGVzaXplO1xuXG4gICAgICAgICAgICBpZiAoYml0ICsgYnl0ZXNpemUgPCBzdGFydCB8fCBiaXQgPj0gZW5kKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBiID0gYnl0ZXNbaV07XG5cbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnl0ZXNpemU7IG4rKykge1xuICAgICAgICAgICAgICAgIGlmIChiaXQgPj0gc3RhcnQgJiYgYml0IDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpdHBvcyA9IGJ5dGVzaXplIC0gbiAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpdG1hc2sgPSAxIDw8IGJpdHBvcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCAwLjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgfD0gYml0bWFzaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgJj0gfmJpdG1hc2s7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYml0Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJ5dGVzW2ldID0gYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRldHMgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXB2Nikge1xuICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXRzW2kgPj4gMV0gPSAoKGJ5dGVzW2ldIDw8IGJ5dGVzaXplKSB8IGJ5dGVzW2kgKyAxXSkudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGV0c1tpXSA9IGJ5dGVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRldHMuam9pbihpcHY2ID8gJzonIDogJy4nKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmNvbnN0IHByZWZlcnJlZEluc3RhbmNlS2V5ID0gJ19fZGlzY29yZF9wbGF5ZXJfaG9va19pbnN0YW5jZV9jYWNoZV9fJztcblxuZXhwb3J0IGNvbnN0IGdldFBsYXllciA9ICgpID0+IHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmdldChwcmVmZXJyZWRJbnN0YW5jZUtleSkgfHwgaW5zdGFuY2VzLmZpcnN0KCkgfHwgbnVsbDtcbn07XG5cbi8qKlxuICogQmluZCBhIHBsYXllciBpbnN0YW5jZSB0byB0aGUgaG9vayBzeXN0ZW0sIGRlZmF1bHRzIHRvIHRoZSBmaXJzdCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGJpbmRIb29rID0gKHBsYXllcjogUGxheWVyKSA9PiB7XG4gICAgaW5zdGFuY2VzLnNldChwcmVmZXJyZWRJbnN0YW5jZUtleSwgcGxheWVyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRRdWV1ZSA9IDxUID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpID0+IHtcbiAgICBjb25zdCBwbGF5ZXIgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gKHBsYXllci5ub2Rlcy5yZXNvbHZlKG5vZGUpIGFzIEd1aWxkUXVldWU8VD4pIHx8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tEZWNsYXJhdGlvbkNvbnRleHQge1xuICAgIGdldFF1ZXVlOiB0eXBlb2YgZ2V0UXVldWU7XG4gICAgZ2V0UGxheWVyOiB0eXBlb2YgZ2V0UGxheWVyO1xuICAgIGluc3RhbmNlczogdHlwZW9mIGluc3RhbmNlcztcbn1cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IHR5cGUgSG9va0RlY2xhcmF0aW9uPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4gPSAoY29udGV4dDogSG9va0RlY2xhcmF0aW9uQ29udGV4dCkgPT4gVDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2s8VCBleHRlbmRzIEhvb2tEZWNsYXJhdGlvbjwoLi4uYXJnczogYW55W10pID0+IGFueT4+KGhvb2s6IFQpOiBSZXR1cm5UeXBlPFQ+IHtcbiAgICByZXR1cm4gaG9vayh7XG4gICAgICAgIGdldFF1ZXVlLFxuICAgICAgICBnZXRQbGF5ZXIsXG4gICAgICAgIGluc3RhbmNlc1xuICAgIH0pIGFzIFJldHVyblR5cGU8VD47XG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBoaXN0b3J5XG4gKiBAcGFyYW0gbm9kZSBndWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZS5oaXN0b3J5O1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBwbGF5ZXIgbm9kZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZS5ub2RlO1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlPE1ldGE+KG5vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHF1ZXVlO1xufVxuIiwgImltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgZ2V0UGxheWVyIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWFzdGVyUGxheWVyKCkge1xuICAgIFV0aWwud2FybigndXNlTWFzdGVyUGxheWVyKCkgaG9vayBpcyBkZXByZWNhdGVkLCB1c2UgdXNlTWFpblBsYXllcigpIGluc3RlYWQuJywgJ0RlcHJlY2F0aW9uV2FybmluZycpO1xuICAgIHJldHVybiB1c2VNYWluUGxheWVyKCk7XG59XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1haW5QbGF5ZXIoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OKCd1c2VNYWluUGxheWVyJywgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBjYWxsaW5nIFwidXNlTWFpblBsYXllclwiIGhvb2sgYmVmb3JlIGNyZWF0aW5nIGEgcGxheWVyIGluc3RhbmNlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbn1cbiIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGd1aWxkIHF1ZXVlIG1ldGFkYXRhXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8VD4obm9kZSk7XG4gICAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihtZXRhZGF0YSkpIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtnZXR0ZXIsIHNldHRlcl0gYXMgY29uc3Q7XG59XG4iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICAgIGlnbm9yZUZpbHRlcnM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRpbWVsaW5lIGRpc3BhdGNoZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG5vZGU6IE5vZGVSZXNvbHZhYmxlLCBvcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPikge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHtcbiAgICAgICAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChvcHRpb25zPy5pZ25vcmVGaWx0ZXJzKSE7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS52b2x1bWU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgdHJhY2soKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUuY3VycmVudFRyYWNrO1xuICAgICAgICB9LFxuICAgICAgICBwYXVzZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnBhdXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNlZWsodGltZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFmdGVyQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25CZWZvcmVDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQmVmb3JlQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufVxuIiwgImltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOID0gKHByZXZpb3VzOiBudW1iZXIpID0+IG51bWJlcjtcblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIHBsYXllciB2b2x1bWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZShub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUocXVldWUubm9kZS52b2x1bWUpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5ub2RlLnZvbHVtZSBhcyBudW1iZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFBQUMsa0JBQXNDOzs7QUNFdEMsbUJBQTZCOzs7QUNBN0Isc0JBQTJCOzs7QUNGM0IscUJBQTBGOzs7QUNBbkYsSUFBTSxZQUFOLE1BQU0sVUFBUztBQUFBLEVBQ1YsY0FBYztBQUNsQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUEsRUFHQSxPQUFjLFdBQVcsR0FBMkI7QUFDaEQsV0FBTyxPQUFPLE1BQU07QUFBQSxFQUN4QjtBQUFBLEVBRUEsT0FBYyxTQUFTLEdBQXlCO0FBQzVDLFdBQU8sT0FBTyxNQUFNLFlBQVksQ0FBQyxNQUFNLENBQUM7QUFBQSxFQUM1QztBQUFBLEVBRUEsT0FBYyxTQUFTLEdBQXlCO0FBQzVDLFdBQU8sT0FBTyxNQUFNO0FBQUEsRUFDeEI7QUFBQSxFQUVBLE9BQWMsVUFBVSxHQUEwQjtBQUM5QyxXQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3hCO0FBQUEsRUFFQSxPQUFjLFVBQVUsR0FBbUM7QUFDdkQsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUVBLE9BQWMsUUFBUSxHQUE0QjtBQUM5QyxXQUFPLE1BQU0sUUFBUSxDQUFDO0FBQUEsRUFDMUI7QUFBQSxFQUVBLE9BQWMsUUFBUSxHQUF3QjtBQUMxQyxXQUFPLGFBQWE7QUFBQSxFQUN4QjtBQUNKO0FBakNzQjtBQUFmLElBQU0sV0FBTjs7O0FDQVAsSUFBTSxzQkFBc0I7QUFBQSxFQUN4QixrQkFBa0I7QUFBQSxJQUNkLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFlBQVlDLFNBQWdCLFVBQWtCLE9BQWU7QUFDekQsYUFBTyxJQUFJLEtBQUssSUFBSSw4QkFBOEJBLE9BQU0sY0FBYyxRQUFRLFVBQVUsS0FBSztBQUFBLElBQ2pHO0FBQUEsRUFDSjtBQUFBLEVBQ0Esc0JBQXNCO0FBQUEsSUFDbEIsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sWUFBWUEsU0FBZ0IsYUFBcUIsT0FBZTtBQUM1RCxhQUFPLElBQUksS0FBSyxJQUFJLGNBQWNBLE9BQU0sV0FBVyxXQUFXLGdCQUFnQixLQUFLO0FBQUEsSUFDdkY7QUFBQSxFQUNKO0FBQUEsRUFDQSxlQUFlO0FBQUEsSUFDWCxNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixZQUFZLFNBQWlCO0FBQ3pCLGFBQU8sSUFBSSxLQUFLLElBQUksS0FBSyxPQUFPO0FBQUEsSUFDcEM7QUFBQSxFQUNKO0FBQUEsRUFDQSxxQkFBcUI7QUFBQSxJQUNqQixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixZQUFZQSxTQUFnQjtBQUN4QixhQUFPLElBQUksS0FBSyxJQUFJLEtBQUtBLE9BQU07QUFBQSxJQUNuQztBQUFBLEVBQ0o7QUFBQSxFQUNBLGtCQUFrQjtBQUFBLElBQ2QsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sWUFBWUEsU0FBZ0I7QUFDeEIsYUFBTyxJQUFJLEtBQUssSUFBSSxLQUFLQSxPQUFNO0FBQUEsSUFDbkM7QUFBQSxFQUNKO0FBQUEsRUFDQSxrQkFBa0I7QUFBQSxJQUNkLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFlBQVlBLFNBQWdCLE9BQWUsU0FBaUIsU0FBaUI7QUFDekUsYUFBTyxJQUFJLEtBQUssSUFBSSxLQUFLQSxPQUFNLHNDQUFzQyxPQUFPLGdCQUFnQixPQUFPLFNBQVMsS0FBSztBQUFBLElBQ3JIO0FBQUEsRUFDSjtBQUFBLEVBQ0EseUJBQXlCO0FBQUEsSUFDckIsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sWUFBWSxTQUFrQjtBQUMxQixhQUFPLElBQUksS0FBSyxJQUFJLFFBQVEsV0FBVztBQUFBLElBQzNDO0FBQUEsRUFDSjtBQUFBLEVBQ0EsZ0NBQWdDO0FBQUEsSUFDNUIsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sY0FBYztBQUNWLGFBQU8sSUFBSSxLQUFLLElBQUk7QUFBQSxJQUN4QjtBQUFBLEVBQ0o7QUFBQSxFQUNBLHNCQUFzQjtBQUFBLElBQ2xCLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLGNBQWM7QUFDVixhQUFPLElBQUksS0FBSyxJQUFJO0FBQUEsSUFDeEI7QUFBQSxFQUNKO0FBQUEsRUFDQSwyQkFBMkI7QUFBQSxJQUN2QixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixjQUFjO0FBQ1YsYUFBTyxJQUFJLEtBQUssSUFBSTtBQUFBLElBQ3hCO0FBQUEsRUFDSjtBQUFBLEVBQ0EsaUJBQWlCO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixZQUFZLFNBQWtCO0FBQzFCLGFBQU8sSUFBSSxLQUFLLElBQUksUUFBUSxXQUFXO0FBQUEsSUFDM0M7QUFBQSxFQUNKO0FBQUEsRUFDQSxvQkFBb0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixZQUFZLFNBQWlCO0FBQ3pCLGFBQU8sSUFBSSxLQUFLLElBQUksT0FBTztBQUFBLElBQy9CO0FBQUEsRUFDSjtBQUFBLEVBQ0EsdUJBQXVCO0FBQUEsSUFDbkIsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sWUFBWSxTQUFrQjtBQUMxQixhQUFPLElBQUksS0FBSyxJQUFJLFFBQVEsV0FBVztBQUFBLElBQzNDO0FBQUEsRUFDSjtBQUFBLEVBQ0Esb0JBQW9CO0FBQUEsSUFDaEIsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sWUFBWSxTQUFrQjtBQUMxQixhQUFPLElBQUksS0FBSyxJQUFJLFFBQVEsV0FBVztBQUFBLElBQzNDO0FBQUEsRUFDSjtBQUFBLEVBQ0EsY0FBYztBQUFBLElBQ1YsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sWUFBWSxTQUFrQjtBQUMxQixhQUFPLElBQUksS0FBSyxJQUFJLFFBQVEsV0FBVztBQUFBLElBQzNDO0FBQUEsRUFDSjtBQUFBLEVBQ0EsbUJBQW1CO0FBQUEsSUFDZixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixZQUFZQSxTQUFnQixRQUFnQjtBQUN4QyxhQUFPLElBQUksS0FBSyxJQUFJLGNBQWNBLE9BQU0sWUFBWSxNQUFNO0FBQUEsSUFDOUQ7QUFBQSxFQUNKO0FBQUEsRUFDQSwwQkFBMEI7QUFBQSxJQUN0QixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixjQUFjO0FBQ1YsYUFBTyxJQUFJLEtBQUssSUFBSTtBQUFBLElBQ3hCO0FBQUEsRUFDSjtBQUFBLEVBQ0EsNEJBQTRCO0FBQUEsSUFDeEIsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sY0FBYztBQUNWLGFBQU8sSUFBSSxLQUFLLElBQUk7QUFBQSxJQUN4QjtBQUFBLEVBQ0o7QUFBQSxFQUNBLDZCQUE2QjtBQUFBLElBQ3pCLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFlBQVlBLFNBQWdCLFNBQWtCO0FBQzFDLGFBQU8sSUFBSSxLQUFLLElBQUksMkJBQWdDQSxPQUFNLFNBQVMsVUFBVSxJQUFJLE9BQU8sS0FBSyxFQUFFO0FBQUEsSUFDbkc7QUFBQSxFQUNKO0FBQ0o7QUFVQSxJQUFNLFNBQVMsQ0FBQztBQUVoQixJQUFNLFVBQXVDO0FBQUEsRUFDekMsSUFBSUEsU0FBUSxHQUFxQyxVQUFVO0FBQ3ZELFVBQU0sTUFBTSxvQkFBb0IsQ0FBQztBQUVqQyxRQUFJLENBQUM7QUFBSyxhQUFPLFFBQVEsSUFBSUEsU0FBUSxHQUFHLFFBQVE7QUFFaEQsV0FBTyxJQUFJLFNBQWtEO0FBRXpELFlBQU0sWUFBWSxJQUFJLElBQUksS0FBSyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDdkQsZ0JBQVUsT0FBTyxJQUFJO0FBRXJCLGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUNKO0FBRU8sSUFBTSxjQUFjLE1BQU07QUFLN0IsUUFBTSxPQUFPLENBQUM7QUFFZCxhQUFXLFFBQVEscUJBQXFCO0FBRXBDLFNBQUssSUFBSSxJQUFJO0FBQUEsRUFDakI7QUFFQSxTQUFPLE9BQU8sT0FBTyxJQUFJO0FBQzdCLEdBQUc7QUFDSSxJQUFNLGFBQWEsSUFBSSxNQUFNLFFBQVEsT0FBTzs7O0FDM0tuRCxvQkFBdUI7QUFHaEIsSUFBSyxpQkFBTCxrQkFBS0Msb0JBQUw7QUFDSCxFQUFBQSxnQkFBQSxXQUFRO0FBQ1IsRUFBQUEsZ0JBQUEsY0FBVztBQUZILFNBQUFBO0FBQUEsR0FBQTtBQU9aLElBQU0sVUFBVSx3QkFBQyxTQUF1QyxLQUFLLFVBQVUscUJBQXZEO0FBQ2hCLElBQU0sYUFBYSx3QkFBQyxTQUEwQyxLQUFLLFVBQVUsMkJBQTFEO0FBRVosU0FBUyxVQUFVLE1BQThCO0FBQ3BELE1BQUksZ0JBQWdCO0FBQU8sV0FBTyxLQUFLLFVBQVU7QUFDakQsTUFBSSxnQkFBZ0I7QUFBVSxXQUFPLEtBQUssVUFBVTtBQUVwRCxNQUFJO0FBQ0EsV0FBTyxLQUFLLE9BQU87QUFBQSxFQUN2QixRQUFRO0FBQ0osVUFBTSxXQUFXLHlCQUF5QjtBQUFBLEVBQzlDO0FBQ0o7QUFUZ0I7QUFXVCxTQUFTLFlBQVksUUFBZ0IsTUFBaUI7QUFDekQsTUFBSSxRQUFRLElBQUk7QUFBRyxXQUFPLE1BQU0sZUFBZSxRQUFRLElBQUk7QUFDM0QsTUFBSSxXQUFXLElBQUk7QUFBRyxXQUFPLFNBQVMsZUFBZSxRQUFRLElBQUk7QUFFakUsUUFBTSxXQUFXLDJCQUEyQjtBQUNoRDtBQUxnQjtBQU9ULFNBQVMsT0FBTyxNQUFpQjtBQUNwQyxRQUFNLE1BQU0sS0FBSyxVQUFVLElBQUk7QUFFL0IsU0FBTyxxQkFBTyxLQUFLLEdBQUcsRUFBRSxTQUFTLFFBQVE7QUFDN0M7QUFKZ0I7QUFNVCxTQUFTLE9BQU8sTUFBYztBQUNqQyxRQUFNLE1BQU0scUJBQU8sS0FBSyxNQUFNLFFBQVEsRUFBRSxTQUFTO0FBRWpELFNBQU8sS0FBSyxNQUFNLEdBQUc7QUFDekI7QUFKZ0I7QUFNVCxTQUFTLHVCQUF1QixNQUFXO0FBQzlDLE1BQUksQ0FBQztBQUFNLFdBQU87QUFDbEIsTUFBSTtBQUNBLFFBQUksU0FBUyxTQUFTLElBQUk7QUFBRyxhQUFPO0FBQ3BDLFdBQU8sTUFBTSxPQUFPLE1BQU0sV0FBVyxPQUFPO0FBQUEsRUFDaEQsUUFBUTtBQUNKLFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFSZ0I7OztBSDVCVCxJQUFNLFNBQU4sTUFBTSxPQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXdCckIsWUFBNEIsUUFBZ0IsTUFBOEM7QUFBOUQ7QUFoQm5DLFNBQU8sY0FBMkI7QUFFbEMsU0FBTyxZQUFnRDtBQUN2RCxTQUFPLE1BQW9CO0FBQUEsTUFDdkIsUUFBUTtBQUFBLElBQ1o7QUFDQSxTQUFPLFlBQWtDO0FBQ3pDLFNBQWdCLEtBQUssNkJBQWMsU0FBUyxFQUFFLFNBQVM7QUFDdkQsU0FBUSxhQUF1QjtBQVMzQixTQUFLLFlBQVEsK0JBQWUsS0FBSyxTQUFTLEVBQUU7QUFDNUMsU0FBSyxTQUFTLEtBQUssVUFBVTtBQUM3QixTQUFLLE1BQU0sS0FBSyxPQUFPO0FBQ3ZCLFNBQUssWUFBWSxLQUFLLGFBQWE7QUFDbkMsU0FBSyxXQUFXLEtBQUssWUFBWTtBQUNqQyxTQUFLLFFBQVEsS0FBSyxTQUFTO0FBQzNCLFNBQUssWUFBWSxLQUFLO0FBQ3RCLFNBQUssY0FBYyxLQUFLLGVBQWU7QUFDdkMsU0FBSyxXQUFXLEtBQUs7QUFDckIsU0FBSyxjQUFjLEdBQUcsS0FBSyxLQUFLLE9BQU8sS0FBSyxNQUFNO0FBQ2xELFNBQUssTUFBTSxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsUUFBUSxLQUFLLEtBQUssVUFBVSxLQUFLLE9BQU8sR0FBRyxLQUFLLE9BQU8sSUFBSTtBQUMxRixTQUFLLGFBQWEsS0FBSyxZQUFZO0FBQ25DLFNBQUssa0JBQWtCLEtBQUssb0JBQW9CLE1BQU0sUUFBUSxRQUFrQixJQUFJO0FBQUEsRUFDeEY7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWEsa0JBQWtCO0FBQzNCLFVBQU0sTUFBTSxNQUFNLEtBQUssZ0JBQWdCO0FBRXZDLFNBQUssWUFBWSxHQUFHO0FBRXBCLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxZQUFZLEdBQWE7QUFDNUIsU0FBSyxhQUFhO0FBQUEsRUFDdEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsV0FBVztBQUNsQixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxjQUFjO0FBQ3JCLFdBQU8sS0FBSyxZQUFZO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsUUFBb0I7QUFDM0IsV0FBTyxLQUFLLE9BQU8sTUFBTSxNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sS0FBSyxFQUFFLENBQUM7QUFBQSxFQUN2RjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxhQUFxQjtBQUM1QixVQUFNLFFBQVEsd0JBQUMsR0FBVyxNQUFjO0FBQ3BDLFVBQUksS0FBSztBQUNULGVBQVMsSUFBSSxHQUFHLElBQUksR0FBRztBQUFLLGNBQU07QUFDbEMsYUFBTyxLQUFLLElBQUksTUFBTyxLQUFLO0FBQUEsSUFDaEMsR0FKYztBQU1kLFdBQU8sS0FBSyxTQUNQLE1BQU0sR0FBRyxFQUNULFFBQVEsRUFDUixJQUFJLENBQUMsR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFDeEMsT0FBTyxDQUFDLEdBQUcsTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUFBLEVBQ2xDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxjQUFtRTtBQUN0RSxXQUFPLElBQUksS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsRUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsU0FBUztBQUNoQixXQUFPLEtBQUssS0FBSyxVQUFVO0FBQUEsRUFDL0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFdBQW1CO0FBQ3RCLFdBQU8sR0FBRyxLQUFLLEtBQUssT0FBTyxLQUFLLE1BQU07QUFBQSxFQUMxQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sT0FBTyxjQUF3QjtBQUNsQyxXQUFPO0FBQUEsTUFDSCxJQUFJLEtBQUs7QUFBQSxNQUNULE9BQU8sS0FBSztBQUFBLE1BQ1osYUFBYSxLQUFLO0FBQUEsTUFDbEIsUUFBUSxLQUFLO0FBQUEsTUFDYixLQUFLLEtBQUs7QUFBQSxNQUNWLFdBQVcsS0FBSztBQUFBLE1BQ2hCLFVBQVUsS0FBSztBQUFBLE1BQ2YsWUFBWSxLQUFLO0FBQUEsTUFDakIsT0FBTyxLQUFLO0FBQUEsTUFDWixhQUFhLEtBQUssYUFBYSxNQUFNO0FBQUEsTUFDckMsVUFBVSxlQUFlLE9BQU8sS0FBSyxVQUFVLE9BQU8sS0FBSztBQUFBLElBQy9EO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sWUFBWTtBQUNmLFdBQU87QUFBQSxNQUNILE9BQU8sS0FBSztBQUFBLE1BQ1osYUFBYSxLQUFLO0FBQUEsTUFDbEIsUUFBUSxLQUFLO0FBQUEsTUFDYixLQUFLLEtBQUs7QUFBQSxNQUNWLFdBQVcsU0FBUyxTQUFTLEtBQUssU0FBUyxJQUFJLEtBQUssWUFBWSx1QkFBdUIsS0FBSyxTQUFTO0FBQUEsTUFDckcsVUFBVSxLQUFLO0FBQUEsTUFDZixPQUFPLEtBQUssU0FBUztBQUFBLE1BQ3JCLGNBQWMsS0FBSyxhQUFhLE9BQU8sS0FBSztBQUFBLE1BQzVDLFFBQVEsS0FBSztBQUFBLE1BQ2IsTUFBTTtBQUFBLE1BQ04sWUFBWSxLQUFLO0FBQUEsTUFDakIsV0FBVyxLQUFLLFdBQVcsY0FBYztBQUFBLE1BQ3pDLFVBQVUsS0FBSztBQUFBLE1BQ2Y7QUFBQSxNQUNBLGtCQUFrQjtBQUFBLElBQ3RCO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE9BQWMsZUFBZSxRQUFnQixNQUFzQztBQUMvRSxRQUFJLEtBQUs7QUFBZ0MsWUFBTSxXQUFXLHFCQUFxQixRQUFRLG1CQUFtQixnQkFBZ0I7QUFDMUgsVUFBTSxRQUFRLElBQUksT0FBTSxRQUFRO0FBQUEsTUFDNUIsR0FBRztBQUFBLE1BQ0gsYUFBYSxLQUFLLGdCQUNYLE1BQU07QUFDSCxjQUFNLE1BQU0sS0FBSztBQUNqQixZQUFJO0FBQ0EsZ0JBQU0sV0FBVyxPQUFPLE9BQU8sTUFBTSxRQUFRLElBQUksRUFBRTtBQUNuRCxjQUFJO0FBQVUsbUJBQU87QUFDckIsY0FBSSxPQUFPLE9BQU8sTUFBTSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQUcsbUJBQU8sT0FBTyxPQUFPLE1BQU0sTUFBTSxJQUFJLElBQUksRUFBRTtBQUV0RixnQkFBTSxPQUFPLElBQUksb0JBQUssT0FBTyxRQUFRLEdBQUc7QUFDeEMsaUJBQU87QUFBQSxRQUNYLFFBQVE7QUFDSixpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKLEdBQUcsSUFDSDtBQUFBLE1BQ04sV0FBVyxLQUFLLGNBQWM7QUFBQSxJQUNsQyxDQUFDO0FBRUQsVUFBTSxZQUFZLEtBQUssUUFBUTtBQUUvQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08scUJBQXFCO0FBQ3hCLFVBQU0sUUFBUSxLQUFLLE9BQU8sTUFBTSxNQUFNLE9BQU8sQ0FBQyxTQUFTLEtBQUssT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBSyxFQUFFLENBQUM7QUFFaEcsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFhLEtBQWtCLFNBQXNDLFNBQXVGO0FBQ3hKLFVBQU0sS0FBSyxLQUFLLE9BQU8sS0FBSyxLQUFLLEtBQUssTUFBTTtBQUU1QyxXQUFPLE1BQU0sR0FBRyxTQUFTLE1BQU0sT0FBTztBQUFBLEVBQzFDO0FBQ0o7QUFsTmdDO0FBQXpCLElBQU0sUUFBTjs7O0FJVEEsSUFBTSxZQUFOLE1BQU0sVUFBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBcUJsQixZQUFZLFFBQWdCLE1BQXdCO0FBT2hELFNBQUssU0FBUztBQU9kLFNBQUssU0FBUyxLQUFLLFVBQVUsQ0FBQztBQU85QixTQUFLLFNBQVMsS0FBSztBQU9uQixTQUFLLGNBQWMsS0FBSztBQU94QixTQUFLLFlBQVksS0FBSztBQVN0QixTQUFLLE9BQU8sS0FBSztBQVdqQixTQUFLLFNBQVMsS0FBSztBQU9uQixTQUFLLEtBQUssS0FBSztBQU9mLFNBQUssTUFBTSxLQUFLO0FBTWhCLFNBQUssUUFBUSxLQUFLO0FBQUEsRUFPdEI7QUFBQSxFQUVBLEVBQUUsT0FBTyxRQUFRLElBQUk7QUFDakIsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsb0JBQW9CO0FBQzNCLFdBQU8sS0FBSyxPQUFPLE9BQU8sQ0FBQyxHQUFHLE1BQU0sSUFBSSxFQUFFLFlBQVksQ0FBQztBQUFBLEVBQzNEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLG9CQUFvQjtBQUMzQixXQUFPLEtBQUssY0FBYyxLQUFLLFFBQVEsS0FBSyxpQkFBaUIsQ0FBQztBQUFBLEVBQ2xFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBTyxhQUFhLE1BQU07QUFDdEIsVUFBTSxVQUFVO0FBQUEsTUFDWixJQUFJLEtBQUs7QUFBQSxNQUNULEtBQUssS0FBSztBQUFBLE1BQ1YsT0FBTyxLQUFLO0FBQUEsTUFDWixhQUFhLEtBQUs7QUFBQSxNQUNsQixXQUFXLEtBQUs7QUFBQSxNQUNoQixNQUFNLEtBQUs7QUFBQSxNQUNYLFFBQVEsS0FBSztBQUFBLE1BQ2IsUUFBUSxLQUFLO0FBQUEsTUFDYixRQUFRLENBQUM7QUFBQSxJQUNiO0FBRUEsUUFBSTtBQUFZLGNBQVEsU0FBUyxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQztBQUV0RSxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sWUFBWTtBQUNmLFdBQU87QUFBQSxNQUNILFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO0FBQUEsTUFDNUMsT0FBTyxLQUFLO0FBQUEsTUFDWixhQUFhLEtBQUs7QUFBQSxNQUNsQixXQUFXLFNBQVMsU0FBUyxLQUFLLFNBQVMsSUFBSSxLQUFLLFlBQVksdUJBQXVCLEtBQUssU0FBUztBQUFBLE1BQ3JHLE1BQU0sS0FBSztBQUFBLE1BQ1gsUUFBUSxLQUFLO0FBQUEsTUFDYixRQUFRLEtBQUs7QUFBQSxNQUNiLElBQUksS0FBSztBQUFBLE1BQ1QsS0FBSyxLQUFLO0FBQUEsTUFDVjtBQUFBLE1BQ0Esa0JBQWtCO0FBQUEsSUFDdEI7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBYyxlQUFlLFFBQWdCLE1BQTBCO0FBQ25FLFFBQUksS0FBSztBQUFtQyxZQUFNLFdBQVcscUJBQXFCLFFBQVEsc0JBQXNCLGdCQUFnQjtBQUNoSSxXQUFPLElBQUksVUFBUyxRQUFRO0FBQUEsTUFDeEIsR0FBRztBQUFBLE1BQ0gsUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sTUFBTSxlQUFlLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDbEUsQ0FBQztBQUFBLEVBQ0w7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFhLEtBQWtCLFNBQXNDLFNBQXVGO0FBQ3hKLFVBQU0sS0FBSyxLQUFLLE9BQU8sS0FBSyxLQUFLLEtBQUssTUFBTTtBQUU1QyxXQUFPLE1BQU0sR0FBRyxTQUFTLE1BQU0sT0FBTztBQUFBLEVBQzFDO0FBQ0o7QUE1THNCO0FBQWYsSUFBTSxXQUFOOzs7QUNtTUEsSUFBTSxZQUFZO0FBQUEsRUFDckIsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1Qsa0JBQWtCO0FBQUEsRUFDbEIsa0JBQWtCO0FBQUEsRUFDbEIscUJBQXFCO0FBQUEsRUFDckIsWUFBWTtBQUFBLEVBQ1osY0FBYztBQUFBLEVBQ2QsZUFBZTtBQUFBLEVBQ2Ysa0JBQWtCO0FBQUEsRUFDbEIsZ0JBQWdCO0FBQUEsRUFDaEIsVUFBVTtBQUFBLEVBQ1YsT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsY0FBYztBQUFBLEVBQ2QsZ0JBQWdCO0FBQUEsRUFDaEIsZUFBZTtBQUFBLEVBQ2YsbUJBQW1CO0FBQUEsRUFDbkIsa0JBQWtCO0FBQUEsRUFDbEIsbUJBQW1CO0FBQUEsRUFDbkIsc0JBQXNCO0FBQUEsRUFDdEIsb0JBQW9CO0FBQUEsRUFDcEIsTUFBTTtBQUFBLEVBQ04sYUFBYTtBQUNqQjtBQVdPLElBQUssY0FBTCxrQkFBS0MsaUJBQUw7QUFDSCxFQUFBQSxhQUFBLFdBQVE7QUFDUixFQUFBQSxhQUFBLFdBQVE7QUFDUixFQUFBQSxhQUFBLHNCQUFtQjtBQUhYLFNBQUFBO0FBQUEsR0FBQTtBQWdFTCxJQUFLLGtCQUFMLGtCQUFLQyxxQkFBTDtBQUlILEVBQUFBLGtDQUFBLFNBQU0sS0FBTjtBQUlBLEVBQUFBLGtDQUFBLFdBQVEsS0FBUjtBQUlBLEVBQUFBLGtDQUFBLFdBQVEsS0FBUjtBQUlBLEVBQUFBLGtDQUFBLGNBQVcsS0FBWDtBQWhCUSxTQUFBQTtBQUFBLEdBQUE7OztBQ2pTTCxJQUFNLGdCQUFOLE1BQU0sY0FBYTtBQUFBLEVBQ2YsWUFBbUIsUUFBd0IsT0FBeUI7QUFBakQ7QUFBd0I7QUFDOUMsU0FBSyxNQUFNLFFBQVEsUUFBUSxDQUFDLFVBQVU7QUFDbEMsWUFBTSxjQUFOLE1BQU0sWUFBYyxLQUFLLE1BQU0sYUFBYTtBQUM1QyxZQUFNLGdCQUFOLE1BQU0sY0FBZ0IsTUFBTSxlQUFlO0FBQUEsSUFDL0MsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVPLGFBQWEsTUFBOEM7QUFDOUQsU0FBSyxNQUFNLFlBQVk7QUFDdkIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVPLGVBQWUsTUFBWTtBQUM5QixTQUFLLE1BQU0sY0FBYztBQUN6QixTQUFLLE1BQU0sUUFBUSxRQUFRLENBQUMsVUFBVTtBQUNsQyxZQUFNLGNBQWM7QUFBQSxJQUN4QixDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVPLGFBQWEsV0FBMEI7QUFDMUMsU0FBSyxNQUFNLFlBQVk7QUFDdkIsU0FBSyxNQUFNLFFBQVEsUUFBUSxDQUFDLFVBQVU7QUFDbEMsWUFBTSxZQUFZO0FBQUEsSUFDdEIsQ0FBQztBQUNELFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFTyxVQUFVLFFBQWlCO0FBQzlCLFNBQUssTUFBTSxTQUFTO0FBQ3BCLFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFTyxTQUFTLE9BQWU7QUFDM0IsU0FBSyxNQUFNLFFBQVE7QUFDbkIsV0FBTztBQUFBLEVBQ1g7QUFBQSxFQUVPLFlBQVksVUFBb0I7QUFDbkMsU0FBSyxNQUFNLFdBQVc7QUFDdEIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsUUFBUTtBQUNmLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFDdEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsWUFBWTtBQUNuQixXQUFPLEtBQUssTUFBTSxhQUFhLFVBQVU7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxZQUFZO0FBQ25CLFdBQU8sS0FBSyxNQUFNLGFBQWE7QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxXQUFXO0FBQ2xCLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFDdEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsU0FBUztBQUNoQixXQUFPLEtBQUssTUFBTSxVQUFVLENBQUM7QUFBQSxFQUNqQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxjQUFjO0FBQ3JCLFdBQU8sS0FBSyxNQUFNLGVBQWU7QUFBQSxFQUNyQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYSxVQUFVO0FBQ25CLFdBQU8sS0FBSyxPQUFPLE9BQU8sS0FBSyxPQUFPO0FBQUEsTUFDbEMsY0FBYyxLQUFLO0FBQUEsTUFDbkIsYUFBYSxLQUFLO0FBQUEsSUFDdEIsQ0FBQztBQUFBLEVBQ0w7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQVU7QUFDYixXQUFPLENBQUMsS0FBSyxPQUFPO0FBQUEsRUFDeEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLGNBQWM7QUFDakIsV0FBTyxLQUFLLFlBQVk7QUFBQSxFQUM1QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sWUFBWTtBQUNmLFdBQU8sS0FBSyxPQUFPLFNBQVM7QUFBQSxFQUNoQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sU0FBUztBQUNaLFdBQU87QUFBQSxNQUNILE9BQU8sS0FBSztBQUFBLE1BQ1osV0FBVyxLQUFLO0FBQUEsTUFDaEIsVUFBVSxLQUFLLFVBQVUsT0FBTyxLQUFLLEtBQUs7QUFBQSxNQUMxQyxRQUFRLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQUEsTUFDN0MsV0FBVyxLQUFLLFdBQVcsY0FBYztBQUFBLE1BQ3pDLGFBQWEsS0FBSyxhQUFhLE9BQU8sS0FBSztBQUFBLElBQy9DO0FBQUEsRUFDSjtBQUNKO0FBbEkwQjtBQUFuQixJQUFNLGVBQU47OztBQ2RQLElBQU0sT0FBTyx3QkFBQyxNQUFjLFVBQVUsQ0FBQyxnQkFBMUI7QUFFTixJQUFNLGdCQUFOLE1BQU0sY0FBYTtBQUFBLEVBQ2YsY0FBYztBQUNqQixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBd0NBLE9BQWMsSUFBMkIsTUFBUztBQUM5QyxXQUFPLEtBQUssUUFBUSxJQUFJLEtBQUs7QUFBQSxFQUNqQztBQUFBLEVBRUEsT0FBYyxJQUEyQixNQUFTO0FBQzlDLFdBQU8sUUFBUSxLQUFLO0FBQUEsRUFDeEI7QUFBQSxFQUVBLFNBQWdCLE9BQU8sUUFBUSxJQUE0RDtBQUN2RixlQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssT0FBTyxRQUFRLEtBQUssT0FBTyxHQUFHO0FBQy9DLFlBQU0sRUFBRSxNQUFNLEdBQWtCLE9BQU8sRUFBWTtBQUFBLElBQ3ZEO0FBQUEsRUFDSjtBQUFBLEVBRUEsV0FBa0IsUUFBUTtBQUN0QixXQUFPLE9BQU8sS0FBSyxLQUFLLE9BQU87QUFBQSxFQUNuQztBQUFBO0FBQUEsRUFHQSxXQUFrQixTQUFTO0FBQ3ZCLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFDdEI7QUFBQSxFQUVBLE9BQWMsV0FBVztBQUNyQixXQUFPLEtBQUssTUFBTSxJQUFJLENBQUMsTUFBTyxLQUFhLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRztBQUFBLEVBQzNEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBYyxPQUE4QixTQUFlO0FBQ3ZELFFBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxRQUFRLE9BQU87QUFBRyxhQUFPLEtBQUssU0FBUztBQUM5RCxXQUFPLFFBQ0YsT0FBTyxDQUFDLGNBQWMsT0FBTyxjQUFjLFFBQVEsRUFDbkQsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUN0QixLQUFLLEdBQUc7QUFBQSxFQUNqQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE9BQWMsT0FBTyxZQUFvQixPQUFlO0FBQ3BELFNBQUssUUFBUSxVQUF5QixJQUFJO0FBQUEsRUFDOUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsT0FBYyxXQUFXLGNBQWlEO0FBQ3RFLGlCQUFhLFFBQVEsQ0FBQyxRQUFRLEtBQUssT0FBTyxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUM7QUFBQSxFQUNsRTtBQUNKO0FBbkcwQjtBQUFiLGNBS0ssVUFBdUM7QUFBQSxFQUNqRCxlQUFlLEtBQUssRUFBRTtBQUFBLEVBQ3RCLFdBQVcsS0FBSyxFQUFFO0FBQUEsRUFDbEIsZ0JBQWdCLEtBQUssRUFBRTtBQUFBLEVBQ3ZCLE1BQU07QUFBQSxFQUNOLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxFQUNULFFBQVE7QUFBQSxFQUNSLGFBQWE7QUFBQSxFQUNiLFlBQVk7QUFBQSxFQUNaLGFBQWE7QUFBQSxFQUNiLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxFQUNULE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLFVBQVU7QUFBQSxFQUNWLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLE9BQU87QUFBQSxFQUNQLFlBQVk7QUFBQSxFQUNaLFVBQVU7QUFBQSxFQUNWLGFBQWE7QUFBQSxFQUNiLFFBQVE7QUFBQSxFQUNSLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLFFBQVE7QUFBQSxFQUNSLEtBQUs7QUFBQSxFQUNMLFNBQVM7QUFBQSxFQUNULGVBQWU7QUFDbkI7QUF6Q0csSUFBTSxlQUFOOzs7QVJFUCxvQkFBMEI7QUFFMUIsSUFBTSxRQUFOLE1BQU0sTUFBSztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUMsY0FBYztBQUFBLEVBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU92QixPQUFPLGVBQWUsUUFBZ0M7QUFDbEQsV0FBTyxPQUFPLE9BQU8sTUFBTSxFQUN0QixJQUFJLENBQUMsTUFBTyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUUsRUFDN0IsS0FBSyxHQUFHO0FBQUEsRUFDakI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFPLFFBQVEsY0FBc0I7QUFDakMsUUFBSSxNQUFNLFlBQVk7QUFBRyxxQkFBZTtBQUN4QyxVQUFNLFFBQVEsZUFBZSxJQUFJLEtBQUssUUFBUSxLQUFLO0FBRW5ELFdBQU87QUFBQSxNQUNILE1BQU0sTUFBTSxlQUFlLEtBQVE7QUFBQSxNQUNuQyxPQUFPLE1BQU0sZUFBZSxJQUFPLElBQUk7QUFBQSxNQUN2QyxTQUFTLE1BQU0sZUFBZSxHQUFLLElBQUk7QUFBQSxNQUN2QyxTQUFTLE1BQU0sZUFBZSxHQUFJLElBQUk7QUFBQSxJQUMxQztBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFPLGNBQWMsVUFBb0I7QUFDckMsVUFBTSxRQUFRLE9BQU8sS0FBSyxRQUFRO0FBQ2xDLFVBQU0sV0FBVyxDQUFDLFFBQVEsU0FBUyxXQUFXLFNBQVM7QUFFdkQsVUFBTSxTQUFTLE1BQU0sT0FBTyxDQUFDLE1BQU0sU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLFNBQVMsQ0FBbUIsQ0FBQztBQUNqRyxVQUFNLFFBQVEsT0FDVCxNQUFNLE9BQU8sVUFBVSxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUMsRUFDdEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxHQUFHLEdBQUcsQ0FBQyxFQUN4QyxLQUFLLEdBQUc7QUFFYixXQUFPLE1BQU0sVUFBVSxJQUFJLEtBQUssTUFBTSxTQUFTLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSztBQUFBLEVBQ3BFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxPQUFPLEtBQWMsS0FBYTtBQUM5QixRQUFJLENBQUMsTUFBTSxRQUFRLEdBQUc7QUFBRyxhQUFPO0FBQ2hDLFdBQU8sSUFBSSxJQUFJLFNBQVMsQ0FBQztBQUFBLEVBQzdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBTyxhQUFhLFNBQXNDO0FBQ3RELFdBQU8sV0FBVyxRQUFRLFFBQVEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUFFLFNBQVM7QUFBQSxFQUNwRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE9BQU8sUUFBUSxJQUFZO0FBQ3ZCLFFBQUk7QUFDQSxhQUFPLEVBQUUsUUFBUSxRQUFRLEVBQUUsR0FBRyxPQUFPLEtBQUs7QUFBQSxJQUM5QyxTQUFTLE9BQU87QUFDWixhQUFPLEVBQUUsUUFBUSxNQUFNLE1BQU07QUFBQSxJQUNqQztBQUFBLEVBQ0o7QUFBQSxFQUVBLGFBQWEsT0FBTyxJQUFZO0FBQzVCLFFBQUk7QUFDQSxZQUFNLE1BQU0sTUFBTSxPQUFPO0FBQ3pCLGFBQU8sRUFBRSxRQUFRLEtBQUssT0FBTyxLQUFLO0FBQUEsSUFDdEMsU0FBUyxPQUFPO0FBQ1osYUFBTyxFQUFFLFFBQVEsTUFBTSxNQUFNO0FBQUEsSUFDakM7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBTyxLQUFLLE1BQWM7QUFDdEIsZUFBTyw0QkFBVyxNQUFNLFFBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ3JEO0FBQUEsRUFFQSxPQUFPLE9BQU87QUFBQSxFQUFDO0FBQUE7QUFBQSxFQUVmLGFBQWEsV0FBVztBQUNwQixRQUFJLFdBQVc7QUFBWSxhQUFPLFdBQVc7QUFDN0MsZUFBVyxPQUFPLENBQUMsY0FBYyxRQUFRLEdBQUc7QUFDeEMsVUFBSTtBQUNBLGVBQU8sTUFBTSxPQUFPLEtBQUssS0FBSyxDQUFDLFFBQVEsSUFBSSxTQUFTLElBQUksU0FBUyxTQUFTLElBQUksT0FBTztBQUFBLE1BQ3pGLFFBQVE7QUFDSixZQUFJO0FBRUEsZ0JBQU0sTUFBTSxRQUFRLEdBQUc7QUFDdkIsY0FBSTtBQUFLLG1CQUFPLElBQUksU0FBUyxJQUFJLFNBQVMsU0FBUyxJQUFJO0FBQUEsUUFDM0QsUUFBUTtBQUFBLFFBRVI7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFBQSxFQUVBLE9BQU8sS0FBSyxTQUFpQixPQUFPLHNCQUFzQixRQUFpQjtBQUN2RSxZQUFRLFlBQVksU0FBUztBQUFBLE1BQ3pCO0FBQUEsTUFDQTtBQUFBLElBQ0osQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVBLE9BQU8sYUFBZ0IsS0FBYTtBQUNoQyxXQUFPLFFBQUkseUJBQVUsSUFBSSxNQUFNLENBQUM7QUFBQSxFQUNwQztBQUFBLEVBRUEsT0FBTyxrQkFBcUIsS0FBZTtBQUN2QyxVQUFNLE1BQU0sSUFBSSxNQUFNO0FBRXRCLFFBQUksSUFBSSxJQUFJO0FBRVosV0FBTyxHQUFHO0FBQ04sWUFBTSxJQUFJLEtBQUssTUFBTSxLQUFLLE9BQU8sSUFBSSxHQUFHO0FBQ3hDLE9BQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQUEsSUFDdEM7QUFFQSxXQUFPO0FBQUEsRUFDWDtBQUNKO0FBakpXO0FBQVgsSUFBTSxPQUFOO0FBbUpPLElBQU0scUJBQXFCLHdCQUFDLE9BQW1CLFVBQXNDO0FBQ3hGLFFBQU0sU0FBUyxpQkFBaUIsV0FBVyxNQUFNLFNBQVMsTUFBTSxRQUFRLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSztBQUUvRixNQUFJLE1BQU0sVUFBVSxLQUFLLE1BQU0sWUFBWTtBQUFVO0FBRXJELFFBQU0sU0FBUyxNQUFNLFlBQVk7QUFFakMsTUFBSSxTQUFTLE9BQU8sUUFBUTtBQUN4QixVQUFNLFdBQVcsaUJBQWlCLGdCQUFnQixRQUFRLE9BQU8sTUFBTTtBQUFBLEVBQzNFO0FBQ0osR0FWa0M7OztBRDNKbEM7QUFLTyxJQUFNLHVCQUFOLE1BQU0sNkJBQThFLDBCQUFnQjtBQUFBLEVBRWhHLFlBQW1CLGlCQUFpQyxDQUFDLEdBQUc7QUFDM0QsVUFBTTtBQURnQjtBQUQxQixxQ0FBZTtBQUFBLEVBR2Y7QUFBQSxFQUVPLEdBQXNCLE1BQVMsVUFBZ0I7QUFDbEQsUUFBSSxTQUFTLFNBQVM7QUFDbEIseUJBQUssY0FBZTtBQUFBLElBQ3hCO0FBRUEsV0FBTyxNQUFNLEdBQUcsTUFBTSxRQUFRO0FBQUEsRUFDbEM7QUFBQSxFQUVPLEtBQXdCLE1BQVMsVUFBZ0I7QUFDcEQsUUFBSSxTQUFTLFNBQVM7QUFDbEIseUJBQUssY0FBZTtBQUFBLElBQ3hCO0FBRUEsV0FBTyxNQUFNLEtBQUssTUFBTSxRQUFRO0FBQUEsRUFDcEM7QUFBQSxFQUVPLFlBQStCLE1BQVMsVUFBZ0I7QUFDM0QsUUFBSSxTQUFTLFNBQVM7QUFDbEIseUJBQUssY0FBZTtBQUFBLElBQ3hCO0FBRUEsV0FBTyxNQUFNLFlBQVksTUFBTSxRQUFRO0FBQUEsRUFDM0M7QUFBQSxFQUVPLElBQXVCLE1BQVMsVUFBZ0I7QUFDbkQsdUJBQUssY0FBZSxLQUFLLGNBQWMsT0FBWSxJQUFJO0FBRXZELFdBQU8sTUFBTSxJQUFJLE1BQU0sUUFBUTtBQUFBLEVBQ25DO0FBQUEsRUFFTyxlQUFrQyxNQUFTLFVBQWdCO0FBQzlELHVCQUFLLGNBQWUsS0FBSyxjQUFjLE9BQVksSUFBSTtBQUV2RCxXQUFPLE1BQU0sZUFBZSxNQUFNLFFBQVE7QUFBQSxFQUM5QztBQUFBLEVBRU8sbUJBQXNDLE1BQVU7QUFDbkQsdUJBQUssY0FBZSxLQUFLLGNBQWMsT0FBWSxJQUFJO0FBRXZELFdBQU8sTUFBTSxtQkFBbUIsSUFBSTtBQUFBLEVBQ3hDO0FBQUEsRUFFTyxLQUF3QixTQUFZLE1BQXdCO0FBQy9ELFFBQUksS0FBSyxlQUFlLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxXQUFXLEVBQUUsU0FBUyxJQUFJLEdBQUc7QUFFekUsY0FBUSxNQUFNLEdBQUcsSUFBSTtBQUNyQixXQUFLO0FBQUEsUUFDRCxzQ0FBc0MsT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLGVBQWUsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUM7QUFBQSxRQUMxSDtBQUFBLE1BQ0o7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUVBLFdBQU8sTUFBTSxLQUFLLE1BQU0sR0FBRyxJQUFJO0FBQUEsRUFDbkM7QUFBQSxFQUVBLElBQVcsY0FBYztBQUNyQixXQUFPLG1CQUFLO0FBQUEsRUFDaEI7QUFDSjtBQWhFSTtBQUR1RztBQUFwRyxJQUFNLHNCQUFOOzs7QVVhQSxJQUFNLGlCQUFOLE1BQU0sZUFBeUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUEyQjNDLFlBQW1CLFNBQTJDLFVBQWdCLENBQUMsR0FBRztBQUEvRDtBQUEyQztBQWxCckU7QUFBQTtBQUFBO0FBQUEsU0FBTyxXQUFXO0FBS2xCO0FBQUE7QUFBQTtBQUFBLFNBQU8sWUFBc0IsQ0FBQztBQU05QjtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQU8sb0JBQW9CLHdCQUFDLFVBQWlCLEdBQUcsTUFBTSxLQUFLLE9BQU8sTUFBTSxNQUFNLG1CQUFuRDtBQUFBLEVBTytEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLMUYsSUFBVyxhQUFhO0FBQ3BCLFdBQVEsS0FBSyxZQUFxQztBQUFBLEVBQ3REO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsWUFBWSxTQUFZO0FBQ2pDLFNBQUssVUFBVTtBQUNmLFVBQU0sS0FBSyxXQUFXO0FBQ3RCLFVBQU0sS0FBSyxTQUFTO0FBQUEsRUFDeEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWEsV0FBVztBQUVwQjtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWEsYUFBYTtBQUV0QjtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxTQUFTLE9BQWUsTUFBaUQ7QUFFbEYsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxPQUFPLE1BQTJDO0FBRTNELFVBQU0sV0FBVyxvQkFBb0IsR0FBRyxLQUFLLFlBQVksSUFBSSxXQUFXO0FBQUEsRUFDNUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxPQUFPLE9BQWUsU0FBeUQ7QUFFeEYsVUFBTSxXQUFXLG9CQUFvQixHQUFHLEtBQUssWUFBWSxJQUFJLFdBQVc7QUFBQSxFQUM1RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxNQUFhLGlCQUFpQixPQUFjLFNBQW9EO0FBRzVGLFVBQU0sV0FBVyxvQkFBb0IsR0FBRyxLQUFLLFlBQVksSUFBSSxxQkFBcUI7QUFBQSxFQUN0RjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGlCQUFpQixRQUFrQixNQUFvQjtBQUMxRCxXQUFPLEtBQUssTUFBTSxNQUFNO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUFtQyxVQUFhLE1BQW1DO0FBQ3RGLFdBQU8sS0FBSyxRQUFRLE9BQU8sS0FBSyxPQUFPLEdBQUcsSUFBSTtBQUFBLEVBQ2xEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sZUFBZSxVQUE0QixTQUFrQixVQUFVLFVBQVUsQ0FBQyxHQUFrQjtBQUN2RyxXQUFPLEVBQUUsVUFBVSxZQUFZLE1BQU0sT0FBTztBQUFBLEVBQ2hEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLE1BQU0sU0FBaUI7QUFDMUIsV0FBTyxLQUFLLFFBQVEsT0FBTyxNQUFNLE9BQU87QUFBQSxFQUM1QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxlQUFlO0FBQ3RCLFdBQU8sS0FBSyxRQUFRLE9BQU87QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxnQkFBZ0I7QUFDdkIsV0FBTyxDQUFDLENBQUMsS0FBSyxRQUFRLE9BQU8sUUFBUTtBQUFBLEVBQ3pDO0FBQ0o7QUFuSnNEO0FBQUE7QUFBQTtBQUFBO0FBQXpDLGVBSUssYUFBYTtBQUp4QixJQUFNLGdCQUFOOzs7QUNqQlAsSUFBQUMsZ0JBQTJCO0FBTzNCLElBQU0scUJBQXFCO0FBQUEsRUFDdkI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDSjtBQUNBLElBQU0sb0JBQW9CO0FBd0NuQixJQUFNLDZCQUFOLE1BQU0sbUNBQWtDLG9CQUE4QztBQUFBLEVBTWxGLFlBQW1CLFFBQWdCO0FBQ3RDLFVBQU0sQ0FBQyxPQUFPLENBQUM7QUFETztBQUYxQjtBQUFBO0FBQUE7QUFBQSxTQUFPLFFBQVEsSUFBSSx5QkFBa0M7QUFBQSxFQUlyRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYSxZQUFZLFFBQXVFLFNBQXFDO0FBQ2pJLFVBQU0sTUFBTSxNQUFNLEtBQUssT0FBTyxpQkFBaUI7QUFDL0MsUUFBSSxJQUFJO0FBQU8sYUFBTyxFQUFFLFNBQVMsT0FBTyxPQUFPLElBQUksTUFBZTtBQUVsRSxLQUFDLFNBQVMsbUJBQW1CLE9BQU8sTUFBTSxJQUFJLG9CQUFvQixRQUFRLENBQUMsUUFBUTtBQUMvRSxVQUFJLENBQUMsSUFBSSxPQUFPLEdBQUc7QUFBRztBQUV0QixXQUFLLFNBQStCLElBQUksT0FBTyxHQUFHLEdBQUcsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQUEsSUFDN0UsQ0FBQztBQUVELFdBQU8sRUFBRSxTQUFTLE1BQU0sT0FBTyxLQUFLO0FBQUEsRUFDeEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sYUFBYSxZQUFvQjtBQUNwQyxXQUFPLEtBQUssTUFBTSxJQUFJLFVBQVU7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxPQUFPO0FBQ2QsV0FBTyxLQUFLLE1BQU07QUFBQSxFQUN0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxJQUFJLFlBQW9CO0FBQzNCLFdBQU8sS0FBSyxNQUFNLElBQUksVUFBVTtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYSxTQUE4RCxZQUFlLFNBQXlFO0FBQy9KLFFBQUksT0FBTyxXQUFXLGVBQWUsWUFBWSxLQUFLLE1BQU0sSUFBSSxXQUFXLFVBQVU7QUFBRyxhQUFPO0FBQy9GLFVBQU0sWUFBWSxJQUFJLFdBQVcsTUFBTSxPQUFPO0FBRzlDLFFBQUksS0FBSyxPQUFPLFFBQVE7QUFBZ0IsY0FBUSxtQkFBUixRQUFRLGlCQUFtQixLQUFLLE9BQU8sUUFBUTtBQUV2RixRQUFJO0FBQ0EsV0FBSyxNQUFNLElBQUksV0FBVyxZQUFZLFNBQVM7QUFDL0MsVUFBSSxLQUFLLE9BQU87QUFBYSxhQUFLLE9BQU8sTUFBTSxHQUFHLFdBQVcsVUFBVSxvQkFBb0I7QUFDM0YsV0FBSyxLQUFLLGNBQWMsTUFBTSxTQUFTO0FBQ3ZDLFlBQU0sVUFBVSxTQUFTO0FBQ3pCLFVBQUksS0FBSyxPQUFPO0FBQWEsYUFBSyxPQUFPLE1BQU0sR0FBRyxXQUFXLFVBQVUsdUJBQXVCO0FBQzlGLFdBQUssS0FBSyxZQUFZLE1BQU0sU0FBUztBQUNyQyxhQUFPO0FBQUEsSUFDWCxTQUFTLEdBQUc7QUFDUixXQUFLLE1BQU0sT0FBTyxXQUFXLFVBQVU7QUFDdkMsVUFBSSxLQUFLLE9BQU87QUFBYSxhQUFLLE9BQU8sTUFBTSxHQUFHLFdBQVcsVUFBVSx5Q0FBeUMsQ0FBQyxFQUFFO0FBQ25ILFdBQUssS0FBSyxTQUFTLE1BQU0sV0FBVyxDQUFVO0FBQzlDLGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxNQUFhLFdBQTZDLFlBQWU7QUFDckUsVUFBTSxZQUFZLE9BQU8sZUFBZSxXQUFXLEtBQUssTUFBTSxJQUFJLFVBQVUsSUFBSSxLQUFLLE1BQU0sS0FBSyxDQUFDLE1BQU0sTUFBTSxVQUFVO0FBQ3ZILFFBQUksQ0FBQztBQUFXO0FBRWhCLFFBQUk7QUFDQSxZQUFNLE1BQU0sVUFBVSxjQUFjLEtBQUssTUFBTSxRQUFRLENBQUMsTUFBTSxNQUFNLFNBQVM7QUFDN0UsV0FBSyxNQUFNLE9BQU8sR0FBRztBQUNyQixVQUFJLEtBQUssT0FBTztBQUFhLGFBQUssT0FBTyxNQUFNLEdBQUcsVUFBVSxVQUFVLHNCQUFzQjtBQUM1RixXQUFLLEtBQUssZ0JBQWdCLE1BQU0sU0FBUztBQUN6QyxZQUFNLFVBQVUsV0FBVztBQUMzQixVQUFJLEtBQUssT0FBTztBQUFhLGFBQUssT0FBTyxNQUFNLEdBQUcsVUFBVSxVQUFVLHlCQUF5QjtBQUMvRixXQUFLLEtBQUssY0FBYyxNQUFNLFNBQVM7QUFBQSxJQUMzQyxTQUFTLEdBQUc7QUFDUixVQUFJLEtBQUssT0FBTztBQUFhLGFBQUssT0FBTyxNQUFNLEdBQUcsVUFBVSxVQUFVLGtDQUFrQztBQUN4RyxXQUFLLEtBQUssU0FBUyxNQUFNLFdBQVcsQ0FBVTtBQUFBLElBQ2xEO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBYSxnQkFBZ0I7QUFDekIsUUFBSTtBQUNBLFlBQU0sUUFBUSxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFBQSxJQUMvRCxRQUFRO0FBQUEsSUFFUjtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFhLElBQWlCLElBQTZCLGdCQUFnQixNQUFNO0FBQzdFLFVBQU0sVUFBVSxLQUFLLE9BQU8sUUFBUSxtQkFBbUIsQ0FBQztBQUV4RCxRQUFJLENBQUMsS0FBSyxNQUFNLE1BQU07QUFDbEIsV0FBSyxLQUFLLHVFQUF1RSxjQUFjO0FBQy9GO0FBQUEsSUFDSjtBQUdBLFVBQU0sYUFBYSxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRO0FBRXBFLFFBQUksTUFBb0IsTUFDcEIsVUFBZ0M7QUFFcEMsZUFBVyxPQUFPLFdBQVcsT0FBTyxHQUFHO0FBQ25DLFVBQUksaUJBQWlCLFFBQVEsS0FBSyxDQUFDLE1BQU0sTUFBTSxJQUFJLFVBQVU7QUFBRztBQUNoRSxVQUFJLEtBQUssT0FBTztBQUFhLGFBQUssT0FBTyxNQUFNLHVCQUF1QixJQUFJLFVBQVUsS0FBSztBQUN6RixZQUFNLFNBQVMsTUFBTSxHQUFHLEdBQUcsRUFBRTtBQUFBLFFBQ3pCLENBQUMsUUFBUTtBQUNMLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsQ0FBQyxNQUFNO0FBQ0gsY0FBSSxLQUFLLE9BQU87QUFBYSxpQkFBSyxPQUFPLE1BQU0sYUFBYSxJQUFJLFVBQVUsdUJBQXVCLENBQUMsRUFBRTtBQUVwRyxpQkFBTyxTQUFTLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQUEsUUFDckQ7QUFBQSxNQUNKO0FBRUEsZ0JBQVU7QUFFVixVQUFJLFVBQVUsQ0FBQyxTQUFTLFFBQVEsTUFBTSxHQUFHO0FBQ3JDLFlBQUksS0FBSyxPQUFPO0FBQWEsZUFBSyxPQUFPLE1BQU0sYUFBYSxJQUFJLFVBQVUseUJBQXlCO0FBRW5HLGVBQU87QUFBQSxVQUNILFdBQVc7QUFBQSxVQUNYLE9BQU87QUFBQSxVQUNQO0FBQUEsUUFDSjtBQUFBLE1BQ0osV0FBVyxTQUFTLFFBQVEsTUFBTSxHQUFHO0FBQ2pDLGNBQU07QUFBQSxNQUNWO0FBQUEsSUFDSjtBQUVBLFFBQUk7QUFDQSxhQUFPO0FBQUEsUUFDSCxXQUFXO0FBQUEsUUFDWCxPQUFPO0FBQUEsUUFDUCxRQUFRO0FBQUEsTUFDWjtBQUFBLEVBQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFdBQVcsWUFBb0I7QUFDbEMsV0FBTyxLQUFLLE9BQU8sUUFBUSxpQkFBaUIsU0FBUyxVQUFVLEtBQUs7QUFBQSxFQUN4RTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBVSxZQUFvQjtBQUNqQyxXQUFPLENBQUMsS0FBSyxXQUFXLFVBQVU7QUFBQSxFQUN0QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBVSxZQUFpQztBQUM5QyxXQUFPLE9BQU8sZUFBZSxXQUFXLGFBQWEsV0FBVztBQUFBLEVBQ3BFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxRQUFRLFlBQWlDO0FBQzVDLFdBQU8sT0FBTyxlQUFlLFdBQVcsS0FBSyxJQUFJLFVBQVUsSUFBSTtBQUFBLEVBQ25FO0FBQ0o7QUFqTTZGO0FBQXRGLElBQU0sNEJBQU47OztBQ3hEUCxJQUFBQyxnQkFBMEM7OztBQ0ExQyxJQUFBQyxrQkFBK0Y7QUFDL0YsSUFBQUMsZ0JBQWlEOzs7QUNGakQsSUFBQUMsdUJBWU87QUFHUCxJQUFBQyxnQkFBNkI7QUFHN0IsdUJBQXVFOzs7QUNqQnZFLG9CQUEyQztBQUMzQywwQkFBZ0M7QUFDaEMsWUFBdUI7QUFlaEIsSUFBTSxxQkFBTixNQUFNLG1CQUFrQjtBQUFBLEVBQ3BCLFlBQW1CLFlBQThCO0FBQTlCO0FBQUEsRUFBK0I7QUFBQSxFQUVsRCxlQUFlLFFBQWtCLE9BQXFCLENBQUMsR0FBRztBQUM3RCxTQUFLLFVBQUwsS0FBSyxRQUFVLGFBQWEsS0FBSyxJQUFJLENBQUM7QUFFdEMsV0FBTyxJQUFJLE1BQU0sS0FBSyxXQUFXLE1BQU0sUUFBUTtBQUFBLE1BQzNDLFFBQVE7QUFBQSxNQUNSLGFBQWEsS0FBSztBQUFBLE1BQ2xCLE9BQU8sS0FBSztBQUFBLE1BQ1osVUFBVSxLQUFLLFlBQVk7QUFBQSxNQUMzQixPQUFPO0FBQUEsTUFDUCxhQUFhLEtBQUs7QUFBQSxNQUNsQixXQUFXLEtBQUssYUFBYTtBQUFBLE1BQzdCLEtBQUssS0FBSyxPQUFPO0FBQUEsTUFDakIsUUFBUTtBQUFBLE1BQ1IsS0FBSztBQUFBLFFBQ0QsUUFBUTtBQUFBLFFBQ1IsUUFBUTtBQUFBLE1BQ1o7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNMO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGdCQUFnQixTQUFxQjtBQUd4QyxVQUFNLFdBQVcsb0JBQW9CLEdBQUcsS0FBSyxZQUFZLElBQUksb0JBQW9CO0FBQUEsRUFDckY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxXQUNILE1BQ0EsVUFBZ0M7QUFBQSxJQUM1QixLQUFLLG9DQUFnQjtBQUFBLElBQ3JCLE1BQU07QUFBQSxJQUNOLGlCQUFpQjtBQUFBLEVBQ3JCLEdBQ0Y7QUFDRSxVQUFNLFFBQVEsS0FBSyxXQUFXLE1BQU0sT0FBTyxPQUFPLE1BQU0sVUFBVSxJQUFJO0FBRXRFLFVBQU0sY0FBYyxJQUFJLDBCQUFZO0FBQ3BDLFVBQU0sV0FBVyxLQUFLLFdBQVcsZ0JBQWdCO0FBRWpELFFBQUksQ0FBQztBQUFVLFlBQU0sV0FBVyxnQkFBZ0I7QUFFaEQsYUFBUyxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVc7QUFDdEMsVUFBSSxXQUFXLE9BQU87QUFDbEIsY0FBTSxnQkFBZ0IsU0FBUyxVQUFVLE9BQU87QUFBQSxVQUM1QyxLQUFLO0FBQUEsWUFDRCxVQUFVLFFBQVEsT0FBTyxvQ0FBZ0I7QUFBQSxZQUN6QyxVQUFVLFFBQVEsbUJBQW1CO0FBQUEsVUFDekM7QUFBQSxRQUNKLENBQUM7QUFFRCxxQkFBYSxZQUFZO0FBQ3JCLGNBQUksUUFBUSxTQUFTLE9BQU87QUFDeEIsa0JBQU0sTUFBTSxjQUFjO0FBQUE7QUFBQSxjQUV0QixLQUFXLGNBQXFCLGNBQVEsTUFBTSxRQUFRO0FBQUEsZ0JBQ2xELFVBQVU7QUFBQSxnQkFDVixXQUFXO0FBQUEsZ0JBQ1gsTUFBTTtBQUFBLGNBQ1YsQ0FBQztBQUFBLFlBQ0w7QUFDQSxtQkFBTyxJQUFJLEtBQUssV0FBVztBQUFBLFVBQy9CLE9BQU87QUFDSCxtQkFBTyxjQUFjLEtBQUssV0FBVztBQUFBLFVBQ3pDO0FBQUEsUUFDSixDQUFDLEVBQUUsTUFBTTtBQUFBLE1BQ2I7QUFBQSxJQUNKLENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDWDtBQUNKO0FBbEYrQjtBQUF4QixJQUFNLG9CQUFOOzs7QURxQ1AsSUFBTSxvQkFBTixNQUFNLDBCQUF5QiwyQkFBMEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWNyRCxZQUFZLFlBQTZCLFNBQTZDLE9BQW1DLG9CQUE0QixLQUFPLGFBQTJCO0FBQ25MLFVBQU07QUFENEU7QUFBbUM7QUFYekgsU0FBTyxXQUFXLElBQUksa0JBQWtCLElBQUk7QUFHNUMsU0FBTyxNQUFNLElBQUksOEJBQWE7QUFlMUIsU0FBSyxrQkFBa0I7QUFNdkIsU0FBSyxjQUNELG1CQUNBLHdDQUFrQjtBQUFBLE1BQ2QsT0FBTyxLQUFLLE1BQU07QUFBQSxJQUN0QixDQUFDO0FBTUwsU0FBSyxVQUFVO0FBRWYsU0FBSyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztBQUNsRSxTQUFLLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxVQUFVLEtBQUssS0FBSyxLQUFLLFNBQVMsS0FBeUIsQ0FBQztBQUM5RixTQUFLLFlBQVksR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQztBQUM5RCxTQUFLLFlBQVksR0FBRyxTQUFTLENBQUMsVUFBVSxLQUFLLEtBQUssS0FBSyxTQUFTLEtBQUssQ0FBQztBQUV0RSxTQUFLLElBQUksV0FBVyxNQUFNO0FBQ3RCLFVBQUksQ0FBQyxLQUFLO0FBQUs7QUFDZixVQUFJLEtBQUssSUFBSSxTQUFTO0FBQVMsYUFBSyxLQUFLLE9BQU8sS0FBSyxJQUFJLFNBQVMsT0FBTztBQUN6RSxVQUFJLEtBQUssSUFBSSxRQUFRO0FBQVEsYUFBSyxLQUFLLFVBQVUsS0FBSyxJQUFJLFFBQVEsTUFBTTtBQUN4RSxVQUFJLEtBQUssSUFBSTtBQUFXLGFBQUssS0FBSyxXQUFXLEtBQUssSUFBSSxVQUFVLE1BQU0sQ0FBQztBQUN2RSxVQUFJLEtBQUssSUFBSTtBQUFRLGFBQUssS0FBSyxVQUFVLEtBQUssSUFBSSxPQUFPLE1BQU07QUFDL0QsVUFBSSxLQUFLLElBQUk7QUFBVyxhQUFLLEtBQUssY0FBYyxLQUFLLElBQUksVUFBVSxnQkFBZ0I7QUFBQSxJQUN2RjtBQUVBLFNBQUssSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLEtBQUssU0FBUyxDQUFxQjtBQUVsRSxTQUFLLGdCQUNBLEdBQUcsMkNBQXNCLGNBQWMsT0FBTyxVQUFVLGFBQWE7QUFDbEUsVUFBSSxTQUFTLFdBQVcscURBQWdDLFFBQVE7QUFDNUQsYUFBSyxRQUFRO0FBQ2I7QUFBQSxNQUNKO0FBRUEsVUFBSSxTQUFTLFdBQVcscURBQWdDLGtCQUFrQixTQUFTLGNBQWMsTUFBTTtBQUNuRyxZQUFJO0FBQ0Esb0JBQU0sa0NBQVksS0FBSyxpQkFBaUIsMkNBQXNCLFlBQVksS0FBSyxpQkFBaUI7QUFBQSxRQUNwRyxRQUFRO0FBQ0osY0FBSTtBQUNBLGdCQUFJLEtBQUssZ0JBQWdCLE1BQU0sV0FBVywyQ0FBc0I7QUFBVyxtQkFBSyxRQUFRO0FBQUEsVUFDNUYsU0FBUyxLQUFLO0FBQ1YsaUJBQUssS0FBSyxTQUFTLEdBQXVCO0FBQUEsVUFDOUM7QUFBQSxRQUNKO0FBQUEsTUFDSixXQUFXLEtBQUssZ0JBQWdCLGlCQUFpQixHQUFHO0FBQ2hELGNBQU0sS0FBSyxNQUFNLEtBQUssZ0JBQWdCLGlCQUFpQixLQUFLLEdBQUk7QUFDaEUsYUFBSyxnQkFBZ0IsT0FBTztBQUFBLE1BQ2hDLE9BQU87QUFDSCxZQUFJO0FBQ0EsY0FBSSxLQUFLLGdCQUFnQixNQUFNLFdBQVcsMkNBQXNCO0FBQVcsaUJBQUssUUFBUTtBQUFBLFFBQzVGLFNBQVMsS0FBSztBQUNWLGVBQUssS0FBSyxTQUFTLEdBQXVCO0FBQUEsUUFDOUM7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDLEVBQ0EsR0FBRywyQ0FBc0IsV0FBVyxNQUFNO0FBQ3ZDLFdBQUssSUFBSTtBQUNULFdBQUssTUFBTSxLQUFLLGdCQUFnQixxQkFBcUIsS0FBSyxLQUFLO0FBQUEsSUFDbkUsQ0FBQztBQUVMLFNBQUssWUFBWSxHQUFHLGVBQWUsQ0FBQyxVQUFVLGFBQWE7QUFDdkQsVUFBSSxTQUFTLFdBQVcsdUNBQWtCLFVBQVUsU0FBUyxXQUFXLHVDQUFrQixRQUFRO0FBQzlGLGFBQUssTUFBTSxLQUFLLGdCQUFnQixhQUFhLEtBQUssS0FBSztBQUFBLE1BQzNEO0FBRUEsVUFBSSxTQUFTLFdBQVcsdUNBQWtCLFVBQVUsU0FBUyxXQUFXLHVDQUFrQixRQUFRO0FBQzlGLGFBQUssTUFBTSxLQUFLLGdCQUFnQixjQUFjLEtBQUssS0FBSztBQUFBLE1BQzVEO0FBRUEsVUFBSSxTQUFTLFdBQVcsdUNBQWtCLFNBQVM7QUFDL0MsWUFBSSxTQUFTLFdBQVcsdUNBQWtCLFFBQVEsU0FBUyxXQUFXLHVDQUFrQixXQUFXO0FBQy9GLGlCQUFPLEtBQUssS0FBSyxTQUFTLEtBQUssYUFBYztBQUFBLFFBQ2pEO0FBQUEsTUFDSixXQUFXLFNBQVMsV0FBVyx1Q0FBa0IsUUFBUSxTQUFTLFdBQVcsdUNBQWtCLE1BQU07QUFDakcsYUFBSyxLQUFLLFVBQVUsS0FBSyxhQUFjO0FBQ3ZDLGFBQUssSUFBSSxRQUFRO0FBQ2pCLGFBQUssZ0JBQWdCO0FBQUEsTUFDekI7QUFBQSxJQUNKLENBQUM7QUFFRCxTQUFLLGdCQUFnQixVQUFVLEtBQUssV0FBVztBQUFBLEVBQ25EO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFJLFNBQVM7QUFDVCxXQUFPLEtBQUssWUFBWSxNQUFNLFdBQVcsdUNBQWtCO0FBQUEsRUFDL0Q7QUFBQSxFQUVBLElBQUksT0FBTyxLQUFjO0FBQ3JCLFVBQU0sS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLE9BQU87QUFBQSxFQUN6QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsV0FBVztBQUNQLFdBQU8sS0FBSyxVQUFVLEtBQUssWUFBWSxNQUFNLFdBQVcsdUNBQWtCO0FBQUEsRUFDOUU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGNBQWM7QUFDVixXQUFPLEtBQUssWUFBWSxNQUFNLFdBQVcsdUNBQWtCO0FBQUEsRUFDL0Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFlBQVk7QUFDUixXQUFPLEtBQUssWUFBWSxNQUFNLFdBQVcsdUNBQWtCO0FBQUEsRUFDL0Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFNBQVM7QUFDTCxXQUFPLEtBQUssWUFBWSxNQUFNLFdBQVcsdUNBQWtCO0FBQUEsRUFDL0Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLGNBQWM7QUFDVixXQUFPLEtBQUssZ0JBQWdCLE1BQU0sV0FBVywyQ0FBc0I7QUFBQSxFQUN2RTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsaUJBQWlCO0FBQ2IsV0FBTyxLQUFLLGdCQUFnQixNQUFNLFdBQVcsMkNBQXNCO0FBQUEsRUFDdkU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFVBQVU7QUFDTixXQUFPLEtBQUssZ0JBQWdCLE1BQU0sV0FBVywyQ0FBc0I7QUFBQSxFQUN2RTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsZUFBZTtBQUNYLFdBQU8sS0FBSyxnQkFBZ0IsTUFBTSxXQUFXLDJDQUFzQjtBQUFBLEVBQ3ZFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxlQUFlO0FBQ1gsV0FBTyxLQUFLLGdCQUFnQixNQUFNLFdBQVcsMkNBQXNCO0FBQUEsRUFDdkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQU0sYUFBYSxLQUFlLEtBQXVCO0FBQ3JELFFBQUksQ0FBQyxLQUFLLGtCQUFrQixLQUFLLE1BQU07QUFBYSxXQUFLLE1BQU0sTUFBTSxvQ0FBb0M7QUFDekcsVUFBTSxTQUFTLENBQUMsS0FBSyxpQkFDZixLQUFLLElBQUksT0FBTyxLQUFLO0FBQUEsTUFDakIsS0FBSztBQUFBLFFBQ0QsU0FBUyxLQUFLO0FBQUEsUUFDZCxVQUFVLEtBQUs7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsUUFBUSxLQUFLLGVBQ1A7QUFBQSxRQUNJLFFBQVEsSUFBSTtBQUFBLFFBQ1osVUFBVSxLQUFLO0FBQUEsTUFDbkIsSUFDQTtBQUFBLE1BQ04sV0FBVztBQUFBLFFBQ1Asa0JBQWtCLEtBQUs7QUFBQSxRQUN2QixVQUFVLEtBQUs7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsV0FBVztBQUFBLFFBQ1AsZ0JBQWdCLEtBQUs7QUFBQSxRQUNyQixVQUFVLEtBQUs7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsUUFBUTtBQUFBLFFBQ0osUUFBUSxLQUFLO0FBQUEsUUFDYixVQUFVLEtBQUs7QUFBQSxNQUNuQjtBQUFBLElBQ0osQ0FBQyxJQUNEO0FBRU4sUUFBSSxLQUFLLE1BQU07QUFBYSxXQUFLLE1BQU0sTUFBTSx1Q0FBdUM7QUFDcEYsVUFBTSxhQUFhLE1BQU0sS0FBSyxNQUFNLHNCQUFzQixRQUFRLEtBQUssS0FBSyxFQUFFO0FBQUEsTUFDMUUsT0FDSztBQUFBLFFBQ0c7QUFBQSxRQUNBLE1BQU0sS0FBSyxRQUFRLGdDQUFXO0FBQUEsTUFDbEM7QUFBQSxJQUNSO0FBRUEsUUFBSSxLQUFLLE1BQU07QUFBYSxXQUFLLE1BQU0sTUFBTSw0QkFBNEI7QUFDekUsU0FBSyxvQkFBZ0IsMENBQW9CLFlBQVksVUFBVSxRQUFRO0FBQUEsTUFDbkUsV0FBVyxZQUFZLFFBQVEsS0FBSyxRQUFRLGdDQUFXO0FBQUEsTUFDdkQsVUFBVSxLQUFLO0FBQUE7QUFBQSxNQUVmLGNBQWM7QUFBQSxJQUNsQixDQUFDO0FBRUQsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQSxFQUVBLElBQVcsWUFBWTtBQUNuQixXQUFPLEtBQUssS0FBSztBQUFBLEVBQ3JCO0FBQUEsRUFFQSxJQUFXLFVBQVU7QUFDakIsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNyQjtBQUFBLEVBRUEsSUFBVyxTQUFTO0FBQ2hCLFdBQU8sS0FBSyxLQUFLLFVBQVU7QUFBQSxFQUMvQjtBQUFBLEVBRUEsSUFBVyxZQUFZO0FBQ25CLFdBQU8sS0FBSyxLQUFLLGFBQWE7QUFBQSxFQUNsQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxJQUFJLFNBQVM7QUFDVCxXQUFPLEtBQUssWUFBWSxNQUFNO0FBQUEsRUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsYUFBYTtBQUNULFFBQUk7QUFDQSxVQUFJLEtBQUs7QUFBYSxhQUFLLFlBQVksS0FBSyxJQUFJO0FBQ2hELFVBQUksS0FBSyxnQkFBZ0IsTUFBTSxXQUFXLDJDQUFzQjtBQUFXLGFBQUssZ0JBQWdCLFFBQVE7QUFBQSxJQUM1RyxRQUFRO0FBQUEsSUFBQztBQUFBLEVBQ2I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQVU7QUFDYixTQUFLLFdBQVc7QUFDaEIsU0FBSyxZQUFZLG1CQUFtQjtBQUNwQyxTQUFLLGdCQUFnQixtQkFBbUI7QUFDeEMsU0FBSyxJQUFJLFFBQVE7QUFDakIsU0FBSyxnQkFBZ0I7QUFDckIsU0FBSyxLQUFLLFdBQVc7QUFBQSxFQUN6QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxNQUFNO0FBQ0YsUUFBSTtBQUNBLFdBQUssWUFBWSxLQUFLO0FBQ3RCLFdBQUssSUFBSSxRQUFRO0FBQUEsSUFDckIsUUFBUTtBQUFBLElBRVI7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBTSxvQkFBOEI7QUFDaEMsVUFBTSxVQUFVLEtBQUssWUFBWSxNQUFNLGtCQUFrQjtBQUN6RCxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxTQUFTO0FBQ0wsVUFBTSxVQUFVLEtBQUssWUFBWSxRQUFRO0FBQ3pDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFNLFdBQVcsV0FBaUMsS0FBSyxlQUFnQjtBQUNuRSxRQUFJLENBQUMsVUFBVTtBQUNYLFlBQU0sV0FBVyxzQkFBc0I7QUFBQSxJQUMzQztBQUNBLFFBQUksU0FBUyxPQUFPO0FBQ2hCLGFBQU8sS0FBSyxLQUFLLEtBQUssVUFBVSxRQUFRO0FBQUEsSUFDNUM7QUFDQSxRQUFJLENBQUMsS0FBSztBQUFlLFdBQUssZ0JBQWdCO0FBQzlDLFFBQUksS0FBSyxnQkFBZ0IsTUFBTSxXQUFXLDJDQUFzQixPQUFPO0FBQ25FLFVBQUk7QUFDQSxrQkFBTSxrQ0FBWSxLQUFLLGlCQUFpQiwyQ0FBc0IsT0FBTyxLQUFLLGlCQUFpQjtBQUFBLE1BQy9GLFNBQVMsS0FBSztBQUNWLGVBQU8sS0FBSyxLQUFLLEtBQUssU0FBUyxHQUF1QjtBQUFBLE1BQzFEO0FBQUEsSUFDSjtBQUVBLFFBQUk7QUFDQSxXQUFLLFlBQVksS0FBSyxRQUFRO0FBQUEsSUFDbEMsU0FBUyxHQUFHO0FBQ1IsV0FBSyxLQUFLLFNBQVMsQ0FBcUI7QUFBQSxJQUM1QztBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsVUFBVSxPQUFlO0FBQ3JCLFFBQUksQ0FBQyxLQUFLLElBQUk7QUFBUSxhQUFPO0FBQzdCLFdBQU8sS0FBSyxJQUFJLE9BQU8sVUFBVSxLQUFLO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsSUFBSSxTQUFTO0FBQ1QsUUFBSSxDQUFDLEtBQUssSUFBSTtBQUFRLGFBQU87QUFDN0IsV0FBTyxLQUFLLElBQUksT0FBTztBQUFBLEVBQzNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLElBQUksYUFBYTtBQUNiLFFBQUksQ0FBQyxLQUFLO0FBQWUsYUFBTztBQUNoQyxXQUFPLEtBQUssY0FBYztBQUFBLEVBQzlCO0FBQ0o7QUF6WHlEO0FBQXpELElBQU0sbUJBQU47OztBRGpEQSxJQUFBQyx1QkFBb0c7OztBR05wRyxJQUFBQyxnQkFBc0I7QUFLZixJQUFNLHFCQUFOLE1BQU0sbUJBQWtDO0FBQUEsRUFFcEMsWUFBbUIsT0FBeUI7QUFBekI7QUFEMUIsU0FBTyxTQUFTLElBQUksb0JBQWEsTUFBTTtBQUFBLEVBQ2E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtwRCxJQUFXLGVBQWU7QUFFdEIsV0FBTyxLQUFLLE1BQU0sWUFBWSxlQUFlLFlBQWMsS0FBSyxNQUFjO0FBQUEsRUFDbEY7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsWUFBWTtBQUNuQixXQUFPLEtBQUssTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFLO0FBQUEsRUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsZ0JBQWdCO0FBQ3ZCLFdBQU8sS0FBSyxPQUFPLEdBQUcsQ0FBQyxLQUFLO0FBQUEsRUFDaEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsV0FBVztBQUNsQixXQUFPLEtBQUssTUFBTSxRQUFRO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsT0FBTztBQUNkLFdBQU8sS0FBSyxPQUFPO0FBQUEsRUFDdkI7QUFBQSxFQUVPLFVBQVU7QUFDYixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBVTtBQUNiLFdBQU8sS0FBSyxPQUFPLE9BQU87QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxLQUFLLE9BQXdCO0FBQ2hDLFFBQUksS0FBSztBQUFVLGFBQU87QUFDMUIsU0FBSyxPQUFPLElBQUksS0FBSztBQUVyQixTQUFLLE9BQU87QUFFWixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sUUFBUTtBQUNYLFNBQUssT0FBTyxNQUFNO0FBQUEsRUFDdEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWEsT0FBTztBQUNoQixVQUFNLFFBQVEsS0FBSztBQUNuQixRQUFJLENBQUMsT0FBTztBQUNSLFlBQU0sV0FBVyxjQUFjLDRCQUE0QjtBQUFBLElBQy9EO0FBRUEsU0FBSyxNQUFNLEtBQUssS0FBSztBQUFBLE1BQ2pCO0FBQUEsTUFDQSxhQUFhO0FBQUEsSUFDakIsQ0FBQztBQUFBLEVBQ0w7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWEsU0FBUyxrQkFBa0IsTUFBTTtBQUMxQyxVQUFNLFFBQVEsS0FBSyxPQUFPLFNBQVM7QUFDbkMsUUFBSSxDQUFDLE9BQU87QUFDUixZQUFNLFdBQVcsY0FBYyxnQ0FBZ0M7QUFBQSxJQUNuRTtBQUVBLFVBQU0sVUFBVSxLQUFLO0FBRXJCLFVBQU0sS0FBSyxNQUFNLEtBQUssS0FBSyxPQUFPLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFDbEQsUUFBSSxXQUFXO0FBQWlCLFdBQUssTUFBTSxLQUFLLE9BQU8sU0FBUyxDQUFDO0FBQUEsRUFDckU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLEtBQUssa0JBQWtCLE1BQU07QUFDaEMsV0FBTyxLQUFLLFNBQVMsZUFBZTtBQUFBLEVBQ3hDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxTQUFTO0FBQ1osUUFBSSxDQUFDLE9BQU8sU0FBUyxLQUFLLE1BQU0sY0FBYztBQUFHO0FBQ2pELFFBQUksS0FBSyxPQUFPLE1BQU0sU0FBUyxLQUFLLE1BQU07QUFBZ0I7QUFDMUQsU0FBSyxPQUFPLE1BQU0sT0FBTyxLQUFLLE1BQU0sY0FBYztBQUFBLEVBQ3REO0FBQ0o7QUFwSCtDO0FBQXhDLElBQU0sb0JBQU47OztBQ0xQLElBQUFDLHVCQUEwQztBQUMxQyxJQUFBQyxpQkFBeUI7OztBQ0V6QixvQkFBc0I7QUFHdEIsSUFBTSxtQkFBbUI7QUFDekIsSUFBTSx1QkFBdUI7QUFDN0IsSUFBTSxvQkFBb0I7QUFDMUIsSUFBTSxhQUFhO0FBQ25CLElBQU0sb0JBQW9CO0FBQzFCLElBQU0sa0JBQWtCO0FBQ3hCLElBQU0sc0JBQXNCO0FBQzVCLElBQU0sMEJBQTBCO0FBQ2hDLElBQU0sdUJBQXVCO0FBQzdCLElBQU0sdUJBQXVCO0FBQzdCLElBQU0sMEJBQTBCO0FBQ2hDLElBQU0sdUJBQXVCO0FBQzdCLElBQU0sdUJBQXVCO0FBQzdCLElBQU0sc0JBQXNCO0FBRzVCLElBQU0sYUFBYTtBQUFBLEVBQ2YsU0FBUyxDQUFDLGVBQWUsWUFBWSxxQkFBcUIsc0JBQXNCLGlCQUFpQjtBQUFBLEVBQ2pHLFNBQVMsQ0FBQyxvQkFBb0IsbUJBQW1CO0FBQUEsRUFDakQsT0FBTyxDQUFDLGFBQWEsa0JBQWtCO0FBQUEsRUFDdkMsY0FBYyxDQUFDLGtCQUFrQjtBQUFBLEVBQ2pDLFlBQVksQ0FBQyxnQkFBZ0I7QUFBQSxFQUM3QixZQUFZLENBQUMsaUJBQWlCO0FBQ2xDO0FBR0EsSUFBTSxrQkFBa0Isb0JBQUksSUFBSTtBQUFBLEVBQzVCO0FBQ0osQ0FBQztBQU9ELElBQU0saUJBQU4sTUFBTSxlQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJUixjQUFjO0FBQUEsRUFBQztBQUFBO0FBQUEsRUFFdkIsV0FBVyxRQUFRO0FBQ2YsV0FBTztBQUFBLE1BQ0g7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxhQUFhLFdBQVcsT0FBZSxXQUFXLEdBQW9CO0FBQ2xFLFFBQUksQ0FBQyxTQUFTLFNBQVMsS0FBSztBQUFHLFlBQU0sV0FBVyxxQkFBcUIsT0FBTyxVQUFVLE9BQU8sS0FBSztBQUVsRyxlQUFXLFVBQVUsaUJBQWlCO0FBQ2xDLFVBQUksT0FBTyxLQUFLLEtBQUssR0FBRztBQUNwQixZQUFJO0FBQ0EsZ0JBQU0sTUFBTSxVQUFNLHFCQUFNLE9BQU87QUFBQSxZQUMzQixRQUFRO0FBQUEsWUFDUixVQUFVO0FBQUEsVUFDZCxDQUFDO0FBRUQsY0FBSSxDQUFDLElBQUk7QUFBSTtBQUdiLGNBQUksc0NBQXNDLEtBQUssSUFBSSxHQUFHLEdBQUc7QUFDckQsa0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixrQkFBTUMsVUFBUyxLQUFLLE1BQU0saUNBQWlDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sTUFBTSxFQUFFLENBQUM7QUFFL0UsZ0JBQUksQ0FBQ0E7QUFBUTtBQUViLG1CQUFPLGtDQUFrQ0EsT0FBTTtBQUFBLFVBQ25EO0FBQ0EsaUJBQU8sV0FBVyxJQUFJLElBQUksTUFBTSxLQUFLLFdBQVcsSUFBSSxLQUFLLFdBQVcsQ0FBQztBQUFBLFFBQ3pFLFFBQVE7QUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUVBLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE9BQU8sUUFBUSxPQUFlLHVCQUFtRSxVQUFVLGFBQTRCO0FBQ25JLFFBQUksQ0FBQyxTQUFTLFNBQVMsS0FBSztBQUFHLFlBQU0sV0FBVyxxQkFBcUIsT0FBTyxVQUFVLE9BQU8sS0FBSztBQUNsRyxRQUFJLENBQUMsTUFBTTtBQUFRLFlBQU0sV0FBVyxrQkFBa0IsU0FBUyxPQUFPLEtBQUssQ0FBQztBQUU1RSxVQUFNLFdBQVcsd0JBQUMsTUFBbUNDLFlBQW1CLEVBQUUsTUFBTSxPQUFBQSxPQUFNLElBQXJFO0FBRWpCLFFBQUk7QUFDQSxZQUFNLE1BQU0sSUFBSSxJQUFJLEtBQUs7QUFFekIsVUFBSSxXQUFXLFFBQVEsU0FBUyxJQUFJLElBQUksR0FBRztBQUN2QyxnQkFBUSxNQUFNLFFBQVEsdUJBQXVCLEVBQUUsRUFBRSxLQUFLO0FBQ3RELGNBQU0sYUFBYSxJQUFJLGFBQWEsSUFBSSxNQUFNO0FBQzlDLGNBQU0sVUFBVSxJQUFJLGFBQWEsSUFBSSxHQUFHO0FBQ3hDLFlBQUksWUFBWTtBQUNaLGNBQUksV0FBVyxXQUFXLFdBQVcsSUFBSTtBQUFHLG1CQUFPLFNBQVMsVUFBVSxrQkFBa0IsbUNBQW1DLE9BQU8sU0FBUyxVQUFVLEVBQUU7QUFDdkosaUJBQU8sU0FBUyxVQUFVLGtCQUFrQix5Q0FBeUMsVUFBVSxFQUFFO0FBQUEsUUFDckc7QUFDQSxZQUFJLGVBQWMsV0FBVyxLQUFLLEtBQUssZUFBYyxZQUFZLEtBQUs7QUFBRyxpQkFBTyxTQUFTLFVBQVUsZUFBZSxLQUFLO0FBQ3ZILGVBQU8sU0FBUyxzQkFBc0IsS0FBSztBQUFBLE1BQy9DLFdBQVcsV0FBVyxRQUFRLFNBQVMsSUFBSSxJQUFJLEdBQUc7QUFDOUMsZ0JBQVEsTUFBTSxRQUFRLHNCQUFzQixFQUFFO0FBQzlDLFlBQUkscUJBQXFCLEtBQUssS0FBSztBQUFHLGlCQUFPLFNBQVMsVUFBVSxrQkFBa0IsS0FBSztBQUN2RixZQUFJLGtCQUFrQixLQUFLLEtBQUs7QUFBRyxpQkFBTyxTQUFTLFVBQVUsZUFBZSxLQUFLO0FBQ2pGLFlBQUksaUJBQWlCLEtBQUssS0FBSztBQUFHLGlCQUFPLFNBQVMsVUFBVSxjQUFjLEtBQUs7QUFDL0UsZUFBTyxTQUFTLHNCQUFzQixLQUFLO0FBQUEsTUFDL0MsV0FBVyxXQUFXLE1BQU0sU0FBUyxJQUFJLElBQUksR0FBRztBQUM1QyxZQUFJLFdBQVcsS0FBSyxLQUFLO0FBQUcsaUJBQU8sU0FBUyxVQUFVLE9BQU8sS0FBSztBQUNsRSxlQUFPLFNBQVMsc0JBQXNCLEtBQUs7QUFBQSxNQUMvQyxXQUFXLFdBQVcsYUFBYSxTQUFTLElBQUksSUFBSSxHQUFHO0FBQ25ELFlBQUksa0JBQWtCLEtBQUssS0FBSztBQUFHLGlCQUFPLFNBQVMsVUFBVSxjQUFjLEtBQUs7QUFDaEYsZUFBTyxTQUFTLHNCQUFzQixLQUFLO0FBQUEsTUFDL0MsV0FBVyxXQUFXLFdBQVcsU0FBUyxJQUFJLElBQUksR0FBRztBQUNqRCxZQUFJLHdCQUF3QixLQUFLLEtBQUs7QUFBRyxpQkFBTyxTQUFTLFVBQVUscUJBQXFCLEtBQUs7QUFDN0YsWUFBSSxxQkFBcUIsS0FBSyxLQUFLO0FBQUcsaUJBQU8sU0FBUyxVQUFVLGtCQUFrQixLQUFLO0FBQ3ZGLGVBQU8sU0FBUyxzQkFBc0IsS0FBSztBQUFBLE1BQy9DLFdBQVcsV0FBVyxXQUFXLFNBQVMsSUFBSSxJQUFJLEdBQUc7QUFDakQsWUFBSSxxQkFBcUIsS0FBSyxLQUFLO0FBQUcsaUJBQU8sU0FBUyxVQUFVLG1CQUFtQixLQUFLO0FBQ3hGLFlBQUksd0JBQXdCLEtBQUssS0FBSztBQUFHLGlCQUFPLFNBQVMsVUFBVSxzQkFBc0IsS0FBSztBQUM5RixZQUFJLG9CQUFvQixLQUFLLEtBQUs7QUFBRyxpQkFBTyxTQUFTLFVBQVUsa0JBQWtCLEtBQUs7QUFDdEYsZUFBTyxTQUFTLHNCQUFzQixLQUFLO0FBQUEsTUFDL0MsT0FBTztBQUNILGVBQU8sU0FBUyxVQUFVLFdBQVcsS0FBSztBQUFBLE1BQzlDO0FBQUEsSUFDSixRQUFRO0FBQ0osYUFBTyxTQUFTLHNCQUFzQixLQUFLO0FBQUEsSUFDL0M7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBTyxXQUFXLE9BQTBDO0FBQ3hELFdBQU8sZUFBYyxRQUFRLEtBQUssRUFBRSxTQUFTLFVBQVUsUUFBUSxNQUFNLE1BQU0sR0FBRyxFQUFFLE9BQU8sT0FBTyxFQUFFLElBQUksSUFBSTtBQUFBLEVBQzVHO0FBQUEsRUFFQSxPQUFPLFdBQVcsR0FBVztBQUN6QixXQUFPLG9CQUFvQixLQUFLLENBQUM7QUFBQSxFQUNyQztBQUFBLEVBRUEsT0FBTyxZQUFZLEdBQVc7QUFDMUIsV0FBTyxxQkFBcUIsS0FBSyxDQUFDO0FBQUEsRUFDdEM7QUFDSjtBQTlIb0I7QUFBcEIsSUFBTSxnQkFBTjs7O0FEbENBLElBQUFDLG1CQUFzQzs7O0FFUHRDLElBQUFDLGtCQUE4QjtBQVd2QixJQUFNLGNBQU4sTUFBTSxZQUFXO0FBQUEsRUFBakI7QUFJSDtBQUFBO0FBQUE7QUFBQSxTQUFPLFVBQWtDLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRbkMsTUFBTSxVQUFVLE9BQU87QUFDMUIsUUFBSSxTQUFTO0FBQ1QsV0FBSyxRQUFRLFFBQVEsQ0FBQyxVQUFVLE1BQU0sUUFBUSxDQUFDO0FBQUEsSUFDbkQ7QUFFQSxTQUFLLFVBQVUsQ0FBQztBQUFBLEVBQ3BCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLE9BQU87QUFDZCxXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3hCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWVPLFFBQVEsU0FBd0M7QUFDbkQsVUFBTSxRQUFRLElBQUksZ0JBQWdCLE1BQU0sT0FBTztBQUUvQyxRQUFJLEtBQUs7QUFBa0IsWUFBTSxRQUFRLEVBQUUsTUFBTSxLQUFLLGdCQUFnQjtBQUV0RSxRQUFJLEtBQUssUUFBUSxXQUFXLEdBQUc7QUFDM0IsV0FBSyxRQUFRLEtBQUssS0FBSztBQUN2QixZQUFNLFFBQVE7QUFDZCxhQUFPO0FBQUEsSUFDWDtBQUVBLFNBQUssUUFBUSxLQUFLLEtBQUs7QUFDdkIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQWdCO0FBQ25CLFFBQUksQ0FBQyxLQUFLLFFBQVE7QUFBUTtBQUUxQixTQUFLLFFBQVEsTUFBTTtBQUNuQixTQUFLLFFBQVEsQ0FBQyxHQUFHLFFBQVE7QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sWUFBWTtBQUNmLFNBQUssUUFBUSxRQUFRLENBQUMsVUFBVSxNQUFNLE9BQU8sQ0FBQztBQUFBLEVBQ2xEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFlBQVksT0FBd0I7QUFDdkMsVUFBTSxXQUFXLEtBQUssUUFBUSxRQUFRLEtBQUs7QUFFM0MsUUFBSSxhQUFhLElBQUk7QUFDakIsV0FBSyxRQUFRLE9BQU8sVUFBVSxDQUFDO0FBQy9CLGFBQU87QUFBQSxJQUNYO0FBRUEsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQXRGd0I7QUFBakIsSUFBTSxhQUFOO0FBd0ZBLElBQU0sbUJBQU4sTUFBTSxpQkFBZ0I7QUFBQSxFQVFsQixZQUFtQixPQUEwQixTQUF3QztBQUFsRTtBQUEwQjtBQVBwRCxTQUFnQixLQUFLLDhCQUFjLFNBQVMsRUFBRSxTQUFTO0FBRXZELFNBQU8sU0FBNkI7QUFDcEMsU0FBTyxVQUErQjtBQUtsQyxTQUFLLFVBQVUsSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQzVDLFdBQUssVUFBVTtBQUNmLFdBQUssU0FBUztBQUFBLElBQ2xCLENBQUM7QUFFRCxRQUFJLEtBQUssU0FBUyxRQUFRO0FBQ3RCLFdBQUssZUFBZSxLQUFLLFFBQVEsTUFBTTtBQUFBLElBQzNDO0FBQUEsRUFDSjtBQUFBLEVBRU8sZUFBZSxRQUFxQjtBQUN2QyxRQUFJLE9BQU87QUFBUztBQUNwQixTQUFLLFNBQVM7QUFDZCxTQUFLLFVBQVUsTUFBTTtBQUNqQixXQUFLLE1BQU0sWUFBWSxJQUFJO0FBQzNCLFdBQUssT0FBTztBQUFBLElBQ2hCO0FBRUEsU0FBSyxPQUFPLGlCQUFpQixTQUFTLEtBQUssT0FBTztBQUFBLEVBQ3REO0FBQUEsRUFFTyxVQUFVO0FBQ2IsU0FBSyxRQUFRO0FBQ2IsU0FBSyxRQUFRO0FBQUEsRUFDakI7QUFBQSxFQUVPLFVBQVU7QUFDYixTQUFLLFFBQVE7QUFDYixTQUFLLE1BQU0sUUFBUTtBQUFBLEVBQ3ZCO0FBQUEsRUFFTyxTQUFTO0FBQ1osU0FBSyxRQUFRO0FBQ2IsU0FBSyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFBQSxFQUN0QztBQUFBLEVBRU8sVUFBVTtBQUNiLFFBQUksS0FBSztBQUFTLFdBQUssUUFBUSxvQkFBb0IsU0FBUyxLQUFLLE9BQU87QUFDeEUsU0FBSyxTQUFTO0FBQ2QsU0FBSyxVQUFVO0FBQUEsRUFDbkI7QUFBQSxFQUVPLFVBQVU7QUFDYixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUNKO0FBdEQ2QjtBQUF0QixJQUFNLGtCQUFOOzs7QUZ0RlAsSUFBQUMsU0FBdUI7QUFDdkIsa0JBQTRCO0FBRXJCLElBQU0scUJBQXFCO0FBaEJsQztBQThDTyxJQUFNLHdCQUFOLE1BQU0sc0JBQXFDO0FBQUEsRUFJdkMsWUFBbUIsT0FBeUI7QUFBekI7QUE4bEIxQjtBQWFBLHVCQUFNO0FBTU4sdUJBQU07QUFtQk47QUF2b0JBLGtDQUFZO0FBQ1osK0NBQXlCO0FBQ3pCLFNBQU8sYUFBYSxJQUFJLFdBQVc7QUFFL0IsdUJBQUssd0JBQXlCLHNCQUFzQixLQUFLLEtBQUssTUFBTSxPQUFPLFNBQVMsQ0FBQztBQUFBLEVBQ3pGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxTQUFTO0FBQ1osV0FBTyxDQUFDLENBQUMsS0FBSyxNQUFNLFlBQVksT0FBTztBQUFBLEVBQzNDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxjQUFjO0FBQ2pCLFdBQU8sQ0FBQyxDQUFDLEtBQUssTUFBTSxZQUFZLFlBQVk7QUFBQSxFQUNoRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sWUFBWTtBQUNmLFdBQU8sQ0FBQyxDQUFDLEtBQUssTUFBTSxZQUFZLFVBQVU7QUFBQSxFQUM5QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sV0FBVztBQUNkLFdBQU8sQ0FBQyxDQUFDLEtBQUssTUFBTSxZQUFZLFNBQVM7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sZ0JBQWdCO0FBQ25CLHVCQUFLLFdBQVk7QUFBQSxFQUNyQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sWUFBWSxVQUFrQjtBQUNqQyx1QkFBSyxXQUFZO0FBQUEsRUFDckI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsYUFBYTtBQUNwQixXQUFPLEtBQUssTUFBTSxZQUFZLGNBQWM7QUFBQSxFQUNoRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxlQUFlO0FBQ3RCLFVBQU0sTUFBTSxtQkFBSyxhQUFZLEtBQUs7QUFFbEMsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLHdCQUF3QjtBQUMzQixVQUFNLGVBQWUsS0FBSyxNQUFNLFFBQVEsT0FBTyxRQUFRLEVBQUUsT0FBTyxDQUFDLE9BQU8sbUJBQW1CLEtBQUssRUFBRSxDQUFDO0FBQ25HLFVBQU0sY0FBYyxhQUNmLElBQUksQ0FBQyxNQUFNO0FBQ1IsYUFBTyxXQUFXLG1CQUFtQixLQUFLLENBQUMsSUFBSSxDQUFDLENBQVc7QUFBQSxJQUMvRCxDQUFDLEVBQ0EsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUU1QixXQUFPLENBQUMsWUFBWSxTQUFTLElBQUksWUFBWSxPQUFPLENBQUMsYUFBYSxZQUFZLFVBQVUsV0FBVztBQUFBLEVBQ3ZHO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLHdCQUF3QjtBQUMvQixVQUFNLE1BQU0sS0FBSztBQUNqQixXQUFPLEtBQUssTUFBTSxLQUFLLHNCQUFzQixJQUFJLEdBQUc7QUFBQSxFQUN4RDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxvQkFBb0I7QUFDM0IsVUFBTSxNQUFNLEtBQUs7QUFFakIsV0FBTyxLQUFLLE1BQU0sTUFBTSxLQUFLLHNCQUFzQixDQUFDO0FBQUEsRUFDeEQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsZ0JBQWdCO0FBQ3ZCLFVBQU0seUJBQXlCLEtBQUssTUFBTSxRQUFRO0FBQ2xELFVBQU0sUUFBUSxLQUFLLE1BQU07QUFFekIsUUFBSSwwQkFBMEIsT0FBTyxZQUFZLFFBQVEsT0FBTyxNQUFNLGFBQWEsWUFBWSxZQUFZLE1BQU0sVUFBVTtBQUN2SCxZQUFNLFdBQ0YsTUFLRixVQUFVLE9BQU87QUFFbkIsVUFBSSxTQUFTLFNBQVMsUUFBUTtBQUFHLGVBQU87QUFBQSxJQUM1QztBQUVBLFdBQU8sT0FBTyxjQUFjO0FBQUEsRUFDaEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sYUFBYSxnQkFBZ0IsT0FBK0I7QUFDL0QsUUFBSSxDQUFDLEtBQUssTUFBTTtBQUFjLGFBQU87QUFFckMsVUFBTSxVQUFVLGdCQUFnQixLQUFLLGVBQWUsS0FBSztBQUN6RCxVQUFNLFFBQVEsZ0JBQWdCLEtBQUssZ0JBQWdCLEtBQUs7QUFFeEQsV0FBTztBQUFBLE1BQ0gsU0FBUztBQUFBLFFBQ0wsT0FBTyxLQUFLLGNBQWMsS0FBSyxRQUFRLE9BQU8sQ0FBQztBQUFBLFFBQy9DLE9BQU87QUFBQSxNQUNYO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDSCxPQUFPLEtBQUssY0FBYyxLQUFLLFFBQVEsS0FBSyxDQUFDO0FBQUEsUUFDN0MsT0FBTztBQUFBLE1BQ1g7QUFBQSxNQUNBLFVBQVUsS0FBSyxNQUFPLFVBQVUsUUFBUyxHQUFHO0FBQUEsSUFDaEQ7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGtCQUFrQixTQUFvQztBQUN6RCxVQUFNLFlBQVksS0FBSyxhQUFhO0FBQ3BDLFFBQUksQ0FBQztBQUFXLGFBQU87QUFDdkIsVUFBTSxFQUFFLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxVQUFVLFNBQVMsSUFBSSxZQUFZLE1BQU0sWUFBWSxTQUFTLElBQUksV0FBVyxDQUFDO0FBQ2hKLFFBQUksTUFBTSxNQUFNLEtBQUssU0FBUyxLQUFLLENBQUMsT0FBTyxTQUFTLE1BQU0sR0FBRztBQUN6RCxZQUFNLFdBQVcsaUJBQWlCLHFDQUFxQyxPQUFPLE1BQU0sR0FBRyxLQUFLLGVBQWU7QUFBQSxJQUMvRztBQUNBLFVBQU0sUUFBUSxLQUFLLE1BQU8sVUFBVSxRQUFRLFFBQVEsVUFBVSxNQUFNLFFBQVMsTUFBTTtBQUNuRixRQUFJLFNBQVMsS0FBSyxTQUFTLFFBQVE7QUFDL0IsWUFBTSxNQUFNLFNBQVMsT0FBTyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUU7QUFDL0MsVUFBSSxLQUFLLFNBQVM7QUFDbEIsVUFBSSxLQUFLLFVBQVUsT0FBTyxTQUFTLEtBQUssQ0FBQztBQUN6QyxVQUFJLFdBQVc7QUFDWCxlQUFPLEdBQUcsVUFBVSxRQUFRLEtBQUssSUFBSSxTQUFTLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLFNBQVMsSUFBSSxVQUFVLE1BQU0sS0FBSztBQUFBLE1BQ3hHLE9BQU87QUFDSCxlQUFPLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUFBLE1BQzFCO0FBQUEsSUFDSixPQUFPO0FBQ0gsVUFBSSxXQUFXO0FBQ1gsZUFBTyxHQUFHLFVBQVUsUUFBUSxLQUFLLElBQUksU0FBUyxJQUFJLFNBQVMsR0FBRyxVQUFVLE9BQU8sU0FBUyxDQUFDLENBQUMsSUFBSSxTQUFTLElBQUksVUFBVSxNQUFNLEtBQUs7QUFBQSxNQUNwSSxPQUFPO0FBQ0gsZUFBTyxHQUFHLFNBQVMsR0FBRyxVQUFVLE9BQU8sU0FBUyxDQUFDLENBQUM7QUFBQSxNQUN0RDtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsS0FBSyxVQUFrQjtBQUNoQyxRQUFJLENBQUMsS0FBSyxNQUFNO0FBQWMsYUFBTztBQUNyQyxRQUFJLGFBQWEsS0FBSztBQUF1QixhQUFPO0FBQ3BELFFBQUksV0FBVyxLQUFLLGVBQWU7QUFDL0IsYUFBTyxLQUFLLEtBQUs7QUFBQSxRQUNiO0FBQUEsUUFDQSxhQUFhLFdBQVcsaUJBQWlCLGNBQWMsT0FBTyxRQUFRLEdBQUcsS0FBSyxPQUFPLEtBQUssYUFBYSxDQUFDLEVBQUU7QUFBQSxNQUM5RyxDQUFDO0FBQUEsSUFDTDtBQUNBLFFBQUksV0FBVztBQUFHLGlCQUFXO0FBQzdCLFdBQU8sTUFBTSxLQUFLLE1BQU0sUUFBUSxjQUFjLFFBQVE7QUFBQSxFQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxTQUFTO0FBQ2hCLFdBQU8sS0FBSyxNQUFNLFlBQVksVUFBVTtBQUFBLEVBQzVDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFVBQVUsS0FBYTtBQUMxQixRQUFJLENBQUMsS0FBSyxNQUFNO0FBQVksYUFBTztBQUNuQyxVQUFNLE1BQU0sS0FBSyxNQUFNLFdBQVcsVUFBVSxHQUFHO0FBQy9DLFFBQUk7QUFBSyxXQUFLLE1BQU0sUUFBUSxrQkFBa0IsU0FBUztBQUN2RCxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxXQUFXLE1BQXVCO0FBQ3JDLFNBQUssTUFBTSxZQUFZLGVBQWUsU0FBUyxXQUFXLFNBQVMsU0FBUyxLQUFLLE1BQU0sU0FBUyxXQUFXLE9BQVEsSUFBSTtBQUFBLEVBQzNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFVBQVUsT0FBZ0I7QUFDN0IsUUFBSTtBQUFPLGFBQU8sS0FBSyxNQUFNLFlBQVksTUFBTSxJQUFJLEtBQUs7QUFDeEQsV0FBTyxLQUFLLE1BQU0sWUFBWSxPQUFPLEtBQUs7QUFBQSxFQUM5QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sUUFBUTtBQUNYLFdBQU8sS0FBSyxVQUFVLElBQUk7QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sU0FBUztBQUNaLFdBQU8sS0FBSyxVQUFVLEtBQUs7QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sS0FBSyxTQUF1QjtBQUMvQixRQUFJLENBQUMsS0FBSyxNQUFNO0FBQVksYUFBTztBQUNuQyxVQUFNLFFBQVEsS0FBSyxNQUFNO0FBQ3pCLFFBQUksQ0FBQztBQUFPLGFBQU87QUFDbkIsU0FBSyxNQUFNLGlCQUFpQixLQUFLO0FBQ2pDLFNBQUssTUFBTSxXQUFXLElBQUk7QUFDMUIsVUFBTSxFQUFFLFFBQVEsWUFBWSxJQUFJLFdBQVc7QUFBQSxNQUN2QztBQUFBLE1BQ0EsYUFBYTtBQUFBLElBQ2pCO0FBQ0EsU0FBSyxNQUFNLEtBQUssZ0JBQWdCLFlBQVksS0FBSyxPQUFPLE9BQU8sUUFBUSxXQUFXO0FBQ2xGLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLE9BQU8sT0FBd0I7QUFDbEMsVUFBTSxhQUFhLEtBQUssTUFBTSxPQUFPLEtBQUssQ0FBQyxHQUFHLFFBQVE7QUFDbEQsVUFBSSxpQkFBaUIsU0FBUyxPQUFPLFVBQVUsVUFBVTtBQUNyRCxnQkFBUSxPQUFPLFVBQVUsV0FBVyxRQUFRLE1BQU0sUUFBUSxFQUFFO0FBQUEsTUFDaEU7QUFDQSxVQUFJLE9BQU8sVUFBVTtBQUFVLGVBQU8sVUFBVSxFQUFFO0FBQ2xELGFBQU8sUUFBUTtBQUFBLElBQ25CLENBQUM7QUFDRCxRQUFJLENBQUM7QUFBWSxhQUFPO0FBRXhCLFNBQUssTUFBTSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxXQUFXLEVBQUU7QUFFekQsU0FBSyxNQUFNLEtBQUssZ0JBQWdCLGtCQUFrQixLQUFLLE9BQU8sVUFBVTtBQUV4RSxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxLQUFLLE9BQXdCO0FBQ2hDLFVBQU0sVUFBVSxLQUFLLE9BQU8sS0FBSztBQUNqQyxRQUFJLENBQUM7QUFBUyxhQUFPO0FBQ3JCLFNBQUssTUFBTSxPQUFPLE1BQU0sUUFBUSxPQUFPO0FBQ3ZDLFdBQU8sS0FBSyxLQUFLO0FBQUEsTUFDYjtBQUFBLE1BQ0EsYUFBYTtBQUFBLElBQ2pCLENBQUM7QUFBQSxFQUNMO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGlCQUFpQixPQUFnQztBQUNwRCxXQUFPLEtBQUssTUFBTSxPQUFPLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxRQUFRO0FBQ3JELFVBQUksaUJBQWlCLFNBQVMsT0FBTyxVQUFVLFVBQVU7QUFDckQsZ0JBQVEsT0FBTyxVQUFVLFdBQVcsUUFBUSxNQUFNLFFBQVEsRUFBRTtBQUFBLE1BQ2hFO0FBQ0EsVUFBSSxPQUFPLFVBQVU7QUFBVSxlQUFPLFVBQVUsRUFBRTtBQUNsRCxhQUFPLFFBQVE7QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDTDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxPQUFPLE9BQXdCO0FBQ2xDLFVBQU0sTUFBTSxLQUFLLGlCQUFpQixLQUFLO0FBQ3ZDLFFBQUksTUFBTTtBQUFHLGFBQU87QUFDcEIsVUFBTSxVQUFVLEtBQUssT0FBTyxHQUFHO0FBQy9CLFFBQUksQ0FBQztBQUFTLGFBQU87QUFDckIsVUFBTSxXQUFXLEtBQUssTUFBTSxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxLQUFLLEdBQUc7QUFDbEUsU0FBSyxNQUFNLE9BQU8sTUFBTSxPQUFPLEdBQUcsS0FBSyxPQUFPO0FBQzlDLFNBQUssTUFBTSxLQUFLLGdCQUFnQixtQkFBbUIsS0FBSyxPQUFPLFFBQVE7QUFDdkUsV0FBTyxLQUFLLEtBQUs7QUFBQSxNQUNiO0FBQUEsTUFDQSxhQUFhO0FBQUEsSUFDakIsQ0FBQztBQUFBLEVBQ0w7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxPQUFPLE9BQWMsUUFBUSxHQUFHO0FBQ25DLFFBQUksRUFBRSxpQkFBaUI7QUFBUSxZQUFNLFdBQVcscUJBQXFCLGVBQWUscUJBQXFCLE9BQU8sS0FBSyxDQUFDO0FBQ3RILHVCQUFtQixLQUFLLE9BQU8sS0FBSztBQUNwQyxTQUFLLE1BQU0sT0FBTyxNQUFNLE9BQU8sT0FBTyxHQUFHLEtBQUs7QUFDOUMsUUFBSSxDQUFDLEtBQUssTUFBTSxRQUFRO0FBQWMsV0FBSyxNQUFNLEtBQUssZ0JBQWdCLGVBQWUsS0FBSyxPQUFPLEtBQUs7QUFBQSxFQUMxRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLEtBQUssTUFBdUIsSUFBWTtBQUMzQyxVQUFNLFVBQVUsS0FBSyxPQUFPLElBQUk7QUFDaEMsUUFBSSxDQUFDLFNBQVM7QUFDVixZQUFNLFdBQVcsY0FBYyx1QkFBdUI7QUFBQSxJQUMxRDtBQUNBLFNBQUssT0FBTyxTQUFTLEVBQUU7QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLEtBQUssTUFBdUIsSUFBWTtBQUMzQyxVQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sR0FBRyxLQUFLLGlCQUFpQixJQUFJLENBQUM7QUFDNUQsUUFBSSxDQUFDLEtBQUs7QUFDTixZQUFNLFdBQVcsY0FBYyx1QkFBdUI7QUFBQSxJQUMxRDtBQUNBLFNBQUssT0FBTyxLQUFLLEVBQUU7QUFBQSxFQUN2QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLEtBQUssT0FBd0IsUUFBeUI7QUFDekQsVUFBTSxNQUFNLEtBQUssaUJBQWlCLEtBQUs7QUFDdkMsUUFBSSxNQUFNO0FBQUcsWUFBTSxXQUFXLGNBQWMsMkJBQTJCO0FBRXZFLFVBQU0sT0FBTyxLQUFLLGlCQUFpQixNQUFNO0FBQ3pDLFFBQUksT0FBTztBQUFHLFlBQU0sV0FBVyxjQUFjLDRCQUE0QjtBQUV6RSxVQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU8sTUFBTSxHQUFHO0FBQ3hDLFVBQU0sUUFBUSxLQUFLLE1BQU0sT0FBTyxNQUFNLElBQUk7QUFFMUMsU0FBSyxNQUFNLE9BQU8sTUFBTSxHQUFHLElBQUk7QUFDL0IsU0FBSyxNQUFNLE9BQU8sTUFBTSxJQUFJLElBQUk7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxLQUFLLFFBQVEsT0FBTztBQUN2QixTQUFLLE1BQU0sT0FBTyxNQUFNO0FBQ3hCLFNBQUssTUFBTSxRQUFRLE1BQU07QUFDekIsUUFBSSxDQUFDLEtBQUssTUFBTTtBQUFZLGFBQU87QUFDbkMsU0FBSyxNQUFNLFdBQVcsSUFBSTtBQUMxQixRQUFJLE9BQU87QUFDUCxXQUFLLE1BQU0sV0FBVyxRQUFRO0FBQzlCLGFBQU87QUFBQSxJQUNYO0FBQ0EsUUFBSSxLQUFLLE1BQU0sUUFBUSxhQUFhO0FBQ2hDLFlBQU0sS0FBcUIsV0FBVyxNQUFNO0FBQ3hDLFlBQUksS0FBSyxVQUFVLEtBQUssS0FBSyxNQUFNLE9BQU87QUFBTSxpQkFBTyxhQUFhLEVBQUU7QUFDdEUsYUFBSyxNQUFNLFlBQVksUUFBUTtBQUFBLE1BQ25DLEdBQUcsS0FBSyxNQUFNLFFBQVEsbUJBQW1CLEVBQUUsTUFBTTtBQUFBLElBQ3JEO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxRQUFRLFVBQXlCO0FBQzFDLFVBQU0sS0FBSyxNQUFNLFlBQVksV0FBVyxRQUFnQztBQUFBLEVBQzVFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYSxLQUFLLEtBQW9CLFNBQStCO0FBQ2pFLFFBQUksQ0FBQyxLQUFLLE1BQU0sWUFBWSxpQkFBaUI7QUFDekMsWUFBTSxXQUFXLHdCQUF3QjtBQUFBLElBQzdDO0FBRUEsUUFBSSxLQUFLLE1BQU07QUFBYSxXQUFLLE1BQU0sTUFBTSxvQ0FBb0MsS0FBSyxNQUFNLE1BQU0sSUFBSSxTQUFTLEtBQUssTUFBTSxNQUFNLEVBQUUsR0FBRztBQUVySSxjQUFVLE9BQU87QUFBQSxNQUNiLENBQUM7QUFBQSxNQUNEO0FBQUEsUUFDSSxPQUFPLEtBQUssTUFBTSxnQkFBZ0I7QUFBQSxRQUNsQyxnQkFBZ0I7QUFBQSxRQUNoQixNQUFNO0FBQUEsTUFDVjtBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBRUEsUUFBSSxPQUFPLFFBQVEsT0FBTztBQUN0QixVQUFJLEtBQUssTUFBTTtBQUFhLGFBQUssTUFBTSxNQUFNLDBGQUEwRjtBQUN2SSxhQUFPLEtBQUssTUFBTSxTQUFTLEdBQUc7QUFBQSxJQUNsQztBQUVBLFVBQU0sUUFBUSxPQUFPLEtBQUssTUFBTSxPQUFPLFNBQVM7QUFDaEQsUUFBSSxDQUFDLE9BQU87QUFDUixZQUFNLFFBQVEsV0FBVyxjQUFjLGtEQUFrRDtBQUN6RixXQUFLLE1BQU0sS0FBSyxnQkFBZ0IsT0FBTyxLQUFLLE9BQU8sS0FBSztBQUN4RDtBQUFBLElBQ0o7QUFFQSxRQUFJLEtBQUssTUFBTTtBQUFhLFdBQUssTUFBTSxNQUFNLDhEQUE4RDtBQUUzRyxRQUFJO0FBQ0EsVUFBSSxLQUFLLE1BQU07QUFBYSxhQUFLLE1BQU0sTUFBTSx5Q0FBeUM7QUFDdEYsWUFBTSxNQUFNLE1BQU0sS0FBSyxVQUFVLE1BQU07QUFDdkMsWUFBTSxLQUFzQixNQUFNLGNBQWMsUUFBUSxZQUFZLGdCQUFnQixRQUFRLGdCQUFnQixtQkFBbUI7QUFDL0gsVUFBSSxLQUFLLE1BQU07QUFBYSxhQUFLLE1BQU0sTUFBTSxtREFBbUQsRUFBRSxNQUFNO0FBRXhHLFlBQU0sWUFBWTtBQUFBLFFBQ2QsT0FBTztBQUFBLFFBQ1AsUUFBUTtBQUFBLE1BQ1o7QUFFQSxZQUFNLEtBQUssTUFBTSx1QkFBdUIsT0FBTyxNQUFNLGFBQWEsS0FBSyxLQUFLLEVBQUU7QUFBQSxRQUMxRSxDQUFDLE1BQU07QUFDSCxjQUFJLEdBQUc7QUFDSCxzQkFBVSxTQUFTO0FBQUEsVUFDdkI7QUFBQSxRQUNKO0FBQUEsUUFDQSxDQUFDLE1BQWMsVUFBVSxRQUFRO0FBQUEsTUFDckM7QUFHQSxVQUFJLENBQUMsVUFBVSxVQUFVLFVBQVU7QUFBTyxlQUFPLHNCQUFLLGtCQUFMLFdBQVksT0FBTyxVQUFVO0FBRzlFLFVBQUksQ0FBQyxVQUFVLFFBQVE7QUFDbkIsWUFBSSxLQUFLLE1BQU07QUFBYSxlQUFLLE1BQU0sTUFBTSxpREFBaUQ7QUFDOUYsY0FBTSxzQkFBSyw4Q0FBTCxXQUEwQixPQUFPO0FBQUEsVUFDbkMsQ0FBQyxNQUFNO0FBQ0gsZ0JBQUksR0FBRyxRQUFRO0FBQ1gsd0JBQVUsU0FBbUIsRUFBRTtBQUMvQjtBQUFBLFlBQ0o7QUFFQSxnQkFBSSxHQUFHLE9BQU87QUFDVix3QkFBVSxRQUFRLEVBQUU7QUFDcEI7QUFBQSxZQUNKO0FBRUEsc0JBQVUsU0FBUyxVQUFVLFFBQVE7QUFBQSxVQUN6QztBQUFBLFVBQ0EsQ0FBQyxNQUFjLFVBQVUsUUFBUTtBQUFBLFFBQ3JDO0FBQUEsTUFDSjtBQUVBLFVBQUksQ0FBQyxVQUFVO0FBQVEsZUFBTyxzQkFBSyxrQkFBTCxXQUFZLE9BQU8sVUFBVTtBQUUzRCxVQUFJLE9BQU8sUUFBUSxTQUFTLFlBQVksUUFBUSxRQUFRLEdBQUc7QUFDdkQsMkJBQUssV0FBWSxRQUFRO0FBQUEsTUFDN0IsT0FBTztBQUNILDJCQUFLLFdBQVk7QUFBQSxNQUNyQjtBQUdBLFlBQU0sVUFBVSxNQUFNLEtBQUssV0FBVyxZQUFrQixLQUFLLE1BQU0sT0FBTyxRQUFRLGFBQWEsZ0JBQWlCLFNBQVMsU0FBUztBQUVsSSxZQUFNLG9CQUFrQztBQUFBLFFBQ3BDLGtCQUFrQjtBQUFBLFVBQ2QsZUFBZSxLQUFLLE1BQU0sUUFBUTtBQUFBLFVBQ2xDLGtCQUFrQixLQUFLLE1BQU0sUUFBUTtBQUFBLFVBQ3JDLGVBQWUsS0FBSyxNQUFNLFFBQVE7QUFBQSxVQUNsQyxnQkFBZ0IsS0FBSyxNQUFNLFFBQVE7QUFBQSxVQUNuQyxrQkFBa0IsS0FBSyxNQUFNLFFBQVE7QUFBQSxVQUNyQyxZQUFZLE9BQU8sS0FBSyxNQUFNLFFBQVEsY0FBYyxZQUFZLEtBQUssTUFBTSxRQUFRLFlBQVksSUFBSSxLQUFLLE1BQU0sUUFBUSxZQUFZO0FBQUEsVUFDbEksY0FBYyxLQUFLLE1BQU0sUUFBUSxrQkFBa0IsVUFBVTtBQUFBLFVBQzdELElBQUksS0FBSyxNQUFNLFFBQVEsa0JBQWtCO0FBQUEsVUFDekMsZ0JBQWdCLEtBQUssTUFBTSxRQUFRLGtCQUFrQjtBQUFBLFVBQ3JELFFBQVEsS0FBSyxNQUFNLFFBQVEsa0JBQWtCO0FBQUEsVUFDN0MsTUFBTTtBQUFBLFVBQ04sTUFBTSxnQ0FBVztBQUFBLFVBQ2pCLFlBQVksS0FBSyxNQUFNLE9BQU8sUUFBUTtBQUFBLFFBQzFDO0FBQUEsUUFDQSxjQUFjO0FBQUEsTUFDbEI7QUFFQSxVQUFJLFdBQXVCLEtBQUs7QUFDaEMsWUFBTSxjQUFjLElBQUksUUFBYyxDQUFDLFlBQWEsV0FBVyxPQUFRO0FBRXZFLFlBQU0sVUFBVSxLQUFLLE1BQU0sS0FBSyxnQkFBZ0IsZUFBZSxLQUFLLE9BQU8sT0FBTyxtQkFBbUIsUUFBUztBQUc5RyxVQUFJLENBQUM7QUFBUyxpQkFBUztBQUV2QixVQUFJLEtBQUssTUFBTTtBQUFhLGFBQUssTUFBTSxNQUFNLCtDQUErQztBQUU1RixZQUFNO0FBR04sWUFBTSxlQUFlO0FBQUEsUUFDakIsa0JBQWtCLGlCQUFpQjtBQUFBLFFBQ25DLGtCQUFrQixpQkFBaUI7QUFBQSxRQUNuQyxrQkFBa0IsaUJBQWlCO0FBQUEsUUFDbkMsa0JBQWtCLGlCQUFpQjtBQUFBLFFBQ25DLGtCQUFrQixpQkFBaUI7QUFBQSxNQUN2QyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLElBQUk7QUFFM0IsWUFBTSxlQUFlLENBQUMsQ0FBQyxrQkFBa0IsYUFBYSxRQUFRLENBQUMsQ0FBQyxLQUFLLE1BQU0sUUFBUSxPQUFPLEtBQUs7QUFDL0YsWUFBTSxtQkFBbUIsQ0FBQyxDQUFDLGtCQUFrQixpQkFBaUIsY0FBYyxDQUFDO0FBRTdFLFVBQUk7QUFFSixZQUFNLFlBQVksd0JBQUMsUUFBZ0IsQ0FBQyxnQ0FBVyxNQUFNLGdDQUFXLFVBQVUsZ0NBQVcsT0FBTyxFQUFFLFNBQVMsR0FBaUIsR0FBdEc7QUFHbEIsVUFBSSxvQkFBb0IsRUFBRSxVQUFVLGtCQUFrQiw0QkFBYSxPQUFPLFVBQVUsV0FBVyxZQUFZLFVBQVUsVUFBVSxPQUFPLElBQUksR0FBRztBQUN6SSxjQUFNLEVBQUUsTUFBTSxPQUFPLElBQUksVUFBVTtBQUNuQyxjQUFNLFlBQVksQ0FBQztBQUVuQixZQUFJLEtBQUssTUFBTTtBQUFhLGVBQUssTUFBTSxNQUFNLGdGQUFnRixZQUFZLFFBQVEsTUFBTSxFQUFFO0FBR3pKLGNBQU0sYUFBYSxTQUFTLGdDQUFXLE9BQ25DLFNBQ0EsU0FBUyxnQ0FBVyxVQUNwQixPQUFPLEtBQUssSUFBVSxZQUFLLFdBQVcsQ0FBQyxJQUN2QyxPQUFPLEtBQUssSUFBVSxZQUFLLFlBQVksQ0FBQztBQUU1QyxZQUFJLFdBQVc7QUFFWCx3QkFBYyxXQUFXO0FBQUEsWUFDckIsSUFBSSx3QkFBWTtBQUFBLGNBQ1osVUFBVTtBQUFBLGNBQ1YsV0FBVztBQUFBLGNBQ1gsTUFBTTtBQUFBLFlBQ1YsQ0FBQztBQUFBLFVBQ0w7QUFDQSw0QkFBa0IsaUJBQWlCLE9BQU8sZ0NBQVc7QUFBQSxRQUN6RCxPQUFPO0FBQ0gsd0JBQWM7QUFDZCw0QkFBa0IsaUJBQWlCLE9BQU8sZ0NBQVc7QUFBQSxRQUN6RDtBQUFBLE1BQ0osT0FBTztBQUlILHNCQUFjLHNCQUFLLDRDQUFMLFdBQ1YsVUFBVSxrQkFBa0IsMkJBQVksT0FBTyxVQUFVLFdBQVcsV0FBVyxVQUFVLFNBQVMsVUFBVSxPQUFPLFFBQ25ILE9BQ0EsUUFBUSxRQUFRLEdBQ2hCO0FBR0osMEJBQWtCLGlCQUFpQixPQUFPLGdDQUFXO0FBQUEsTUFHekQ7QUFFQSxVQUFJLFFBQVEsZ0JBQWdCO0FBQ3hCLFlBQUksS0FBSyxNQUFNO0FBQWEsZUFBSyxNQUFNLE1BQU0sd0ZBQXdGLEtBQUssTUFBTSxRQUFRLGdCQUFnQixLQUFLO0FBQzdLLGtCQUFNLGlCQUFBQyxZQUFRLEtBQUssTUFBTSxRQUFRLGdCQUFnQjtBQUNqRCxZQUFJLEtBQUssTUFBTTtBQUFhLGVBQUssTUFBTSxNQUFNLGdDQUFnQztBQUFBLE1BQ2pGO0FBRUEsVUFBSSxLQUFLLE1BQU07QUFBYSxhQUFLLE1BQU0sTUFBTSxrQ0FBa0MsS0FBSyxVQUFVLG1CQUFtQixNQUFNLENBQUMsQ0FBQyxFQUFFO0FBRTNILFlBQU0sV0FBVyxNQUFNLEtBQUssTUFBTSxXQUFXLGFBQWEsYUFBYSxrQkFBa0IsZ0JBQWdCO0FBRXpHLFdBQUssTUFBTSxpQkFBaUIsQ0FBQyxDQUFDLFFBQVEsY0FBYztBQUVwRCxZQUFNLHNCQUFLLDhCQUFMLFdBQWtCO0FBQUEsSUFDNUIsU0FBUyxHQUFHO0FBQ1IsVUFBSSxLQUFLLE1BQU07QUFBYSxhQUFLLE1BQU0sTUFBTSxzQ0FBc0MsQ0FBQyxFQUFFO0FBQ3RGLFlBQU07QUFBQSxJQUNWO0FBQUEsRUFDSjtBQTZESjtBQTVwQkk7QUFDQTtBQWdtQkE7QUFBQSxXQUFNLGdDQUFDLE9BQWMsT0FBc0I7QUFFdkMsUUFBTSw0REFDRixXQUFXLGNBQWMsMENBQTBDLFFBQVE7QUFBQTtBQUFBLEVBQU8sTUFBTSxTQUFTLEtBQUssS0FBSyxFQUFFLEVBQUU7QUFHbkgsT0FBSyxNQUFNLEtBQUssZ0JBQWdCLFlBQVksS0FBSyxPQUFPLHVDQUFpQywwREFBMEQsT0FBTztBQUMxSixPQUFLLE1BQU0sS0FBSyxnQkFBZ0IsYUFBYSxLQUFLLE9BQU8sMkRBQTJELEtBQUs7QUFDekgsUUFBTSxZQUFZLEtBQUssTUFBTSxPQUFPLFNBQVM7QUFDN0MsTUFBSTtBQUFXLFNBQUssS0FBSyxXQUFXLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFDcEQ7QUFDSixHQVhNO0FBYUE7QUFBQSxpQkFBWSxzQ0FBQyxVQUFnQztBQUMvQyxNQUFJLEtBQUssTUFBTTtBQUFhLFNBQUssTUFBTSxNQUFNLDhCQUE4QjtBQUMzRSxRQUFNLEtBQUssTUFBTSxXQUFZLFdBQVcsUUFBUTtBQUNoRCxNQUFJLEtBQUssTUFBTTtBQUFhLFNBQUssTUFBTSxNQUFNLHNCQUFzQjtBQUN2RSxHQUprQjtBQU1aO0FBQUEseUJBQW9CLHNDQUFDLE9BQWM7QUFDckMsTUFBSSxLQUFLLE1BQU07QUFBYSxTQUFLLE1BQU0sTUFBTSxtREFBbUQsTUFBTSxLQUFLLFVBQVUsTUFBTSxHQUFHLGdDQUFnQztBQUM5SixRQUFNLGFBQWEsTUFBTSxLQUFLLE1BQU0sT0FBTyxXQUFXLElBQUksT0FBTyxjQUFjO0FBQzNFLFFBQUksS0FBSyxNQUFNLE9BQU8sUUFBUSxpQkFBaUIsS0FBSyxDQUFDLFFBQVEsUUFBUSxVQUFVLFVBQVU7QUFBRyxhQUFPO0FBQ25HLFVBQU0sWUFBWSxNQUFNLFVBQVUsU0FBUyxNQUFNLEtBQUssTUFBTSxhQUFhLGNBQWMsUUFBUSxNQUFNLEdBQUcsRUFBRSxJQUFJO0FBQzlHLFFBQUksQ0FBQztBQUFXLGFBQU87QUFDdkIsV0FBTyxNQUFNLFVBQVUsT0FBTyxLQUFLO0FBQUEsRUFDdkMsR0FBRyxLQUFLO0FBQ1IsTUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLFFBQVE7QUFDbkMsUUFBSSxLQUFLLE1BQU07QUFBYSxXQUFLLE1BQU0sTUFBTSwrQ0FBK0MsTUFBTSxLQUFLLFVBQVUsTUFBTSxHQUFHLGdDQUFnQztBQUMxSixXQUFPLGNBQWM7QUFBQSxFQUN6QjtBQUVBLE1BQUksS0FBSyxNQUFNO0FBQ1gsU0FBSyxNQUFNLE1BQU0sdURBQXVELE1BQU0sS0FBSyxVQUFVLE1BQU0sR0FBRyxrQkFBa0IsV0FBVyxXQUFXLGNBQWMsS0FBSyxHQUFHO0FBRXhLLFNBQU87QUFDWCxHQWpCMEI7QUFtQjFCO0FBQUEsd0JBQW1CLGdDQUFDLFFBQTJCLE9BQWMsT0FBTyxHQUFHLFNBQWtCQyxPQUFnQjtBQUNyRyxRQUFNLGVBQWUsS0FBSyxNQUFNLFFBQVEsT0FDbkMsYUFBYSxRQUFRO0FBQUEsSUFDbEIsYUFBYSxLQUFLLE1BQU0sUUFBUSxPQUFPO0FBQUEsSUFDdkMsTUFBTSxPQUFPO0FBQUEsSUFDYixLQUFLQSxRQUFPLFNBQVM7QUFBQSxJQUNyQjtBQUFBLElBQ0EsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLE1BQU0sT0FBTyxRQUFRO0FBQUEsRUFDakQsQ0FBQyxFQUNBLEdBQUcsU0FBUyxDQUFDLFFBQVE7QUFDbEIsVUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLFlBQVk7QUFFL0IsUUFBSSxLQUFLLE1BQU07QUFBYSxXQUFLLE1BQU0sTUFBTSxxREFBcUQsSUFBSSxTQUFTLElBQUksV0FBVyxHQUFHLEVBQUU7QUFFbkksUUFBSSxFQUFFLFNBQVMsaUJBQWlCLEtBQUssRUFBRSxTQUFTLE9BQU87QUFBRztBQUUxRCxTQUFLLE1BQU0sS0FBSyxnQkFBZ0IsYUFBYSxLQUFLLE9BQU8sS0FBSyxLQUFLO0FBQUEsRUFDdkUsQ0FBQztBQUVMLFNBQU87QUFDWCxHQXBCbUI7QUF4b0IyQjtBQUEzQyxJQUFNLHVCQUFOOzs7QUcxQ1AsSUFBQUMsb0JBQW9FOzs7QUNIcEUsSUFBQUMsU0FBdUI7QUFDdkIsb0JBQXVCO0FBV3ZCLElBQU0sb0JBQW9CLHdCQUFDLFNBQVMsVUFBVyxTQUE2RCxnQkFBUyxVQUFnQixnQkFBUyxzQkFBcEg7QUFFbkIsU0FBUyxtQkFBbUIsUUFBZ0IsS0FBYyxTQUFrQjtBQUMvRSxRQUFNLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBRyxPQUFPLFFBQVEsV0FBVyxNQUFNLE9BQU87QUFBQSxFQUM5QztBQUVBLE1BQUksUUFBUSxRQUFRO0FBQ2hCLFNBQUssS0FBSyxXQUFXLFNBQVM7QUFBQSxFQUNsQztBQUVBLE1BQUksT0FBTyxZQUFZLFVBQVU7QUFFN0IsU0FBSyxLQUFLLFlBQVksUUFBUSxXQUFXLEdBQUcsSUFBSSxVQUFVLElBQUksT0FBTyxHQUFHO0FBQUEsRUFDNUU7QUFFQSxTQUFPO0FBQ1g7QUFoQ2dCO0FBa0NULFNBQVMsa0JBQWtCLEtBQWM7QUFFNUMsUUFBTSxPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxHQUFHLE9BQU8sUUFBUSxXQUFXLE1BQU0sT0FBTztBQUFBLEVBQzlDO0FBRUEsTUFBSSxRQUFRLFFBQVE7QUFDaEIsU0FBSyxLQUFLLFdBQVcsU0FBUztBQUFBLEVBQ2xDO0FBRUEsU0FBTztBQUNYO0FBcEJnQjtBQTJCVCxTQUFTLG1CQUFtQixRQUFvQyxTQUErQjtBQUNsRyxNQUFJLFNBQVMsUUFBUSxPQUFPLFdBQVc7QUFBVSxXQUFPO0FBQ3hELHdCQUFZLENBQUM7QUFDYixRQUFNLE9BQU8sT0FBTyxXQUFXLFdBQVcsbUJBQW1CLFFBQVEsUUFBUSxLQUFLLFFBQVEsT0FBTyxJQUFJLGtCQUFrQixRQUFRLEdBQUc7QUFFbEksTUFBSSxDQUFDLE9BQU8sTUFBTSxRQUFRLElBQUk7QUFBRyxTQUFLLFFBQVEsT0FBTyxPQUFPLFFBQVEsSUFBSSxDQUFDO0FBQ3pFLE1BQUksTUFBTSxRQUFRLFFBQVEsV0FBVztBQUFHLFNBQUssS0FBSyxHQUFHLFFBQVEsV0FBVztBQUV4RSxRQUFNLFNBQVMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLGVBQWU7QUFFMUQsUUFBTSxhQUFhLElBQUksT0FBTyxFQUFFLE9BQU8sT0FBTyxLQUFLLENBQUM7QUFFcEQsYUFBVyxHQUFHLFNBQVMsTUFBTSxXQUFXLFFBQVEsQ0FBQztBQUVqRCxNQUFJLE9BQU8sV0FBVyxVQUFVO0FBQzVCLFdBQU8sR0FBRyxTQUFTLE1BQU0sV0FBVyxRQUFRLENBQUM7QUFDN0MsV0FBTyxLQUFLLFVBQVU7QUFBQSxFQUMxQjtBQUVBLFNBQU87QUFDWDtBQXBCZ0I7OztBRGxFaEIsSUFBTSxZQUFZLHdCQUFDLFFBQWtCO0FBQ2pDLFNBQU8sTUFBTTtBQUFBLElBQ1Q7QUFBQSxNQUNJLFFBQVEsNEJBQVU7QUFBQSxJQUN0QjtBQUFBLElBQ0EsQ0FBQyxHQUFHLE9BQU87QUFBQSxNQUNQLE1BQU07QUFBQSxNQUNOLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSztBQUFBLElBQ2pDO0FBQUEsRUFDSjtBQUNKLEdBVmtCO0FBaUNYLElBQU0sK0JBQW1ELE9BQU8sT0FBTztBQUFBLEVBQzFFLE1BQU0sVUFBVSxDQUFDLENBQUM7QUFBQSxFQUNsQixXQUFXLFVBQVUsQ0FBQyxhQUFjLGFBQWMsYUFBYyxhQUFjLGFBQWMsYUFBYyxNQUFNLE1BQU0sTUFBTSxJQUFJLENBQUM7QUFBQSxFQUNqSSxNQUFNLFVBQVUsQ0FBQyxhQUFjLGFBQWMsR0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLGFBQWMsYUFBYyxXQUFZLENBQUM7QUFBQSxFQUMvRyxPQUFPLFVBQVUsQ0FBQyxLQUFLLEtBQUssS0FBSyxhQUFjLGFBQWMsTUFBTSxNQUFNLE1BQU0sYUFBYyxXQUFZLENBQUM7QUFBQSxFQUMxRyxVQUFVLFVBQVUsQ0FBQyxJQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssSUFBTSxJQUFNLE9BQU8sT0FBTyxLQUFLLENBQUM7QUFBQSxFQUMvRSxnQkFBZ0IsVUFBVSxDQUFDLEtBQUssS0FBSyxhQUFjLE1BQU0sTUFBTSxLQUFLLEdBQUssTUFBTSxJQUFNLEVBQUksQ0FBQztBQUFBLEVBQzFGLFlBQVksVUFBVSxDQUFDLE1BQU0sTUFBTSxNQUFNLElBQU0sS0FBSyxNQUFNLElBQU0sSUFBTSxJQUFNLElBQUksQ0FBQztBQUFBLEVBQ2pGLFlBQVksVUFBVSxDQUFDLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLEtBQUssS0FBSyxNQUFNLElBQUksQ0FBQztBQUFBLEVBQzdFLFdBQVcsVUFBVSxDQUFDLE1BQU0sTUFBTSxLQUFLLEtBQUssYUFBYyxNQUFNLE1BQU0sTUFBTSxhQUFjLFdBQVksQ0FBQztBQUFBLEVBQ3ZHLE1BQU0sVUFBVSxDQUFDLE1BQU0sYUFBYyxHQUFLLEtBQUssS0FBSyxLQUFLLEdBQUssS0FBSyxLQUFLLEdBQUcsQ0FBQztBQUFBLEVBQzVFLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxhQUFjLGFBQWMsYUFBYyxhQUFjLGFBQWMsYUFBYyxLQUFLLEdBQUcsQ0FBQztBQUFBLEVBQ3pILEtBQUssVUFBVSxDQUFDLE1BQU0sS0FBSyxLQUFLLEdBQUssS0FBSyxhQUFjLE1BQU0sTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLEVBQy9FLFFBQVEsVUFBVSxDQUFDLGFBQWMsYUFBYyxhQUFjLE1BQU0sYUFBYyxLQUFLLEtBQUssYUFBYyxhQUFjLFdBQVksQ0FBQztBQUFBLEVBQ3BJLE1BQU0sVUFBVSxDQUFDLEdBQUssS0FBSyxNQUFNLElBQU0sTUFBTSxHQUFLLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLEVBQ3hFLEtBQUssVUFBVSxDQUFDLE1BQU0sTUFBTSxJQUFNLGFBQWMsR0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBLEVBQzlFLE1BQU0sVUFBVSxDQUFDLEtBQUssS0FBSyxhQUFjLE1BQU0sYUFBYyxHQUFLLEdBQUssS0FBSyxNQUFNLEVBQUksQ0FBQztBQUFBLEVBQ3ZGLFVBQVUsVUFBVSxDQUFDLEdBQUssR0FBSyxLQUFLLGFBQWMsSUFBTSxNQUFNLE1BQU0sYUFBYyxLQUFLLEdBQUcsQ0FBQztBQUFBLEVBQzNGLFFBQVEsVUFBVSxDQUFDLEdBQUssS0FBSyxhQUFjLE1BQU0sTUFBTSxhQUFjLEdBQUssS0FBSyxLQUFLLEdBQUcsQ0FBQztBQUM1RixDQUFDO0FBOUREO0FBZ0VPLElBQU0sa0JBQU4sTUFBTSxnQkFBK0I7QUFBQSxFQUdqQyxZQUFtQixJQUFrQztBQUFsQztBQVMxQjtBQVhBLHVDQUE0QixDQUFDO0FBQzdCLG1DQUF1QixDQUFDO0FBQUEsRUFDcUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUs3RCxJQUFXLFlBQVk7QUFDbkIsV0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU0sT0FBTyxRQUFRO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW9CTyxhQUFhLE1BQWdCO0FBQ2hDLFFBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxRQUFRLE9BQU8sUUFBUSxRQUFRO0FBQUcsWUFBTSxXQUFXLHFCQUFxQixRQUFRLGlCQUFpQixpQkFBaUI7QUFDbkksdUJBQUssWUFBYTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFlBQVk7QUFDbkIsV0FBTyxtQkFBSztBQUFBLEVBQ2hCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLGNBQWM7QUFDckIsUUFBSSxDQUFDLEtBQUssUUFBUTtBQUFRLGFBQU8sQ0FBQztBQUVsQyxXQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQ2xDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLE9BQU87QUFDZCxXQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssV0FBVztBQUFBLEVBQ2pEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sYUFBYSxRQUEyQixTQUE4QjtBQUN6RSxRQUFJLG1CQUFLLFlBQVc7QUFBUSxjQUFRLGNBQWMsQ0FBQyxHQUFHLG1CQUFLLGFBQVksR0FBSSxRQUFRLGVBQWUsQ0FBQyxDQUFFO0FBQ3JHLFdBQU8sbUJBQW1CLFFBQVEsT0FBTztBQUFBLEVBQzdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFdBQVcsU0FBeUQ7QUFDdkUsUUFBSSxXQUFzQixDQUFDO0FBQzNCLFFBQUksT0FBTyxZQUFZLFdBQVc7QUFDOUIsaUJBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSyxPQUFPLEtBQUssYUFBYSxPQUFPO0FBQUEsSUFDaEUsV0FBVyxNQUFNLFFBQVEsT0FBTyxHQUFHO0FBQy9CLGlCQUFXO0FBQUEsSUFDZixPQUFPO0FBQ0gsaUJBQVcsT0FBTyxRQUFRLE9BQU8sRUFDNUIsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUMvQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUFBLElBQ3hCO0FBRUEsV0FBTyxzQkFBSyw0QkFBTCxXQUFpQjtBQUFBLEVBQzVCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFVBQVU7QUFDakIsV0FBTyxtQkFBSztBQUFBLEVBQ2hCO0FBQUEsRUFFQSxJQUFXLFFBQVEsU0FBb0I7QUFDbkMsU0FBSyxXQUFXLE9BQU87QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxPQUFPLFNBQThCO0FBQ3hDLFFBQUksQ0FBQyxNQUFNLFFBQVEsT0FBTztBQUFHLGdCQUFVLENBQUMsT0FBTztBQUMvQyxVQUFNLFFBQW1CLENBQUM7QUFFMUIsWUFBUSxRQUFRLENBQUMsTUFBTTtBQUNuQixVQUFJLEtBQUssUUFBUSxTQUFTLENBQUM7QUFBRztBQUM5QixZQUFNLEtBQUssQ0FBQztBQUFBLElBQ2hCLENBQUM7QUFFRCxXQUFPLHNCQUFLLDRCQUFMLFdBQWlCLG1CQUFLLGdCQUFlLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSztBQUFBLEVBQ2hHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFlBQVksSUFBZTtBQUM5Qix1QkFBSyxnQkFBaUI7QUFBQSxFQUMxQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sb0JBQW9CO0FBQ3ZCLFdBQU8sbUJBQUs7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08scUJBQXFCO0FBQ3hCLFdBQU8sYUFBYSxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQUssZ0JBQWUsU0FBUyxDQUFDLENBQUM7QUFBQSxFQUM1RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxVQUE2QixRQUFvQjtBQUNwRCxXQUFPLG1CQUFLLGdCQUFlLFNBQVMsTUFBTTtBQUFBLEVBQzlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFdBQThCLFFBQW9CO0FBQ3JELFdBQU8sQ0FBQyxLQUFLLFVBQVUsTUFBTTtBQUFBLEVBQ2pDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGNBQWMsUUFBdUM7QUFDeEQsV0FBTyxhQUFhLElBQUksTUFBaUI7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sVUFBVTtBQUNiLFdBQU8sS0FBSyxRQUFRLElBQUksQ0FBQyxXQUFXLGFBQWEsSUFBSSxNQUFNLENBQUM7QUFBQSxFQUNoRTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sU0FBUztBQUNaLFVBQU0sTUFBTSxDQUFDO0FBRWIsU0FBSyxRQUFRLFFBQVEsQ0FBQyxXQUFZLElBQUksTUFBTSxJQUFJLGFBQWEsSUFBSSxNQUFNLENBQUU7QUFFekUsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFdBQVc7QUFDZCxXQUFPLGFBQWEsT0FBTyxLQUFLLE9BQU87QUFBQSxFQUMzQztBQUNKO0FBdkxJO0FBQ0E7QUFVQTtBQUFBLGdCQUFXLGdDQUFDLFNBQW9CO0FBQzVCLFFBQU0sRUFBRSxNQUFNLElBQUksS0FBSztBQUV2QixNQUFJLFFBQVEsTUFBTSxDQUFDLE1BQU0sbUJBQUssZ0JBQWUsU0FBUyxDQUFDLENBQUMsS0FBSyxtQkFBSyxnQkFBZSxNQUFNLENBQUMsTUFBTSxRQUFRLFNBQVMsQ0FBQyxDQUFDO0FBQUcsV0FBTyxRQUFRLFFBQVEsS0FBSztBQUNoSixRQUFNLGdCQUFnQixLQUFLLFFBQVEsS0FBSyxDQUFDLE9BQU8sT0FBTyxlQUFlLE9BQU8sV0FBVyxLQUFLLENBQUMsUUFBUSxLQUFLLENBQUMsT0FBTyxPQUFPLGVBQWUsT0FBTyxXQUFXO0FBQzNKLFFBQU0sV0FBVyxNQUFNLEtBQUssYUFBYSxhQUFhLEdBQUcsUUFBUSxTQUFTO0FBQzFFLFFBQU0sT0FBTyxtQkFBSyxnQkFBZSxNQUFNO0FBQ3ZDLHFCQUFLLGdCQUFpQixDQUFDLEdBQUcsSUFBSSxJQUFJLE9BQU8sQ0FBQztBQUUxQyxTQUFPLEtBQUssR0FBRyxjQUFjLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTTtBQUMvQyxVQUFNLEtBQUssZ0JBQWdCLG9CQUFvQixPQUFPLE1BQU0sbUJBQUssZ0JBQWUsTUFBTSxDQUFDO0FBQ3ZGLFdBQU87QUFBQSxFQUNYLENBQUM7QUFDTCxHQWJXO0FBWjZCO0FBQXJDLElBQU0saUJBQU47QUFrTUEsSUFBTSwwQkFBTixNQUFNLHdCQUF1QztBQUFBLEVBV3pDLFlBQW1CLE9BQXlCO0FBQXpCO0FBVjFCLFNBQU8sUUFBUSxJQUFJLGFBQW1CLElBQUk7QUFDMUMsU0FBTyxTQUFTLElBQUksZUFBcUIsSUFBSTtBQUM3QyxTQUFPLG1CQUFtQjtBQUMxQixTQUFPLG9CQUE2QztBQUFBLE1BQ2hELFFBQVE7QUFBQSxNQUNSLFdBQVcsQ0FBQztBQUFBLE1BQ1osU0FBUyxDQUFDO0FBQUEsTUFDVixRQUFRO0FBQUEsTUFDUixZQUFZO0FBQUEsSUFDaEI7QUFFSSxRQUFJLE9BQU8sS0FBSyxNQUFNLFFBQVEsV0FBVyxVQUFVO0FBQy9DLFdBQUssa0JBQWtCLFNBQVMsS0FBSyxNQUFNLFFBQVE7QUFBQSxJQUN2RDtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFtQkEsSUFBVyxTQUFTO0FBQ2hCLFdBQU8sS0FBSyxNQUFNLFlBQVksS0FBSyxVQUFVO0FBQUEsRUFDakQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsWUFBWTtBQUNuQixXQUFPLEtBQUssTUFBTSxZQUFZLGFBQWE7QUFBQSxFQUMvQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxTQUFTO0FBQ2hCLFdBQU8sS0FBSyxNQUFNLFlBQVksVUFBVTtBQUFBLEVBQzVDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFVBQVU7QUFDakIsV0FBTyxLQUFLLE1BQU0sWUFBWSxXQUFXO0FBQUEsRUFDN0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsWUFBWTtBQUNuQixXQUFPLEtBQUssTUFBTSxZQUFZLGFBQWE7QUFBQSxFQUMvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxNQUFhLGNBQWMsT0FBTyxHQUFHO0FBQ2pDLFFBQUksQ0FBQyxLQUFLLE1BQU07QUFBYyxhQUFPO0FBQ3JDLFVBQU0sUUFBUSxLQUFLLE1BQU0sS0FBSyxXQUFXLFFBQVE7QUFDakQsUUFBSTtBQUNBLFlBQU0sTUFBTSxRQUFRO0FBQ3BCLFlBQU0sS0FBSyxNQUFNLEtBQUssS0FBSyxLQUFLLE1BQU0sY0FBYztBQUFBLFFBQ2hELE9BQU87QUFBQSxRQUNQO0FBQUEsUUFDQSxnQkFBZ0I7QUFBQSxNQUNwQixDQUFDO0FBQ0QsV0FBSyxNQUFNLEtBQUssV0FBVyxRQUFRO0FBQ25DLGFBQU87QUFBQSxJQUNYLFFBQVE7QUFDSixXQUFLLE1BQU0sS0FBSyxXQUFXLFFBQVE7QUFDbkMsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBQ0o7QUF2Rm9EO0FBQTdDLElBQU0seUJBQU47QUF5RkEsSUFBTSxnQkFBTixNQUFNLGNBQTZCO0FBQUEsRUFDL0IsWUFBbUIsSUFBa0M7QUFBbEM7QUFBQSxFQUFtQztBQUFBLEVBRTdELElBQVcsU0FBUztBQUNoQixXQUFPLEtBQUssR0FBRyxRQUFRLFdBQVcsQ0FBQztBQUFBLEVBQ3ZDO0FBQUEsRUFFQSxJQUFXLFlBQVk7QUFDbkIsWUFBUSxLQUFLLEdBQUcsV0FBVyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLE9BQU87QUFBQSxNQUM3RCxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsSUFDVixFQUFFO0FBQUEsRUFDTjtBQUFBLEVBRUEsSUFBVyxTQUFTO0FBQ2hCLFdBQVEsS0FBSyxHQUFHLFFBQVEsY0FBYyxLQUErQztBQUFBLEVBQ3pGO0FBQUEsRUFFQSxJQUFXLFVBQVU7QUFDakIsV0FBTyxLQUFLLEdBQUcsU0FBUyxXQUFXLENBQUM7QUFBQSxFQUN4QztBQUFBLEVBRUEsSUFBVyxTQUFTO0FBQ2hCLFdBQU8sS0FBSyxHQUFHO0FBQUEsRUFDbkI7QUFBQSxFQUVBLElBQVcsWUFBWTtBQUNuQixXQUFPLEtBQUssR0FBRztBQUFBLEVBQ25CO0FBQUEsRUFFTyxPQUFvQjtBQUN2QixXQUFPO0FBQUEsTUFDSCxRQUFRLEtBQUs7QUFBQSxNQUNiLFdBQVcsS0FBSztBQUFBLE1BQ2hCLFFBQVEsS0FBSztBQUFBLE1BQ2IsU0FBUyxLQUFLO0FBQUEsTUFDZCxZQUFZLEtBQUssV0FBVyxvQkFBb0IsS0FBSyxXQUFXLGNBQWM7QUFBQSxNQUM5RSxRQUFRLEtBQUssUUFBUSxVQUFVO0FBQUEsSUFDbkM7QUFBQSxFQUNKO0FBQ0o7QUF4QzBDO0FBQW5DLElBQU0sZUFBTjs7O0FQN1VQLG9CQUEyQjs7O0FTVXBCLElBQU0sd0JBQU4sTUFBTSxzQkFBcUM7QUFBQSxFQUN2QyxZQUFtQixPQUF5QjtBQUF6QjtBQUFBLEVBQTBCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLN0MsV0FBVztBQUNkLFdBQU87QUFBQSxNQUNILFNBQVM7QUFBQSxRQUNMLFdBQVcsS0FBSyxNQUFNLE9BQU87QUFBQSxRQUM3QixpQkFBaUIsS0FBSyxNQUFNO0FBQUEsTUFDaEM7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNKLFdBQVcsS0FBSyxNQUFNLEtBQUssWUFBWTtBQUFBLFFBQ3ZDLFNBQVMsS0FBSyxNQUFNLEtBQUssVUFBVTtBQUFBLFFBQ25DLFFBQVEsS0FBSyxNQUFNLEtBQUssU0FBUztBQUFBLFFBQ2pDLE1BQU0sS0FBSyxNQUFNLEtBQUssT0FBTztBQUFBLE1BQ2pDO0FBQUEsTUFDQSxhQUFhLEtBQUssTUFBTSxPQUFPO0FBQUEsTUFDL0IsYUFBYSxLQUFLLE1BQU0sUUFBUSxPQUFPO0FBQUEsTUFDdkMsWUFBWSxLQUFLLE1BQU0sT0FBTyxXQUFXO0FBQUEsTUFDekMsV0FBVyxLQUFLLE1BQU0sTUFBTSxRQUFRLElBQUksTUFBTSxTQUFTLFFBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssR0FBRyxFQUFFLFFBQVE7QUFBQSxNQUNsRyxhQUFhLFFBQVEsWUFBWTtBQUFBLE1BQ2pDLFVBQVU7QUFBQSxRQUNOLE1BQU0sUUFBUTtBQUFBLFFBQ2QsUUFBUTtBQUFBLE1BQ1o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNKO0FBN0JrRDtBQUEzQyxJQUFNLHVCQUFOOzs7QVRnREEsSUFBTSxrQkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUkzQixlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZixnQkFBZ0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUloQixrQkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlsQixtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUluQixZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWixxQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlyQixZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJUCxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJUCxjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZCxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWixhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJYixhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJYixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZCxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWixlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZixrQkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlsQixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZCxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJYixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZCxxQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlyQixpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlqQixXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJWCxvQkFBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlwQixlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJZixpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlqQixhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJYixhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJYixjQUFjO0FBQ2xCO0FBRU8sSUFBSyxrQkFBTCxrQkFBS0MscUJBQUw7QUFDSCxFQUFBQSxpQkFBQSxjQUFXO0FBQ1gsRUFBQUEsaUJBQUEsWUFBUztBQUNULEVBQUFBLGlCQUFBLHlCQUFzQjtBQUN0QixFQUFBQSxpQkFBQSxVQUFPO0FBQ1AsRUFBQUEsaUJBQUEsWUFBUztBQUNULEVBQUFBLGlCQUFBLGlCQUFjO0FBTk4sU0FBQUE7QUFBQSxHQUFBO0FBL0xaO0FBOFhPLElBQU0sY0FBTixNQUFNLFlBQTJCO0FBQUEsRUFvQjdCLFlBQW1CLFFBQXVCLFNBQThCO0FBQXJEO0FBQXVCO0FBdWdCakQ7QUFxQ0E7QUFJQTtBQWlCQTtBQWtCQTtBQStDQTtBQVdBLHVCQUFNO0FBaHFCTix1Q0FBaUI7QUFDakIsaUNBQVc7QUFDWCxpQ0FBVztBQUNYLFNBQVEsWUFBMEI7QUFFbEMsU0FBTyxVQUFVLElBQUksa0JBQXdCLElBQUk7QUFDakQsU0FBTyxhQUFzQztBQUM3QyxTQUFPLE9BQU8sSUFBSSxxQkFBMkIsSUFBSTtBQUNqRCxTQUFPLFVBQVUsSUFBSSx1QkFBNkIsSUFBSTtBQUN0RCxTQUFPLHVCQUFvRCxtQ0FBWSxNQUFaO0FBQzNELFNBQU8sc0JBQWtELDhCQUFPLFlBQVk7QUFBQSxNQUN4RTtBQUFBLE1BQ0EsTUFBTSxnQ0FBVztBQUFBLElBQ3JCLElBSHlEO0FBSXpELFNBQU87QUFDUCxTQUFPLFdBQVcsSUFBSSx5QkFBbUM7QUFDekQsU0FBTyxRQUFRLElBQUkscUJBQTJCLElBQUk7QUFDbEQsU0FBTyxhQUFhLElBQUksV0FBVztBQUcvQixTQUFLLFNBQVMsSUFBSSxvQkFBYSxRQUFRLGFBQWE7QUFDcEQsUUFBSSxTQUFTLFdBQVcsUUFBUSxvQkFBb0I7QUFBRyxXQUFLLHVCQUF1QixRQUFRO0FBQzNGLFFBQUksU0FBUyxXQUFXLFFBQVEsbUJBQW1CO0FBQUcsV0FBSyxzQkFBc0IsUUFBUTtBQUN6RixRQUFJLENBQUMsU0FBUyxVQUFVLFFBQVEsVUFBVTtBQUFHLFdBQUssYUFBYSxRQUFRO0FBRXZFLFlBQVEsYUFBUixRQUFRLFdBQWE7QUFDckIsWUFBUSxZQUFSLFFBQVEsVUFBWTtBQUNwQixZQUFRLG1CQUFSLFFBQVEsaUJBQW1CO0FBQzNCLFlBQVEsaUJBQVIsUUFBUSxlQUFpQjtBQUV6QixRQUFJLENBQUMsU0FBUyxVQUFVLEtBQUssUUFBUSxNQUFNLEtBQUssQ0FBQyxTQUFTLFVBQVUsS0FBSyxRQUFRLE1BQU0sR0FBRztBQUN0RixXQUFLLFFBQVEsa0JBQWtCLFNBQVMsS0FBSyxRQUFRO0FBQUEsSUFDekQ7QUFFQSxRQUFJLE1BQU0sUUFBUSxLQUFLLFFBQVEsU0FBUyxHQUFHO0FBQ3ZDLFdBQUssUUFBUSxrQkFBa0IsWUFBWSxLQUFLLFFBQVE7QUFBQSxJQUM1RDtBQUVBLFFBQUksTUFBTSxRQUFRLEtBQUssUUFBUSxRQUFRLEdBQUc7QUFDdEMsV0FBSyxRQUFRLGtCQUFrQixVQUFVLEtBQUssUUFBUTtBQUFBLElBQzFEO0FBRUEsUUFBSSxTQUFTLFNBQVMsS0FBSyxRQUFRLFNBQVMsR0FBRztBQUMzQyxXQUFLLFFBQVEsa0JBQWtCLGFBQWEsS0FBSyxRQUFRO0FBQUEsSUFDN0Q7QUFFQSxRQUFJLFNBQVMsUUFBUSxLQUFLLFFBQVEsYUFBYSxHQUFHO0FBQzlDLFdBQUssUUFBUSxPQUFPLFlBQVksS0FBSyxRQUFRLGFBQWE7QUFBQSxJQUM5RDtBQUVBLFFBQUksQ0FBQyxTQUFTLFNBQVMsUUFBUSxPQUFPLEdBQUc7QUFDckMsWUFBTSxXQUFXLHFCQUFxQiwyQkFBMkIsVUFBVSxPQUFPLFFBQVEsT0FBTztBQUFBLElBQ3JHO0FBRUEsUUFBSSxDQUFDLFNBQVMsU0FBUyxRQUFRLGNBQWMsR0FBRztBQUM1QyxZQUFNLFdBQVcscUJBQXFCLGtDQUFrQyxVQUFVLE9BQU8sUUFBUSxjQUFjO0FBQUEsSUFDbkg7QUFFQSxRQUFJLFFBQVEsVUFBVTtBQUFHLGNBQVEsVUFBVTtBQUMzQyxRQUFJLFFBQVEsaUJBQWlCO0FBQUcsY0FBUSxpQkFBaUI7QUFFekQsUUFBSSxLQUFLO0FBQWEsV0FBSyxNQUFNLG9DQUFvQyxLQUFLLFFBQVEsTUFBTSxJQUFJLFNBQVMsS0FBSyxRQUFRLE1BQU0sRUFBRSxHQUFHO0FBQzdILFNBQUssS0FBSyxnQkFBZ0IsYUFBYSxJQUFJO0FBQUEsRUFDL0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsb0JBQW9CO0FBQzNCLFdBQU8sS0FBSyxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxJQUFJLEVBQUUsWUFBWSxDQUFDO0FBQUEsRUFDakU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsb0JBQW9CO0FBQzNCLFdBQU8sS0FBSyxjQUFjLEtBQUssUUFBUSxLQUFLLGlCQUFpQixDQUFDO0FBQUEsRUFDbEU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsZ0JBQWdCO0FBQ3ZCLFdBQU8sS0FBSyxZQUFZLFlBQVk7QUFBQSxFQUN4QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxNQUFNLEdBQVc7QUFDcEIsU0FBSyxLQUFLLGdCQUFnQixPQUFPLE1BQU0sQ0FBQztBQUFBLEVBQzVDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLFdBQVc7QUFDbEIsV0FBTyxLQUFLLFFBQVE7QUFBQSxFQUN4QjtBQUFBLEVBRUEsSUFBVyxTQUFTLEdBQVM7QUFDekIsU0FBSyxRQUFRLFdBQVc7QUFBQSxFQUM1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxZQUFZLEdBQVM7QUFDeEIsU0FBSyxRQUFRLFdBQVc7QUFBQSxFQUM1QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxlQUFlO0FBQ3RCLFdBQU8sS0FBSyxZQUFZLGVBQWUsWUFBWSxLQUFLO0FBQUEsRUFDNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsVUFBVTtBQUNqQixXQUFPLG1CQUFLO0FBQUEsRUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsVUFBVTtBQUNqQixXQUFPLEtBQUssWUFBWSxXQUFXO0FBQUEsRUFDdkM7QUFBQSxFQUVBLElBQVcsUUFBUSxHQUE2QjtBQUM1QyxRQUFJLEtBQUssWUFBWTtBQUNqQixVQUFJLEdBQUc7QUFDSCxhQUFLLFdBQVcsVUFBVTtBQUFBLE1BQzlCLE9BQU87QUFDSCxhQUFLLE9BQU87QUFBQSxNQUNoQjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLGFBQWE7QUFDcEIsV0FBTyxLQUFLLFlBQVksbUJBQW1CO0FBQUEsRUFDL0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsUUFBUTtBQUNmLFdBQU8sS0FBSyxRQUFRO0FBQUEsRUFDeEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsS0FBSztBQUNaLFdBQU8sS0FBSyxNQUFNO0FBQUEsRUFDdEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8saUJBQWlCLE9BQWdCO0FBQ3BDLHVCQUFLLGdCQUFpQjtBQUFBLEVBQzFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxrQkFBa0I7QUFDckIsV0FBTyxtQkFBSztBQUFBLEVBQ2hCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLGNBQWMsTUFBdUI7QUFDeEMsU0FBSyxhQUFhO0FBQUEsRUFDdEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsVUFBVTtBQUNqQixXQUFPLEtBQUssUUFBUSxXQUFXO0FBQUEsRUFDbkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLGFBQWE7QUFDaEIsV0FBTyxLQUFLO0FBQUEsRUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsT0FBTztBQUNkLFdBQU8sS0FBSyxPQUFPO0FBQUEsRUFDdkI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQVU7QUFDYixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsSUFBVyxpQkFBaUI7QUFDeEIsV0FBTyxLQUFLLFFBQVEsa0JBQWtCO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLG9CQUFvQjtBQUN2QixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxrQkFBa0IsTUFBYztBQUNuQyxRQUFJLENBQUMsU0FBUyxTQUFTLElBQUksR0FBRztBQUMxQixZQUFNLFdBQVcscUJBQXFCLFFBQVEsVUFBVSxPQUFPLElBQUk7QUFBQSxJQUN2RTtBQUVBLFFBQUksT0FBTztBQUFHLGFBQU87QUFFckIsU0FBSyxRQUFRLGlCQUFpQjtBQUFBLEVBQ2xDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFdBQVcsTUFBYztBQUM1QixRQUFJLENBQUMsU0FBUyxTQUFTLElBQUksR0FBRztBQUMxQixZQUFNLFdBQVcscUJBQXFCLFFBQVEsVUFBVSxPQUFPLElBQUk7QUFBQSxJQUN2RTtBQUVBLFFBQUksT0FBTztBQUFHLGFBQU87QUFFckIsU0FBSyxRQUFRLFVBQVU7QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sUUFBUTtBQUNYLFNBQUssT0FBTyxNQUFNO0FBQ2xCLFNBQUssUUFBUSxNQUFNO0FBQUEsRUFDdkI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQVU7QUFDYixXQUFPLEtBQUssT0FBTyxPQUFPO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFNBQVM7QUFDWixXQUFPLEtBQUssT0FBTyxRQUFRLEtBQUs7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sY0FBYztBQUNqQixRQUFJLEtBQUssT0FBTztBQUFHLGFBQU87QUFDMUIsVUFBTSxNQUFNLEtBQUssVUFBVSxLQUFLO0FBQ2hDLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxZQUFZO0FBQ2YsV0FBTyxLQUFLLFlBQVksaUJBQWlCLFFBQVEsQ0FBQyxLQUFLLFdBQVcsY0FBYztBQUFBLEVBQ3BGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFNBQVMsT0FBbUM7QUFDL0MsVUFBTSxRQUFRLGlCQUFpQixXQUFXLE1BQU0sU0FBUztBQUN6RCxVQUFNLFVBQVUsTUFBTSxRQUFRLEtBQUs7QUFFbkMsdUJBQW1CLE1BQU0sS0FBSztBQUU5QixTQUFLLE9BQU8sSUFBSSxLQUFLO0FBRXJCLFFBQUksU0FBUztBQUNULFdBQUssS0FBSyxnQkFBZ0IsZ0JBQWdCLE1BQU0sS0FBSztBQUFBLElBQ3pELE9BQU87QUFDSCxXQUFLLEtBQUssZ0JBQWdCLGVBQWUsTUFBTSxLQUFLO0FBQUEsSUFDeEQ7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFlBQVksT0FBd0I7QUFDdkMsV0FBTyxLQUFLLEtBQUssT0FBTyxLQUFLO0FBQUEsRUFDakM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxZQUFZLE9BQWMsUUFBUSxHQUFTO0FBQzlDLFdBQU8sS0FBSyxLQUFLLE9BQU8sT0FBTyxLQUFLO0FBQUEsRUFDeEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxVQUFVLE9BQXdCLFFBQVEsR0FBUztBQUN0RCxXQUFPLEtBQUssS0FBSyxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQ3RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sVUFBVSxPQUF3QixRQUFRLEdBQVM7QUFDdEQsV0FBTyxLQUFLLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFBQSxFQUN0QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFdBQVcsS0FBc0IsTUFBNkI7QUFDakUsV0FBTyxLQUFLLEtBQUssS0FBSyxLQUFLLElBQUk7QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxpQkFBaUIsWUFBNkIsVUFBK0QsQ0FBQyxHQUFHO0FBQ3BILFFBQUksV0FBVyxNQUFNLFdBQVcsMkNBQXNCLFdBQVc7QUFDN0QsWUFBTSxXQUFXLCtCQUErQjtBQUFBLElBQ3BEO0FBRUEsVUFBTSxVQUFVLEtBQUssT0FBTyxPQUFPLFNBQVMsTUFBTSxJQUFJLFdBQVcsV0FBVyxTQUFVO0FBQ3RGLFFBQUksQ0FBQztBQUFTLFlBQU0sV0FBVyxxQkFBcUI7QUFDcEQsUUFBSSxDQUFDLFFBQVEsYUFBYTtBQUFHLFlBQU0sV0FBVyxxQkFBcUIsV0FBVywyQkFBMkIsNEJBQVksVUFBVSxJQUFJLDRCQUFZLGVBQWUsS0FBSyxPQUFPLFNBQVMsSUFBSSxDQUFDO0FBRXhMLFFBQUksS0FBSyxZQUFZO0FBQ2pCLDRCQUFLLHNDQUFMLFdBQXNCLEtBQUs7QUFDM0IsV0FBSyxXQUFXLFFBQVE7QUFDeEIsV0FBSyxhQUFhO0FBQUEsSUFDdEI7QUFFQSxTQUFLLGFBQWEsSUFBSSxpQkFBaUIsWUFBWSxTQUFTLE1BQU0sUUFBUSxXQUFXLEtBQUssUUFBUSxtQkFBbUIsUUFBUSxXQUFXO0FBQUEsRUFDNUk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFhLFFBQVEsbUJBQWdELFVBQThCLENBQUMsR0FBRztBQUNuRyxVQUFNLFVBQVUsS0FBSyxPQUFPLE9BQU8sU0FBUyxRQUFRLGlCQUFpQjtBQUNyRSxRQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsYUFBYSxHQUFHO0FBQ3JDLFlBQU0sV0FBVyxxQkFBcUIsV0FBVywyQkFBMkIsNEJBQVksVUFBVSxJQUFJLDRCQUFZLGVBQWUsS0FBSyxPQUFPLFNBQVMsSUFBSSxDQUFDO0FBQUEsSUFDL0o7QUFFQSxRQUFJLEtBQUs7QUFBYSxXQUFLLE1BQU0saUJBQWlCLFFBQVEsU0FBUyw0QkFBWSxrQkFBa0IsVUFBVSxPQUFPLFlBQVksUUFBUSxJQUFJLFNBQVMsUUFBUSxFQUFFLEdBQUc7QUFFaEssUUFBSSxLQUFLLGNBQWMsUUFBUSxPQUFPLEtBQUssV0FBVyxRQUFRLElBQUk7QUFDOUQsVUFBSSxLQUFLO0FBQWEsYUFBSyxNQUFNLDJCQUEyQjtBQUM1RCw0QkFBSyxzQ0FBTCxXQUFzQixLQUFLO0FBQzNCLFdBQUssV0FBVyxRQUFRO0FBQ3hCLFdBQUssYUFBYTtBQUFBLElBQ3RCO0FBRUEsU0FBSyxhQUFhLE1BQU0sS0FBSyxPQUFPLFdBQVcsUUFBUSxTQUFTO0FBQUEsTUFDNUQsTUFBTSxRQUFRLFFBQVEsS0FBSyxRQUFRLFlBQVk7QUFBQSxNQUMvQyxTQUFTLFNBQVMsV0FBVyxLQUFLLFFBQVEscUJBQXFCO0FBQUEsTUFDL0QsT0FBTztBQUFBLE1BQ1AsYUFBYSxTQUFTO0FBQUEsTUFDdEIsT0FBTyxRQUFRLFNBQVMsS0FBSyxPQUFPLE9BQU8sTUFBTTtBQUFBLElBQ3JELENBQUM7QUFFRCxTQUFLLEtBQUssZ0JBQWdCLFlBQVksSUFBSTtBQUUxQyxRQUFJLEtBQUssUUFBUyxTQUFTLDRCQUFZLGlCQUFpQjtBQUNwRCxZQUFNLEtBQUssUUFBUyxNQUFNLFFBQVEsR0FBSSxNQUFNLGNBQWMsS0FBSyxFQUFFLE1BQU0sWUFBWTtBQUMvRSxlQUFPLE1BQU0sS0FBSyxRQUFTLE1BQU0sUUFBUSxHQUFJLE1BQU0sa0JBQWtCLElBQUksRUFBRSxNQUFNLEtBQUssSUFBSTtBQUFBLE1BQzlGLENBQUM7QUFBQSxJQUNMO0FBRUEsMEJBQUssc0NBQUwsV0FBc0IsS0FBSztBQUUzQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sY0FBYyxVQUFVLE1BQU07QUFDakMsUUFBSSxDQUFDLFNBQVM7QUFDVixXQUFLLE9BQU8sUUFBUTtBQUNwQixhQUFPO0FBQUEsSUFDWDtBQUVBLHVCQUFLLFVBQVc7QUFDaEIsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLGlCQUFpQjtBQUNwQix1QkFBSyxVQUFXO0FBQ2hCLFdBQU87QUFBQSxFQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sY0FBYyxVQUFVLE1BQU07QUFDakMsUUFBSSxTQUFTO0FBQ1QseUJBQUssVUFBVyxDQUFDLG1CQUFLO0FBQ3RCLGFBQU8sbUJBQUs7QUFBQSxJQUNoQixPQUFPO0FBQ0gsV0FBSyxPQUFPLFFBQVE7QUFDcEIsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLGNBQWM7QUFDckIsV0FBTyxtQkFBSztBQUFBLEVBQ2hCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFXLE9BQU87QUFDZCxXQUFPLEtBQUssWUFBWSxLQUFLLE9BQU87QUFBQSxFQUN4QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sU0FBUztBQUNaLFFBQUksS0FBSyxPQUFPLE1BQU0sT0FBTyxLQUFLLEVBQUUsR0FBRztBQUNuQyx5QkFBSyxVQUFXO0FBQ2hCLFdBQUssT0FBTyxPQUFPLEtBQUssZ0JBQWdCLGFBQWEsSUFBSTtBQUN6RCxXQUFLLEtBQUssV0FBVyxVQUFVO0FBQy9CLFdBQUssV0FBVyxVQUFVO0FBQUEsSUFDOUI7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFNBQVM7QUFDWixRQUFJLENBQUMsS0FBSyxXQUFXLEtBQUssT0FBTyxNQUFNLElBQUksS0FBSyxFQUFFO0FBQUc7QUFDckQsdUJBQUssVUFBVztBQUNoQixTQUFLLGlCQUFpQixLQUFLO0FBQzNCLFNBQUssT0FBTyxNQUFNLE1BQU0sSUFBSSxLQUFLLElBQUksSUFBSTtBQUN6QyxTQUFLLE9BQU8sT0FBTyxLQUFLLGdCQUFnQixhQUFhLElBQUk7QUFBQSxFQUM3RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksTUFBZ0IsUUFBaUI7QUFDaEQsV0FBTyxLQUFLLE1BQU0sUUFBUSxHQUFJLE1BQU0sUUFBUSxNQUFNLE1BQU07QUFBQSxFQUM1RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksTUFBZ0IsUUFBaUI7QUFDaEQsV0FBTyxLQUFLLE1BQU0sUUFBUSxHQUFJLE1BQU0sUUFBUSxNQUFNLE1BQU07QUFBQSxFQUM1RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsS0FBSyxPQUFrQixTQUE4QztBQUM5RSxRQUFJLENBQUMsS0FBSztBQUFTLFlBQU0sV0FBVyx3QkFBd0I7QUFFNUQsV0FBTyxLQUFLLE9BQU8sS0FBSyxLQUFLLFNBQVMsT0FBTyxPQUFPO0FBQUEsRUFDeEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUE2QyxVQUFhLE1BQXNEO0FBQ25ILFFBQUksS0FBSztBQUFTLGFBQU87QUFDekIsV0FBTyxLQUFLLE9BQU8sT0FBTyxLQUFLLE9BQU8sR0FBRyxJQUFJO0FBQUEsRUFDakQ7QUFBQSxFQW1DQSxJQUFXLGNBQWM7QUFDckIsV0FBTyxLQUFLLE9BQU8sT0FBTztBQUFBLEVBQzlCO0FBeUpKO0FBdHRCSTtBQUNBO0FBQ0E7QUF3aEJBO0FBQUEscUJBQWdCLGdDQUFDLFlBQThCO0FBQzNDLGFBQVcsR0FBRyxTQUFTLENBQUMsTUFBTSxLQUFLLEtBQUssZ0JBQWdCLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDdkUsYUFBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEtBQUssZUFBZSxLQUFLLEtBQUssZ0JBQWdCLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDM0YsYUFBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLHNCQUFLLGtDQUFMLFdBQW9CLEVBQUU7QUFDckQsYUFBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLHNCQUFLLGdDQUFMLFdBQW1CLEVBQUU7QUFDbkQsYUFBVyxHQUFHLGFBQWEsTUFBTTtBQUM3QiwwQkFBSyxzQ0FBTCxXQUFzQjtBQUN0QixTQUFLLGFBQWE7QUFBQSxFQUN0QixDQUFDO0FBQ0QsYUFBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNO0FBQ3hCLFFBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLGtCQUFrQixTQUFTLENBQUMsR0FBRztBQUN2RCxXQUFLLEtBQUssZ0JBQWdCLFdBQVcsTUFBTSxLQUFLLFFBQVEsa0JBQWtCLFNBQVMsQ0FBQztBQUFBLElBQ3hGO0FBQ0EsU0FBSyxRQUFRLGtCQUFrQixVQUFVO0FBQUEsRUFDN0MsQ0FBQztBQUNELGFBQVcsR0FBRyxVQUFVLENBQUMsTUFBTTtBQUMzQixRQUFJLEtBQUssUUFBUSxrQkFBa0IsV0FBVyxHQUFHO0FBQzdDLFdBQUssS0FBSyxnQkFBZ0IscUJBQXFCLE1BQU0sS0FBSyxRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFBQSxJQUNqRztBQUNBLFNBQUssUUFBUSxrQkFBa0IsU0FBUztBQUFBLEVBQzVDLENBQUM7QUFDRCxhQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU07QUFDNUIsUUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLEtBQUssUUFBUSxrQkFBa0IsU0FBUyxHQUFHO0FBQ3pELFdBQUssS0FBSyxnQkFBZ0IsaUJBQWlCLE1BQU0sS0FBSyxRQUFRLGtCQUFrQixXQUFXLENBQUM7QUFBQSxJQUNoRztBQUNBLFNBQUssUUFBUSxrQkFBa0IsWUFBWTtBQUFBLEVBQy9DLENBQUM7QUFDRCxhQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU07QUFDM0IsUUFBSSxLQUFLLFFBQVEsa0JBQWtCLFdBQVc7QUFBRyxXQUFLLEtBQUssZ0JBQWdCLGNBQWMsTUFBTSxLQUFLLFFBQVEsa0JBQWtCLFFBQVEsQ0FBQztBQUN2SSxTQUFLLFFBQVEsa0JBQWtCLFNBQVM7QUFBQSxFQUM1QyxDQUFDO0FBQ0wsR0EvQmdCO0FBcUNoQjtBQUFBLHFCQUFpRSxnQ0FBQ0MsU0FBVztBQUN6RSxFQUFBQSxRQUFPLG1CQUFtQjtBQUM5QixHQUZpRTtBQUlqRTtBQUFBLGtCQUFhLGdDQUFDLFVBQWlDO0FBQzNDLFFBQU0sUUFBUSxVQUFVLFlBQVksS0FBSztBQUN6QyxRQUFNLFNBQVMsS0FBSyxnQkFBZ0IsSUFBSSxZQUFZO0FBRXBELE1BQUksS0FBSztBQUNMLFNBQUs7QUFBQSxNQUNELDhCQUE4QixLQUFLLFVBQVU7QUFBQSxRQUN6QyxPQUFPLE9BQU87QUFBQSxRQUNkO0FBQUEsTUFDSixDQUFDLENBQUM7QUFBQSxJQUNOO0FBRUosT0FBSyxLQUFLLGdCQUFnQixlQUFlLE1BQU0sT0FBUSxNQUFNO0FBQzdELE1BQUksU0FBUyxDQUFDLEtBQUssZ0JBQWdCO0FBQUcsU0FBSyxLQUFLLGdCQUFnQixhQUFhLE1BQU0sS0FBSztBQUN4RixPQUFLLGlCQUFpQixLQUFLO0FBQy9CLEdBZmE7QUFpQmI7QUFBQSxrQkFBYSxrQ0FBRztBQUNaLE1BQUksQ0FBQyxLQUFLLGFBQWE7QUFDbkIsV0FBTyxLQUFLLE9BQU8sU0FBUztBQUFBLEVBQ2hDO0FBRUEsUUFBTSxRQUFRLEtBQUssT0FBTztBQUUxQixNQUFJLENBQUMsTUFBTTtBQUFRO0FBRW5CLFFBQU0sUUFBUSxLQUFLLGFBQWEsS0FBSztBQUVyQyxPQUFLLE9BQU8sVUFBVSxDQUFDLE1BQU07QUFDekIsV0FBTyxFQUFFLE9BQU8sTUFBTTtBQUFBLEVBQzFCLENBQUM7QUFFRCxTQUFPO0FBQ1gsR0FoQmE7QUFrQmI7QUFBQSxtQkFBYyxnQ0FBQyxVQUFpQztBQUM1QyxRQUFNLFFBQVEsVUFBVSxZQUFZLEtBQUs7QUFFekMsTUFBSSxLQUFLO0FBQ0wsU0FBSztBQUFBLE1BQ0QsU0FBUyxLQUFLLFVBQVU7QUFBQSxRQUNwQixPQUFPLE9BQU87QUFBQSxRQUNkLGtCQUFrQixLQUFLLGdCQUFnQjtBQUFBLE1BQzNDLENBQUMsQ0FBQztBQUFBLElBQ047QUFFSixNQUFJLFNBQVMsQ0FBQyxLQUFLLGdCQUFnQixHQUFHO0FBQ2xDLFFBQUksS0FBSztBQUFhLFdBQUssTUFBTSx3RkFBd0Y7QUFDekgsU0FBSyxRQUFRLEtBQUssS0FBSztBQUN2QixTQUFLLEtBQUssY0FBYztBQUN4QixTQUFLLEtBQUssZ0JBQWdCLGNBQWMsTUFBTSxLQUFLO0FBQ25ELFFBQUksbUJBQUs7QUFBVSxhQUFPLHNCQUFLLHNCQUFMO0FBQzFCLFFBQUksS0FBSyxPQUFPLE9BQU8sS0FBSyxLQUFLLDRCQUFvQztBQUNqRSxVQUFJLEtBQUs7QUFBYSxhQUFLLE1BQU0sd0ZBQXdGO0FBQ3pILDRCQUFLLHNCQUFMO0FBQUEsSUFDSixPQUFPO0FBQ0gsVUFBSSxLQUFLLDhCQUFzQztBQUMzQyxZQUFJLEtBQUs7QUFBYSxlQUFLLE1BQU0sdUVBQXVFO0FBQ3hHLGFBQUssWUFBWSxLQUFLLFFBQVEsT0FBTyxTQUFTLEtBQUs7QUFDbkQsZUFBTyxLQUFLLEtBQUssS0FBSyxLQUFLLFdBQVksRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUFBLE1BQzNEO0FBQ0EsVUFBSSxLQUFLLDhCQUFzQztBQUMzQyxZQUFJLEtBQUs7QUFBYSxlQUFLLE1BQU0scUZBQXFGO0FBQ3RILGFBQUssT0FBTyxJQUFJLEtBQUssUUFBUSxPQUFPLFNBQVMsS0FBSyxLQUFLO0FBQUEsTUFDM0Q7QUFDQSxVQUFJLENBQUMsS0FBSyxPQUFPLE1BQU07QUFDbkIsWUFBSSxLQUFLLGlDQUF5QztBQUM5QyxjQUFJLEtBQUs7QUFBYSxpQkFBSyxNQUFNLGdFQUFnRTtBQUNqRyxnQ0FBSyxvQ0FBTCxXQUFxQjtBQUNyQjtBQUFBLFFBQ0o7QUFBQSxNQUNKLE9BQU87QUFDSCxZQUFJLEtBQUs7QUFBYSxlQUFLLE1BQU0seUNBQXlDO0FBQzFFLGFBQUssWUFBWSxzQkFBSyxnQ0FBTDtBQUNqQixhQUFLLEtBQUssS0FBSyxLQUFLLFdBQVc7QUFBQSxVQUMzQixPQUFPO0FBQUEsUUFDWCxDQUFDO0FBQUEsTUFDTDtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0osR0E3Q2M7QUErQ2Q7QUFBQSxhQUFRLGtDQUFHO0FBQ1AsT0FBSyxZQUFZO0FBQ2pCLE9BQUssS0FBSyxnQkFBZ0IsWUFBWSxJQUFJO0FBQzFDLE1BQUksS0FBSyxRQUFRLFlBQVk7QUFDekIsVUFBTSxTQUFxQiwwQkFBVyxNQUFNO0FBQ3hDLFVBQUksS0FBSyxVQUFVO0FBQUcsZUFBTyxhQUFhLEVBQUU7QUFDNUMsV0FBSyxZQUFZLFdBQVc7QUFBQSxJQUNoQyxHQUFHLEtBQUssUUFBUSxrQkFBa0IsRUFBRSxNQUFNO0FBQUEsRUFDOUM7QUFDSixHQVRRO0FBV0Y7QUFBQSxvQkFBZSxzQ0FBQyxPQUFjO0FBQ2hDLE1BQUk7QUFDQSxRQUFJLEtBQUs7QUFBYSxXQUFLLE1BQU0sZ0RBQWdELE1BQU0sS0FBSyxLQUFLLE1BQU0sR0FBRyxVQUFVLE1BQU0sV0FBVyxjQUFjLEtBQUssR0FBRztBQUMzSixVQUFNLFVBQ0QsTUFBTSxNQUFNLFdBQVcsaUJBQWlCLE9BQU8sS0FBSyxPQUFPLElBQUksV0FFNUQsTUFBTSxLQUFLLE9BQU8sV0FBVyxJQUFJLE9BQU8sUUFBUTtBQUM1QyxVQUFJLEtBQUs7QUFBYSxhQUFLLE1BQU0sa0NBQWtDLElBQUksVUFBVSxFQUFFO0FBQ25GLFlBQU0sTUFBTSxNQUFNLElBQUksaUJBQWlCLE9BQU8sS0FBSyxPQUFPO0FBQzFELFVBQUksQ0FBQyxJQUFJLE9BQU8sUUFBUTtBQUNwQixZQUFJLEtBQUs7QUFBYSxlQUFLLE1BQU0seUJBQXlCLElBQUksVUFBVSw2QkFBNkI7QUFDckcsZUFBTztBQUFBLE1BQ1g7QUFFQSxVQUFJLEtBQUs7QUFBYSxhQUFLLE1BQU0seUJBQXlCLElBQUksVUFBVSxpQ0FBaUM7QUFFekcsYUFBTyxJQUFJO0FBQUEsSUFDZixDQUFDLElBQ0YsVUFDSCxDQUFDO0FBRUwsUUFBSSxXQUEwQyxLQUFLO0FBQ25ELFVBQU0sY0FBYyxJQUFJLFFBQXNCLENBQUMsWUFBYSxXQUFXLE9BQVE7QUFFL0UsVUFBTSxVQUFVLEtBQUssS0FBSyxnQkFBZ0IsY0FBYyxNQUFNLFFBQVEsUUFBUztBQUcvRSxRQUFJLENBQUMsU0FBUztBQUNWO0FBQUEsUUFDSSxPQUFPLFVBQ0EsTUFBTTtBQUNILGdCQUFNLFNBQVMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxHQUFHLEdBQUcsQ0FBQztBQUN2RixpQkFBTyxTQUFTLENBQUMsS0FBSyxLQUFLLGFBQWEsT0FBTyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQUEsUUFDOUQsR0FBRyxJQUNIO0FBQUEsTUFDVjtBQUFBLElBQ0o7QUFFQSxVQUFNLFlBQVksTUFBTTtBQUV4QixRQUFJLENBQUMsV0FBVztBQUNaLFVBQUksS0FBSztBQUFhLGFBQUssTUFBTSx1REFBdUQ7QUFDeEYsWUFBTTtBQUFBLElBQ1Y7QUFFQSxVQUFNLEtBQUssS0FBSyxLQUFLLFdBQVc7QUFBQSxNQUM1QixPQUFPO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTixnQkFBZ0I7QUFBQSxJQUNwQixDQUFDO0FBQUEsRUFDTCxRQUFRO0FBQ0osV0FBTyxzQkFBSyxzQkFBTDtBQUFBLEVBQ1g7QUFDSixHQXJEcUI7QUFqcUJlO0FBQWpDLElBQU1DLGNBQU47OztBVTdYUCxJQUFBQyxnQkFBMkI7QUFFcEIsSUFBTSxZQUFZLElBQUkseUJBQTJCO0FBQ2pELElBQU0saUJBQWlCLElBQUkseUJBQTRCOzs7QUNEdkQsU0FBUyxVQUFVLFFBQWdCO0FBQ3RDLE1BQUksVUFBVSxJQUFJLE9BQU8sRUFBRTtBQUFHLFdBQU87QUFFckMsWUFBVSxJQUFJLE9BQU8sSUFBSSxNQUFNO0FBRS9CLFNBQU8sVUFBVSxJQUFJLE9BQU8sRUFBRTtBQUNsQztBQU5nQjs7O0FDQVQsU0FBUyxZQUFZLFFBQWdCO0FBQ3hDLFNBQU8sVUFBVSxPQUFPLE9BQU8sRUFBRTtBQUNyQztBQUZnQjs7O0FDRFQsU0FBUyxhQUFhO0FBQ3pCLFNBQU8sVUFBVSxNQUFNO0FBQzNCO0FBRmdCOzs7QUNBVCxTQUFTLG9CQUFvQjtBQUNoQyxTQUFPO0FBQ1g7QUFGZ0I7OztBZjJDVCxJQUFNLG9CQUFOLE1BQU0sa0JBQWlDO0FBQUEsRUFFbkMsWUFBbUIsUUFBZ0I7QUFBaEI7QUFEMUIsU0FBTyxRQUFRLElBQUkseUJBQStCO0FBQUEsRUFDUDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9wQyxPQUFpQixPQUF3QixVQUFxQyxDQUFDLEdBQWtCO0FBQ3BHLFVBQU0sU0FBUyxLQUFLLE9BQU8sT0FBTyxPQUFPLFFBQVEsS0FBSztBQUN0RCxRQUFJLENBQUMsUUFBUTtBQUNULFlBQU0sV0FBVyxhQUFhLDBCQUEwQjtBQUFBLElBQzVEO0FBRUEsUUFBSSxLQUFLLE1BQU0sSUFBSSxPQUFPLEVBQUUsR0FBRztBQUMzQixhQUFPLEtBQUssTUFBTSxJQUFJLE9BQU8sRUFBRTtBQUFBLElBQ25DO0FBRUEsWUFBUSxhQUFSLFFBQVEsV0FBYTtBQUNyQixZQUFRLFdBQVIsUUFBUSxTQUFXO0FBQ25CLFlBQVEsY0FBUixRQUFRLFlBQWMsQ0FBQztBQUN2QixZQUFRLGFBQVIsUUFBUSxXQUFhLENBQUM7QUFDdEIsWUFBUSxtQkFBUixRQUFRLGlCQUFtQjtBQUMzQixZQUFRLGlCQUFSLFFBQVEsZUFBaUI7QUFDekIsWUFBUSx5QkFBUixRQUFRLHVCQUF5QjtBQUNqQyxZQUFRLGVBQVIsUUFBUSxhQUFlO0FBQ3ZCLFlBQVEsdUJBQVIsUUFBUSxxQkFBdUI7QUFDL0IsWUFBUSxnQkFBUixRQUFRLGNBQWdCO0FBQ3hCLFlBQVEsd0JBQVIsUUFBUSxzQkFBd0I7QUFDaEMsWUFBUSxjQUFSLFFBQVEsWUFBYztBQUN0QixZQUFRLGFBQVIsUUFBUSxXQUFhO0FBQ3JCLFlBQVEsc0JBQVIsUUFBUSxvQkFBc0IsS0FBSyxPQUFPLFFBQVE7QUFDbEQsWUFBUSxxQkFBUixRQUFRLG1CQUFxQjtBQUM3QixZQUFRLFlBQVIsUUFBUSxVQUFZO0FBQ3BCLFlBQVEsbUJBQVIsUUFBUSxpQkFBbUI7QUFDM0IsWUFBUSwwQkFBUixRQUFRLHdCQUEwQjtBQUNsQyxZQUFRLGlCQUFSLFFBQVEsZUFBaUI7QUFFekIsWUFBUSxrQkFBUixRQUFRLGdCQUFrQjtBQUMxQixZQUFRLHFCQUFSLFFBQVEsbUJBQXFCO0FBQzdCLFlBQVEsb0JBQVIsUUFBUSxrQkFBb0I7QUFDNUIsWUFBUSxxQkFBUixRQUFRLG1CQUFxQjtBQUM3QixZQUFRLGtCQUFSLFFBQVEsZ0JBQWtCO0FBRTFCLFFBQUksa0JBQWtCLEVBQUUsSUFBSSx5QkFBeUIsS0FBSyxDQUFDLFFBQVEsc0JBQXNCO0FBQ3JGLGNBQVEsdUJBQXVCLGtCQUFrQixFQUFFLElBQUkseUJBQXlCO0FBQUEsSUFDcEY7QUFFQSxRQUFJLGtCQUFrQixFQUFFLElBQUksd0JBQXdCLEtBQUssQ0FBQyxRQUFRLHFCQUFxQjtBQUNuRixjQUFRLHNCQUFzQixrQkFBa0IsRUFBRSxJQUFJLHdCQUF3QjtBQUFBLElBQ2xGO0FBRUEsVUFBTSxRQUFRLElBQUlDLFlBQWMsS0FBSyxRQUFRO0FBQUEsTUFDekMsT0FBTztBQUFBLE1BQ1AsZUFBZSxRQUFRO0FBQUEsTUFDdkIsUUFBUSxRQUFRO0FBQUEsTUFDaEIsV0FBVyxRQUFRO0FBQUEsTUFDbkIsVUFBVSxRQUFRO0FBQUEsTUFDbEIsUUFBUSxRQUFRO0FBQUEsTUFDaEIsV0FBVyxRQUFRO0FBQUEsTUFDbkIsZ0JBQWdCLFFBQVE7QUFBQSxNQUN4QixzQkFBc0IsUUFBUTtBQUFBLE1BQzlCLHFCQUFxQixRQUFRO0FBQUEsTUFDN0IsWUFBWSxRQUFRO0FBQUEsTUFDcEIsY0FBYyxRQUFRO0FBQUEsTUFDdEIsc0JBQXNCLFFBQVE7QUFBQSxNQUM5QixZQUFZLFFBQVE7QUFBQSxNQUNwQixvQkFBb0IsUUFBUTtBQUFBLE1BQzVCLGFBQWEsUUFBUTtBQUFBLE1BQ3JCLHFCQUFxQixRQUFRO0FBQUEsTUFDN0IsVUFBVSxRQUFRO0FBQUEsTUFDbEIsbUJBQW1CLFFBQVEscUJBQXFCO0FBQUEsTUFDaEQsVUFBVSxRQUFRO0FBQUEsTUFDbEIsZUFBZSxRQUFRLHdCQUF3QixDQUFDO0FBQUEsTUFDaEQsa0JBQWtCLFFBQVE7QUFBQSxNQUMxQixjQUFjLFFBQVEsZ0JBQWdCO0FBQUEsTUFDdEMsdUJBQXVCLFFBQVE7QUFBQSxNQUMvQixnQkFBZ0IsUUFBUTtBQUFBLE1BQ3hCLFNBQVMsUUFBUTtBQUFBLE1BQ2pCLGNBQWMsUUFBUTtBQUFBLE1BQ3RCLGVBQWUsUUFBUTtBQUFBLE1BQ3ZCLGtCQUFrQixRQUFRO0FBQUEsTUFDMUIsaUJBQWlCLFFBQVE7QUFBQSxNQUN6QixrQkFBa0IsUUFBUTtBQUFBLE1BQzFCLGVBQWUsUUFBUTtBQUFBLElBQzNCLENBQUM7QUFFRCxTQUFLLE1BQU0sSUFBSSxPQUFPLElBQUksS0FBSztBQUUvQixXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxJQUFjLE1BQXNCO0FBQ3ZDLFVBQU0sUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUMvQixRQUFJLENBQUM7QUFBTyxhQUFPO0FBRW5CLFdBQVEsS0FBSyxNQUFNLElBQUksTUFBTSxFQUFFLEtBQXVCO0FBQUEsRUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sSUFBSSxNQUFzQjtBQUM3QixVQUFNLEtBQUssZ0JBQWdCQSxjQUFhLEtBQUssS0FBSyxLQUFLLE9BQU8sT0FBTyxPQUFPLFVBQVUsSUFBSTtBQUMxRixXQUFPLEtBQUssTUFBTSxJQUFJLEVBQUU7QUFBQSxFQUM1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxPQUFPLE1BQXNCO0FBQ2hDLFVBQU0sUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUMvQixRQUFJLENBQUMsT0FBTztBQUNSLFlBQU0sV0FBVyxtQkFBbUIsa0NBQWtDO0FBQUEsSUFDMUU7QUFFQSxVQUFNLGlCQUFpQixJQUFJO0FBQzNCLFVBQU0sS0FBSyxLQUFLLElBQUk7QUFDcEIsVUFBTSxZQUFZLG1CQUFtQjtBQUNyQyxVQUFNLFlBQVksbUJBQW1CO0FBQ3JDLFVBQU0sWUFBWSxXQUFXO0FBQzdCLFVBQU0sU0FBUyxRQUFRLENBQUMsT0FBTyxhQUFhLEVBQUUsQ0FBQztBQUMvQyxVQUFNLFFBQVEsTUFBTTtBQUNwQixVQUFNLE9BQU8sTUFBTTtBQUVuQixXQUFPLEtBQUssTUFBTSxPQUFPLE1BQU0sRUFBRTtBQUFBLEVBQ3JDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFFBQWtCLE1BQXNCO0FBQzNDLFFBQUksZ0JBQWdCQSxhQUFZO0FBQzVCLGFBQU87QUFBQSxJQUNYO0FBRUEsV0FBTyxLQUFLLE1BQU0sSUFBSSxLQUFLLE9BQU8sT0FBTyxPQUFPLFVBQVUsSUFBSSxDQUFFO0FBQUEsRUFDcEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sVUFBVSxNQUFzQjtBQUNuQyxVQUFNLElBQUksS0FBSyxRQUFRLElBQUk7QUFDM0IsV0FBTyxHQUFHLE1BQU07QUFBQSxFQUNwQjtBQUNKO0FBM0o4QztBQUF2QyxJQUFNLG1CQUFOOzs7QWdCNUNQLElBQUFDLHVCQUF3STtBQUV4SSxJQUFBQyxnQkFBMkI7QUFLM0IsSUFBTSxjQUFOLE1BQU0sWUFBVztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWWIsWUFBbUIsUUFBZ0I7QUFBaEI7QUFMbkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBTyxRQUFpRCxJQUFJLHlCQUF3QztBQUFBLEVBS2hFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRcEMsTUFBYSxRQUNULFNBQ0EsU0FPeUI7QUFDekIsUUFBSSxDQUFDLFNBQVM7QUFBTyxZQUFNLFdBQVcsbUJBQW1CO0FBQ3pELFVBQU0sT0FBTyxNQUFNLEtBQUssS0FBSyxTQUFTLE9BQU87QUFDN0MsVUFBTSxNQUFNLElBQUksaUJBQWlCLE1BQU0sU0FBUyxRQUFRLE9BQU8sUUFBUSxTQUFTLFFBQVEsV0FBVztBQUNuRyxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxLQUNULFNBQ0EsU0FLRjtBQUNFLFVBQU0sV0FBTyx1Q0FBaUI7QUFBQSxNQUMxQixTQUFTLFFBQVEsTUFBTTtBQUFBLE1BQ3ZCLFdBQVcsUUFBUTtBQUFBLE1BQ25CLGdCQUFnQixRQUFRLE1BQU07QUFBQSxNQUM5QixVQUFVLFFBQVEsU0FBUyxJQUFJO0FBQUEsTUFDL0IsT0FBTyxLQUFLLE9BQU8sT0FBTyxjQUFjLE9BQU8sSUFBSTtBQUFBLE1BQ25ELE9BQU8sU0FBUztBQUFBLElBQ3BCLENBQUM7QUFFRCxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFdBQVcsWUFBZ0Q7QUFDOUQsUUFBSSxzQkFBc0I7QUFBa0IsbUJBQWEsV0FBVztBQUVwRSxRQUFJO0FBQ0EsVUFBSSxXQUFXLE1BQU0sV0FBVywyQ0FBc0I7QUFBVyxlQUFPLFdBQVcsUUFBUTtBQUFBLElBQy9GLFFBQVE7QUFBQSxJQUVSO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGNBQWMsT0FBa0IsT0FBZ0I7QUFDbkQsZUFBTyx5Q0FBbUIsT0FBTyxLQUFLO0FBQUEsRUFDMUM7QUFDSjtBQXJGaUI7QUFBakIsSUFBTSxhQUFOOzs7QUNHQSxJQUFNLHlCQUF5QjtBQVgvQjtBQW1CTyxJQUFNLGNBQU4sTUFBTSxZQUFnRDtBQUFBLEVBR2xELFlBQ0ksUUFDQSxVQUE2QjtBQUFBLElBQ2hDLGVBQWU7QUFBQSxFQUNuQixHQUNGO0FBSlM7QUFDQTtBQUpYLHNDQUFnQixvQkFBSSxJQUFrRDtBQVFsRSxTQUFLLFFBQVEsWUFBWSxLQUFLLFFBQVEsS0FBSyxJQUFJLEdBQUcsS0FBSyxhQUFhLEVBQUUsTUFBTTtBQUFBLEVBQ2hGO0FBQUEsRUFFQSxJQUFXLGdCQUFnQjtBQUN2QixXQUFPLEtBQUssUUFBUSxpQkFBaUI7QUFBQSxFQUN6QztBQUFBLEVBRUEsTUFBYSxVQUFVO0FBQ25CLGVBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxtQkFBSyxnQkFBZTtBQUMxQyxVQUFJLE1BQU0sV0FBVyxHQUFHO0FBQ3BCLDJCQUFLLGVBQWMsT0FBTyxFQUFFO0FBQUEsTUFDaEM7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUFBLEVBRUEsTUFBYSxRQUFRO0FBQ2pCLHVCQUFLLGVBQWMsTUFBTTtBQUFBLEVBQzdCO0FBQUEsRUFFQSxNQUFhLFVBQVU7QUFDbkIsV0FBTyxDQUFDLEdBQUcsbUJBQUssZUFBYyxPQUFPLENBQUM7QUFBQSxFQUMxQztBQUFBLEVBRUEsTUFBYSxRQUFRLE1BQW9CO0FBQ3JDLFNBQUssT0FBTyxRQUFRLENBQUMsTUFBTTtBQUN2QixVQUFJLG1CQUFLLGVBQWMsSUFBSSxFQUFFLEdBQUc7QUFBRztBQUNuQyx5QkFBSyxlQUFjLElBQUksRUFBRSxLQUFLLElBQUksOEJBQThCLENBQUMsQ0FBQztBQUFBLElBQ3RFLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFQSxNQUFhLFFBQVEsU0FBb0M7QUFDckQsVUFBTSxTQUFTLG1CQUFLLGVBQWMsSUFBSSxRQUFRLEtBQUs7QUFDbkQsUUFBSSxDQUFDO0FBQ0QsYUFBTyxJQUFJLGFBQWEsS0FBSyxRQUFRO0FBQUEsUUFDakMsT0FBTyxRQUFRO0FBQUEsUUFDZixhQUFhLFFBQVE7QUFBQSxRQUNyQixXQUFXLFFBQVE7QUFBQSxNQUN2QixDQUFDO0FBRUwsV0FBTyxJQUFJLGFBQWEsS0FBSyxRQUFRO0FBQUEsTUFDakMsT0FBTyxRQUFRO0FBQUEsTUFDZixRQUFRLENBQUMsT0FBTyxJQUFJO0FBQUEsTUFDcEIsVUFBVTtBQUFBLE1BQ1YsV0FBVyxRQUFRO0FBQUEsTUFDbkIsYUFBYSxRQUFRO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0w7QUFDSjtBQXZESTtBQUR5RDtBQUF0RCxJQUFNLGFBQU47QUEwREEsSUFBTSxpQ0FBTixNQUFNLCtCQUEyQztBQUFBLEVBRTdDLFlBQW1CLE1BQVMsY0FBc0Isd0JBQXdCO0FBQXZEO0FBRDFCLFNBQU8sY0FBYztBQUVqQixRQUFJLE9BQU8sZ0JBQWdCLFVBQVU7QUFDakMsV0FBSyxjQUFjLEtBQUssSUFBSSxJQUFJO0FBQUEsSUFDcEM7QUFBQSxFQUNKO0FBQUEsRUFFTyxhQUFhO0FBQ2hCLFFBQUksT0FBTyxLQUFLLGdCQUFnQixZQUFZLE1BQU0sS0FBSyxXQUFXLEtBQUssS0FBSyxjQUFjO0FBQUcsYUFBTztBQUNwRyxXQUFPLEtBQUssSUFBSSxLQUFLLEtBQUs7QUFBQSxFQUM5QjtBQUNKO0FBWndEO0FBQWpELElBQU0sZ0NBQU47OztBOUI1RFAsd0JBQWMsbUNBakJkOzs7QStCQUEsSUFBQUMsaUJBQXVCO0FBQ3ZCLElBQUFDLGtCQUE2SDtBQU83SCxJQUFBQyx1QkFBbUU7OztBQ1JuRSxJQUFBQyxrQkFBd0M7QUFLeEMsZUFBc0IseUJBQXlCLFFBQWdCLE9BQW1CLFVBQXNCLFVBQXNCO0FBQzFILE1BQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxjQUFjLENBQUMsTUFBTTtBQUFTO0FBRW5ELE1BQUksU0FBUyxhQUFhLENBQUMsU0FBUyxhQUFhLFNBQVMsUUFBUSxPQUFPLFNBQVMsTUFBTSxRQUFRLElBQUksSUFBSTtBQUNwRyxRQUFJO0FBQ0EsWUFBTSxPQUFPO0FBQUEsSUFDakIsUUFBUTtBQUFBLElBRVI7QUFDQSxXQUFPLEtBQUssT0FBTyxPQUFPLEtBQUssZ0JBQWdCLFlBQVksS0FBSztBQUFBLEVBQ3BFO0FBRUEsTUFBSSxNQUFNLFFBQVEsY0FBYztBQUM1QixVQUFNLFVBQVUsS0FBSyxhQUFhLE1BQU0sT0FBTztBQUUvQyxRQUFJLFNBQVM7QUFDVCxZQUFNLEtBQUssVUFBVSxJQUFJO0FBQ3pCLGNBQVEsSUFBSSxPQUFPLG1CQUFtQixJQUFJO0FBQzFDLFVBQUksTUFBTSxhQUFhO0FBQ25CLGNBQU0sTUFBTSxxRUFBcUU7QUFBQSxNQUNyRjtBQUFBLElBQ0osT0FBTztBQUNILFVBQUksUUFBUSxJQUFJLE9BQU8saUJBQWlCLEdBQUc7QUFDdkMsY0FBTSxLQUFLLFVBQVUsS0FBSztBQUMxQixnQkFBUSxJQUFJLE9BQU8sbUJBQW1CLEtBQUs7QUFDM0MsWUFBSSxNQUFNLGFBQWE7QUFDbkIsZ0JBQU0sTUFBTSwwRUFBMEU7QUFBQSxRQUMxRjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUVBLE1BQUksQ0FBQyxTQUFTLGFBQWEsU0FBUyxhQUFhLFNBQVMsUUFBUSxPQUFPLFNBQVMsTUFBTSxRQUFRLElBQUksSUFBSTtBQUNwRyxRQUFJLFNBQVMsY0FBYyxRQUFRLFNBQVMsZUFBZSxTQUFTLFlBQVk7QUFDNUUsWUFBTSxLQUFLLFVBQVUsU0FBUyxVQUFVO0FBQUEsSUFDNUMsV0FBVyxTQUFTLFNBQVMsU0FBUyw0QkFBWSxtQkFBbUIsU0FBUyxZQUFZLFFBQVEsU0FBUyxhQUFhLFNBQVMsVUFBVTtBQUN2SSxZQUFNLEtBQUssVUFBVSxTQUFTLFFBQVE7QUFDdEMsVUFBSSxTQUFTLFVBQVU7QUFDbkIsaUJBQVMsTUFBTSxRQUFRLElBQUksTUFBTSxrQkFBa0IsSUFBSSxFQUFFLE1BQU0sS0FBSyxJQUFJO0FBQUEsTUFDNUU7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUVBLE1BQUksQ0FBQyxTQUFTLGFBQWEsU0FBUyxjQUFjLE1BQU0sUUFBUSxJQUFJO0FBQ2hFLFFBQUksQ0FBQyxLQUFLLGFBQWEsTUFBTSxPQUFPO0FBQUc7QUFDdkMsVUFBTSxVQUFVLFdBQVcsTUFBTTtBQUM3QixVQUFJLENBQUMsS0FBSyxhQUFhLE1BQU0sT0FBUTtBQUFHO0FBQ3hDLFVBQUksQ0FBQyxPQUFPLE1BQU0sSUFBSSxNQUFNLE1BQU0sRUFBRTtBQUFHO0FBQ3ZDLFVBQUksTUFBTSxRQUFRO0FBQWMsY0FBTSxPQUFPO0FBQzdDLGFBQU8sT0FBTyxLQUFLLGdCQUFnQixjQUFjLEtBQUs7QUFBQSxJQUMxRCxHQUFHLE1BQU0sUUFBUSx3QkFBd0IsQ0FBQyxFQUFFLE1BQU07QUFDbEQsVUFBTSxTQUFTLElBQUksU0FBUyxTQUFTLE1BQU0sRUFBRSxJQUFJLE9BQU87QUFBQSxFQUM1RDtBQUVBLE1BQUksU0FBUyxhQUFhLFNBQVMsY0FBYyxNQUFNLFFBQVEsSUFBSTtBQUMvRCxVQUFNLGVBQWUsTUFBTSxTQUFTLElBQUksU0FBUyxTQUFTLE1BQU0sRUFBRSxFQUFFO0FBQ3BFLFVBQU0sZUFBZSxLQUFLLGFBQWEsTUFBTSxPQUFPO0FBQ3BELFFBQUksQ0FBQyxnQkFBZ0IsY0FBYztBQUMvQixtQkFBYSxZQUFZO0FBQ3pCLFlBQU0sU0FBUyxPQUFPLFNBQVMsU0FBUyxNQUFNLEVBQUUsRUFBRTtBQUNsRCxhQUFPLE9BQU8sS0FBSyxnQkFBZ0IsaUJBQWlCLEtBQUs7QUFBQSxJQUM3RDtBQUFBLEVBQ0o7QUFFQSxNQUFJLFNBQVMsYUFBYSxTQUFTLGFBQWEsU0FBUyxjQUFjLFNBQVMsV0FBVztBQUN2RixRQUFJLFNBQVMsUUFBUSxPQUFPLFNBQVMsTUFBTSxRQUFRLElBQUksSUFBSTtBQUN2RCxVQUFJLE1BQU0sY0FBYyxTQUFTLFFBQVEsT0FBTyxTQUFTLE1BQU0sUUFBUSxJQUFJO0FBQUksY0FBTSxVQUFVLFNBQVM7QUFDeEcsWUFBTSxlQUFlLE1BQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLEVBQUUsRUFBRTtBQUNwRSxZQUFNLGVBQWUsS0FBSyxhQUFhLE1BQU0sT0FBTztBQUNwRCxVQUFJLENBQUMsZ0JBQWdCLGNBQWM7QUFDL0IscUJBQWEsWUFBWTtBQUN6QixjQUFNLFNBQVMsT0FBTyxTQUFTLFNBQVMsTUFBTSxFQUFFLEVBQUU7QUFDbEQsZUFBTyxPQUFPLEtBQUssZ0JBQWdCLGlCQUFpQixLQUFLO0FBQUEsTUFDN0QsT0FBTztBQUNILGNBQU0sVUFBVSxXQUFXLE1BQU07QUFDN0IsY0FBSSxNQUFNLGNBQWMsQ0FBQyxLQUFLLGFBQWEsTUFBTSxPQUFRO0FBQUc7QUFDNUQsY0FBSSxDQUFDLE9BQU8sTUFBTSxJQUFJLE1BQU0sTUFBTSxFQUFFO0FBQUc7QUFDdkMsY0FBSSxNQUFNLFFBQVE7QUFBYyxrQkFBTSxPQUFPO0FBQzdDLGlCQUFPLE9BQU8sS0FBSyxnQkFBZ0IsY0FBYyxLQUFLO0FBQUEsUUFDMUQsR0FBRyxNQUFNLFFBQVEsd0JBQXdCLENBQUMsRUFBRSxNQUFNO0FBQ2xELGNBQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLEVBQUUsSUFBSSxPQUFPO0FBQUEsTUFDNUQ7QUFBQSxJQUNKLE9BQU87QUFDSCxVQUFJLFNBQVMsY0FBYyxNQUFNLFFBQVEsSUFBSTtBQUN6QyxjQUFNLGVBQWUsS0FBSyxhQUFhLE1BQU0sT0FBUTtBQUNyRCxZQUFJLENBQUM7QUFBYztBQUNuQixZQUFJLE1BQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLEVBQUUsRUFBRTtBQUFHO0FBQ3RELGNBQU0sVUFBVSxXQUFXLE1BQU07QUFDN0IsY0FBSSxDQUFDLEtBQUssYUFBYSxNQUFNLE9BQVE7QUFBRztBQUN4QyxjQUFJLENBQUMsT0FBTyxNQUFNLElBQUksTUFBTSxNQUFNLEVBQUU7QUFBRztBQUN2QyxjQUFJLE1BQU0sUUFBUTtBQUFjLGtCQUFNLE9BQU87QUFDN0MsaUJBQU8sT0FBTyxLQUFLLGdCQUFnQixjQUFjLEtBQUs7QUFBQSxRQUMxRCxHQUFHLE1BQU0sUUFBUSx3QkFBd0IsQ0FBQyxFQUFFLE1BQU07QUFDbEQsY0FBTSxTQUFTLElBQUksU0FBUyxTQUFTLE1BQU0sRUFBRSxJQUFJLE9BQU87QUFBQSxNQUM1RCxPQUFPO0FBQ0gsY0FBTSxlQUFlLE1BQU0sU0FBUyxJQUFJLFNBQVMsU0FBUyxNQUFNLEVBQUUsRUFBRTtBQUNwRSxjQUFNLGVBQWUsS0FBSyxhQUFhLE1BQU0sT0FBUTtBQUNyRCxZQUFJLENBQUMsZ0JBQWdCLGNBQWM7QUFDL0IsdUJBQWEsWUFBWTtBQUN6QixnQkFBTSxTQUFTLE9BQU8sU0FBUyxTQUFTLE1BQU0sRUFBRSxFQUFFO0FBQ2xELGlCQUFPLE9BQU8sS0FBSyxnQkFBZ0IsaUJBQWlCLEtBQUs7QUFBQSxRQUM3RDtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNKO0FBekdzQjs7O0FDTHRCLGdCQUFlO0FBRVIsSUFBTSxXQUFOLE1BQU0sU0FBUTtBQUFBLEVBS1YsWUFBbUIsT0FBZTtBQUFmO0FBSjFCLFNBQU8sUUFBUTtBQUtYLFFBQUksVUFBQUMsUUFBRyxXQUFXLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLFNBQVMsR0FBRyxHQUFHO0FBQzVELGVBQVM7QUFBQSxJQUNiLFdBQVcsVUFBQUEsUUFBRyxXQUFXLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLFNBQVMsR0FBRyxHQUFHO0FBQ25FLGVBQVM7QUFBQSxJQUNiO0FBRUEsU0FBSyxPQUFPLFVBQUFBLFFBQUcsS0FBSyxLQUFLLEtBQUs7QUFDOUIsU0FBSyxXQUFXLFVBQUFBLFFBQUcsV0FBVyxLQUFLLEtBQUssRUFBRTtBQUFBLEVBQzlDO0FBQUEsRUFFTyxVQUFVO0FBQ2IsU0FBSztBQUFBLEVBQ1Q7QUFDSjtBQW5CcUI7QUFBZCxJQUFNLFVBQU47QUFGUDtBQXNDTyxJQUFNLGFBQU4sTUFBTSxXQUFVO0FBQUEsRUFNWixZQUFtQixRQUEwQjtBQUExQjtBQUwxQixTQUFPLFNBQW9CLENBQUM7QUFDNUIsU0FBTyxXQUFXLG9CQUFJLElBQW9CO0FBQzFDLFNBQU8sbUJBQW1CO0FBQzFCLGlDQUFXO0FBR1AsV0FBTyxZQUFQLE9BQU8sVUFBWSxDQUFDO0FBQ3BCLFNBQUssU0FBUyxPQUFPLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRLEtBQUssQ0FBQztBQUM3RCxTQUFLLG1CQUFtQixPQUFPLGNBQWM7QUFBQSxFQUNqRDtBQUFBLEVBRU8sUUFBdUM7QUFDMUMsVUFBTSxRQUFRLEtBQUssT0FBTyxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQzdELFFBQUksQ0FBQyxPQUFPO0FBQ1IsWUFBTSxJQUFJLE1BQU0sd0JBQXdCO0FBQUEsSUFDNUM7QUFFQSxVQUFNLFNBQVMsV0FBVSxZQUFZLE1BQU0sTUFBTSxNQUFNLFFBQVE7QUFFL0QsUUFBSSxLQUFLLG1CQUFtQixNQUFNLEdBQUc7QUFDakMsVUFBSSx1QkFBSyxVQUFMLE1BQWtCLEtBQUssa0JBQWtCO0FBQ3pDLDJCQUFLLFVBQVc7QUFDaEIsY0FBTSxJQUFJLE1BQU0sMkNBQTJDO0FBQUEsTUFDL0Q7QUFFQSxhQUFPLEtBQUssTUFBTTtBQUFBLElBQ3RCO0FBRUEsdUJBQUssVUFBVztBQUNoQixVQUFNLFFBQVE7QUFDZCxXQUFPLEVBQUUsSUFBSSxRQUFRLFFBQVEsVUFBQUEsUUFBRyxXQUFXLE1BQU0sSUFBSSxJQUFJLEVBQUU7QUFBQSxFQUMvRDtBQUFBLEVBRU8sbUJBQW1CQSxLQUFZO0FBQ2xDLFdBQU8sS0FBSyxTQUFTLElBQUlBLEdBQUUsS0FBSyxDQUFDLENBQUMsS0FBSyxPQUFPLFNBQVMsU0FBU0EsR0FBRTtBQUFBLEVBQ3RFO0FBQUEsRUFFTyxVQUFVQSxLQUFZO0FBQ3pCLFVBQU0sa0JBQWtCLEtBQUssU0FBUyxJQUFJQSxHQUFFLEtBQUs7QUFFakQsU0FBSyxTQUFTLElBQUlBLEtBQUksa0JBQWtCLENBQUM7QUFBQSxFQUM3QztBQUFBLEVBRUEsT0FBYyxZQUFZLFNBQWlCLE9BQWdCLEtBQWM7QUFJckUsVUFBTSxRQUFRLFVBQUFBLFFBQUcsU0FBUyxPQUFPO0FBQ2pDLFVBQU0sT0FBTyxNQUFNLFdBQVc7QUFDOUIsVUFBTSxXQUFXO0FBRWpCLFlBQVEsU0FBUztBQUNqQixVQUFNLE9BQU8sUUFBUSxjQUFjLE1BQU0sTUFBTSxTQUFTO0FBRXhELGFBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsVUFBSSxNQUFNLElBQUk7QUFFZCxVQUFJLE1BQU0sV0FBVyxTQUFTLE9BQU8sS0FBSztBQUN0QztBQUFBLE1BQ0o7QUFFQSxVQUFJLElBQUksTUFBTSxDQUFDO0FBRWYsZUFBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLEtBQUs7QUFDL0IsWUFBSSxPQUFPLFNBQVMsTUFBTSxLQUFLO0FBQzNCLGdCQUFNLFNBQVMsV0FBVyxJQUFJO0FBQzlCLGdCQUFNLFVBQVUsS0FBSztBQUNyQixjQUFJLEtBQUssT0FBTyxJQUFJLEtBQUs7QUFDckIsaUJBQUs7QUFBQSxVQUNULE9BQU87QUFDSCxpQkFBSyxDQUFDO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFDQTtBQUFBLE1BQ0o7QUFFQSxZQUFNLENBQUMsSUFBSTtBQUFBLElBQ2Y7QUFFQSxVQUFNLE9BQU8sQ0FBQztBQUVkLGFBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsVUFBSSxNQUFNO0FBQ04sWUFBSSxJQUFJLE1BQU0sR0FBRztBQUNiLGVBQUssS0FBSyxDQUFDLEtBQU0sTUFBTSxDQUFDLEtBQUssV0FBWSxNQUFNLElBQUksQ0FBQyxHQUFHLFNBQVMsRUFBRTtBQUFBLFFBQ3RFO0FBQUEsTUFDSixPQUFPO0FBQ0gsYUFBSyxDQUFDLElBQUksTUFBTSxDQUFDO0FBQUEsTUFDckI7QUFBQSxJQUNKO0FBRUEsV0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEdBQUc7QUFBQSxFQUNyQztBQUNKO0FBMUZJO0FBSm1CO0FBQWhCLElBQU0sWUFBTjs7O0FGcEJQLElBQU0sYUFBYSxPQUFPLGdDQUFnQztBQWxCMUQ7QUF1Q08sSUFBTSxVQUFOLE1BQU0sZ0JBQWUsb0JBQWtDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBc0JuRCxZQUFZLFFBQWdCLFVBQTZCLENBQUMsR0FBRztBQUVoRSxRQUFJLENBQUMsUUFBUSxrQkFBa0IsY0FBYztBQUFRLGFBQWEsUUFBUSxVQUFVO0FBRXBGLFVBQU0sQ0FBQyxPQUFPLENBQUM7QUF6Qm5CLHFDQUFlO0FBQ2Ysa0RBQTRCLEtBQUssaUJBQWlCLEtBQUssSUFBSTtBQUMzRDtBQUNBO0FBQ0EsNENBQXlDO0FBR3pDLFNBQWdCLEtBQUssOEJBQWMsU0FBUyxFQUFFLFNBQVM7QUFHdkQsU0FBTyxRQUFRLElBQUksaUJBQWlCLElBQUk7QUFDeEMsU0FBZ0IsYUFBYSxJQUFJLFdBQVcsSUFBSTtBQUNoRCxTQUFPLGFBQWEsSUFBSSwwQkFBMEIsSUFBSTtBQUN0RCxTQUFPLFNBQVMsSUFBSSxvQkFBc0MsQ0FBQyxTQUFTLGFBQWEsQ0FBQztBQUNsRixTQUFPLGVBQWlDO0FBaUJwQyxTQUFLLFNBQVM7QUFFZCxVQUFNLE1BQU0sS0FBSyxPQUFPLFFBQVEsbUJBQW1CLGtDQUFrQixLQUFLLE9BQU8sUUFBUSxVQUFVLElBQUksZ0NBQWdCLEtBQUssT0FBTyxRQUFRLE9BQU87QUFFbEosUUFBSSxDQUFDLElBQUksSUFBSSxnQ0FBZ0IsTUFBTSxnQkFBZ0IsR0FBRztBQUNsRCxXQUFLLEtBQUssK0NBQStDLHdCQUF3QjtBQUFBLElBQ3JGO0FBRUEsU0FBSyxVQUFVO0FBQUEsTUFDWCx1QkFBdUI7QUFBQSxNQUN2QixpQkFBaUIsQ0FBQztBQUFBLE1BQ2xCLGlCQUFpQixDQUFDO0FBQUEsTUFDbEIsbUJBQW1CO0FBQUEsTUFDbkIsWUFBWTtBQUFBLE1BQ1osWUFBWSxRQUFRLGVBQWUsT0FBTyxPQUFPLFFBQVEsY0FBYyxJQUFJLFdBQVcsSUFBSTtBQUFBLE1BQzFGLGlCQUFpQjtBQUFBLE1BQ2pCLFlBQVk7QUFBQSxNQUNaLGNBQWM7QUFBQSxNQUNkLEdBQUc7QUFBQSxNQUNILGFBQWE7QUFBQSxRQUNULGVBQWUsS0FBSztBQUFBLFFBQ3BCLEdBQUcsUUFBUTtBQUFBLE1BQ2Y7QUFBQSxJQUNKO0FBRUEsU0FBSyxPQUFPLEdBQUcsb0JBQW9CLG1CQUFLLDBCQUF5QjtBQUVqRSxRQUFJLE9BQU8sS0FBSyxRQUFRLGVBQWUsWUFBWSxLQUFLLFFBQVEsYUFBYSxHQUFHO0FBQzVFLHlCQUFLLHFCQUFzQixZQUFZLE1BQU07QUFDekMsY0FBTSxRQUFRLFlBQVksSUFBSTtBQUM5QiwyQkFBSyxvQkFBcUIsV0FBVyxNQUFNO0FBQ3ZDLDZCQUFLLGNBQWUsWUFBWSxJQUFJLElBQUk7QUFDeEMsY0FBSSxLQUFLO0FBQWEsaUJBQUssTUFBTSxxQ0FBcUMsbUJBQUssYUFBWSxJQUFJO0FBQUEsUUFDL0YsR0FBRyxDQUFDLEVBQUUsTUFBTTtBQUFBLE1BQ2hCLEdBQUcsS0FBSyxRQUFRLFVBQVUsRUFBRSxNQUFNO0FBQUEsSUFDdEM7QUFFQSxRQUFJLEtBQUssUUFBUSxVQUFVO0FBQ3ZCLFdBQUssZUFBZSxJQUFJLFVBQVUsS0FBSyxRQUFRLFFBQVE7QUFBQSxJQUMzRDtBQUVBLElBQVcsVUFBVSxJQUFJO0FBRXpCLFFBQUksRUFBRSxjQUFjLFVBQVM7QUFDekIsYUFBTyxlQUFlLFNBQVEsWUFBWTtBQUFBLFFBQ3RDLE9BQU87QUFBQSxRQUNQLFVBQVU7QUFBQSxRQUNWLGNBQWM7QUFBQSxRQUNkLFlBQVk7QUFBQSxNQUNoQixDQUFDO0FBQUEsSUFDTDtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sbUJBQW1CQyxVQUE0QjtBQUNsRCx1QkFBSyxxQkFBc0JBO0FBQUEsRUFDL0I7QUFBQSxFQUVPLE1BQU0sR0FBVztBQUNwQixXQUFPLEtBQUssS0FBSyxTQUFTLENBQUM7QUFBQSxFQUMvQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE9BQWMsVUFBVSxRQUFnQixVQUFxRCxDQUFDLEdBQUc7QUFDN0YsV0FBTyxJQUFJLFFBQU8sUUFBUTtBQUFBLE1BQ3RCLEdBQUc7QUFBQSxNQUNILGdCQUFnQjtBQUFBLElBQ3BCLENBQUM7QUFBQSxFQUNMO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsT0FBYyxPQUFPLFFBQWdCLFVBQXFELENBQUMsR0FBRztBQUMxRixXQUFPLElBQUksUUFBTyxRQUFRO0FBQUEsTUFDdEIsR0FBRztBQUFBLE1BQ0gsZ0JBQWdCO0FBQUEsSUFDcEIsQ0FBQztBQUFBLEVBQ0w7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE9BQWMsZ0JBQWdCO0FBQzFCLFdBQWtCLFdBQVc7QUFBQSxFQUNqQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBYyxrQkFBa0I7QUFDNUIsV0FBa0IsVUFBVSxNQUFNO0FBQUEsRUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsYUFBYTtBQUNwQixXQUFPLEtBQUssUUFBUSxjQUFjO0FBQUEsRUFDdEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQVcsU0FBUztBQUNoQixXQUFPLEtBQUs7QUFBQSxFQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLElBQVcsZUFBZTtBQUN0QixXQUFPLG1CQUFLO0FBQUEsRUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXVCTyxxQkFBcUI7QUFDeEIsV0FBTztBQUFBLE1BQ0gsV0FBc0IsVUFBVTtBQUFBLE1BQ2hDLGFBQWEsS0FBSyxPQUFPLE1BQU07QUFBQSxNQUMvQixtQkFBbUIsS0FBSyxjQUFjO0FBQUEsTUFDdEMsUUFBUSxLQUFLLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDM0Q7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLE1BQWEsVUFBVTtBQUNuQixTQUFLLE1BQU0sTUFBTSxRQUFRLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQztBQUNoRCxTQUFLLE9BQU8sSUFBSSxvQkFBb0IsbUJBQUssMEJBQXlCO0FBQ2xFLFNBQUssbUJBQW1CO0FBQ3hCLFNBQUssT0FBTyxtQkFBbUI7QUFDL0IsVUFBTSxLQUFLLFdBQVcsY0FBYztBQUNwQyxRQUFJLG1CQUFLO0FBQXFCLG9CQUFjLG1CQUFLLG9CQUFtQjtBQUNwRSxRQUFJLG1CQUFLO0FBQW9CLG9CQUFjLG1CQUFLLG1CQUFrQjtBQUNsRSxJQUFXLFlBQVksSUFBSTtBQUFBLEVBQy9CO0FBQUEsRUFFUSxrQkFBa0IsVUFBc0IsVUFBc0I7QUFDbEUsVUFBTSxRQUFRLEtBQUssTUFBTSxJQUFJLFNBQVMsTUFBTSxFQUFFO0FBQzlDLFFBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxjQUFjLENBQUMsTUFBTTtBQUFTO0FBR25ELFVBQU0sYUFBYSxLQUFLLE9BQU8sS0FBSyxnQkFBZ0Isa0JBQWtCLE9BQU8sVUFBVSxRQUFRO0FBRS9GLFFBQUksY0FBYyxDQUFDLEtBQUssUUFBUTtBQUF1QjtBQUV2RCxXQUFPLG1CQUFLLHFCQUFMLFdBQXlCLE1BQU0sT0FBTyxVQUFVO0FBQUEsRUFDM0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFnQk8saUJBQWlCLFVBQXNCLFVBQTRCO0FBQ3RFLFNBQUssa0JBQWtCLFVBQVUsUUFBUTtBQUFBLEVBQzdDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyx3QkFBd0I7QUFDM0IsU0FBSyxRQUFRLHdCQUF3QjtBQUFBLEVBQ3pDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTywwQkFBMEI7QUFDN0IsU0FBSyxRQUFRLHdCQUF3QjtBQUFBLEVBQ3pDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyw0QkFBNEI7QUFDL0IsV0FBTyxDQUFDLENBQUMsS0FBSyxRQUFRO0FBQUEsRUFDMUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFtQkEsTUFBYSxLQUFrQixTQUFzQyxPQUFrQixVQUEyQyxDQUFDLEdBQStDO0FBQzlLLFVBQU0sS0FBSyxLQUFLLE9BQU8sU0FBUyxRQUFRLE9BQU87QUFDL0MsUUFBSSxDQUFDLElBQUksYUFBYTtBQUFHLFlBQU0sV0FBVyxxQkFBcUIsV0FBVyxxQkFBcUIsQ0FBQyxLQUFLLGNBQWMsZ0JBQWdCLEdBQUcsSUFBSSxFQUFFO0FBRTVJLFVBQU0saUJBQWlCLGlCQUFpQixlQUFlLFFBQVEsTUFBTSxLQUFLLE9BQU8sT0FBTyxPQUFPO0FBQy9GLFVBQU0sU0FBVSxNQUFNLFFBQVEsY0FBYyxjQUFjLEtBQU07QUFDaEUsUUFBSSxPQUFPLFFBQVEsR0FBRztBQUNsQixZQUFNLFdBQVcsY0FBYyx5QkFBeUIsS0FBSyxpQkFBaUIsT0FBTyxXQUFXLGNBQWMsS0FBSyxHQUFHO0FBQUEsSUFDMUg7QUFFQSxVQUFNLFFBQVEsS0FBSyxNQUFNLE9BQU8sR0FBRyxPQUFPLFFBQVEsV0FBVztBQUU3RCxRQUFJLEtBQUs7QUFBYSxXQUFLLE1BQU0sb0NBQW9DO0FBQ3JFLFVBQU0sUUFBUSxNQUFNLFdBQVcsUUFBUSxFQUFFLFFBQVEsUUFBUSxPQUFPLENBQUM7QUFDakUsUUFBSSxLQUFLO0FBQWEsV0FBSyxNQUFNLHNCQUFzQixNQUFNLEVBQUUsNkJBQTZCO0FBRTVGLFFBQUksS0FBSztBQUFhLFdBQUssTUFBTSxrREFBa0Q7QUFDbkYsVUFBTSxNQUFNLFFBQVE7QUFDcEIsUUFBSSxLQUFLO0FBQWEsV0FBSyxNQUFNLHNCQUFzQixNQUFNLEVBQUUsZ0JBQWdCO0FBRS9FLFFBQUk7QUFDQSxVQUFJLENBQUMsTUFBTTtBQUFTLGNBQU0sTUFBTSxRQUFRLElBQUksUUFBUSxpQkFBaUI7QUFFckUsVUFBSSxDQUFDLE9BQU8sVUFBVTtBQUNsQixjQUFNLFNBQVMsT0FBTyxPQUFPLENBQUMsQ0FBQztBQUFBLE1BQ25DLE9BQU87QUFDSCxjQUFNLFNBQVMsT0FBTyxRQUFRO0FBQUEsTUFDbEM7QUFDQSxVQUFJLENBQUMsTUFBTSxVQUFVO0FBQUcsY0FBTSxNQUFNLEtBQUssS0FBSyxNQUFNLFFBQVEsa0JBQWtCO0FBQUEsSUFDbEYsVUFBRTtBQUNFLFVBQUksS0FBSztBQUFhLGFBQUssTUFBTSxtREFBbUQ7QUFDcEYsWUFBTSxXQUFXLFFBQVE7QUFBQSxJQUM3QjtBQUVBLFdBQU87QUFBQSxNQUNILE9BQU8sT0FBTyxPQUFPLENBQUM7QUFBQSxNQUN0QixXQUFXLE9BQU87QUFBQSxNQUNsQixjQUFjO0FBQUEsTUFDZDtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFjQSxNQUFhLE9BQU8sYUFBaUUsVUFBeUIsQ0FBQyxHQUEwQjtBQUNySSxRQUFJLHVCQUF1QjtBQUFjLGFBQU87QUFFaEQsUUFBSSxRQUFRLGVBQWU7QUFBTSxjQUFRLGNBQWMsS0FBSyxPQUFPLE1BQU0sUUFBUSxRQUFRLFdBQVc7QUFDcEcsWUFBUSxvQkFBUixRQUFRLGtCQUFvQixLQUFLLFFBQVE7QUFDekMsWUFBUSx5QkFBUixRQUFRLHVCQUF5QixVQUFVO0FBRTNDLFFBQUksdUJBQXVCLE9BQU87QUFDOUIsYUFBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLFFBQzFCLFVBQVUsWUFBWSxZQUFZO0FBQUEsUUFDbEMsUUFBUSxDQUFDLFdBQVc7QUFBQSxRQUNwQixPQUFPLFlBQVk7QUFBQSxRQUNuQixXQUFXLFlBQVk7QUFBQSxRQUN2QixXQUFXLFlBQVk7QUFBQSxRQUN2QixhQUFhLFFBQVE7QUFBQSxNQUN6QixDQUFDO0FBQUEsSUFDTDtBQUVBLFFBQUksdUJBQXVCLFVBQVU7QUFDakMsYUFBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLFFBQzFCLFVBQVU7QUFBQSxRQUNWLFFBQVEsWUFBWTtBQUFBLFFBQ3BCLE9BQU8sWUFBWTtBQUFBLFFBQ25CLFdBQVcsWUFBWSxPQUFPLENBQUMsR0FBRztBQUFBLFFBQ2xDLFdBQVcsVUFBVTtBQUFBLFFBQ3JCLGFBQWEsUUFBUTtBQUFBLE1BQ3pCLENBQUM7QUFBQSxJQUNMO0FBRUEsUUFBSSxNQUFNLFFBQVEsV0FBVyxHQUFHO0FBQzVCLFlBQU0sU0FBUyxZQUFZLE9BQU8sQ0FBQyxNQUFNLGFBQWEsS0FBSztBQUMzRCxhQUFPLElBQUksYUFBYSxNQUFNO0FBQUEsUUFDMUIsVUFBVTtBQUFBLFFBQ1Y7QUFBQSxRQUNBLE9BQU87QUFBQSxRQUNQLFdBQVc7QUFBQSxRQUNYLFdBQVcsVUFBVTtBQUFBLFFBQ3JCLGFBQWEsUUFBUTtBQUFBLE1BQ3pCLENBQUM7QUFBQSxJQUNMO0FBRUEsUUFBSSxLQUFLO0FBQWEsV0FBSyxNQUFNLGFBQWEsV0FBVyxFQUFFO0FBRTNELFFBQUksWUFBa0MsTUFDbEMsV0FBMEI7QUFFOUIsWUFBUSxpQkFBUixRQUFRLGVBQWlCLFVBQVU7QUFDbkMsWUFBUSx5QkFBUixRQUFRLHVCQUF5QixVQUFVO0FBRTNDLFFBQUksS0FBSztBQUFhLFdBQUssTUFBTSx3QkFBd0IsUUFBUSxZQUFZLG1DQUFtQyxRQUFRLG9CQUFvQixFQUFFO0FBRTlJLFFBQUksUUFBUSxLQUFLLFdBQVcsR0FBRztBQUMzQixZQUFNLENBQUMsY0FBYyxHQUFHQyxNQUFLLElBQUksWUFBWSxNQUFNLEdBQUc7QUFDdEQsVUFBSSxLQUFLO0FBQWEsYUFBSyxNQUFNLFlBQVksWUFBWSxvQkFBb0I7QUFFN0UsWUFBTSxvQkFBb0IsS0FBSyxXQUFXLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFdBQVcsV0FBVyxFQUFFLFVBQVUsS0FBSyxFQUFFLFVBQVUsU0FBUyxZQUFZLENBQUM7QUFFM0ksVUFBSSxtQkFBbUI7QUFDbkIsWUFBSSxLQUFLO0FBQWEsZUFBSyxNQUFNLFlBQVksWUFBWSxvQkFBb0Isa0JBQWtCLFVBQVUsYUFBYTtBQUN0SCxvQkFBWTtBQUNaLHNCQUFjQSxPQUFNLEtBQUssR0FBRztBQUM1QixtQkFBVztBQUFBLE1BQ2YsT0FBTztBQUNILFlBQUksS0FBSztBQUFhLGVBQUssTUFBTSw2Q0FBNkMsWUFBWSxnREFBZ0Q7QUFBQSxNQUM5STtBQUFBLElBQ0o7QUFFQSxVQUFNLGFBQWEsTUFBTSxjQUFjLFdBQVcsV0FBVztBQUM3RCxVQUFNLEVBQUUsTUFBTSxXQUFXLE1BQU0sSUFDM0IsUUFBUSxpQkFBaUIsVUFBVSxPQUFPLGNBQWMsUUFBUSxZQUFZLFFBQVEsb0JBQW9CLElBQUssRUFBRSxNQUFNLFFBQVEsY0FBYyxPQUFPLFdBQVc7QUFFakssUUFBSSxLQUFLO0FBQWEsV0FBSyxNQUFNLDRCQUE0QixTQUFTLEdBQUcsYUFBYSxXQUFXLDJEQUEyRCxFQUFFLEVBQUU7QUFHaEssUUFBSSxRQUFRLGFBQWEsV0FBVyxNQUFNLEdBQUc7QUFDekMsVUFBSSxLQUFLO0FBQWEsYUFBSyxNQUFNLFdBQVcsUUFBUSxhQUFhLFVBQVUsQ0FBQyxDQUFDLGVBQWU7QUFDNUYsa0JBQVksS0FBSyxXQUFXLElBQUksUUFBUSxhQUFhLFVBQVUsQ0FBQyxDQUFDO0FBQ2pFLFVBQUksQ0FBQztBQUNELGVBQU8sSUFBSSxhQUFhLE1BQU07QUFBQSxVQUMxQjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxhQUFhLFFBQVE7QUFBQSxRQUN6QixDQUFDO0FBQUEsSUFDVDtBQUdBLFFBQUksQ0FBQyxXQUFXO0FBRVosVUFBSSxDQUFDLFFBQVEsYUFBYTtBQUN0QixZQUFJLEtBQUs7QUFBYSxlQUFLLE1BQU0sbUJBQW1CO0FBQ3BELGNBQU1DLE9BQU0sTUFBTSxLQUFLLFlBQVksUUFBUTtBQUFBLFVBQ3ZDO0FBQUEsVUFDQTtBQUFBLFVBQ0EsYUFBYSxRQUFRO0FBQUEsUUFDekIsQ0FBQztBQUVELFlBQUlBLE1BQUssVUFBVSxHQUFHO0FBQ2xCLGNBQUksS0FBSztBQUFhLGlCQUFLLE1BQU0sdUJBQXVCLEtBQUssRUFBRTtBQUMvRCxpQkFBT0E7QUFBQSxRQUNYO0FBRUEsWUFBSSxLQUFLO0FBQWEsZUFBSyxNQUFNLHdCQUF3QixLQUFLLEVBQUU7QUFBQSxNQUNwRTtBQUVBLFVBQUksS0FBSztBQUFhLGFBQUssTUFBTSx5QkFBeUI7QUFHMUQsbUJBRVEsTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLFFBQVE7QUFDckMsWUFBSSxRQUFRLGlCQUFpQixTQUFTLElBQUksVUFBVTtBQUFHLGlCQUFPO0FBQzlELGVBQU8sSUFBSSxTQUFTLE9BQU8sU0FBNEI7QUFBQSxNQUMzRCxDQUFDLElBQ0YsYUFBYTtBQUFBLElBQ3hCO0FBR0EsUUFBSSxDQUFDLFdBQVc7QUFDWixVQUFJLEtBQUs7QUFBYSxhQUFLLE1BQU0sc0NBQXNDO0FBQ3ZFLGFBQU8sSUFBSSxhQUFhLE1BQU07QUFBQSxRQUMxQjtBQUFBLFFBQ0E7QUFBQSxRQUNBLGFBQWEsUUFBUTtBQUFBLE1BQ3pCLENBQUM7QUFBQSxJQUNMO0FBRUEsUUFBSSxLQUFLO0FBQWEsV0FBSyxNQUFNLGtDQUFrQyxVQUFVLFVBQVUsZUFBZTtBQUN0RyxVQUFNLE1BQU0sTUFBTSxVQUNiLE9BQU8sT0FBTztBQUFBLE1BQ1gsTUFBTTtBQUFBLE1BQ04sYUFBYSxRQUFRO0FBQUEsTUFDckIsZ0JBQWdCLFFBQVE7QUFBQSxNQUN4QjtBQUFBLElBQ0osQ0FBQyxFQUNBLE1BQU0sTUFBTSxJQUFJO0FBRXJCLFFBQUksS0FBSztBQUNMLFVBQUksS0FBSztBQUFhLGFBQUssTUFBTSxnQ0FBZ0M7QUFDakUsWUFBTUMsVUFBUyxJQUFJLGFBQWEsTUFBTTtBQUFBLFFBQ2xDO0FBQUEsUUFDQTtBQUFBLFFBQ0EsVUFBVSxJQUFJO0FBQUEsUUFDZCxRQUFRLElBQUk7QUFBQSxRQUNaO0FBQUEsUUFDQSxhQUFhLFFBQVE7QUFBQSxNQUN6QixDQUFDO0FBRUQsVUFBSSxDQUFDLFFBQVEsYUFBYTtBQUN0QixZQUFJLEtBQUs7QUFBYSxlQUFLLE1BQU0seUJBQXlCO0FBQzFELGNBQU0sS0FBSyxZQUFZLFFBQVFBLE9BQU07QUFBQSxNQUN6QztBQUVBLGFBQU9BO0FBQUEsSUFDWDtBQUVBLFFBQUksS0FBSztBQUFhLFdBQUssTUFBTSwrRUFBK0U7QUFDaEgsVUFBTSxTQUFTLE1BQU0sS0FBSyxXQUFXO0FBQUEsTUFDakMsT0FBTyxRQUNILENBQUMsUUFBUSxpQkFBaUIsU0FBUyxJQUFJLFVBQVUsS0FDaEQsTUFBTSxJQUFJLFNBQVMsS0FBSyxLQUN6QixJQUFJLE9BQU8sT0FBTztBQUFBLFFBQ2QsTUFBTTtBQUFBLFFBQ04sYUFBYSxRQUFRO0FBQUEsUUFDckIsZ0JBQWdCLFFBQVE7QUFBQSxRQUN4QjtBQUFBLE1BQ0osQ0FBQztBQUFBLElBQ1Q7QUFDQSxRQUFJLENBQUMsUUFBUSxRQUFRO0FBQ2pCLFVBQUksS0FBSztBQUFhLGFBQUssTUFBTSx3Q0FBd0MsUUFBUSxVQUFVLGNBQWMsS0FBSyxhQUFhO0FBQzNILGFBQU8sSUFBSSxhQUFhLE1BQU07QUFBQSxRQUMxQjtBQUFBLFFBQ0E7QUFBQSxRQUNBLGFBQWEsUUFBUTtBQUFBLFFBQ3JCLFdBQVcsUUFBUTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNMO0FBRUEsUUFBSSxLQUFLO0FBQWEsV0FBSyxNQUFNLHVDQUF1QyxPQUFPLFVBQVUsVUFBVSxHQUFHO0FBRXRHLFVBQU0sT0FBTyxJQUFJLGFBQWEsTUFBTTtBQUFBLE1BQ2hDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsVUFBVSxPQUFPLE9BQU87QUFBQSxNQUN4QixRQUFRLE9BQU8sT0FBTztBQUFBLE1BQ3RCLFdBQVcsT0FBTztBQUFBLE1BQ2xCLGFBQWEsUUFBUTtBQUFBLElBQ3pCLENBQUM7QUFFRCxRQUFJLENBQUMsUUFBUSxhQUFhO0FBQ3RCLFVBQUksS0FBSztBQUFhLGFBQUssTUFBTSx5QkFBeUI7QUFDMUQsWUFBTSxLQUFLLFlBQVksUUFBUSxJQUFJO0FBQUEsSUFDdkM7QUFFQSxXQUFPO0FBQUEsRUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVPLFdBQVc7QUFDZCxVQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUU7QUFDMUIsVUFBTSxVQUFVLFNBQVMsYUFBYSxRQUFRLFVBQVUsYUFBYSxTQUFTO0FBQzlFLFVBQU0sYUFBYTtBQUFBLE1BQ2Y7QUFBQSxNQUNBO0FBQUEsTUFDQSxxQkFBcUIsUUFBTyxPQUFPO0FBQUEsTUFDbkMsbUJBQW1CLHFCQUFBQyxPQUFhO0FBQUEsTUFDaEMsaUJBQWlCLGdCQUFBQyxPQUFVO0FBQUEsTUFDM0IsbUJBQW1CLFFBQVEsT0FBTyx1QkFBdUIsT0FBTyxlQUFlLFFBQVEsUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUFBLE9BQy9HLE1BQU07QUFDSCxZQUFJLEtBQUssUUFBUTtBQUFpQixpQkFBTztBQUN6QyxjQUFNLE9BQU8sc0JBQU8sV0FBVztBQUMvQixZQUFJLENBQUM7QUFBTSxpQkFBTztBQUVsQixlQUFPLENBQUMsYUFBYSxLQUFLLE9BQU8sSUFBSSxjQUFjLEtBQUssT0FBTyxJQUFJLGFBQWEsS0FBSyxRQUFRLElBQUksY0FBYyxLQUFLLFNBQVUsU0FBUyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJO0FBQUEsTUFDM0ssR0FBRztBQUFBLE1BQ0g7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsS0FBSyxXQUFXLE1BQ1gsSUFBSSxDQUFDLE1BQU07QUFDUixlQUFPLEVBQUU7QUFBQSxNQUNiLENBQUMsRUFDQSxLQUFLLElBQUksS0FBSztBQUFBLE1BQ25CO0FBQUEsVUFDQSwrQ0FBeUI7QUFBQSxJQUM3QjtBQUVBLFdBQU8sV0FBVyxLQUFLLElBQUk7QUFBQSxFQUMvQjtBQUFBLEVBRUEsRUFBUyxPQUFPLFFBQVEsSUFBSTtBQUN4QixXQUFPLEtBQUssTUFBTSxNQUFNLE9BQU87QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNTyxlQUFlLE1BQXdCO0FBQzFDLFdBQU8sSUFBSSxTQUFTLE1BQU0sSUFBSTtBQUFBLEVBQ2xDO0FBQ0o7QUEvakJJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMMEQ7QUFBakQsUUFNYyxVQUFrQjtBQU5oQyxRQU9LLGdCQUFnQjtBQVAzQixJQUFNLFNBQU47OztBR25DUCxJQUFNLHVCQUF1QjtBQUV0QixJQUFNLFlBQVksNkJBQU07QUFDM0IsU0FBTyxVQUFVLElBQUksb0JBQW9CLEtBQUssVUFBVSxNQUFNLEtBQUs7QUFDdkUsR0FGeUI7QUFXbEIsSUFBTSxXQUFXLHdCQUFjLFNBQXlCO0FBQzNELFFBQU0sU0FBUyxVQUFVO0FBQ3pCLE1BQUksQ0FBQztBQUFRLFdBQU87QUFFcEIsU0FBUSxPQUFPLE1BQU0sUUFBUSxJQUFJLEtBQXVCO0FBQzVELEdBTHdCO0FBZ0JqQixTQUFTLFdBQStELE1BQXdCO0FBQ25HLFNBQU8sS0FBSztBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0osQ0FBQztBQUNMO0FBTmdCOzs7QUMxQlQsU0FBUyxXQUEyQixNQUFzQjtBQUM3RCxRQUFNLFFBQVEsU0FBZSxJQUFJO0FBQ2pDLE1BQUksQ0FBQztBQUFPLFdBQU87QUFFbkIsU0FBTyxNQUFNO0FBQ2pCO0FBTGdCOzs7QUNBVCxTQUFTLFVBQTBCLE1BQXNCO0FBQzVELFFBQU0sUUFBUSxTQUFlLElBQUk7QUFDakMsTUFBSSxDQUFDO0FBQU8sV0FBTztBQUVuQixTQUFPLE1BQU07QUFDakI7QUFMZ0I7OztBQ0FULFNBQVMsU0FBeUIsTUFBc0I7QUFDM0QsUUFBTSxRQUFRLFNBQWUsSUFBSTtBQUNqQyxNQUFJLENBQUM7QUFBTyxXQUFPO0FBRW5CLFNBQU87QUFDWDtBQUxnQjs7O0FDQ1QsU0FBUyxrQkFBa0I7QUFDOUIsT0FBSyxLQUFLLHNFQUFzRSxvQkFBb0I7QUFDcEcsU0FBTyxjQUFjO0FBQ3pCO0FBSGdCO0FBUVQsU0FBUyxnQkFBZ0I7QUFDNUIsUUFBTSxXQUFXLFVBQVU7QUFDM0IsTUFBSSxDQUFDLFVBQVU7QUFDWCxVQUFNLFdBQVcsNEJBQTRCLGlCQUFpQiwwRkFBMEY7QUFBQSxFQUM1SjtBQUVBLFNBQU87QUFDWDtBQVBnQjs7O0FDTlQsU0FBUyxZQUF5QixNQUFzQjtBQUMzRCxRQUFNLFFBQVEsU0FBWSxJQUFJO0FBQzlCLFFBQU0sU0FBUyx3QkFBQyxhQUFpQztBQUM3QyxRQUFJLE9BQU87QUFDUCxVQUFJLFNBQVMsV0FBVyxRQUFRO0FBQUcsZUFBTyxNQUFNLFlBQVksU0FBUyxNQUFNLFFBQVEsQ0FBQztBQUNwRixhQUFPLE1BQU0sWUFBWSxRQUFRO0FBQUEsSUFDckM7QUFBQSxFQUNKLEdBTGU7QUFPZixRQUFNLFNBQVMsNkJBQU07QUFDakIsV0FBTyxPQUFPO0FBQUEsRUFDbEIsR0FGZTtBQUlmLFNBQU8sQ0FBQyxRQUFRLE1BQU07QUFDMUI7QUFkZ0I7OztBQ0VULFNBQVMsWUFBWSxNQUFzQixTQUE4QztBQUM1RixRQUFNLFFBQVEsU0FBUyxJQUFJO0FBQzNCLE1BQUksQ0FBQztBQUFPLFdBQU87QUFFbkIsU0FBTyxPQUFPLGtCQUFrQjtBQUFBLElBQzVCLElBQUksWUFBWTtBQUNaLGFBQU8sTUFBTSxLQUFLLGFBQWEsU0FBUyxhQUFhO0FBQUEsSUFDekQ7QUFBQSxJQUNBLElBQUksU0FBUztBQUNULGFBQU8sTUFBTSxLQUFLO0FBQUEsSUFDdEI7QUFBQSxJQUNBLElBQUksU0FBUztBQUNULGFBQU8sTUFBTSxLQUFLLFNBQVM7QUFBQSxJQUMvQjtBQUFBLElBQ0EsSUFBSSxRQUFRO0FBQ1IsYUFBTyxNQUFNO0FBQUEsSUFDakI7QUFBQSxJQUNBLFFBQVE7QUFDSixhQUFPLE1BQU0sS0FBSyxNQUFNO0FBQUEsSUFDNUI7QUFBQSxJQUNBLFNBQVM7QUFDTCxhQUFPLE1BQU0sS0FBSyxPQUFPO0FBQUEsSUFDN0I7QUFBQSxJQUNBLFVBQVUsS0FBYTtBQUNuQixhQUFPLE1BQU0sS0FBSyxVQUFVLEdBQUc7QUFBQSxJQUNuQztBQUFBLElBQ0EsTUFBTSxZQUFZLE1BQWM7QUFDNUIsYUFBTyxNQUFNLEtBQUssS0FBSyxJQUFJO0FBQUEsSUFDL0I7QUFBQSxFQUNKLENBQUM7QUFDTDtBQTlCZ0I7OztBQ0xULFNBQVMsb0JBQW9CQyxVQUFxQztBQUNyRSxvQkFBa0IsRUFBRSxJQUFJLDBCQUEwQkEsUUFBTztBQUM3RDtBQUZnQjs7O0FDQVQsU0FBUyxxQkFBcUJDLFVBQXNDO0FBQ3ZFLG9CQUFrQixFQUFFLElBQUksMkJBQTJCQSxRQUFPO0FBQzlEO0FBRmdCOzs7QUNHVCxTQUFTLFVBQVUsTUFBc0I7QUFDNUMsUUFBTSxRQUFRLFNBQVMsSUFBSTtBQUMzQixRQUFNLFNBQVMsd0JBQUMsV0FBOEI7QUFDMUMsUUFBSSxPQUFPO0FBQ1AsVUFBSSxTQUFTLFdBQVcsTUFBTTtBQUFHLGVBQU8sTUFBTSxLQUFLLFVBQVUsT0FBTyxNQUFNLEtBQUssTUFBTSxDQUFDO0FBQ3RGLGFBQU8sTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUFBLElBQ3RDO0FBQUEsRUFDSixHQUxlO0FBT2YsUUFBTSxTQUFTLDZCQUFNO0FBQ2pCLFdBQU8sT0FBTyxLQUFLO0FBQUEsRUFDdkIsR0FGZTtBQUlmLFNBQU8sQ0FBQyxRQUFRLE1BQU07QUFDMUI7QUFkZ0I7OztBM0NZaEIsSUFBQUMsb0JBV087QUFDUCxJQUFBQyx1QkFBOEU7QUFHdkUsSUFBTSxVQUFrQjtBQUUvQixJQUFJLENBQUMsZ0JBQUFDLFFBQVcsV0FBVyxJQUFJLEdBQUc7QUFDOUIsVUFBUSxZQUFZLGVBQWUsZ0JBQUFBLE9BQVUseUNBQXlDLE9BQU8sb0NBQW9DO0FBQ3JJOyIsCiAgIm5hbWVzIjogWyJHdWlsZFF1ZXVlIiwgImltcG9ydF9kaXNjb3JkIiwgInRhcmdldCIsICJTZXJpYWxpemVkVHlwZSIsICJQbGF5ZXJFdmVudCIsICJRdWV1ZVJlcGVhdE1vZGUiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfc3RyZWFtIiwgInRhcmdldCIsICJxdWVyeSIsICJpbXBvcnRfcHJvbWlzZXMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAicHJpc20iLCAid2FpdEZvciIsICJvcHVzIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAicHJpc20iLCAiVHJhY2tTa2lwUmVhc29uIiwgInRhcmdldCIsICJHdWlsZFF1ZXVlIiwgImltcG9ydF91dGlscyIsICJHdWlsZFF1ZXVlIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9mZm1wZWciLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfZGlzY29yZCIsICJpcCIsICJoYW5kbGVyIiwgInF1ZXJ5IiwgInJlcyIsICJyZXN1bHQiLCAiZFZvaWNlVmVyc2lvbiIsICJkanNWZXJzaW9uIiwgImhhbmRsZXIiLCAiaGFuZGxlciIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiZGpzVmVyc2lvbiJdCn0K
|