bitmovin-player-ui 3.35.0 → 3.36.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/CHANGELOG.md +6 -0
- package/dist/js/bitmovinplayer-ui.js +18 -9
- package/dist/js/bitmovinplayer-ui.min.js +7 -7
- package/dist/js/bitmovinplayer-ui.min.js.map +1 -1
- package/dist/js/framework/components/seekbar.d.ts +5 -0
- package/dist/js/framework/components/seekbar.js +15 -6
- package/dist/js/framework/main.js +1 -1
- package/dist/js/framework/uiconfig.d.ts +5 -0
- package/dist/js/framework/uimanager.js +1 -1
- package/package.json +1 -1
- package/src/ts/components/seekbar.ts +24 -6
- package/src/ts/uiconfig.ts +5 -0
- package/src/ts/uimanager.ts +1 -0
|
@@ -3505,6 +3505,7 @@ var SeekBar = /** @class */ (function (_super) {
|
|
|
3505
3505
|
* @type {number}
|
|
3506
3506
|
*/
|
|
3507
3507
|
_this.playbackPositionPercentage = 0;
|
|
3508
|
+
_this.isUserSeeking = false;
|
|
3508
3509
|
_this.seekBarEvents = {
|
|
3509
3510
|
/**
|
|
3510
3511
|
* Fired when a scrubbing seek operation is started.
|
|
@@ -3548,6 +3549,7 @@ var SeekBar = /** @class */ (function (_super) {
|
|
|
3548
3549
|
ariaLabel: i18n_1.i18n.getLocalizer('seekBar'),
|
|
3549
3550
|
tabIndex: 0,
|
|
3550
3551
|
snappingRange: 1,
|
|
3552
|
+
enableSeekPreview: true,
|
|
3551
3553
|
}, _this.config);
|
|
3552
3554
|
_this.label = _this.config.label;
|
|
3553
3555
|
return _this;
|
|
@@ -3618,13 +3620,12 @@ var SeekBar = /** @class */ (function (_super) {
|
|
|
3618
3620
|
});
|
|
3619
3621
|
var isPlaying = false;
|
|
3620
3622
|
var scrubbing = false;
|
|
3621
|
-
var isUserSeeking = false;
|
|
3622
3623
|
var isPlayerSeeking = false;
|
|
3623
3624
|
// Update playback and buffer positions
|
|
3624
3625
|
var playbackPositionHandler = function (event, forceUpdate) {
|
|
3625
3626
|
if (event === void 0) { event = null; }
|
|
3626
3627
|
if (forceUpdate === void 0) { forceUpdate = false; }
|
|
3627
|
-
if (isUserSeeking) {
|
|
3628
|
+
if (_this.isUserSeeking) {
|
|
3628
3629
|
// We caught a seek preview seek, do not update the seekbar
|
|
3629
3630
|
return;
|
|
3630
3631
|
}
|
|
@@ -3702,7 +3703,7 @@ var SeekBar = /** @class */ (function (_super) {
|
|
|
3702
3703
|
player.on(player.exports.PlayerEvent.TimeShift, onPlayerSeek);
|
|
3703
3704
|
player.on(player.exports.PlayerEvent.TimeShifted, onPlayerSeeked);
|
|
3704
3705
|
this.onSeek.subscribe(function (sender) {
|
|
3705
|
-
isUserSeeking = true; // track seeking status so we can catch events from seek preview seeks
|
|
3706
|
+
_this.isUserSeeking = true; // track seeking status so we can catch events from seek preview seeks
|
|
3706
3707
|
// Notify UI manager of started seek
|
|
3707
3708
|
uimanager.onSeek.dispatch(sender);
|
|
3708
3709
|
// Save current playback state before performing the seek
|
|
@@ -3720,10 +3721,16 @@ var SeekBar = /** @class */ (function (_super) {
|
|
|
3720
3721
|
uimanager.onSeekPreview.dispatch(sender, args);
|
|
3721
3722
|
scrubbing = args.scrubbing;
|
|
3722
3723
|
});
|
|
3724
|
+
// Set enableSeekPreview if set in the uimanager config
|
|
3725
|
+
if (typeof uimanager.getConfig().enableSeekPreview === 'boolean') {
|
|
3726
|
+
this.config.enableSeekPreview = uimanager.getConfig().enableSeekPreview;
|
|
3727
|
+
}
|
|
3723
3728
|
// Rate-limited scrubbing seek
|
|
3724
|
-
this.
|
|
3729
|
+
if (this.config.enableSeekPreview) {
|
|
3730
|
+
this.onSeekPreview.subscribeRateLimited(this.seekWhileScrubbing, 200);
|
|
3731
|
+
}
|
|
3725
3732
|
this.onSeeked.subscribe(function (sender, percentage) {
|
|
3726
|
-
isUserSeeking = false;
|
|
3733
|
+
_this.isUserSeeking = false;
|
|
3727
3734
|
// Do the seek
|
|
3728
3735
|
_this.seek(percentage);
|
|
3729
3736
|
// Notify UI manager of finished seek
|
|
@@ -3908,7 +3915,9 @@ var SeekBar = /** @class */ (function (_super) {
|
|
|
3908
3915
|
if (this.pausedTimeshiftUpdater) {
|
|
3909
3916
|
this.pausedTimeshiftUpdater.clear();
|
|
3910
3917
|
}
|
|
3911
|
-
this.
|
|
3918
|
+
if (this.config.enableSeekPreview) {
|
|
3919
|
+
this.onSeekPreview.unsubscribe(this.seekWhileScrubbing);
|
|
3920
|
+
}
|
|
3912
3921
|
};
|
|
3913
3922
|
SeekBar.prototype.toDomElement = function () {
|
|
3914
3923
|
var _this = this;
|
|
@@ -9958,7 +9967,7 @@ module.exports={
|
|
|
9958
9967
|
"use strict";
|
|
9959
9968
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9960
9969
|
exports.version = void 0;
|
|
9961
|
-
exports.version = '3.
|
|
9970
|
+
exports.version = '3.36.0';
|
|
9962
9971
|
// Management
|
|
9963
9972
|
var uimanager_1 = require("./uimanager");
|
|
9964
9973
|
Object.defineProperty(exports, "UIManager", { enumerable: true, get: function () { return uimanager_1.UIManager; } });
|
|
@@ -11245,7 +11254,7 @@ var UIManager = /** @class */ (function () {
|
|
|
11245
11254
|
this.managerPlayerWrapper = new PlayerWrapper(player);
|
|
11246
11255
|
// ensure that at least the metadata object does exist in the uiconfig
|
|
11247
11256
|
uiconfig.metadata = uiconfig.metadata ? uiconfig.metadata : {};
|
|
11248
|
-
this.config = __assign(__assign({ playbackSpeedSelectionEnabled: true, autoUiVariantResolve: true, disableAutoHideWhenHovered: false }, uiconfig), { events: {
|
|
11257
|
+
this.config = __assign(__assign({ playbackSpeedSelectionEnabled: true, autoUiVariantResolve: true, disableAutoHideWhenHovered: false, enableSeekPreview: true }, uiconfig), { events: {
|
|
11249
11258
|
onUpdated: new eventdispatcher_1.EventDispatcher(),
|
|
11250
11259
|
}, volumeController: new volumecontroller_1.VolumeController(this.managerPlayerWrapper.getPlayer()) });
|
|
11251
11260
|
/**
|
|
@@ -12286,4 +12295,4 @@ var VttUtils;
|
|
|
12286
12295
|
|
|
12287
12296
|
},{}]},{},[87])(87)
|
|
12288
12297
|
});
|
|
12289
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvdHMvYXJyYXl1dGlscy50cyIsInNyYy90cy9hdWRpb3RyYWNrdXRpbHMudHMiLCJzcmMvdHMvYnJvd3NlcnV0aWxzLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvYWRjbGlja292ZXJsYXkudHMiLCJzcmMvdHMvY29tcG9uZW50cy9hZG1lc3NhZ2VsYWJlbC50cyIsInNyYy90cy9jb21wb25lbnRzL2Fkc2tpcGJ1dHRvbi50cyIsInNyYy90cy9jb21wb25lbnRzL2FpcnBsYXl0b2dnbGVidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy9hdWRpb3F1YWxpdHlzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9hdWRpb3RyYWNrbGlzdGJveC50cyIsInNyYy90cy9jb21wb25lbnRzL2F1ZGlvdHJhY2tzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9idWZmZXJpbmdvdmVybGF5LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvY2FzdHN0YXR1c292ZXJsYXkudHMiLCJzcmMvdHMvY29tcG9uZW50cy9jYXN0dG9nZ2xlYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvY2FzdHVpY29udGFpbmVyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvY2xpY2tvdmVybGF5LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvY2xvc2VidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy9jb21wb25lbnQudHMiLCJzcmMvdHMvY29tcG9uZW50cy9jb250YWluZXIudHMiLCJzcmMvdHMvY29tcG9uZW50cy9jb250cm9sYmFyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvZXJyb3JtZXNzYWdlb3ZlcmxheS50cyIsInNyYy90cy9jb21wb25lbnRzL2Z1bGxzY3JlZW50b2dnbGVidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy9odWdlcGxheWJhY2t0b2dnbGVidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy9odWdlcmVwbGF5YnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvaXRlbXNlbGVjdGlvbmxpc3QudHMiLCJzcmMvdHMvY29tcG9uZW50cy9sYWJlbC50cyIsInNyYy90cy9jb21wb25lbnRzL2xpc3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9saXN0c2VsZWN0b3IudHMiLCJzcmMvdHMvY29tcG9uZW50cy9tZXRhZGF0YWxhYmVsLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvcGljdHVyZWlucGljdHVyZXRvZ2dsZWJ1dHRvbi50cyIsInNyYy90cy9jb21wb25lbnRzL3BsYXliYWNrc3BlZWRzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9wbGF5YmFja3RpbWVsYWJlbC50cyIsInNyYy90cy9jb21wb25lbnRzL3BsYXliYWNrdG9nZ2xlYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvcGxheWJhY2t0b2dnbGVvdmVybGF5LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvcmVjb21tZW5kYXRpb25vdmVybGF5LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc2Vla2Jhci50cyIsInNyYy90cy9jb21wb25lbnRzL3NlZWtiYXJidWZmZXJsZXZlbC50cyIsInNyYy90cy9jb21wb25lbnRzL3NlZWtiYXJjb250cm9sbGVyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc2Vla2JhcmxhYmVsLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc2VsZWN0Ym94LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbC50cyIsInNyYy90cy9jb21wb25lbnRzL3NldHRpbmdzcGFuZWxpdGVtLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbHBhZ2UudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zZXR0aW5nc3BhbmVscGFnZWJhY2tidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy9zZXR0aW5nc3BhbmVscGFnZW5hdmlnYXRvcmJ1dHRvbi50cyIsInNyYy90cy9jb21wb25lbnRzL3NldHRpbmdzcGFuZWxwYWdlb3BlbmJ1dHRvbi50cyIsInNyYy90cy9jb21wb25lbnRzL3NldHRpbmdzdG9nZ2xlYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc3BhY2VyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc3VidGl0bGVsaXN0Ym94LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc3VidGl0bGVvdmVybGF5LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc3VidGl0bGVzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2JhY2tncm91bmRjb2xvcnNlbGVjdGJveC50cyIsInNyYy90cy9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3MvYmFja2dyb3VuZG9wYWNpdHlzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2NoYXJhY3RlcmVkZ2VzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2ZvbnRjb2xvcnNlbGVjdGJveC50cyIsInNyYy90cy9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3MvZm9udGZhbWlseXNlbGVjdGJveC50cyIsInNyYy90cy9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3MvZm9udG9wYWNpdHlzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2ZvbnRzaXplc2VsZWN0Ym94LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9zdWJ0aXRsZXNldHRpbmdzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NsYWJlbC50cyIsInNyYy90cy9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3Mvc3VidGl0bGVzZXR0aW5nc21hbmFnZXIudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NwYW5lbHBhZ2UudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NyZXNldGJ1dHRvbi50cyIsInNyYy90cy9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3Mvd2luZG93Y29sb3JzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3dpbmRvd29wYWNpdHlzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy90aW1lbGluZW1hcmtlcnNoYW5kbGVyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvdGl0bGViYXIudHMiLCJzcmMvdHMvY29tcG9uZW50cy90b2dnbGVidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy90dm5vaXNlY2FudmFzLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvdWljb250YWluZXIudHMiLCJzcmMvdHMvY29tcG9uZW50cy92aWRlb3F1YWxpdHlzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy92b2x1bWVjb250cm9sYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvdm9sdW1lc2xpZGVyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvdm9sdW1ldG9nZ2xlYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvdnJ0b2dnbGVidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy93YXRlcm1hcmsudHMiLCJzcmMvdHMvZGVtb2ZhY3RvcnkudHMiLCJzcmMvdHMvZG9tLnRzIiwic3JjL3RzL2Vycm9ydXRpbHMudHMiLCJzcmMvdHMvZXZlbnRkaXNwYXRjaGVyLnRzIiwic3JjL3RzL2ZvY3VzdmlzaWJpbGl0eXRyYWNrZXIudHMiLCJzcmMvdHMvZ3VpZC50cyIsInNyYy90cy9pbWFnZWxvYWRlci50cyIsInNyYy90cy9sb2NhbGl6YXRpb24vaTE4bi50cyIsInNyYy90cy9sb2NhbGl6YXRpb24vbGFuZ3VhZ2VzL2RlLmpzb24iLCJzcmMvdHMvbG9jYWxpemF0aW9uL2xhbmd1YWdlcy9lbi5qc29uIiwic3JjL3RzL21haW4udHMiLCJzcmMvdHMvbW9iaWxldjNwbGF5ZXJhcGkudHMiLCJzcmMvdHMvcGxheWVydXRpbHMudHMiLCJzcmMvdHMvc3RvcmFnZXV0aWxzLnRzIiwic3JjL3RzL3N0cmluZ3V0aWxzLnRzIiwic3JjL3RzL3N1YnRpdGxldXRpbHMudHMiLCJzcmMvdHMvdGltZW91dC50cyIsInNyYy90cy91aWZhY3RvcnkudHMiLCJzcmMvdHMvdWltYW5hZ2VyLnRzIiwic3JjL3RzL3VpdXRpbHMudHMiLCJzcmMvdHMvdm9sdW1lY29udHJvbGxlci50cyIsInNyYy90cy92dHR1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztBQ0FBLElBQWlCLFVBQVUsQ0FnQjFCO0FBaEJELFdBQWlCLFVBQVU7SUFDekI7Ozs7O09BS0c7SUFDSCxTQUFnQixNQUFNLENBQUksS0FBVSxFQUFFLElBQU87UUFDM0MsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNkLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEM7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBUmUsaUJBQU0sU0FRckIsQ0FBQTtBQUNILENBQUMsRUFoQmdCLFVBQVUsR0FBVixrQkFBVSxLQUFWLGtCQUFVLFFBZ0IxQjs7Ozs7O0FDYkQsNENBQTJDO0FBRTNDOzs7O0dBSUc7QUFDSDtJQU1FLGlDQUFZLE1BQWlCLEVBQUUsT0FBeUMsRUFBRSxTQUE0QjtRQUF0RyxpQkFRQztRQXFCTyxrQkFBYSxHQUFHLFVBQUMsS0FBc0I7WUFDN0MsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMs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cEQsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUssZUFBZSxPQUFJLENBQUMsQ0FBQztRQUMvRCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBSyxlQUFlLE9BQUksQ0FBQyxDQUFDO1FBQzlELGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUssTUFBTSxDQUFDLEtBQUssR0FBRyxVQUFVLE9BQUksQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQztBQUNKLENBQUMsRUE5Q2dCLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBOEN4QiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJleHBvcnQgbmFtZXNwYWNlIEFycmF5VXRpbHMge1xuICAvKipcbiAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gYW4gYXJyYXkuXG4gICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdGhhdCBtYXkgY29udGFpbiB0aGUgaXRlbSB0byByZW1vdmVcbiAgICogQHBhcmFtIGl0ZW0gdGhlIGl0ZW0gdG8gcmVtb3ZlIGZyb20gdGhlIGFycmF5XG4gICAqIEByZXR1cm5zIHthbnl9IHRoZSByZW1vdmVkIGl0ZW0gb3IgbnVsbCBpZiBpdCB3YXNuJ3QgcGFydCBvZiB0aGUgYXJyYXlcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZW1vdmU8VD4oYXJyYXk6IFRbXSwgaXRlbTogVCk6IFQgfCBudWxsIHtcbiAgICBsZXQgaW5kZXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJldHVybiBhcnJheS5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IExpc3RJdGVtLCBMaXN0U2VsZWN0b3IsIExpc3RTZWxlY3RvckNvbmZpZyB9IGZyb20gJy4vY29tcG9uZW50cy9saXN0c2VsZWN0b3InO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBBdWRpb1RyYWNrRXZlbnQsIFBsYXllckFQSSwgQXVkaW9UcmFjayB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBhbGwgYXVkaW8gdHJhY2tzIHJlbGF0ZWQgZXZlbnRzXG4gKlxuICogVGhpcyBjbGFzcyBsaXN0ZW5zIHRvIHBsYXllciBldmVudHMgYXMgd2VsbCBhcyB0aGUgYExpc3RTZWxlY3RvcmAgZXZlbnQgaWYgc2VsZWN0aW9uIGNoYW5nZWRcbiAqL1xuZXhwb3J0IGNsYXNzIEF1ZGlvVHJhY2tTd2l0Y2hIYW5kbGVyIHtcblxuICBwcml2YXRlIHBsYXllcjogUGxheWVyQVBJO1xuICBwcml2YXRlIGxpc3RFbGVtZW50OiBMaXN0U2VsZWN0b3I8TGlzdFNlbGVjdG9yQ29uZmlnPjtcbiAgcHJpdmF0ZSB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyQVBJLCBlbGVtZW50OiBMaXN0U2VsZWN0b3I8TGlzdFNlbGVjdG9yQ29uZmlnPiwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcikge1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMubGlzdEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMudWltYW5hZ2VyID0gdWltYW5hZ2VyO1xuXG4gICAgdGhpcy5iaW5kU2VsZWN0aW9uRXZlbnQoKTtcbiAgICB0aGlzLmJpbmRQbGF5ZXJFdmVudHMoKTtcbiAgICB0aGlzLnJlZnJlc2hBdWRpb1RyYWNrcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kU2VsZWN0aW9uRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5saXN0RWxlbWVudC5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUoKF8sIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMucGxheWVyLnNldEF1ZGlvKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZFBsYXllckV2ZW50cygpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIHdoZW4gc2VsZWN0ZWQgdHJhY2sgaGFzIGNoYW5nZWRcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkF1ZGlvQ2hhbmdlZCwgdGhpcy5zZWxlY3RDdXJyZW50QXVkaW9UcmFjayk7XG4gICAgLy8gVXBkYXRlIHRyYWNrcyB3aGVuIHNvdXJjZSBnb2VzIGF3YXlcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZVVubG9hZGVkLCB0aGlzLnJlZnJlc2hBdWRpb1RyYWNrcyk7XG4gICAgLy8gVXBkYXRlIHRyYWNrcyB3aGVuIHRoZSBwZXJpb2Qgd2l0aGluIGEgc291cmNlIGNoYW5nZXNcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBlcmlvZFN3aXRjaGVkLCB0aGlzLnJlZnJlc2hBdWRpb1RyYWNrcyk7XG4gICAgLy8gVXBkYXRlIHRyYWNrcyB3aGVuIGEgdHJhY2sgaXMgYWRkZWQgb3IgcmVtb3ZlZFxuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQXVkaW9BZGRlZCwgdGhpcy5hZGRBdWRpb1RyYWNrKTtcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkF1ZGlvUmVtb3ZlZCwgdGhpcy5yZW1vdmVBdWRpb1RyYWNrKTtcbiAgICB0aGlzLnVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSh0aGlzLnJlZnJlc2hBdWRpb1RyYWNrcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZEF1ZGlvVHJhY2sgPSAoZXZlbnQ6IEF1ZGlvVHJhY2tFdmVudCkgPT4ge1xuICAgIGNvbnN0IGF1ZGlvVHJhY2sgPSBldmVudC50cmFjaztcbiAgICBpZiAoIXRoaXMubGlzdEVsZW1lbnQuaGFzSXRlbShhdWRpb1RyYWNrLmlkKSkge1xuICAgICAgdGhpcy5saXN0RWxlbWVudC5hZGRJdGVtKGF1ZGlvVHJhY2suaWQsIGkxOG4uZ2V0TG9jYWxpemVyKGF1ZGlvVHJhY2subGFiZWwpLCB0cnVlKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZW1vdmVBdWRpb1RyYWNrID0gKGV2ZW50OiBBdWRpb1RyYWNrRXZlbnQpID0+IHtcbiAgICBjb25zdCBhdWRpb1RyYWNrID0gZXZlbnQudHJhY2s7XG4gICAgaWYgKHRoaXMubGlzdEVsZW1lbnQuaGFzSXRlbShhdWRpb1RyYWNrLmlkKSkge1xuICAgICAgdGhpcy5saXN0RWxlbWVudC5yZW1vdmVJdGVtKGF1ZGlvVHJhY2suaWQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHNlbGVjdEN1cnJlbnRBdWRpb1RyYWNrID0gKCkgPT4ge1xuICAgIGxldCBjdXJyZW50QXVkaW9UcmFjayA9IHRoaXMucGxheWVyLmdldEF1ZGlvKCk7XG5cbiAgICAvLyBITFMgc3RyZWFtcyBkb24ndCBhbHdheXMgcHJvdmlkZSB0aGlzLCBzbyB3ZSBoYXZlIHRvIGNoZWNrXG4gICAgaWYgKGN1cnJlbnRBdWRpb1RyYWNrKSB7XG4gICAgICB0aGlzLmxpc3RFbGVtZW50LnNlbGVjdEl0ZW0oY3VycmVudEF1ZGlvVHJhY2suaWQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHJlZnJlc2hBdWRpb1RyYWNrcyA9ICgpID0+IHtcbiAgICBjb25zdCBhdWRpb1RyYWNrcyA9IHRoaXMucGxheWVyLmdldEF2YWlsYWJsZUF1ZGlvKCk7XG4gICAgY29uc3QgYXVkaW9UcmFja1RvTGlzdEl0ZW0gPSAoYXVkaW9UcmFjazogQXVkaW9UcmFjayk6IExpc3RJdGVtID0+IHtcbiAgICAgIHJldHVybiB7IGtleTogYXVkaW9UcmFjay5pZCwgbGFiZWw6IGF1ZGlvVHJhY2subGFiZWwgfTtcbiAgICB9O1xuXG4gICAgdGhpcy5saXN0RWxlbWVudC5zeW5jaHJvbml6ZUl0ZW1zKGF1ZGlvVHJhY2tzLm1hcChhdWRpb1RyYWNrVG9MaXN0SXRlbSkpO1xuICAgIHRoaXMuc2VsZWN0Q3VycmVudEF1ZGlvVHJhY2soKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBjbGFzcyBCcm93c2VyVXRpbHMge1xuXG4gIC8vIGlzTW9iaWxlIG9ubHkgbmVlZHMgdG8gYmUgZXZhbHVhdGVkIG9uY2UgKGl0IGNhbm5vdCBjaGFuZ2UgZHVyaW5nIGEgYnJvd3NlciBzZXNzaW9uKVxuICAvLyBNb2JpbGUgZGV0ZWN0aW9uIGFjY29yZGluZyB0byBNb3ppbGxhIHJlY29tbWVuZGF0aW9uOiBcIkluIHN1bW1hcnksIHdlIHJlY29tbWVuZCBsb29raW5nIGZvciB0aGUgc3RyaW5nIOKAnE1vYmnigJ1cbiAgLy8gYW55d2hlcmUgaW4gdGhlIFVzZXIgQWdlbnQgdG8gZGV0ZWN0IGEgbW9iaWxlIGRldmljZS5cIlxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0Jyb3dzZXJfZGV0ZWN0aW9uX3VzaW5nX3RoZV91c2VyX2FnZW50XG4gIHN0YXRpYyBnZXQgaXNNb2JpbGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLndpbmRvd0V4aXN0cygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAvTW9iaS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgaXNDaHJvbWUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLndpbmRvd0V4aXN0cygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAvQ2hyb21lLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgc3RhdGljIGdldCBpc0FuZHJvaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLndpbmRvd0V4aXN0cygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAvQW5kcm9pZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgaXNJT1MoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLndpbmRvd0V4aXN0cygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgaXNNYWNJbnRlbCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMud2luZG93RXhpc3RzKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJztcbiAgfVxuXG4gIC8vIGh0dHBzOi8vaGFja3MubW96aWxsYS5vcmcvMjAxMy8wNC9kZXRlY3RpbmctdG91Y2gtaXRzLXRoZS13aHktbm90LXRoZS1ob3cvXG4gIHN0YXRpYyBnZXQgaXNUb3VjaFN1cHBvcnRlZCgpIHtcbiAgICBpZiAoIXRoaXMud2luZG93RXhpc3RzKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAobmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMCB8fCBuYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cyA+IDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgd2luZG93RXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2xpY2tPdmVybGF5IH0gZnJvbSAnLi9jbGlja292ZXJsYXknO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgQWQsIEFkRXZlbnQsIFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbi8qKlxuICogQSBzaW1wbGUgY2xpY2sgY2FwdHVyZSBvdmVybGF5IGZvciBjbGlja1Rocm91Z2hVcmxzIG9mIGFkcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFkQ2xpY2tPdmVybGF5IGV4dGVuZHMgQ2xpY2tPdmVybGF5IHtcblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbGV0IGNsaWNrVGhyb3VnaENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbnVsbDtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZFN0YXJ0ZWQsIChldmVudDogQWRFdmVudCkgPT4ge1xuICAgICAgbGV0IGFkID0gZXZlbnQuYWQ7XG4gICAgICB0aGlzLnNldFVybChhZC5jbGlja1Rocm91Z2hVcmwpO1xuICAgICAgY2xpY2tUaHJvdWdoQ2FsbGJhY2sgPSBhZC5jbGlja1Rocm91Z2hVcmxPcGVuZWQ7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhciBjbGljay10aHJvdWdoIFVSTCB3aGVuIGFkIGhhcyBmaW5pc2hlZFxuICAgIGxldCBhZEZpbmlzaGVkSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2V0VXJsKG51bGwpO1xuICAgIH07XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRGaW5pc2hlZCwgYWRGaW5pc2hlZEhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZFNraXBwZWQsIGFkRmluaXNoZWRIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRFcnJvciwgYWRGaW5pc2hlZEhhbmRsZXIpO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBQYXVzZSB0aGUgYWQgd2hlbiBvdmVybGF5IGlzIGNsaWNrZWRcbiAgICAgIHBsYXllci5wYXVzZSgndWktYWQtY2xpY2stb3ZlcmxheScpO1xuXG4gICAgICBpZiAoY2xpY2tUaHJvdWdoQ2FsbGJhY2spIHtcbiAgICAgICAgY2xpY2tUaHJvdWdoQ2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtMYWJlbCwgTGFiZWxDb25maWd9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7U3RyaW5nVXRpbHN9IGZyb20gJy4uL3N0cmluZ3V0aWxzJztcbmltcG9ydCB7IEFkRXZlbnQsIExpbmVhckFkLCBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIGxhYmVsIHRoYXQgZGlzcGxheXMgYSBtZXNzYWdlIGFib3V0IGEgcnVubmluZyBhZCwgb3B0aW9uYWxseSB3aXRoIGEgY291bnRkb3duLlxuICovXG5leHBvcnQgY2xhc3MgQWRNZXNzYWdlTGFiZWwgZXh0ZW5kcyBMYWJlbDxMYWJlbENvbmZpZz4ge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogTGFiZWxDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWxhYmVsLWFkLW1lc3NhZ2UnLFxuICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ2Fkcy5yZW1haW5pbmdUaW1lJykgLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBsZXQgdGV4dCA9IGNvbmZpZy50ZXh0O1xuXG4gICAgbGV0IHVwZGF0ZU1lc3NhZ2VIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zZXRUZXh0KFN0cmluZ1V0aWxzLnJlcGxhY2VBZE1lc3NhZ2VQbGFjZWhvbGRlcnMoaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRleHQpLCBudWxsLCBwbGF5ZXIpKTtcbiAgICB9O1xuXG4gICAgbGV0IGFkU3RhcnRIYW5kbGVyID0gKGV2ZW50OiBBZEV2ZW50KSA9PiB7XG4gICAgICBsZXQgdWlDb25maWcgPSAoZXZlbnQuYWQgYXMgTGluZWFyQWQpLnVpQ29uZmlnO1xuICAgICAgdGV4dCA9IHVpQ29uZmlnICYmIHVpQ29uZmlnLm1lc3NhZ2UgfHwgY29uZmlnLnRleHQ7XG5cbiAgICAgIHVwZGF0ZU1lc3NhZ2VIYW5kbGVyKCk7XG5cbiAgICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lQ2hhbmdlZCwgdXBkYXRlTWVzc2FnZUhhbmRsZXIpO1xuICAgIH07XG5cbiAgICBsZXQgYWRFbmRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcGxheWVyLm9mZihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lQ2hhbmdlZCwgdXBkYXRlTWVzc2FnZUhhbmRsZXIpO1xuICAgIH07XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRTdGFydGVkLCBhZFN0YXJ0SGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFkU2tpcHBlZCwgYWRFbmRIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRFcnJvciwgYWRFbmRIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRGaW5pc2hlZCwgYWRFbmRIYW5kbGVyKTtcbiAgfVxufSIsImltcG9ydCB7IEJ1dHRvbkNvbmZpZywgQnV0dG9uIH0gZnJvbSAnLi9idXR0b24nO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgU3RyaW5nVXRpbHMgfSBmcm9tICcuLi9zdHJpbmd1dGlscyc7XG5pbXBvcnQgeyBBZEV2ZW50LCBMaW5lYXJBZCwgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIHtAbGluayBBZFNraXBCdXR0b259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkU2tpcEJ1dHRvbkNvbmZpZyBleHRlbmRzIEJ1dHRvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBNZXNzYWdlIHdoaWNoIGdldHMgZGlzcGxheWVkIGR1cmluZyB0aGUgY291bnRkb3duIGlzIGFjdGl2ZS5cbiAgICogU3VwcG9ydGVkIHBsYWNlaG9sZGVyczogbG9vayBhdCB7QGxpbmsgU3RyaW5nVXRpbHMucmVwbGFjZUFkTWVzc2FnZVBsYWNlaG9sZGVyc31cbiAgICovXG4gIHVudGlsU2tpcHBhYmxlTWVzc2FnZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlIGFkIGlzIHNraXBwYWJsZS5cbiAgICogU3VwcG9ydGVkIHBsYWNlaG9sZGVyczogbG9vayBhdCB7QGxpbmsgU3RyaW5nVXRpbHMucmVwbGFjZUFkTWVzc2FnZVBsYWNlaG9sZGVyc31cbiAgICovXG4gIHNraXBwYWJsZU1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCBpcyBkaXNwbGF5ZWQgZHVyaW5nIGFkcyBhbmQgY2FuIGJlIHVzZWQgdG8gc2tpcCB0aGUgYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBZFNraXBCdXR0b24gZXh0ZW5kcyBCdXR0b248QWRTa2lwQnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBBZFNraXBCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCA8QWRTa2lwQnV0dG9uQ29uZmlnPntcbiAgICAgIGNzc0NsYXNzOiAndWktYnV0dG9uLWFkLXNraXAnLFxuICAgICAgdW50aWxTa2lwcGFibGVNZXNzYWdlOiAnU2tpcCBhZCBpbiB7cmVtYWluaW5nVGltZX0nLFxuICAgICAgc2tpcHBhYmxlTWVzc2FnZTogJ1NraXAgYWQnLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBsZXQgdW50aWxTa2lwcGFibGVNZXNzYWdlID0gY29uZmlnLnVudGlsU2tpcHBhYmxlTWVzc2FnZTtcbiAgICBsZXQgc2tpcHBhYmxlTWVzc2FnZSA9IGNvbmZpZy5za2lwcGFibGVNZXNzYWdlO1xuICAgIGxldCBza2lwT2Zmc2V0ID0gLTE7XG5cbiAgICBsZXQgdXBkYXRlU2tpcE1lc3NhZ2VIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zaG93KCk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgc2tpcCBtZXNzYWdlIG9uIHRoZSBidXR0b25cbiAgICAgIGlmIChwbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKSA8IHNraXBPZmZzZXQpIHtcbiAgICAgICAgdGhpcy5zZXRUZXh0KFN0cmluZ1V0aWxzLnJlcGxhY2VBZE1lc3NhZ2VQbGFjZWhvbGRlcnModW50aWxTa2lwcGFibGVNZXNzYWdlLCBza2lwT2Zmc2V0LCBwbGF5ZXIpKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFRleHQoc2tpcHBhYmxlTWVzc2FnZSk7XG4gICAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCBhZFN0YXJ0SGFuZGxlciA9IChldmVudDogQWRFdmVudCkgPT4ge1xuICAgICAgbGV0IGFkID0gZXZlbnQuYWQgYXMgTGluZWFyQWQ7XG4gICAgICBza2lwT2Zmc2V0ID0gYWQuc2tpcHBhYmxlQWZ0ZXI7XG4gICAgICB1bnRpbFNraXBwYWJsZU1lc3NhZ2UgPSBhZC51aUNvbmZpZyAmJiBhZC51aUNvbmZpZy51bnRpbFNraXBwYWJsZU1lc3NhZ2UgfHwgY29uZmlnLnVudGlsU2tpcHBhYmxlTWVzc2FnZTtcbiAgICAgIHNraXBwYWJsZU1lc3NhZ2UgPSBhZC51aUNvbmZpZyAmJiBhZC51aUNvbmZpZy5za2lwcGFibGVNZXNzYWdlIHx8IGNvbmZpZy5za2lwcGFibGVNZXNzYWdlO1xuXG4gICAgICAvLyBEaXNwbGF5IHRoaXMgYnV0dG9uIG9ubHkgaWYgYWQgaXMgc2tpcHBhYmxlLlxuICAgICAgLy8gTm9uLXNraXBwYWJsZSBhZHMgd2lsbCByZXR1cm4gLTEgZm9yIHNraXBwYWJsZUFmdGVyIGZvciBwbGF5ZXIgdmVyc2lvbiA8IHY4LjMuMC5cbiAgICAgIGlmICh0eXBlb2Ygc2tpcE9mZnNldCA9PT0gJ251bWJlcicgJiYgc2tpcE9mZnNldCA+PSAwKSB7XG4gICAgICAgIHVwZGF0ZVNraXBNZXNzYWdlSGFuZGxlcigpO1xuICAgICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVGltZUNoYW5nZWQsIHVwZGF0ZVNraXBNZXNzYWdlSGFuZGxlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IGFkRW5kSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHBsYXllci5vZmYocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVGltZUNoYW5nZWQsIHVwZGF0ZVNraXBNZXNzYWdlSGFuZGxlcik7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZFN0YXJ0ZWQsIGFkU3RhcnRIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRTa2lwcGVkLCBhZEVuZEhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZEVycm9yLCBhZEVuZEhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZEZpbmlzaGVkLCBhZEVuZEhhbmRsZXIpO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBUcnkgdG8gc2tpcCB0aGUgYWQgKHRoaXMgb25seSB3b3JrcyBpZiBpdCBpcyBza2lwcGFibGUgc28gd2UgZG9uJ3QgbmVlZCB0byB0YWtlIGV4dHJhIGNhcmUgb2YgdGhhdCBoZXJlKVxuICAgICAgcGxheWVyLmFkcy5za2lwKCk7XG4gICAgfSk7XG4gIH1cbn0iLCJpbXBvcnQge1RvZ2dsZUJ1dHRvbiwgVG9nZ2xlQnV0dG9uQ29uZmlnfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCB0b2dnbGVzIEFwcGxlIEFpclBsYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBaXJQbGF5VG9nZ2xlQnV0dG9uIGV4dGVuZHMgVG9nZ2xlQnV0dG9uPFRvZ2dsZUJ1dHRvbkNvbmZpZz4ge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogVG9nZ2xlQnV0dG9uQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1haXJwbGF5dG9nZ2xlYnV0dG9uJyxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdhcHBsZUFpcnBsYXknKSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgaWYgKCFwbGF5ZXIuaXNBaXJwbGF5QXZhaWxhYmxlKSB7XG4gICAgICAvLyBJZiB0aGUgcGxheWVyIGRvZXMgbm90IHN1cHBvcnQgQWlycGxheSAocGxheWVyIDcuMCksIHdlIGp1c3QgaGlkZSB0aGlzIGNvbXBvbmVudCBhbmQgc2tpcCBjb25maWd1cmF0aW9uXG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmIChwbGF5ZXIuaXNBaXJwbGF5QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgcGxheWVyLnNob3dBaXJwbGF5VGFyZ2V0UGlja2VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdBaXJQbGF5IHVuYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGFpclBsYXlBdmFpbGFibGVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgaWYgKHBsYXllci5pc0FpcnBsYXlBdmFpbGFibGUoKSkge1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhaXJQbGF5Q2hhbmdlZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBpZiAocGxheWVyLmlzQWlycGxheUFjdGl2ZSgpKSB7XG4gICAgICAgIHRoaXMub24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub2ZmKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BaXJwbGF5QXZhaWxhYmxlLCBhaXJQbGF5QXZhaWxhYmxlSGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFpcnBsYXlDaGFuZ2VkLCBhaXJQbGF5Q2hhbmdlZEhhbmRsZXIpO1xuXG4gICAgLy8gU3RhcnR1cCBpbml0XG4gICAgYWlyUGxheUF2YWlsYWJsZUhhbmRsZXIoKTsgLy8gSGlkZSBidXR0b24gaWYgQWlyUGxheSBpcyBub3QgYXZhaWxhYmxlXG4gICAgYWlyUGxheUNoYW5nZWRIYW5kbGVyKCk7XG4gIH1cbn0iLCJpbXBvcnQge1NlbGVjdEJveH0gZnJvbSAnLi9zZWxlY3Rib3gnO1xuaW1wb3J0IHtMaXN0U2VsZWN0b3JDb25maWd9IGZyb20gJy4vbGlzdHNlbGVjdG9yJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIHNlbGVjdCBib3ggcHJvdmlkaW5nIGEgc2VsZWN0aW9uIGJldHdlZW4gJ2F1dG8nIGFuZCB0aGUgYXZhaWxhYmxlIGF1ZGlvIHF1YWxpdGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEF1ZGlvUXVhbGl0eVNlbGVjdEJveCBleHRlbmRzIFNlbGVjdEJveCB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMaXN0U2VsZWN0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzc2VzOiBbJ3VpLWF1ZGlvcXVhbGl0eXNlbGVjdGJveCddLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgc2VsZWN0Q3VycmVudEF1ZGlvUXVhbGl0eSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbShwbGF5ZXIuZ2V0QXVkaW9RdWFsaXR5KCkuaWQpO1xuICAgIH07XG5cbiAgICBsZXQgdXBkYXRlQXVkaW9RdWFsaXRpZXMgPSAoKSA9PiB7XG4gICAgICBsZXQgYXVkaW9RdWFsaXRpZXMgPSBwbGF5ZXIuZ2V0QXZhaWxhYmxlQXVkaW9RdWFsaXRpZXMoKTtcblxuICAgICAgdGhpcy5jbGVhckl0ZW1zKCk7XG5cbiAgICAgIC8vIEFkZCBlbnRyeSBmb3IgYXV0b21hdGljIHF1YWxpdHkgc3dpdGNoaW5nIChkZWZhdWx0IHNldHRpbmcpXG4gICAgICB0aGlzLmFkZEl0ZW0oJ2F1dG8nLCBpMThuLmdldExvY2FsaXplcignYXV0bycpKTtcblxuICAgICAgLy8gQWRkIGF1ZGlvIHF1YWxpdGllc1xuICAgICAgZm9yIChsZXQgYXVkaW9RdWFsaXR5IG9mIGF1ZGlvUXVhbGl0aWVzKSB7XG4gICAgICAgIHRoaXMuYWRkSXRlbShhdWRpb1F1YWxpdHkuaWQsIGF1ZGlvUXVhbGl0eS5sYWJlbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlbGVjdCBpbml0aWFsIHF1YWxpdHlcbiAgICAgIHNlbGVjdEN1cnJlbnRBdWRpb1F1YWxpdHkoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUoKHNlbmRlcjogQXVkaW9RdWFsaXR5U2VsZWN0Qm94LCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBwbGF5ZXIuc2V0QXVkaW9RdWFsaXR5KHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBxdWFsaXRpZXMgd2hlbiBhdWRpbyB0cmFjayBoYXMgY2hhbmdlZFxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BdWRpb0NoYW5nZWQsIHVwZGF0ZUF1ZGlvUXVhbGl0aWVzKTtcbiAgICAvLyBVcGRhdGUgcXVhbGl0aWVzIHdoZW4gc291cmNlIGdvZXMgYXdheVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgdXBkYXRlQXVkaW9RdWFsaXRpZXMpO1xuICAgIC8vIFVwZGF0ZSBxdWFsaXRpZXMgd2hlbiB0aGUgcGVyaW9kIHdpdGhpbiBhIHNvdXJjZSBjaGFuZ2VzXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBlcmlvZFN3aXRjaGVkLCB1cGRhdGVBdWRpb1F1YWxpdGllcyk7XG4gICAgLy8gVXBkYXRlIHF1YWxpdHkgc2VsZWN0aW9uIHdoZW4gcXVhbGl0eSBpcyBjaGFuZ2VkIChmcm9tIG91dHNpZGUpXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkF1ZGlvUXVhbGl0eUNoYW5nZWQsIHNlbGVjdEN1cnJlbnRBdWRpb1F1YWxpdHkpO1xuICAgIGlmICgocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQgYXMgYW55KS5BdWRpb1F1YWxpdHlBZGRlZCkge1xuICAgICAgLy8gVXBkYXRlIHF1YWxpdGllcyB3aGVuIHRoZWlyIGF2YWlsYWJpbGl0eSBjaGFuZ2VkXG4gICAgICAvLyBUT0RPOiByZW1vdmUgYW55IGNhc3QgYWZ0ZXIgbmV4dCBwbGF5ZXIgcmVsZWFzZVxuICAgICAgcGxheWVyLm9uKChwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudCBhcyBhbnkpLkF1ZGlvUXVhbGl0eUFkZGVkLCB1cGRhdGVBdWRpb1F1YWxpdGllcyk7XG4gICAgICBwbGF5ZXIub24oKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50IGFzIGFueSkuQXVkaW9RdWFsaXR5UmVtb3ZlZCwgdXBkYXRlQXVkaW9RdWFsaXRpZXMpO1xuICAgIH1cblxuICAgIHVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSh1cGRhdGVBdWRpb1F1YWxpdGllcyk7XG4gIH1cbn0iLCJpbXBvcnQge0xpc3RCb3h9IGZyb20gJy4vbGlzdGJveCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtBdWRpb1RyYWNrU3dpdGNoSGFuZGxlcn0gZnJvbSAnLi4vYXVkaW90cmFja3V0aWxzJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbi8qKlxuICogQSBlbGVtZW50IHRoYXQgaXMgc2ltaWxhciB0byBhIHNlbGVjdCBib3ggd2hlcmUgdGhlIHVzZXIgY2FuIHNlbGVjdCBhIHN1YnRpdGxlXG4gKi9cbmV4cG9ydCBjbGFzcyBBdWRpb1RyYWNrTGlzdEJveCBleHRlbmRzIExpc3RCb3gge1xuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgbmV3IEF1ZGlvVHJhY2tTd2l0Y2hIYW5kbGVyKHBsYXllciwgdGhpcywgdWltYW5hZ2VyKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtTZWxlY3RCb3h9IGZyb20gJy4vc2VsZWN0Ym94JztcbmltcG9ydCB7TGlzdFNlbGVjdG9yQ29uZmlnfSBmcm9tICcuL2xpc3RzZWxlY3Rvcic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtBdWRpb1RyYWNrU3dpdGNoSGFuZGxlcn0gZnJvbSAnLi4vYXVkaW90cmFja3V0aWxzJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBiZXR3ZWVuIGF2YWlsYWJsZSBhdWRpbyB0cmFja3MgKGUuZy4gZGlmZmVyZW50IGxhbmd1YWdlcykuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdWRpb1RyYWNrU2VsZWN0Qm94IGV4dGVuZHMgU2VsZWN0Qm94IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExpc3RTZWxlY3RvckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktYXVkaW90cmFja3NlbGVjdGJveCddLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBuZXcgQXVkaW9UcmFja1N3aXRjaEhhbmRsZXIocGxheWVyLCB0aGlzLCB1aW1hbmFnZXIpO1xuICB9XG59IiwiaW1wb3J0IHtDb250YWluZXJDb25maWcsIENvbnRhaW5lcn0gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7Q29tcG9uZW50LCBDb21wb25lbnRDb25maWd9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7VGltZW91dH0gZnJvbSAnLi4vdGltZW91dCc7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciB0aGUge0BsaW5rIEJ1ZmZlcmluZ092ZXJsYXl9IGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWZmZXJpbmdPdmVybGF5Q29uZmlnIGV4dGVuZHMgQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIERlbGF5IGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgYnVmZmVyaW5nIG92ZXJsYXkgd2lsbCBiZSBkaXNwbGF5ZWQuIFVzZWZ1bCB0byBieXBhc3Mgc2hvcnQgc3RhbGxzIHdpdGhvdXRcbiAgICogZGlzcGxheWluZyB0aGUgb3ZlcmxheS4gU2V0IHRvIDAgdG8gZGlzcGxheSB0aGUgb3ZlcmxheSBpbnN0YW50bHkuXG4gICAqIERlZmF1bHQ6IDEwMDBtcyAoMSBzZWNvbmQpXG4gICAqL1xuICBzaG93RGVsYXlNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPdmVybGF5cyB0aGUgcGxheWVyIGFuZCBkaXNwbGF5cyBhIGJ1ZmZlcmluZyBpbmRpY2F0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWZmZXJpbmdPdmVybGF5IGV4dGVuZHMgQ29udGFpbmVyPEJ1ZmZlcmluZ092ZXJsYXlDb25maWc+IHtcblxuICBwcml2YXRlIGluZGljYXRvcnM6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+W107XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWZmZXJpbmdPdmVybGF5Q29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5pbmRpY2F0b3JzID0gW1xuICAgICAgbmV3IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+KHsgdGFnOiAnZGl2JywgY3NzQ2xhc3M6ICd1aS1idWZmZXJpbmctb3ZlcmxheS1pbmRpY2F0b3InLCByb2xlOiAnaW1nJyB9KSxcbiAgICAgIG5ldyBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPih7IHRhZzogJ2RpdicsIGNzc0NsYXNzOiAndWktYnVmZmVyaW5nLW92ZXJsYXktaW5kaWNhdG9yJywgcm9sZTogJ2ltZycgfSksXG4gICAgICBuZXcgQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4oeyB0YWc6ICdkaXYnLCBjc3NDbGFzczogJ3VpLWJ1ZmZlcmluZy1vdmVybGF5LWluZGljYXRvcicsIHJvbGU6ICdpbWcnIH0pLFxuICAgIF07XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCA8QnVmZmVyaW5nT3ZlcmxheUNvbmZpZz57XG4gICAgICBjc3NDbGFzczogJ3VpLWJ1ZmZlcmluZy1vdmVybGF5JyxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgIGNvbXBvbmVudHM6IHRoaXMuaW5kaWNhdG9ycyxcbiAgICAgIHNob3dEZWxheU1zOiAxMDAwLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgIGxldCBvdmVybGF5U2hvd1RpbWVvdXQgPSBuZXcgVGltZW91dChjb25maWcuc2hvd0RlbGF5TXMsICgpID0+IHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH0pO1xuXG4gICAgbGV0IHNob3dPdmVybGF5ID0gKCkgPT4ge1xuICAgICAgb3ZlcmxheVNob3dUaW1lb3V0LnN0YXJ0KCk7XG4gICAgfTtcblxuICAgIGxldCBoaWRlT3ZlcmxheSA9ICgpID0+IHtcbiAgICAgIG92ZXJsYXlTaG93VGltZW91dC5jbGVhcigpO1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TdGFsbFN0YXJ0ZWQsIHNob3dPdmVybGF5KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3RhbGxFbmRlZCwgaGlkZU92ZXJsYXkpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCBzaG93T3ZlcmxheSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXlpbmcsIGhpZGVPdmVybGF5KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGF1c2VkLCBoaWRlT3ZlcmxheSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNlZWssIHNob3dPdmVybGF5KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU2Vla2VkLCBoaWRlT3ZlcmxheSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlRpbWVTaGlmdCwgc2hvd092ZXJsYXkpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lU2hpZnRlZCwgaGlkZU92ZXJsYXkpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgaGlkZU92ZXJsYXkpO1xuXG4gICAgLy8gU2hvdyBvdmVybGF5IGlmIHBsYXllciBpcyBhbHJlYWR5IHN0YWxsZWQgYXQgaW5pdFxuICAgIGlmIChwbGF5ZXIuaXNTdGFsbGVkKCkpIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnRDb25maWcsIENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHtET019IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQge0V2ZW50RGlzcGF0Y2hlciwgTm9BcmdzLCBFdmVudH0gZnJvbSAnLi4vZXZlbnRkaXNwYXRjaGVyJztcbmltcG9ydCB7IExvY2FsaXphYmxlVGV4dCAsIGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIEJ1dHRvbn0gY29tcG9uZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1dHRvbkNvbmZpZyBleHRlbmRzIENvbXBvbmVudENvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBhcyBzdHJpbmcgb3IgbG9jYWxpemUgY2FsbGJhY2sgb24gdGhlIGJ1dHRvbi5cbiAgICovXG4gIHRleHQ/OiBMb2NhbGl6YWJsZVRleHQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgY2xpY2thYmxlIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1dHRvbjxDb25maWcgZXh0ZW5kcyBCdXR0b25Db25maWc+IGV4dGVuZHMgQ29tcG9uZW50PENvbmZpZz4ge1xuXG4gIHByaXZhdGUgYnV0dG9uRXZlbnRzID0ge1xuICAgIG9uQ2xpY2s6IG5ldyBFdmVudERpc3BhdGNoZXI8QnV0dG9uPENvbmZpZz4sIE5vQXJncz4oKSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWJ1dHRvbicsXG4gICAgICByb2xlOiAnYnV0dG9uJyxcbiAgICAgIHRhYkluZGV4OiAwLFxuICAgIH0gYXMgQ29uZmlnLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgY29uc3QgYnV0dG9uRWxlbWVudEF0dHJpYnV0ZXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgJ2lkJzogdGhpcy5jb25maWcuaWQsXG4gICAgICAnYXJpYS1sYWJlbCc6IGkxOG4ucGVyZm9ybUxvY2FsaXphdGlvbih0aGlzLmNvbmZpZy5hcmlhTGFiZWwgfHwgdGhpcy5jb25maWcudGV4dCksXG4gICAgICAnY2xhc3MnOiB0aGlzLmdldENzc0NsYXNzZXMoKSxcbiAgICAgICd0eXBlJyA6ICdidXR0b24nLFxuICAgICAgLyoqXG4gICAgICAqIFdDQUcyMCBzdGFuZGFyZCB0byBkaXNwbGF5IGlmIGEgYnV0dG9uIGlzIHByZXNzZWQgb3Igbm90XG4gICAgICAqL1xuICAgICAgJ2FyaWEtcHJlc3NlZCc6ICdmYWxzZScsXG4gICAgICAndGFiaW5kZXgnOiB0aGlzLmNvbmZpZy50YWJJbmRleC50b1N0cmluZygpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jb25maWcucm9sZSAhPSBudWxsKSB7XG4gICAgICBidXR0b25FbGVtZW50QXR0cmlidXRlc1sncm9sZSddID0gdGhpcy5jb25maWcucm9sZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGJ1dHRvbiBlbGVtZW50IHdpdGggdGhlIHRleHQgbGFiZWxcbiAgICBsZXQgYnV0dG9uRWxlbWVudCA9IG5ldyBET00oJ2J1dHRvbicsIGJ1dHRvbkVsZW1lbnRBdHRyaWJ1dGVzKS5hcHBlbmQobmV3IERPTSgnc3BhbicsIHtcbiAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCdsYWJlbCcpLFxuICAgIH0pLmh0bWwoaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRoaXMuY29uZmlnLnRleHQpKSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHRoZSBjbGljayBldmVudCBvbiB0aGUgYnV0dG9uIGVsZW1lbnQgYW5kIHRyaWdnZXIgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQgb24gdGhlIGJ1dHRvbiBjb21wb25lbnRcbiAgICBidXR0b25FbGVtZW50Lm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMub25DbGlja0V2ZW50KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnV0dG9uRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRleHQgb24gdGhlIGxhYmVsIG9mIHRoZSBidXR0b24uXG4gICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIHB1dCBpbnRvIHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uXG4gICAqL1xuICBzZXRUZXh0KHRleHQ6IExvY2FsaXphYmxlVGV4dCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmZpbmQoJy4nICsgdGhpcy5wcmVmaXhDc3MoJ2xhYmVsJykpLmh0bWwoaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRleHQpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNsaWNrRXZlbnQoKSB7XG4gICAgdGhpcy5idXR0b25FdmVudHMub25DbGljay5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8QnV0dG9uPENvbmZpZz4sIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25DbGljaygpOiBFdmVudDxCdXR0b248Q29uZmlnPiwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uRXZlbnRzLm9uQ2xpY2suZ2V0RXZlbnQoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb250YWluZXJDb25maWcsIENvbnRhaW5lcn0gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHtMYWJlbCwgTGFiZWxDb25maWd9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IENhc3RTdGFydGVkRXZlbnQsIENhc3RXYWl0aW5nRm9yRGV2aWNlRXZlbnQsIFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIE92ZXJsYXlzIHRoZSBwbGF5ZXIgYW5kIGRpc3BsYXlzIHRoZSBzdGF0dXMgb2YgYSBDYXN0IHNlc3Npb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDYXN0U3RhdHVzT3ZlcmxheSBleHRlbmRzIENvbnRhaW5lcjxDb250YWluZXJDb25maWc+IHtcblxuICBwcml2YXRlIHN0YXR1c0xhYmVsOiBMYWJlbDxMYWJlbENvbmZpZz47XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb250YWluZXJDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLnN0YXR1c0xhYmVsID0gbmV3IExhYmVsPExhYmVsQ29uZmlnPih7IGNzc0NsYXNzOiAndWktY2FzdC1zdGF0dXMtbGFiZWwnIH0pO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1jYXN0LXN0YXR1cy1vdmVybGF5JyxcbiAgICAgIGNvbXBvbmVudHM6IFt0aGlzLnN0YXR1c0xhYmVsXSxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RXYWl0aW5nRm9yRGV2aWNlLFxuICAgICAgKGV2ZW50OiBDYXN0V2FpdGluZ0ZvckRldmljZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICAvLyBHZXQgZGV2aWNlIG5hbWUgYW5kIHVwZGF0ZSBzdGF0dXMgdGV4dCB3aGlsZSBjb25uZWN0aW5nXG4gICAgICAgIGxldCBjYXN0RGV2aWNlTmFtZSA9IGV2ZW50LmNhc3RQYXlsb2FkLmRldmljZU5hbWU7XG4gICAgICAgIHRoaXMuc3RhdHVzTGFiZWwuc2V0VGV4dChpMThuLmdldExvY2FsaXplcignY29ubmVjdGluZ1RvJywgeyBjYXN0RGV2aWNlTmFtZSB9KSk7XG4gICAgICB9KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQ2FzdFN0YXJ0ZWQsIChldmVudDogQ2FzdFN0YXJ0ZWRFdmVudCkgPT4ge1xuICAgICAgLy8gU2Vzc2lvbiBpcyBzdGFydGVkIG9yIHJlc3VtZWRcbiAgICAgIC8vIEZvciBjYXNlcyB3aGVuIGEgc2Vzc2lvbiBpcyByZXN1bWVkLCB3ZSBkbyBub3QgcmVjZWl2ZSB0aGUgcHJldmlvdXMgZXZlbnRzIGFuZCB0aGVyZWZvcmUgc2hvdyB0aGUgc3RhdHVzIHBhbmVsXG4gICAgICAvLyBoZXJlIHRvb1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgICBsZXQgY2FzdERldmljZU5hbWUgPSBldmVudC5kZXZpY2VOYW1lO1xuICAgICAgdGhpcy5zdGF0dXNMYWJlbC5zZXRUZXh0KGkxOG4uZ2V0TG9jYWxpemVyKCdwbGF5aW5nT24nLCB7IGNhc3REZXZpY2VOYW1lIH0pKTtcbiAgICB9KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQ2FzdFN0b3BwZWQsIChldmVudCkgPT4ge1xuICAgICAgLy8gQ2FzdCBzZXNzaW9uIGdvbmUsIGhpZGUgdGhlIHN0YXR1cyBwYW5lbFxuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSk7XG4gIH1cbn0iLCJpbXBvcnQge1RvZ2dsZUJ1dHRvbiwgVG9nZ2xlQnV0dG9uQ29uZmlnfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCB0b2dnbGVzIGNhc3RpbmcgdG8gYSBDYXN0IHJlY2VpdmVyLlxuICovXG5leHBvcnQgY2xhc3MgQ2FzdFRvZ2dsZUJ1dHRvbiBleHRlbmRzIFRvZ2dsZUJ1dHRvbjxUb2dnbGVCdXR0b25Db25maWc+IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFRvZ2dsZUJ1dHRvbkNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktY2FzdHRvZ2dsZWJ1dHRvbicsXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcignZ29vZ2xlQ2FzdCcpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmIChwbGF5ZXIuaXNDYXN0QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgaWYgKHBsYXllci5pc0Nhc3RpbmcoKSkge1xuICAgICAgICAgIHBsYXllci5jYXN0U3RvcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBsYXllci5jYXN0VmlkZW8oKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQ2FzdCB1bmF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgY2FzdEF2YWlsYWJsZUhhbmRlciA9ICgpID0+IHtcbiAgICAgIGlmIChwbGF5ZXIuaXNDYXN0QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RBdmFpbGFibGUsIGNhc3RBdmFpbGFibGVIYW5kZXIpO1xuXG4gICAgLy8gVG9nZ2xlIGJ1dHRvbiAnb24nIHN0YXRlXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RXYWl0aW5nRm9yRGV2aWNlLCAoKSA9PiB7XG4gICAgICB0aGlzLm9uKCk7XG4gICAgfSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RTdGFydGVkLCAoKSA9PiB7XG4gICAgICAvLyBXaGVuIGEgc2Vzc2lvbiBpcyByZXN1bWVkLCB0aGVyZSBpcyBubyBDYXN0U3RhcnQgZXZlbnQsIHNvIHdlIGFsc28gbmVlZCB0byB0b2dnbGUgaGVyZSBmb3Igc3VjaCBjYXNlc1xuICAgICAgdGhpcy5vbigpO1xuICAgIH0pO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5DYXN0U3RvcHBlZCwgKCkgPT4ge1xuICAgICAgdGhpcy5vZmYoKTtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0dXAgaW5pdFxuICAgIGNhc3RBdmFpbGFibGVIYW5kZXIoKTsgLy8gSGlkZSBidXR0b24gaWYgQ2FzdCBub3QgYXZhaWxhYmxlXG4gICAgaWYgKHBsYXllci5pc0Nhc3RpbmcoKSkge1xuICAgICAgdGhpcy5vbigpO1xuICAgIH1cbiAgfVxufSIsImltcG9ydCB7VUlDb250YWluZXIsIFVJQ29udGFpbmVyQ29uZmlnfSBmcm9tICcuL3VpY29udGFpbmVyJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1RpbWVvdXR9IGZyb20gJy4uL3RpbWVvdXQnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcblxuLyoqXG4gKiBUaGUgYmFzZSBjb250YWluZXIgZm9yIENhc3QgcmVjZWl2ZXJzIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBVSSBhbmQgdGFrZXMgY2FyZSB0aGF0IHRoZSBVSSBpcyBzaG93biBvblxuICogY2VydGFpbiBwbGF5YmFjayBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYXN0VUlDb250YWluZXIgZXh0ZW5kcyBVSUNvbnRhaW5lciB7XG5cbiAgcHJpdmF0ZSBjYXN0VWlIaWRlVGltZW91dDogVGltZW91dDtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFVJQ29udGFpbmVyQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgIC8qXG4gICAgICogU2hvdyBVSSBvbiBDYXN0IGRldmljZXMgYXQgY2VydGFpbiBwbGF5YmFjayBldmVudHNcbiAgICAgKlxuICAgICAqIFNpbmNlIGEgQ2FzdCByZWNlaXZlciBkb2VzIG5vdCBoYXZlIGEgZGlyZWN0IEhDSSwgd2Ugc2hvdyB0aGUgVUkgb24gY2VydGFpbiBwbGF5YmFjayBldmVudHMgdG8gZ2l2ZSB0aGUgdXNlclxuICAgICAqIGEgY2hhbmNlIHRvIHNlZSBvbiB0aGUgc2NyZWVuIHdoYXQncyBnb2luZyBvbiwgZS5nLiBvbiBwbGF5L3BhdXNlIG9yIGEgc2VlayB0aGUgVUkgaXMgc2hvd24gYW5kIHRoZSB1c2VyIGNhblxuICAgICAqIHNlZSB0aGUgY3VycmVudCB0aW1lIGFuZCBwb3NpdGlvbiBvbiB0aGUgc2VlayBiYXIuXG4gICAgICogVGhlIFVJIGlzIHNob3duIHBlcm1hbmVudGx5IHdoaWxlIHBsYXliYWNrIGlzIHBhdXNlZCwgb3RoZXJ3aXNlIGhpZGVzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGNvbmZpZ3VyZWRcbiAgICAgKiBoaWRlIGRlbGF5IHRpbWUuXG4gICAgICovXG5cbiAgICBsZXQgaXNVaVNob3duID0gZmFsc2U7XG5cbiAgICBsZXQgaGlkZVVpID0gKCkgPT4ge1xuICAgICAgdWltYW5hZ2VyLm9uQ29udHJvbHNIaWRlLmRpc3BhdGNoKHRoaXMpO1xuICAgICAgaXNVaVNob3duID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHRoaXMuY2FzdFVpSGlkZVRpbWVvdXQgPSBuZXcgVGltZW91dChjb25maWcuaGlkZURlbGF5LCBoaWRlVWkpO1xuXG4gICAgbGV0IHNob3dVaSA9ICgpID0+IHtcbiAgICAgIGlmICghaXNVaVNob3duKSB7XG4gICAgICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzU2hvdy5kaXNwYXRjaCh0aGlzKTtcbiAgICAgICAgaXNVaVNob3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IHNob3dVaVBlcm1hbmVudGx5ID0gKCkgPT4ge1xuICAgICAgc2hvd1VpKCk7XG4gICAgICB0aGlzLmNhc3RVaUhpZGVUaW1lb3V0LmNsZWFyKCk7XG4gICAgfTtcblxuICAgIGxldCBzaG93VWlXaXRoVGltZW91dCA9ICgpID0+IHtcbiAgICAgIHNob3dVaSgpO1xuICAgICAgdGhpcy5jYXN0VWlIaWRlVGltZW91dC5zdGFydCgpO1xuICAgIH07XG5cbiAgICBsZXQgc2hvd1VpQWZ0ZXJTZWVrID0gKCkgPT4ge1xuICAgICAgaWYgKHBsYXllci5pc1BsYXlpbmcoKSkge1xuICAgICAgICBzaG93VWlXaXRoVGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd1VpUGVybWFuZW50bHkoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXksIHNob3dVaVdpdGhUaW1lb3V0KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGF1c2VkLCBzaG93VWlQZXJtYW5lbnRseSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNlZWssIHNob3dVaVBlcm1hbmVudGx5KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU2Vla2VkLCBzaG93VWlBZnRlclNlZWspO1xuXG4gICAgdWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKHNob3dVaVdpdGhUaW1lb3V0KTtcbiAgfVxuXG4gIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgc3VwZXIucmVsZWFzZSgpO1xuICAgIHRoaXMuY2FzdFVpSGlkZVRpbWVvdXQuY2xlYXIoKTtcbiAgfVxufSIsImltcG9ydCB7QnV0dG9uLCBCdXR0b25Db25maWd9IGZyb20gJy4vYnV0dG9uJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgYSB7QGxpbmsgQ2xpY2tPdmVybGF5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlja092ZXJsYXlDb25maWcgZXh0ZW5kcyBCdXR0b25Db25maWcge1xuICAvKipcbiAgICogVGhlIHVybCB0byBvcGVuIHdoZW4gdGhlIG92ZXJsYXkgaXMgY2xpY2tlZC4gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgY2xpY2sgaGFuZGxlci5cbiAgICovXG4gIHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNsaWNrIG92ZXJsYXkgdGhhdCBvcGVucyBhbiB1cmwgaW4gYSBuZXcgdGFiIGlmIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGlja092ZXJsYXkgZXh0ZW5kcyBCdXR0b248Q2xpY2tPdmVybGF5Q29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDbGlja092ZXJsYXlDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWNsaWNrb3ZlcmxheScsXG4gICAgICByb2xlOiB0aGlzLmNvbmZpZy5yb2xlLFxuICAgIH0sIDxDbGlja092ZXJsYXlDb25maWc+dGhpcy5jb25maWcpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG5cbiAgICB0aGlzLnNldFVybCgoPENsaWNrT3ZlcmxheUNvbmZpZz50aGlzLmNvbmZpZykudXJsKTtcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuZ2V0RG9tRWxlbWVudCgpO1xuICAgIGVsZW1lbnQub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZGF0YSgndXJsJykpIHtcbiAgICAgICAgd2luZG93Lm9wZW4oZWxlbWVudC5kYXRhKCd1cmwnKSwgJ19ibGFuaycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFVSTCB0aGF0IHNob3VsZCBiZSBmb2xsb3dlZCB3aGVuIHRoZSB3YXRlcm1hcmsgaXMgY2xpY2tlZC5cbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHdhdGVybWFyayBVUkxcbiAgICovXG4gIGdldFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldERvbUVsZW1lbnQoKS5kYXRhKCd1cmwnKTtcbiAgfVxuXG4gIHNldFVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh1cmwgPT09IHVuZGVmaW5lZCB8fCB1cmwgPT0gbnVsbCkge1xuICAgICAgdXJsID0gJyc7XG4gICAgfVxuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmRhdGEoJ3VybCcsIHVybCk7XG4gIH1cbn0iLCJpbXBvcnQge0J1dHRvbkNvbmZpZywgQnV0dG9ufSBmcm9tICcuL2J1dHRvbic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudENvbmZpZ30gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgQ2xvc2VCdXR0b259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsb3NlQnV0dG9uQ29uZmlnIGV4dGVuZHMgQnV0dG9uQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgY2xvc2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKi9cbiAgdGFyZ2V0OiBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPjtcbn1cblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IGNsb3NlcyAoaGlkZXMpIGEgY29uZmlndXJlZCBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG9zZUJ1dHRvbiBleHRlbmRzIEJ1dHRvbjxDbG9zZUJ1dHRvbkNvbmZpZz4ge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ2xvc2VCdXR0b25Db25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1jbG9zZWJ1dHRvbicsXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcignY2xvc2UnKSxcbiAgICB9IGFzIENsb3NlQnV0dG9uQ29uZmlnLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbGV0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbmZpZy50YXJnZXQuaGlkZSgpO1xuICAgIH0pO1xuICB9XG59IiwiaW1wb3J0IHtHdWlkfSBmcm9tICcuLi9ndWlkJztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHtFdmVudERpc3BhdGNoZXIsIE5vQXJncywgRXZlbnR9IGZyb20gJy4uL2V2ZW50ZGlzcGF0Y2hlcic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4sIExvY2FsaXphYmxlVGV4dCB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBCYXNlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciBhIGNvbXBvbmVudC5cbiAqIFNob3VsZCBiZSBleHRlbmRlZCBieSBjb21wb25lbnRzIHRoYXQgd2FudCB0byBhZGQgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBIVE1MIHRhZyBuYW1lIG9mIHRoZSBjb21wb25lbnQuXG4gICAqIERlZmF1bHQ6ICdkaXYnXG4gICAqL1xuICB0YWc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgSFRNTCBJRCBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBEZWZhdWx0OiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aXRoIHBhdHRlcm4gJ3VpLWlkLXtndWlkfScuXG4gICAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBwcmVmaXggdG8gcHJlcGVuZCBhbGwgQ1NTIGNsYXNzZXMgd2l0aC5cbiAgICovXG4gIGNzc1ByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENTUyBjbGFzc2VzIG9mIHRoZSBjb21wb25lbnQuIFRoaXMgaXMgdXN1YWxseSB0aGUgY2xhc3MgZnJvbSB3aGVyZSB0aGUgY29tcG9uZW50IHRha2VzIGl0cyBzdHlsaW5nLlxuICAgKi9cbiAgY3NzQ2xhc3M/OiBzdHJpbmc7IC8vICdjbGFzcycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLCBzbyB3ZSBuZWVkIHRvIG1ha2UgdGhlIG5hbWUgbW9yZSBjb21wbGljYXRlZFxuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBjc3NDbGFzc2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBiZSBoaWRkZW4gYXQgc3RhcnR1cC5cbiAgICogRGVmYXVsdDogZmFsc2VcbiAgICovXG4gIGhpZGRlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgKGludGVyYWN0aXZlKSBvciBub3QuXG4gICAqIERlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgY29tcG9uZW50IHJvbGUgZm9yIFdDQUcyMCBzdGFuZGFyZFxuICAgKi9cbiAgcm9sZT86IHN0cmluZztcblxuICAvKipcbiAgICogV0NBRzIwIHJlcXVpcmVtZW50IGZvciBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICovXG4gIHRhYkluZGV4PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXQ0FHMjAgc3RhbmRhcmQgZm9yIGRlZmluaW5nIGluZm8gYWJvdXQgdGhlIGNvbXBvbmVudCAodXN1YWxseSB0aGUgbmFtZSlcbiAgICovXG4gIGFyaWFMYWJlbD86IExvY2FsaXphYmxlVGV4dDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRIb3ZlckNoYW5nZWRFdmVudEFyZ3MgZXh0ZW5kcyBOb0FyZ3Mge1xuICAvKipcbiAgICogVHJ1ZSBpcyB0aGUgY29tcG9uZW50IGlzIGhvdmVyZWQsIGVsc2UgZmFsc2UuXG4gICAqL1xuICBob3ZlcmVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIG9mIHRoZSBVSSBmcmFtZXdvcmsuXG4gKiBFYWNoIGNvbXBvbmVudCBtdXN0IGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBvcHRpb25hbGx5IHRoZSBjb25maWcgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50PENvbmZpZyBleHRlbmRzIENvbXBvbmVudENvbmZpZz4ge1xuXG4gIC8qKlxuICAgKiBUaGUgY2xhc3NuYW1lIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQgd2hlbiBpdCBpcyBpbiB0aGUgaGlkZGVuIHN0YXRlLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xBU1NfSElEREVOID0gJ2hpZGRlbic7XG5cbiAgLyoqXG4gICAqIFRoZSBjbGFzc25hbWUgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCB3aGVuIGl0IGlzIGluIHRoZSBkaXNhYmxlZCBzdGF0ZS5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMQVNTX0RJU0FCTEVEID0gJ2Rpc2FibGVkJztcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBvYmplY3Qgb2YgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uZmlnOiBDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQncyBET00gZWxlbWVudC5cbiAgICovXG4gIHByaXZhdGUgZWxlbWVudDogRE9NO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIGhpZGRlbiBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgaGlkZGVuOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGbGF0IHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIGRpc2FibGVkIHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogRmxhZyB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZSBob3ZlciBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgaG92ZXJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZXZlbnRzIHRoYXQgdGhpcyBjb21wb25lbnQgb2ZmZXJzLiBUaGVzZSBldmVudHMgc2hvdWxkIGFsd2F5cyBiZSBwcml2YXRlIGFuZCBvbmx5IGRpcmVjdGx5XG4gICAqIGFjY2Vzc2VkIGZyb20gd2l0aGluIHRoZSBpbXBsZW1lbnRpbmcgY29tcG9uZW50LlxuICAgKlxuICAgKiBCZWNhdXNlIFR5cGVTY3JpcHQgZG9lcyBub3Qgc3VwcG9ydCBwcml2YXRlIHByb3BlcnRpZXMgd2l0aCB0aGUgc2FtZSBuYW1lIG9uIGRpZmZlcmVudCBjbGFzcyBoaWVyYXJjaHkgbGV2ZWxzXG4gICAqIChpLmUuIHN1cGVyY2xhc3MgYW5kIHN1YmNsYXNzIGNhbm5vdCBjb250YWluIGEgcHJpdmF0ZSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUpLCB0aGUgZGVmYXVsdCBuYW1pbmdcbiAgICogY29udmVudGlvbiBmb3IgdGhlIGV2ZW50IGxpc3Qgb2YgYSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgc3ViY2xhc3NlcyBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGVcbiAgICogY2FtZWwtY2FzZWQgY2xhc3MgbmFtZSArICdFdmVudHMnIChlLmcuIFN1YkNsYXNzIGV4dGVuZHMgQ29tcG9uZW50ID0+IHN1YkNsYXNzRXZlbnRzKS5cbiAgICogU2VlIHtAbGluayAjY29tcG9uZW50RXZlbnRzfSBmb3IgYW4gZXhhbXBsZS5cbiAgICpcbiAgICogRXZlbnQgcHJvcGVydGllcyBzaG91bGQgYmUgbmFtZWQgaW4gY2FtZWwgY2FzZSB3aXRoIGFuICdvbicgcHJlZml4IGFuZCBpbiB0aGUgcHJlc2VudCB0ZW5zZS4gQXN5bmMgZXZlbnRzIG1heVxuICAgKiBoYXZlIGEgc3RhcnQgZXZlbnQgKHdoZW4gdGhlIG9wZXJhdGlvbiBzdGFydHMpIGluIHRoZSBwcmVzZW50IHRlbnNlLCBhbmQgbXVzdCBoYXZlIGFuIGVuZCBldmVudCAod2hlbiB0aGVcbiAgICogb3BlcmF0aW9uIGVuZHMpIGluIHRoZSBwYXN0IHRlbnNlIChvciBwcmVzZW50IHRlbnNlIGluIHNwZWNpYWwgY2FzZXMgKGUuZy4gb25TdGFydC9vblN0YXJ0ZWQgb3Igb25QbGF5L29uUGxheWluZykuXG4gICAqIFNlZSB7QGxpbmsgI2NvbXBvbmVudEV2ZW50cyNvblNob3d9IGZvciBhbiBleGFtcGxlLlxuICAgKlxuICAgKiBFYWNoIGV2ZW50IHNob3VsZCBiZSBhY2NvbXBhbmllZCB3aXRoIGEgcHJvdGVjdGVkIG1ldGhvZCBuYW1lZCBieSB0aGUgY29udmVudGlvbiBldmVudE5hbWUgKyAnRXZlbnQnXG4gICAqIChlLmcuIG9uU3RhcnRFdmVudCksIHRoYXQgYWN0dWFsbHkgdHJpZ2dlcnMgdGhlIGV2ZW50IGJ5IGNhbGxpbmcge0BsaW5rIEV2ZW50RGlzcGF0Y2hlciNkaXNwYXRjaCBkaXNwYXRjaH0gYW5kXG4gICAqIHBhc3NpbmcgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCBhcyBmaXJzdCBwYXJhbWV0ZXIuIENvbXBvbmVudHMgc2hvdWxkIGFsd2F5cyB0cmlnZ2VyIHRoZWlyIGV2ZW50cyB3aXRoIHRoZXNlXG4gICAqIG1ldGhvZHMuIEltcGxlbWVudGluZyB0aGlzIHBhdHRlcm4gZ2l2ZXMgc3ViY2xhc3NlcyBtZWFucyB0byBkaXJlY3RseSBsaXN0ZW4gdG8gdGhlIGV2ZW50cyBieSBvdmVycmlkaW5nIHRoZVxuICAgKiBtZXRob2QgKGFuZCBzYXZpbmcgdGhlIG92ZXJoZWFkIG9mIHBhc3NpbmcgYSBoYW5kbGVyIHRvIHRoZSBldmVudCBkaXNwYXRjaGVyKSBhbmQgbW9yZSBpbXBvcnRhbnRseSB0byB0cmlnZ2VyXG4gICAqIHRoZXNlIGV2ZW50cyB3aXRob3V0IGhhdmluZyBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgZXZlbnQgbGlzdC5cbiAgICogU2VlIHtAbGluayAjb25TaG93fSBmb3IgYW4gZXhhbXBsZS5cbiAgICpcbiAgICogVG8gcHJvdmlkZSBleHRlcm5hbCBjb2RlIHRoZSBwb3NzaWJpbGl0eSB0byBsaXN0ZW4gdG8gdGhpcyBjb21wb25lbnQncyBldmVudHMgKHN1YnNjcmliZSwgdW5zdWJzY3JpYmUsIGV0Yy4pLFxuICAgKiBlYWNoIGV2ZW50IHNob3VsZCBhbHNvIGJlIGFjY29tcGFuaWVkIGJ5IGEgcHVibGljIGdldHRlciBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50J3MgcHJvcGVydHksXG4gICAqIHRoYXQgcmV0dXJucyB0aGUge0BsaW5rIEV2ZW50fSBvYnRhaW5lZCBmcm9tIHRoZSBldmVudCBkaXNwYXRjaGVyIGJ5IGNhbGxpbmcge0BsaW5rIEV2ZW50RGlzcGF0Y2hlciNnZXRFdmVudH0uXG4gICAqIFNlZSB7QGxpbmsgI29uU2hvd30gZm9yIGFuIGV4YW1wbGUuXG4gICAqXG4gICAqIEZ1bGwgZXhhbXBsZSBmb3IgYW4gZXZlbnQgcmVwcmVzZW50aW5nIGFuIGV4YW1wbGUgYWN0aW9uIGluIGEgZXhhbXBsZSBjb21wb25lbnQ6XG4gICAqXG4gICAqIDxjb2RlPlxuICAgKiAvLyBEZWZpbmUgYW4gZXhhbXBsZSBjb21wb25lbnQgY2xhc3Mgd2l0aCBhbiBleGFtcGxlIGV2ZW50XG4gICAqIGNsYXNzIEV4YW1wbGVDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiB7XG4gICAgICpcbiAgICAgKiAgICAgcHJpdmF0ZSBleGFtcGxlQ29tcG9uZW50RXZlbnRzID0ge1xuICAgICAqICAgICAgICAgb25FeGFtcGxlQWN0aW9uOiBuZXcgRXZlbnREaXNwYXRjaGVyPEV4YW1wbGVDb21wb25lbnQsIE5vQXJncz4oKVxuICAgICAqICAgICB9XG4gICAgICpcbiAgICAgKiAgICAgLy8gY29uc3RydWN0b3IgYW5kIG90aGVyIHN0dWZmLi4uXG4gICAgICpcbiAgICAgKiAgICAgcHJvdGVjdGVkIG9uRXhhbXBsZUFjdGlvbkV2ZW50KCkge1xuICAgICAqICAgICAgICB0aGlzLmV4YW1wbGVDb21wb25lbnRFdmVudHMub25FeGFtcGxlQWN0aW9uLmRpc3BhdGNoKHRoaXMpO1xuICAgICAqICAgIH1cbiAgICAgKlxuICAgICAqICAgIGdldCBvbkV4YW1wbGVBY3Rpb24oKTogRXZlbnQ8RXhhbXBsZUNvbXBvbmVudCwgTm9BcmdzPiB7XG4gICAgICogICAgICAgIHJldHVybiB0aGlzLmV4YW1wbGVDb21wb25lbnRFdmVudHMub25FeGFtcGxlQWN0aW9uLmdldEV2ZW50KCk7XG4gICAgICogICAgfVxuICAgICAqIH1cbiAgICpcbiAgICogLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQgc29tZXdoZXJlXG4gICAqIHZhciBleGFtcGxlQ29tcG9uZW50SW5zdGFuY2UgPSBuZXcgRXhhbXBsZUNvbXBvbmVudCgpO1xuICAgKlxuICAgKiAvLyBTdWJzY3JpYmUgdG8gdGhlIGV4YW1wbGUgZXZlbnQgb24gdGhlIGNvbXBvbmVudFxuICAgKiBleGFtcGxlQ29tcG9uZW50SW5zdGFuY2Uub25FeGFtcGxlQWN0aW9uLnN1YnNjcmliZShmdW5jdGlvbiAoc2VuZGVyOiBFeGFtcGxlQ29tcG9uZW50KSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdvbkV4YW1wbGVBY3Rpb24gb2YgJyArIHNlbmRlciArICcgaGFzIGZpcmVkIScpO1xuICAgICAqIH0pO1xuICAgKiA8L2NvZGU+XG4gICAqL1xuICBwcml2YXRlIGNvbXBvbmVudEV2ZW50cyA9IHtcbiAgICBvblNob3c6IG5ldyBFdmVudERpc3BhdGNoZXI8Q29tcG9uZW50PENvbmZpZz4sIE5vQXJncz4oKSxcbiAgICBvbkhpZGU6IG5ldyBFdmVudERpc3BhdGNoZXI8Q29tcG9uZW50PENvbmZpZz4sIE5vQXJncz4oKSxcbiAgICBvbkhvdmVyQ2hhbmdlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxDb21wb25lbnQ8Q29uZmlnPiwgQ29tcG9uZW50SG92ZXJDaGFuZ2VkRXZlbnRBcmdzPigpLFxuICAgIG9uRW5hYmxlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxDb21wb25lbnQ8Q29uZmlnPiwgTm9BcmdzPigpLFxuICAgIG9uRGlzYWJsZWQ6IG5ldyBFdmVudERpc3BhdGNoZXI8Q29tcG9uZW50PENvbmZpZz4sIE5vQXJncz4oKSxcbiAgfTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIGNvbXBvbmVudCB3aXRoIGFuIG9wdGlvbmFsbHkgc3VwcGxpZWQgY29uZmlnLiBBbGwgc3ViY2xhc3NlcyBtdXN0IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZWlyXG4gICAqIHN1cGVyY2xhc3MgYW5kIHRoZW4gbWVyZ2UgdGhlaXIgY29uZmlndXJhdGlvbiBpbnRvIHRoZSBjb21wb25lbnQncyBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0gY29uZmlnIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgY29tcG9uZW50XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbXBvbmVudENvbmZpZyA9IHt9KSB7XG4gICAgLy8gQ3JlYXRlIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIGNvbXBvbmVudFxuICAgIHRoaXMuY29uZmlnID0gPENvbmZpZz50aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgdGFnOiAnZGl2JyxcbiAgICAgIGlkOiAne3tQUkVGSVh9fS1pZC0nICsgR3VpZC5uZXh0KCksXG4gICAgICBjc3NQcmVmaXg6ICd7e1BSRUZJWH19JyxcbiAgICAgIGNzc0NsYXNzOiAndWktY29tcG9uZW50JyxcbiAgICAgIGNzc0NsYXNzZXM6IFtdLFxuICAgICAgaGlkZGVuOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICB9LCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCwgZS5nLiBieSBhcHBseWluZyBjb25maWcgc2V0dGluZ3MuXG4gICAqIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgdGhlIFVJIGZyYW1ld29yay5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgYnkgdGhlIHtAbGluayBVSUluc3RhbmNlTWFuYWdlcn0uIElmIHRoZSBjb21wb25lbnQgaXMgYW4gaW5uZXIgY29tcG9uZW50IG9mXG4gICAqIHNvbWUgY29tcG9uZW50LCBhbmQgdGh1cyBlbmNhcHN1bGF0ZWQgYWJkIG1hbmFnZWQgaW50ZXJuYWxseSBhbmQgbmV2ZXIgZGlyZWN0bHkgZXhwb3NlZCB0byB0aGUgVUlNYW5hZ2VyLFxuICAgKiB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBtYW5hZ2luZyBjb21wb25lbnQncyB7QGxpbmsgI2luaXRpYWxpemV9IG1ldGhvZC5cbiAgICovXG4gIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgdGhpcy5oaWRkZW4gPSB0aGlzLmNvbmZpZy5oaWRkZW47XG4gICAgdGhpcy5kaXNhYmxlZCA9IHRoaXMuY29uZmlnLmRpc2FibGVkO1xuXG4gICAgLy8gSGlkZSB0aGUgY29tcG9uZW50IGF0IGluaXRpYWxpemF0aW9uIGlmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gYmUgaGlkZGVuXG4gICAgaWYgKHRoaXMuaXNIaWRkZW4oKSkge1xuICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTsgLy8gU2V0IGZsYWcgdG8gZmFsc2UgZm9yIHRoZSBmb2xsb3dpbmcgaGlkZSgpIGNhbGwgdG8gd29yayAoaGlkZSgpIGNoZWNrcyB0aGUgZmxhZylcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cblxuICAgIC8vIERpc2FibGUgdGhlIGNvbXBvbmVudCBhdCBpbml0aWFsaXphdGlvbiBpZiBpdCBpcyBjb25maWd1cmVkIHRvIGJlIGRpc2FibGVkXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7IC8vIFNldCBmbGFnIHRvIGZhbHNlIGZvciB0aGUgZm9sbG93aW5nIGRpc2FibGUoKSBjYWxsIHRvIHdvcmsgKGRpc2FibGUoKSBjaGVja3MgdGhlIGZsYWcpXG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlcyB0aGUgY29tcG9uZW50IGZvciB0aGUgc3VwcGxpZWQgUGxheWVyIGFuZCBVSUluc3RhbmNlTWFuYWdlci4gVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgYWxsIHRoZSBtYWdpY1xuICAgKiBoYXBwZW5zLCB3aGVyZSBjb21wb25lbnRzIHR5cGljYWxseSBzdWJzY3JpYmUgYW5kIHJlYWN0IHRvIGV2ZW50cyAob24gdGhlaXIgRE9NIGVsZW1lbnQsIHRoZSBQbGF5ZXIsIG9yIHRoZVxuICAgKiBVSUluc3RhbmNlTWFuYWdlciksIGFuZCBiYXNpY2FsbHkgZXZlcnl0aGluZyB0aGF0IG1ha2VzIHRoZW0gaW50ZXJhY3RpdmUuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IG9uY2UsIHdoZW4gdGhlIFVJTWFuYWdlciBpbml0aWFsaXplcyB0aGUgVUkuXG4gICAqXG4gICAqIFN1YmNsYXNzZXMgdXN1YWxseSBvdmVyd3JpdGUgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gcGxheWVyIHRoZSBwbGF5ZXIgd2hpY2ggdGhpcyBjb21wb25lbnQgY29udHJvbHNcbiAgICogQHBhcmFtIHVpbWFuYWdlciB0aGUgVUlJbnN0YW5jZU1hbmFnZXIgdGhhdCBtYW5hZ2VzIHRoaXMgY29tcG9uZW50XG4gICAqL1xuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICB0aGlzLm9uU2hvdy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdWltYW5hZ2VyLm9uQ29tcG9uZW50U2hvdy5kaXNwYXRjaCh0aGlzKTtcbiAgICB9KTtcbiAgICB0aGlzLm9uSGlkZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdWltYW5hZ2VyLm9uQ29tcG9uZW50SGlkZS5kaXNwYXRjaCh0aGlzKTtcbiAgICB9KTtcblxuICAgIC8vIFRyYWNrIHRoZSBob3ZlcmVkIHN0YXRlIG9mIHRoZSBlbGVtZW50XG4gICAgdGhpcy5nZXREb21FbGVtZW50KCkub24oJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICB0aGlzLm9uSG92ZXJDaGFuZ2VkRXZlbnQodHJ1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5nZXREb21FbGVtZW50KCkub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICB0aGlzLm9uSG92ZXJDaGFuZ2VkRXZlbnQoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgYW5kIGRlcGVuZGVuY2llcyB0aGF0IHRoZSBjb21wb25lbnQgaG9sZHMuIFBsYXllciwgRE9NLCBhbmQgVUlNYW5hZ2VyIGV2ZW50cyBhcmVcbiAgICogYXV0b21hdGljYWxseSByZW1vdmVkIGR1cmluZyByZWxlYXNlIGFuZCBkbyBub3QgZXhwbGljaXRseSBuZWVkIHRvIGJlIHJlbW92ZWQgaGVyZS5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBVSU1hbmFnZXIgd2hlbiBpdCByZWxlYXNlcyB0aGUgVUkuXG4gICAqXG4gICAqIFN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIHJlbGVhc2UgcmVzb3VyY2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgY2FsbCBzdXBlci5yZWxlYXNlKCkuXG4gICAqL1xuICByZWxlYXNlKCk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZSwgb3ZlcnJpZGUgd2hlcmUgbmVjZXNzYXJ5XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIERPTSBlbGVtZW50IGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICpcbiAgICogU3ViY2xhc3NlcyB1c3VhbGx5IG92ZXJ3cml0ZSB0aGlzIG1ldGhvZCB0byBleHRlbmQgb3IgcmVwbGFjZSB0aGUgRE9NIGVsZW1lbnQgd2l0aCB0aGVpciBvd24gZGVzaWduLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvRG9tRWxlbWVudCgpOiBET00ge1xuICAgIGxldCBlbGVtZW50ID0gbmV3IERPTSh0aGlzLmNvbmZpZy50YWcsIHtcbiAgICAgICdpZCc6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgJ2NsYXNzJzogdGhpcy5nZXRDc3NDbGFzc2VzKCksXG4gICAgICAncm9sZSc6IHRoaXMuY29uZmlnLnJvbGUsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBET00gZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudC4gQ3JlYXRlcyB0aGUgRE9NIGVsZW1lbnQgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0LlxuICAgKlxuICAgKiBTaG91bGQgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHN1YmNsYXNzZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtET019XG4gICAqL1xuICBnZXREb21FbGVtZW50KCk6IERPTSB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMudG9Eb21FbGVtZW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudDtcbiAgfVxuXG4gIHNldEFyaWFMYWJlbChsYWJlbDogTG9jYWxpemFibGVUZXh0KTogdm9pZCB7XG4gICAgdGhpcy5zZXRBcmlhQXR0cignbGFiZWwnLCBpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24obGFiZWwpKTtcbiAgfVxuXG4gIHNldEFyaWFBdHRyKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmF0dHIoYGFyaWEtJHtuYW1lfWAsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgYSBjb25maWd1cmF0aW9uIHdpdGggYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYW5kIGEgYmFzZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIHN1cGVyY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZSBjb21wb25lbnRzLCBhcyB1c3VhbGx5IHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGRlZmF1bHRzIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBzZXR0aW5ncyB0aGF0IGFyZSBub3QgcGFzc2VkIHdpdGggdGhlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIGJhc2UgY29uZmlndXJhdGlvbiBpbmhlcml0ZWQgZnJvbSBhIHN1cGVyY2xhc3NcbiAgICogQHJldHVybnMge0NvbmZpZ31cbiAgICovXG4gIHByb3RlY3RlZCBtZXJnZUNvbmZpZzxDb25maWc+KGNvbmZpZzogQ29uZmlnLCBkZWZhdWx0czogQ29uZmlnLCBiYXNlOiBDb25maWcpOiBDb25maWcge1xuICAgIC8vIEV4dGVuZCBkZWZhdWx0IGNvbmZpZyB3aXRoIHN1cHBsaWVkIGNvbmZpZ1xuICAgIGxldCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBiYXNlLCBkZWZhdWx0cywgY29uZmlnKTtcblxuICAgIC8vIFJldHVybiB0aGUgZXh0ZW5kZWQgY29uZmlnXG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHN0cmluZyBvZiBhbGwgQ1NTIGNsYXNzZXMgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RlY3RlZCBnZXRDc3NDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgLy8gTWVyZ2UgYWxsIENTUyBjbGFzc2VzIGludG8gc2luZ2xlIGFycmF5XG4gICAgbGV0IGZsYXR0ZW5lZEFycmF5ID0gW3RoaXMuY29uZmlnLmNzc0NsYXNzXS5jb25jYXQodGhpcy5jb25maWcuY3NzQ2xhc3Nlcyk7XG4gICAgLy8gUHJlZml4IGNsYXNzZXNcbiAgICBmbGF0dGVuZWRBcnJheSA9IGZsYXR0ZW5lZEFycmF5Lm1hcCgoY3NzKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVmaXhDc3MoY3NzKTtcbiAgICB9KTtcbiAgICAvLyBKb2luIGFycmF5IHZhbHVlcyBpbnRvIGEgc3RyaW5nXG4gICAgbGV0IGZsYXR0ZW5lZFN0cmluZyA9IGZsYXR0ZW5lZEFycmF5LmpvaW4oJyAnKTtcbiAgICAvLyBSZXR1cm4gdHJpbW1lZCBzdHJpbmcgdG8gcHJldmVudCB3aGl0ZXNwYWNlIGF0IHRoZSBlbmQgZnJvbSB0aGUgam9pbiBvcGVyYXRpb25cbiAgICByZXR1cm4gZmxhdHRlbmVkU3RyaW5nLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVmaXhDc3MoY3NzQ2xhc3NPcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5jc3NQcmVmaXggKyAnLScgKyBjc3NDbGFzc09ySWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvYmplY3Qgb2YgdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMge0NvbmZpZ31cbiAgICovXG4gIHB1YmxpYyBnZXRDb25maWcoKTogQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGNvbXBvbmVudCBpZiBzaG93bi5cbiAgICogVGhpcyBtZXRob2QgYmFzaWNhbGx5IHRyYW5zZmVycyB0aGUgY29tcG9uZW50IGludG8gdGhlIGhpZGRlbiBzdGF0ZS4gQWN0dWFsIGhpZGluZyBpcyBkb25lIHZpYSBDU1MuXG4gICAqL1xuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5oaWRkZW4pIHtcbiAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKENvbXBvbmVudC5DTEFTU19ISURERU4pKTtcbiAgICAgIHRoaXMub25IaWRlRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgdGhlIGNvbXBvbmVudCBpZiBoaWRkZW4uXG4gICAqL1xuICBzaG93KCkge1xuICAgIGlmICh0aGlzLmhpZGRlbikge1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoQ29tcG9uZW50LkNMQVNTX0hJRERFTikpO1xuICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMub25TaG93RXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY29tcG9uZW50IGlzIGhpZGRlbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyBoaWRkZW4sIGVsc2UgZmFsc2VcbiAgICovXG4gIGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpZGRlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjb21wb25lbnQgaXMgc2hvd24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgdmlzaWJsZSwgZWxzZSBmYWxzZVxuICAgKi9cbiAgaXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNIaWRkZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBoaWRkZW4gc3RhdGUgYnkgaGlkaW5nIHRoZSBjb21wb25lbnQgaWYgaXQgaXMgc2hvd24sIG9yIHNob3dpbmcgaXQgaWYgaGlkZGVuLlxuICAgKi9cbiAgdG9nZ2xlSGlkZGVuKCkge1xuICAgIGlmICh0aGlzLmlzSGlkZGVuKCkpIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZXMgdGhlIGNvbXBvbmVudC5cbiAgICogVGhpcyBtZXRob2QgYmFzaWNhbGx5IHRyYW5zZmVycyB0aGUgY29tcG9uZW50IGludG8gdGhlIGRpc2FibGVkIHN0YXRlLiBBY3R1YWwgZGlzYWJsaW5nIGlzIGRvbmUgdmlhIENTUyBvciBjaGlsZFxuICAgKiBjb21wb25lbnRzLiAoZS5nLiBCdXR0b24gbmVlZHMgdG8gdW5zdWJzY3JpYmUgY2xpY2sgbGlzdGVuZXJzKVxuICAgKi9cbiAgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoQ29tcG9uZW50LkNMQVNTX0RJU0FCTEVEKSk7XG4gICAgICB0aGlzLm9uRGlzYWJsZWRFdmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBjb21wb25lbnQuXG4gICAqIFRoaXMgbWV0aG9kIGJhc2ljYWxseSB0cmFuc2ZlcnMgdGhlIGNvbXBvbmVudCBpbnRvIHRoZSBlbmFibGVkIHN0YXRlLiBBY3R1YWwgZW5hYmxpbmcgaXMgZG9uZSB2aWEgQ1NTIG9yIGNoaWxkXG4gICAqIGNvbXBvbmVudHMuIChlLmcuIEJ1dHRvbiBuZWVkcyB0byBzdWJzY3JpYmUgY2xpY2sgbGlzdGVuZXJzKVxuICAgKi9cbiAgZW5hYmxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhDb21wb25lbnQuQ0xBU1NfRElTQUJMRUQpKTtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMub25FbmFibGVkRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGNvbXBvbmVudCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQsIGVsc2UgZmFsc2VcbiAgICovXG4gIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgaG92ZXJlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyBob3ZlcmVkLCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc0hvdmVyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaG92ZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgb25TaG93IGV2ZW50LlxuICAgKiBTZWUgdGhlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIGV2ZW50IGFyY2hpdGVjdHVyZSBvbiB0aGUge0BsaW5rICNjb21wb25lbnRFdmVudHMgZXZlbnRzIGxpc3R9LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uU2hvd0V2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uU2hvdy5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgb25IaWRlIGV2ZW50LlxuICAgKiBTZWUgdGhlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIGV2ZW50IGFyY2hpdGVjdHVyZSBvbiB0aGUge0BsaW5rICNjb21wb25lbnRFdmVudHMgZXZlbnRzIGxpc3R9LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uSGlkZUV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uSGlkZS5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgb25FbmFibGVkIGV2ZW50LlxuICAgKiBTZWUgdGhlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIGV2ZW50IGFyY2hpdGVjdHVyZSBvbiB0aGUge0BsaW5rICNjb21wb25lbnRFdmVudHMgZXZlbnRzIGxpc3R9LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRW5hYmxlZEV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uRW5hYmxlZC5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgb25EaXNhYmxlZCBldmVudC5cbiAgICogU2VlIHRoZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvbiBldmVudCBhcmNoaXRlY3R1cmUgb24gdGhlIHtAbGluayAjY29tcG9uZW50RXZlbnRzIGV2ZW50cyBsaXN0fS5cbiAgICovXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnRFdmVudHMub25EaXNhYmxlZC5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgb25Ib3ZlckNoYW5nZWQgZXZlbnQuXG4gICAqIFNlZSB0aGUgZGV0YWlsZWQgZXhwbGFuYXRpb24gb24gZXZlbnQgYXJjaGl0ZWN0dXJlIG9uIHRoZSB7QGxpbmsgI2NvbXBvbmVudEV2ZW50cyBldmVudHMgbGlzdH0uXG4gICAqL1xuICBwcm90ZWN0ZWQgb25Ib3ZlckNoYW5nZWRFdmVudChob3ZlcmVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5ob3ZlcmVkID0gaG92ZXJlZDtcbiAgICB0aGlzLmNvbXBvbmVudEV2ZW50cy5vbkhvdmVyQ2hhbmdlZC5kaXNwYXRjaCh0aGlzLCB7IGhvdmVyZWQ6IGhvdmVyZWQgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgc2hvd2luZy5cbiAgICogU2VlIHRoZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvbiBldmVudCBhcmNoaXRlY3R1cmUgb24gdGhlIHtAbGluayAjY29tcG9uZW50RXZlbnRzIGV2ZW50cyBsaXN0fS5cbiAgICogQHJldHVybnMge0V2ZW50PENvbXBvbmVudDxDb25maWc+LCBOb0FyZ3M+fVxuICAgKi9cbiAgZ2V0IG9uU2hvdygpOiBFdmVudDxDb21wb25lbnQ8Q29uZmlnPiwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uU2hvdy5nZXRFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGhpZGluZy5cbiAgICogU2VlIHRoZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvbiBldmVudCBhcmNoaXRlY3R1cmUgb24gdGhlIHtAbGluayAjY29tcG9uZW50RXZlbnRzIGV2ZW50cyBsaXN0fS5cbiAgICogQHJldHVybnMge0V2ZW50PENvbXBvbmVudDxDb25maWc+LCBOb0FyZ3M+fVxuICAgKi9cbiAgZ2V0IG9uSGlkZSgpOiBFdmVudDxDb21wb25lbnQ8Q29uZmlnPiwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uSGlkZS5nZXRFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGVuYWJsaW5nLlxuICAgKiBTZWUgdGhlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIGV2ZW50IGFyY2hpdGVjdHVyZSBvbiB0aGUge0BsaW5rICNjb21wb25lbnRFdmVudHMgZXZlbnRzIGxpc3R9LlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8Q29tcG9uZW50PENvbmZpZz4sIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25FbmFibGVkKCk6IEV2ZW50PENvbXBvbmVudDxDb25maWc+LCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRFdmVudHMub25FbmFibGVkLmdldEV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsaW5nLlxuICAgKiBTZWUgdGhlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIGV2ZW50IGFyY2hpdGVjdHVyZSBvbiB0aGUge0BsaW5rICNjb21wb25lbnRFdmVudHMgZXZlbnRzIGxpc3R9LlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8Q29tcG9uZW50PENvbmZpZz4sIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25EaXNhYmxlZCgpOiBFdmVudDxDb21wb25lbnQ8Q29uZmlnPiwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uRGlzYWJsZWQuZ2V0RXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIGNvbXBvbmVudCdzIGhvdmVyLXN0YXRlIGlzIGNoYW5naW5nLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8Q29tcG9uZW50PENvbmZpZz4sIENvbXBvbmVudEhvdmVyQ2hhbmdlZEV2ZW50QXJncz59XG4gICAqL1xuICBnZXQgb25Ib3ZlckNoYW5nZWQoKTogRXZlbnQ8Q29tcG9uZW50PENvbmZpZz4sIENvbXBvbmVudEhvdmVyQ2hhbmdlZEV2ZW50QXJncz4ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEV2ZW50cy5vbkhvdmVyQ2hhbmdlZC5nZXRFdmVudCgpO1xuICB9XG59IiwiaW1wb3J0IHtDb21wb25lbnRDb25maWcsIENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHtET019IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQge0FycmF5VXRpbHN9IGZyb20gJy4uL2FycmF5dXRpbHMnO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgYSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJDb25maWcgZXh0ZW5kcyBDb21wb25lbnRDb25maWcge1xuICAvKipcbiAgICogQ2hpbGQgY29tcG9uZW50cyBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgY29tcG9uZW50cz86IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+W107XG59XG5cbi8qKlxuICogQSBjb250YWluZXIgY29tcG9uZW50IHRoYXQgY2FuIGNvbnRhaW4gYSBjb2xsZWN0aW9uIG9mIGNoaWxkIGNvbXBvbmVudHMuXG4gKiBDb21wb25lbnRzIGNhbiBiZSBhZGRlZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSB0aHJvdWdoIHRoZSB7QGxpbmsgQ29udGFpbmVyQ29uZmlnI2NvbXBvbmVudHN9IHNldHRpbmcsIG9yIGxhdGVyXG4gKiB0aHJvdWdoIHRoZSB7QGxpbmsgQ29udGFpbmVyI2FkZENvbXBvbmVudH0gbWV0aG9kLiBUaGUgVUlNYW5hZ2VyIGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBvZiBhbGwgY29tcG9uZW50cywgaS5lLiBpdFxuICogaW5pdGlhbGl6ZXMgYW5kIGNvbmZpZ3VyZXMgdGhlbSBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEluIHRoZSBET00sIHRoZSBjb250YWluZXIgY29uc2lzdHMgb2YgYW4gb3V0ZXIgPGRpdj4gKHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgdGhlIGNvbmZpZykgYW5kIGFuIGlubmVyIHdyYXBwZXJcbiAqIDxkaXY+IHRoYXQgY29udGFpbnMgdGhlIGNvbXBvbmVudHMuIFRoaXMgZG91YmxlLTxkaXY+LXN0cnVjdHVyZSBpcyBvZnRlbiByZXF1aXJlZCB0byBhY2hpZXZlIG1hbnkgYWR2YW5jZWQgZWZmZWN0c1xuICogaW4gQ1NTIGFuZC9vciBKUywgZS5nLiBhbmltYXRpb25zIGFuZCBjZXJ0YWluIGZvcm1hdHRpbmcgd2l0aCBhYnNvbHV0ZSBwb3NpdGlvbmluZy5cbiAqXG4gKiBET00gZXhhbXBsZTpcbiAqIDxjb2RlPlxuICogICAgIDxkaXYgY2xhc3M9J3VpLWNvbnRhaW5lcic+XG4gKiAgICAgICAgIDxkaXYgY2xhc3M9J2NvbnRhaW5lci13cmFwcGVyJz5cbiAqICAgICAgICAgICAgIC4uLiBjaGlsZCBjb21wb25lbnRzIC4uLlxuICogICAgICAgICA8L2Rpdj5cbiAqICAgICA8L2Rpdj5cbiAqIDwvY29kZT5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRhaW5lcjxDb25maWcgZXh0ZW5kcyBDb250YWluZXJDb25maWc+IGV4dGVuZHMgQ29tcG9uZW50PENvbmZpZz4ge1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgaW5uZXIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBjb21wb25lbnRzIG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwcml2YXRlIGlubmVyQ29udGFpbmVyRWxlbWVudDogRE9NO1xuICBwcml2YXRlIGNvbXBvbmVudHNUb0FkZDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz5bXTtcbiAgcHJpdmF0ZSBjb21wb25lbnRzVG9SZW1vdmU6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+W107XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1jb250YWluZXInLFxuICAgICAgY29tcG9uZW50czogW10sXG4gICAgfSBhcyBDb25maWcsIHRoaXMuY29uZmlnKTtcblxuICAgIHRoaXMuY29tcG9uZW50c1RvQWRkID0gW107XG4gICAgdGhpcy5jb21wb25lbnRzVG9SZW1vdmUgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hpbGQgY29tcG9uZW50IHRvIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB0byBhZGRcbiAgICovXG4gIGFkZENvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+KSB7XG4gICAgdGhpcy5jb25maWcuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgdGhpcy5jb21wb25lbnRzVG9BZGQucHVzaChjb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjaGlsZCBjb21wb25lbnQgZnJvbSB0aGUgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IHRoZSBjb21wb25lbnQgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVtb3ZlZCwgZmFsc2UgaWYgaXQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGlzIGNvbnRhaW5lclxuICAgKi9cbiAgcmVtb3ZlQ29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4pOiBib29sZWFuIHtcbiAgICBpZiAoQXJyYXlVdGlscy5yZW1vdmUodGhpcy5jb25maWcuY29tcG9uZW50cywgY29tcG9uZW50KSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudHNUb1JlbW92ZS5wdXNoKGNvbXBvbmVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGFycmF5IG9mIGFsbCBjaGlsZCBjb21wb25lbnRzIGluIHRoaXMgY29udGFpbmVyLlxuICAgKiBAcmV0dXJucyB7Q29tcG9uZW50PENvbXBvbmVudENvbmZpZz5bXX1cbiAgICovXG4gIGdldENvbXBvbmVudHMoKTogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz5bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmNvbXBvbmVudHM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgY2hpbGQgY29tcG9uZW50cyBmcm9tIHRoZSBjb250YWluZXIuXG4gICAqL1xuICByZW1vdmVDb21wb25lbnRzKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiB0aGlzLmdldENvbXBvbmVudHMoKS5zbGljZSgpKSB7XG4gICAgICB0aGlzLnJlbW92ZUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBET00gb2YgdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBjdXJyZW50IGNvbXBvbmVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgICAvKiBXZSBjYW5ub3QganVzdCBjbGVhciB0aGUgY29udGFpbmVyIHRvIHJlbW92ZSBhbGwgZWxlbWVudHMgYW5kIHRoZW4gcmUtYWRkIHRob3NlIHRoYXQgc2hvdWxkIHN0YXksIGJlY2F1c2VcbiAgICAgKiBJRSBsb29zZXMgdGhlIGlubmVySFRNTCBvZiB1bmF0dGFjaGVkIGVsZW1lbnRzLCBsZWFkaW5nIHRvIGVtcHR5IGVsZW1lbnRzIHdpdGhpbiB0aGUgY29udGFpbmVyIChlLmcuIG1pc3NpbmdcbiAgICAgKiBzdWJ0aXRsZSB0ZXh0IGluIFN1YnRpdGxlTGFiZWwpLlxuICAgICAqIEluc3RlYWQsIHdlIGtlZXAgYSBsaXN0IG9mIGVsZW1lbnRzIHRvIGFkZCBhbmQgcmVtb3ZlLCBsZWF2aW5nIHJlbWFpbmluZyBlbGVtZW50cyBhbG9uZS4gQnkga2VlcGluZyB0aGVtIGluXG4gICAgICogdGhlIERPTSwgdGhlaXIgY29udGVudCBnZXRzIHByZXNlcnZlZCBpbiBhbGwgYnJvd3NlcnMuXG4gICAgICovXG4gICAgbGV0IGNvbXBvbmVudDtcblxuICAgIHdoaWxlIChjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNUb1JlbW92ZS5zaGlmdCgpKSB7XG4gICAgICBjb21wb25lbnQuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHdoaWxlIChjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNUb0FkZC5zaGlmdCgpKSB7XG4gICAgICB0aGlzLmlubmVyQ29udGFpbmVyRWxlbWVudC5hcHBlbmQoY29tcG9uZW50LmdldERvbUVsZW1lbnQoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHRvRG9tRWxlbWVudCgpOiBET00ge1xuICAgIC8vIENyZWF0ZSB0aGUgY29udGFpbmVyIGVsZW1lbnQgKHRoZSBvdXRlciA8ZGl2PilcbiAgICBsZXQgY29udGFpbmVyRWxlbWVudCA9IG5ldyBET00odGhpcy5jb25maWcudGFnLCB7XG4gICAgICAnaWQnOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICdjbGFzcyc6IHRoaXMuZ2V0Q3NzQ2xhc3NlcygpLFxuICAgICAgJ3JvbGUnOiB0aGlzLmNvbmZpZy5yb2xlLFxuICAgICAgJ2FyaWEtbGFiZWwnOiBpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24odGhpcy5jb25maWcuYXJpYUxhYmVsKSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSB0aGUgaW5uZXIgY29udGFpbmVyIGVsZW1lbnQgKHRoZSBpbm5lciA8ZGl2PikgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvbXBvbmVudHNcbiAgICBsZXQgaW5uZXJDb250YWluZXIgPSBuZXcgRE9NKHRoaXMuY29uZmlnLnRhZywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ2NvbnRhaW5lci13cmFwcGVyJyksXG4gICAgfSk7XG4gICAgdGhpcy5pbm5lckNvbnRhaW5lckVsZW1lbnQgPSBpbm5lckNvbnRhaW5lcjtcblxuICAgIGZvciAobGV0IGluaXRpYWxDb21wb25lbnQgb2YgdGhpcy5jb25maWcuY29tcG9uZW50cykge1xuICAgICAgdGhpcy5jb21wb25lbnRzVG9BZGQucHVzaChpbml0aWFsQ29tcG9uZW50KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb21wb25lbnRzKCk7XG5cbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZChpbm5lckNvbnRhaW5lcik7XG5cbiAgICByZXR1cm4gY29udGFpbmVyRWxlbWVudDtcbiAgfVxufSIsImltcG9ydCB7Q29udGFpbmVyQ29uZmlnLCBDb250YWluZXJ9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1VJVXRpbHN9IGZyb20gJy4uL3VpdXRpbHMnO1xuaW1wb3J0IHtTcGFjZXJ9IGZyb20gJy4vc3BhY2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuaW1wb3J0IHsgQnJvd3NlclV0aWxzIH0gZnJvbSAnLi4vYnJvd3NlcnV0aWxzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIHtAbGluayBDb250cm9sQmFyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sQmFyQ29uZmlnIGV4dGVuZHMgQ29udGFpbmVyQ29uZmlnIHtcbiAgLy8gbm90aGluZyB5ZXRcbn1cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBmb3IgbWFpbiBwbGF5ZXIgY29udHJvbCBjb21wb25lbnRzLCBlLmcuIHBsYXkgdG9nZ2xlIGJ1dHRvbiwgc2VlayBiYXIsIHZvbHVtZSBjb250cm9sLCBmdWxsc2NyZWVuIHRvZ2dsZVxuICogYnV0dG9uLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbEJhciBleHRlbmRzIENvbnRhaW5lcjxDb250cm9sQmFyQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb250cm9sQmFyQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktY29udHJvbGJhcicsXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICByb2xlOiAncmVnaW9uJyxcbiAgICAgIGFyaWFMYWJlbDogaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbnRyb2xCYXInKSxcbiAgICB9LCA8Q29udHJvbEJhckNvbmZpZz50aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgLy8gQ291bnRzIGhvdyBtYW55IGNvbXBvbmVudHMgYXJlIGhvdmVyZWQgYW5kIGJsb2NrIGhpZGluZyBvZiB0aGUgY29udHJvbCBiYXJcbiAgICBsZXQgaG92ZXJTdGFja0NvdW50ID0gMDtcblxuICAgIC8vIG9ubHkgZW5hYmxpbmcgdGhpcyBmb3Igbm9uLW1vYmlsZSBwbGF0Zm9ybXMgd2l0aG91dCB0b3VjaCBpbnB1dC4gZW5hYmxpbmcgdGhpc1xuICAgIC8vIGZvciB0b3VjaCBkZXZpY2VzIGNhdXNlcyB0aGUgVUkgdG8gbm90IGRpc2FwcGVhciBhZnRlciBoaWRlRGVsYXkgc2Vjb25kcy5cbiAgICAvLyBJbnN0ZWFkLCBpdCB3aWxsIHN0YXkgdmlzaWJsZSB1bnRpbCBhbm90aGVyIG1hbnVhbCBpbnRlcmFjdGlvbiBpcyBwZXJmb3JtZWQuXG4gICAgaWYgKHVpbWFuYWdlci5nZXRDb25maWcoKS5kaXNhYmxlQXV0b0hpZGVXaGVuSG92ZXJlZCAmJiAhQnJvd3NlclV0aWxzLmlzTW9iaWxlKSB7XG4gICAgICAvLyBUcmFjayBob3ZlciBzdGF0dXMgb2YgY2hpbGQgY29tcG9uZW50c1xuICAgICAgVUlVdGlscy50cmF2ZXJzZVRyZWUodGhpcywgKGNvbXBvbmVudCkgPT4ge1xuICAgICAgICAvLyBEbyBub3QgdHJhY2sgaG92ZXIgc3RhdHVzIG9mIGNoaWxkIGNvbnRhaW5lcnMgb3Igc3BhY2Vycywgb25seSBvZiAncmVhbCcgY29udHJvbHNcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbnRhaW5lciB8fCBjb21wb25lbnQgaW5zdGFuY2VvZiBTcGFjZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWJzY3JpYmUgaG92ZXIgZXZlbnQgYW5kIGtlZXAgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGhvdmVyZWQgY2hpbGRyZW5cbiAgICAgICAgY29tcG9uZW50Lm9uSG92ZXJDaGFuZ2VkLnN1YnNjcmliZSgoXywgYXJncykgPT4ge1xuICAgICAgICAgIGlmIChhcmdzLmhvdmVyZWQpIHtcbiAgICAgICAgICAgIGhvdmVyU3RhY2tDb3VudCsrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob3ZlclN0YWNrQ291bnQtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdWltYW5hZ2VyLm9uQ29udHJvbHNTaG93LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9KTtcblxuICAgIHVpbWFuYWdlci5vblByZXZpZXdDb250cm9sc0hpZGUuc3Vic2NyaWJlKChzZW5kZXIsIGFyZ3MpID0+IHtcbiAgICAgIC8vIENhbmNlbCB0aGUgaGlkZSBldmVudCBpZiBob3ZlcmVkIGNoaWxkIGNvbXBvbmVudHMgYmxvY2sgaGlkaW5nXG4gICAgICBhcmdzLmNhbmNlbCA9IChob3ZlclN0YWNrQ291bnQgPiAwKTtcbiAgICB9KTtcblxuICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzSGlkZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7Q29udGFpbmVyQ29uZmlnLCBDb250YWluZXJ9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7TGFiZWwsIExhYmVsQ29uZmlnfSBmcm9tICcuL2xhYmVsJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1R2Tm9pc2VDYW52YXN9IGZyb20gJy4vdHZub2lzZWNhbnZhcyc7XG5pbXBvcnQgeyBFcnJvclV0aWxzIH0gZnJvbSAnLi4vZXJyb3J1dGlscyc7XG5pbXBvcnQgeyBFcnJvckV2ZW50LCBQbGF5ZXJBUEksIFBsYXllckV2ZW50QmFzZSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQge1xuICBpc01vYmlsZVYzUGxheWVyQVBJLFxuICBNb2JpbGVWM1BsYXllckFQSSwgTW9iaWxlVjNQbGF5ZXJFcnJvckV2ZW50LCBNb2JpbGVWM1BsYXllckV2ZW50LCBNb2JpbGVWM1NvdXJjZUVycm9yRXZlbnQsXG59IGZyb20gJy4uL21vYmlsZXYzcGxheWVyYXBpJztcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvck1lc3NhZ2VUcmFuc2xhdG9yIHtcbiAgKGVycm9yOiBFcnJvckV2ZW50IHwgTW9iaWxlVjNQbGF5ZXJFcnJvckV2ZW50KTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTWVzc2FnZU1hcCB7XG4gIFtjb2RlOiBudW1iZXJdOiBzdHJpbmcgfCBFcnJvck1lc3NhZ2VUcmFuc2xhdG9yO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciB0aGUge0BsaW5rIEVycm9yTWVzc2FnZU92ZXJsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTWVzc2FnZU92ZXJsYXlDb25maWcgZXh0ZW5kcyBDb250YWluZXJDb25maWcge1xuICAvKipcbiAgICogQWxsb3dzIG92ZXJ3cml0aW5nIG9mIHRoZSBlcnJvciBtZXNzYWdlcyBkaXNwbGF5ZWQgaW4gdGhlIG92ZXJsYXkgZm9yIGN1c3RvbWl6YXRpb24gYW5kIGxvY2FsaXphdGlvbi5cbiAgICogVGhpcyBpcyBlaXRoZXIgYSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGFueSB7QGxpbmsgRXJyb3JFdmVudH0gYXMgcGFyYW1ldGVyIGFuZCB0cmFuc2xhdGVzIGVycm9yIG1lc3NhZ2VzLFxuICAgKiBvciBhIG1hcCBvZiBlcnJvciBjb2RlcyB0aGF0IG92ZXJ3cml0ZXMgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgd2l0aCBhIHBsYWluIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHtAbGluayBFcnJvckV2ZW50fSBhcyBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBjdXN0b21pemVkIHN0cmluZy5cbiAgICogVGhlIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IGRhdGEgKGUuZy4gcGFyYW1ldGVycykgZnJvbSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZS5cbiAgICpcbiAgICogRXhhbXBsZSAxIChjYXRjaC1hbGwgdHJhbnNsYXRpb24gZnVuY3Rpb24pOlxuICAgKiA8Y29kZT5cbiAgICogZXJyb3JNZXNzYWdlT3ZlcmxheUNvbmZpZyA9IHtcbiAgICogICBtZXNzYWdlczogZnVuY3Rpb24oZXJyb3IpIHtcbiAgICogICAgIHN3aXRjaCAoZXJyb3IuY29kZSkge1xuICAgKiAgICAgICAvLyBPdmVyd3JpdGUgZXJyb3IgMTAwMCAnVW5rbm93biBlcnJvcidcbiAgICogICAgICAgY2FzZSAxMDAwOlxuICAgKiAgICAgICAgIHJldHVybiAnSG91c3Rvbiwgd2UgaGF2ZSBhIHByb2JsZW0nXG4gICAqXG4gICAqICAgICAgIC8vIFRyYW5zZm9ybSBlcnJvciAxMjAxICdUaGUgZG93bmxvYWRlZCBtYW5pZmVzdCBpcyBpbnZhbGlkJyB0byB1cHBlcmNhc2VcbiAgICogICAgICAgY2FzZSAxMjAxOlxuICAgKiAgICAgICAgIHZhciBkZXNjcmlwdGlvbiA9IEVycm9yVXRpbHMuZGVmYXVsdEVycm9yTWVzc2FnZXNbZXJyb3IuY29kZV07XG4gICAqICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uLnRvVXBwZXJDYXNlKCk7XG4gICAqXG4gICAqICAgICAgIC8vIEN1c3RvbWl6ZSBlcnJvciAxMjA3ICdUaGUgbWFuaWZlc3QgY291bGQgbm90IGJlIGxvYWRlZCdcbiAgICogICAgICAgY2FzZSAxMjA3OlxuICAgKiAgICAgICAgIHZhciBzdGF0dXNDb2RlID0gZXJyb3IuZGF0YS5zdGF0dXNDb2RlO1xuICAgKiAgICAgICAgIHJldHVybiAnTWFuaWZlc3QgbG9hZGluZyBmYWlsZWQgd2l0aCBIVFRQIGVycm9yICcgKyBzdGF0dXNDb2RlO1xuICAgKiAgICAgfVxuICAgKiAgICAgLy8gUmV0dXJuIHVubW9kaWZpZWQgZXJyb3IgbWVzc2FnZSBmb3IgYWxsIG90aGVyIGVycm9yc1xuICAgKiAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAqICAgfVxuICAgKiB9O1xuICAgKiA8L2NvZGU+XG4gICAqXG4gICAqIEV4YW1wbGUgMiAodHJhbnNsYXRpbmcgc3BlY2lmaWMgZXJyb3JzKTpcbiAgICogPGNvZGU+XG4gICAqIGVycm9yTWVzc2FnZU92ZXJsYXlDb25maWcgPSB7XG4gICAqICAgbWVzc2FnZXM6IHtcbiAgICogICAgIC8vIE92ZXJ3cml0ZSBlcnJvciAxMDAwICdVbmtub3duIGVycm9yJ1xuICAgKiAgICAgMTAwMDogJ0hvdXN0b24sIHdlIGhhdmUgYSBwcm9ibGVtJyxcbiAgICpcbiAgICogICAgIC8vIFRyYW5zZm9ybSBlcnJvciAxMjAxICdVbnN1cHBvcnRlZCBtYW5pZmVzdCBmb3JtYXQnIHRvIHVwcGVyY2FzZVxuICAgKiAgICAgMTIwMTogZnVuY3Rpb24oZXJyb3IpIHtcbiAgICogICAgICAgdmFyIGRlc2NyaXB0aW9uID0gRXJyb3JVdGlscy5kZWZhdWx0RXJyb3JNZXNzYWdlc1tlcnJvci5jb2RlXTtcbiAgICogICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uLnRvVXBwZXJDYXNlKCk7XG4gICAqICAgICB9LFxuICAgKlxuICAgKiAgICAgLy8gQ3VzdG9taXplIGVycm9yIDEyMDcgJ1RoZSBtYW5pZmVzdCBjb3VsZCBub3QgYmUgbG9hZGVkJ1xuICAgKiAgICAgMTIwNzogZnVuY3Rpb24oZXJyb3IpIHtcbiAgICogICAgICAgdmFyIHN0YXR1c0NvZGUgPSBlcnJvci5kYXRhLnN0YXR1c0NvZGU7XG4gICAqICAgICAgIHJldHVybiAnTWFuaWZlc3QgbG9hZGluZyBmYWlsZWQgd2l0aCBIVFRQIGVycm9yICcgKyBzdGF0dXNDb2RlO1xuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfTtcbiAgICogPC9jb2RlPlxuICAgKi9cbiAgbWVzc2FnZXM/OiBFcnJvck1lc3NhZ2VNYXAgfCBFcnJvck1lc3NhZ2VUcmFuc2xhdG9yO1xufVxuXG4vKipcbiAqIE92ZXJsYXlzIHRoZSBwbGF5ZXIgYW5kIGRpc3BsYXlzIGVycm9yIG1lc3NhZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JNZXNzYWdlT3ZlcmxheSBleHRlbmRzIENvbnRhaW5lcjxFcnJvck1lc3NhZ2VPdmVybGF5Q29uZmlnPiB7XG5cbiAgcHJpdmF0ZSBlcnJvckxhYmVsOiBMYWJlbDxMYWJlbENvbmZpZz47XG4gIHByaXZhdGUgdHZOb2lzZUJhY2tncm91bmQ6IFR2Tm9pc2VDYW52YXM7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBFcnJvck1lc3NhZ2VPdmVybGF5Q29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5lcnJvckxhYmVsID0gbmV3IExhYmVsPExhYmVsQ29uZmlnPih7IGNzc0NsYXNzOiAndWktZXJyb3JtZXNzYWdlLWxhYmVsJyB9KTtcbiAgICB0aGlzLnR2Tm9pc2VCYWNrZ3JvdW5kID0gbmV3IFR2Tm9pc2VDYW52YXMoKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktZXJyb3JtZXNzYWdlLW92ZXJsYXknLFxuICAgICAgY29tcG9uZW50czogW3RoaXMudHZOb2lzZUJhY2tncm91bmQsIHRoaXMuZXJyb3JMYWJlbF0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJIHwgTW9iaWxlVjNQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbGV0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG5cbiAgICBjb25zdCBoYW5kbGVFcnJvck1lc3NhZ2UgPSAoXG4gICAgICBldmVudDogRXJyb3JFdmVudCB8IE1vYmlsZVYzU291cmNlRXJyb3JFdmVudCB8IE1vYmlsZVYzUGxheWVyRXJyb3JFdmVudCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbWl6ZWRNZXNzYWdlID0gY3VzdG9taXplRXJyb3JNZXNzYWdlKHVpbWFuYWdlci5nZXRDb25maWcoKS5lcnJvck1lc3NhZ2VzIHx8IGNvbmZpZy5tZXNzYWdlcywgZXZlbnQpO1xuICAgICAgaWYgKGN1c3RvbWl6ZWRNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBjdXN0b21pemVkTWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lcnJvckxhYmVsLnNldFRleHQobWVzc2FnZSk7XG4gICAgICB0aGlzLnR2Tm9pc2VCYWNrZ3JvdW5kLnN0YXJ0KCk7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9O1xuXG4gICAgaWYgKGlzTW9iaWxlVjNQbGF5ZXJBUEkocGxheWVyKSkge1xuICAgICAgY29uc3QgZXJyb3JFdmVudEhhbmRsZXIgPSAoZXZlbnQ6IE1vYmlsZVYzU291cmNlRXJyb3JFdmVudCB8IE1vYmlsZVYzUGxheWVyRXJyb3JFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gRXJyb3JVdGlscy5kZWZhdWx0TW9iaWxlVjNFcnJvck1lc3NhZ2VUcmFuc2xhdG9yKGV2ZW50KTtcbiAgICAgICAgaGFuZGxlRXJyb3JNZXNzYWdlKGV2ZW50LCBtZXNzYWdlKTtcbiAgICAgIH07XG5cbiAgICAgIHBsYXllci5vbihNb2JpbGVWM1BsYXllckV2ZW50LlBsYXllckVycm9yLCBlcnJvckV2ZW50SGFuZGxlcik7XG4gICAgICBwbGF5ZXIub24oTW9iaWxlVjNQbGF5ZXJFdmVudC5Tb3VyY2VFcnJvciwgZXJyb3JFdmVudEhhbmRsZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuRXJyb3IsIChldmVudDogRXJyb3JFdmVudCkgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IEVycm9yVXRpbHMuZGVmYXVsdFdlYkVycm9yTWVzc2FnZVRyYW5zbGF0b3IoZXZlbnQpO1xuICAgICAgICBoYW5kbGVFcnJvck1lc3NhZ2UoZXZlbnQsIG1lc3NhZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZUxvYWRlZCwgKGV2ZW50OiBQbGF5ZXJFdmVudEJhc2UpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU2hvd24oKSkge1xuICAgICAgICB0aGlzLnR2Tm9pc2VCYWNrZ3JvdW5kLnN0b3AoKTtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZWxlYXNlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlbGVhc2UoKTtcblxuICAgIC8vIENhbnZhcyByZW5kZXJpbmcgbXVzdCBiZSBleHBsaWNpdGx5IHN0b3BwZWQsIGVsc2UgaXQganVzdCBjb250aW51ZXMgZm9yZXZlciBhbmQgaG9ncyByZXNvdXJjZXNcbiAgICB0aGlzLnR2Tm9pc2VCYWNrZ3JvdW5kLnN0b3AoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjdXN0b21pemVFcnJvck1lc3NhZ2UoXG4gIGVycm9yTWVzc2FnZXM6IEVycm9yTWVzc2FnZVRyYW5zbGF0b3IgfCBFcnJvck1lc3NhZ2VNYXAsXG4gIGV2ZW50OiBFcnJvckV2ZW50IHwgTW9iaWxlVjNQbGF5ZXJFcnJvckV2ZW50IHwgTW9iaWxlVjNTb3VyY2VFcnJvckV2ZW50LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvck1lc3NhZ2VzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFByb2Nlc3MgbWVzc2FnZSB2b2NhYnVsYXJpZXNcbiAgaWYgKHR5cGVvZiBlcnJvck1lc3NhZ2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24gZm9yIGFsbCBlcnJvcnNcbiAgICByZXR1cm4gZXJyb3JNZXNzYWdlcyhldmVudCk7XG4gIH1cbiAgaWYgKGVycm9yTWVzc2FnZXNbZXZlbnQuY29kZV0pIHtcbiAgICAvLyBJdCdzIG5vdCBhIHRyYW5zbGF0aW9uIGZ1bmN0aW9uLCBzbyBpdCBtdXN0IGJlIGEgbWFwIG9mIHN0cmluZ3Mgb3IgdHJhbnNsYXRpb24gZnVuY3Rpb25zXG4gICAgY29uc3QgY3VzdG9tTWVzc2FnZSA9IGVycm9yTWVzc2FnZXNbZXZlbnQuY29kZV07XG5cbiAgICByZXR1cm4gdHlwZW9mIGN1c3RvbU1lc3NhZ2UgPT09ICdzdHJpbmcnID8gY3VzdG9tTWVzc2FnZSA6IGN1c3RvbU1lc3NhZ2UoZXZlbnQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUb2dnbGVCdXR0b24sIFRvZ2dsZUJ1dHRvbkNvbmZpZyB9IGZyb20gJy4vdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7IFVJSW5zdGFuY2VNYW5hZ2VyIH0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgYnV0dG9uIHRoYXQgdG9nZ2xlcyB0aGUgcGxheWVyIGJldHdlZW4gd2luZG93ZWQgYW5kIGZ1bGxzY3JlZW4gdmlldy5cbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bGxzY3JlZW5Ub2dnbGVCdXR0b24gZXh0ZW5kcyBUb2dnbGVCdXR0b248VG9nZ2xlQnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBUb2dnbGVCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWZ1bGxzY3JlZW50b2dnbGVidXR0b24nLFxuICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ2Z1bGxzY3JlZW4nKSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgY29uc3QgaXNGdWxsU2NyZWVuQXZhaWxhYmxlID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHBsYXllci5pc1ZpZXdNb2RlQXZhaWxhYmxlKHBsYXllci5leHBvcnRzLlZpZXdNb2RlLkZ1bGxzY3JlZW4pO1xuICAgIH07XG5cbiAgICBjb25zdCBmdWxsc2NyZWVuU3RhdGVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcGxheWVyLmdldFZpZXdNb2RlKCkgPT09IHBsYXllci5leHBvcnRzLlZpZXdNb2RlLkZ1bGxzY3JlZW4gPyB0aGlzLm9uKCkgOiB0aGlzLm9mZigpO1xuICAgIH07XG5cbiAgICBjb25zdCBmdWxsc2NyZWVuQXZhaWxhYmlsaXR5Q2hhbmdlZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBpc0Z1bGxTY3JlZW5BdmFpbGFibGUoKSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5WaWV3TW9kZUNoYW5nZWQsIGZ1bGxzY3JlZW5TdGF0ZUhhbmRsZXIpO1xuXG4gICAgLy8gQXZhaWxhYmxlIG9ubHkgaW4gb3VyIG5hdGl2ZSBTREtzIGZvciBub3dcbiAgICBpZiAoKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50IGFzIGFueSkuVmlld01vZGVBdmFpbGFiaWxpdHlDaGFuZ2VkKSB7XG4gICAgICBwbGF5ZXIub24oXG4gICAgICAgIChwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudCBhcyBhbnkpLlZpZXdNb2RlQXZhaWxhYmlsaXR5Q2hhbmdlZCxcbiAgICAgICAgZnVsbHNjcmVlbkF2YWlsYWJpbGl0eUNoYW5nZWRIYW5kbGVyLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUoZnVsbHNjcmVlbkF2YWlsYWJpbGl0eUNoYW5nZWRIYW5kbGVyKTtcblxuICAgIHRoaXMub25DbGljay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKCFpc0Z1bGxTY3JlZW5BdmFpbGFibGUoKSkge1xuICAgICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdGdWxsc2NyZWVuIHVuYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXRWaWV3TW9kZSA9XG4gICAgICAgIHBsYXllci5nZXRWaWV3TW9kZSgpID09PSBwbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5GdWxsc2NyZWVuXG4gICAgICAgICAgPyBwbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5JbmxpbmVcbiAgICAgICAgICA6IHBsYXllci5leHBvcnRzLlZpZXdNb2RlLkZ1bGxzY3JlZW47XG5cbiAgICAgIHBsYXllci5zZXRWaWV3TW9kZSh0YXJnZXRWaWV3TW9kZSk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGFydHVwIGluaXRcbiAgICBmdWxsc2NyZWVuQXZhaWxhYmlsaXR5Q2hhbmdlZEhhbmRsZXIoKTtcbiAgICBmdWxsc2NyZWVuU3RhdGVIYW5kbGVyKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7VG9nZ2xlQnV0dG9uQ29uZmlnfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1BsYXliYWNrVG9nZ2xlQnV0dG9ufSBmcm9tICcuL3BsYXliYWNrdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSwgUGxheWVyRXZlbnRCYXNlLCBXYXJuaW5nRXZlbnQgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IG92ZXJsYXlzIHRoZSB2aWRlbyBhbmQgdG9nZ2xlcyBiZXR3ZWVuIHBsYXliYWNrIGFuZCBwYXVzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEh1Z2VQbGF5YmFja1RvZ2dsZUJ1dHRvbiBleHRlbmRzIFBsYXliYWNrVG9nZ2xlQnV0dG9uIHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFRvZ2dsZUJ1dHRvbkNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktaHVnZXBsYXliYWNrdG9nZ2xlYnV0dG9uJyxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdwbGF5UGF1c2UnKSxcbiAgICAgIHJvbGU6ICdidXR0b24nLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSBidXR0b24gc3RhdGUgdGhyb3VnaCBBUEkgZXZlbnRzXG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyLCBmYWxzZSk7XG5cbiAgICBsZXQgdG9nZ2xlUGxheWJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAocGxheWVyLmlzUGxheWluZygpIHx8IHRoaXMuaXNQbGF5SW5pdGlhdGVkKSB7XG4gICAgICAgIHBsYXllci5wYXVzZSgndWknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBsYXllci5wbGF5KCd1aScpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgdG9nZ2xlRnVsbHNjcmVlbiA9ICgpID0+IHtcbiAgICAgIGlmIChwbGF5ZXIuZ2V0Vmlld01vZGUoKSA9PT0gcGxheWVyLmV4cG9ydHMuVmlld01vZGUuRnVsbHNjcmVlbikge1xuICAgICAgICBwbGF5ZXIuc2V0Vmlld01vZGUocGxheWVyLmV4cG9ydHMuVmlld01vZGUuSW5saW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBsYXllci5zZXRWaWV3TW9kZShwbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5GdWxsc2NyZWVuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IGZpcnN0UGxheSA9IHRydWU7XG4gICAgbGV0IGNsaWNrVGltZSA9IDA7XG4gICAgbGV0IGRvdWJsZUNsaWNrVGltZSA9IDA7XG5cbiAgICAvKlxuICAgICAqIFlvdVR1YmUtc3R5bGUgdG9nZ2xlIGJ1dHRvbiBoYW5kbGluZ1xuICAgICAqXG4gICAgICogVGhlIGdvYWwgaXMgdG8gcHJldmVudCBhIHNob3J0IHBhdXNlIG9yIHBsYXliYWNrIGludGVydmFsIGJldHdlZW4gYSBjbGljaywgdGhhdCB0b2dnbGVzIHBsYXliYWNrLCBhbmQgYVxuICAgICAqIGRvdWJsZSBjbGljaywgdGhhdCB0b2dnbGVzIGZ1bGxzY3JlZW4uIEluIHRoaXMgbmFpdmUgYXBwcm9hY2gsIHRoZSBmaXJzdCBjbGljayB3b3VsZCBlLmcuIHN0YXJ0IHBsYXliYWNrLFxuICAgICAqIHRoZSBzZWNvbmQgY2xpY2sgd291bGQgYmUgZGV0ZWN0ZWQgYXMgZG91YmxlIGNsaWNrIGFuZCB0b2dnbGUgdG8gZnVsbHNjcmVlbiwgYW5kIGFzIHNlY29uZCBub3JtYWwgY2xpY2sgc3RvcFxuICAgICAqIHBsYXliYWNrLCB3aGljaCByZXN1bHRzIGlzIGEgc2hvcnQgcGxheWJhY2sgaW50ZXJ2YWwgd2l0aCBtYXggbGVuZ3RoIG9mIHRoZSBkb3VibGUgY2xpY2sgZGV0ZWN0aW9uXG4gICAgICogcGVyaW9kICh1c3VhbGx5IDUwMG1zKS5cbiAgICAgKlxuICAgICAqIFRvIHNvbHZlIHRoaXMgaXNzdWUsIHdlIGRlZmVyIGhhbmRsaW5nIG9mIHRoZSBmaXJzdCBjbGljayBmb3IgMjAwbXMsIHdoaWNoIGlzIGFsbW9zdCB1bm5vdGljZWFibGUgdG8gdGhlIHVzZXIsXG4gICAgICogYW5kIGp1c3QgdG9nZ2xlIHBsYXliYWNrIGlmIG5vIHNlY29uZCBjbGljayAoZG91YmxlIGNsaWNrKSBoYXMgYmVlbiByZWdpc3RlcmVkIGR1cmluZyB0aGlzIHBlcmlvZC4gSWYgYSBkb3VibGVcbiAgICAgKiBjbGljayBpcyByZWdpc3RlcmVkLCB3ZSBqdXN0IHRvZ2dsZSB0aGUgZnVsbHNjcmVlbi4gSW4gdGhlIGZpcnN0IDIwMG1zLCB1bmRlc2lyZWQgcGxheWJhY2sgY2hhbmdlcyB0aHVzIGNhbm5vdFxuICAgICAqIGhhcHBlbi4gSWYgYSBkb3VibGUgY2xpY2sgaXMgcmVnaXN0ZXJlZCB3aXRoaW4gNTAwbXMsIHdlIHVuZG8gdGhlIHBsYXliYWNrIGNoYW5nZSBhbmQgc3dpdGNoIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKiBJbiB0aGUgZW5kLCB0aGlzIG1ldGhvZCBiYXNpY2FsbHkgaW50cm9kdWNlcyBhIDIwMG1zIG9ic2VydmluZyBpbnRlcnZhbCBpbiB3aGljaCBwbGF5YmFjayBjaGFuZ2VzIGFyZSBwcmV2ZW50ZWRcbiAgICAgKiBpZiBhIGRvdWJsZSBjbGljayBoYXBwZW5zLlxuICAgICAqL1xuICAgIHRoaXMub25DbGljay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gRGlyZWN0bHkgc3RhcnQgcGxheWJhY2sgb24gZmlyc3QgY2xpY2sgb2YgdGhlIGJ1dHRvbi5cbiAgICAgIC8vIFRoaXMgaXMgYSByZXF1aXJlZCB3b3JrYXJvdW5kIGZvciBtb2JpbGUgYnJvd3NlcnMgd2hlcmUgdmlkZW8gcGxheWJhY2sgbmVlZHMgdG8gYmUgdHJpZ2dlcmVkIGRpcmVjdGx5XG4gICAgICAvLyBieSB0aGUgdXNlci4gQSBkZWZlcnJlZCBwbGF5YmFjayBzdGFydCB0aHJvdWdoIHRoZSB0aW1lb3V0IGJlbG93IGlzIG5vdCBjb25zaWRlcmVkIGFzIHVzZXIgYWN0aW9uIGFuZFxuICAgICAgLy8gdGhlcmVmb3JlIGlnbm9yZWQgYnkgbW9iaWxlIGJyb3dzZXJzLlxuICAgICAgaWYgKGZpcnN0UGxheSkge1xuICAgICAgICAvLyBUcnkgdG8gc3RhcnQgcGxheWJhY2suIFRoZW4gd2Ugd2FpdCBmb3IgUGxheSBhbmQgb25seSB3aGVuIGl0IGFycml2ZXMsIHdlIGRpc2FibGUgdGhlIGZpcnN0UGxheSBmbGFnLlxuICAgICAgICAvLyBJZiB3ZSBkaXNhYmxlIHRoZSBmbGFnIGhlcmUsIG9uQ2xpY2sgd2FzIHRyaWdnZXJlZCBwcm9ncmFtbWF0aWNhbGx5IGluc3RlYWQgb2YgYnkgYSB1c2VyIGludGVyYWN0aW9uLCBhbmRcbiAgICAgICAgLy8gcGxheWJhY2sgaXMgYmxvY2tlZCAoZS5nLiBvbiBtb2JpbGUgZGV2aWNlcyBkdWUgdG8gdGhlIHByb2dyYW1tYXRpYyBwbGF5KCkgY2FsbCksIHdlIGxvb3NlIHRoZSBjaGFuY2UgdG9cbiAgICAgICAgLy8gZXZlciBzdGFydCBwbGF5YmFjayB0aHJvdWdoIGEgdXNlciBpbnRlcmFjdGlvbiBhZ2FpbiB3aXRoIHRoaXMgYnV0dG9uLlxuICAgICAgICB0b2dnbGVQbGF5YmFjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICBpZiAobm93IC0gY2xpY2tUaW1lIDwgMjAwKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYSBkb3VibGUgY2xpY2sgaW5zaWRlIHRoZSAyMDBtcyBpbnRlcnZhbCwganVzdCB0b2dnbGUgZnVsbHNjcmVlbiBtb2RlXG4gICAgICAgIHRvZ2dsZUZ1bGxzY3JlZW4oKTtcbiAgICAgICAgZG91YmxlQ2xpY2tUaW1lID0gbm93O1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKG5vdyAtIGNsaWNrVGltZSA8IDUwMCkge1xuICAgICAgICAvLyBXZSBoYXZlIGEgZG91YmxlIGNsaWNrIGluc2lkZSB0aGUgNTAwbXMgaW50ZXJ2YWwsIHVuZG8gcGxheWJhY2sgdG9nZ2xlIGFuZCB0b2dnbGUgZnVsbHNjcmVlbiBtb2RlXG4gICAgICAgIHRvZ2dsZUZ1bGxzY3JlZW4oKTtcbiAgICAgICAgdG9nZ2xlUGxheWJhY2soKTtcbiAgICAgICAgZG91YmxlQ2xpY2tUaW1lID0gbm93O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNsaWNrVGltZSA9IG5vdztcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gZG91YmxlQ2xpY2tUaW1lID4gMjAwKSB7XG4gICAgICAgICAgLy8gTm8gZG91YmxlIGNsaWNrIGRldGVjdGVkLCBzbyB3ZSB0b2dnbGUgcGxheWJhY2sgYW5kIHdhaXQgd2hhdCBoYXBwZW5zIG5leHRcbiAgICAgICAgICB0b2dnbGVQbGF5YmFjaygpO1xuICAgICAgICB9XG4gICAgICB9LCAyMDApO1xuICAgIH0pO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXksICgpID0+IHtcbiAgICAgIC8vIFBsYXliYWNrIGhhcyByZWFsbHkgc3RhcnRlZCwgd2UgY2FuIGRpc2FibGUgdGhlIGZsYWcgdG8gc3dpdGNoIHRvIG5vcm1hbCB0b2dnbGUgYnV0dG9uIGhhbmRsaW5nXG4gICAgICBmaXJzdFBsYXkgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5XYXJuaW5nLCAoZXZlbnQ6IFdhcm5pbmdFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IHBsYXllci5leHBvcnRzLldhcm5pbmdDb2RlLlBMQVlCQUNLX0NPVUxEX05PVF9CRV9TVEFSVEVEKSB7XG4gICAgICAgIC8vIGlmIHBsYXliYWNrIGNvdWxkIG5vdCBiZSBzdGFydGVkLCByZXNldCB0aGUgZmlyc3QgcGxheSBmbGFnIGFzIHdlIG5lZWQgdGhlIHVzZXIgaW50ZXJhY3Rpb24gdG8gc3RhcnRcbiAgICAgICAgZmlyc3RQbGF5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN1cHByZXNzUGxheUJ1dHRvblRyYW5zaXRpb25BbmltYXRpb24gPSAoKSA9PiB7XG4gICAgICAvLyBEaXNhYmxlIHRoZSBjdXJyZW50IGFuaW1hdGlvblxuICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uQW5pbWF0aW9uc0VuYWJsZWQoZmFsc2UpO1xuXG4gICAgICAvLyBFbmFibGUgdGhlIHRyYW5zaXRpb24gYW5pbWF0aW9ucyBmb3IgdGhlIG5leHQgc3RhdGUgY2hhbmdlXG4gICAgICB0aGlzLm9uVG9nZ2xlLnN1YnNjcmliZU9uY2UoKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25BbmltYXRpb25zRW5hYmxlZCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBIaWRlIHRoZSBwbGF5IGJ1dHRvbiBhbmltYXRpb24gd2hlbiB0aGUgVUkgaXMgbG9hZGVkIChpdCBzaG91bGQgb25seSBiZSBhbmltYXRlZCBvbiBzdGF0ZSBjaGFuZ2VzKVxuICAgIHN1cHByZXNzUGxheUJ1dHRvblRyYW5zaXRpb25BbmltYXRpb24oKTtcblxuICAgIGNvbnN0IGlzQXV0b3BsYXlFbmFibGVkID0gcGxheWVyLmdldENvbmZpZygpLnBsYXliYWNrICYmIEJvb2xlYW4ocGxheWVyLmdldENvbmZpZygpLnBsYXliYWNrLmF1dG9wbGF5KTtcbiAgICAvLyBXZSBvbmx5IGtub3cgaWYgYW4gYXV0b3BsYXkgYXR0ZW1wdCBpcyB1cGNvbWluZyBpZiB0aGUgcGxheWVyIGlzIG5vdCB5ZXQgcmVhZHkuIEl0IHRoZSBwbGF5ZXIgaXMgYWxyZWFkeSByZWFkeSxcbiAgICAvLyB0aGUgYXR0ZW1wdCBtaWdodCBiZSB1cGNvbWluZyBvciBtaWdodCBoYXZlIGFscmVhZHkgaGFwcGVuZWQsIGJ1dCB3ZSBkb24ndCBoYXZlIHRvIGhhbmRsZSB0aGF0IGJlY2F1c2Ugd2UgY2FuXG4gICAgLy8gc2ltcGx5IHJlbHkgb24gaXNQbGF5aW5nIGFuZCB0aGUgcGxheSBzdGF0ZSBldmVudHMuXG4gICAgY29uc3QgaXNBdXRvcGxheVVwY29taW5nID0gIXBsYXllci5nZXRTb3VyY2UoKSAmJiBpc0F1dG9wbGF5RW5hYmxlZDtcblxuICAgIC8vIEhpZGUgdGhlIHBsYXkgYnV0dG9uIHdoZW4gdGhlIHBsYXllciBpcyBhbHJlYWR5IHBsYXlpbmcgb3IgYXV0b3BsYXkgaXMgdXBjb21pbmdcbiAgICBpZiAocGxheWVyLmlzUGxheWluZygpIHx8IGlzQXV0b3BsYXlVcGNvbWluZykge1xuICAgICAgLy8gSGlkZSB0aGUgcGxheSBidXR0b24gKHN3aXRjaCB0byBwbGF5aW5nIHN0YXRlKVxuICAgICAgdGhpcy5vbigpO1xuICAgICAgLy8gRGlzYWJsZSB0aGUgYW5pbWF0aW9uIG9mIHRoZSBwbGF5aW5nIHN0YXRlIHN3aXRjaFxuICAgICAgc3VwcHJlc3NQbGF5QnV0dG9uVHJhbnNpdGlvbkFuaW1hdGlvbigpO1xuXG4gICAgICAvLyBTaG93IHRoZSBwbGF5IGJ1dHRvbiB3aXRob3V0IGFuIGFuaW1hdGlvbiBpZiBhIHBsYXkgYXR0ZW1wdCBpcyBibG9ja2VkXG4gICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuV2FybmluZywgKGV2ZW50OiBXYXJuaW5nRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IHBsYXllci5leHBvcnRzLldhcm5pbmdDb2RlLlBMQVlCQUNLX0NPVUxEX05PVF9CRV9TVEFSVEVEKSB7XG4gICAgICAgICAgc3VwcHJlc3NQbGF5QnV0dG9uVHJhbnNpdGlvbkFuaW1hdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgbGV0IGJ1dHRvbkVsZW1lbnQgPSBzdXBlci50b0RvbUVsZW1lbnQoKTtcblxuICAgIC8vIEFkZCBjaGlsZCB0aGF0IGNvbnRhaW5zIHRoZSBwbGF5IGJ1dHRvbiBpbWFnZVxuICAgIC8vIFNldHRpbmcgdGhlIGltYWdlIGRpcmVjdGx5IG9uIHRoZSBidXR0b24gZG9lcyBub3Qgd29yayB0b2dldGhlciB3aXRoIHNjYWxpbmcgYW5pbWF0aW9ucywgYmVjYXVzZSB0aGUgYnV0dG9uXG4gICAgLy8gY2FuIGNvdmVyIHRoZSB3aG9sZSB2aWRlbyBwbGF5ZXIgYXJlIGFuZCBzY2FsaW5nIHdvdWxkIGV4dGVuZCBpdCBiZXlvbmQuIEJ5IGFkZGluZyBhbiBpbm5lciBlbGVtZW50LCBjb25maW5lZFxuICAgIC8vIHRvIHRoZSBzaXplIGlmIHRoZSBpbWFnZSwgaXQgY2FuIHNjYWxlIGluc2lkZSB0aGUgcGxheWVyIHdpdGhvdXQgb3ZlcnNob290aW5nLlxuICAgIGJ1dHRvbkVsZW1lbnQuYXBwZW5kKG5ldyBET00oJ2RpdicsIHtcbiAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCdpbWFnZScpLFxuICAgIH0pKTtcblxuICAgIHJldHVybiBidXR0b25FbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHBsYXkgc3RhdGUgdHJhbnNpdGlvbiBhbmltYXRpb25zIG9mIHRoZSBwbGF5IGJ1dHRvbiBpbWFnZS4gQ2FuIGJlIHVzZWQgdG8gc3VwcHJlc3NcbiAgICogYW5pbWF0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIHRydWUgdG8gZW5hYmxlIHRoZSBhbmltYXRpb25zIChkZWZhdWx0KSwgZmFsc2UgdG8gZGlzYWJsZSB0aGVtXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0VHJhbnNpdGlvbkFuaW1hdGlvbnNFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBub1RyYW5zaXRpb25BbmltYXRpb25zQ2xhc3MgPSB0aGlzLnByZWZpeENzcygnbm8tdHJhbnNpdGlvbi1hbmltYXRpb25zJyk7XG5cbiAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkucmVtb3ZlQ2xhc3Mobm9UcmFuc2l0aW9uQW5pbWF0aW9uc0NsYXNzKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmdldERvbUVsZW1lbnQoKS5oYXNDbGFzcyhub1RyYW5zaXRpb25BbmltYXRpb25zQ2xhc3MpKSB7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyhub1RyYW5zaXRpb25BbmltYXRpb25zQ2xhc3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtCdXR0b25Db25maWcsIEJ1dHRvbn0gZnJvbSAnLi9idXR0b24nO1xuaW1wb3J0IHtET019IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBidXR0b24gdG8gcGxheS9yZXBsYXkgYSB2aWRlby5cbiAqL1xuZXhwb3J0IGNsYXNzIEh1Z2VSZXBsYXlCdXR0b24gZXh0ZW5kcyBCdXR0b248QnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWh1Z2VyZXBsYXlidXR0b24nLFxuICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3JlcGxheScpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHBsYXllci5wbGF5KCd1aScpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvRG9tRWxlbWVudCgpOiBET00ge1xuICAgIGxldCBidXR0b25FbGVtZW50ID0gc3VwZXIudG9Eb21FbGVtZW50KCk7XG5cbiAgICAvLyBBZGQgY2hpbGQgdGhhdCBjb250YWlucyB0aGUgcGxheSBidXR0b24gaW1hZ2VcbiAgICAvLyBTZXR0aW5nIHRoZSBpbWFnZSBkaXJlY3RseSBvbiB0aGUgYnV0dG9uIGRvZXMgbm90IHdvcmsgdG9nZXRoZXIgd2l0aCBzY2FsaW5nIGFuaW1hdGlvbnMsIGJlY2F1c2UgdGhlIGJ1dHRvblxuICAgIC8vIGNhbiBjb3ZlciB0aGUgd2hvbGUgdmlkZW8gcGxheWVyIGFyZSBhbmQgc2NhbGluZyB3b3VsZCBleHRlbmQgaXQgYmV5b25kLiBCeSBhZGRpbmcgYW4gaW5uZXIgZWxlbWVudCwgY29uZmluZWRcbiAgICAvLyB0byB0aGUgc2l6ZSBpZiB0aGUgaW1hZ2UsIGl0IGNhbiBzY2FsZSBpbnNpZGUgdGhlIHBsYXllciB3aXRob3V0IG92ZXJzaG9vdGluZy5cbiAgICBidXR0b25FbGVtZW50LmFwcGVuZChuZXcgRE9NKCdkaXYnLCB7XG4gICAgICAnY2xhc3MnOiB0aGlzLnByZWZpeENzcygnaW1hZ2UnKSxcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gYnV0dG9uRWxlbWVudDtcbiAgfVxufSIsImltcG9ydCB7TGlzdFNlbGVjdG9yLCBMaXN0U2VsZWN0b3JDb25maWd9IGZyb20gJy4vbGlzdHNlbGVjdG9yJztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuZXhwb3J0IGNsYXNzIEl0ZW1TZWxlY3Rpb25MaXN0IGV4dGVuZHMgTGlzdFNlbGVjdG9yPExpc3RTZWxlY3RvckNvbmZpZz4ge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMQVNTX1NFTEVDVEVEID0gJ3NlbGVjdGVkJztcblxuICBwcml2YXRlIGxpc3RFbGVtZW50OiBET007XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMaXN0U2VsZWN0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICB0YWc6ICd1bCcsXG4gICAgICBjc3NDbGFzczogJ3VpLWl0ZW1zZWxlY3Rpb25saXN0JyxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoID4gMTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b0RvbUVsZW1lbnQoKTogRE9NIHtcbiAgICBsZXQgbGlzdEVsZW1lbnQgPSBuZXcgRE9NKCd1bCcsIHtcbiAgICAgICdpZCc6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgJ2NsYXNzJzogdGhpcy5nZXRDc3NDbGFzc2VzKCksXG4gICAgfSk7XG5cbiAgICB0aGlzLmxpc3RFbGVtZW50ID0gbGlzdEVsZW1lbnQ7XG4gICAgdGhpcy51cGRhdGVEb21JdGVtcygpO1xuXG4gICAgcmV0dXJuIGxpc3RFbGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZURvbUl0ZW1zKHNlbGVjdGVkVmFsdWU6IHN0cmluZyA9IG51bGwpIHtcbiAgICAvLyBEZWxldGUgYWxsIGNoaWxkcmVuXG4gICAgdGhpcy5saXN0RWxlbWVudC5lbXB0eSgpO1xuXG4gICAgbGV0IHNlbGVjdGVkTGlzdEl0ZW06IERPTSA9IG51bGw7XG5cbiAgICBjb25zdCBzZWxlY3RJdGVtID0gKGxpc3RJdGVtOiBET00pID0+IHtcbiAgICAgIGxpc3RJdGVtLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKEl0ZW1TZWxlY3Rpb25MaXN0LkNMQVNTX1NFTEVDVEVEKSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlc2VsZWN0SXRlbSA9IChsaXN0SXRlbTogRE9NKSA9PiB7XG4gICAgICBsaXN0SXRlbS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhJdGVtU2VsZWN0aW9uTGlzdC5DTEFTU19TRUxFQ1RFRCkpO1xuICAgIH07XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgIGxldCBsaXN0SXRlbSA9IG5ldyBET00oJ2xpJywge1xuICAgICAgICAndHlwZSc6ICdsaScsXG4gICAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCd1aS1zZWxlY3Rpb25saXN0aXRlbScpLFxuICAgICAgfSkuYXBwZW5kKG5ldyBET00oJ2EnLCB7XG4gICAgICB9KS5odG1sKGkxOG4ucGVyZm9ybUxvY2FsaXphdGlvbihpdGVtLmxhYmVsKSkpO1xuXG4gICAgICBpZiAoIXNlbGVjdGVkTGlzdEl0ZW0pIHtcbiAgICAgICAgaWYgKHNlbGVjdGVkVmFsdWUgPT0gbnVsbCkgeyAvLyBJZiB0aGVyZSBpcyBubyBwcmUtc2VsZWN0ZWQgdmFsdWUsIHNlbGVjdCB0aGUgZmlyc3Qgb25lXG4gICAgICAgICAgc2VsZWN0ZWRMaXN0SXRlbSA9IGxpc3RJdGVtO1xuICAgICAgICB9IGVsc2UgaWYgKFN0cmluZyhzZWxlY3RlZFZhbHVlKSA9PT0gaXRlbS5rZXkpIHsgLy8gY29udmVydCBzZWxlY3RlZFZhbHVlIHRvIHN0cmluZyB0byBjYXRjaCAnbnVsbCcvbnVsbCBjYXNlXG4gICAgICAgICAgc2VsZWN0ZWRMaXN0SXRlbSA9IGxpc3RJdGVtO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBsaXN0IGl0ZW0gc2VsZWN0aW9uc1xuICAgICAgbGlzdEl0ZW0ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAvLyBEZXNlbGVjdCB0aGUgcHJldmlvdXMgaXRlbSAoaWYgdGhlcmUgd2FzIGEgc2VsZWN0ZWQgaXRlbSlcbiAgICAgICAgaWYgKHNlbGVjdGVkTGlzdEl0ZW0pIHtcbiAgICAgICAgICBkZXNlbGVjdEl0ZW0oc2VsZWN0ZWRMaXN0SXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWxlY3QgdGhlIGNsaWNrZWQgaXRlbVxuICAgICAgICBzZWxlY3RlZExpc3RJdGVtID0gbGlzdEl0ZW07XG4gICAgICAgIHNlbGVjdEl0ZW0obGlzdEl0ZW0pO1xuXG4gICAgICAgIC8vIEZpcmUgdGhlIGV2ZW50XG4gICAgICAgIHRoaXMub25JdGVtU2VsZWN0ZWRFdmVudChpdGVtLmtleSwgZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNlbGVjdCBkZWZhdWx0IGl0ZW1cbiAgICAgIGlmIChzZWxlY3RlZExpc3RJdGVtKSB7XG4gICAgICAgIHNlbGVjdEl0ZW0oc2VsZWN0ZWRMaXN0SXRlbSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGlzdEVsZW1lbnQuYXBwZW5kKGxpc3RJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JdGVtQWRkZWRFdmVudCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIub25JdGVtQWRkZWRFdmVudCh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVEb21JdGVtcyh0aGlzLnNlbGVjdGVkSXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JdGVtUmVtb3ZlZEV2ZW50KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5vbkl0ZW1SZW1vdmVkRXZlbnQodmFsdWUpO1xuICAgIHRoaXMudXBkYXRlRG9tSXRlbXModGhpcy5zZWxlY3RlZEl0ZW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSXRlbVNlbGVjdGVkRXZlbnQodmFsdWU6IHN0cmluZywgdXBkYXRlRG9tSXRlbXM6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIub25JdGVtU2VsZWN0ZWRFdmVudCh2YWx1ZSk7XG4gICAgaWYgKHVwZGF0ZURvbUl0ZW1zKSB7XG4gICAgICB0aGlzLnVwZGF0ZURvbUl0ZW1zKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7Q29tcG9uZW50Q29uZmlnLCBDb21wb25lbnR9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHtFdmVudERpc3BhdGNoZXIsIEV2ZW50LCBOb0FyZ3N9IGZyb20gJy4uL2V2ZW50ZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVRleHQsIGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIExhYmVsfSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFiZWxDb25maWcgZXh0ZW5kcyBDb21wb25lbnRDb25maWcge1xuICAvKipcbiAgICogVGhlIHRleHQgYXMgc3RyaW5nIG9yIGxvY2FsaXplIGNhbGxiYWNrIG9uIHRoZSBsYWJlbC5cbiAgICovXG4gIHRleHQ/OiBMb2NhbGl6YWJsZVRleHQ7XG5cbiAgLyoqXG4gICAqIFdDQUcyMCBzdGFuZGFyZDogQXNzb2NpYXRlIGxhYmVsIHRvIGZvcm0gY29udHJvbC5cbiAgICovXG4gIGZvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNpbXBsZSB0ZXh0IGxhYmVsLlxuICpcbiAqIERPTSBleGFtcGxlOlxuICogPGNvZGU+XG4gKiAgICAgPHNwYW4gY2xhc3M9J3VpLWxhYmVsJz4uLi5zb21lIHRleHQuLi48L3NwYW4+XG4gKiA8L2NvZGU+XG4gKi9cbmV4cG9ydCBjbGFzcyBMYWJlbDxDb25maWcgZXh0ZW5kcyBMYWJlbENvbmZpZz4gZXh0ZW5kcyBDb21wb25lbnQ8Q29uZmlnPiB7XG5cbiAgcHJpdmF0ZSB0ZXh0OiBMb2NhbGl6YWJsZVRleHQ7XG5cbiAgcHJpdmF0ZSBsYWJlbEV2ZW50cyA9IHtcbiAgICBvbkNsaWNrOiBuZXcgRXZlbnREaXNwYXRjaGVyPExhYmVsPENvbmZpZz4sIE5vQXJncz4oKSxcbiAgICBvblRleHRDaGFuZ2VkOiBuZXcgRXZlbnREaXNwYXRjaGVyPExhYmVsPENvbmZpZz4sIHN0cmluZz4oKSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbmZpZyA9IHt9IGFzIENvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWxhYmVsJyxcbiAgICB9IGFzIENvbmZpZywgdGhpcy5jb25maWcpO1xuICAgIHRoaXMudGV4dCA9IHRoaXMuY29uZmlnLnRleHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IHRoaXMuY29uZmlnLmZvciAhPSBudWxsID8gJ2xhYmVsJyA6ICdzcGFuJztcblxuICAgIGxldCBsYWJlbEVsZW1lbnQgPSBuZXcgRE9NKHRhZ05hbWUsIHtcbiAgICAgICdpZCc6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgJ2Zvcic6IHRoaXMuY29uZmlnLmZvcixcbiAgICAgICdjbGFzcyc6IHRoaXMuZ2V0Q3NzQ2xhc3NlcygpLFxuICAgIH0pLmh0bWwoaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRoaXMudGV4dCkpO1xuXG4gICAgbGFiZWxFbGVtZW50Lm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMub25DbGlja0V2ZW50KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGFiZWxFbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdGV4dCBvbiB0aGlzIGxhYmVsLlxuICAgKiBAcGFyYW0gdGV4dFxuICAgKi9cbiAgc2V0VGV4dCh0ZXh0OiBMb2NhbGl6YWJsZVRleHQpIHtcbiAgICBpZiAodGV4dCA9PT0gdGhpcy50ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICBjb25zdCBsb2NhbGl6ZWRUZXh0ID0gaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRleHQpO1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmh0bWwobG9jYWxpemVkVGV4dCk7XG4gICAgdGhpcy5vblRleHRDaGFuZ2VkRXZlbnQobG9jYWxpemVkVGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGV4dCBvbiB0aGlzIGxhYmVsLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0ZXh0IG9uIHRoZSBsYWJlbFxuICAgKi9cbiAgZ2V0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24odGhpcy50ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHRleHQgb24gdGhpcyBsYWJlbC5cbiAgICovXG4gIGNsZWFyVGV4dCgpIHtcbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5odG1sKCcnKTtcbiAgICB0aGlzLm9uVGV4dENoYW5nZWRFdmVudChudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyBpZiB0aGUgbGFiZWwgaXMgZW1wdHkgYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IHRleHQuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGxhYmVsIGlzIGVtcHR5LCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy50ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHRoZSB7QGxpbmsgI29uQ2xpY2t9IGV2ZW50LlxuICAgKiBDYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzIHRvIGxpc3RlbiB0byB0aGlzIGV2ZW50IHdpdGhvdXQgc3Vic2NyaWJpbmcgYW4gZXZlbnQgbGlzdGVuZXIgYnkgb3ZlcndyaXRpbmcgdGhlIG1ldGhvZFxuICAgKiBhbmQgY2FsbGluZyB0aGUgc3VwZXIgbWV0aG9kLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQ2xpY2tFdmVudCgpIHtcbiAgICB0aGlzLmxhYmVsRXZlbnRzLm9uQ2xpY2suZGlzcGF0Y2godGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgdGhlIHtAbGluayAjb25DbGlja30gZXZlbnQuXG4gICAqIENhbiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8gbGlzdGVuIHRvIHRoaXMgZXZlbnQgd2l0aG91dCBzdWJzY3JpYmluZyBhbiBldmVudCBsaXN0ZW5lciBieSBvdmVyd3JpdGluZyB0aGUgbWV0aG9kXG4gICAqIGFuZCBjYWxsaW5nIHRoZSBzdXBlciBtZXRob2QuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25UZXh0Q2hhbmdlZEV2ZW50KHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMubGFiZWxFdmVudHMub25UZXh0Q2hhbmdlZC5kaXNwYXRjaCh0aGlzLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIGxhYmVsIGlzIGNsaWNrZWQuXG4gICAqIEByZXR1cm5zIHtFdmVudDxMYWJlbDxMYWJlbENvbmZpZz4sIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25DbGljaygpOiBFdmVudDxMYWJlbDxMYWJlbENvbmZpZz4sIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLmxhYmVsRXZlbnRzLm9uQ2xpY2suZ2V0RXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIHRleHQgb24gdGhlIGxhYmVsIGlzIGNoYW5nZWQuXG4gICAqIEByZXR1cm5zIHtFdmVudDxMYWJlbDxMYWJlbENvbmZpZz4sIHN0cmluZz59XG4gICAqL1xuICBnZXQgb25UZXh0Q2hhbmdlZCgpOiBFdmVudDxMYWJlbDxMYWJlbENvbmZpZz4sIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmxhYmVsRXZlbnRzLm9uVGV4dENoYW5nZWQuZ2V0RXZlbnQoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9nZ2xlQnV0dG9uLCBUb2dnbGVCdXR0b25Db25maWcgfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQgeyBMaXN0SXRlbSwgTGlzdFNlbGVjdG9yLCBMaXN0U2VsZWN0b3JDb25maWcgfSBmcm9tICcuL2xpc3RzZWxlY3Rvcic7XG5pbXBvcnQge0RPTX0gZnJvbSAnLi4vZG9tJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBVSUluc3RhbmNlTWFuYWdlciB9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBBcnJheVV0aWxzIH0gZnJvbSAnLi4vYXJyYXl1dGlscyc7XG5cbi8qKlxuICogQSBlbGVtZW50IHRvIHNlbGVjdCBhIHNpbmdsZSBpdGVtIG91dCBvZiBhIGxpc3Qgb2YgYXZhaWxhYmxlIGl0ZW1zLlxuICpcbiAqIERPTSBleGFtcGxlOlxuICogPGNvZGU+XG4gKiAgIDxkaXYgY2xhc3M9J3VpLWxpc3Rib3gnPlxuICogICAgIDxidXR0b24gY2xhc3M9J3VpLWxpc3Rib3gtYnV0dG9uJz5sYWJlbDwvYnV0dG9uPlxuICogICAgIC4uLlxuICogICA8L2RpdlxuICogPC9jb2RlPlxuICovXG4vLyBUT0RPOiBjaGFuZ2UgTGlzdFNlbGVjdG9yIHRvIGV4dGVuZHMgY29udGFpbmVyIGluIHY0IHRvIGltcHJvdmUgdXNhZ2Ugb2YgTGlzdEJveC5cbi8vICAgICAgIEN1cnJlbnRseSB3ZSBhcmUgY3JlYXRpbmcgdGhlIGRvbSBlbGVtZW50IG9mIHRoZSBsaXN0IGJveCB3aXRoIGNoaWxkIGVsZW1lbnRzIG1hbnVhbGx5IGhlcmUuXG4vLyAgICAgICBCdXQgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGFscmVhZHkgY292ZXJlZCB3aXRoaW4gdGhlIENvbnRhaW5lciBjb21wb25lbnQuXG5leHBvcnQgY2xhc3MgTGlzdEJveCBleHRlbmRzIExpc3RTZWxlY3RvcjxMaXN0U2VsZWN0b3JDb25maWc+IHtcbiAgcHJpdmF0ZSBsaXN0Qm94RWxlbWVudDogRE9NO1xuICBwcml2YXRlIGNvbXBvbmVudHM6IExpc3RCb3hJdGVtQnV0dG9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExpc3RTZWxlY3RvckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktbGlzdGJveCcsXG4gICAgfSBhcyBMaXN0U2VsZWN0b3JDb25maWcsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICAvLyBTdWJzY3JpYmUgYmVmb3JlIHN1cGVyIGNhbGwgdG8gcmVjZWl2ZSBpbml0aWFsIGV2ZW50c1xuICAgIHRoaXMub25JdGVtQWRkZWQuc3Vic2NyaWJlKHRoaXMuYWRkTGlzdEJveERvbUl0ZW0pO1xuICAgIHRoaXMub25JdGVtUmVtb3ZlZC5zdWJzY3JpYmUodGhpcy5yZW1vdmVMaXN0Qm94RG9tSXRlbSk7XG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUodGhpcy5yZWZyZXNoU2VsZWN0ZWRJdGVtKTtcblxuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgbGV0IGxpc3RCb3hFbGVtZW50ID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2lkJzogdGhpcy5jb25maWcuaWQsXG4gICAgICAnY2xhc3MnOiB0aGlzLmdldENzc0NsYXNzZXMoKSxcbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEJveEVsZW1lbnQgPSBsaXN0Qm94RWxlbWVudDtcbiAgICB0aGlzLmNyZWF0ZUxpc3RCb3hEb21JdGVtcygpO1xuICAgIHRoaXMucmVmcmVzaFNlbGVjdGVkSXRlbSgpO1xuXG4gICAgcmV0dXJuIGxpc3RCb3hFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMaXN0Qm94RG9tSXRlbXMoKSB7XG4gICAgLy8gRGVsZXRlIGFsbCBjaGlsZHJlblxuICAgIHRoaXMubGlzdEJveEVsZW1lbnQuZW1wdHkoKTtcbiAgICB0aGlzLmNvbXBvbmVudHMgPSBbXTtcblxuICAgIC8vIEFkZCB1cGRhdGVkIGNoaWxkcmVuXG4gICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICB0aGlzLmFkZExpc3RCb3hEb21JdGVtKHRoaXMsIGl0ZW0ua2V5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUxpc3RCb3hEb21JdGVtID0gKF86IExpc3RCb3gsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRDb21wb25lbnRGb3JLZXkoa2V5KTtcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBjb21wb25lbnQuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZSgpO1xuICAgICAgQXJyYXlVdGlscy5yZW1vdmUodGhpcy5jb21wb25lbnRzLCBjb21wb25lbnQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGFkZExpc3RCb3hEb21JdGVtID0gKF86IExpc3RCb3gsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRDb21wb25lbnRGb3JLZXkoa2V5KTtcbiAgICBjb25zdCBuZXdJdGVtID0gdGhpcy5nZXRJdGVtRm9yS2V5KGtleSk7XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGNvbXBvbmVudFxuICAgICAgY29tcG9uZW50LnNldFRleHQobmV3SXRlbS5sYWJlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxpc3RCb3hJdGVtQnV0dG9uID0gdGhpcy5idWlsZExpc3RCb3hJdGVtQnV0dG9uKG5ld0l0ZW0pO1xuXG4gICAgICBsaXN0Qm94SXRlbUJ1dHRvbi5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKGxpc3RCb3hJdGVtQnV0dG9uKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChsaXN0Qm94SXRlbUJ1dHRvbik7XG4gICAgICB0aGlzLmxpc3RCb3hFbGVtZW50LmFwcGVuZChsaXN0Qm94SXRlbUJ1dHRvbi5nZXREb21FbGVtZW50KCkpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHJlZnJlc2hTZWxlY3RlZEl0ZW0gPSAoKSA9PiB7XG4gICAgLy8gVGhpcyBnZXRzIGNhbGxlZCB0d2ljZSBiZWNhdXNlIHRoZSBmaXJzdCB0aW1lIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgTGlzdEJveEl0ZW1CdXR0b24uIEFuZCB0aGVcbiAgICAvLyBzZWNvbmQgY2FsbCBjb21lcyBmcm9tIHRoZSBwbGF5ZXIgZXZlbnQgd2hlbiB0aGUgYWN0dWFsIGl0ZW0gaXMgc2VsZWN0ZWQgKFN1YnRpdGxlIC8gQXVkaW9UcmFjayBpbiB0aGlzIGNhc2UpLlxuICAgIC8vIEFzIHRoaXMgaXMgYSBnZW5lcmljIGNvbXBvbmVudCB3ZSBjYW4ndCBwcm9oaWJpdCB0aGlzIGJlaGF2aW91ci4gV2UgbmVlZCB0byB0cmVhdCB0aGlzIGNvbXBvbmVudCBhcyBpdCBhY3RzXG4gICAgLy8gaW5kZXBlbmRlbnQgZnJvbSBQbGF5ZXJFdmVudHMgYW5kIG9uIHRoZSBvdGhlciBoYW5kIHdlIG5lZWQgdG8gcmVhY3QgdG8gUGxheWVyRXZlbnRzIGFzIGl0IGNvdWxkIGJlIHRyaWdnZXJlZFxuICAgIC8vIGZyb20gb3V0c2lkZS5cblxuICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRDb21wb25lbnRGb3JLZXkoaXRlbS5rZXkpO1xuICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICBTdHJpbmcoY29tcG9uZW50LmtleSkgPT09IFN0cmluZyh0aGlzLnNlbGVjdGVkSXRlbSkgPyBjb21wb25lbnQub24oKSA6IGNvbXBvbmVudC5vZmYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBidWlsZExpc3RCb3hJdGVtQnV0dG9uKGxpc3RJdGVtOiBMaXN0SXRlbSk6IExpc3RCb3hJdGVtQnV0dG9uIHtcbiAgICByZXR1cm4gbmV3IExpc3RCb3hJdGVtQnV0dG9uKHtcbiAgICAgIGtleTogbGlzdEl0ZW0ua2V5LFxuICAgICAgdGV4dDogbGlzdEl0ZW0ubGFiZWwsXG4gICAgICBhcmlhTGFiZWw6IGxpc3RJdGVtLmFyaWFMYWJlbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcG9uZW50Rm9yS2V5KGtleTogc3RyaW5nKTogTGlzdEJveEl0ZW1CdXR0b24ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHMuZmluZCgoYykgPT4ga2V5ID09PSBjLmtleSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlbGVjdGlvbkNoYW5nZSA9IChzZW5kZXI6IExpc3RCb3hJdGVtQnV0dG9uKSA9PiB7XG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZEV2ZW50KHNlbmRlci5rZXkpO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGlzdEJveEl0ZW1CdXR0b25Db25maWcgZXh0ZW5kcyBUb2dnbGVCdXR0b25Db25maWcge1xuICAvKipcbiAgICoga2V5IHRvIGlkZW50aWZ5IHNlbGVjdGVkIGl0ZW0uIFNpbWlsYXIgdG8gdGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiBhbiBzZWxlY3Qgb3B0aW9uLlxuICAgKi9cbiAga2V5OiBzdHJpbmc7XG59XG5cbmNsYXNzIExpc3RCb3hJdGVtQnV0dG9uIGV4dGVuZHMgVG9nZ2xlQnV0dG9uPExpc3RCb3hJdGVtQnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMaXN0Qm94SXRlbUJ1dHRvbkNvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWxpc3Rib3gtYnV0dG9uJyxcbiAgICAgIG9uQ2xhc3M6ICdzZWxlY3RlZCcsXG4gICAgICBvZmZDbGFzczogJycsXG4gICAgfSBhcyBMaXN0Qm94SXRlbUJ1dHRvbkNvbmZpZywgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgZ2V0IGtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5jb25maWcgYXMgTGlzdEJveEl0ZW1CdXR0b25Db25maWcpLmtleTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudENvbmZpZ30gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHtFdmVudERpc3BhdGNoZXIsIEV2ZW50fSBmcm9tICcuLi9ldmVudGRpc3BhdGNoZXInO1xuaW1wb3J0IHtBcnJheVV0aWxzfSBmcm9tICcuLi9hcnJheXV0aWxzJztcbmltcG9ydCB7IExvY2FsaXphYmxlVGV4dCwgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIG1hcCBvZiBpdGVtcyAoa2V5L3ZhbHVlIC0+IGxhYmVsfSBmb3IgYSB7QGxpbmsgTGlzdFNlbGVjdG9yfSBpbiBhIHtAbGluayBMaXN0U2VsZWN0b3JDb25maWd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBMb2NhbGl6YWJsZVRleHQ7XG4gIHNvcnRlZEluc2VydD86IGJvb2xlYW47XG4gIGFyaWFMYWJlbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGxpc3QgaXRlbXMgYWRkZWQgdGhyb3VnaCB7QGxpbmsgTGlzdFNlbGVjdG9yLmFkZEl0ZW19LlxuICpcbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHN1YmNsYXNzZXMgdGhhdCBwb3B1bGF0ZSB0aGVtc2VsdmVzIGF1dG9tYXRpY2FsbHlcbiAqIHZpYSB0aGUgcGxheWVyIEFQSSwgZS5nLiB7QGxpbmsgU3VidGl0bGVTZWxlY3RCb3h9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtRmlsdGVyIHtcbiAgLyoqXG4gICAqIFRha2VzIGEgbGlzdCBpdGVtIGFuZCBkZWNpZGVzIHdoZXRoZXIgaXQgc2hvdWxkIHBhc3Mgb3IgYmUgZGlzY2FyZGVkLlxuICAgKiBAcGFyYW0ge0xpc3RJdGVtfSBsaXN0SXRlbSB0aGUgaXRlbSB0byBhcHBseSB0aGUgZmlsdGVyIHRvXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIHRvIGxldCB0aGUgaXRlbSBwYXNzIHRocm91Z2ggdGhlIGZpbHRlciwgZmFsc2UgdG8gZGlzY2FyZCB0aGUgaXRlbVxuICAgKi9cbiAgKGxpc3RJdGVtOiBMaXN0SXRlbSk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHJhbnNsYXRvciBmdW5jdGlvbiB0byB0cmFuc2xhdGUgbGFiZWxzIG9mIGxpc3QgaXRlbXMgYWRkZWQgdGhyb3VnaCB7QGxpbmsgTGlzdFNlbGVjdG9yLmFkZEl0ZW19LlxuICpcbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHN1YmNsYXNzZXMgdGhhdCBwb3B1bGF0ZSB0aGVtc2VsdmVzIGF1dG9tYXRpY2FsbHlcbiAqIHZpYSB0aGUgcGxheWVyIEFQSSwgZS5nLiB7QGxpbmsgU3VidGl0bGVTZWxlY3RCb3h9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtTGFiZWxUcmFuc2xhdG9yIHtcbiAgLyoqXG4gICAqIFRha2VzIGEgbGlzdCBpdGVtLCBvcHRpb25hbGx5IGNoYW5nZXMgdGhlIGxhYmVsLCBhbmQgcmV0dXJucyB0aGUgbmV3IGxhYmVsLlxuICAgKiBAcGFyYW0ge0xpc3RJdGVtfSBsaXN0SXRlbSB0aGUgaXRlbSB0byB0cmFuc2xhdGVcbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHRyYW5zbGF0ZWQgb3Igb3JpZ2luYWwgbGFiZWxcbiAgICovXG4gIChsaXN0SXRlbTogTGlzdEl0ZW0pOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIExpc3RTZWxlY3Rvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFNlbGVjdG9yQ29uZmlnIGV4dGVuZHMgQ29tcG9uZW50Q29uZmlnIHtcbiAgaXRlbXM/OiBMaXN0SXRlbVtdO1xuICBmaWx0ZXI/OiBMaXN0SXRlbUZpbHRlcjtcbiAgdHJhbnNsYXRvcj86IExpc3RJdGVtTGFiZWxUcmFuc2xhdG9yO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGlzdFNlbGVjdG9yPENvbmZpZyBleHRlbmRzIExpc3RTZWxlY3RvckNvbmZpZz4gZXh0ZW5kcyBDb21wb25lbnQ8TGlzdFNlbGVjdG9yQ29uZmlnPiB7XG5cbiAgcHJvdGVjdGVkIGl0ZW1zOiBMaXN0SXRlbVtdO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRJdGVtOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBsaXN0U2VsZWN0b3JFdmVudHMgPSB7XG4gICAgb25JdGVtQWRkZWQ6IG5ldyBFdmVudERpc3BhdGNoZXI8TGlzdFNlbGVjdG9yPENvbmZpZz4sIHN0cmluZz4oKSxcbiAgICBvbkl0ZW1SZW1vdmVkOiBuZXcgRXZlbnREaXNwYXRjaGVyPExpc3RTZWxlY3RvcjxDb25maWc+LCBzdHJpbmc+KCksXG4gICAgb25JdGVtU2VsZWN0ZWQ6IG5ldyBFdmVudERpc3BhdGNoZXI8TGlzdFNlbGVjdG9yPENvbmZpZz4sIHN0cmluZz4oKSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExpc3RTZWxlY3RvckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIGNzc0NsYXNzOiAndWktbGlzdHNlbGVjdG9yJyxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG5cbiAgICB0aGlzLml0ZW1zID0gdGhpcy5jb25maWcuaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIGdldEl0ZW1JbmRleChrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgZm9yIChsZXQgaW5kZXggaW4gdGhpcy5pdGVtcykge1xuICAgICAgaWYgKGtleSA9PT0gdGhpcy5pdGVtc1tpbmRleF0ua2V5KSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBjdXJyZW50IGl0ZW1zIG9mIHRoaXMgc2VsZWN0b3IuXG4gICAqICogQHJldHVybnMge0xpc3RJdGVtW119XG4gICAqL1xuICBnZXRJdGVtcygpOiBMaXN0SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBpdGVtIGlzIHBhcnQgb2YgdGhpcyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIGtleSB0aGUga2V5IG9mIHRoZSBpdGVtIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIGlzIHBhcnQgb2YgdGhpcyBzZWxlY3RvciwgZWxzZSBmYWxzZVxuICAgKi9cbiAgaGFzSXRlbShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW1JbmRleChrZXkpID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpdGVtIHRvIHRoaXMgc2VsZWN0b3IgYnkgZG9pbmcgYSBzb3J0ZWQgaW5zZXJ0IG9yIGJ5IGFwcGVuZGluZyB0aGUgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGl0ZW1zLlxuICAgKiBJZiBhbiBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgYWxyZWFkeSBleGlzdHMsIGl0IGlzIHJlcGxhY2VkLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgb2YgdGhlIGl0ZW0gdG8gYWRkXG4gICAqIEBwYXJhbSBsYWJlbCB0aGUgKGh1bWFuLXJlYWRhYmxlKSBsYWJlbCBvZiB0aGUgaXRlbSB0byBhZGRcbiAgICogQHBhcmFtIHNvcnRlZEluc2VydCB3aGV0aGVyIHRoZSBpdGVtIHNob3VsZCBiZSBhZGRlZCByZXNwZWN0aW5nIHRoZSBvcmRlciBvZiBrZXlzXG4gICAqIEBwYXJhbSBhcmlhTGFiZWwgY3VzdG9tIGFyaWEgbGFiZWwgZm9yIHRoZSBsaXN0SXRlbVxuICAgKi9cbiAgYWRkSXRlbShrZXk6IHN0cmluZywgbGFiZWw6IExvY2FsaXphYmxlVGV4dCwgc29ydGVkSW5zZXJ0ID0gZmFsc2UsIGFyaWFMYWJlbCA9ICcnKSB7XG4gICAgY29uc3QgbGlzdEl0ZW0gPSB7IGtleToga2V5LCBsYWJlbDogaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKGxhYmVsKSwgLi4uKGFyaWFMYWJlbCAmJiB7IGFyaWFMYWJlbCB9KX07XG5cbiAgICAvLyBBcHBseSBmaWx0ZXIgZnVuY3Rpb25cbiAgICBpZiAodGhpcy5jb25maWcuZmlsdGVyICYmICF0aGlzLmNvbmZpZy5maWx0ZXIobGlzdEl0ZW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgdHJhbnNsYXRvciBmdW5jdGlvblxuICAgIGlmICh0aGlzLmNvbmZpZy50cmFuc2xhdG9yKSB7XG4gICAgICBsaXN0SXRlbS5sYWJlbCA9IHRoaXMuY29uZmlnLnRyYW5zbGF0b3IobGlzdEl0ZW0pO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byByZW1vdmUga2V5IGZpcnN0IHRvIGdldCBvdmVyd3JpdGUgYmVoYXZpb3IgYW5kIGF2b2lkIGR1cGxpY2F0ZSBrZXlzXG4gICAgdGhpcy5yZW1vdmVJdGVtKGtleSk7IC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGFuIEl0ZW1SZW1vdmVkIGFuZCBhbiBJdGVtQWRkZWQgZXZlbnRcblxuICAgIC8vIEFkZCB0aGUgaXRlbSB0byB0aGUgbGlzdFxuICAgIGlmIChzb3J0ZWRJbnNlcnQpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoZW50cnkgPT4gZW50cnkua2V5ID4ga2V5KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGxpc3RJdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGluZGV4LCAwLCBsaXN0SXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbXMucHVzaChsaXN0SXRlbSk7XG4gICAgfVxuICAgIHRoaXMub25JdGVtQWRkZWRFdmVudChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoaXMgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBvZiB0aGUgaXRlbSB0byByZW1vdmVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgcmVtb3ZhbCB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdGhlIGl0ZW0gaXMgbm90IHBhcnQgb2YgdGhpcyBzZWxlY3RvclxuICAgKi9cbiAgcmVtb3ZlSXRlbShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBpbmRleCA9IHRoaXMuZ2V0SXRlbUluZGV4KGtleSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIEFycmF5VXRpbHMucmVtb3ZlKHRoaXMuaXRlbXMsIHRoaXMuaXRlbXNbaW5kZXhdKTtcbiAgICAgIHRoaXMub25JdGVtUmVtb3ZlZEV2ZW50KGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhbiBpdGVtIGZyb20gdGhlIGl0ZW1zIGluIHRoaXMgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBvZiB0aGUgaXRlbSB0byBzZWxlY3RcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaXMgdGhlIHNlbGVjdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgbm90IHBhcnQgb2YgdGhlIHNlbGVjdG9yXG4gICAqL1xuICBzZWxlY3RJdGVtKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5zZWxlY3RlZEl0ZW0pIHtcbiAgICAgIC8vIGl0ZW1Db25maWcgaXMgYWxyZWFkeSBzZWxlY3RlZCwgc3VwcHJlc3MgYW55IGZ1cnRoZXIgYWN0aW9uXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLmdldEl0ZW1JbmRleChrZXkpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0ga2V5O1xuICAgICAgdGhpcy5vbkl0ZW1TZWxlY3RlZEV2ZW50KGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUga2V5IG9mIHRoZSBzZWxlY3RlZCBpdGVtLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUga2V5IG9mIHRoZSBzZWxlY3RlZCBpdGVtIG9yIG51bGwgaWYgbm8gaXRlbSBpcyBzZWxlY3RlZFxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRJdGVtKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpdGVtcyBmb3IgdGhlIGdpdmVuIGtleSBvciB1bmRlZmluZWQgaWYgbm8gaXRlbSB3aXRoIHRoZSBnaXZlbiBrZXkgZXhpc3RzLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIHtMaXN0SXRlbX0gdGhlIGl0ZW0gd2l0aCB0aGUgcmVxdWVzdGVkIGtleS4gVW5kZWZpbmVkIGlmIG5vIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4ga2V5IGV4aXN0cy5cbiAgICovXG4gIGdldEl0ZW1Gb3JLZXkoa2V5OiBzdHJpbmcpOiBMaXN0SXRlbSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5rZXkgPT09IGtleSk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25pemUgdGhlIGN1cnJlbnQgaXRlbXMgb2YgdGhpcyBzZWxlY3RvciB3aXRoIHRoZSBnaXZlbiBvbmVzLiBUaGlzIHdpbGwgcmVtb3ZlIGFuZCBhZGQgaXRlbXMgc2VsZWN0aXZlbHkuXG4gICAqIEZvciBlYWNoIHJlbW92ZWQgaXRlbSB0aGUgSXRlbVJlbW92ZWRFdmVudCBhbmQgZm9yIGVhY2ggYWRkZWQgaXRlbSB0aGUgSXRlbUFkZGVkRXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuIEZhdm91clxuICAgKiB0aGlzIG1ldGhvZCBvdmVyIHVzaW5nIGNsZWFySXRlbXMgYW5kIGFkZGluZyBhbGwgaXRlbXMgYWdhaW4gYWZ0ZXJ3YXJkcy5cbiAgICogQHBhcmFtIG5ld0l0ZW1zXG4gICAqL1xuICBzeW5jaHJvbml6ZUl0ZW1zKG5ld0l0ZW1zOiBMaXN0SXRlbVtdKTogdm9pZCB7XG4gICAgbmV3SXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICF0aGlzLmhhc0l0ZW0oaXRlbS5rZXkpKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IHRoaXMuYWRkSXRlbShpdGVtLmtleSwgaXRlbS5sYWJlbCwgaXRlbS5zb3J0ZWRJbnNlcnQsIGl0ZW0uYXJpYUxhYmVsKSk7XG5cbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBuZXdJdGVtcy5maWx0ZXIoKGkpID0+IGkua2V5ID09PSBpdGVtLmtleSkubGVuZ3RoID09PSAwKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IHRoaXMucmVtb3ZlSXRlbShpdGVtLmtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIGl0ZW1zIGZyb20gdGhpcyBzZWxlY3Rvci5cbiAgICovXG4gIGNsZWFySXRlbXMoKSB7XG4gICAgLy8gbG9jYWwgY29weSBmb3IgaXRlcmF0aW9uIGFmdGVyIGNsZWFyXG4gICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICAvLyBjbGVhciBpdGVtc1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcblxuICAgIC8vIGNsZWFyIHRoZSBzZWxlY3Rpb24gYXMgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgYWxzbyByZW1vdmVkXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xuXG4gICAgLy8gZmlyZSBldmVudHNcbiAgICBmb3IgKGxldCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICB0aGlzLm9uSXRlbVJlbW92ZWRFdmVudChpdGVtLmtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIHNlbGVjdG9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgaXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaXRlbXMpLmxlbmd0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkl0ZW1BZGRlZEV2ZW50KGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5saXN0U2VsZWN0b3JFdmVudHMub25JdGVtQWRkZWQuZGlzcGF0Y2godGhpcywga2V5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkl0ZW1SZW1vdmVkRXZlbnQoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmxpc3RTZWxlY3RvckV2ZW50cy5vbkl0ZW1SZW1vdmVkLmRpc3BhdGNoKHRoaXMsIGtleSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JdGVtU2VsZWN0ZWRFdmVudChrZXk6IHN0cmluZykge1xuICAgIHRoaXMubGlzdFNlbGVjdG9yRXZlbnRzLm9uSXRlbVNlbGVjdGVkLmRpc3BhdGNoKHRoaXMsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIGFuIGl0ZW0gaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMuXG4gICAqIEByZXR1cm5zIHtFdmVudDxMaXN0U2VsZWN0b3I8Q29uZmlnPiwgc3RyaW5nPn1cbiAgICovXG4gIGdldCBvbkl0ZW1BZGRlZCgpOiBFdmVudDxMaXN0U2VsZWN0b3I8Q29uZmlnPiwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubGlzdFNlbGVjdG9yRXZlbnRzLm9uSXRlbUFkZGVkLmdldEV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIGFuIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGl0ZW1zLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8TGlzdFNlbGVjdG9yPENvbmZpZz4sIHN0cmluZz59XG4gICAqL1xuICBnZXQgb25JdGVtUmVtb3ZlZCgpOiBFdmVudDxMaXN0U2VsZWN0b3I8Q29uZmlnPiwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubGlzdFNlbGVjdG9yRXZlbnRzLm9uSXRlbVJlbW92ZWQuZ2V0RXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0IG9mIGl0ZW1zLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8TGlzdFNlbGVjdG9yPENvbmZpZz4sIHN0cmluZz59XG4gICAqL1xuICBnZXQgb25JdGVtU2VsZWN0ZWQoKTogRXZlbnQ8TGlzdFNlbGVjdG9yPENvbmZpZz4sIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmxpc3RTZWxlY3RvckV2ZW50cy5vbkl0ZW1TZWxlY3RlZC5nZXRFdmVudCgpO1xuICB9XG59IiwiaW1wb3J0IHtMYWJlbENvbmZpZywgTGFiZWx9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbi8qKlxuICogRW51bWVyYXRlcyB0aGUgdHlwZXMgb2YgY29udGVudCB0aGF0IHRoZSB7QGxpbmsgTWV0YWRhdGFMYWJlbH0gY2FuIGRpc3BsYXkuXG4gKi9cbmV4cG9ydCBlbnVtIE1ldGFkYXRhTGFiZWxDb250ZW50IHtcbiAgLyoqXG4gICAqIFRpdGxlIG9mIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIFRpdGxlLFxuICAvKipcbiAgICogRGVzY3JpcHRpb24gZm8gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgRGVzY3JpcHRpb24sXG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHtAbGluayBNZXRhZGF0YUxhYmVsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUxhYmVsQ29uZmlnIGV4dGVuZHMgTGFiZWxDb25maWcge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgY29udGVudCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxhYmVsLlxuICAgKi9cbiAgY29udGVudDogTWV0YWRhdGFMYWJlbENvbnRlbnQ7XG59XG5cbi8qKlxuICogQSBsYWJlbCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHRvIGRpc3BsYXkgY2VydGFpbiBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1ldGFkYXRhTGFiZWwgZXh0ZW5kcyBMYWJlbDxNZXRhZGF0YUxhYmVsQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBNZXRhZGF0YUxhYmVsQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsnbGFiZWwtbWV0YWRhdGEnLCAnbGFiZWwtbWV0YWRhdGEtJyArIE1ldGFkYXRhTGFiZWxDb250ZW50W2NvbmZpZy5jb250ZW50XS50b0xvd2VyQ2FzZSgpXSxcbiAgICB9IGFzIE1ldGFkYXRhTGFiZWxDb25maWcsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBsZXQgdWljb25maWcgPSB1aW1hbmFnZXIuZ2V0Q29uZmlnKCk7XG5cbiAgICBsZXQgaW5pdCA9ICgpID0+IHtcbiAgICAgIHN3aXRjaCAoY29uZmlnLmNvbnRlbnQpIHtcbiAgICAgICAgY2FzZSBNZXRhZGF0YUxhYmVsQ29udGVudC5UaXRsZTpcbiAgICAgICAgICB0aGlzLnNldFRleHQodWljb25maWcubWV0YWRhdGEudGl0bGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE1ldGFkYXRhTGFiZWxDb250ZW50LkRlc2NyaXB0aW9uOlxuICAgICAgICAgIHRoaXMuc2V0VGV4dCh1aWNvbmZpZy5tZXRhZGF0YS5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCB1bmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldFRleHQobnVsbCk7XG4gICAgfTtcblxuICAgIC8vIEluaXQgbGFiZWxcbiAgICBpbml0KCk7XG4gICAgLy8gQ2xlYXIgbGFiZWxzIHdoZW4gc291cmNlIGlzIHVubG9hZGVkXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZVVubG9hZGVkLCB1bmxvYWQpO1xuXG4gICAgdWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKGluaXQpO1xuICB9XG59IiwiaW1wb3J0IHtUb2dnbGVCdXR0b24sIFRvZ2dsZUJ1dHRvbkNvbmZpZ30gZnJvbSAnLi90b2dnbGVidXR0b24nO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgYnV0dG9uIHRoYXQgdG9nZ2xlcyBBcHBsZSBtYWNPUyBwaWN0dXJlLWluLXBpY3R1cmUgbW9kZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBpY3R1cmVJblBpY3R1cmVUb2dnbGVCdXR0b24gZXh0ZW5kcyBUb2dnbGVCdXR0b248VG9nZ2xlQnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBUb2dnbGVCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXBpcHRvZ2dsZWJ1dHRvbicsXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcigncGljdHVyZUluUGljdHVyZScpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBjb25zdCBpc1BpY3R1cmVJblBpY3R1cmVBdmFpbGFibGUgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gcGxheWVyLmlzVmlld01vZGVBdmFpbGFibGUocGxheWVyLmV4cG9ydHMuVmlld01vZGUuUGljdHVyZUluUGljdHVyZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBpY3R1cmVJblBpY3R1cmVTdGF0ZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBwbGF5ZXIuZ2V0Vmlld01vZGUoKSA9PT0gcGxheWVyLmV4cG9ydHMuVmlld01vZGUuUGljdHVyZUluUGljdHVyZSA/IHRoaXMub24oKSA6IHRoaXMub2ZmKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBpY3R1cmVJblBpY3R1cmVBdmFpbGFiaWxpdHlDaGFuZ2VkSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlzUGljdHVyZUluUGljdHVyZUF2YWlsYWJsZSgpID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlZpZXdNb2RlQ2hhbmdlZCwgcGljdHVyZUluUGljdHVyZVN0YXRlSGFuZGxlcik7XG5cbiAgICAvLyBBdmFpbGFibGUgb25seSBpbiBvdXIgbmF0aXZlIFNES3MgZm9yIG5vd1xuICAgIGlmICgocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQgYXMgYW55KS5WaWV3TW9kZUF2YWlsYWJpbGl0eUNoYW5nZWQpIHtcbiAgICAgIHBsYXllci5vbihcbiAgICAgICAgKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50IGFzIGFueSkuVmlld01vZGVBdmFpbGFiaWxpdHlDaGFuZ2VkLFxuICAgICAgICBwaWN0dXJlSW5QaWN0dXJlQXZhaWxhYmlsaXR5Q2hhbmdlZEhhbmRsZXIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZShwaWN0dXJlSW5QaWN0dXJlQXZhaWxhYmlsaXR5Q2hhbmdlZEhhbmRsZXIpO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoIWlzUGljdHVyZUluUGljdHVyZUF2YWlsYWJsZSgpKSB7XG4gICAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1BJUCB1bmF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0Vmlld01vZGUgPVxuICAgICAgICBwbGF5ZXIuZ2V0Vmlld01vZGUoKSA9PT0gcGxheWVyLmV4cG9ydHMuVmlld01vZGUuUGljdHVyZUluUGljdHVyZVxuICAgICAgICAgID8gcGxheWVyLmV4cG9ydHMuVmlld01vZGUuSW5saW5lXG4gICAgICAgICAgOiBwbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5QaWN0dXJlSW5QaWN0dXJlO1xuXG4gICAgICBwbGF5ZXIuc2V0Vmlld01vZGUodGFyZ2V0Vmlld01vZGUpO1xuICAgIH0pO1xuXG4gICAgLy8gU3RhcnR1cCBpbml0XG4gICAgcGljdHVyZUluUGljdHVyZUF2YWlsYWJpbGl0eUNoYW5nZWRIYW5kbGVyKCk7IC8vIEhpZGUgYnV0dG9uIGlmIFBJUCBub3QgYXZhaWxhYmxlXG4gICAgcGljdHVyZUluUGljdHVyZVN0YXRlSGFuZGxlcigpO1xuICB9XG59XG4iLCJpbXBvcnQge1NlbGVjdEJveH0gZnJvbSAnLi9zZWxlY3Rib3gnO1xuaW1wb3J0IHtMaXN0U2VsZWN0b3JDb25maWd9IGZyb20gJy4vbGlzdHNlbGVjdG9yJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIHNlbGVjdCBib3ggcHJvdmlkaW5nIGEgc2VsZWN0aW9uIG9mIGRpZmZlcmVudCBwbGF5YmFjayBzcGVlZHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGF5YmFja1NwZWVkU2VsZWN0Qm94IGV4dGVuZHMgU2VsZWN0Qm94IHtcbiAgcHJvdGVjdGVkIGRlZmF1bHRQbGF5YmFja1NwZWVkczogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMaXN0U2VsZWN0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgdGhpcy5kZWZhdWx0UGxheWJhY2tTcGVlZHMgPSBbMC4yNSwgMC41LCAxLCAxLjUsIDJdO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3NlczogWyd1aS1wbGF5YmFja3NwZWVkc2VsZWN0Ym94J10sXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEl0ZW1zKCk7XG5cbiAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoc2VuZGVyOiBQbGF5YmFja1NwZWVkU2VsZWN0Qm94LCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBwbGF5ZXIuc2V0UGxheWJhY2tTcGVlZChwYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0odmFsdWUpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2V0RGVmYXVsdFZhbHVlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgcGxheWJhY2tTcGVlZCA9IHBsYXllci5nZXRQbGF5YmFja1NwZWVkKCk7XG4gICAgICB0aGlzLnNldFNwZWVkKHBsYXliYWNrU3BlZWQpO1xuICAgIH07XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWJhY2tTcGVlZENoYW5nZWQsIHNldERlZmF1bHRWYWx1ZSk7XG4gICAgdWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKHNldERlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICBzZXRTcGVlZChzcGVlZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdEl0ZW0oU3RyaW5nKHNwZWVkKSkpIHtcbiAgICAgIC8vIGEgcGxheWJhY2sgc3BlZWQgd2FzIHNldCB3aGljaCBpcyBub3QgaW4gdGhlIGxpc3QsIGFkZCBpdCB0byB0aGUgbGlzdCB0byBzaG93IGl0IHRvIHRoZSB1c2VyXG4gICAgICB0aGlzLmNsZWFySXRlbXMoKTtcbiAgICAgIHRoaXMuYWRkRGVmYXVsdEl0ZW1zKFtzcGVlZF0pO1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKFN0cmluZyhzcGVlZCkpO1xuICAgIH1cbiAgfVxuXG4gIGFkZERlZmF1bHRJdGVtcyhjdXN0b21JdGVtczogbnVtYmVyW10gPSBbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNvcnRlZFNwZWVkcyA9IHRoaXMuZGVmYXVsdFBsYXliYWNrU3BlZWRzLmNvbmNhdChjdXN0b21JdGVtcykuc29ydCgpO1xuXG4gICAgc29ydGVkU3BlZWRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudCAhPT0gMSkge1xuICAgICAgICB0aGlzLmFkZEl0ZW0oU3RyaW5nKGVsZW1lbnQpLCBgJHtlbGVtZW50fXhgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkSXRlbShTdHJpbmcoZWxlbWVudCksIGkxOG4uZ2V0TG9jYWxpemVyKCdub3JtYWwnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbGVhckl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XG4gIH1cbn0iLCJpbXBvcnQge0xhYmVsQ29uZmlnLCBMYWJlbH0gZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IExpdmVTdHJlYW1EZXRlY3RvckV2ZW50QXJncyA9IFBsYXllclV0aWxzLkxpdmVTdHJlYW1EZXRlY3RvckV2ZW50QXJncztcbmltcG9ydCB7UGxheWVyVXRpbHN9IGZyb20gJy4uL3BsYXllcnV0aWxzJztcbmltcG9ydCB7U3RyaW5nVXRpbHN9IGZyb20gJy4uL3N0cmluZ3V0aWxzJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG5leHBvcnQgZW51bSBQbGF5YmFja1RpbWVMYWJlbE1vZGUge1xuICAvKipcbiAgICogRGlzcGxheXMgdGhlIGN1cnJlbnQgdGltZVxuICAgKi9cbiAgQ3VycmVudFRpbWUsXG4gIC8qKlxuICAgKiBEaXNwbGF5cyB0aGUgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnRcbiAgICovXG4gIFRvdGFsVGltZSxcbiAgLyoqXG4gICAqIERpc3BsYXlzIHRoZSBjdXJyZW50IHRpbWUgYW5kIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29udGVudFxuICAgKiBGb3JtYXQ6ICR7Y3VycmVudFRpbWV9IC8gJHt0b3RhbFRpbWV9XG4gICAqL1xuICBDdXJyZW50QW5kVG90YWxUaW1lLFxuICAvKipcbiAgICogRGlzcGxheXMgdGhlIHJlbWFpbmluZyB0aW1lIG9mIHRoZSBjb250ZW50XG4gICAqL1xuICBSZW1haW5pbmdUaW1lLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXliYWNrVGltZUxhYmVsQ29uZmlnIGV4dGVuZHMgTGFiZWxDb25maWcge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygd2hpY2ggdGltZSBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBsYWJlbC5cbiAgICogRGVmYXVsdDogUGxheWJhY2tUaW1lTGFiZWxNb2RlLkN1cnJlbnRBbmRUb3RhbFRpbWVcbiAgICovXG4gIHRpbWVMYWJlbE1vZGU/OiBQbGF5YmFja1RpbWVMYWJlbE1vZGU7XG4gIC8qKlxuICAgKiBCb29sZWFuIGlmIHRoZSBsYWJlbCBzaG91bGQgYmUgaGlkZGVuIGluIGxpdmUgcGxheWJhY2tcbiAgICovXG4gIGhpZGVJbkxpdmVQbGF5YmFjaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBsYWJlbCB0aGF0IGRpc3BsYXkgdGhlIGN1cnJlbnQgcGxheWJhY2sgdGltZSBhbmQgdGhlIHRvdGFsIHRpbWUgdGhyb3VnaCB7QGxpbmsgUGxheWJhY2tUaW1lTGFiZWwjc2V0VGltZSBzZXRUaW1lfVxuICogb3IgYW55IHN0cmluZyB0aHJvdWdoIHtAbGluayBQbGF5YmFja1RpbWVMYWJlbCNzZXRUZXh0IHNldFRleHR9LlxuICovXG5leHBvcnQgY2xhc3MgUGxheWJhY2tUaW1lTGFiZWwgZXh0ZW5kcyBMYWJlbDxQbGF5YmFja1RpbWVMYWJlbENvbmZpZz4ge1xuXG4gIHByaXZhdGUgdGltZUZvcm1hdDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGxheWJhY2tUaW1lTGFiZWxDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCA8UGxheWJhY2tUaW1lTGFiZWxDb25maWc+e1xuICAgICAgY3NzQ2xhc3M6ICd1aS1wbGF5YmFja3RpbWVsYWJlbCcsXG4gICAgICB0aW1lTGFiZWxNb2RlOiBQbGF5YmFja1RpbWVMYWJlbE1vZGUuQ3VycmVudEFuZFRvdGFsVGltZSxcbiAgICAgIGhpZGVJbkxpdmVQbGF5YmFjazogZmFsc2UsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIGxldCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGxldCBsaXZlID0gZmFsc2U7XG4gICAgbGV0IGxpdmVDc3NDbGFzcyA9IHRoaXMucHJlZml4Q3NzKCd1aS1wbGF5YmFja3RpbWVsYWJlbC1saXZlJyk7XG4gICAgbGV0IGxpdmVFZGdlQ3NzQ2xhc3MgPSB0aGlzLnByZWZpeENzcygndWktcGxheWJhY2t0aW1lbGFiZWwtbGl2ZS1lZGdlJyk7XG4gICAgbGV0IG1pbldpZHRoID0gMDtcblxuICAgIGxldCBsaXZlQ2xpY2tIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcGxheWVyLnRpbWVTaGlmdCgwKTtcbiAgICB9O1xuXG4gICAgbGV0IHVwZGF0ZUxpdmVTdGF0ZSA9ICgpID0+IHtcbiAgICAgIC8vIFBsYXllciBpcyBwbGF5aW5nIGEgbGl2ZSBzdHJlYW0gd2hlbiB0aGUgZHVyYXRpb24gaXMgaW5maW5pdGVcbiAgICAgIGxpdmUgPSBwbGF5ZXIuaXNMaXZlKCk7XG5cbiAgICAgIC8vIEF0dGFjaC9kZXRhY2ggbGl2ZSBtYXJrZXIgY2xhc3NcbiAgICAgIGlmIChsaXZlKSB7XG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmFkZENsYXNzKGxpdmVDc3NDbGFzcyk7XG4gICAgICAgIHRoaXMuc2V0VGV4dChpMThuLmdldExvY2FsaXplcignbGl2ZScpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5oaWRlSW5MaXZlUGxheWJhY2spIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKGxpdmVDbGlja0hhbmRsZXIpO1xuICAgICAgICB1cGRhdGVMaXZlVGltZXNoaWZ0U3RhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKGxpdmVDc3NDbGFzcyk7XG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKGxpdmVFZGdlQ3NzQ2xhc3MpO1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgdGhpcy5vbkNsaWNrLnVuc3Vic2NyaWJlKGxpdmVDbGlja0hhbmRsZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgdXBkYXRlTGl2ZVRpbWVzaGlmdFN0YXRlID0gKCkgPT4ge1xuICAgICAgaWYgKCFsaXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHBsYXllciBpcyBvbmx5IGF0IHRoZSBsaXZlIGVkZ2UgaWZmIHRoZSBzdHJlYW0gaXMgbm90IHNoaWZ0ZWQgYW5kIGl0IGlzIGFjdHVhbGx5IHBsYXlpbmcgb3IgcGxheWJhY2sgaGFzXG4gICAgICAvLyBuZXZlciBiZWVuIHN0YXJ0ZWQgKG1lYW5pbmcgaXQgaXNuJ3QgcGF1c2VkKS4gQSBwbGF5ZXIgdGhhdCBpcyBwYXVzZWQgaXMgYWx3YXlzIGJlaGluZCB0aGUgbGl2ZSBlZGdlLlxuICAgICAgLy8gQW4gZXhjZXB0aW9uIGlzIG1hZGUgZm9yIGxpdmUgc3RyZWFtcyB3aXRob3V0IGEgdGltZXNoaWZ0IHdpbmRvdywgYmVjYXVzZSBoZXJlIHdlIFwic3RvcFwiIHBsYXliYWNrIGluc3RlYWRcbiAgICAgIC8vIG9mIHBhdXNpbmcgaXQgKGZyb20gYSBVSSBwZXJzcGVjdGl2ZSksIHNvIHdlIGtlZXAgdGhlIGxpdmUgZWRnZSBpbmRpY2F0b3Igb24gYmVjYXVzZSBhIHBsYXkgd291bGQgYWx3YXlzXG4gICAgICAvLyByZXN1bWUgYXQgdGhlIGxpdmUgZWRnZS5cbiAgICAgIGNvbnN0IGlzVGltZXNoaWZ0ZWQgPSBwbGF5ZXIuZ2V0VGltZVNoaWZ0KCkgPCAwO1xuICAgICAgY29uc3QgaXNUaW1lc2hpZnRBdmFpbGFibGUgPSBwbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCkgPCAwO1xuICAgICAgaWYgKCFpc1RpbWVzaGlmdGVkICYmICghcGxheWVyLmlzUGF1c2VkKCkgfHwgIWlzVGltZXNoaWZ0QXZhaWxhYmxlKSkge1xuICAgICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyhsaXZlRWRnZUNzc0NsYXNzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKGxpdmVFZGdlQ3NzQ2xhc3MpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgbGl2ZVN0cmVhbURldGVjdG9yID0gbmV3IFBsYXllclV0aWxzLkxpdmVTdHJlYW1EZXRlY3RvcihwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgbGl2ZVN0cmVhbURldGVjdG9yLm9uTGl2ZUNoYW5nZWQuc3Vic2NyaWJlKChzZW5kZXIsIGFyZ3M6IExpdmVTdHJlYW1EZXRlY3RvckV2ZW50QXJncykgPT4ge1xuICAgICAgbGl2ZSA9IGFyZ3MubGl2ZTtcbiAgICAgIHVwZGF0ZUxpdmVTdGF0ZSgpO1xuICAgIH0pO1xuICAgIGxpdmVTdHJlYW1EZXRlY3Rvci5kZXRlY3QoKTsgLy8gSW5pdGlhbCBkZXRlY3Rpb25cblxuICAgIGxldCBwbGF5YmFja1RpbWVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgaWYgKCFsaXZlICYmIHBsYXllci5nZXREdXJhdGlvbigpICE9PSBJbmZpbml0eSkge1xuICAgICAgICB0aGlzLnNldFRpbWUoUGxheWVyVXRpbHMuZ2V0Q3VycmVudFRpbWVSZWxhdGl2ZVRvU2Vla2FibGVSYW5nZShwbGF5ZXIpLCBwbGF5ZXIuZ2V0RHVyYXRpb24oKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkICdqdW1waW5nJyBpbiB0aGUgVUkgYnkgdmFyeWluZyBsYWJlbCBzaXplcyBkdWUgdG8gbm9uLW1vbm9zcGFjZWQgZm9udHMsXG4gICAgICAvLyB3ZSBncmFkdWFsbHkgaW5jcmVhc2UgdGhlIG1pbi13aWR0aCB3aXRoIHRoZSBjb250ZW50IHRvIHJlYWNoIGEgc3RhYmxlIHNpemUuXG4gICAgICBsZXQgd2lkdGggPSB0aGlzLmdldERvbUVsZW1lbnQoKS53aWR0aCgpO1xuICAgICAgaWYgKHdpZHRoID4gbWluV2lkdGgpIHtcbiAgICAgICAgbWluV2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuY3NzKHtcbiAgICAgICAgICAnbWluLXdpZHRoJzogbWluV2lkdGggKyAncHgnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlRpbWVDaGFuZ2VkLCBwbGF5YmFja1RpbWVIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU2Vla2VkLCBwbGF5YmFja1RpbWVIYW5kbGVyKTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lU2hpZnQsIHVwZGF0ZUxpdmVUaW1lc2hpZnRTdGF0ZSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlRpbWVTaGlmdGVkLCB1cGRhdGVMaXZlVGltZXNoaWZ0U3RhdGUpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5aW5nLCB1cGRhdGVMaXZlVGltZXNoaWZ0U3RhdGUpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QYXVzZWQsIHVwZGF0ZUxpdmVUaW1lc2hpZnRTdGF0ZSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlN0YWxsU3RhcnRlZCwgdXBkYXRlTGl2ZVRpbWVzaGlmdFN0YXRlKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3RhbGxFbmRlZCwgdXBkYXRlTGl2ZVRpbWVzaGlmdFN0YXRlKTtcblxuICAgIGxldCBpbml0ID0gKCkgPT4ge1xuICAgICAgLy8gUmVzZXQgbWluLXdpZHRoIHdoZW4gYSBuZXcgc291cmNlIGlzIHJlYWR5IChlc3BlY2lhbGx5IGZvciBzd2l0Y2hpbmcgVk9EL0xpdmUgbW9kZXMgd2hlcmUgdGhlIGxhYmVsIGNvbnRlbnRcbiAgICAgIC8vIGNoYW5nZXMpXG4gICAgICBtaW5XaWR0aCA9IDA7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5jc3Moe1xuICAgICAgICAnbWluLXdpZHRoJzogbnVsbCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdGltZSBmb3JtYXQgZGVwZW5kaW5nIG9uIHNvdXJjZSBkdXJhdGlvblxuICAgICAgdGhpcy50aW1lRm9ybWF0ID0gTWF0aC5hYnMocGxheWVyLmlzTGl2ZSgpID8gcGxheWVyLmdldE1heFRpbWVTaGlmdCgpIDogcGxheWVyLmdldER1cmF0aW9uKCkpID49IDM2MDAgP1xuICAgICAgICBTdHJpbmdVdGlscy5GT1JNQVRfSEhNTVNTIDogU3RyaW5nVXRpbHMuRk9STUFUX01NU1M7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aW1lIGFmdGVyIHRoZSBmb3JtYXQgaGFzIGJlZW4gc2V0XG4gICAgICBwbGF5YmFja1RpbWVIYW5kbGVyKCk7XG4gICAgfTtcbiAgICB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUoaW5pdCk7XG5cbiAgICBpbml0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBwbGF5YmFjayB0aW1lIGFuZCB0b3RhbCBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHBsYXliYWNrU2Vjb25kcyB0aGUgY3VycmVudCBwbGF5YmFjayB0aW1lIGluIHNlY29uZHNcbiAgICogQHBhcmFtIGR1cmF0aW9uU2Vjb25kcyB0aGUgdG90YWwgZHVyYXRpb24gaW4gc2Vjb25kc1xuICAgKi9cbiAgc2V0VGltZShwbGF5YmFja1NlY29uZHM6IG51bWJlciwgZHVyYXRpb25TZWNvbmRzOiBudW1iZXIpIHtcbiAgICBsZXQgY3VycmVudFRpbWUgPSBTdHJpbmdVdGlscy5zZWNvbmRzVG9UaW1lKHBsYXliYWNrU2Vjb25kcywgdGhpcy50aW1lRm9ybWF0KTtcbiAgICBsZXQgdG90YWxUaW1lID0gU3RyaW5nVXRpbHMuc2Vjb25kc1RvVGltZShkdXJhdGlvblNlY29uZHMsIHRoaXMudGltZUZvcm1hdCk7XG5cbiAgICBzd2l0Y2ggKCg8UGxheWJhY2tUaW1lTGFiZWxDb25maWc+dGhpcy5jb25maWcpLnRpbWVMYWJlbE1vZGUpIHtcbiAgICAgIGNhc2UgUGxheWJhY2tUaW1lTGFiZWxNb2RlLkN1cnJlbnRUaW1lOlxuICAgICAgICB0aGlzLnNldFRleHQoYCR7Y3VycmVudFRpbWV9YCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQbGF5YmFja1RpbWVMYWJlbE1vZGUuVG90YWxUaW1lOlxuICAgICAgICB0aGlzLnNldFRleHQoYCR7dG90YWxUaW1lfWApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUGxheWJhY2tUaW1lTGFiZWxNb2RlLkN1cnJlbnRBbmRUb3RhbFRpbWU6XG4gICAgICAgIHRoaXMuc2V0VGV4dChgJHtjdXJyZW50VGltZX0gLyAke3RvdGFsVGltZX1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBsYXliYWNrVGltZUxhYmVsTW9kZS5SZW1haW5pbmdUaW1lOlxuICAgICAgICBsZXQgcmVtYWluaW5nVGltZSA9IFN0cmluZ1V0aWxzLnNlY29uZHNUb1RpbWUoZHVyYXRpb25TZWNvbmRzIC0gcGxheWJhY2tTZWNvbmRzLCB0aGlzLnRpbWVGb3JtYXQpO1xuICAgICAgICB0aGlzLnNldFRleHQoYCR7cmVtYWluaW5nVGltZX1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgdGltZSBmb3JtYXRcbiAgICogQHBhcmFtIHRpbWVGb3JtYXQgdGhlIHRpbWUgZm9ybWF0XG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0VGltZUZvcm1hdCh0aW1lRm9ybWF0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVGb3JtYXQgPSB0aW1lRm9ybWF0O1xuICB9XG59XG4iLCJpbXBvcnQge1RvZ2dsZUJ1dHRvbiwgVG9nZ2xlQnV0dG9uQ29uZmlnfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtQbGF5ZXJVdGlsc30gZnJvbSAnLi4vcGxheWVydXRpbHMnO1xuaW1wb3J0IHsgUGxheWVyQVBJLCBXYXJuaW5nRXZlbnQgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IHRvZ2dsZXMgYmV0d2VlbiBwbGF5YmFjayBhbmQgcGF1c2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGF5YmFja1RvZ2dsZUJ1dHRvbiBleHRlbmRzIFRvZ2dsZUJ1dHRvbjxUb2dnbGVCdXR0b25Db25maWc+IHtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTEFTU19TVE9QVE9HR0xFID0gJ3N0b3B0b2dnbGUnO1xuICBwcm90ZWN0ZWQgaXNQbGF5SW5pdGlhdGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogVG9nZ2xlQnV0dG9uQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1wbGF5YmFja3RvZ2dsZWJ1dHRvbicsXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcigncGxheScpLFxuICAgICAgb25BcmlhTGFiZWw6IGkxOG4uZ2V0TG9jYWxpemVyKCdwYXVzZScpLFxuICAgICAgb2ZmQXJpYUxhYmVsOiBpMThuLmdldExvY2FsaXplcigncGxheScpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcblxuICAgIHRoaXMuaXNQbGF5SW5pdGlhdGVkID0gZmFsc2U7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIsIGhhbmRsZUNsaWNrRXZlbnQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIGxldCBpc1NlZWtpbmcgPSBmYWxzZTtcblxuICAgIC8vIEhhbmRsZXIgdG8gdXBkYXRlIGJ1dHRvbiBzdGF0ZSBiYXNlZCBvbiBwbGF5ZXIgc3RhdGVcbiAgICBsZXQgcGxheWJhY2tTdGF0ZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAvLyBJZiB0aGUgVUkgaXMgY3VycmVudGx5IHNlZWtpbmcsIHBsYXliYWNrIGlzIHRlbXBvcmFyaWx5IHN0b3BwZWQgYnV0IHRoZSBidXR0b25zIHNob3VsZFxuICAgICAgLy8gbm90IHJlZmxlY3QgdGhhdCBhbmQgc3RheSBhcy1pcyAoZS5nIGluZGljYXRlIHBsYXliYWNrIHdoaWxlIHNlZWtpbmcpLlxuICAgICAgaWYgKGlzU2Vla2luZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChwbGF5ZXIuaXNQbGF5aW5nKCkgfHwgdGhpcy5pc1BsYXlJbml0aWF0ZWQpIHtcbiAgICAgICAgdGhpcy5vbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vZmYoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FsbCBoYW5kbGVyIHVwb24gdGhlc2UgZXZlbnRzXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXksIChlKSA9PiB7XG4gICAgICB0aGlzLmlzUGxheUluaXRpYXRlZCA9IHRydWU7XG4gICAgICBwbGF5YmFja1N0YXRlSGFuZGxlcigpO1xuICAgIH0pO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBhdXNlZCwgKGUpID0+IHtcbiAgICAgIHRoaXMuaXNQbGF5SW5pdGlhdGVkID0gZmFsc2U7XG4gICAgICBwbGF5YmFja1N0YXRlSGFuZGxlcigpO1xuICAgIH0pO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXlpbmcsIChlKSA9PiB7XG4gICAgICB0aGlzLmlzUGxheUluaXRpYXRlZCA9IGZhbHNlO1xuICAgICAgcGxheWJhY2tTdGF0ZUhhbmRsZXIoKTtcbiAgICB9KTtcbiAgICAvLyBhZnRlciB1bmxvYWRpbmcgKyBsb2FkaW5nIGEgbmV3IHNvdXJjZSwgdGhlIHBsYXllciBtaWdodCBiZSBpbiBhIGRpZmZlcmVudCBwbGF5aW5nIHN0YXRlIChmcm9tIHBsYXlpbmcgaW50byBzdG9wcGVkKVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VMb2FkZWQsIHBsYXliYWNrU3RhdGVIYW5kbGVyKTtcbiAgICB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUocGxheWJhY2tTdGF0ZUhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgcGxheWJhY2tTdGF0ZUhhbmRsZXIpO1xuICAgIC8vIHdoZW4gcGxheWJhY2sgZmluaXNoZXMsIHBsYXllciB0dXJucyB0byBwYXVzZWQgbW9kZVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5YmFja0ZpbmlzaGVkLCBwbGF5YmFja1N0YXRlSGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RTdGFydGVkLCBwbGF5YmFja1N0YXRlSGFuZGxlcik7XG5cbiAgICAvLyBXaGVuIGEgcGxheWJhY2sgYXR0ZW1wdCBpcyByZWplY3RlZCB3aXRoIHdhcm5pbmcgNTAwOCwgd2Ugc3dpdGNoIHRoZSBidXR0b24gc3RhdGUgYmFjayB0byBvZmZcbiAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIGZvciBibG9ja2VkIGF1dG9wbGF5LCBiZWNhdXNlIHRoZXJlIGlzIG5vIFBhdXNlZCBldmVudCBpbiBzdWNoIGNhc2VcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuV2FybmluZywgKGV2ZW50OiBXYXJuaW5nRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5jb2RlID09PSBwbGF5ZXIuZXhwb3J0cy5XYXJuaW5nQ29kZS5QTEFZQkFDS19DT1VMRF9OT1RfQkVfU1RBUlRFRCkge1xuICAgICAgICB0aGlzLmlzUGxheUluaXRpYXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9mZigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdXBkYXRlTGl2ZVN0YXRlID0gKCkgPT4ge1xuICAgICAgY29uc3Qgc2hvd1N0b3BUb2dnbGUgPSBwbGF5ZXIuaXNMaXZlKCkgJiYgIVBsYXllclV0aWxzLmlzVGltZVNoaWZ0QXZhaWxhYmxlKHBsYXllcik7XG5cbiAgICAgIGlmIChzaG93U3RvcFRvZ2dsZSkge1xuICAgICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhQbGF5YmFja1RvZ2dsZUJ1dHRvbi5DTEFTU19TVE9QVE9HR0xFKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhQbGF5YmFja1RvZ2dsZUJ1dHRvbi5DTEFTU19TVE9QVE9HR0xFKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIERldGVjdCBhYnNlbmNlIG9mIHRpbWVzaGlmdGluZyBvbiBsaXZlIHN0cmVhbXMgYW5kIGFkZCB0YWdnaW5nIGNsYXNzIHRvIGNvbnZlcnQgYnV0dG9uIGljb25zIHRvIHBsYXkvc3RvcFxuICAgIGxldCB0aW1lU2hpZnREZXRlY3RvciA9IG5ldyBQbGF5ZXJVdGlscy5UaW1lU2hpZnRBdmFpbGFiaWxpdHlEZXRlY3RvcihwbGF5ZXIpO1xuICAgIGxldCBsaXZlU3RyZWFtRGV0ZWN0b3IgPSBuZXcgUGxheWVyVXRpbHMuTGl2ZVN0cmVhbURldGVjdG9yKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRpbWVTaGlmdERldGVjdG9yLm9uVGltZVNoaWZ0QXZhaWxhYmlsaXR5Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdXBkYXRlTGl2ZVN0YXRlKCkpO1xuICAgIGxpdmVTdHJlYW1EZXRlY3Rvci5vbkxpdmVDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB1cGRhdGVMaXZlU3RhdGUoKSk7XG5cbiAgICB0aW1lU2hpZnREZXRlY3Rvci5kZXRlY3QoKTsgLy8gSW5pdGlhbCBkZXRlY3Rpb25cbiAgICBsaXZlU3RyZWFtRGV0ZWN0b3IuZGV0ZWN0KCk7XG5cbiAgICBpZiAoaGFuZGxlQ2xpY2tFdmVudCkge1xuICAgICAgLy8gQ29udHJvbCBwbGF5ZXIgYnkgYnV0dG9uIGV2ZW50c1xuICAgICAgLy8gV2hlbiBhIGJ1dHRvbiBldmVudCB0cmlnZ2VycyBhIHBsYXllciBBUEkgY2FsbCwgZXZlbnRzIGFyZSBmaXJlZCB3aGljaCBpbiB0dXJuIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXJcbiAgICAgIC8vIGFib3ZlIHRoYXQgdXBkYXRlZCB0aGUgYnV0dG9uIHN0YXRlLlxuICAgICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmIChwbGF5ZXIuaXNQbGF5aW5nKCkgfHwgdGhpcy5pc1BsYXlJbml0aWF0ZWQpIHtcbiAgICAgICAgICBwbGF5ZXIucGF1c2UoJ3VpJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGxheWVyLnBsYXkoJ3VpJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIFVJIHNlZWtpbmcgc3RhdHVzXG4gICAgdWltYW5hZ2VyLm9uU2Vlay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaXNTZWVraW5nID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB1aW1hbmFnZXIub25TZWVrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlzU2Vla2luZyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgLy8gU3RhcnR1cCBpbml0XG4gICAgcGxheWJhY2tTdGF0ZUhhbmRsZXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb250YWluZXIsIENvbnRhaW5lckNvbmZpZ30gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHtIdWdlUGxheWJhY2tUb2dnbGVCdXR0b259IGZyb20gJy4vaHVnZXBsYXliYWNrdG9nZ2xlYnV0dG9uJztcblxuLyoqXG4gKiBPdmVybGF5cyB0aGUgcGxheWVyIGFuZCBkaXNwbGF5cyBlcnJvciBtZXNzYWdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsYXliYWNrVG9nZ2xlT3ZlcmxheSBleHRlbmRzIENvbnRhaW5lcjxDb250YWluZXJDb25maWc+IHtcblxuICBwcml2YXRlIHBsYXliYWNrVG9nZ2xlQnV0dG9uOiBIdWdlUGxheWJhY2tUb2dnbGVCdXR0b247XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb250YWluZXJDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLnBsYXliYWNrVG9nZ2xlQnV0dG9uID0gbmV3IEh1Z2VQbGF5YmFja1RvZ2dsZUJ1dHRvbigpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1wbGF5YmFja3RvZ2dsZS1vdmVybGF5JyxcbiAgICAgIGNvbXBvbmVudHM6IFt0aGlzLnBsYXliYWNrVG9nZ2xlQnV0dG9uXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cbn0iLCJpbXBvcnQge0NvbnRhaW5lckNvbmZpZywgQ29udGFpbmVyfSBmcm9tICcuL2NvbnRhaW5lcic7XG5pbXBvcnQge0NvbXBvbmVudCwgQ29tcG9uZW50Q29uZmlnfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQge0RPTX0gZnJvbSAnLi4vZG9tJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1N0cmluZ1V0aWxzfSBmcm9tICcuLi9zdHJpbmd1dGlscyc7XG5pbXBvcnQge0h1Z2VSZXBsYXlCdXR0b259IGZyb20gJy4vaHVnZXJlcGxheWJ1dHRvbic7XG5pbXBvcnQgeyBVSVJlY29tbWVuZGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vdWljb25maWcnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcblxuLyoqXG4gKiBPdmVybGF5cyB0aGUgcGxheWVyIGFuZCBkaXNwbGF5cyByZWNvbW1lbmRlZCB2aWRlb3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNvbW1lbmRhdGlvbk92ZXJsYXkgZXh0ZW5kcyBDb250YWluZXI8Q29udGFpbmVyQ29uZmlnPiB7XG5cbiAgcHJpdmF0ZSByZXBsYXlCdXR0b246IEh1Z2VSZXBsYXlCdXR0b247XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb250YWluZXJDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLnJlcGxheUJ1dHRvbiA9IG5ldyBIdWdlUmVwbGF5QnV0dG9uKCk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXJlY29tbWVuZGF0aW9uLW92ZXJsYXknLFxuICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgY29tcG9uZW50czogW3RoaXMucmVwbGF5QnV0dG9uXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbGV0IGNsZWFyUmVjb21tZW5kYXRpb25zID0gKCkgPT4ge1xuICAgICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0Q29tcG9uZW50cygpLnNsaWNlKCkpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFJlY29tbWVuZGF0aW9uSXRlbSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50cygpO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoJ3JlY29tbWVuZGF0aW9ucycpKTtcbiAgICB9O1xuXG4gICAgbGV0IHNldHVwUmVjb21tZW5kYXRpb25zID0gKCkgPT4ge1xuICAgICAgY2xlYXJSZWNvbW1lbmRhdGlvbnMoKTtcblxuICAgICAgY29uc3QgcmVjb21tZW5kYXRpb25zID0gdWltYW5hZ2VyLmdldENvbmZpZygpLnJlY29tbWVuZGF0aW9ucztcblxuICAgICAgaWYgKHJlY29tbWVuZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBpbmRleCA9IDE7XG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgcmVjb21tZW5kYXRpb25zKSB7XG4gICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQobmV3IFJlY29tbWVuZGF0aW9uSXRlbSh7XG4gICAgICAgICAgICBpdGVtQ29uZmlnOiBpdGVtLFxuICAgICAgICAgICAgY3NzQ2xhc3NlczogWydyZWNvbW1lbmRhdGlvbi1pdGVtLScgKyAoaW5kZXgrKyldLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudHMoKTsgLy8gY3JlYXRlIGNvbnRhaW5lciBET00gZWxlbWVudHNcblxuICAgICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyh0aGlzLnByZWZpeENzcygncmVjb21tZW5kYXRpb25zJykpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUoc2V0dXBSZWNvbW1lbmRhdGlvbnMpO1xuICAgIC8vIFJlbW92ZSByZWNvbW1lbmRhdGlvbnMgYW5kIGhpZGUgb3ZlcmxheSB3aGVuIHNvdXJjZSBpcyB1bmxvYWRlZFxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgKCkgPT4ge1xuICAgICAgY2xlYXJSZWNvbW1lbmRhdGlvbnMoKTtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0pO1xuICAgIC8vIERpc3BsYXkgcmVjb21tZW5kYXRpb25zIHdoZW4gcGxheWJhY2sgaGFzIGZpbmlzaGVkXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXliYWNrRmluaXNoZWQsICgpID0+IHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH0pO1xuICAgIC8vIEhpZGUgcmVjb21tZW5kYXRpb25zIHdoZW4gcGxheWJhY2sgc3RhcnRzLCBlLmcuIGEgcmVzdGFydFxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCAoKSA9PiB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEluaXQgb24gc3RhcnR1cFxuICAgIHNldHVwUmVjb21tZW5kYXRpb25zKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIHtAbGluayBSZWNvbW1lbmRhdGlvbkl0ZW19XG4gKi9cbmludGVyZmFjZSBSZWNvbW1lbmRhdGlvbkl0ZW1Db25maWcgZXh0ZW5kcyBDb21wb25lbnRDb25maWcge1xuICBpdGVtQ29uZmlnOiBVSVJlY29tbWVuZGF0aW9uQ29uZmlnO1xufVxuXG4vKipcbiAqIEFuIGl0ZW0gb2YgdGhlIHtAbGluayBSZWNvbW1lbmRhdGlvbk92ZXJsYXl9LiBVc2VkIG9ubHkgaW50ZXJuYWxseSBpbiB7QGxpbmsgUmVjb21tZW5kYXRpb25PdmVybGF5fS5cbiAqL1xuY2xhc3MgUmVjb21tZW5kYXRpb25JdGVtIGV4dGVuZHMgQ29tcG9uZW50PFJlY29tbWVuZGF0aW9uSXRlbUNvbmZpZz4ge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUmVjb21tZW5kYXRpb25JdGVtQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktcmVjb21tZW5kYXRpb24taXRlbScsXG4gICAgICBpdGVtQ29uZmlnOiBudWxsLCAvLyB0aGlzIG11c3QgYmUgcGFzc2VkIGluIGZyb20gb3V0c2lkZVxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b0RvbUVsZW1lbnQoKTogRE9NIHtcbiAgICBsZXQgY29uZmlnID0gdGhpcy5jb25maWcuaXRlbUNvbmZpZztcblxuICAgIGxldCBpdGVtRWxlbWVudCA9IG5ldyBET00oJ2EnLCB7XG4gICAgICAnaWQnOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICdjbGFzcyc6IHRoaXMuZ2V0Q3NzQ2xhc3NlcygpLFxuICAgICAgJ2hyZWYnOiBjb25maWcudXJsLFxuICAgIH0pLmNzcyh7ICdiYWNrZ3JvdW5kLWltYWdlJzogYHVybCgke2NvbmZpZy50aHVtYm5haWx9KWAgfSk7XG5cbiAgICBsZXQgYmdFbGVtZW50ID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ2JhY2tncm91bmQnKSxcbiAgICB9KTtcbiAgICBpdGVtRWxlbWVudC5hcHBlbmQoYmdFbGVtZW50KTtcblxuICAgIGxldCB0aXRsZUVsZW1lbnQgPSBuZXcgRE9NKCdzcGFuJywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ3RpdGxlJyksXG4gICAgfSkuYXBwZW5kKG5ldyBET00oJ3NwYW4nLCB7XG4gICAgICAnY2xhc3MnOiB0aGlzLnByZWZpeENzcygnaW5uZXJ0aXRsZScpLFxuICAgIH0pLmh0bWwoY29uZmlnLnRpdGxlKSk7XG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kKHRpdGxlRWxlbWVudCk7XG5cbiAgICBsZXQgdGltZUVsZW1lbnQgPSBuZXcgRE9NKCdzcGFuJywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ2R1cmF0aW9uJyksXG4gICAgfSkuYXBwZW5kKG5ldyBET00oJ3NwYW4nLCB7XG4gICAgICAnY2xhc3MnOiB0aGlzLnByZWZpeENzcygnaW5uZXJkdXJhdGlvbicpLFxuICAgIH0pLmh0bWwoY29uZmlnLmR1cmF0aW9uID8gU3RyaW5nVXRpbHMuc2Vjb25kc1RvVGltZShjb25maWcuZHVyYXRpb24pIDogJycpKTtcbiAgICBpdGVtRWxlbWVudC5hcHBlbmQodGltZUVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xuICB9XG59IiwiaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRDb25maWcgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBET00gfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHsgRXZlbnQsIEV2ZW50RGlzcGF0Y2hlciwgTm9BcmdzIH0gZnJvbSAnLi4vZXZlbnRkaXNwYXRjaGVyJztcbmltcG9ydCB7IFNlZWtCYXJMYWJlbCB9IGZyb20gJy4vc2Vla2JhcmxhYmVsJztcbmltcG9ydCB7IFVJSW5zdGFuY2VNYW5hZ2VyLCBTZWVrUHJldmlld0FyZ3MgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgVGltZW91dCB9IGZyb20gJy4uL3RpbWVvdXQnO1xuaW1wb3J0IHsgUGxheWVyVXRpbHMgfSBmcm9tICcuLi9wbGF5ZXJ1dGlscyc7XG5pbXBvcnQgVGltZVNoaWZ0QXZhaWxhYmlsaXR5Q2hhbmdlZEFyZ3MgPSBQbGF5ZXJVdGlscy5UaW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkQXJncztcbmltcG9ydCBMaXZlU3RyZWFtRGV0ZWN0b3JFdmVudEFyZ3MgPSBQbGF5ZXJVdGlscy5MaXZlU3RyZWFtRGV0ZWN0b3JFdmVudEFyZ3M7XG5pbXBvcnQgeyBUaW1lbGluZU1hcmtlciB9IGZyb20gJy4uL3VpY29uZmlnJztcbmltcG9ydCB7IFBsYXllckFQSSwgUGxheWVyRXZlbnRCYXNlIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IFN0cmluZ1V0aWxzIH0gZnJvbSAnLi4vc3RyaW5ndXRpbHMnO1xuaW1wb3J0IHsgU2Vla0JhclR5cGUsIFNlZWtCYXJDb250cm9sbGVyIH0gZnJvbSAnLi9zZWVrYmFyY29udHJvbGxlcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuaW1wb3J0IHsgQnJvd3NlclV0aWxzIH0gZnJvbSAnLi4vYnJvd3NlcnV0aWxzJztcbmltcG9ydCB7IFRpbWVsaW5lTWFya2Vyc0hhbmRsZXIgfSBmcm9tICcuL3RpbWVsaW5lbWFya2Vyc2hhbmRsZXInO1xuaW1wb3J0IHsgZ2V0TWluQnVmZmVyTGV2ZWwgfSBmcm9tICcuL3NlZWtiYXJidWZmZXJsZXZlbCc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgU2Vla0Jhcn0gY29tcG9uZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlZWtCYXJDb25maWcgZXh0ZW5kcyBDb21wb25lbnRDb25maWcge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGFib3ZlIHRoZSBzZWVrIHBvc2l0aW9uLlxuICAgKi9cbiAgbGFiZWw/OiBTZWVrQmFyTGFiZWw7XG4gIC8qKlxuICAgKiBCYXIgd2lsbCBiZSB2ZXJ0aWNhbCBpbnN0ZWFkIG9mIGhvcml6b250YWwgaWYgc2V0IHRvIHRydWUuXG4gICAqL1xuICB2ZXJ0aWNhbD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGluIHdoaWNoIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBvbiB0aGUgc2VlayBiYXIgd2lsbCBiZSB1cGRhdGVkLiBUaGUgc2hvcnRlciB0aGVcbiAgICogaW50ZXJ2YWwsIHRoZSBzbW9vdGhlciBpdCBsb29rcyBhbmQgdGhlIG1vcmUgcmVzb3VyY2UgaW50ZW5zZSBpdCBpcy4gVGhlIHVwZGF0ZSBpbnRlcnZhbCB3aWxsIGJlIGtlcHQgYXMgc3RlYWR5XG4gICAqIGFzIHBvc3NpYmxlIHRvIGF2b2lkIGppdHRlci5cbiAgICogU2V0IHRvIC0xIHRvIGRpc2FibGUgc21vb3RoIHVwZGF0aW5nIGFuZCB1cGRhdGUgaXQgb24gcGxheWVyIFRpbWVDaGFuZ2VkIGV2ZW50cyBpbnN0ZWFkLlxuICAgKiBEZWZhdWx0OiA1MCAoNTBtcyA9IDIwZnBzKS5cbiAgICovXG4gIHNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVJbnRlcnZhbE1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBzZWVrQmFyIGNvbnRyb2wgaW5jcmVtZW50cyBhbmQgZGVjcmVtZW50c1xuICAgKi9cbiAga2V5U3RlcEluY3JlbWVudHM/OiB7IGxlZnRSaWdodDogbnVtYmVyLCB1cERvd246IG51bWJlciB9O1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBzZWVrQmFyIG1hcmtlciBzbmFwcGluZyByYW5nZSBwZXJjZW50YWdlXG4gICAqL1xuICBzbmFwcGluZ1JhbmdlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV2ZW50IGFyZ3VtZW50IGludGVyZmFjZSBmb3IgYSBzZWVrIHByZXZpZXcgZXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vla1ByZXZpZXdFdmVudEFyZ3MgZXh0ZW5kcyBTZWVrUHJldmlld0FyZ3Mge1xuICAvKipcbiAgICogVGVsbHMgaWYgdGhlIHNlZWsgcHJldmlldyBldmVudCBjb21lcyBmcm9tIGEgc2NydWJiaW5nLlxuICAgKi9cbiAgc2NydWJiaW5nOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlZWtCYXJNYXJrZXIge1xuICBtYXJrZXI6IFRpbWVsaW5lTWFya2VyO1xuICBwb3NpdGlvbjogbnVtYmVyO1xuICBkdXJhdGlvbj86IG51bWJlcjtcbiAgZWxlbWVudD86IERPTTtcbn1cblxuLyoqXG4gKiBBIHNlZWsgYmFyIHRvIHNlZWsgd2l0aGluIHRoZSBwbGF5ZXIncyBtZWRpYS4gSXQgZGlzcGxheXMgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24sIGFtb3VudCBvZiBidWZmZWQgZGF0YSwgc2Vla1xuICogdGFyZ2V0LCBhbmQga2VlcHMgc3RhdHVzIGFib3V0IGFuIG9uZ29pbmcgc2Vlay5cbiAqXG4gKiBUaGUgc2VlayBiYXIgZGlzcGxheXMgZGlmZmVyZW50ICdiYXJzJzpcbiAqICAtIHRoZSBwbGF5YmFjayBwb3NpdGlvbiwgaS5lLiB0aGUgcG9zaXRpb24gaW4gdGhlIG1lZGlhIGF0IHdoaWNoIHRoZSBwbGF5ZXIgY3VycmVudCBwbGF5YmFjayBwb2ludGVyIGlzIHBvc2l0aW9uZWRcbiAqICAtIHRoZSBidWZmZXIgcG9zaXRpb24sIHdoaWNoIHVzdWFsbHkgaXMgdGhlIHBsYXliYWNrIHBvc2l0aW9uIHBsdXMgdGhlIHRpbWUgc3BhbiB0aGF0IGlzIGFscmVhZHkgYnVmZmVyZWQgYWhlYWRcbiAqICAtIHRoZSBzZWVrIHBvc2l0aW9uLCB1c2VkIHRvIHByZXZpZXcgdG8gd2hlcmUgaW4gdGhlIHRpbWVsaW5lIGEgc2VlayB3aWxsIGp1bXAgdG9cbiAqL1xuZXhwb3J0IGNsYXNzIFNlZWtCYXIgZXh0ZW5kcyBDb21wb25lbnQ8U2Vla0JhckNvbmZpZz4ge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU01PT1RIX1BMQVlCQUNLX1BPU0lUSU9OX1VQREFURV9ESVNBQkxFRCA9IC0xO1xuXG4gIC8qKlxuICAgKiBUaGUgQ1NTIGNsYXNzIHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBlbGVtZW50IHdoaWxlIHRoZSBzZWVrIGJhciBpcyBpbiAnc2Vla2luZycgc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTEFTU19TRUVLSU5HID0gJ3NlZWtpbmcnO1xuXG4gIHByaXZhdGUgc2Vla0JhcjogRE9NO1xuICBwcml2YXRlIHNlZWtCYXJQbGF5YmFja1Bvc2l0aW9uOiBET007XG4gIHByaXZhdGUgc2Vla0JhclBsYXliYWNrUG9zaXRpb25NYXJrZXI6IERPTTtcbiAgcHJpdmF0ZSBzZWVrQmFyQnVmZmVyUG9zaXRpb246IERPTTtcbiAgcHJpdmF0ZSBzZWVrQmFyU2Vla1Bvc2l0aW9uOiBET007XG4gIHByaXZhdGUgc2Vla0JhckJhY2tkcm9wOiBET007XG5cbiAgcHJpdmF0ZSBsYWJlbDogU2Vla0JhckxhYmVsO1xuXG4gIHByaXZhdGUgc2Vla0Jhck1hcmtlcnNDb250YWluZXI6IERPTTtcbiAgcHJpdmF0ZSB0aW1lbGluZU1hcmtlcnNIYW5kbGVyOiBUaW1lbGluZU1hcmtlcnNIYW5kbGVyO1xuXG4gIHByaXZhdGUgcGxheWVyOiBQbGF5ZXJBUEk7XG5cbiAgcHJvdGVjdGVkIHNlZWtCYXJUeXBlOiBTZWVrQmFyVHlwZTtcblxuICBwcm90ZWN0ZWQgaXNVaVNob3duOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBCdWZmZXIgb2YgdGhlIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uLiBUaGUgcG9zaXRpb24gbXVzdCBiZSBidWZmZXJlZCBpbiBjYXNlIHRoZSBlbGVtZW50XG4gICAqIG5lZWRzIHRvIGJlIHJlZnJlc2hlZCB3aXRoIHtAbGluayAjcmVmcmVzaFBsYXliYWNrUG9zaXRpb259LlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgcHJpdmF0ZSBwbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSA9IDA7XG5cbiAgcHJpdmF0ZSBzbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlcjogVGltZW91dDtcbiAgcHJpdmF0ZSBwYXVzZWRUaW1lc2hpZnRVcGRhdGVyOiBUaW1lb3V0O1xuXG4gIHByaXZhdGUgc2Vla0JhckV2ZW50cyA9IHtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgc2NydWJiaW5nIHNlZWsgb3BlcmF0aW9uIGlzIHN0YXJ0ZWQuXG4gICAgICovXG4gICAgb25TZWVrOiBuZXcgRXZlbnREaXNwYXRjaGVyPFNlZWtCYXIsIE5vQXJncz4oKSxcbiAgICAvKipcbiAgICAgKiBGaXJlZCBkdXJpbmcgYSBzY3J1YmJpbmcgc2VlayB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzZWVrIHByZXZpZXcgKGkuZS4gdGhlIHZpZGVvIGZyYW1lKSBzaG91bGQgYmUgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBvblNlZWtQcmV2aWV3OiBuZXcgRXZlbnREaXNwYXRjaGVyPFNlZWtCYXIsIFNlZWtQcmV2aWV3RXZlbnRBcmdzPigpLFxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBzY3J1YmJpbmcgc2VlayBoYXMgZmluaXNoZWQgb3Igd2hlbiBhIGRpcmVjdCBzZWVrIGlzIGlzc3VlZC5cbiAgICAgKi9cbiAgICBvblNlZWtlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxTZWVrQmFyLCBudW1iZXI+KCksXG4gIH07XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTZWVrQmFyQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgY29uc3Qga2V5U3RlcEluY3JlbWVudHMgPSB0aGlzLmNvbmZpZy5rZXlTdGVwSW5jcmVtZW50cyB8fCB7XG4gICAgICBsZWZ0UmlnaHQ6IDEsXG4gICAgICB1cERvd246IDUsXG4gICAgfTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktc2Vla2JhcicsXG4gICAgICB2ZXJ0aWNhbDogZmFsc2UsXG4gICAgICBzbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlSW50ZXJ2YWxNczogNTAsXG4gICAgICBrZXlTdGVwSW5jcmVtZW50cyxcbiAgICAgIGFyaWFMYWJlbDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3NlZWtCYXInKSxcbiAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgc25hcHBpbmdSYW5nZTogMSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG5cbiAgICB0aGlzLmxhYmVsID0gdGhpcy5jb25maWcubGFiZWw7XG4gIH1cblxuICBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcblxuICAgIGlmICh0aGlzLmhhc0xhYmVsKCkpIHtcbiAgICAgIHRoaXMuZ2V0TGFiZWwoKS5pbml0aWFsaXplKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldEFyaWFTbGlkZXJNaW5NYXgobWluOiBzdHJpbmcsIG1heDogc3RyaW5nKSB7XG4gICAgdGhpcy5nZXREb21FbGVtZW50KCkuYXR0cignYXJpYS12YWx1ZW1pbicsIG1pbik7XG4gICAgdGhpcy5nZXREb21FbGVtZW50KCkuYXR0cignYXJpYS12YWx1ZW1heCcsIG1heCk7XG4gIH1cblxuICBwcml2YXRlIHNldEFyaWFTbGlkZXJWYWx1ZXMoKSB7XG4gICAgaWYgKHRoaXMuc2Vla0JhclR5cGUgPT09IFNlZWtCYXJUeXBlLkxpdmUpIHtcbiAgICAgIGNvbnN0IHRpbWVzaGlmdFZhbHVlID0gTWF0aC5jZWlsKHRoaXMucGxheWVyLmdldFRpbWVTaGlmdCgpKS50b1N0cmluZygpO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYXR0cignYXJpYS12YWx1ZW5vdycsIHRpbWVzaGlmdFZhbHVlKTtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmF0dHIoJ2FyaWEtdmFsdWV0ZXh0JywgYCR7aTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKGkxOG4uZ2V0TG9jYWxpemVyKCdzZWVrQmFyLnRpbWVzaGlmdCcpKX0gJHtpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NlZWtCYXIudmFsdWUnKSl9OiAke3RpbWVzaGlmdFZhbHVlfWApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWVrQmFyVHlwZSA9PT0gU2Vla0JhclR5cGUuVm9kKSB7XG4gICAgICBjb25zdCBhcmlhVmFsdWVUZXh0ID0gYCR7U3RyaW5nVXRpbHMuc2Vjb25kc1RvVGV4dCh0aGlzLnBsYXllci5nZXRDdXJyZW50VGltZSgpKX0gJHtpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NlZWtCYXIuZHVyYXRpb25UZXh0JykpfSAke1N0cmluZ1V0aWxzLnNlY29uZHNUb1RleHQodGhpcy5wbGF5ZXIuZ2V0RHVyYXRpb24oKSl9YDtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBNYXRoLmZsb29yKHRoaXMucGxheWVyLmdldEN1cnJlbnRUaW1lKCkpLnRvU3RyaW5nKCkpO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYXR0cignYXJpYS12YWx1ZXRleHQnLCBhcmlhVmFsdWVUZXh0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFBsYXliYWNrUG9zaXRpb25QZXJjZW50YWdlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMucGxheWVyLmlzTGl2ZSgpKSB7XG4gICAgICByZXR1cm4gMTAwIC0gKDEwMCAvIHRoaXMucGxheWVyLmdldE1heFRpbWVTaGlmdCgpICogdGhpcy5wbGF5ZXIuZ2V0VGltZVNoaWZ0KCkpO1xuICAgIH1cblxuICAgIHJldHVybiAxMDAgLyB0aGlzLnBsYXllci5nZXREdXJhdGlvbigpICogdGhpcy5nZXRSZWxhdGl2ZUN1cnJlbnRUaW1lKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUJ1ZmZlckxldmVsKHBsYXliYWNrUG9zaXRpb25QZXJjZW50YWdlOiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGxldCBidWZmZXJMb2FkZWRQZXJjZW50YWdlTGV2ZWw6IG51bWJlcjtcbiAgICBpZiAodGhpcy5wbGF5ZXIuaXNMaXZlKCkpIHtcbiAgICAgIC8vIEFsd2F5cyBzaG93IGZ1bGwgYnVmZmVyIGZvciBsaXZlIHN0cmVhbXNcbiAgICAgIGJ1ZmZlckxvYWRlZFBlcmNlbnRhZ2VMZXZlbCA9IDEwMDtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyTG9hZGVkUGVyY2VudGFnZUxldmVsID0gcGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UgKyBnZXRNaW5CdWZmZXJMZXZlbCh0aGlzLnBsYXllcik7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRCdWZmZXJQb3NpdGlvbihidWZmZXJMb2FkZWRQZXJjZW50YWdlTGV2ZWwpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyLCBjb25maWd1cmVTZWVrOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgIC8vIEFwcGx5IHNjYWxpbmcgdHJhbnNmb3JtIHRvIHRoZSBiYWNrZHJvcCBiYXIgdG8gaGF2ZSBhbGwgYmFycyByZW5kZXJlZCBzaW1pbGFybHlcbiAgICAvLyAodGhlIGNhbGwgbXVzdCBiZSB1cCBoZXJlIHRvIGJlIGV4ZWN1dGVkIGZvciB0aGUgdm9sdW1lIHNsaWRlciBhcyB3ZWxsKVxuICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy5zZWVrQmFyQmFja2Ryb3AsIDEwMCk7XG5cbiAgICAvLyBBZGQgc2Vla2JhciBjb250cm9scyB0byB0aGUgc2Vla2JhclxuICAgIGNvbnN0IHNlZWtCYXJDb250cm9sbGVyID0gbmV3IFNlZWtCYXJDb250cm9sbGVyKHRoaXMuY29uZmlnLmtleVN0ZXBJbmNyZW1lbnRzLCBwbGF5ZXIsIHVpbWFuYWdlci5nZXRDb25maWcoKS52b2x1bWVDb250cm9sbGVyKTtcblxuICAgIHNlZWtCYXJDb250cm9sbGVyLnNldFNlZWtCYXJDb250cm9scyh0aGlzLmdldERvbUVsZW1lbnQoKSwgKCkgPT4gdGhpcy5zZWVrQmFyVHlwZSk7XG5cbiAgICAvLyBUaGUgY29uZmlndXJlU2VlayBmbGFnIGNhbiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8gZGlzYWJsZSBjb25maWd1cmF0aW9uIGFzIHNlZWsgYmFyLiBFLmcuIHRoZSB2b2x1bWVcbiAgICAvLyBzbGlkZXIgaXMgcmV1c2luZyB0aGlzIGNvbXBvbmVudCBidXQgYWRkcyBpdHMgb3duIGZ1bmN0aW9uYWxpdHksIGFuZCBkb2VzIG5vdCBuZWVkIHRoZSBzZWVrIGZ1bmN0aW9uYWxpdHkuXG4gICAgLy8gVGhpcyBpcyBhY3R1YWxseSBhIGhhY2ssIHRoZSBwcm9wZXIgc29sdXRpb24gd291bGQgYmUgZm9yIGJvdGggc2VlayBiYXIgYW5kIHZvbHVtZSBzbGlkZXJzIHRvIGV4dGVuZFxuICAgIC8vIGEgY29tbW9uIGJhc2Ugc2xpZGVyIGNvbXBvbmVudCBhbmQgaW1wbGVtZW50IHRoZWlyIGZ1bmN0aW9uYWxpdHkgdGhlcmUuXG4gICAgaWYgKCFjb25maWd1cmVTZWVrKSB7XG4gICAgICB0aGlzLnNlZWtCYXJUeXBlID0gU2Vla0JhclR5cGUuVm9sdW1lO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdWltYW5hZ2VyLm9uQ29udHJvbHNTaG93LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmlzVWlTaG93biA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB1aW1hbmFnZXIub25Db250cm9sc0hpZGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaXNVaVNob3duID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICBsZXQgaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgbGV0IHNjcnViYmluZyA9IGZhbHNlO1xuICAgIGxldCBpc1VzZXJTZWVraW5nID0gZmFsc2U7XG4gICAgbGV0IGlzUGxheWVyU2Vla2luZyA9IGZhbHNlO1xuXG4gICAgLy8gVXBkYXRlIHBsYXliYWNrIGFuZCBidWZmZXIgcG9zaXRpb25zXG4gICAgbGV0IHBsYXliYWNrUG9zaXRpb25IYW5kbGVyID0gKGV2ZW50OiBQbGF5ZXJFdmVudEJhc2UgPSBudWxsLCBmb3JjZVVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICBpZiAoaXNVc2VyU2Vla2luZykge1xuICAgICAgICAvLyBXZSBjYXVnaHQgYSBzZWVrIHByZXZpZXcgc2VlaywgZG8gbm90IHVwZGF0ZSB0aGUgc2Vla2JhclxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBwbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSA9IHRoaXMuZ2V0UGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UoKTtcblxuICAgICAgdGhpcy51cGRhdGVCdWZmZXJMZXZlbChwbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSk7XG5cbiAgICAgIC8vIFRoZSBzZWdtZW50IHJlcXVlc3QgZmluaXNoZWQgaXMgdXNlZCB0byBoZWxwIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBtb3ZlLCB3aGVuIHRoZSBzbW9vdGggcGxheWJhY2sgcG9zaXRpb24gaXMgbm90IGVuYWJsZWQuXG4gICAgICAvLyBBdCB0aGUgc2FtZSB0aW1lIHdoZW4gdGhlIHVzZXIgaXMgc2NydWJiaW5nLCB3ZSBhbHNvIG1vdmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWVrYmFyIHRvIGRpc3BsYXkgYSBwcmV2aWV3IGR1cmluZyBzY3J1YmJpbmcuXG4gICAgICAvLyBXaGVuIHRoZSB1c2VyIGlzIHNjcnViYmluZyB3ZSBkbyBub3QgcmVjb3JkIHRoaXMgYXMgYSB1c2VyIHNlZWsgb3BlcmF0aW9uLCBhcyB0aGUgdXNlciBoYXMgeWV0IHRvIGZpbmlzaCB0aGVpciBzZWVrLFxuICAgICAgLy8gYnV0IHdlIHNob3VsZCBub3QgbW92ZSB0aGUgcGxheWJhY2sgcG9zaXRpb24gdG8gbm90IGNyZWF0ZSBhIGp1bXBpbmcgYmVoYXZpb3VyLlxuICAgICAgaWYgKHNjcnViYmluZyAmJiBldmVudC50eXBlID09PSBwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TZWdtZW50UmVxdWVzdEZpbmlzaGVkICYmIHBsYXliYWNrUG9zaXRpb25QZXJjZW50YWdlICE9PSB0aGlzLnBsYXliYWNrUG9zaXRpb25QZXJjZW50YWdlKSB7XG4gICAgICAgIHBsYXliYWNrUG9zaXRpb25QZXJjZW50YWdlID0gdGhpcy5wbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBsYXllci5pc0xpdmUoKSkge1xuICAgICAgICBpZiAocGxheWVyLmdldE1heFRpbWVTaGlmdCgpID09PSAwKSB7XG4gICAgICAgICAgLy8gVGhpcyBjYXNlIG11c3QgYmUgZXhwbGljaXRseSBoYW5kbGVkIHRvIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm9cbiAgICAgICAgICB0aGlzLnNldFBsYXliYWNrUG9zaXRpb24oMTAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNTZWVraW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UGxheWJhY2tQb3NpdGlvbihwbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5zZXRBcmlhU2xpZGVyTWluTWF4KHBsYXllci5nZXRNYXhUaW1lU2hpZnQoKS50b1N0cmluZygpLCAnMCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVcGRhdGUgcGxheWJhY2sgcG9zaXRpb24gb25seSBpbiBwYXVzZWQgc3RhdGUgb3IgaW4gdGhlIGluaXRpYWwgc3RhcnR1cCBzdGF0ZSB3aGVyZSBwbGF5ZXIgaXMgbmVpdGhlclxuICAgICAgICAvLyBwYXVzZWQgbm9yIHBsYXlpbmcuIFBsYXliYWNrIHVwZGF0ZXMgYXJlIGhhbmRsZWQgaW4gdGhlIFRpbWVvdXQgYmVsb3cuXG4gICAgICAgIGNvbnN0IGlzSW5Jbml0aWFsU3RhcnR1cFN0YXRlID0gdGhpcy5jb25maWcuc21vb3RoUGxheWJhY2tQb3NpdGlvblVwZGF0ZUludGVydmFsTXMgPT09IFNlZWtCYXIuU01PT1RIX1BMQVlCQUNLX1BPU0lUSU9OX1VQREFURV9ESVNBQkxFRFxuICAgICAgICAgICAgfHwgZm9yY2VVcGRhdGUgfHwgcGxheWVyLmlzUGF1c2VkKCk7XG4gICAgICAgIGNvbnN0IGlzTmVpdGhlclBhdXNlZE5vclBsYXlpbmcgPSBwbGF5ZXIuaXNQYXVzZWQoKSA9PT0gcGxheWVyLmlzUGxheWluZygpO1xuXG4gICAgICAgIGlmICgoaXNJbkluaXRpYWxTdGFydHVwU3RhdGUgfHwgaXNOZWl0aGVyUGF1c2VkTm9yUGxheWluZykgJiYgIXRoaXMuaXNTZWVraW5nKCkpIHtcbiAgICAgICAgICB0aGlzLnNldFBsYXliYWNrUG9zaXRpb24ocGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRBcmlhU2xpZGVyTWluTWF4KCcwJywgcGxheWVyLmdldER1cmF0aW9uKCkudG9TdHJpbmcoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzVWlTaG93bikge1xuICAgICAgICB0aGlzLnNldEFyaWFTbGlkZXJWYWx1ZXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNlZWtiYXIgdXBvbiB0aGVzZSBldmVudHNcbiAgICAvLyBpbml0IHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gdGhlIHBsYXllciBpcyByZWFkeVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5SZWFkeSwgcGxheWJhY2tQb3NpdGlvbkhhbmRsZXIpO1xuICAgIC8vIHVwZGF0ZSBwbGF5YmFjayBwb3NpdGlvbiB3aGVuIGl0IGNoYW5nZXNcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVGltZUNoYW5nZWQsIHBsYXliYWNrUG9zaXRpb25IYW5kbGVyKTtcbiAgICAvLyB1cGRhdGUgYnVmZmVybGV2ZWwgd2hlbiBidWZmZXJpbmcgaXMgY29tcGxldGVcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3RhbGxFbmRlZCwgcGxheWJhY2tQb3NpdGlvbkhhbmRsZXIpO1xuICAgIC8vIHVwZGF0ZSBwbGF5YmFjayBwb3NpdGlvbiB3aGVuIGEgdGltZXNoaWZ0IGhhcyBmaW5pc2hlZFxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lU2hpZnRlZCwgcGxheWJhY2tQb3NpdGlvbkhhbmRsZXIpO1xuICAgIC8vIHVwZGF0ZSBidWZmZXJsZXZlbCB3aGVuIGEgc2VnbWVudCBoYXMgYmVlbiBkb3dubG9hZGVkXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNlZ21lbnRSZXF1ZXN0RmluaXNoZWQsIHBsYXliYWNrUG9zaXRpb25IYW5kbGVyKTtcblxuICAgIHRoaXMuY29uZmlndXJlTGl2ZVBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIocGxheWVyLCB1aW1hbmFnZXIsIHBsYXliYWNrUG9zaXRpb25IYW5kbGVyKTtcblxuICAgIC8vIFNlZWsgaGFuZGxpbmdcbiAgICBsZXQgb25QbGF5ZXJTZWVrID0gKCkgPT4ge1xuICAgICAgaXNQbGF5ZXJTZWVraW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0U2Vla2luZyh0cnVlKTtcbiAgICAgIHNjcnViYmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBsZXQgb25QbGF5ZXJTZWVrZWQgPSAoZXZlbnQ6IFBsYXllckV2ZW50QmFzZSA9IG51bGwsIGZvcmNlVXBkYXRlOiBib29sZWFuID0gZmFsc2UgKSA9PiB7XG4gICAgICBpc1BsYXllclNlZWtpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0U2Vla2luZyhmYWxzZSk7XG5cbiAgICAgIC8vIHVwZGF0ZSBwbGF5YmFjayBwb3NpdGlvbiB3aGVuIGEgc2VlayBoYXMgZmluaXNoZWRcbiAgICAgIHBsYXliYWNrUG9zaXRpb25IYW5kbGVyKGV2ZW50LCBmb3JjZVVwZGF0ZSk7XG4gICAgfTtcblxuICAgIGxldCByZXN0b3JlUGxheWluZ1N0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ29udGludWUgcGxheWJhY2sgYWZ0ZXIgc2VlayBpZiBwbGF5ZXIgd2FzIHBsYXlpbmcgd2hlbiBzZWVrIHN0YXJ0ZWRcbiAgICAgIGlmIChpc1BsYXlpbmcpIHtcbiAgICAgICAgLy8gdXNlIHRoZSBzYW1lIGlzc3VlciBoZXJlIGFzIGluIHRoZSBwYXVzZSBvbiBzZWVrXG4gICAgICAgIHBsYXllci5wbGF5KCd1aS1zZWVrJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TZWVrLCBvblBsYXllclNlZWspO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TZWVrZWQsIG9uUGxheWVyU2Vla2VkKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVGltZVNoaWZ0LCBvblBsYXllclNlZWspO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lU2hpZnRlZCwgb25QbGF5ZXJTZWVrZWQpO1xuXG4gICAgdGhpcy5vblNlZWsuc3Vic2NyaWJlKChzZW5kZXIpID0+IHtcbiAgICAgIGlzVXNlclNlZWtpbmcgPSB0cnVlOyAvLyB0cmFjayBzZWVraW5nIHN0YXR1cyBzbyB3ZSBjYW4gY2F0Y2ggZXZlbnRzIGZyb20gc2VlayBwcmV2aWV3IHNlZWtzXG5cbiAgICAgIC8vIE5vdGlmeSBVSSBtYW5hZ2VyIG9mIHN0YXJ0ZWQgc2Vla1xuICAgICAgdWltYW5hZ2VyLm9uU2Vlay5kaXNwYXRjaChzZW5kZXIpO1xuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGxheWJhY2sgc3RhdGUgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIHNlZWtcbiAgICAgIGlmICghaXNQbGF5ZXJTZWVraW5nKSB7XG4gICAgICAgIGlzUGxheWluZyA9IHBsYXllci5pc1BsYXlpbmcoKTtcblxuICAgICAgICAvLyBQYXVzZSBwbGF5YmFjayB3aGlsZSBzZWVraW5nXG4gICAgICAgIGlmIChpc1BsYXlpbmcpIHtcbiAgICAgICAgICAvLyB1c2UgYSBkaWZmZXJlbnQgaXNzdWVyIGhlcmUsIGFzIHBsYXkvcGF1c2Ugb24gc2VlayBpcyBub3QgXCJyZWFsbHlcIiB0cmlnZ2VyZCBieSB0aGUgdXNlclxuICAgICAgICAgIHBsYXllci5wYXVzZSgndWktc2VlaycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICB0aGlzLm9uU2Vla1ByZXZpZXcuc3Vic2NyaWJlKChzZW5kZXI6IFNlZWtCYXIsIGFyZ3M6IFNlZWtQcmV2aWV3RXZlbnRBcmdzKSA9PiB7XG4gICAgICAvLyBOb3RpZnkgVUkgbWFuYWdlciBvZiBzZWVrIHByZXZpZXdcbiAgICAgIHVpbWFuYWdlci5vblNlZWtQcmV2aWV3LmRpc3BhdGNoKHNlbmRlciwgYXJncyk7XG4gICAgICBzY3J1YmJpbmcgPSBhcmdzLnNjcnViYmluZztcbiAgICB9KTtcblxuICAgIC8vIFJhdGUtbGltaXRlZCBzY3J1YmJpbmcgc2Vla1xuICAgIHRoaXMub25TZWVrUHJldmlldy5zdWJzY3JpYmVSYXRlTGltaXRlZCh0aGlzLnNlZWtXaGlsZVNjcnViYmluZywgMjAwKTtcbiAgICB0aGlzLm9uU2Vla2VkLnN1YnNjcmliZSgoc2VuZGVyLCBwZXJjZW50YWdlKSA9PiB7XG4gICAgICBpc1VzZXJTZWVraW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvIHRoZSBzZWVrXG4gICAgICB0aGlzLnNlZWsocGVyY2VudGFnZSk7XG5cbiAgICAgIC8vIE5vdGlmeSBVSSBtYW5hZ2VyIG9mIGZpbmlzaGVkIHNlZWtcbiAgICAgIHVpbWFuYWdlci5vblNlZWtlZC5kaXNwYXRjaChzZW5kZXIpO1xuXG4gICAgICAvLyBDb250aW51ZSBwbGF5YmFjayBhZnRlciBzZWVrIGlmIHBsYXllciB3YXMgcGxheWluZyB3aGVuIHNlZWsgc3RhcnRlZFxuICAgICAgcmVzdG9yZVBsYXlpbmdTdGF0ZSgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaGFzTGFiZWwoKSkge1xuICAgICAgLy8gQ29uZmlndXJlIGEgc2Vla2JhciBsYWJlbCB0aGF0IGlzIGludGVybmFsIHRvIHRoZSBzZWVrYmFyKVxuICAgICAgdGhpcy5nZXRMYWJlbCgpLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgfVxuXG4gICAgLy8gSGlkZSBzZWVrYmFyIGZvciBsaXZlIHNvdXJjZXMgd2l0aG91dCB0aW1lc2hpZnRcbiAgICBsZXQgaXNMaXZlID0gZmFsc2U7XG4gICAgbGV0IGhhc1RpbWVTaGlmdCA9IGZhbHNlO1xuICAgIGxldCBzd2l0Y2hWaXNpYmlsaXR5ID0gKGlzTGl2ZTogYm9vbGVhbiwgaGFzVGltZVNoaWZ0OiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoaXNMaXZlICYmICFoYXNUaW1lU2hpZnQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH1cbiAgICAgIHBsYXliYWNrUG9zaXRpb25IYW5kbGVyKG51bGwsIHRydWUpO1xuICAgICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICAgIH07XG4gICAgbGV0IGxpdmVTdHJlYW1EZXRlY3RvciA9IG5ldyBQbGF5ZXJVdGlscy5MaXZlU3RyZWFtRGV0ZWN0b3IocGxheWVyLCB1aW1hbmFnZXIpO1xuICAgIGxpdmVTdHJlYW1EZXRlY3Rvci5vbkxpdmVDaGFuZ2VkLnN1YnNjcmliZSgoc2VuZGVyLCBhcmdzOiBMaXZlU3RyZWFtRGV0ZWN0b3JFdmVudEFyZ3MpID0+IHtcbiAgICAgIGlzTGl2ZSA9IGFyZ3MubGl2ZTtcbiAgICAgIGlmIChpc0xpdmUgJiYgdGhpcy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc21vb3RoUGxheWJhY2tQb3NpdGlvblVwZGF0ZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZWVrQmFyVHlwZSA9IFNlZWtCYXJUeXBlLkxpdmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlZWtCYXJUeXBlID0gU2Vla0JhclR5cGUuVm9kO1xuICAgICAgfVxuICAgICAgc3dpdGNoVmlzaWJpbGl0eShpc0xpdmUsIGhhc1RpbWVTaGlmdCk7XG4gICAgfSk7XG4gICAgbGV0IHRpbWVTaGlmdERldGVjdG9yID0gbmV3IFBsYXllclV0aWxzLlRpbWVTaGlmdEF2YWlsYWJpbGl0eURldGVjdG9yKHBsYXllcik7XG4gICAgdGltZVNoaWZ0RGV0ZWN0b3Iub25UaW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkLnN1YnNjcmliZSgoc2VuZGVyLCBhcmdzOiBUaW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkQXJncykgPT4ge1xuICAgICAgaGFzVGltZVNoaWZ0ID0gYXJncy50aW1lU2hpZnRBdmFpbGFibGU7XG4gICAgICBzd2l0Y2hWaXNpYmlsaXR5KGlzTGl2ZSwgaGFzVGltZVNoaWZ0KTtcbiAgICB9KTtcbiAgICAvLyBJbml0aWFsIGRldGVjdGlvblxuICAgIGxpdmVTdHJlYW1EZXRlY3Rvci5kZXRlY3QoKTtcbiAgICB0aW1lU2hpZnREZXRlY3Rvci5kZXRlY3QoKTtcblxuICAgIC8vIFJlZnJlc2ggdGhlIHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gdGhlIHBsYXllciByZXNpemVkIG9yIHRoZSBVSSBpcyBjb25maWd1cmVkLiBUaGUgcGxheWJhY2sgcG9zaXRpb24gbWFya2VyXG4gICAgLy8gaXMgcG9zaXRpb25lZCBhYnNvbHV0ZWx5IGFuZCBtdXN0IHRoZXJlZm9yZSBiZSB1cGRhdGVkIHdoZW4gdGhlIHNpemUgb2YgdGhlIHNlZWtiYXIgY2hhbmdlcy5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWVyUmVzaXplZCwgKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICAgIH0pO1xuICAgIC8vIEFkZGl0aW9uYWxseSwgd2hlbiB0aGlzIGNvZGUgaXMgY2FsbGVkLCB0aGUgc2Vla2JhciBpcyBub3QgcGFydCBvZiB0aGUgVUkgeWV0IGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgaGF2ZSBhIHNpemUsXG4gICAgLy8gcmVzdWx0aW5nIGluIGEgd3JvbmcgaW5pdGlhbCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyLiBSZWZyZXNoaW5nIGl0IG9uY2UgdGhlIFVJIGlzIGNvbmZpZ3VyZWQgc29sdmVkIHRoaXMgaXNzdWUuXG4gICAgdWltYW5hZ2VyLm9uQ29uZmlndXJlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICAgIH0pO1xuICAgIC8vIEl0IGNhbiBhbHNvIGhhcHBlbiB3aGVuIGEgbmV3IHNvdXJjZSBpcyBsb2FkZWRcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlTG9hZGVkLCAoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hQbGF5YmFja1Bvc2l0aW9uKCk7XG4gICAgfSk7XG4gICAgLy8gQWRkIG1hcmtlcnMgd2hlbiBhIHNvdXJjZSBpcyBsb2FkZWQgb3IgdXBkYXRlIHdoZW4gYSBtYXJrZXIgaXMgYWRkZWQgb3IgcmVtb3ZlZFxuICAgIHVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBwbGF5YmFja1Bvc2l0aW9uSGFuZGxlcigpO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0IHRoZSBzbmFwcGluZ1JhbmdlIGlmIHNldCBpbiB0aGUgdWltYW5hZ2VyIGNvbmZpZ1xuICAgIGlmICh0eXBlb2YgdWltYW5hZ2VyLmdldENvbmZpZygpLnNlZWtiYXJTbmFwcGluZ1JhbmdlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5jb25maWcuc25hcHBpbmdSYW5nZSA9IHVpbWFuYWdlci5nZXRDb25maWcoKS5zZWVrYmFyU25hcHBpbmdSYW5nZTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHNlZWtiYXJcbiAgICBwbGF5YmFja1Bvc2l0aW9uSGFuZGxlcigpOyAvLyBTZXQgdGhlIHBsYXliYWNrIHBvc2l0aW9uXG4gICAgdGhpcy5zZXRCdWZmZXJQb3NpdGlvbigwKTtcbiAgICB0aGlzLnNldFNlZWtQb3NpdGlvbigwKTtcbiAgICBpZiAodGhpcy5jb25maWcuc21vb3RoUGxheWJhY2tQb3NpdGlvblVwZGF0ZUludGVydmFsTXMgIT09IFNlZWtCYXIuU01PT1RIX1BMQVlCQUNLX1BPU0lUSU9OX1VQREFURV9ESVNBQkxFRCkge1xuICAgICAgdGhpcy5jb25maWd1cmVTbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlcihwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBtYXJrZXJzXG4gICAgdGhpcy5pbml0aWFsaXplVGltZWxpbmVNYXJrZXJzKHBsYXllciwgdWltYW5hZ2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRpbWVsaW5lTWFya2VycyhwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIGNvbnN0IHRpbWVsaW5lTWFya2VyQ29uZmlnID0ge1xuICAgICAgY3NzUHJlZml4OiB0aGlzLmNvbmZpZy5jc3NQcmVmaXgsXG4gICAgICBzbmFwcGluZ1JhbmdlOiB0aGlzLmNvbmZpZy5zbmFwcGluZ1JhbmdlLFxuICAgIH07XG4gICAgdGhpcy50aW1lbGluZU1hcmtlcnNIYW5kbGVyID0gbmV3IFRpbWVsaW5lTWFya2Vyc0hhbmRsZXIodGltZWxpbmVNYXJrZXJDb25maWcsICgpID0+IHRoaXMuc2Vla0Jhci53aWR0aCgpLCB0aGlzLnNlZWtCYXJNYXJrZXJzQ29udGFpbmVyKTtcbiAgICB0aGlzLnRpbWVsaW5lTWFya2Vyc0hhbmRsZXIuaW5pdGlhbGl6ZShwbGF5ZXIsIHVpbWFuYWdlcik7XG4gIH1cblxuICBwcml2YXRlIHNlZWtXaGlsZVNjcnViYmluZyA9IChzZW5kZXI6IFNlZWtCYXIsIGFyZ3M6IFNlZWtQcmV2aWV3RXZlbnRBcmdzKSA9PiB7XG4gICAgaWYgKGFyZ3Muc2NydWJiaW5nKSB7XG4gICAgICB0aGlzLnNlZWsoYXJncy5wb3NpdGlvbik7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2VlayA9IChwZXJjZW50YWdlOiBudW1iZXIpID0+IHtcbiAgICBpZiAodGhpcy5wbGF5ZXIuaXNMaXZlKCkpIHtcbiAgICAgIGNvbnN0IG1heFRpbWVTaGlmdCA9IHRoaXMucGxheWVyLmdldE1heFRpbWVTaGlmdCgpO1xuICAgICAgdGhpcy5wbGF5ZXIudGltZVNoaWZ0KG1heFRpbWVTaGlmdCAtIChtYXhUaW1lU2hpZnQgKiAocGVyY2VudGFnZSAvIDEwMCkpLCAndWknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2Vla2FibGVSYW5nZVN0YXJ0ID0gUGxheWVyVXRpbHMuZ2V0U2Vla2FibGVSYW5nZVN0YXJ0KHRoaXMucGxheWVyLCAwKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlU2Vla1RhcmdldCA9IHRoaXMucGxheWVyLmdldER1cmF0aW9uKCkgKiAocGVyY2VudGFnZSAvIDEwMCk7XG4gICAgICBjb25zdCBhYnNvbHV0ZVNlZWtUYXJnZXQgPSByZWxhdGl2ZVNlZWtUYXJnZXQgKyBzZWVrYWJsZVJhbmdlU3RhcnQ7XG4gICAgICB0aGlzLnBsYXllci5zZWVrKGFic29sdXRlU2Vla1RhcmdldCwgJ3VpJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgc2Vla2JhciB3aGlsZSBhIGxpdmUgc3RyZWFtIHdpdGggRFZSIHdpbmRvdyBpcyBwYXVzZWQuXG4gICAqIFRoZSBwbGF5YmFjayBwb3NpdGlvbiBzdGF5cyBzdGlsbCBhbmQgdGhlIHBvc2l0aW9uIGluZGljYXRvciB2aXN1YWxseSBtb3ZlcyB0b3dhcmRzIHRoZSBiYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25maWd1cmVMaXZlUGF1c2VkVGltZXNoaWZ0VXBkYXRlcihcbiAgICBwbGF5ZXI6IFBsYXllckFQSSxcbiAgICB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyLFxuICAgIHBsYXliYWNrUG9zaXRpb25IYW5kbGVyOiAoKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICAvLyBSZWd1bGFybHkgdXBkYXRlIHRoZSBwbGF5YmFjayBwb3NpdGlvbiB3aGlsZSB0aGUgdGltZW91dCBpcyBhY3RpdmVcbiAgICB0aGlzLnBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIgPSBuZXcgVGltZW91dCgxMDAwLCBwbGF5YmFja1Bvc2l0aW9uSGFuZGxlciwgdHJ1ZSk7XG5cbiAgICAvLyBTdGFydCB1cGRhdGVyIHdoZW4gYSBsaXZlIHN0cmVhbSB3aXRoIHRpbWVzaGlmdCB3aW5kb3cgaXMgcGF1c2VkXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBhdXNlZCwgKCkgPT4ge1xuICAgICAgaWYgKHBsYXllci5pc0xpdmUoKSAmJiBwbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCkgPCAwKSB7XG4gICAgICAgIHRoaXMucGF1c2VkVGltZXNoaWZ0VXBkYXRlci5zdGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3RvcCB1cGRhdGVyIHdoZW4gcGxheWJhY2sgY29udGludWVzIChubyBtYXR0ZXIgaWYgdGhlIHVwZGF0ZXIgd2FzIHN0YXJ0ZWQgYmVmb3JlKVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCAoKSA9PiB0aGlzLnBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIuY2xlYXIoKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZVNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgLypcbiAgICAgKiBQbGF5YmFjayBwb3NpdGlvbiB1cGRhdGVcbiAgICAgKlxuICAgICAqIFdlIGRvIG5vdCB1cGRhdGUgdGhlIHBvc2l0aW9uIGRpcmVjdGx5IGZyb20gdGhlIFRpbWVDaGFuZ2VkIGV2ZW50LCBiZWNhdXNlIGl0IGFycml2ZXMgdmVyeSBqaXR0ZXJ5IGFuZFxuICAgICAqIHJlc3VsdHMgaW4gYSBqaXR0ZXJ5IHBvc2l0aW9uIGluZGljYXRvciBzaW5jZSB0aGUgQ1NTIHRyYW5zaXRpb24gdGltZSBpcyBzdGF0aWNhbGx5IHNldC5cbiAgICAgKiBUbyB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlLCB3ZSBtYWludGFpbiBhIGxvY2FsIHBsYXliYWNrIHBvc2l0aW9uIHRoYXQgaXMgdXBkYXRlZCBpbiBhIHN0YWJsZSByZWd1bGFyIGludGVydmFsXG4gICAgICogYW5kIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBwbGF5ZXIuXG4gICAgICovXG4gICAgbGV0IGN1cnJlbnRUaW1lU2Vla0JhciA9IDA7XG4gICAgbGV0IGN1cnJlbnRUaW1lUGxheWVyID0gMDtcbiAgICBsZXQgdXBkYXRlSW50ZXJ2YWxNcyA9IDUwO1xuICAgIGxldCBjdXJyZW50VGltZVVwZGF0ZURlbHRhU2VjcyA9IHVwZGF0ZUludGVydmFsTXMgLyAxMDAwO1xuXG4gICAgdGhpcy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlciA9IG5ldyBUaW1lb3V0KHVwZGF0ZUludGVydmFsTXMsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU2Vla2luZygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFRpbWVTZWVrQmFyICs9IGN1cnJlbnRUaW1lVXBkYXRlRGVsdGFTZWNzO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjdXJyZW50VGltZVBsYXllciA9IHRoaXMuZ2V0UmVsYXRpdmVDdXJyZW50VGltZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoZSBwbGF5ZXIgaGFzIGJlZW4gZGVzdHJveWVkIGFuZCBzdG9wIHVwZGF0aW5nIGlmIHNvXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIHBsYXllci5leHBvcnRzLlBsYXllckFQSU5vdEF2YWlsYWJsZUVycm9yKSB7XG4gICAgICAgICAgdGhpcy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlci5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgdGltZSBjYW5ub3QgYmUgcmVhZCBpdCBtYWtlcyBubyBzZW5zZSB0byBjb250aW51ZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFN5bmMgY3VycmVudFRpbWUgb2Ygc2Vla2JhciB0byBwbGF5ZXJcbiAgICAgIGxldCBjdXJyZW50VGltZURlbHRhID0gY3VycmVudFRpbWVTZWVrQmFyIC0gY3VycmVudFRpbWVQbGF5ZXI7XG4gICAgICAvLyBJZiB0aGUgZGVsdGEgaXMgbGFyZ2VyIHRoYXQgMiBzZWNzLCBkaXJlY3RseSBqdW1wIHRoZSBzZWVrYmFyIHRvIHRoZVxuICAgICAgLy8gcGxheWVyIHRpbWUgaW5zdGVhZCBvZiBzbW9vdGhseSBmYXN0IGZvcndhcmRpbmcvcmV3aW5kaW5nLlxuICAgICAgaWYgKE1hdGguYWJzKGN1cnJlbnRUaW1lRGVsdGEpID4gMikge1xuICAgICAgICBjdXJyZW50VGltZVNlZWtCYXIgPSBjdXJyZW50VGltZVBsYXllcjtcbiAgICAgIH1cbiAgICAgIC8vIElmIGN1cnJlbnRUaW1lRGVsdGEgaXMgbmVnYXRpdmUgYW5kIGJlbG93IHRoZSBhZGp1c3RtZW50IHRocmVzaG9sZCxcbiAgICAgIC8vIHRoZSBwbGF5ZXIgaXMgYWhlYWQgb2YgdGhlIHNlZWtiYXIgYW5kIHdlICdmYXN0IGZvcndhcmQnIHRoZSBzZWVrYmFyXG4gICAgICBlbHNlIGlmIChjdXJyZW50VGltZURlbHRhIDw9IC1jdXJyZW50VGltZVVwZGF0ZURlbHRhU2Vjcykge1xuICAgICAgICBjdXJyZW50VGltZVNlZWtCYXIgKz0gY3VycmVudFRpbWVVcGRhdGVEZWx0YVNlY3M7XG4gICAgICB9XG4gICAgICAvLyBJZiBjdXJyZW50VGltZURlbHRhIGlzIHBvc2l0aXZlIGFuZCBhYm92ZSB0aGUgYWRqdXN0bWVudCB0aHJlc2hvbGQsXG4gICAgICAvLyB0aGUgcGxheWVyIGlzIGJlaGluZCB0aGUgc2Vla2JhciBhbmQgd2UgJ3Jld2luZCcgdGhlIHNlZWtiYXJcbiAgICAgIGVsc2UgaWYgKGN1cnJlbnRUaW1lRGVsdGEgPj0gY3VycmVudFRpbWVVcGRhdGVEZWx0YVNlY3MpIHtcbiAgICAgICAgY3VycmVudFRpbWVTZWVrQmFyIC09IGN1cnJlbnRUaW1lVXBkYXRlRGVsdGFTZWNzO1xuICAgICAgfVxuXG4gICAgICBsZXQgcGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UgPSAxMDAgLyBwbGF5ZXIuZ2V0RHVyYXRpb24oKSAqIGN1cnJlbnRUaW1lU2Vla0JhcjtcbiAgICAgIHRoaXMuc2V0UGxheWJhY2tQb3NpdGlvbihwbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSk7XG4gICAgfSwgdHJ1ZSk7XG5cbiAgICBsZXQgc3RhcnRTbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlciA9ICgpID0+IHtcbiAgICAgIGlmICghcGxheWVyLmlzTGl2ZSgpKSB7XG4gICAgICAgIGN1cnJlbnRUaW1lU2Vla0JhciA9IHRoaXMuZ2V0UmVsYXRpdmVDdXJyZW50VGltZSgpO1xuICAgICAgICB0aGlzLnNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyLnN0YXJ0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCBzdG9wU21vb3RoUGxheWJhY2tQb3NpdGlvblVwZGF0ZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyLmNsZWFyKCk7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCBzdGFydFNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWluZywgc3RhcnRTbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBhdXNlZCwgc3RvcFNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWJhY2tGaW5pc2hlZCwgc3RvcFNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU2Vla2VkLCAoKSA9PiB7XG4gICAgICBjdXJyZW50VGltZVNlZWtCYXIgPSB0aGlzLmdldFJlbGF0aXZlQ3VycmVudFRpbWUoKTtcbiAgICB9KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlVW5sb2FkZWQsIHN0b3BTbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlcik7XG5cbiAgICBpZiAocGxheWVyLmlzUGxheWluZygpKSB7XG4gICAgICBzdGFydFNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWxhdGl2ZUN1cnJlbnRUaW1lKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFBsYXllclV0aWxzLmdldEN1cnJlbnRUaW1lUmVsYXRpdmVUb1NlZWthYmxlUmFuZ2UodGhpcy5wbGF5ZXIpO1xuICB9XG5cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBzdXBlci5yZWxlYXNlKCk7XG5cbiAgICBpZiAodGhpcy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlcikgeyAvLyBvYmplY3QgbXVzdCBub3QgbmVjZXNzYXJpbHkgZXhpc3QsIGUuZy4gaW4gdm9sdW1lIHNsaWRlciBzdWJjbGFzc1xuICAgICAgdGhpcy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlci5jbGVhcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIpIHtcbiAgICAgIHRoaXMucGF1c2VkVGltZXNoaWZ0VXBkYXRlci5jbGVhcigpO1xuICAgIH1cblxuICAgIHRoaXMub25TZWVrUHJldmlldy51bnN1YnNjcmliZSh0aGlzLnNlZWtXaGlsZVNjcnViYmluZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLnZlcnRpY2FsKSB7XG4gICAgICB0aGlzLmNvbmZpZy5jc3NDbGFzc2VzLnB1c2goJ3ZlcnRpY2FsJyk7XG4gICAgfVxuXG4gICAgbGV0IHNlZWtCYXJDb250YWluZXIgPSBuZXcgRE9NKCdkaXYnLCB7XG4gICAgICAnaWQnOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICdjbGFzcyc6IHRoaXMuZ2V0Q3NzQ2xhc3NlcygpLFxuICAgICAgJ3JvbGUnOiAnc2xpZGVyJyxcbiAgICAgICdhcmlhLWxhYmVsJzogaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRoaXMuY29uZmlnLmFyaWFMYWJlbCksXG4gICAgICAndGFiaW5kZXgnOiB0aGlzLmNvbmZpZy50YWJJbmRleC50b1N0cmluZygpLFxuICAgIH0pO1xuXG4gICAgbGV0IHNlZWtCYXIgPSBuZXcgRE9NKCdkaXYnLCB7XG4gICAgICAnY2xhc3MnOiB0aGlzLnByZWZpeENzcygnc2Vla2JhcicpLFxuICAgIH0pO1xuICAgIHRoaXMuc2Vla0JhciA9IHNlZWtCYXI7XG5cbiAgICAvLyBJbmRpY2F0b3IgdGhhdCBzaG93cyB0aGUgYnVmZmVyIGZpbGwgbGV2ZWxcbiAgICBsZXQgc2Vla0JhckJ1ZmZlckxldmVsID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ3NlZWtiYXItYnVmZmVybGV2ZWwnKSxcbiAgICB9KTtcbiAgICB0aGlzLnNlZWtCYXJCdWZmZXJQb3NpdGlvbiA9IHNlZWtCYXJCdWZmZXJMZXZlbDtcblxuICAgIC8vIEluZGljYXRvciB0aGF0IHNob3dzIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uXG4gICAgbGV0IHNlZWtCYXJQbGF5YmFja1Bvc2l0aW9uID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ3NlZWtiYXItcGxheWJhY2twb3NpdGlvbicpLFxuICAgIH0pO1xuICAgIHRoaXMuc2Vla0JhclBsYXliYWNrUG9zaXRpb24gPSBzZWVrQmFyUGxheWJhY2tQb3NpdGlvbjtcblxuICAgIC8vIEEgbWFya2VyIG9mIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uLCBlLmcuIGEgZG90IG9yIGxpbmVcbiAgICBsZXQgc2Vla0JhclBsYXliYWNrUG9zaXRpb25NYXJrZXIgPSBuZXcgRE9NKCdkaXYnLCB7XG4gICAgICAnY2xhc3MnOiB0aGlzLnByZWZpeENzcygnc2Vla2Jhci1wbGF5YmFja3Bvc2l0aW9uLW1hcmtlcicpLFxuICAgIH0pO1xuICAgIHRoaXMuc2Vla0JhclBsYXliYWNrUG9zaXRpb25NYXJrZXIgPSBzZWVrQmFyUGxheWJhY2tQb3NpdGlvbk1hcmtlcjtcblxuICAgIC8vIEluZGljYXRvciB0aGF0IHNob3cgd2hlcmUgYSBzZWVrIHdpbGwgZ28gdG9cbiAgICBsZXQgc2Vla0JhclNlZWtQb3NpdGlvbiA9IG5ldyBET00oJ2RpdicsIHtcbiAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCdzZWVrYmFyLXNlZWtwb3NpdGlvbicpLFxuICAgIH0pO1xuICAgIHRoaXMuc2Vla0JhclNlZWtQb3NpdGlvbiA9IHNlZWtCYXJTZWVrUG9zaXRpb247XG5cbiAgICAvLyBJbmRpY2F0b3IgdGhhdCBzaG93cyB0aGUgZnVsbCBzZWVrYmFyXG4gICAgbGV0IHNlZWtCYXJCYWNrZHJvcCA9IG5ldyBET00oJ2RpdicsIHtcbiAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCdzZWVrYmFyLWJhY2tkcm9wJyksXG4gICAgfSk7XG4gICAgdGhpcy5zZWVrQmFyQmFja2Ryb3AgPSBzZWVrQmFyQmFja2Ryb3A7XG5cbiAgICBsZXQgc2Vla0JhckNoYXB0ZXJNYXJrZXJzQ29udGFpbmVyID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ3NlZWtiYXItbWFya2VycycpLFxuICAgIH0pO1xuICAgIHRoaXMuc2Vla0Jhck1hcmtlcnNDb250YWluZXIgPSBzZWVrQmFyQ2hhcHRlck1hcmtlcnNDb250YWluZXI7XG5cbiAgICBzZWVrQmFyLmFwcGVuZCh0aGlzLnNlZWtCYXJCYWNrZHJvcCwgdGhpcy5zZWVrQmFyQnVmZmVyUG9zaXRpb24sIHRoaXMuc2Vla0JhclNlZWtQb3NpdGlvbixcbiAgICAgIHRoaXMuc2Vla0JhclBsYXliYWNrUG9zaXRpb24sIHRoaXMuc2Vla0Jhck1hcmtlcnNDb250YWluZXIsIHRoaXMuc2Vla0JhclBsYXliYWNrUG9zaXRpb25NYXJrZXIpO1xuXG4gICAgbGV0IHNlZWtpbmcgPSBmYWxzZTtcblxuICAgIC8vIERlZmluZSBoYW5kbGVyIGZ1bmN0aW9ucyBzbyB3ZSBjYW4gYXR0YWNoL3JlbW92ZSB0aGVtIGxhdGVyXG4gICAgbGV0IG1vdXNlVG91Y2hNb3ZlSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpb24gdG8gVlIgaGFuZGxlclxuICAgICAgaWYgKHRoaXMucGxheWVyLnZyICE9IG51bGwpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHRhcmdldFBlcmNlbnRhZ2UgPSAxMDAgKiB0aGlzLmdldE9mZnNldChlKTtcbiAgICAgIHRoaXMuc2V0U2Vla1Bvc2l0aW9uKHRhcmdldFBlcmNlbnRhZ2UpO1xuICAgICAgdGhpcy5zZXRQbGF5YmFja1Bvc2l0aW9uKHRhcmdldFBlcmNlbnRhZ2UpO1xuICAgICAgdGhpcy5vblNlZWtQcmV2aWV3RXZlbnQodGFyZ2V0UGVyY2VudGFnZSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIGxldCBtb3VzZVRvdWNoVXBIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIC8vIFJlbW92ZSBoYW5kbGVycywgc2VlayBvcGVyYXRpb24gaXMgZmluaXNoZWRcbiAgICAgIG5ldyBET00oZG9jdW1lbnQpLm9mZigndG91Y2htb3ZlIG1vdXNlbW92ZScsIG1vdXNlVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICBuZXcgRE9NKGRvY3VtZW50KS5vZmYoJ3RvdWNoZW5kIG1vdXNldXAnLCBtb3VzZVRvdWNoVXBIYW5kbGVyKTtcblxuICAgICAgbGV0IHRhcmdldFBlcmNlbnRhZ2UgPSAxMDAgKiB0aGlzLmdldE9mZnNldChlKTtcbiAgICAgIGxldCBzbmFwcGVkQ2hhcHRlciA9IHRoaXMudGltZWxpbmVNYXJrZXJzSGFuZGxlciAmJiB0aGlzLnRpbWVsaW5lTWFya2Vyc0hhbmRsZXIuZ2V0TWFya2VyQXRQb3NpdGlvbih0YXJnZXRQZXJjZW50YWdlKTtcblxuICAgICAgdGhpcy5zZXRTZWVraW5nKGZhbHNlKTtcbiAgICAgIHNlZWtpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gRmlyZSBzZWVrZWQgZXZlbnRcbiAgICAgIHRoaXMub25TZWVrZWRFdmVudChzbmFwcGVkQ2hhcHRlciA/IHNuYXBwZWRDaGFwdGVyLnBvc2l0aW9uIDogdGFyZ2V0UGVyY2VudGFnZSk7XG4gICAgfTtcblxuICAgIC8vIEEgc2VlayBhbHdheXMgc3RhcnQgd2l0aCBhIHRvdWNoc3RhcnQgb3IgbW91c2Vkb3duIGRpcmVjdGx5IG9uIHRoZSBzZWVrYmFyLlxuICAgIC8vIFRvIHRyYWNrIGEgbW91c2Ugc2VlayBhbHNvIG91dHNpZGUgdGhlIHNlZWtiYXIgKGZvciB0b3VjaCBldmVudHMgdGhpcyB3b3JrcyBhdXRvbWF0aWNhbGx5KSxcbiAgICAvLyBzbyB0aGUgdXNlciBkb2VzIG5vdCBuZWVkIHRvIHRha2UgY2FyZSB0aGF0IHRoZSBtb3VzZSBhbHdheXMgc3RheXMgb24gdGhlIHNlZWtiYXIsIHdlIGF0dGFjaCB0aGUgbW91c2Vtb3ZlXG4gICAgLy8gYW5kIG1vdXNldXAgaGFuZGxlcnMgdG8gdGhlIHdob2xlIGRvY3VtZW50LiBBIHNlZWsgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgbGlmdHMgdGhlIG1vdXNlIGtleS5cbiAgICAvLyBBIHNlZWsgbW91c2UgZ2VzdHVyZSBpcyB0aHVzIGJhc2ljYWxseSBhIGNsaWNrIHdpdGggYSBsb25nIHRpbWUgZnJhbWUgYmV0d2VlbiBkb3duIGFuZCB1cCBldmVudHMuXG4gICAgc2Vla0Jhci5vbigndG91Y2hzdGFydCBtb3VzZWRvd24nLCAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGxldCBpc1RvdWNoRXZlbnQgPSBCcm93c2VyVXRpbHMuaXNUb3VjaFN1cHBvcnRlZCAmJiB0aGlzLmlzVG91Y2hFdmVudChlKTtcblxuICAgICAgLy8gUHJldmVudCBzZWxlY3Rpb24gb2YgRE9NIGVsZW1lbnRzIChhbHNvIHByZXZlbnRzIG1vdXNlZG93biBpZiBjdXJyZW50IGV2ZW50IGlzIHRvdWNoc3RhcnQpXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBBdm9pZCBwcm9wYWdhdGlvbiB0byBWUiBoYW5kbGVyXG4gICAgICBpZiAodGhpcy5wbGF5ZXIudnIgIT0gbnVsbCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFNlZWtpbmcodHJ1ZSk7IC8vIFNldCBzZWVraW5nIGNsYXNzIG9uIERPTSBlbGVtZW50XG4gICAgICBzZWVraW5nID0gdHJ1ZTsgLy8gU2V0IHNlZWsgdHJhY2tpbmcgZmxhZ1xuXG4gICAgICAvLyBGaXJlIHNlZWtlZCBldmVudFxuICAgICAgdGhpcy5vblNlZWtFdmVudCgpO1xuXG4gICAgICAvLyBBZGQgaGFuZGxlciB0byB0cmFjayB0aGUgc2VlayBvcGVyYXRpb24gb3ZlciB0aGUgd2hvbGUgZG9jdW1lbnRcbiAgICAgIG5ldyBET00oZG9jdW1lbnQpLm9uKGlzVG91Y2hFdmVudCA/ICd0b3VjaG1vdmUnIDogJ21vdXNlbW92ZScsIG1vdXNlVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICBuZXcgRE9NKGRvY3VtZW50KS5vbihpc1RvdWNoRXZlbnQgPyAndG91Y2hlbmQnIDogJ21vdXNldXAnLCBtb3VzZVRvdWNoVXBIYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIC8vIERpc3BsYXkgc2VlayB0YXJnZXQgaW5kaWNhdG9yIHdoZW4gbW91c2UgaG92ZXJzIG9yIGZpbmdlciBzbGlkZXMgb3ZlciBzZWVrYmFyXG4gICAgc2Vla0Jhci5vbigndG91Y2htb3ZlIG1vdXNlbW92ZScsIChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoc2Vla2luZykge1xuICAgICAgICBtb3VzZVRvdWNoTW92ZUhhbmRsZXIoZSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBwb3NpdGlvbiA9IDEwMCAqIHRoaXMuZ2V0T2Zmc2V0KGUpO1xuICAgICAgdGhpcy5zZXRTZWVrUG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgdGhpcy5vblNlZWtQcmV2aWV3RXZlbnQocG9zaXRpb24sIGZhbHNlKTtcblxuICAgICAgaWYgKHRoaXMuaGFzTGFiZWwoKSAmJiB0aGlzLmdldExhYmVsKCkuaXNIaWRkZW4oKSkge1xuICAgICAgICB0aGlzLmdldExhYmVsKCkuc2hvdygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGlkZSBzZWVrIHRhcmdldCBpbmRpY2F0b3Igd2hlbiBtb3VzZSBvciBmaW5nZXIgbGVhdmVzIHNlZWtiYXJcbiAgICBzZWVrQmFyLm9uKCd0b3VjaGVuZCBtb3VzZWxlYXZlJywgKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHRoaXMuc2V0U2Vla1Bvc2l0aW9uKDApO1xuXG4gICAgICBpZiAodGhpcy5oYXNMYWJlbCgpKSB7XG4gICAgICAgIHRoaXMuZ2V0TGFiZWwoKS5oaWRlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzZWVrQmFyQ29udGFpbmVyLmFwcGVuZChzZWVrQmFyKTtcblxuICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICBzZWVrQmFyQ29udGFpbmVyLmFwcGVuZCh0aGlzLmxhYmVsLmdldERvbUVsZW1lbnQoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZWtCYXJDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgYSBtb3VzZS90b3VjaCBldmVudCBwb2ludCBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHNlZWsgYmFyLlxuICAgKiBAcGFyYW0gZXZlbnRQYWdlWCB0aGUgcGFnZVggY29vcmRpbmF0ZSBvZiBhbiBldmVudCB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBmcm9tXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IGEgbnVtYmVyIGluIHRoZSByYW5nZSBvZiBbMCwgMV0sIHdoZXJlIDAgaXMgdGhlIGxlZnQgZWRnZSBhbmQgMSBpcyB0aGUgcmlnaHQgZWRnZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIb3Jpem9udGFsT2Zmc2V0KGV2ZW50UGFnZVg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGVsZW1lbnRPZmZzZXRQeCA9IHRoaXMuc2Vla0Jhci5vZmZzZXQoKS5sZWZ0O1xuICAgIGxldCB3aWR0aFB4ID0gdGhpcy5zZWVrQmFyLndpZHRoKCk7XG4gICAgbGV0IG9mZnNldFB4ID0gZXZlbnRQYWdlWCAtIGVsZW1lbnRPZmZzZXRQeDtcbiAgICBsZXQgb2Zmc2V0ID0gMSAvIHdpZHRoUHggKiBvZmZzZXRQeDtcblxuICAgIHJldHVybiB0aGlzLnNhbml0aXplT2Zmc2V0KG9mZnNldCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmVydGljYWwgb2Zmc2V0IG9mIGEgbW91c2UvdG91Y2ggZXZlbnQgcG9pbnQgZnJvbSB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIHNlZWsgYmFyLlxuICAgKiBAcGFyYW0gZXZlbnRQYWdlWSB0aGUgcGFnZVggY29vcmRpbmF0ZSBvZiBhbiBldmVudCB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBmcm9tXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IGEgbnVtYmVyIGluIHRoZSByYW5nZSBvZiBbMCwgMV0sIHdoZXJlIDAgaXMgdGhlIGJvdHRvbSBlZGdlIGFuZCAxIGlzIHRoZSB0b3AgZWRnZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWZXJ0aWNhbE9mZnNldChldmVudFBhZ2VZOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBlbGVtZW50T2Zmc2V0UHggPSB0aGlzLnNlZWtCYXIub2Zmc2V0KCkudG9wO1xuICAgIGxldCB3aWR0aFB4ID0gdGhpcy5zZWVrQmFyLmhlaWdodCgpO1xuICAgIGxldCBvZmZzZXRQeCA9IGV2ZW50UGFnZVkgLSBlbGVtZW50T2Zmc2V0UHg7XG4gICAgbGV0IG9mZnNldCA9IDEgLyB3aWR0aFB4ICogb2Zmc2V0UHg7XG5cbiAgICByZXR1cm4gMSAtIHRoaXMuc2FuaXRpemVPZmZzZXQob2Zmc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBtb3VzZSBvciB0b3VjaCBldmVudCBvZmZzZXQgZm9yIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKGhvcml6b250YWwgb3IgdmVydGljYWwpLlxuICAgKiBAcGFyYW0gZSB0aGUgZXZlbnQgdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZnJvbVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBhIG51bWJlciBpbiB0aGUgcmFuZ2Ugb2YgWzAsIDFdXG4gICAqIEBzZWUgI2dldEhvcml6b250YWxPZmZzZXRcbiAgICogQHNlZSAjZ2V0VmVydGljYWxPZmZzZXRcbiAgICovXG4gIHByaXZhdGUgZ2V0T2Zmc2V0KGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogbnVtYmVyIHtcbiAgICBpZiAoQnJvd3NlclV0aWxzLmlzVG91Y2hTdXBwb3J0ZWQgJiYgdGhpcy5pc1RvdWNoRXZlbnQoZSkpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy52ZXJ0aWNhbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRWZXJ0aWNhbE9mZnNldChlLnR5cGUgPT09ICd0b3VjaGVuZCcgPyBlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VZIDogZS50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhvcml6b250YWxPZmZzZXQoZS50eXBlID09PSAndG91Y2hlbmQnID8gZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCA6IGUudG91Y2hlc1swXS5wYWdlWCk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XG4gICAgICBpZiAodGhpcy5jb25maWcudmVydGljYWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmVydGljYWxPZmZzZXQoZS5wYWdlWSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRIb3Jpem9udGFsT2Zmc2V0KGUucGFnZVgpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignaW52YWxpZCBldmVudCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhbml0aXplcyB0aGUgbW91c2Ugb2Zmc2V0IHRvIHRoZSByYW5nZSBvZiBbMCwgMV0uXG4gICAqXG4gICAqIFdoZW4gdHJhY2tpbmcgdGhlIG1vdXNlIG91dHNpZGUgdGhlIHNlZWsgYmFyLCB0aGUgb2Zmc2V0IGNhbiBiZSBvdXRzaWRlIHRoZSBkZXNpcmVkIHJhbmdlIGFuZCB0aGlzIG1ldGhvZFxuICAgKiBsaW1pdHMgaXQgdG8gdGhlIGRlc2lyZWQgcmFuZ2UuIEUuZy4gYSBtb3VzZSBldmVudCBsZWZ0IG9mIHRoZSBsZWZ0IGVkZ2Ugb2YgYSBzZWVrIGJhciB5aWVsZHMgYW4gb2Zmc2V0IGJlbG93XG4gICAqIHplcm8sIGJ1dCB0byBkaXNwbGF5IHRoZSBzZWVrIHRhcmdldCBvbiB0aGUgc2VlayBiYXIsIHdlIG5lZWQgdG8gbGltaXQgaXQgdG8gemVyby5cbiAgICpcbiAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHRvIHNhbml0aXplXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBzYW5pdGl6ZWQgb2Zmc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBzYW5pdGl6ZU9mZnNldChvZmZzZXQ6IG51bWJlcikge1xuICAgIC8vIFNpbmNlIHdlIHRyYWNrIG1vdXNlIG1vdmVzIG92ZXIgdGhlIHdob2xlIGRvY3VtZW50LCB0aGUgdGFyZ2V0IGNhbiBiZSBvdXRzaWRlIHRoZSBzZWVrIHJhbmdlLFxuICAgIC8vIGFuZCB3ZSBuZWVkIHRvIGxpbWl0IGl0IHRvIHRoZSBbMCwgMV0gcmFuZ2UuXG4gICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPiAxKSB7XG4gICAgICBvZmZzZXQgPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIHBsYXliYWNrIHBvc2l0aW9uIGluZGljYXRvci5cbiAgICogQHBhcmFtIHBlcmNlbnQgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgYXMgcmV0dXJuZWQgYnkgdGhlIHBsYXllclxuICAgKi9cbiAgc2V0UGxheWJhY2tQb3NpdGlvbihwZXJjZW50OiBudW1iZXIpIHtcbiAgICB0aGlzLnBsYXliYWNrUG9zaXRpb25QZXJjZW50YWdlID0gcGVyY2VudDtcblxuICAgIC8vIFNldCBwb3NpdGlvbiBvZiB0aGUgYmFyXG4gICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLnNlZWtCYXJQbGF5YmFja1Bvc2l0aW9uLCBwZXJjZW50KTtcblxuICAgIC8vIFNldCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyXG4gICAgbGV0IHRvdGFsU2l6ZSA9ICh0aGlzLmNvbmZpZy52ZXJ0aWNhbCA/ICh0aGlzLnNlZWtCYXIuaGVpZ2h0KCkgLSB0aGlzLnNlZWtCYXJQbGF5YmFja1Bvc2l0aW9uTWFya2VyLmhlaWdodCgpKSA6IHRoaXMuc2Vla0Jhci53aWR0aCgpKTtcbiAgICBsZXQgcHggPSAodG90YWxTaXplKSAvIDEwMCAqIHBlcmNlbnQ7XG4gICAgaWYgKHRoaXMuY29uZmlnLnZlcnRpY2FsKSB7XG4gICAgICBweCA9IHRoaXMuc2Vla0Jhci5oZWlnaHQoKSAtIHB4IC0gdGhpcy5zZWVrQmFyUGxheWJhY2tQb3NpdGlvbk1hcmtlci5oZWlnaHQoKTtcbiAgICB9XG5cbiAgICBsZXQgc3R5bGUgPSB0aGlzLmNvbmZpZy52ZXJ0aWNhbCA/XG4gICAgICAvLyAtbXMtdHJhbnNmb3JtIHJlcXVpcmVkIGZvciBJRTlcbiAgICAgIC8vIC13ZWJraXQtdHJhbnNmb3JtIHJlcXVpcmVkIGZvciBBbmRyb2lkIDQuNCBXZWJWaWV3XG4gICAgICB7XG4gICAgICAgICd0cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgcHggKyAncHgpJyxcbiAgICAgICAgJy1tcy10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgcHggKyAncHgpJyxcbiAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVkoJyArIHB4ICsgJ3B4KScsXG4gICAgICB9IDpcbiAgICAgIHtcbiAgICAgICAgJ3RyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBweCArICdweCknLFxuICAgICAgICAnLW1zLXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBweCArICdweCknLFxuICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWCgnICsgcHggKyAncHgpJyxcbiAgICAgIH07XG4gICAgdGhpcy5zZWVrQmFyUGxheWJhY2tQb3NpdGlvbk1hcmtlci5jc3Moc3R5bGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgcGxheWJhY2sgcG9zaXRpb24uIENhbiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8gcmVmcmVzaCB0aGUgcG9zaXRpb24gd2hlblxuICAgKiB0aGUgc2l6ZSBvZiB0aGUgY29tcG9uZW50IGNoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVmcmVzaFBsYXliYWNrUG9zaXRpb24oKSB7XG4gICAgdGhpcy5zZXRQbGF5YmFja1Bvc2l0aW9uKHRoaXMucGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBvc2l0aW9uIHVudGlsIHdoaWNoIG1lZGlhIGlzIGJ1ZmZlcmVkLlxuICAgKiBAcGFyYW0gcGVyY2VudCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMFxuICAgKi9cbiAgc2V0QnVmZmVyUG9zaXRpb24ocGVyY2VudDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLnNlZWtCYXJCdWZmZXJQb3NpdGlvbiwgcGVyY2VudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcG9zaXRpb24gd2hlcmUgYSBzZWVrLCBpZiBleGVjdXRlZCwgd291bGQganVtcCB0by5cbiAgICogQHBhcmFtIHBlcmNlbnQgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDBcbiAgICovXG4gIHNldFNlZWtQb3NpdGlvbihwZXJjZW50OiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuc2Vla0JhclNlZWtQb3NpdGlvbiwgcGVyY2VudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBhY3R1YWwgcG9zaXRpb24gKHdpZHRoIG9yIGhlaWdodCkgb2YgYSBET00gZWxlbWVudCB0aGF0IHJlcHJlc2VudCBhIGJhciBpbiB0aGUgc2VlayBiYXIuXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIHNldCB0aGUgcG9zaXRpb24gZm9yXG4gICAqIEBwYXJhbSBwZXJjZW50IGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwXG4gICAqL1xuICBwcml2YXRlIHNldFBvc2l0aW9uKGVsZW1lbnQ6IERPTSwgcGVyY2VudDogbnVtYmVyKSB7XG4gICAgbGV0IHNjYWxlID0gcGVyY2VudCAvIDEwMDtcblxuICAgIC8vIFdoZW4gdGhlIHNjYWxlIGlzIGV4YWN0bHkgMSBvciB2ZXJ5IG5lYXIgMSAoYW5kIHRoZSBicm93c2VyIGludGVybmFsbHkgcm91bmRzIGl0IHRvIDEpLCBicm93c2VycyBzZWVtIHRvIHJlbmRlclxuICAgIC8vIHRoZSBlbGVtZW50cyBkaWZmZXJlbnRseSBhbmQgdGhlIGhlaWdodCBnZXRzIHNsaWdodGx5IG9mZiwgbGVhZGluZyB0byBtaXNtYXRjaGluZyBoZWlnaHRzIHdoZW4gZS5nLiB0aGUgYnVmZmVyXG4gICAgLy8gbGV2ZWwgYmFyIGhhcyBhIHdpZHRoIG9mIDEgYW5kIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBiYXIgaGFzIGEgd2lkdGggPCAxLiBBIGppdHRlcmluZyBidWZmZXIgbGV2ZWwgYXJvdW5kIDFcbiAgICAvLyBsZWFkcyB0byBhbiBldmVuIHdvcnNlIGZsaWNrZXJpbmcgZWZmZWN0LlxuICAgIC8vIFZhcmlvdXMgY2hhbmdlcyBpbiBDU1Mgc3R5bGluZyBhbmQgRE9NIGhpZXJhcmNoeSBkaWQgbm90IHNvbHZlIHRoZSBpc3N1ZSBzbyB0aGUgd29ya2Fyb3VuZCBpcyB0byBhdm9pZCBhIHNjYWxlXG4gICAgLy8gb2YgZXhhY3RseSAxLlxuICAgIGlmIChzY2FsZSA+PSAwLjk5OTk5ICYmIHNjYWxlIDw9IDEuMDAwMDEpIHtcbiAgICAgIHNjYWxlID0gMC45OTk5OTtcbiAgICB9XG5cbiAgICBsZXQgc3R5bGUgPSB0aGlzLmNvbmZpZy52ZXJ0aWNhbCA/XG4gICAgICAvLyAtbXMtdHJhbnNmb3JtIHJlcXVpcmVkIGZvciBJRTlcbiAgICAgIC8vIC13ZWJraXQtdHJhbnNmb3JtIHJlcXVpcmVkIGZvciBBbmRyb2lkIDQuNCBXZWJWaWV3XG4gICAgICB7XG4gICAgICAgICd0cmFuc2Zvcm0nOiAnc2NhbGVZKCcgKyBzY2FsZSArICcpJyxcbiAgICAgICAgJy1tcy10cmFuc2Zvcm0nOiAnc2NhbGVZKCcgKyBzY2FsZSArICcpJyxcbiAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3NjYWxlWSgnICsgc2NhbGUgKyAnKScsXG4gICAgICB9IDpcbiAgICAgIHtcbiAgICAgICAgJ3RyYW5zZm9ybSc6ICdzY2FsZVgoJyArIHNjYWxlICsgJyknLFxuICAgICAgICAnLW1zLXRyYW5zZm9ybSc6ICdzY2FsZVgoJyArIHNjYWxlICsgJyknLFxuICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAnc2NhbGVYKCcgKyBzY2FsZSArICcpJyxcbiAgICAgIH07XG4gICAgZWxlbWVudC5jc3Moc3R5bGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dHMgdGhlIHNlZWsgYmFyIGludG8gb3Igb3V0IG9mIHNlZWtpbmcgc3RhdGUgYnkgYWRkaW5nL3JlbW92aW5nIGEgY2xhc3MgdG8gdGhlIERPTSBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkXG4gICAqIHRvIGFkanVzdCB0aGUgc3R5bGluZyB3aGlsZSBzZWVraW5nLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vla2luZyBzaG91bGQgYmUgdHJ1ZSB3aGVuIGVudGVyaW5nIHNlZWsgc3RhdGUsIGZhbHNlIHdoZW4gZXhpdGluZyB0aGUgc2VlayBzdGF0ZVxuICAgKi9cbiAgc2V0U2Vla2luZyhzZWVraW5nOiBib29sZWFuKSB7XG4gICAgaWYgKHNlZWtpbmcpIHtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKFNlZWtCYXIuQ0xBU1NfU0VFS0lORykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhTZWVrQmFyLkNMQVNTX1NFRUtJTkcpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzZWVrIGJhciBpcyBjdXJyZW50bHkgaW4gdGhlIHNlZWsgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGluIHNlZWsgc3RhdGUsIGVsc2UgZmFsc2VcbiAgICovXG4gIGlzU2Vla2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXREb21FbGVtZW50KCkuaGFzQ2xhc3ModGhpcy5wcmVmaXhDc3MoU2Vla0Jhci5DTEFTU19TRUVLSU5HKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzZWVrIGJhciBoYXMgYSB7QGxpbmsgU2Vla0JhckxhYmVsfS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHNlZWsgYmFyIGhhcyBhIGxhYmVsLCBlbHNlIGZhbHNlXG4gICAqL1xuICBoYXNMYWJlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhYmVsIG9mIHRoaXMgc2VlayBiYXIuXG4gICAqIEByZXR1cm5zIHtTZWVrQmFyTGFiZWx9IHRoZSBsYWJlbCBpZiB0aGlzIHNlZWsgYmFyIGhhcyBhIGxhYmVsLCBlbHNlIG51bGxcbiAgICovXG4gIGdldExhYmVsKCk6IFNlZWtCYXJMYWJlbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxhYmVsO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU2Vla0V2ZW50KCkge1xuICAgIHRoaXMuc2Vla0JhckV2ZW50cy5vblNlZWsuZGlzcGF0Y2godGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZWVrUHJldmlld0V2ZW50KHBlcmNlbnRhZ2U6IG51bWJlciwgc2NydWJiaW5nOiBib29sZWFuKSB7XG4gICAgbGV0IHNuYXBwZWRNYXJrZXIgPSB0aGlzLnRpbWVsaW5lTWFya2Vyc0hhbmRsZXIgJiYgdGhpcy50aW1lbGluZU1hcmtlcnNIYW5kbGVyLmdldE1hcmtlckF0UG9zaXRpb24ocGVyY2VudGFnZSk7XG5cbiAgICBsZXQgc2Vla1Bvc2l0aW9uUGVyY2VudGFnZSA9IHBlcmNlbnRhZ2U7XG5cbiAgICBpZiAoc25hcHBlZE1hcmtlcikge1xuICAgICAgaWYgKHNuYXBwZWRNYXJrZXIuZHVyYXRpb24gPiAwKSB7XG4gICAgICAgIGlmIChwZXJjZW50YWdlIDwgc25hcHBlZE1hcmtlci5wb3NpdGlvbikge1xuICAgICAgICAgIC8vIFNuYXAgdGhlIHBvc2l0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGUgaW50ZXJ2YWwgaWYgdGhlIHNlZWsgaXMgd2l0aGluIHRoZSBsZWZ0IHNuYXAgbWFyZ2luXG4gICAgICAgICAgLy8gV2Uga25vdyB0aGF0IHdlIGFyZSB3aXRoaW4gYSBzbmFwIG1hcmdpbiB3aGVuIHdlIGFyZSBvdXRzaWRlIHRoZSBtYXJrZXIgaW50ZXJ2YWwgYnV0IHN0aWxsXG4gICAgICAgICAgLy8gaGF2ZSBhIHNuYXBwZWRNYXJrZXJcbiAgICAgICAgICBzZWVrUG9zaXRpb25QZXJjZW50YWdlID0gc25hcHBlZE1hcmtlci5wb3NpdGlvbjtcbiAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50YWdlID4gc25hcHBlZE1hcmtlci5wb3NpdGlvbiArIHNuYXBwZWRNYXJrZXIuZHVyYXRpb24pIHtcbiAgICAgICAgICAvLyBTbmFwIHRoZSBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBpbnRlcnZhbCBpZiB0aGUgc2VlayBpcyB3aXRoaW4gdGhlIHJpZ2h0IHNuYXAgbWFyZ2luXG4gICAgICAgICAgc2Vla1Bvc2l0aW9uUGVyY2VudGFnZSA9IHNuYXBwZWRNYXJrZXIucG9zaXRpb24gKyBzbmFwcGVkTWFya2VyLmR1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQb3NpdGlvbiBtYXJrZXJzIGFsd2F5cyBzbmFwIHRvIHRoZWlyIG1hcmtlciBwb3NpdGlvblxuICAgICAgICBzZWVrUG9zaXRpb25QZXJjZW50YWdlID0gc25hcHBlZE1hcmtlci5wb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYWJlbCkge1xuICAgICAgdGhpcy5sYWJlbC5nZXREb21FbGVtZW50KCkuY3NzKHtcbiAgICAgICAgJ2xlZnQnOiBzZWVrUG9zaXRpb25QZXJjZW50YWdlICsgJyUnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWVrQmFyRXZlbnRzLm9uU2Vla1ByZXZpZXcuZGlzcGF0Y2godGhpcywge1xuICAgICAgc2NydWJiaW5nOiBzY3J1YmJpbmcsXG4gICAgICBwb3NpdGlvbjogc2Vla1Bvc2l0aW9uUGVyY2VudGFnZSxcbiAgICAgIG1hcmtlcjogc25hcHBlZE1hcmtlcixcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlZWtlZEV2ZW50KHBlcmNlbnRhZ2U6IG51bWJlcikge1xuICAgIHRoaXMuc2Vla0JhckV2ZW50cy5vblNlZWtlZC5kaXNwYXRjaCh0aGlzLCBwZXJjZW50YWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gYSBzY3J1YmJpbmcgc2VlayBvcGVyYXRpb24gaXMgc3RhcnRlZC5cbiAgICogQHJldHVybnMge0V2ZW50PFNlZWtCYXIsIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25TZWVrKCk6IEV2ZW50PFNlZWtCYXIsIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLnNlZWtCYXJFdmVudHMub25TZWVrLmdldEV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCBkdXJpbmcgYSBzY3J1YmJpbmcgc2VlayAodG8gaW5kaWNhdGUgdGhhdCB0aGUgc2VlayBwcmV2aWV3LCBpLmUuIHRoZSB2aWRlbyBmcmFtZSxcbiAgICogc2hvdWxkIGJlIHVwZGF0ZWQpLCBvciBkdXJpbmcgYSBub3JtYWwgc2VlayBwcmV2aWV3IHdoZW4gdGhlIHNlZWsgYmFyIGlzIGhvdmVyZWQgKGFuZCB0aGUgc2VlayB0YXJnZXQsXG4gICAqIGkuZS4gdGhlIHNlZWsgYmFyIGxhYmVsLCBzaG91bGQgYmUgdXBkYXRlZCkuXG4gICAqIEByZXR1cm5zIHtFdmVudDxTZWVrQmFyLCBTZWVrUHJldmlld0V2ZW50QXJncz59XG4gICAqL1xuICBnZXQgb25TZWVrUHJldmlldygpOiBFdmVudDxTZWVrQmFyLCBTZWVrUHJldmlld0V2ZW50QXJncz4ge1xuICAgIHJldHVybiB0aGlzLnNlZWtCYXJFdmVudHMub25TZWVrUHJldmlldy5nZXRFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiBhIHNjcnViYmluZyBzZWVrIGhhcyBmaW5pc2hlZCBvciB3aGVuIGEgZGlyZWN0IHNlZWsgaXMgaXNzdWVkLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8U2Vla0JhciwgbnVtYmVyPn1cbiAgICovXG4gIGdldCBvblNlZWtlZCgpOiBFdmVudDxTZWVrQmFyLCBudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zZWVrQmFyRXZlbnRzLm9uU2Vla2VkLmdldEV2ZW50KCk7XG4gIH1cblxuXG4gIHByb3RlY3RlZCBvblNob3dFdmVudCgpOiB2b2lkIHtcbiAgICBzdXBlci5vblNob3dFdmVudCgpO1xuXG4gICAgLy8gUmVmcmVzaCB0aGUgcG9zaXRpb24gb2YgdGhlIHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gdGhlIHNlZWsgYmFyIGJlY29tZXMgdmlzaWJsZS4gVG8gY29ycmVjdGx5IHNldCB0aGUgcG9zaXRpb24sXG4gICAgLy8gdGhlIERPTSBlbGVtZW50IG11c3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQgYW4gaGF2ZSBpdHMgc2l6ZSBjYWxjdWxhdGVkLCBiZWNhdXNlIHRoZSBwb3NpdGlvbiBpcyBzZXQgYXMgYW4gYWJzb2x1dGVcbiAgICAvLyB2YWx1ZSBjYWxjdWxhdGVkIGZyb20gdGhlIHNpemUuIFRoaXMgcmVxdWlyZWQgc2l6ZSBpcyBub3Qga25vd24gd2hlbiBpdCBpcyBoaWRkZW4uXG4gICAgLy8gRm9yIHN1Y2ggY2FzZXMsIHdlIHJlZnJlc2ggdGhlIHBvc2l0aW9uIGhlcmUgaW4gb25TaG93IGJlY2F1c2UgaGVyZSBpdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIGNvbXBvbmVudCBrbm93c1xuICAgIC8vIGl0cyBzaXplIGFuZCBjYW4gc2V0IHRoZSBwb3NpdGlvbiBjb3JyZWN0bHkuXG4gICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICB9XG5cbiAvKipcbiAgICogQ2hlY2tzIGlmIFRvdWNoRXZlbnQgaXMgc3VwcG9ydGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBUb3VjaEV2ZW50IG5vdCB1bmRlZmluZWQsIGVsc2UgZmFsc2VcbiAgICovXG4gIGlzVG91Y2hFdmVudChlOiBVSUV2ZW50KTogZSBpcyBUb3VjaEV2ZW50IHtcbiAgICByZXR1cm4gd2luZG93LlRvdWNoRXZlbnQgJiYgZSBpbnN0YW5jZW9mIFRvdWNoRXZlbnQ7XG4gIH1cbn1cbiIsImltcG9ydCB7UGxheWVyQVBJfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWluQnVmZmVyTGV2ZWwocGxheWVyOiBQbGF5ZXJBUEkpOiBudW1iZXIge1xuXG4gICAgY29uc3QgcGxheWVyRHVyYXRpb24gPSBwbGF5ZXIuZ2V0RHVyYXRpb24oKTtcblxuICAgIGNvbnN0IHZpZGVvQnVmZmVyTGVuZ3RoID0gcGxheWVyLmdldFZpZGVvQnVmZmVyTGVuZ3RoKCk7XG4gICAgY29uc3QgYXVkaW9CdWZmZXJMZW5ndGggPSBwbGF5ZXIuZ2V0QXVkaW9CdWZmZXJMZW5ndGgoKTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIGJ1ZmZlciBsZW5ndGggd2hpY2ggaXMgdGhlIHNtYWxsZXIgbGVuZ3RoIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gYnVmZmVycy4gSWYgb25lIG9mIHRoZXNlXG4gICAgLy8gYnVmZmVycyBpcyBub3QgYXZhaWxhYmxlLCB3ZSBzZXQgaXQncyB2YWx1ZSB0byBNQVhfVkFMVUUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG90aGVyIHJlYWwgdmFsdWUgaXMgdGFrZW5cbiAgICAvLyBhcyB0aGUgYnVmZmVyIGxlbmd0aC5cbiAgICBsZXQgYnVmZmVyTGVuZ3RoID0gTWF0aC5taW4oXG4gICAgICAgIHZpZGVvQnVmZmVyTGVuZ3RoICE9IG51bGwgPyB2aWRlb0J1ZmZlckxlbmd0aCA6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIGF1ZGlvQnVmZmVyTGVuZ3RoICE9IG51bGwgPyBhdWRpb0J1ZmZlckxlbmd0aCA6IE51bWJlci5NQVhfVkFMVUUpO1xuICAgIC8vIElmIGJvdGggYnVmZmVyIGxlbmd0aHMgYXJlIG1pc3NpbmcsIHdlIHNldCB0aGUgYnVmZmVyIGxlbmd0aCB0byB6ZXJvXG4gICAgaWYgKGJ1ZmZlckxlbmd0aCA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICBidWZmZXJMZW5ndGggPSAwO1xuICAgIH1cblxuICAgIHJldHVybiAxMDAgLyBwbGF5ZXJEdXJhdGlvbiAqIGJ1ZmZlckxlbmd0aDtcbn1cbiIsImltcG9ydCB7IFVJVXRpbHMgfSBmcm9tICcuLi91aXV0aWxzJztcbmltcG9ydCB7IERPTSB9IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgVm9sdW1lQ29udHJvbGxlciB9IGZyb20gJy4uL3ZvbHVtZWNvbnRyb2xsZXInO1xuXG5leHBvcnQgZW51bSBTZWVrQmFyVHlwZSB7XG4gIFZvZCxcbiAgTGl2ZSxcbiAgVm9sdW1lLFxufVxuXG5pbnRlcmZhY2UgUmFuZ2Uge1xuICBtaW46IG51bWJlcjtcbiAgbWF4OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBLZXlTdGVwSW5jcmVtZW50c0NvbmZpZyB7XG4gIGxlZnRSaWdodDogbnVtYmVyO1xuICB1cERvd246IG51bWJlcjtcbn1cblxuY29uc3QgY29lcmNlVmFsdWVJbnRvUmFuZ2UgPSAoXG4gIHZhbHVlOiBudW1iZXIsXG4gIHJhbmdlOiBSYW5nZSxcbiAgY2I6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkLFxuKSA9PiB7XG4gIGlmICh2YWx1ZSA8IHJhbmdlLm1pbikge1xuICAgIGNiKHJhbmdlLm1pbik7XG4gIH0gZWxzZSBpZiAodmFsdWUgPiByYW5nZS5tYXgpIHtcbiAgICBjYihyYW5nZS5tYXgpO1xuICB9IGVsc2Uge1xuICAgIGNiKHZhbHVlKTtcbiAgfVxufTtcblxuZXhwb3J0IGNsYXNzIFNlZWtCYXJDb250cm9sbGVyIHtcbiAgcHJvdGVjdGVkIGtleVN0ZXBJbmNyZW1lbnRzOiBLZXlTdGVwSW5jcmVtZW50c0NvbmZpZztcbiAgcHJvdGVjdGVkIHBsYXllcjogUGxheWVyQVBJO1xuICBwcm90ZWN0ZWQgdm9sdW1lQ29udHJvbGxlcjogVm9sdW1lQ29udHJvbGxlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBrZXlTdGVwSW5jcmVtZW50czogS2V5U3RlcEluY3JlbWVudHNDb25maWcsXG4gICAgcGxheWVyOiBQbGF5ZXJBUEksXG4gICAgdm9sdW1lQ29udHJvbGxlcjogVm9sdW1lQ29udHJvbGxlcixcbiAgKSB7XG4gICAgdGhpcy5rZXlTdGVwSW5jcmVtZW50cyA9IGtleVN0ZXBJbmNyZW1lbnRzO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMudm9sdW1lQ29udHJvbGxlciA9IHZvbHVtZUNvbnRyb2xsZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXJyb3dLZXlDb250cm9scyhcbiAgICBjdXJyZW50VmFsdWU6IG51bWJlcixcbiAgICByYW5nZTogUmFuZ2UsXG4gICAgdmFsdWVVcGRhdGU6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkLFxuICApIHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSBNYXRoLmZsb29yKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogKCkgPT4gY29lcmNlVmFsdWVJbnRvUmFuZ2UoY29udHJvbFZhbHVlIC0gdGhpcy5rZXlTdGVwSW5jcmVtZW50cy5sZWZ0UmlnaHQsIHJhbmdlLCB2YWx1ZVVwZGF0ZSksXG4gICAgICByaWdodDogKCkgPT4gY29lcmNlVmFsdWVJbnRvUmFuZ2UoY29udHJvbFZhbHVlICsgdGhpcy5rZXlTdGVwSW5jcmVtZW50cy5sZWZ0UmlnaHQsIHJhbmdlLCB2YWx1ZVVwZGF0ZSksXG4gICAgICB1cDogKCkgPT4gY29lcmNlVmFsdWVJbnRvUmFuZ2UoY29udHJvbFZhbHVlICsgdGhpcy5rZXlTdGVwSW5jcmVtZW50cy51cERvd24sIHJhbmdlLCB2YWx1ZVVwZGF0ZSksXG4gICAgICBkb3duOiAoKSA9PiBjb2VyY2VWYWx1ZUludG9SYW5nZShjb250cm9sVmFsdWUgLSB0aGlzLmtleVN0ZXBJbmNyZW1lbnRzLnVwRG93biwgcmFuZ2UsIHZhbHVlVXBkYXRlKSxcbiAgICAgIGhvbWU6ICgpID0+IGNvZXJjZVZhbHVlSW50b1JhbmdlKHJhbmdlLm1pbiwgcmFuZ2UsIHZhbHVlVXBkYXRlKSxcbiAgICAgIGVuZDogKCkgPT4gY29lcmNlVmFsdWVJbnRvUmFuZ2UocmFuZ2UubWF4LCByYW5nZSwgdmFsdWVVcGRhdGUpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Vla0JhckNvbnRyb2xzKHR5cGU6IFNlZWtCYXJUeXBlKSB7XG4gICAgaWYgKHR5cGUgPT09IFNlZWtCYXJUeXBlLkxpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLmFycm93S2V5Q29udHJvbHModGhpcy5wbGF5ZXIuZ2V0VGltZVNoaWZ0KCksIHsgbWluOiB0aGlzLnBsYXllci5nZXRNYXhUaW1lU2hpZnQoKSwgbWF4OiAwIH0sIHRoaXMucGxheWVyLnRpbWVTaGlmdCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBTZWVrQmFyVHlwZS5Wb2QpIHtcbiAgICAgIHJldHVybiB0aGlzLmFycm93S2V5Q29udHJvbHModGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKSwgeyBtaW46IDAsIG1heDogdGhpcy5wbGF5ZXIuZ2V0RHVyYXRpb24oKSB9LCB0aGlzLnBsYXllci5zZWVrKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFNlZWtCYXJUeXBlLlZvbHVtZSAmJiB0aGlzLnZvbHVtZUNvbnRyb2xsZXIgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgdm9sdW1lVHJhbnNpdGlvbiA9IHRoaXMudm9sdW1lQ29udHJvbGxlci5zdGFydFRyYW5zaXRpb24oKTtcbiAgICAgIHJldHVybiB0aGlzLmFycm93S2V5Q29udHJvbHModGhpcy5wbGF5ZXIuZ2V0Vm9sdW1lKCksIHsgbWluOiAwLCBtYXg6IDEwMCB9LCB2b2x1bWVUcmFuc2l0aW9uLmZpbmlzaC5iaW5kKHZvbHVtZVRyYW5zaXRpb24pKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2Vla0JhckNvbnRyb2xzKGRvbUVsZW1lbnQ6IERPTSwgdHlwZTogKCkgPT4gU2Vla0JhclR5cGUpIHtcbiAgICBkb21FbGVtZW50Lm9uKCdrZXlkb3duJywgKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy5zZWVrQmFyQ29udHJvbHModHlwZSgpKTtcbiAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgVUlVdGlscy5LZXlDb2RlLkxlZnRBcnJvdzoge1xuICAgICAgICAgIGNvbnRyb2xzLmxlZnQoKTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBVSVV0aWxzLktleUNvZGUuUmlnaHRBcnJvdzoge1xuICAgICAgICAgIGNvbnRyb2xzLnJpZ2h0KCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVUlVdGlscy5LZXlDb2RlLlVwQXJyb3c6IHtcbiAgICAgICAgICBjb250cm9scy51cCgpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFVJVXRpbHMuS2V5Q29kZS5Eb3duQXJyb3c6IHtcbiAgICAgICAgICBjb250cm9scy5kb3duKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVUlVdGlscy5LZXlDb2RlLkhvbWU6IHtcbiAgICAgICAgICBjb250cm9scy5ob21lKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVUlVdGlscy5LZXlDb2RlLkVuZDoge1xuICAgICAgICAgIGNvbnRyb2xzLmVuZCgpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFVJVXRpbHMuS2V5Q29kZS5TcGFjZToge1xuICAgICAgICAgIHRoaXMucGxheWVyLmlzUGxheWluZygpID8gdGhpcy5wbGF5ZXIucGF1c2UoKSA6IHRoaXMucGxheWVyLnBsYXkoKTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSIsImltcG9ydCB7Q29udGFpbmVyLCBDb250YWluZXJDb25maWd9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7TGFiZWwsIExhYmVsQ29uZmlnfSBmcm9tICcuL2xhYmVsJztcbmltcG9ydCB7Q29tcG9uZW50LCBDb21wb25lbnRDb25maWd9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7IFVJSW5zdGFuY2VNYW5hZ2VyIH0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7U3RyaW5nVXRpbHN9IGZyb20gJy4uL3N0cmluZ3V0aWxzJztcbmltcG9ydCB7SW1hZ2VMb2FkZXJ9IGZyb20gJy4uL2ltYWdlbG9hZGVyJztcbmltcG9ydCB7Q3NzUHJvcGVydGllc30gZnJvbSAnLi4vZG9tJztcbmltcG9ydCB7IFBsYXllckFQSSwgVGh1bWJuYWlsIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IFNlZWtCYXIsIFNlZWtQcmV2aWV3RXZlbnRBcmdzIH0gZnJvbSAnLi9zZWVrYmFyJztcbmltcG9ydCB7IFBsYXllclV0aWxzIH0gZnJvbSAnLi4vcGxheWVydXRpbHMnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciBhIHtAbGluayBTZWVrQmFyTGFiZWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlZWtCYXJMYWJlbENvbmZpZyBleHRlbmRzIENvbnRhaW5lckNvbmZpZyB7XG4gIC8vIG5vdGhpbmcgeWV0XG59XG5cbi8qKlxuICogQSBsYWJlbCBmb3IgYSB7QGxpbmsgU2Vla0Jhcn0gdGhhdCBjYW4gZGlzcGxheSB0aGUgc2VlayB0YXJnZXQgdGltZSwgYSB0aHVtYm5haWwsIGFuZCB0aXRsZSAoZS5nLiBjaGFwdGVyIHRpdGxlKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlZWtCYXJMYWJlbCBleHRlbmRzIENvbnRhaW5lcjxTZWVrQmFyTGFiZWxDb25maWc+IHtcblxuICBwcml2YXRlIHRpbWVMYWJlbDogTGFiZWw8TGFiZWxDb25maWc+O1xuICBwcml2YXRlIHRpdGxlTGFiZWw6IExhYmVsPExhYmVsQ29uZmlnPjtcbiAgcHJpdmF0ZSB0aHVtYm5haWw6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+O1xuXG4gIHByaXZhdGUgdGh1bWJuYWlsSW1hZ2VMb2FkZXI6IEltYWdlTG9hZGVyO1xuXG4gIHByaXZhdGUgdGltZUZvcm1hdDogc3RyaW5nO1xuXG4gIHByaXZhdGUgYXBwbGllZE1hcmtlckNzc0NsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcGxheWVyOiBQbGF5ZXJBUEk7XG4gIHByaXZhdGUgdWlNYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNlZWtCYXJMYWJlbENvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMudGltZUxhYmVsID0gbmV3IExhYmVsKHsgY3NzQ2xhc3NlczogWydzZWVrYmFyLWxhYmVsLXRpbWUnXSB9KTtcbiAgICB0aGlzLnRpdGxlTGFiZWwgPSBuZXcgTGFiZWwoeyBjc3NDbGFzc2VzOiBbJ3NlZWtiYXItbGFiZWwtdGl0bGUnXSB9KTtcbiAgICB0aGlzLnRodW1ibmFpbCA9IG5ldyBDb21wb25lbnQoeyBjc3NDbGFzc2VzOiBbJ3NlZWtiYXItdGh1bWJuYWlsJ10sIHJvbGU6ICdpbWcnIH0pO1xuICAgIHRoaXMudGh1bWJuYWlsSW1hZ2VMb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktc2Vla2Jhci1sYWJlbCcsXG4gICAgICBjb21wb25lbnRzOiBbbmV3IENvbnRhaW5lcih7XG4gICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICBuZXcgQ29udGFpbmVyKHtcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IFt0aGlzLnRpdGxlTGFiZWwsIHRoaXMudGltZUxhYmVsXSxcbiAgICAgICAgICAgIGNzc0NsYXNzOiAnc2Vla2Jhci1sYWJlbC1tZXRhZGF0YScsXG4gICAgICAgICAgfSldLFxuICAgICAgICBjc3NDbGFzczogJ3NlZWtiYXItbGFiZWwtaW5uZXInLFxuICAgICAgfSldLFxuICAgICAgaGlkZGVuOiB0cnVlLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLnVpTWFuYWdlciA9IHVpbWFuYWdlcjtcbiAgICB1aW1hbmFnZXIub25TZWVrUHJldmlldy5zdWJzY3JpYmVSYXRlTGltaXRlZCh0aGlzLmhhbmRsZVNlZWtQcmV2aWV3LCAxMDApO1xuXG4gICAgbGV0IGluaXQgPSAoKSA9PiB7XG4gICAgICAvLyBTZXQgdGltZSBmb3JtYXQgZGVwZW5kaW5nIG9uIHNvdXJjZSBkdXJhdGlvblxuICAgICAgdGhpcy50aW1lRm9ybWF0ID0gTWF0aC5hYnMocGxheWVyLmlzTGl2ZSgpID8gcGxheWVyLmdldE1heFRpbWVTaGlmdCgpIDogcGxheWVyLmdldER1cmF0aW9uKCkpID49IDM2MDAgP1xuICAgICAgICBTdHJpbmdVdGlscy5GT1JNQVRfSEhNTVNTIDogU3RyaW5nVXRpbHMuRk9STUFUX01NU1M7XG4gICAgICAvLyBTZXQgaW5pdGlhbCBzdGF0ZSBvZiB0aXRsZSBhbmQgdGh1bWJuYWlsIHRvIGhhbmRsZSBzb3VyY2VMb2FkZWQgd2hlbiBzd2l0Y2hpbmcgdG8gYSBsaXZlLXN0cmVhbVxuICAgICAgdGhpcy5zZXRUaXRsZVRleHQobnVsbCk7XG4gICAgICB0aGlzLnNldFRodW1ibmFpbChudWxsKTtcbiAgICB9O1xuXG4gICAgdWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKGluaXQpO1xuICAgIGluaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU2Vla1ByZXZpZXcgPSAoc2VuZGVyOiBTZWVrQmFyLCBhcmdzOiBTZWVrUHJldmlld0V2ZW50QXJncykgPT4ge1xuICAgIGlmICh0aGlzLnBsYXllci5pc0xpdmUoKSkge1xuICAgICAgbGV0IG1heFRpbWVTaGlmdCA9IHRoaXMucGxheWVyLmdldE1heFRpbWVTaGlmdCgpO1xuICAgICAgbGV0IHRpbWVTaGlmdFByZXZpZXcgPSBtYXhUaW1lU2hpZnQgLSBtYXhUaW1lU2hpZnQgKiAoYXJncy5wb3NpdGlvbiAvIDEwMCk7XG5cbiAgICAgIHRoaXMuc2V0VGltZSh0aW1lU2hpZnRQcmV2aWV3KTtcblxuICAgICAgLy8gSW4gY2FzZSBvZiBhIGxpdmUgc3RyZWFtIHRoZSBwbGF5ZXIgZXhwZWN0cyB0aGUgdGltZSBwYXNzZWQgaW50byB0aGUgZ2V0VGh1bWJuYWlsIGFzIGEgd2FsbENsb2NrVGltZSBhbmQgbm90XG4gICAgICAvLyBhcyBhIHJlbGF0aXZlIHRpbWVTaGlmdCB2YWx1ZS5cbiAgICAgIGNvbnN0IGNvbnZlcnRUaW1lU2hpZnRQcmV2aWV3VG9XYWxsQ2xvY2tUaW1lID0gKHRhcmdldFRpbWVTaGlmdDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFRpbWVTaGlmdCA9IHRoaXMucGxheWVyLmdldFRpbWVTaGlmdCgpO1xuICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IHRoaXMucGxheWVyLmdldEN1cnJlbnRUaW1lKCk7XG5cbiAgICAgICAgY29uc3Qgd2FsbENsb2NrVGltZU9mTGl2ZUVkZ2UgPSBjdXJyZW50VGltZSAtIGN1cnJlbnRUaW1lU2hpZnQ7XG4gICAgICAgIHJldHVybiB3YWxsQ2xvY2tUaW1lT2ZMaXZlRWRnZSArIHRhcmdldFRpbWVTaGlmdDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHdhbGxDbG9ja1RpbWUgPSBjb252ZXJ0VGltZVNoaWZ0UHJldmlld1RvV2FsbENsb2NrVGltZSh0aW1lU2hpZnRQcmV2aWV3KTtcbiAgICAgIHRoaXMuc2V0VGh1bWJuYWlsKHRoaXMucGxheWVyLmdldFRodW1ibmFpbCh3YWxsQ2xvY2tUaW1lKSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRpbWUgPSB0aGlzLnBsYXllci5nZXREdXJhdGlvbigpICogKGFyZ3MucG9zaXRpb24gLyAxMDApO1xuICAgICAgdGhpcy5zZXRUaW1lKHRpbWUpO1xuXG4gICAgICBjb25zdCBzZWVrYWJsZVJhbmdlU3RhcnQgPSBQbGF5ZXJVdGlscy5nZXRTZWVrYWJsZVJhbmdlU3RhcnQodGhpcy5wbGF5ZXIsIDApO1xuICAgICAgY29uc3QgYWJzb2x1dGVTZWVrVGFyZ2V0ID0gdGltZSArIHNlZWthYmxlUmFuZ2VTdGFydDtcbiAgICAgIHRoaXMuc2V0VGh1bWJuYWlsKHRoaXMucGxheWVyLmdldFRodW1ibmFpbChhYnNvbHV0ZVNlZWtUYXJnZXQpKTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5tYXJrZXIpIHtcbiAgICAgIHRoaXMuc2V0VGl0bGVUZXh0KGFyZ3MubWFya2VyLm1hcmtlci50aXRsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0VGl0bGVUZXh0KG51bGwpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBDU1MgY2xhc3NlcyBmcm9tIHByZXZpb3VzIG1hcmtlclxuICAgIGlmICh0aGlzLmFwcGxpZWRNYXJrZXJDc3NDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKHRoaXMuYXBwbGllZE1hcmtlckNzc0NsYXNzZXMuam9pbignICcpKTtcbiAgICAgIHRoaXMuYXBwbGllZE1hcmtlckNzc0NsYXNzZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBBZGQgQ1NTIGNsYXNzZXMgb2YgY3VycmVudCBtYXJrZXJcbiAgICBpZiAoYXJncy5tYXJrZXIpIHtcbiAgICAgIGNvbnN0IGNzc0NsYXNzZXMgPSAoYXJncy5tYXJrZXIubWFya2VyLmNzc0NsYXNzZXMgfHwgW10pLm1hcChjc3NDbGFzcyA9PiB0aGlzLnByZWZpeENzcyhjc3NDbGFzcykpO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYWRkQ2xhc3MoY3NzQ2xhc3Nlcy5qb2luKCcgJykpO1xuICAgICAgdGhpcy5hcHBsaWVkTWFya2VyQ3NzQ2xhc3NlcyA9IGNzc0NsYXNzZXM7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTZXRzIGFyYml0cmFyeSB0ZXh0IG9uIHRoZSBsYWJlbC5cbiAgICogQHBhcmFtIHRleHQgdGhlIHRleHQgdG8gc2hvdyBvbiB0aGUgbGFiZWxcbiAgICovXG4gIHNldFRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy50aW1lTGFiZWwuc2V0VGV4dCh0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgdGltZSB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIGxhYmVsLlxuICAgKiBAcGFyYW0gc2Vjb25kcyB0aGUgdGltZSBpbiBzZWNvbmRzIHRvIGRpc3BsYXkgb24gdGhlIGxhYmVsXG4gICAqL1xuICBzZXRUaW1lKHNlY29uZHM6IG51bWJlcikge1xuICAgIHRoaXMuc2V0VGV4dChTdHJpbmdVdGlscy5zZWNvbmRzVG9UaW1lKHNlY29uZHMsIHRoaXMudGltZUZvcm1hdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRleHQgb24gdGhlIHRpdGxlIGxhYmVsLlxuICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byBzaG93IG9uIHRoZSBsYWJlbFxuICAgKi9cbiAgc2V0VGl0bGVUZXh0KHRleHQgPSAnJykge1xuICAgIHRoaXMudGl0bGVMYWJlbC5zZXRUZXh0KHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgb3IgcmVtb3ZlcyBhIHRodW1ibmFpbCBvbiB0aGUgbGFiZWwuXG4gICAqIEBwYXJhbSB0aHVtYm5haWwgdGhlIHRodW1ibmFpbCB0byBkaXNwbGF5IG9uIHRoZSBsYWJlbCBvciBudWxsIHRvIHJlbW92ZSBhIGRpc3BsYXllZCB0aHVtYm5haWxcbiAgICovXG4gIHNldFRodW1ibmFpbCh0aHVtYm5haWw6IFRodW1ibmFpbCA9IG51bGwpIHtcbiAgICBsZXQgdGh1bWJuYWlsRWxlbWVudCA9IHRoaXMudGh1bWJuYWlsLmdldERvbUVsZW1lbnQoKTtcblxuICAgIGlmICh0aHVtYm5haWwgPT0gbnVsbCkge1xuICAgICAgdGh1bWJuYWlsRWxlbWVudC5jc3Moe1xuICAgICAgICAnYmFja2dyb3VuZC1pbWFnZSc6IG51bGwsXG4gICAgICAgICdkaXNwbGF5JzogbnVsbCxcbiAgICAgICAgJ3dpZHRoJzogbnVsbCxcbiAgICAgICAgJ2hlaWdodCc6IG51bGwsXG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyBXZSB1c2UgdGhlIHRodW1ibmFpbCBpbWFnZSBsb2FkZXIgdG8gbWFrZSBzdXJlIHRoZSB0aHVtYm5haWwgaXMgbG9hZGVkIGFuZCBpdCdzIHNpemUgaXMga25vd24gYmVmb3JlIGJlIGNhblxuICAgICAgLy8gY2FsY3VsYXRlIHRoZSBDU1MgcHJvcGVydGllcyBhbmQgc2V0IHRoZW0gb24gdGhlIGVsZW1lbnQuXG4gICAgICB0aGlzLnRodW1ibmFpbEltYWdlTG9hZGVyLmxvYWQodGh1bWJuYWlsLnVybCwgKHVybCwgd2lkdGgsIGhlaWdodCkgPT4ge1xuICAgICAgICAvLyBjYW4gYmUgY2hlY2tlZCBsaWtlIHRoYXQgYmVjYXVzZSB4L3kvdy9oIGFyZSBlaXRoZXIgYWxsIHByZXNlbnQgb3Igbm9uZVxuICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvbWVkaWEtZnJhZ3MvI25hbWluZy1zcGFjZVxuICAgICAgICBpZiAodGh1bWJuYWlsLnggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRodW1ibmFpbEVsZW1lbnQuY3NzKHRoaXMudGh1bWJuYWlsQ3NzU3ByaXRlKHRodW1ibmFpbCwgd2lkdGgsIGhlaWdodCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRodW1ibmFpbEVsZW1lbnQuY3NzKHRoaXMudGh1bWJuYWlsQ3NzU2luZ2xlSW1hZ2UodGh1bWJuYWlsLCB3aWR0aCwgaGVpZ2h0KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGh1bWJuYWlsQ3NzU3ByaXRlKHRodW1ibmFpbDogVGh1bWJuYWlsLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IENzc1Byb3BlcnRpZXMge1xuICAgIGxldCB0aHVtYm5haWxDb3VudFggPSB3aWR0aCAvIHRodW1ibmFpbC53aWR0aDtcbiAgICBsZXQgdGh1bWJuYWlsQ291bnRZID0gaGVpZ2h0IC8gdGh1bWJuYWlsLmhlaWdodDtcblxuICAgIGxldCB0aHVtYm5haWxJbmRleFggPSB0aHVtYm5haWwueCAvIHRodW1ibmFpbC53aWR0aDtcbiAgICBsZXQgdGh1bWJuYWlsSW5kZXhZID0gdGh1bWJuYWlsLnkgLyB0aHVtYm5haWwuaGVpZ2h0O1xuXG4gICAgbGV0IHNpemVYID0gMTAwICogdGh1bWJuYWlsQ291bnRYO1xuICAgIGxldCBzaXplWSA9IDEwMCAqIHRodW1ibmFpbENvdW50WTtcblxuICAgIGxldCBvZmZzZXRYID0gMTAwICogdGh1bWJuYWlsSW5kZXhYO1xuICAgIGxldCBvZmZzZXRZID0gMTAwICogdGh1bWJuYWlsSW5kZXhZO1xuXG4gICAgbGV0IGFzcGVjdFJhdGlvID0gMSAvIHRodW1ibmFpbC53aWR0aCAqIHRodW1ibmFpbC5oZWlnaHQ7XG5cbiAgICAvLyBUaGUgdGh1bWJuYWlsIHNpemUgaXMgc2V0IGJ5IHNldHRpbmcgdGhlIENTUyAnd2lkdGgnIGFuZCAncGFkZGluZy1ib3R0b20nIHByb3BlcnRpZXMuICdwYWRkaW5nLWJvdHRvbScgaXNcbiAgICAvLyB1c2VkIGJlY2F1c2UgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIHdpZHRoIGFuZCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgdGh1bWJuYWlsLlxuICAgIC8vIEEgZGVmYXVsdCB2YWx1ZSBmb3Igd2lkdGggaXMgc2V0IGluIHRoZSBzdHlsZXNoZWV0IGFuZCBjYW4gYmUgb3ZlcndyaXR0ZW4gZnJvbSB0aGVyZSBvciBhbnl3aGVyZSBlbHNlLlxuICAgIHJldHVybiB7XG4gICAgICAnZGlzcGxheSc6ICdpbmhlcml0JyxcbiAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogYHVybCgke3RodW1ibmFpbC51cmx9KWAsXG4gICAgICAncGFkZGluZy1ib3R0b20nOiBgJHsxMDAgKiBhc3BlY3RSYXRpb30lYCxcbiAgICAgICdiYWNrZ3JvdW5kLXNpemUnOiBgJHtzaXplWH0lICR7c2l6ZVl9JWAsXG4gICAgICAnYmFja2dyb3VuZC1wb3NpdGlvbic6IGAtJHtvZmZzZXRYfSUgLSR7b2Zmc2V0WX0lYCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB0aHVtYm5haWxDc3NTaW5nbGVJbWFnZSh0aHVtYm5haWw6IFRodW1ibmFpbCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBDc3NQcm9wZXJ0aWVzIHtcbiAgICBsZXQgYXNwZWN0UmF0aW8gPSAxIC8gd2lkdGggKiBoZWlnaHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ2Rpc3BsYXknOiAnaW5oZXJpdCcsXG4gICAgICAnYmFja2dyb3VuZC1pbWFnZSc6IGB1cmwoJHt0aHVtYm5haWwudXJsfSlgLFxuICAgICAgJ3BhZGRpbmctYm90dG9tJzogYCR7MTAwICogYXNwZWN0UmF0aW99JWAsXG4gICAgICAnYmFja2dyb3VuZC1zaXplJzogYDEwMCUgMTAwJWAsXG4gICAgICAnYmFja2dyb3VuZC1wb3NpdGlvbic6IGAwIDBgLFxuICAgIH07XG4gIH1cblxuICByZWxlYXNlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlbGVhc2UoKTtcblxuICAgIHRoaXMudWlNYW5hZ2VyLm9uU2Vla1ByZXZpZXcudW5zdWJzY3JpYmUodGhpcy5oYW5kbGVTZWVrUHJldmlldyk7XG4gIH1cbn1cbiIsImltcG9ydCB7TGlzdFNlbGVjdG9yLCBMaXN0U2VsZWN0b3JDb25maWd9IGZyb20gJy4vbGlzdHNlbGVjdG9yJztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHsgaTE4biwgTG9jYWxpemFibGVUZXh0IH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgc2ltcGxlIHNlbGVjdCBib3ggcHJvdmlkaW5nIHRoZSBwb3NzaWJpbGl0eSB0byBzZWxlY3QgYSBzaW5nbGUgaXRlbSBvdXQgb2YgYSBsaXN0IG9mIGF2YWlsYWJsZSBpdGVtcy5cbiAqXG4gKiBET00gZXhhbXBsZTpcbiAqIDxjb2RlPlxuICogICAgIDxzZWxlY3QgY2xhc3M9J3VpLXNlbGVjdGJveCc+XG4gKiAgICAgICAgIDxvcHRpb24gdmFsdWU9J2tleSc+bGFiZWw8L29wdGlvbj5cbiAqICAgICAgICAgLi4uXG4gKiAgICAgPC9zZWxlY3Q+XG4gKiA8L2NvZGU+XG4gKi9cblxuZXhwb3J0IGNsYXNzIFNlbGVjdEJveCBleHRlbmRzIExpc3RTZWxlY3RvcjxMaXN0U2VsZWN0b3JDb25maWc+IHtcblxuICBwcml2YXRlIHNlbGVjdEVsZW1lbnQ6IERPTTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExpc3RTZWxlY3RvckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktc2VsZWN0Ym94JyxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgbGV0IHNlbGVjdEVsZW1lbnQgPSBuZXcgRE9NKCdzZWxlY3QnLCB7XG4gICAgICAnaWQnOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICdjbGFzcyc6IHRoaXMuZ2V0Q3NzQ2xhc3NlcygpLFxuICAgICAgJ2FyaWEtbGFiZWwnOiBpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24odGhpcy5jb25maWcuYXJpYUxhYmVsKSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0RWxlbWVudCA9IHNlbGVjdEVsZW1lbnQ7XG4gICAgdGhpcy51cGRhdGVEb21JdGVtcygpO1xuXG4gICAgc2VsZWN0RWxlbWVudC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gc2VsZWN0RWxlbWVudC52YWwoKTtcbiAgICAgIHRoaXMub25JdGVtU2VsZWN0ZWRFdmVudCh2YWx1ZSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlbGVjdEVsZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlRG9tSXRlbXMoc2VsZWN0ZWRWYWx1ZTogc3RyaW5nID0gbnVsbCkge1xuICAgIC8vIERlbGV0ZSBhbGwgY2hpbGRyZW5cbiAgICB0aGlzLnNlbGVjdEVsZW1lbnQuZW1wdHkoKTtcblxuICAgIC8vIEFkZCB1cGRhdGVkIGNoaWxkcmVuXG4gICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICBsZXQgb3B0aW9uRWxlbWVudCA9IG5ldyBET00oJ29wdGlvbicsIHtcbiAgICAgICAgJ3ZhbHVlJzogU3RyaW5nKGl0ZW0ua2V5KSxcbiAgICAgIH0pLmh0bWwoaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKGl0ZW0ubGFiZWwpKTtcblxuICAgICAgaWYgKGl0ZW0ua2V5ID09PSBTdHJpbmcoc2VsZWN0ZWRWYWx1ZSkpIHsgLy8gY29udmVydCBzZWxlY3RlZFZhbHVlIHRvIHN0cmluZyB0byBjYXRjaCAnbnVsbCcvbnVsbCBjYXNlXG4gICAgICAgIG9wdGlvbkVsZW1lbnQuYXR0cignc2VsZWN0ZWQnLCAnc2VsZWN0ZWQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWxlY3RFbGVtZW50LmFwcGVuZChvcHRpb25FbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JdGVtQWRkZWRFdmVudCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIub25JdGVtQWRkZWRFdmVudCh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVEb21JdGVtcyh0aGlzLnNlbGVjdGVkSXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JdGVtUmVtb3ZlZEV2ZW50KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5vbkl0ZW1SZW1vdmVkRXZlbnQodmFsdWUpO1xuICAgIHRoaXMudXBkYXRlRG9tSXRlbXModGhpcy5zZWxlY3RlZEl0ZW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSXRlbVNlbGVjdGVkRXZlbnQodmFsdWU6IHN0cmluZywgdXBkYXRlRG9tSXRlbXM6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIub25JdGVtU2VsZWN0ZWRFdmVudCh2YWx1ZSk7XG4gICAgaWYgKHVwZGF0ZURvbUl0ZW1zKSB7XG4gICAgICB0aGlzLnVwZGF0ZURvbUl0ZW1zKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbnRhaW5lciwgQ29udGFpbmVyQ29uZmlnIH0gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHsgU2VsZWN0Qm94IH0gZnJvbSAnLi9zZWxlY3Rib3gnO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgVGltZW91dCB9IGZyb20gJy4uL3RpbWVvdXQnO1xuaW1wb3J0IHsgRXZlbnQsIEV2ZW50RGlzcGF0Y2hlciwgTm9BcmdzIH0gZnJvbSAnLi4vZXZlbnRkaXNwYXRjaGVyJztcbmltcG9ydCB7IFNldHRpbmdzUGFuZWxQYWdlIH0gZnJvbSAnLi9zZXR0aW5nc3BhbmVscGFnZSc7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsSXRlbSB9IGZyb20gJy4vc2V0dGluZ3NwYW5lbGl0ZW0nO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IENvbXBvbmVudCwgQ29tcG9uZW50Q29uZmlnIH0gZnJvbSAnLi9jb21wb25lbnQnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciBhIHtAbGluayBTZXR0aW5nc1BhbmVsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXR0aW5nc1BhbmVsQ29uZmlnIGV4dGVuZHMgQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHNldHRpbmdzIHBhbmVsIHdpbGwgYmUgaGlkZGVuIHdoZW4gdGhlcmUgaXMgbm8gdXNlciBpbnRlcmFjdGlvbi5cbiAgICogU2V0IHRvIC0xIHRvIGRpc2FibGUgYXV0b21hdGljIGhpZGluZy5cbiAgICogRGVmYXVsdDogMyBzZWNvbmRzICgzMDAwKVxuICAgKi9cbiAgaGlkZURlbGF5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRvIHNwZWNpZnkgaWYgdGhlcmUgc2hvdWxkIGJlIGFuIGFuaW1hdGlvbiB3aGVuIHN3aXRjaGluZyBTZXR0aW5nc1BhbmVsUGFnZXMuXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIHBhZ2VUcmFuc2l0aW9uQW5pbWF0aW9uPzogYm9vbGVhbjtcbn1cblxuZW51bSBOYXZpZ2F0aW9uRGlyZWN0aW9uIHtcbiAgRm9yd2FyZHMsXG4gIEJhY2t3YXJkcyxcbn1cblxuLyoqXG4gKiBBIHBhbmVsIGNvbnRhaW5pbmcgYSBsaXN0IG9mIHtAbGluayBTZXR0aW5nc1BhbmVsUGFnZSBpdGVtc30uXG4gKlxuICogVG8gY29uZmlndXJlIHBhZ2VzIGp1c3QgcGFzcyB0aGVtIGluIHRoZSBjb21wb25lbnRzIGFycmF5LlxuICpcbiAqIEV4YW1wbGU6XG4gKiAgbGV0IHNldHRpbmdzUGFuZWwgPSBuZXcgU2V0dGluZ3NQYW5lbCh7XG4gKiAgICBoaWRkZW46IHRydWUsXG4gKiAgfSk7XG4gKlxuICogIGxldCBzZXR0aW5nc1BhbmVsUGFnZSA9IG5ldyBTZXR0aW5nc1BhbmVsUGFnZSh7XG4gKiAgICBjb21wb25lbnRzOiBb4oCmXVxuICogIH0pO1xuICpcbiAqICBsZXQgc2Vjb25kU2V0dGluZ3NQYW5lbFBhZ2UgPSBuZXcgU2V0dGluZ3NQYW5lbFBhZ2Uoe1xuICogICAgY29tcG9uZW50czogW+KApl1cbiAqICB9KTtcbiAqXG4gKiAgc2V0dGluZ3NQYW5lbC5hZGRDb21wb25lbnQoc2V0dGluZ3NQYW5lbFBhZ2UpO1xuICogIHNldHRpbmdzUGFuZWwuYWRkQ29tcG9uZW50KHNlY29uZFNldHRpbmdzUGFuZWxQYWdlKTtcbiAqXG4gKiBGb3IgYW4gZXhhbXBsZSBob3cgdG8gbmF2aWdhdGUgYmV0d2VlbiBwYWdlcyBAc2VlIFNldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQnV0dG9uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1BhbmVsIGV4dGVuZHMgQ29udGFpbmVyPFNldHRpbmdzUGFuZWxDb25maWc+IHtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTEFTU19BQ1RJVkVfUEFHRSA9ICdhY3RpdmUnO1xuXG4gIC8vIG5hdmlnYXRpb24gaGFuZGxpbmdcbiAgcHJpdmF0ZSBhY3RpdmVQYWdlOiBTZXR0aW5nc1BhbmVsUGFnZTtcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uU3RhY2s6IFNldHRpbmdzUGFuZWxQYWdlW10gPSBbXTtcblxuICBwcml2YXRlIHNldHRpbmdzUGFuZWxFdmVudHMgPSB7XG4gICAgb25TZXR0aW5nc1N0YXRlQ2hhbmdlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxTZXR0aW5nc1BhbmVsLCBOb0FyZ3M+KCksXG4gIH07XG5cbiAgcHJpdmF0ZSBoaWRlVGltZW91dDogVGltZW91dDtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNldHRpbmdzUGFuZWxDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1zZXR0aW5ncy1wYW5lbCcsXG4gICAgICBoaWRlRGVsYXk6IDMwMDAsXG4gICAgICBwYWdlVHJhbnNpdGlvbkFuaW1hdGlvbjogdHJ1ZSxcbiAgICB9IGFzIFNldHRpbmdzUGFuZWxDb25maWcsIHRoaXMuY29uZmlnKTtcblxuICAgIHRoaXMuYWN0aXZlUGFnZSA9IHRoaXMuZ2V0Um9vdFBhZ2UoKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzSGlkZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oaWRlSG92ZXJlZFNlbGVjdEJveGVzKCkpO1xuXG4gICAgaWYgKGNvbmZpZy5oaWRlRGVsYXkgPiAtMSkge1xuICAgICAgdGhpcy5oaWRlVGltZW91dCA9IG5ldyBUaW1lb3V0KGNvbmZpZy5oaWRlRGVsYXksICgpID0+IHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHRoaXMuaGlkZUhvdmVyZWRTZWxlY3RCb3hlcygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5vbignbW91c2VlbnRlcicsICgpID0+IHtcbiAgICAgICAgLy8gT24gbW91c2UgZW50ZXIgY2xlYXIgdGhlIHRpbWVvdXRcbiAgICAgICAgdGhpcy5oaWRlVGltZW91dC5jbGVhcigpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5vbignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgLy8gT24gbW91c2UgbGVhdmUgYWN0aXZhdGUgdGhlIHRpbWVvdXRcbiAgICAgICAgdGhpcy5oaWRlVGltZW91dC5yZXNldCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5vbignZm9jdXNpbicsICgpID0+IHtcbiAgICAgICAgdGhpcy5oaWRlVGltZW91dC5jbGVhcigpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5vbignZm9jdXNvdXQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaGlkZVRpbWVvdXQucmVzZXQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMub25IaWRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnLmhpZGVEZWxheSA+IC0xKSB7XG4gICAgICAgIC8vIENsZWFyIHRpbWVvdXQgd2hlbiBoaWRkZW4gZnJvbSBvdXRzaWRlXG4gICAgICAgIHRoaXMuaGlkZVRpbWVvdXQuY2xlYXIoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbCBuYXZpZ2F0aW9uIGhlcmUgd2UgbmVlZCB0byBzaW11bGF0ZSBhIG9uSW5hY3RpdmUgZXZlbnQgaW4gY2FzZSBzb21lIHBhbmVsXG4gICAgICAvLyBuZWVkcyB0byBkbyBzb21ldGhpbmcgd2hlbiB0aGV5IGJlY29tZSBpbnZpc2libGUgLyBpbmFjdGl2ZS5cbiAgICAgIHRoaXMuYWN0aXZlUGFnZS5vbkluYWN0aXZlRXZlbnQoKTtcbiAgICB9KTtcblxuICAgIHRoaXMub25TaG93LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBSZXNldCBuYXZpZ2F0aW9uIHdoZW4gdGUgcGFuZWwgZ2V0cyB2aXNpYmxlIHRvIGF2b2lkIGEgd2VpcmQgYW5pbWF0aW9uIHdoZW4gaGlkaW5nXG4gICAgICB0aGlzLnJlc2V0TmF2aWdhdGlvbih0cnVlKTtcbiAgICAgIC8vIFNpbmNlIHdlIGRvbid0IG5lZWQgdG8gbmF2aWdhdGUgdG8gdGhlIHJvb3QgcGFnZSBhZ2FpbiB3ZSBuZWVkIHRvIGZpcmUgdGhlIG9uQWN0aXZlIGV2ZW50IHdoZW4gdGhlIHNldHRpbmdzXG4gICAgICAvLyBwYW5lbCBnZXRzIHZpc2libGUuXG4gICAgICB0aGlzLmFjdGl2ZVBhZ2Uub25BY3RpdmVFdmVudCgpO1xuXG4gICAgICBpZiAoY29uZmlnLmhpZGVEZWxheSA+IC0xKSB7XG4gICAgICAgIC8vIEFjdGl2YXRlIHRpbWVvdXQgd2hlbiBzaG93blxuICAgICAgICB0aGlzLmhpZGVUaW1lb3V0LnN0YXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBwYXNzIGV2ZW50IGZyb20gcm9vdCBwYWdlIHRocm91Z2hcbiAgICB0aGlzLmdldFJvb3RQYWdlKCkub25TZXR0aW5nc1N0YXRlQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5vblNldHRpbmdzU3RhdGVDaGFuZ2VkRXZlbnQoKTtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlQWN0aXZlUGFnZUNsYXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBhY3RpdmUgLyB2aXNpYmxlIHBhZ2VcbiAgICogQHJldHVybiB7U2V0dGluZ3NQYW5lbFBhZ2V9XG4gICAqL1xuICBnZXRBY3RpdmVQYWdlKCk6IFNldHRpbmdzUGFuZWxQYWdlIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVQYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlUGFnZX0gaW5zdGVhZFxuICAgKiBAcGFyYW0gaW5kZXhcbiAgICovXG4gIHNldEFjdGl2ZVBhZ2VJbmRleChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXRBY3RpdmVQYWdlKHRoaXMuZ2V0UGFnZXMoKVtpbmRleF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIHBhc3NlZCBwYWdlIHRvIHRoZSBuYXZpZ2F0aW9uIHN0YWNrIGFuZCBtYWtlcyBpdCB2aXNpYmxlLlxuICAgKiBVc2Uge0BsaW5rIHBvcFNldHRpbmdzUGFuZWxQYWdlfSB0byBuYXZpZ2F0ZSBiYWNrd2FyZHMuXG4gICAqXG4gICAqIFJlc3VsdHMgaW4gbm8tb3AgaWYgdGhlIHRhcmdldCBwYWdlIGlzIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAqIEBwYXJhbXMgcGFnZVxuICAgKi9cbiAgc2V0QWN0aXZlUGFnZSh0YXJnZXRQYWdlOiBTZXR0aW5nc1BhbmVsUGFnZSk6IHZvaWQge1xuICAgIGlmICh0YXJnZXRQYWdlID09PSB0aGlzLmdldEFjdGl2ZVBhZ2UoKSkge1xuICAgICAgY29uc29sZS53YXJuKCdQYWdlIGlzIGFscmVhZHkgdGhlIGN1cnJlbnQgb25lIC4uLiBza2lwcGluZyBuYXZpZ2F0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5uYXZpZ2F0ZVRvUGFnZShcbiAgICAgIHRhcmdldFBhZ2UsXG4gICAgICB0aGlzLmdldEFjdGl2ZVBhZ2UoKSxcbiAgICAgIE5hdmlnYXRpb25EaXJlY3Rpb24uRm9yd2FyZHMsXG4gICAgICAhKHRoaXMuY29uZmlnIGFzIFNldHRpbmdzUGFuZWxDb25maWcpLnBhZ2VUcmFuc2l0aW9uQW5pbWF0aW9uLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBuYXZpZ2F0aW9uIHN0YWNrIGJ5IG5hdmlnYXRpbmcgYmFjayB0byB0aGUgcm9vdCBwYWdlIGFuZCBkaXNwbGF5aW5nIGl0LlxuICAgKi9cbiAgcG9wVG9Sb290U2V0dGluZ3NQYW5lbFBhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldE5hdmlnYXRpb24oKHRoaXMuY29uZmlnIGFzIFNldHRpbmdzUGFuZWxDb25maWcpLnBhZ2VUcmFuc2l0aW9uQW5pbWF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBjdXJyZW50IHBhZ2UgZnJvbSB0aGUgbmF2aWdhdGlvbiBzdGFjayBhbmQgbWFrZXMgdGhlIHByZXZpb3VzIG9uZSB2aXNpYmxlLlxuICAgKiBSZXN1bHRzIGluIGEgbm8tb3AgaWYgd2UgYXJlIGFscmVhZHkgb24gdGhlIHJvb3QgcGFnZS5cbiAgICovXG4gIHBvcFNldHRpbmdzUGFuZWxQYWdlKCkge1xuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybignQWxyZWFkeSBvbiB0aGUgcm9vdCBwYWdlIC4uLiBza2lwcGluZyBuYXZpZ2F0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRhcmdldFBhZ2UgPSB0aGlzLm5hdmlnYXRpb25TdGFja1t0aGlzLm5hdmlnYXRpb25TdGFjay5sZW5ndGggLSAyXTtcbiAgICAvLyBUaGUgcm9vdCBwYXJ0IGlzbid0IHBhcnQgb2YgdGhlIG5hdmlnYXRpb24gc3RhY2sgc28gaGFuZGxlIGl0IGV4cGxpY2l0bHkgaGVyZVxuICAgIGlmICghdGFyZ2V0UGFnZSkge1xuICAgICAgdGFyZ2V0UGFnZSA9IHRoaXMuZ2V0Um9vdFBhZ2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLm5hdmlnYXRlVG9QYWdlKFxuICAgICAgdGFyZ2V0UGFnZSxcbiAgICAgIHRoaXMuYWN0aXZlUGFnZSxcbiAgICAgIE5hdmlnYXRpb25EaXJlY3Rpb24uQmFja3dhcmRzLFxuICAgICAgISh0aGlzLmNvbmZpZyBhcyBTZXR0aW5nc1BhbmVsQ29uZmlnKS5wYWdlVHJhbnNpdGlvbkFuaW1hdGlvbixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGVyZSBhcmUgYWN0aXZlIHNldHRpbmdzIHdpdGhpbiB0aGUgcm9vdCBwYWdlIG9mIHRoZSBzZXR0aW5ncyBwYW5lbC5cbiAgICogQW4gYWN0aXZlIHNldHRpbmcgaXMgYSBzZXR0aW5nIHRoYXQgaXMgdmlzaWJsZSBhbmQgZW5hYmxlZCwgd2hpY2ggdGhlIHVzZXIgY2FuIGludGVyYWN0IHdpdGguXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZXJlIGFyZSBhY3RpdmUgc2V0dGluZ3MsIGZhbHNlIGlmIHRoZSBwYW5lbCBpcyBmdW5jdGlvbmFsbHkgZW1wdHkgdG8gYSB1c2VyXG4gICAqL1xuICByb290UGFnZUhhc0FjdGl2ZVNldHRpbmdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFJvb3RQYWdlKCkuaGFzQWN0aXZlU2V0dGluZ3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIGNvbmZpZ3VyZWQgcGFnZXNcbiAgICogQHJldHVybnMge1NldHRpbmdzUGFuZWxQYWdlW119XG4gICAqL1xuICBnZXRQYWdlcygpOiBTZXR0aW5nc1BhbmVsUGFnZVtdIHtcbiAgICByZXR1cm4gPFNldHRpbmdzUGFuZWxQYWdlW10+dGhpcy5jb25maWcuY29tcG9uZW50cy5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudCBpbnN0YW5jZW9mIFNldHRpbmdzUGFuZWxQYWdlKTtcbiAgfVxuXG4gIGdldCBvblNldHRpbmdzU3RhdGVDaGFuZ2VkKCk6IEV2ZW50PFNldHRpbmdzUGFuZWwsIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzUGFuZWxFdmVudHMub25TZXR0aW5nc1N0YXRlQ2hhbmdlZC5nZXRFdmVudCgpO1xuICB9XG5cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBzdXBlci5yZWxlYXNlKCk7XG4gICAgaWYgKHRoaXMuaGlkZVRpbWVvdXQpIHtcbiAgICAgIHRoaXMuaGlkZVRpbWVvdXQuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdXBwb3J0IGFkZGluZyBzZXR0aW5nc1BhbmVsUGFnZXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb25cbiAgYWRkQ29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4pIHtcbiAgICBpZiAodGhpcy5nZXRQYWdlcygpLmxlbmd0aCA9PT0gMCAmJiBjb21wb25lbnQgaW5zdGFuY2VvZiBTZXR0aW5nc1BhbmVsUGFnZSkge1xuICAgICAgdGhpcy5hY3RpdmVQYWdlID0gY29tcG9uZW50O1xuICAgIH1cbiAgICBzdXBlci5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWN0aXZlUGFnZUNsYXNzKCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0UGFnZXMoKS5mb3JFYWNoKChwYWdlOiBTZXR0aW5nc1BhbmVsUGFnZSkgPT4ge1xuICAgICAgaWYgKHBhZ2UgPT09IHRoaXMuYWN0aXZlUGFnZSkge1xuICAgICAgICBwYWdlLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhTZXR0aW5nc1BhbmVsLkNMQVNTX0FDVElWRV9QQUdFKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYWdlLmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhTZXR0aW5nc1BhbmVsLkNMQVNTX0FDVElWRV9QQUdFKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0TmF2aWdhdGlvbihyZXNldE5hdmlnYXRpb25PblNob3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2VQYWdlID0gdGhpcy5nZXRBY3RpdmVQYWdlKCk7XG4gICAgY29uc3Qgcm9vdFBhZ2UgPSB0aGlzLmdldFJvb3RQYWdlKCk7XG4gICAgaWYgKHNvdXJjZVBhZ2UpIHtcbiAgICAgIC8vIFNpbmNlIHRoZSBvbkluYWN0aXZlRXZlbnQgd2FzIGFscmVhZHkgZmlyZWQgaW4gdGhlIG9uSGlkZSB3ZSBuZWVkIHRvIHN1cHByZXNzIGl0IGhlcmVcbiAgICAgIGlmICghcmVzZXROYXZpZ2F0aW9uT25TaG93KSB7XG4gICAgICAgIHNvdXJjZVBhZ2Uub25JbmFjdGl2ZUV2ZW50KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubmF2aWdhdGlvblN0YWNrID0gW107XG4gICAgdGhpcy5hbmltYXRlTmF2aWdhdGlvbihyb290UGFnZSwgc291cmNlUGFnZSwgcmVzZXROYXZpZ2F0aW9uT25TaG93KTtcbiAgICB0aGlzLmFjdGl2ZVBhZ2UgPSByb290UGFnZTtcbiAgICB0aGlzLnVwZGF0ZUFjdGl2ZVBhZ2VDbGFzcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvUGFnZShcbiAgICB0YXJnZXRQYWdlOiBTZXR0aW5nc1BhbmVsUGFnZSxcbiAgICBzb3VyY2VQYWdlOiBTZXR0aW5nc1BhbmVsUGFnZSxcbiAgICBkaXJlY3Rpb246IE5hdmlnYXRpb25EaXJlY3Rpb24sXG4gICAgc2tpcEFuaW1hdGlvbjogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQYWdlID0gdGFyZ2V0UGFnZTtcblxuICAgIGlmIChkaXJlY3Rpb24gPT09IE5hdmlnYXRpb25EaXJlY3Rpb24uRm9yd2FyZHMpIHtcbiAgICAgIHRoaXMubmF2aWdhdGlvblN0YWNrLnB1c2godGFyZ2V0UGFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmF2aWdhdGlvblN0YWNrLnBvcCgpO1xuICAgIH1cblxuICAgIHRoaXMuYW5pbWF0ZU5hdmlnYXRpb24odGFyZ2V0UGFnZSwgc291cmNlUGFnZSwgc2tpcEFuaW1hdGlvbik7XG5cbiAgICB0aGlzLnVwZGF0ZUFjdGl2ZVBhZ2VDbGFzcygpO1xuICAgIHRhcmdldFBhZ2Uub25BY3RpdmVFdmVudCgpO1xuICAgIHNvdXJjZVBhZ2Uub25JbmFjdGl2ZUV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHRhcmdldFBhZ2VcbiAgICogQHBhcmFtIHNvdXJjZVBhZ2VcbiAgICogQHBhcmFtIHNraXBBbmltYXRpb24gVGhpcyBpcyBqdXN0IGFuIGludGVybmFsIGZsYWcgaWYgd2Ugd2FudCB0byBoYXZlIGFuIGFuaW1hdGlvbi4gSXQgaXMgc2V0IHRydWUgd2hlbiB3ZSByZXNldFxuICAgKiB0aGUgbmF2aWdhdGlvbiB3aXRoaW4gdGhlIG9uU2hvdyBjYWxsYmFjayBvZiB0aGUgc2V0dGluZ3NQYW5lbC4gSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgYW4gYWN0dWFsIGFuaW1hdGlvbiBidXRcbiAgICogdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc2V0dGluZ3NQYW5lbC5cbiAgICogVGhpcyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgcGFnZVRyYW5zaXRpb25BbmltYXRpb24gZmxhZy5cbiAgICovXG4gIHByaXZhdGUgYW5pbWF0ZU5hdmlnYXRpb24odGFyZ2V0UGFnZTogU2V0dGluZ3NQYW5lbFBhZ2UsIHNvdXJjZVBhZ2U6IFNldHRpbmdzUGFuZWxQYWdlLCBza2lwQW5pbWF0aW9uOiBib29sZWFuKSB7XG4gICAgaWYgKCEodGhpcy5jb25maWcgYXMgU2V0dGluZ3NQYW5lbENvbmZpZykucGFnZVRyYW5zaXRpb25BbmltYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5nc1BhbmVsRG9tRWxlbWVudCA9IHRoaXMuZ2V0RG9tRWxlbWVudCgpO1xuICAgIGNvbnN0IHNldHRpbmdzUGFuZWxIVE1MRWxlbWVudCA9IHRoaXMuZ2V0RG9tRWxlbWVudCgpLmdldCgwKTtcblxuICAgIC8vIGdldCBjdXJyZW50IGRpbWVuc2lvblxuICAgIGNvbnN0IHNldHRpbmdzUGFuZWxXaWR0aCA9IHNldHRpbmdzUGFuZWxIVE1MRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICBjb25zdCBzZXR0aW5nc1BhbmVsSGVpZ2h0ID0gc2V0dGluZ3NQYW5lbEhUTUxFbGVtZW50LnNjcm9sbEhlaWdodDtcblxuICAgIC8vIGNhbGN1bGF0ZSB0YXJnZXQgc2l6ZSBvZiB0aGUgc2V0dGluZ3MgcGFuZWxcbiAgICBzb3VyY2VQYWdlLmdldERvbUVsZW1lbnQoKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmNzcyh7IHdpZHRoOiAnJywgaGVpZ2h0OiAnJyB9KTsgLy8gbGV0IGNzcyBhdXRvIHNldHRpbmdzIGtpY2sgaW4gYWdhaW5cblxuICAgIGNvbnN0IHRhcmdldFBhZ2VIdG1sRWxlbWVudCA9IHRhcmdldFBhZ2UuZ2V0RG9tRWxlbWVudCgpLmdldCgwKTtcbiAgICAvLyBjbG9uZSB0aGUgdGFyZ2V0UGFnZSBET00gZWxlbWVudCBzbyB0aGF0IHdlIGNhbiBjYWxjdWxhdGUgdGhlIHdpZHRoIC8gaGVpZ2h0IGhvdyB0aGV5IHdpbGwgYmUgYWZ0ZXJcbiAgICAvLyBzd2l0Y2hpbmcgdGhlIHBhZ2UuIFdlIGFyZSB1c2luZyBhIGNsb25lIHRvIHByZXZlbnQgKG1vc3RseSBzdHlsaW5nKSBzaWRlLWVmZmVjdHMgb24gdGhlIHJlYWwgRE9NIGVsZW1lbnRcbiAgICBjb25zdCBjbG9uZSA9IHRhcmdldFBhZ2VIdG1sRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gYXBwZW5kIHRvIHBhcmVudCBzbyB3ZSBnZXQgdGhlICdyZWFsJyBzaXplXG4gICAgY29uc3QgY29udGFpbmVyV3JhcHBlciA9IHRhcmdldFBhZ2VIdG1sRWxlbWVudC5wYXJlbnROb2RlO1xuICAgIGNvbnRhaW5lcldyYXBwZXIuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgIC8vIHNldCBjbG9uZSB2aXNpYmxlXG4gICAgY2xvbmUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAvLyBjb2xsZWN0IHRhcmdldCBkaW1lbnNpb25cbiAgICBjb25zdCB0YXJnZXRTZXR0aW5nc1BhbmVsV2lkdGggPSBzZXR0aW5nc1BhbmVsSFRNTEVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgY29uc3QgdGFyZ2V0U2V0dGluZ3NQYW5lbEhlaWdodCA9IHNldHRpbmdzUGFuZWxIVE1MRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG5cbiAgICAvLyByZW1vdmUgY2xvbmUgZnJvbSB0aGUgRE9NXG4gICAgY2xvbmUucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChjbG9uZSk7IC8vIC5yZW1vdmUoKSBpcyBub3Qgd29ya2luZyBpbiBJRVxuICAgIHNvdXJjZVBhZ2UuZ2V0RG9tRWxlbWVudCgpLmNzcygnZGlzcGxheScsICcnKTtcblxuICAgIC8vIHNldCB0aGUgdmFsdWVzIGJhY2sgdG8gdGhlIGN1cnJlbnQgb25lcyB0aGF0IHRoZSBicm93c2VyIGFuaW1hdGVzIGl0IChicm93c2VycyBkb24ndCBhbmltYXRlICdhdXRvJyB2YWx1ZXMpXG4gICAgc2V0dGluZ3NQYW5lbERvbUVsZW1lbnQuY3NzKHtcbiAgICAgIHdpZHRoOiBzZXR0aW5nc1BhbmVsV2lkdGggKyAncHgnLFxuICAgICAgaGVpZ2h0OiBzZXR0aW5nc1BhbmVsSGVpZ2h0ICsgJ3B4JyxcbiAgICB9KTtcblxuICAgIGlmICghc2tpcEFuaW1hdGlvbikge1xuICAgICAgLy8gV2UgbmVlZCB0byBmb3JjZSB0aGUgYnJvd3NlciB0byByZWZsb3cgYmV0d2VlbiBzZXR0aW5nIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHRoYXQgd2UgYWN0dWFsbHkgZ2V0IGEgYW5pbWF0aW9uXG4gICAgICB0aGlzLmZvcmNlQnJvd3NlclJlZmxvdygpO1xuICAgIH1cblxuICAgIC8vIHNldCB0aGUgdmFsdWVzIHRvIHRoZSB0YXJnZXQgZGltZW5zaW9uXG4gICAgc2V0dGluZ3NQYW5lbERvbUVsZW1lbnQuY3NzKHtcbiAgICAgIHdpZHRoOiB0YXJnZXRTZXR0aW5nc1BhbmVsV2lkdGggKyAncHgnLFxuICAgICAgaGVpZ2h0OiB0YXJnZXRTZXR0aW5nc1BhbmVsSGVpZ2h0ICsgJ3B4JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9yY2VCcm93c2VyUmVmbG93KCk6IHZvaWQge1xuICAgIC8vIEZvcmNlIHRoZSBicm93c2VyIHRvIHJlZmxvdyB0aGUgbGF5b3V0XG4gICAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bGlyaXNoLzVkNTJmYjA4MWIzNTcwYzgxZTNhXG4gICAgdGhpcy5nZXREb21FbGVtZW50KCkuZ2V0KDApLm9mZnNldExlZnQ7XG4gIH1cblxuICAvKipcbiAgICogSGFjayBmb3IgSUUgKyBGaXJlZm94XG4gICAqIHdoZW4gdGhlIHNldHRpbmdzIHBhbmVsIGZhZGVzIG91dCB3aGlsZSBhbiBpdGVtIG9mIGEgc2VsZWN0IGJveCBpcyBzdGlsbCBob3ZlcmVkLCB0aGUgc2VsZWN0IGJveCB3aWxsIG5vdCBmYWRlIG91dFxuICAgKiB3aGlsZSB0aGUgc2V0dGluZ3MgcGFuZWwgZG9lcy4gVGhpcyB3b3VsZCBsZWF2ZSBhIGZsb2F0aW5nIHNlbGVjdCBib3gsIHdoaWNoIGlzIGp1c3Qgd2VpcmRcbiAgICovXG4gIHByaXZhdGUgaGlkZUhvdmVyZWRTZWxlY3RCb3hlcygpOiB2b2lkIHtcbiAgICB0aGlzLmdldENvbXB1dGVkSXRlbXMoKS5mb3JFYWNoKChpdGVtOiBTZXR0aW5nc1BhbmVsSXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uaXNBY3RpdmUoKSAmJiAoaXRlbSBhcyBhbnkpLnNldHRpbmcgaW5zdGFuY2VvZiBTZWxlY3RCb3gpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0Qm94ID0gKGl0ZW0gYXMgYW55KS5zZXR0aW5nIGFzIFNlbGVjdEJveDtcbiAgICAgICAgY29uc3Qgb2xkRGlzcGxheSA9IHNlbGVjdEJveC5nZXREb21FbGVtZW50KCkuY3NzKCdkaXNwbGF5Jyk7XG4gICAgICAgIGlmIChvbGREaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAvLyBpZiBvbGREaXNwbGF5IGlzIGFscmVhZHkgJ25vbmUnLCBubyBuZWVkIHRvIHNldCB0byAnbm9uZScgYWdhaW4uIEl0IGNvdWxkIGxlYWQgdG8gcmFjZSBjb25kaXRpb25cbiAgICAgICAgICAvLyB3aGVyZWluIHRoZSBkaXNwbGF5IGlzIGlycmV2ZXJzaWJseSBzZXQgdG8gJ25vbmUnIHdoZW4gYnJvd3NlciB0YWIvd2luZG93IGlzIG5vdCBhY3RpdmUgYmVjYXVzZVxuICAgICAgICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpcyBlaXRoZXIgZGVsYXllZCBvciBwYXVzZWQgaW4gc29tZSBicm93c2VycyBpbiBpbmFjdGl2ZSBzdGF0ZVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0aW5nIHRoZSBkaXNwbGF5IHRvIG5vbmUgbWFya3MgdGhlIHNlbGVjdC1ib3ggYXMgaW5hY3RpdmUsIHNvIGl0IHdpbGwgYmUgaGlkZGVuIHdpdGggdGhlIHJlc3RcbiAgICAgICAgLy8gd2UganVzdCBoYXZlIHRvIG1ha2Ugc3VyZSB0byByZXNldCB0aGlzIGFzIHNvb24gYXMgcG9zc2libGVcbiAgICAgICAgc2VsZWN0Qm94LmdldERvbUVsZW1lbnQoKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICBpZiAod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBzZWxlY3RCb3guZ2V0RG9tRWxlbWVudCgpLmNzcygnZGlzcGxheScsIG9sZERpc3BsYXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElFOSBoYXMgbm8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lLCBzZXQgdGhlIHZhbHVlIGRpcmVjdGx5LiBJdCBoYXMgbm8gb3B0aW1pemF0aW9uIGFib3V0IGlnbm9yaW5nIERPTS1jaGFuZ2VzXG4gICAgICAgICAgLy8gYmV0d2VlbiBhbmltYXRpb25GcmFtZXNcbiAgICAgICAgICBzZWxlY3RCb3guZ2V0RG9tRWxlbWVudCgpLmNzcygnZGlzcGxheScsIG9sZERpc3BsYXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBjb2xsZWN0IGFsbCBpdGVtcyBmcm9tIGFsbCBwYWdlcyAoc2VlIGhpZGVIb3ZlcmVkU2VsZWN0Qm94ZXMpXG4gIHByaXZhdGUgZ2V0Q29tcHV0ZWRJdGVtcygpOiBTZXR0aW5nc1BhbmVsSXRlbVtdIHtcbiAgICBjb25zdCBhbGxJdGVtczogU2V0dGluZ3NQYW5lbEl0ZW1bXSA9IFtdO1xuICAgIGZvciAobGV0IHBhZ2Ugb2YgdGhpcy5nZXRQYWdlcygpKSB7XG4gICAgICBhbGxJdGVtcy5wdXNoKC4uLnBhZ2UuZ2V0SXRlbXMoKSk7XG4gICAgfVxuICAgIHJldHVybiBhbGxJdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um9vdFBhZ2UoKTogU2V0dGluZ3NQYW5lbFBhZ2Uge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2VzKClbMF07XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZXR0aW5nc1N0YXRlQ2hhbmdlZEV2ZW50KCkge1xuICAgIHRoaXMuc2V0dGluZ3NQYW5lbEV2ZW50cy5vblNldHRpbmdzU3RhdGVDaGFuZ2VkLmRpc3BhdGNoKHRoaXMpO1xuICB9XG59XG4iLCJpbXBvcnQge0NvbnRhaW5lciwgQ29udGFpbmVyQ29uZmlnfSBmcm9tICcuL2NvbnRhaW5lcic7XG5pbXBvcnQge0NvbXBvbmVudCwgQ29tcG9uZW50Q29uZmlnfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQge0V2ZW50LCBFdmVudERpc3BhdGNoZXIsIE5vQXJnc30gZnJvbSAnLi4vZXZlbnRkaXNwYXRjaGVyJztcbmltcG9ydCB7IExhYmVsLCBMYWJlbENvbmZpZyB9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7U2VsZWN0Qm94fSBmcm9tICcuL3NlbGVjdGJveCc7XG5pbXBvcnQge0xpc3RCb3h9IGZyb20gJy4vbGlzdGJveCc7XG5pbXBvcnQge1ZpZGVvUXVhbGl0eVNlbGVjdEJveH0gZnJvbSAnLi92aWRlb3F1YWxpdHlzZWxlY3Rib3gnO1xuaW1wb3J0IHtBdWRpb1F1YWxpdHlTZWxlY3RCb3h9IGZyb20gJy4vYXVkaW9xdWFsaXR5c2VsZWN0Ym94JztcbmltcG9ydCB7UGxheWJhY2tTcGVlZFNlbGVjdEJveH0gZnJvbSAnLi9wbGF5YmFja3NwZWVkc2VsZWN0Ym94JztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVRleHQgfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQW4gaXRlbSBmb3IgYSB7QGxpbmsgU2V0dGluZ3NQYW5lbFBhZ2V9LFxuICogQ29udGFpbmluZyBhbiBvcHRpb25hbCB7QGxpbmsgTGFiZWx9IGFuZCBhIGNvbXBvbmVudCB0aGF0IGNvbmZpZ3VyZXMgYSBzZXR0aW5nLlxuICogSWYgdGhlIGNvbXBvbmVudHMgaXMgYSB7QGxpbmsgU2VsZWN0Qm94fSBpdCB3aWxsIGhhbmRsZSB0aGUgbG9naWMgb2YgZGlzcGxheWluZyBpdCBvciBub3RcbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzUGFuZWxJdGVtIGV4dGVuZHMgQ29udGFpbmVyPENvbnRhaW5lckNvbmZpZz4ge1xuXG4gIHByaXZhdGUgbGFiZWw6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+O1xuICBwcml2YXRlIHNldHRpbmc6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+O1xuXG4gIHByaXZhdGUgc2V0dGluZ3NQYW5lbEl0ZW1FdmVudHMgPSB7XG4gICAgb25BY3RpdmVDaGFuZ2VkOiBuZXcgRXZlbnREaXNwYXRjaGVyPFNldHRpbmdzUGFuZWxJdGVtLCBOb0FyZ3M+KCksXG4gIH07XG5cbiAgY29uc3RydWN0b3IobGFiZWw6IExvY2FsaXphYmxlVGV4dCB8IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+LCBzZXR0aW5nOiBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiwgY29uZmlnOiBDb250YWluZXJDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1zZXR0aW5ncy1wYW5lbC1pdGVtJyxcbiAgICAgIHJvbGU6ICdtZW51aXRlbScsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuXG4gICAgaWYgKGxhYmVsICE9PSBudWxsKSB7XG4gICAgICBpZiAobGFiZWwgaW5zdGFuY2VvZiBDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sYWJlbCA9IG5ldyBMYWJlbCh7IHRleHQ6IGxhYmVsLCBmb3I6IHRoaXMuc2V0dGluZy5nZXRDb25maWcoKS5pZCB9IGFzIExhYmVsQ29uZmlnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMubGFiZWwpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQ29tcG9uZW50KHRoaXMuc2V0dGluZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZXR0aW5nIGluc3RhbmNlb2YgU2VsZWN0Qm94IHx8IHRoaXMuc2V0dGluZyBpbnN0YW5jZW9mIExpc3RCb3gpIHtcbiAgICAgIGxldCBoYW5kbGVDb25maWdJdGVtQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCEodGhpcy5zZXR0aW5nIGluc3RhbmNlb2YgU2VsZWN0Qm94KSAmJiAhKHRoaXMuc2V0dGluZyBpbnN0YW5jZW9mIExpc3RCb3gpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IG11c3QgYmUgYXZhaWxhYmxlIGZvciB0aGUgc2V0dGluZyB0byBiZSBkaXNwbGF5ZWRcbiAgICAgICAgLy8gQnkgZGVmYXVsdCwgYXQgbGVhc3QgdHdvIGl0ZW1zIG11c3QgYmUgYXZhaWxhYmxlLCBlbHNlIGEgc2VsZWN0aW9uIGlzIG5vdCBwb3NzaWJsZVxuICAgICAgICBsZXQgbWluSXRlbXNUb0Rpc3BsYXkgPSAyO1xuICAgICAgICAvLyBBdWRpby92aWRlbyBxdWFsaXR5IHNlbGVjdCBib3hlcyBjb250YWluIGFuIGFkZGl0aW9uYWwgJ2F1dG8nIG1vZGUsIHdoaWNoIGluIGNvbWJpbmF0aW9uIHdpdGggYSBzaW5nbGVcbiAgICAgICAgLy8gYXZhaWxhYmxlIHF1YWxpdHkgYWxzbyBkb2VzIG5vdCBtYWtlIHNlbnNlXG4gICAgICAgIGlmICgodGhpcy5zZXR0aW5nIGluc3RhbmNlb2YgVmlkZW9RdWFsaXR5U2VsZWN0Qm94ICYmIHRoaXMuc2V0dGluZy5oYXNBdXRvSXRlbSgpKVxuICAgICAgICAgIHx8IHRoaXMuc2V0dGluZyBpbnN0YW5jZW9mIEF1ZGlvUXVhbGl0eVNlbGVjdEJveCkge1xuICAgICAgICAgIG1pbkl0ZW1zVG9EaXNwbGF5ID0gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuaXRlbUNvdW50KCkgPCBtaW5JdGVtc1RvRGlzcGxheSkge1xuICAgICAgICAgIC8vIEhpZGUgdGhlIHNldHRpbmcgaWYgbm8gbWVhbmluZ2Z1bCBjaG9pY2UgaXMgYXZhaWxhYmxlXG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5nIGluc3RhbmNlb2YgUGxheWJhY2tTcGVlZFNlbGVjdEJveFxuICAgICAgICAgICYmICF1aW1hbmFnZXIuZ2V0Q29uZmlnKCkucGxheWJhY2tTcGVlZFNlbGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAvLyBIaWRlIHRoZSBQbGF5YmFja1NwZWVkU2VsZWN0Qm94IGlmIGRpc2FibGVkIGluIGNvbmZpZ1xuICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmlzaWJpbGl0eSBtaWdodCBoYXZlIGNoYW5nZWQgYW5kIHRoZXJlZm9yZSB0aGUgYWN0aXZlIHN0YXRlIG1pZ2h0IGhhdmUgY2hhbmdlZCBzbyB3ZSBmaXJlIHRoZSBldmVudFxuICAgICAgICAvLyBUT0RPIGZpcmUgb25seSB3aGVuIHN0YXRlIGhhcyByZWFsbHkgY2hhbmdlZCAoZS5nLiBjaGVjayBpZiB2aXNpYmlsaXR5IGhhcyByZWFsbHkgY2hhbmdlZClcbiAgICAgICAgdGhpcy5vbkFjdGl2ZUNoYW5nZWRFdmVudCgpO1xuXG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmF0dHIoJ2FyaWEtaGFzcG9wdXAnLCAndHJ1ZScpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5zZXR0aW5nLm9uSXRlbUFkZGVkLnN1YnNjcmliZShoYW5kbGVDb25maWdJdGVtQ2hhbmdlZCk7XG4gICAgICB0aGlzLnNldHRpbmcub25JdGVtUmVtb3ZlZC5zdWJzY3JpYmUoaGFuZGxlQ29uZmlnSXRlbUNoYW5nZWQpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIGhpZGRlbiBzdGF0ZVxuICAgICAgaGFuZGxlQ29uZmlnSXRlbUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoaXMgc2V0dGluZ3MgcGFuZWwgaXRlbSBpcyBhY3RpdmUsIGkuZS4gdmlzaWJsZSBhbmQgZW5hYmxlZCBhbmQgYSB1c2VyIGNhbiBpbnRlcmFjdCB3aXRoIGl0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcGFuZWwgaXMgYWN0aXZlLCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1Nob3duKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25BY3RpdmVDaGFuZ2VkRXZlbnQoKSB7XG4gICAgdGhpcy5zZXR0aW5nc1BhbmVsSXRlbUV2ZW50cy5vbkFjdGl2ZUNoYW5nZWQuZGlzcGF0Y2godGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIHRoZSAnYWN0aXZlJyBzdGF0ZSBvZiB0aGlzIGl0ZW0gY2hhbmdlcy5cbiAgICogQHNlZSAjaXNBY3RpdmVcbiAgICogQHJldHVybnMge0V2ZW50PFNldHRpbmdzUGFuZWxJdGVtLCBOb0FyZ3M+fVxuICAgKi9cbiAgZ2V0IG9uQWN0aXZlQ2hhbmdlZCgpOiBFdmVudDxTZXR0aW5nc1BhbmVsSXRlbSwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NQYW5lbEl0ZW1FdmVudHMub25BY3RpdmVDaGFuZ2VkLmdldEV2ZW50KCk7XG4gIH1cbn1cbiIsImltcG9ydCB7Q29udGFpbmVyLCBDb250YWluZXJDb25maWd9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7U2V0dGluZ3NQYW5lbEl0ZW19IGZyb20gJy4vc2V0dGluZ3NwYW5lbGl0ZW0nO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7RXZlbnQsIEV2ZW50RGlzcGF0Y2hlciwgTm9BcmdzfSBmcm9tICcuLi9ldmVudGRpc3BhdGNoZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IEJyb3dzZXJVdGlscyB9IGZyb20gJy4uL2Jyb3dzZXJ1dGlscyc7XG5cbi8qKlxuICogQSBwYW5lbCBjb250YWluaW5nIGEgbGlzdCBvZiB7QGxpbmsgU2V0dGluZ3NQYW5lbEl0ZW0gaXRlbXN9IHRoYXQgcmVwcmVzZW50IGxhYmVsbGVkIHNldHRpbmdzLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NQYW5lbFBhZ2UgZXh0ZW5kcyBDb250YWluZXI8Q29udGFpbmVyQ29uZmlnPiB7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xBU1NfTEFTVCA9ICdsYXN0JztcblxuICBwcml2YXRlIHNldHRpbmdzUGFuZWxQYWdlRXZlbnRzID0ge1xuICAgIG9uU2V0dGluZ3NTdGF0ZUNoYW5nZWQ6IG5ldyBFdmVudERpc3BhdGNoZXI8U2V0dGluZ3NQYW5lbFBhZ2UsIE5vQXJncz4oKSxcbiAgICBvbkFjdGl2ZTogbmV3IEV2ZW50RGlzcGF0Y2hlcjxTZXR0aW5nc1BhbmVsUGFnZSwgTm9BcmdzPigpLFxuICAgIG9uSW5hY3RpdmU6IG5ldyBFdmVudERpc3BhdGNoZXI8U2V0dGluZ3NQYW5lbFBhZ2UsIE5vQXJncz4oKSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbnRhaW5lckNvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWc8Q29udGFpbmVyQ29uZmlnPihjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktc2V0dGluZ3MtcGFuZWwtcGFnZScsXG4gICAgICByb2xlOiAnbWVudScsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIC8vIEZpcmUgZXZlbnQgd2hlbiB0aGUgc3RhdGUgb2YgYSBzZXR0aW5ncy1pdGVtIGhhcyBjaGFuZ2VkXG4gICAgbGV0IHNldHRpbmdzU3RhdGVDaGFuZ2VkSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25TZXR0aW5nc1N0YXRlQ2hhbmdlZEV2ZW50KCk7XG5cbiAgICAgIC8vIEF0dGFjaCBtYXJrZXIgY2xhc3MgdG8gbGFzdCB2aXNpYmxlIGl0ZW1cbiAgICAgIGxldCBsYXN0U2hvd25JdGVtID0gbnVsbDtcbiAgICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiB0aGlzLmdldEl0ZW1zKCkpIHtcbiAgICAgICAgY29tcG9uZW50LmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhTZXR0aW5nc1BhbmVsUGFnZS5DTEFTU19MQVNUKSk7XG4gICAgICAgIGlmIChjb21wb25lbnQuaXNTaG93bigpKSB7XG4gICAgICAgICAgbGFzdFNob3duSXRlbSA9IGNvbXBvbmVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxhc3RTaG93bkl0ZW0pIHtcbiAgICAgICAgbGFzdFNob3duSXRlbS5nZXREb21FbGVtZW50KCkuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoU2V0dGluZ3NQYW5lbFBhZ2UuQ0xBU1NfTEFTVCkpO1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0SXRlbXMoKSkge1xuICAgICAgY29tcG9uZW50Lm9uQWN0aXZlQ2hhbmdlZC5zdWJzY3JpYmUoc2V0dGluZ3NTdGF0ZUNoYW5nZWRIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICBoYXNBY3RpdmVTZXR0aW5ncygpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBjb21wb25lbnQgb2YgdGhpcy5nZXRJdGVtcygpKSB7XG4gICAgICBpZiAoY29tcG9uZW50LmlzQWN0aXZlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0SXRlbXMoKTogU2V0dGluZ3NQYW5lbEl0ZW1bXSB7XG4gICAgcmV0dXJuIDxTZXR0aW5nc1BhbmVsSXRlbVtdPnRoaXMuY29uZmlnLmNvbXBvbmVudHMuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQgaW5zdGFuY2VvZiBTZXR0aW5nc1BhbmVsSXRlbSk7XG4gIH1cblxuICBvblNldHRpbmdzU3RhdGVDaGFuZ2VkRXZlbnQoKSB7XG4gICAgdGhpcy5zZXR0aW5nc1BhbmVsUGFnZUV2ZW50cy5vblNldHRpbmdzU3RhdGVDaGFuZ2VkLmRpc3BhdGNoKHRoaXMpO1xuICB9XG5cbiAgZ2V0IG9uU2V0dGluZ3NTdGF0ZUNoYW5nZWQoKTogRXZlbnQ8U2V0dGluZ3NQYW5lbFBhZ2UsIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzUGFuZWxQYWdlRXZlbnRzLm9uU2V0dGluZ3NTdGF0ZUNoYW5nZWQuZ2V0RXZlbnQoKTtcbiAgfVxuXG4gIG9uQWN0aXZlRXZlbnQoKSB7XG4gICAgY29uc3QgYWN0aXZlSXRlbXMgPSB0aGlzLmdldEl0ZW1zKCkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzQWN0aXZlKCkpO1xuXG4gICAgdGhpcy5zZXR0aW5nc1BhbmVsUGFnZUV2ZW50cy5vbkFjdGl2ZS5kaXNwYXRjaCh0aGlzKTtcbiAgICAvLyBEaXNhYmxlIGZvY3VzIGZvciBpT1MgYW5kIGlQYWRPUyAxMy4gVGhleSBvcGVuIHNlbGVjdCBib3hlcyBhdXRvbWF0aWNhbGx5IG9uIGZvY3VzIGFuZCB3ZSB3YW50IHRvIGF2b2lkIHRoYXQuXG4gICAgaWYgKGFjdGl2ZUl0ZW1zLmxlbmd0aCA+IDAgJiYgIUJyb3dzZXJVdGlscy5pc0lPUyAmJiAhKEJyb3dzZXJVdGlscy5pc01hY0ludGVsICYmIEJyb3dzZXJVdGlscy5pc1RvdWNoU3VwcG9ydGVkKSkge1xuICAgICAgYWN0aXZlSXRlbXNbMF0uZ2V0RG9tRWxlbWVudCgpLmZvY3VzVG9GaXJzdElucHV0KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uQWN0aXZlKCk6IEV2ZW50PFNldHRpbmdzUGFuZWxQYWdlLCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1BhbmVsUGFnZUV2ZW50cy5vbkFjdGl2ZS5nZXRFdmVudCgpO1xuICB9XG5cbiAgb25JbmFjdGl2ZUV2ZW50KCkge1xuICAgIHRoaXMuc2V0dGluZ3NQYW5lbFBhZ2VFdmVudHMub25JbmFjdGl2ZS5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIGdldCBvbkluYWN0aXZlKCk6IEV2ZW50PFNldHRpbmdzUGFuZWxQYWdlLCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1BhbmVsUGFnZUV2ZW50cy5vbkluYWN0aXZlLmdldEV2ZW50KCk7XG4gIH1cbn1cbiIsImltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1NldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQnV0dG9uLCBTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckNvbmZpZ30gZnJvbSAnLi9zZXR0aW5nc3BhbmVscGFnZW5hdmlnYXRvcmJ1dHRvbic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NQYW5lbFBhZ2VCYWNrQnV0dG9uIGV4dGVuZHMgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JCdXR0b24ge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1zZXR0aW5nc3BhbmVscGFnZWJhY2tidXR0b24nLFxuICAgICAgdGV4dDogJ2JhY2snLFxuICAgIH0gYXMgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JDb25maWcsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucG9wUGFnZSgpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge0J1dHRvbiwgQnV0dG9uQ29uZmlnfSBmcm9tICcuL2J1dHRvbic7XG5pbXBvcnQge1NldHRpbmdzUGFuZWx9IGZyb20gJy4vc2V0dGluZ3NwYW5lbCc7XG5pbXBvcnQge1NldHRpbmdzUGFuZWxQYWdlfSBmcm9tICcuL3NldHRpbmdzcGFuZWxwYWdlJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBVSUluc3RhbmNlTWFuYWdlciB9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIFNldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQnV0dG9ufVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQ29uZmlnIGV4dGVuZHMgQnV0dG9uQ29uZmlnIHtcbiAgLyoqXG4gICAqIENvbnRhaW5lciBgU2V0dGluZ3NQYW5lbGAgd2hlcmUgdGhlIG5hdmlnYXRpb24gdGFrZXMgcGxhY2VcbiAgICovXG4gIGNvbnRhaW5lcjogU2V0dGluZ3NQYW5lbDtcbiAgLyoqXG4gICAqIFBhZ2Ugd2hlcmUgdGhlIGJ1dHRvbiBzaG91bGQgbmF2aWdhdGUgdG9cbiAgICogSWYgZW1wdHkgaXQgd2lsbCBuYXZpZ2F0ZSB0byB0aGUgcm9vdCBwYWdlIChub3QgaW50ZW5kZWQgdG8gdXNlIGFzIG5hdmlnYXRlIGJhY2sgYmVoYXZpb3IpXG4gICAqL1xuICB0YXJnZXRQYWdlPzogU2V0dGluZ3NQYW5lbFBhZ2U7XG5cbiAgLyoqXG4gICAqIFdDQUcyMCBzdGFuZGFyZDogRXN0YWJsaXNoZXMgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIG9iamVjdHMgYW5kIHRoZWlyIGxhYmVsKHMpXG4gICAqL1xuICBhcmlhTGFiZWxsZWRCeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDYW4gYmUgdXNlZCB0byBuYXZpZ2F0ZSBiZXR3ZWVuIFNldHRpbmdzUGFuZWxQYWdlc1xuICpcbiAqIEV4YW1wbGU6XG4gKiAgbGV0IHNldHRpbmdQYW5lbE5hdmlnYXRpb25CdXR0b24gPSBuZXcgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JCdXR0b24oe1xuICogICAgY29udGFpbmVyOiBzZXR0aW5nc1BhbmVsLFxuICogICAgdGFyZ2V0UGFnZTogc2V0dGluZ3NQYW5lbFBhZ2UsXG4gKiAgfSk7XG4gKlxuICogIHNldHRpbmdzUGFuZWxQYWdlLmFkZENvbXBvbmVudChzZXR0aW5nUGFuZWxOYXZpZ2F0aW9uQnV0dG9uKTtcbiAqXG4gKiBEb24ndCBmb3JnZXQgdG8gYWRkIHRoZSBzZXR0aW5nUGFuZWxOYXZpZ2F0aW9uQnV0dG9uIHRvIHRoZSBzZXR0aW5nc1BhbmVsUGFnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQnV0dG9uIGV4dGVuZHMgQnV0dG9uPFNldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQ29uZmlnPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyOiBTZXR0aW5nc1BhbmVsO1xuICBwcml2YXRlIHJlYWRvbmx5IHRhcmdldFBhZ2U/OiBTZXR0aW5nc1BhbmVsUGFnZTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7fSBhcyBTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckNvbmZpZywgdGhpcy5jb25maWcpO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSAodGhpcy5jb25maWcgYXMgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JDb25maWcpLmNvbnRhaW5lcjtcbiAgICB0aGlzLnRhcmdldFBhZ2UgPSAodGhpcy5jb25maWcgYXMgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JDb25maWcpLnRhcmdldFBhZ2U7XG4gIH1cblxuICAvKipcbiAgICogbmF2aWdhdGUgb25lIGxldmVsIGJhY2tcbiAgICovXG4gIHBvcFBhZ2UoKSB7XG4gICAgdGhpcy5jb250YWluZXIucG9wU2V0dGluZ3NQYW5lbFBhZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBuYXZpZ2F0ZSB0byB0aGUgdGFyZ2V0IHBhZ2VcbiAgICovXG4gIHB1c2hUYXJnZXRQYWdlKCkge1xuICAgIHRoaXMuY29udGFpbmVyLnNldEFjdGl2ZVBhZ2UodGhpcy50YXJnZXRQYWdlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7U2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JCdXR0b24sIFNldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQ29uZmlnfSBmcm9tICcuL3NldHRpbmdzcGFuZWxwYWdlbmF2aWdhdG9yYnV0dG9uJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NQYW5lbFBhZ2VPcGVuQnV0dG9uIGV4dGVuZHMgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JCdXR0b24ge1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktc2V0dGluZ3NwYW5lbHBhZ2VvcGVuYnV0dG9uJyxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdvcGVuJyksXG4gICAgICByb2xlOiAnbWVudWl0ZW0nLFxuICAgIH0gYXMgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JDb25maWcsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hdHRyKCdhcmlhLWhhc3BvcHVwJywgJ3RydWUnKTtcbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hdHRyKCdhcmlhLW93bnMnLCB0aGlzLmNvbmZpZy50YXJnZXRQYWdlLmdldENvbmZpZygpLmlkKTtcblxuICAgIHRoaXMub25DbGljay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5wdXNoVGFyZ2V0UGFnZSgpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1RvZ2dsZUJ1dHRvbiwgVG9nZ2xlQnV0dG9uQ29uZmlnfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1NldHRpbmdzUGFuZWx9IGZyb20gJy4vc2V0dGluZ3NwYW5lbCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudENvbmZpZ30gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHtBcnJheVV0aWxzfSBmcm9tICcuLi9hcnJheXV0aWxzJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciB0aGUge0BsaW5rIFNldHRpbmdzVG9nZ2xlQnV0dG9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXR0aW5nc1RvZ2dsZUJ1dHRvbkNvbmZpZyBleHRlbmRzIFRvZ2dsZUJ1dHRvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3MgcGFuZWwgd2hvc2UgdmlzaWJpbGl0eSB0aGUgYnV0dG9uIHNob3VsZCB0b2dnbGUuXG4gICAqL1xuICBzZXR0aW5nc1BhbmVsOiBTZXR0aW5nc1BhbmVsO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIGlmIHRoZSBidXR0b24gc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgaGlkZGVuIHdoZW4gdGhlIHNldHRpbmdzIHBhbmVsIGRvZXMgbm90IGNvbnRhaW4gYW55IGFjdGl2ZSBzZXR0aW5ncy5cbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgYXV0b0hpZGVXaGVuTm9BY3RpdmVTZXR0aW5ncz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCB0b2dnbGVzIHZpc2liaWxpdHkgb2YgYSBzZXR0aW5ncyBwYW5lbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzVG9nZ2xlQnV0dG9uIGV4dGVuZHMgVG9nZ2xlQnV0dG9uPFNldHRpbmdzVG9nZ2xlQnV0dG9uQ29uZmlnPiB7XG5cbiAgcHJpdmF0ZSB2aXNpYmxlU2V0dGluZ3NQYW5lbHM6IFNldHRpbmdzUGFuZWxbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU2V0dGluZ3NUb2dnbGVCdXR0b25Db25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgaWYgKCFjb25maWcuc2V0dGluZ3NQYW5lbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBTZXR0aW5nc1BhbmVsIGlzIG1pc3NpbmcnKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXNldHRpbmdzdG9nZ2xlYnV0dG9uJyxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncycpLFxuICAgICAgc2V0dGluZ3NQYW5lbDogbnVsbCxcbiAgICAgIGF1dG9IaWRlV2hlbk5vQWN0aXZlU2V0dGluZ3M6IHRydWUsXG4gICAgICByb2xlOiAncG9wLXVwIGJ1dHRvbicsXG4gICAgfSwgPFNldHRpbmdzVG9nZ2xlQnV0dG9uQ29uZmlnPnRoaXMuY29uZmlnKTtcblxuICAgIC8qKlxuICAgICAqIFdDQUcyMCBzdGFuZGFyZCBkZWZpbmVzIHdoaWNoIHBvcHVwIG1lbnUgKGVsZW1lbnQgaWQpIGlzIG93bmVkIGJ5IHRoZSBidXR0b25cbiAgICAgKi9cbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hdHRyKCdhcmlhLW93bnMnLCBjb25maWcuc2V0dGluZ3NQYW5lbC5nZXRBY3RpdmVQYWdlKCkuZ2V0Q29uZmlnKCkuaWQpO1xuXG4gICAgLyoqXG4gICAgICogV0NBRzIwIHN0YW5kYXJkIGRlZmluZXMgdGhhdCBhIGJ1dHRvbiBoYXMgYSBwb3B1cCBtZW51IGJvdW5kIHRvIGl0XG4gICAgICovXG4gICAgdGhpcy5nZXREb21FbGVtZW50KCkuYXR0cignYXJpYS1oYXNwb3B1cCcsICd0cnVlJyk7XG5cbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBsZXQgc2V0dGluZ3NQYW5lbCA9IGNvbmZpZy5zZXR0aW5nc1BhbmVsO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBvbmx5IGhpZGUgb3RoZXIgYFNldHRpbmdzUGFuZWxgcyBpZiBhIG5ldyBvbmUgd2lsbCBiZSBvcGVuZWRcbiAgICAgIGlmICghc2V0dGluZ3NQYW5lbC5pc1Nob3duKCkpIHtcbiAgICAgICAgLy8gSGlkZSBhbGwgb3BlbiBTZXR0aW5nc1BhbmVscyBiZWZvcmUgb3BlbmluZyB0aGlzIGJ1dHRvbidzIHBhbmVsXG4gICAgICAgIC8vIChXZSBuZWVkIHRvIGl0ZXJhdGUgYSBjb3B5IGJlY2F1c2UgaGlkaW5nIHRoZW0gd2lsbCBhdXRvbWF0aWNhbGx5IHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGFycmF5XG4gICAgICAgIC8vIGR1ZSB0byB0aGUgc3Vic2NyaWJlT25jZSBhYm92ZSlcbiAgICAgICAgdGhpcy52aXNpYmxlU2V0dGluZ3NQYW5lbHMuc2xpY2UoKS5mb3JFYWNoKHNldHRpbmdzUGFuZWwgPT4gc2V0dGluZ3NQYW5lbC5oaWRlKCkpO1xuICAgICAgfVxuICAgICAgc2V0dGluZ3NQYW5lbC50b2dnbGVIaWRkZW4oKTtcbiAgICB9KTtcbiAgICBzZXR0aW5nc1BhbmVsLm9uU2hvdy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gU2V0IHRvZ2dsZSBzdGF0dXMgdG8gb24gd2hlbiB0aGUgc2V0dGluZ3MgcGFuZWwgc2hvd3NcbiAgICAgIHRoaXMub24oKTtcbiAgICB9KTtcbiAgICBzZXR0aW5nc1BhbmVsLm9uSGlkZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gU2V0IHRvZ2dsZSBzdGF0dXMgdG8gb2ZmIHdoZW4gdGhlIHNldHRpbmdzIHBhbmVsIGhpZGVzXG4gICAgICB0aGlzLm9mZigpO1xuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIHRoYXQgb25seSBvbmUgYFNldHRpbmdQYW5lbGAgaXMgdmlzaWJsZSBhdCBvbmNlXG4gICAgLy8gS2VlcCB0cmFjayBvZiBzaG93biBTZXR0aW5nc1BhbmVsc1xuICAgIHVpbWFuYWdlci5vbkNvbXBvbmVudFNob3cuc3Vic2NyaWJlKChzZW5kZXI6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+KSA9PiB7XG4gICAgICBpZiAoc2VuZGVyIGluc3RhbmNlb2YgU2V0dGluZ3NQYW5lbCkge1xuICAgICAgICB0aGlzLnZpc2libGVTZXR0aW5nc1BhbmVscy5wdXNoKHNlbmRlcik7XG4gICAgICAgIHNlbmRlci5vbkhpZGUuc3Vic2NyaWJlT25jZSgoKSA9PiBBcnJheVV0aWxzLnJlbW92ZSh0aGlzLnZpc2libGVTZXR0aW5nc1BhbmVscywgc2VuZGVyKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgYXV0b21hdGljIGhpZGluZyBvZiB0aGUgYnV0dG9uIGlmIHRoZXJlIGFyZSBubyBzZXR0aW5ncyBmb3IgdGhlIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aFxuICAgIGlmIChjb25maWcuYXV0b0hpZGVXaGVuTm9BY3RpdmVTZXR0aW5ncykge1xuICAgICAgLy8gU2V0dXAgaGFuZGxlciB0byBzaG93L2hpZGUgYnV0dG9uIHdoZW4gdGhlIHNldHRpbmdzIGNoYW5nZVxuICAgICAgbGV0IHNldHRpbmdzUGFuZWxJdGVtc0NoYW5nZWRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGluZ3NQYW5lbC5yb290UGFnZUhhc0FjdGl2ZVNldHRpbmdzKCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0hpZGRlbigpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNTaG93bigpKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvLyBXaXJlIHRoZSBoYW5kbGVyIHRvIHRoZSBldmVudFxuICAgICAgc2V0dGluZ3NQYW5lbC5vblNldHRpbmdzU3RhdGVDaGFuZ2VkLnN1YnNjcmliZShzZXR0aW5nc1BhbmVsSXRlbXNDaGFuZ2VkSGFuZGxlcik7XG4gICAgICAvLyBDYWxsIGhhbmRsZXIgZm9yIGZpcnN0IGluaXQgYXQgc3RhcnR1cFxuICAgICAgc2V0dGluZ3NQYW5lbEl0ZW1zQ2hhbmdlZEhhbmRsZXIoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7Q29tcG9uZW50LCBDb21wb25lbnRDb25maWd9IGZyb20gJy4vY29tcG9uZW50JztcblxuLyoqXG4gKiBBIGR1bW15IGNvbXBvbmVudCB0aGF0IGp1c3QgcmVzZXJ2ZXMgc29tZSBzcGFjZSBhbmQgZG9lcyBub3RoaW5nIGVsc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGFjZXIgZXh0ZW5kcyBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb21wb25lbnRDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXNwYWNlcicsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cblxuICBwcm90ZWN0ZWQgb25TaG93RXZlbnQoKTogdm9pZCB7XG4gICAgLy8gZGlzYWJsZSBldmVudCBmaXJpbmcgYnkgb3ZlcndyaXRpbmcgYW5kIG5vdCBjYWxsaW5nIHN1cGVyXG4gIH1cblxuICBwcm90ZWN0ZWQgb25IaWRlRXZlbnQoKTogdm9pZCB7XG4gICAgLy8gZGlzYWJsZSBldmVudCBmaXJpbmcgYnkgb3ZlcndyaXRpbmcgYW5kIG5vdCBjYWxsaW5nIHN1cGVyXG4gIH1cblxuICBwcm90ZWN0ZWQgb25Ib3ZlckNoYW5nZWRFdmVudChob3ZlcmVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gZGlzYWJsZSBldmVudCBmaXJpbmcgYnkgb3ZlcndyaXRpbmcgYW5kIG5vdCBjYWxsaW5nIHN1cGVyXG4gIH1cbn0iLCJpbXBvcnQge0xpc3RCb3h9IGZyb20gJy4vbGlzdGJveCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtTdWJ0aXRsZVN3aXRjaEhhbmRsZXJ9IGZyb20gJy4uL3N1YnRpdGxldXRpbHMnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcblxuLyoqXG4gKiBBIGVsZW1lbnQgdGhhdCBpcyBzaW1pbGFyIHRvIGEgc2VsZWN0IGJveCB3aGVyZSB0aGUgdXNlciBjYW4gc2VsZWN0IGEgc3VidGl0bGVcbiAqL1xuZXhwb3J0IGNsYXNzIFN1YnRpdGxlTGlzdEJveCBleHRlbmRzIExpc3RCb3gge1xuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBuZXcgU3VidGl0bGVTd2l0Y2hIYW5kbGVyKHBsYXllciwgdGhpcywgdWltYW5hZ2VyKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udGFpbmVyLCBDb250YWluZXJDb25maWcgfSBmcm9tICcuL2NvbnRhaW5lcic7XG5pbXBvcnQgeyBVSUluc3RhbmNlTWFuYWdlciB9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBMYWJlbCwgTGFiZWxDb25maWcgfSBmcm9tICcuL2xhYmVsJztcbmltcG9ydCB7IENvbXBvbmVudENvbmZpZywgQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udHJvbEJhciB9IGZyb20gJy4vY29udHJvbGJhcic7XG5pbXBvcnQgeyBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi9ldmVudGRpc3BhdGNoZXInO1xuaW1wb3J0IHsgRE9NLCBTaXplIH0gZnJvbSAnLi4vZG9tJztcbmltcG9ydCB7IFBsYXllckFQSSwgU3VidGl0bGVDdWVFdmVudCB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuaW1wb3J0IHsgVnR0VXRpbHMgfSBmcm9tICcuLi92dHR1dGlscyc7XG5pbXBvcnQgeyBWVFRQcm9wZXJ0aWVzIH0gZnJvbSAnYml0bW92aW4tcGxheWVyL3R5cGVzL3N1YnRpdGxlcy92dHQvQVBJJztcblxuLyoqXG4gKiBPdmVybGF5cyB0aGUgcGxheWVyIHRvIGRpc3BsYXkgc3VidGl0bGVzLlxuICovXG5leHBvcnQgY2xhc3MgU3VidGl0bGVPdmVybGF5IGV4dGVuZHMgQ29udGFpbmVyPENvbnRhaW5lckNvbmZpZz4ge1xuXG4gIHByaXZhdGUgc3VidGl0bGVNYW5hZ2VyOiBBY3RpdmVTdWJ0aXRsZU1hbmFnZXI7XG4gIHByaXZhdGUgcHJldmlld1N1YnRpdGxlQWN0aXZlOiBib29sZWFuO1xuICBwcml2YXRlIHByZXZpZXdTdWJ0aXRsZTogU3VidGl0bGVMYWJlbDtcblxuICBwcml2YXRlIHByZXByb2Nlc3NMYWJlbEV2ZW50Q2FsbGJhY2sgPSBuZXcgRXZlbnREaXNwYXRjaGVyPFN1YnRpdGxlQ3VlRXZlbnQsIFN1YnRpdGxlTGFiZWw+KCk7XG4gIHByaXZhdGUgc3VidGl0bGVDb250YWluZXJNYW5hZ2VyOiBTdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lck1hbmFnZXI7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xBU1NfQ09OVFJPTEJBUl9WSVNJQkxFID0gJ2NvbnRyb2xiYXItdmlzaWJsZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMQVNTX0NFQV82MDggPSAnY2VhNjA4JztcblxuICAvLyBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gYSBjZWE2MDggZ3JpZFxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDRUE2MDhfTlVNX1JPV1MgPSAxNTtcbiAgLy8gVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIGEgY2VhNjA4IGdyaWRcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0VBNjA4X05VTV9DT0xVTU5TID0gMzI7XG4gIC8vIFRoZSBvZmZzZXQgaW4gcGVyY2VudCBmb3Igb25lIHJvdyAod2hpY2ggaXMgYWxzbyB0aGUgaGVpZ2h0IG9mIGEgcm93KVxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDRUE2MDhfUk9XX09GRlNFVCA9IDEwMCAvIFN1YnRpdGxlT3ZlcmxheS5DRUE2MDhfTlVNX1JPV1M7XG4gIC8vIFRoZSBvZmZzZXQgaW4gcGVyY2VudCBmb3Igb25lIGNvbHVtbiAod2hpY2ggaXMgYWxzbyB0aGUgd2lkdGggb2YgYSBjb2x1bW4pXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENFQTYwOF9DT0xVTU5fT0ZGU0VUID0gMTAwIC8gU3VidGl0bGVPdmVybGF5LkNFQTYwOF9OVU1fQ09MVU1OUztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbnRhaW5lckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMucHJldmlld1N1YnRpdGxlQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5wcmV2aWV3U3VidGl0bGUgPSBuZXcgU3VidGl0bGVMYWJlbCh7IHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdzdWJ0aXRsZS5leGFtcGxlJykgfSk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXN1YnRpdGxlLW92ZXJsYXknLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgc3VidGl0bGVNYW5hZ2VyID0gbmV3IEFjdGl2ZVN1YnRpdGxlTWFuYWdlcigpO1xuICAgIHRoaXMuc3VidGl0bGVNYW5hZ2VyID0gc3VidGl0bGVNYW5hZ2VyO1xuXG4gICAgdGhpcy5zdWJ0aXRsZUNvbnRhaW5lck1hbmFnZXIgPSBuZXcgU3VidGl0bGVSZWdpb25Db250YWluZXJNYW5hZ2VyKHRoaXMpO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkN1ZUVudGVyLCAoZXZlbnQ6IFN1YnRpdGxlQ3VlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZW5lcmF0ZUxhYmVsKGV2ZW50KTtcbiAgICAgIHN1YnRpdGxlTWFuYWdlci5jdWVFbnRlcihldmVudCwgbGFiZWwpO1xuXG4gICAgICB0aGlzLnByZXByb2Nlc3NMYWJlbEV2ZW50Q2FsbGJhY2suZGlzcGF0Y2goZXZlbnQsIGxhYmVsKTtcblxuICAgICAgaWYgKHRoaXMucHJldmlld1N1YnRpdGxlQWN0aXZlKSB7XG4gICAgICAgIHRoaXMuc3VidGl0bGVDb250YWluZXJNYW5hZ2VyLnJlbW92ZUxhYmVsKHRoaXMucHJldmlld1N1YnRpdGxlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zaG93KCk7XG5cbiAgICAgIHRoaXMuc3VidGl0bGVDb250YWluZXJNYW5hZ2VyLmFkZExhYmVsKGxhYmVsLCB0aGlzLmdldERvbUVsZW1lbnQoKS5zaXplKCkpO1xuICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRzKCk7XG4gICAgfSk7XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQ3VlVXBkYXRlLCAoZXZlbnQ6IFN1YnRpdGxlQ3VlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZW5lcmF0ZUxhYmVsKGV2ZW50KTtcbiAgICAgIGNvbnN0IGxhYmVsVG9SZXBsYWNlID0gc3VidGl0bGVNYW5hZ2VyLmN1ZVVwZGF0ZShldmVudCwgbGFiZWwpO1xuXG4gICAgICB0aGlzLnByZXByb2Nlc3NMYWJlbEV2ZW50Q2FsbGJhY2suZGlzcGF0Y2goZXZlbnQsIGxhYmVsKTtcblxuICAgICAgaWYgKGxhYmVsVG9SZXBsYWNlKSB7XG4gICAgICAgIHRoaXMuc3VidGl0bGVDb250YWluZXJNYW5hZ2VyLnJlcGxhY2VMYWJlbChsYWJlbFRvUmVwbGFjZSwgbGFiZWwpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkN1ZUV4aXQsIChldmVudDogU3VidGl0bGVDdWVFdmVudCkgPT4ge1xuICAgICAgbGV0IGxhYmVsVG9SZW1vdmUgPSBzdWJ0aXRsZU1hbmFnZXIuY3VlRXhpdChldmVudCk7XG5cbiAgICAgIGlmIChsYWJlbFRvUmVtb3ZlKSB7XG4gICAgICAgIHRoaXMuc3VidGl0bGVDb250YWluZXJNYW5hZ2VyLnJlbW92ZUxhYmVsKGxhYmVsVG9SZW1vdmUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudHMoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdWJ0aXRsZU1hbmFnZXIuaGFzQ3Vlcykge1xuICAgICAgICBpZiAoIXRoaXMucHJldmlld1N1YnRpdGxlQWN0aXZlKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdWJ0aXRsZUNvbnRhaW5lck1hbmFnZXIuYWRkTGFiZWwodGhpcy5wcmV2aWV3U3VidGl0bGUpO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgc3VidGl0bGVDbGVhckhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHRoaXMuc3VidGl0bGVDb250YWluZXJNYW5hZ2VyLmNsZWFyKCk7XG4gICAgICBzdWJ0aXRsZU1hbmFnZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50cygpO1xuICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRzKCk7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BdWRpb0NoYW5nZWQsIHN1YnRpdGxlQ2xlYXJIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3VidGl0bGVFbmFibGVkLCBzdWJ0aXRsZUNsZWFySGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlN1YnRpdGxlRGlzYWJsZWQsIHN1YnRpdGxlQ2xlYXJIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU2Vlaywgc3VidGl0bGVDbGVhckhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lU2hpZnQsIHN1YnRpdGxlQ2xlYXJIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWJhY2tGaW5pc2hlZCwgc3VidGl0bGVDbGVhckhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgc3VidGl0bGVDbGVhckhhbmRsZXIpO1xuXG4gICAgdWltYW5hZ2VyLm9uQ29tcG9uZW50U2hvdy5zdWJzY3JpYmUoKGNvbXBvbmVudDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4pID0+IHtcbiAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBDb250cm9sQmFyKSB7XG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKFN1YnRpdGxlT3ZlcmxheS5DTEFTU19DT05UUk9MQkFSX1ZJU0lCTEUpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1aW1hbmFnZXIub25Db21wb25lbnRIaWRlLnN1YnNjcmliZSgoY29tcG9uZW50OiBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPikgPT4ge1xuICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbnRyb2xCYXIpIHtcbiAgICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoU3VidGl0bGVPdmVybGF5LkNMQVNTX0NPTlRST0xCQVJfVklTSUJMRSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5jb25maWd1cmVDZWE2MDhDYXB0aW9ucyhwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgLy8gSW5pdFxuICAgIHN1YnRpdGxlQ2xlYXJIYW5kbGVyKCk7XG4gIH1cblxuICBnZW5lcmF0ZUxhYmVsKGV2ZW50OiBTdWJ0aXRsZUN1ZUV2ZW50KTogU3VidGl0bGVMYWJlbCB7XG4gICAgLy8gU2FuaXRpemUgY3VlIGRhdGEgKG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGN1ZSBJRCBpcyBnZW5lcmF0ZWQgaW4gc3VidGl0bGVNYW5hZ2VyLmN1ZUVudGVyIC8gdXBkYXRlKVxuICAgIGlmIChldmVudC5wb3NpdGlvbikge1xuICAgICAgLy8gU29tZXRpbWVzIHRoZSBwb3NpdGlvbnMgYXJlIHVuZGVmaW5lZCwgd2UgYXNzdW1lIHRoZW0gdG8gYmUgemVyb1xuICAgICAgZXZlbnQucG9zaXRpb24ucm93ID0gZXZlbnQucG9zaXRpb24ucm93IHx8IDA7XG4gICAgICBldmVudC5wb3NpdGlvbi5jb2x1bW4gPSBldmVudC5wb3NpdGlvbi5jb2x1bW4gfHwgMDtcbiAgICB9XG5cbiAgICBjb25zdCBsYWJlbCA9IG5ldyBTdWJ0aXRsZUxhYmVsKHtcbiAgICAgIC8vIFByZWZlciB0aGUgSFRNTCBzdWJ0aXRsZSB0ZXh0IGlmIHNldCwgZWxzZSB0cnkgZ2VuZXJhdGluZyBhIGltYWdlIHRhZyBhcyBzdHJpbmcgZnJvbSB0aGUgaW1hZ2UgYXR0cmlidXRlLFxuICAgICAgLy8gZWxzZSB1c2UgdGhlIHBsYWluIHRleHRcbiAgICAgIHRleHQ6IGV2ZW50Lmh0bWwgfHwgQWN0aXZlU3VidGl0bGVNYW5hZ2VyLmdlbmVyYXRlSW1hZ2VUYWdUZXh0KGV2ZW50LmltYWdlKSB8fCBldmVudC50ZXh0LFxuICAgICAgdnR0OiBldmVudC52dHQsXG4gICAgICByZWdpb246IGV2ZW50LnJlZ2lvbixcbiAgICAgIHJlZ2lvblN0eWxlOiBldmVudC5yZWdpb25TdHlsZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIGNvbmZpZ3VyZUNlYTYwOENhcHRpb25zKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgLy8gVGhlIGNhbGN1bGF0ZWQgZm9udCBzaXplXG4gICAgbGV0IGZvbnRTaXplID0gMDtcbiAgICAvLyBUaGUgcmVxdWlyZWQgbGV0dGVyIHNwYWNpbmcgc3ByZWFkIHRoZSB0ZXh0IGNoYXJhY3RlcnMgZXZlbmx5IGFjcm9zcyB0aGUgZ3JpZFxuICAgIGxldCBmb250TGV0dGVyU3BhY2luZyA9IDA7XG4gICAgLy8gRmxhZyB0ZWxsaW5nIGlmIGEgZm9udCBzaXplIGNhbGN1bGF0aW9uIGlzIHJlcXVpcmVkIG9mIGlmIHRoZSBjdXJyZW50IHZhbHVlcyBhcmUgdmFsaWRcbiAgICBsZXQgZm9udFNpemVDYWxjdWxhdGlvblJlcXVpcmVkID0gdHJ1ZTtcbiAgICAvLyBGbGFnIHRlbGxpbmcgaWYgdGhlIENFQS02MDggbW9kZSBpcyBlbmFibGVkXG4gICAgbGV0IGVuYWJsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHVwZGF0ZUNFQTYwOEZvbnRTaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgZHVtbXlMYWJlbCA9IG5ldyBTdWJ0aXRsZUxhYmVsKHsgdGV4dDogJ1gnIH0pO1xuICAgICAgZHVtbXlMYWJlbC5nZXREb21FbGVtZW50KCkuY3NzKHtcbiAgICAgICAgLy8gQnkgdXNpbmcgYSBsYXJnZSBmb250IHNpemUgd2UgZG8gbm90IG5lZWQgdG8gdXNlIG11bHRpcGxlIGxldHRlcnMgYW5kIGNhbiBnZXQgc3RpbGwgYW5cbiAgICAgICAgLy8gYWNjdXJhdGUgbWVhc3VyZW1lbnQgZXZlbiB0aG91Z2ggdGhlIHJldHVybmVkIHNpemUgaXMgYW4gaW50ZWdlciB2YWx1ZVxuICAgICAgICAnZm9udC1zaXplJzogJzIwMHB4JyxcbiAgICAgICAgJ2xpbmUtaGVpZ2h0JzogJzIwMHB4JyxcbiAgICAgICAgJ3Zpc2liaWxpdHknOiAnaGlkZGVuJyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRDb21wb25lbnQoZHVtbXlMYWJlbCk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudHMoKTtcbiAgICAgIHRoaXMuc2hvdygpO1xuXG4gICAgICBjb25zdCBkdW1teUxhYmVsQ2hhcldpZHRoID0gZHVtbXlMYWJlbC5nZXREb21FbGVtZW50KCkud2lkdGgoKTtcbiAgICAgIGNvbnN0IGR1bW15TGFiZWxDaGFySGVpZ2h0ID0gZHVtbXlMYWJlbC5nZXREb21FbGVtZW50KCkuaGVpZ2h0KCk7XG4gICAgICBjb25zdCBmb250U2l6ZVJhdGlvID0gZHVtbXlMYWJlbENoYXJXaWR0aCAvIGR1bW15TGFiZWxDaGFySGVpZ2h0O1xuXG4gICAgICB0aGlzLnJlbW92ZUNvbXBvbmVudChkdW1teUxhYmVsKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50cygpO1xuICAgICAgaWYgKCF0aGlzLnN1YnRpdGxlTWFuYWdlci5oYXNDdWVzKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBzdWJ0cmFjdCAxcHggaGVyZSB0byBhdm9pZCBsaW5lIGJyZWFrcyBhdCB0aGUgcmlnaHQgYm9yZGVyIG9mIHRoZSBzdWJ0aXRsZSBvdmVybGF5IHRoYXQgY2FuIGhhcHBlblxuICAgICAgLy8gd2hlbiB0ZXh0cyBjb250YWluIHdoaXRlc3BhY2VzLiBJdCdzIHByb2JhYmx5IHNvbWUga2luZCBvZiBwaXhlbCByb3VuZGluZyBpc3N1ZSBpbiB0aGUgYnJvd3NlcidzXG4gICAgICAvLyBsYXlvdXRpbmcsIGJ1dCB0aGUgYWN0dWFsIHJlYXNvbiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gQWltaW5nIGZvciBhIHRhcmdldCB3aWR0aCAtIDFweCB3b3VsZCB3b3JrIGluXG4gICAgICAvLyBtb3N0IGJyb3dzZXJzLCBidXQgU2FmYXJpIGhhcyBhIFwicXVhbnRpemVkXCIgZm9udCBzaXplIHJlbmRlcmluZyB3aXRoIGh1Z2Ugc3RlcHMgaW4gYmV0d2VlbiBzbyB3ZSBuZWVkXG4gICAgICAvLyB0byBzdWJ0cmFjdCBzb21lIG1vcmUgcGl4ZWxzIHRvIGF2b2lkIGxpbmUgYnJlYWtzIHRoZXJlIGFzIHdlbGwuXG4gICAgICBjb25zdCBzdWJ0aXRsZU92ZXJsYXlXaWR0aCA9IHRoaXMuZ2V0RG9tRWxlbWVudCgpLndpZHRoKCkgLSAxMDtcbiAgICAgIGNvbnN0IHN1YnRpdGxlT3ZlcmxheUhlaWdodCA9IHRoaXMuZ2V0RG9tRWxlbWVudCgpLmhlaWdodCgpO1xuXG4gICAgICAvLyBUaGUgc2l6ZSByYXRpbyBvZiB0aGUgbGV0dGVyIGdyaWRcbiAgICAgIGNvbnN0IGZvbnRHcmlkU2l6ZVJhdGlvID0gKGR1bW15TGFiZWxDaGFyV2lkdGggKiBTdWJ0aXRsZU92ZXJsYXkuQ0VBNjA4X05VTV9DT0xVTU5TKSAvXG4gICAgICAgIChkdW1teUxhYmVsQ2hhckhlaWdodCAqIFN1YnRpdGxlT3ZlcmxheS5DRUE2MDhfTlVNX1JPV1MpO1xuICAgICAgLy8gVGhlIHNpemUgcmF0aW8gb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBmb3IgdGhlIGdyaWRcbiAgICAgIGNvbnN0IHN1YnRpdGxlT3ZlcmxheVNpemVSYXRpbyA9IHN1YnRpdGxlT3ZlcmxheVdpZHRoIC8gc3VidGl0bGVPdmVybGF5SGVpZ2h0O1xuXG4gICAgICBpZiAoc3VidGl0bGVPdmVybGF5U2l6ZVJhdGlvID4gZm9udEdyaWRTaXplUmF0aW8pIHtcbiAgICAgICAgLy8gV2hlbiB0aGUgYXZhaWxhYmxlIHNwYWNlIGlzIHdpZGVyIHRoYW4gdGhlIHRleHQgZ3JpZCwgdGhlIGZvbnQgc2l6ZSBpcyBzaW1wbHlcbiAgICAgICAgLy8gZGV0ZXJtaW5lZCBieSB0aGUgaGVpZ2h0IG9mIHRoZSBhdmFpbGFibGUgc3BhY2UuXG4gICAgICAgIGZvbnRTaXplID0gc3VidGl0bGVPdmVybGF5SGVpZ2h0IC8gU3VidGl0bGVPdmVybGF5LkNFQTYwOF9OVU1fUk9XUztcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGFkZGl0aW9uYWwgbGV0dGVyIHNwYWNpbmcgcmVxdWlyZWQgdG8gZXZlbmx5IHNwcmVhZCB0aGUgdGV4dCBhY3Jvc3MgdGhlIGdyaWQncyB3aWR0aFxuICAgICAgICBjb25zdCBncmlkU2xvdFdpZHRoID0gc3VidGl0bGVPdmVybGF5V2lkdGggLyBTdWJ0aXRsZU92ZXJsYXkuQ0VBNjA4X05VTV9DT0xVTU5TO1xuICAgICAgICBjb25zdCBmb250Q2hhcldpZHRoID0gZm9udFNpemUgKiBmb250U2l6ZVJhdGlvO1xuICAgICAgICBmb250TGV0dGVyU3BhY2luZyA9IGdyaWRTbG90V2lkdGggLSBmb250Q2hhcldpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2hlbiB0aGUgYXZhaWxhYmxlIHNwYWNlIGlzIG5vdCB3aWRlIGVub3VnaCwgdGV4dHMgd291bGQgdmVydGljYWxseSBvdmVybGFwIGlmIHdlIHRha2VcbiAgICAgICAgLy8gdGhlIGhlaWdodCBhcyBhIGJhc2UgZm9yIHRoZSBmb250IHNpemUsIHNvIHdlIG5lZWQgdG8gbGltaXQgdGhlIGhlaWdodC4gV2UgZG8gdGhhdFxuICAgICAgICAvLyBieSBkZXRlcm1pbmluZyB0aGUgZm9udCBzaXplIGJ5IHRoZSB3aWR0aCBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlLlxuICAgICAgICBmb250U2l6ZSA9IHN1YnRpdGxlT3ZlcmxheVdpZHRoIC8gU3VidGl0bGVPdmVybGF5LkNFQTYwOF9OVU1fQ09MVU1OUyAvIGZvbnRTaXplUmF0aW87XG4gICAgICAgIGZvbnRMZXR0ZXJTcGFjaW5nID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGZvbnQtc2l6ZSBvZiBhbGwgYWN0aXZlIHN1YnRpdGxlIGxhYmVsc1xuICAgICAgZm9yIChsZXQgbGFiZWwgb2YgdGhpcy5nZXRDb21wb25lbnRzKCkpIHtcbiAgICAgICAgaWYgKGxhYmVsIGluc3RhbmNlb2YgU3VidGl0bGVMYWJlbCkge1xuICAgICAgICAgIGxhYmVsLmdldERvbUVsZW1lbnQoKS5jc3Moe1xuICAgICAgICAgICAgJ2ZvbnQtc2l6ZSc6IGAke2ZvbnRTaXplfXB4YCxcbiAgICAgICAgICAgICdsZXR0ZXItc3BhY2luZyc6IGAke2ZvbnRMZXR0ZXJTcGFjaW5nfXB4YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWVyUmVzaXplZCwgKCkgPT4ge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdXBkYXRlQ0VBNjA4Rm9udFNpemUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvbnRTaXplQ2FsY3VsYXRpb25SZXF1aXJlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnByZXByb2Nlc3NMYWJlbEV2ZW50Q2FsbGJhY2suc3Vic2NyaWJlKChldmVudDogU3VidGl0bGVDdWVFdmVudCwgbGFiZWw6IFN1YnRpdGxlTGFiZWwpID0+IHtcbiAgICAgIGNvbnN0IGlzQ0VBNjA4ID0gZXZlbnQucG9zaXRpb24gIT0gbnVsbDtcbiAgICAgIGlmICghaXNDRUE2MDgpIHtcbiAgICAgICAgLy8gU2tpcCBhbGwgbm9uLUNFQTYwOCBjdWVzXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICAgIGVuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhTdWJ0aXRsZU92ZXJsYXkuQ0xBU1NfQ0VBXzYwOCkpO1xuXG4gICAgICAgIC8vIFdlIGNvbmRpdGlvbmFsbHkgdXBkYXRlIHRoZSBmb250IHNpemUgYnkgdGhpcyBmbGFnIGhlcmUgdG8gYXZvaWQgdXBkYXRpbmcgZXZlcnkgdGltZSBhIHN1YnRpdGxlXG4gICAgICAgIC8vIGlzIGFkZGVkIGludG8gYW4gZW1wdHkgb3ZlcmxheS4gQmVjYXVzZSB3ZSByZXNldCB0aGUgb3ZlcmxheSB3aGVuIGFsbCBzdWJ0aXRsZXMgYXJlIGdvbmUsIHRoaXNcbiAgICAgICAgLy8gd291bGQgdHJpZ2dlciBhbiB1bm5lY2Vzc2FyeSB1cGRhdGUgZXZlcnkgdGltZSwgYnV0IGl0J3Mgb25seSByZXF1aXJlZCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsXG4gICAgICAgIC8vIGUuZy4gYWZ0ZXIgdGhlIHBsYXllciBzaXplIGhhcyBjaGFuZ2VkLlxuICAgICAgICBpZiAoZm9udFNpemVDYWxjdWxhdGlvblJlcXVpcmVkKSB7XG4gICAgICAgICAgdXBkYXRlQ0VBNjA4Rm9udFNpemUoKTtcbiAgICAgICAgICBmb250U2l6ZUNhbGN1bGF0aW9uUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYWJlbC5nZXREb21FbGVtZW50KCkuY3NzKHtcbiAgICAgICAgJ2xlZnQnOiBgJHtldmVudC5wb3NpdGlvbi5jb2x1bW4gKiBTdWJ0aXRsZU92ZXJsYXkuQ0VBNjA4X0NPTFVNTl9PRkZTRVR9JWAsXG4gICAgICAgICd0b3AnOiBgJHtldmVudC5wb3NpdGlvbi5yb3cgKiBTdWJ0aXRsZU92ZXJsYXkuQ0VBNjA4X1JPV19PRkZTRVR9JWAsXG4gICAgICAgICdmb250LXNpemUnOiBgJHtmb250U2l6ZX1weGAsXG4gICAgICAgICdsZXR0ZXItc3BhY2luZyc6IGAke2ZvbnRMZXR0ZXJTcGFjaW5nfXB4YCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhTdWJ0aXRsZU92ZXJsYXkuQ0xBU1NfQ0VBXzYwOCkpO1xuICAgICAgZW5hYmxlZCA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQ3VlRXhpdCwgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnN1YnRpdGxlTWFuYWdlci5oYXNDdWVzKSB7XG4gICAgICAgIC8vIERpc2FibGUgQ0VBLTYwOCBtb2RlIHdoZW4gYWxsIHN1YnRpdGxlcyBhcmUgZ29uZSAodG8gYWxsb3cgY29ycmVjdCBmb3JtYXR0aW5nIGFuZFxuICAgICAgICAvLyBkaXNwbGF5IG9mIG90aGVyIHR5cGVzIG9mIHN1YnRpdGxlcywgZS5nLiB0aGUgZm9ybWF0dGluZyBwcmV2aWV3IHN1YnRpdGxlKVxuICAgICAgICByZXNldCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZVVubG9hZGVkLCByZXNldCk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlN1YnRpdGxlRW5hYmxlZCwgcmVzZXQpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TdWJ0aXRsZURpc2FibGVkLCByZXNldCk7XG4gIH1cblxuICBlbmFibGVQcmV2aWV3U3VidGl0bGVMYWJlbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3VidGl0bGVNYW5hZ2VyLmhhc0N1ZXMpIHtcbiAgICAgIHRoaXMucHJldmlld1N1YnRpdGxlQWN0aXZlID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3VidGl0bGVDb250YWluZXJNYW5hZ2VyLmFkZExhYmVsKHRoaXMucHJldmlld1N1YnRpdGxlKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50cygpO1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlUHJldmlld1N1YnRpdGxlTGFiZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJldmlld1N1YnRpdGxlQWN0aXZlKSB7XG4gICAgICB0aGlzLnByZXZpZXdTdWJ0aXRsZUFjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zdWJ0aXRsZUNvbnRhaW5lck1hbmFnZXIucmVtb3ZlTGFiZWwodGhpcy5wcmV2aWV3U3VidGl0bGUpO1xuICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRzKCk7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBBY3RpdmVTdWJ0aXRsZUN1ZSB7XG4gIGV2ZW50OiBTdWJ0aXRsZUN1ZUV2ZW50O1xuICBsYWJlbDogU3VidGl0bGVMYWJlbDtcbn1cblxuaW50ZXJmYWNlIEFjdGl2ZVN1YnRpdGxlQ3VlTWFwIHtcbiAgW2lkOiBzdHJpbmddOiBBY3RpdmVTdWJ0aXRsZUN1ZVtdO1xufVxuXG5pbnRlcmZhY2UgU3VidGl0bGVMYWJlbENvbmZpZyBleHRlbmRzIExhYmVsQ29uZmlnIHtcbiAgdnR0PzogVlRUUHJvcGVydGllcztcbiAgcmVnaW9uPzogc3RyaW5nO1xuICByZWdpb25TdHlsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFN1YnRpdGxlTGFiZWwgZXh0ZW5kcyBMYWJlbDxTdWJ0aXRsZUxhYmVsQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdWJ0aXRsZUxhYmVsQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1zdWJ0aXRsZS1sYWJlbCcsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgZ2V0IHZ0dCgpOiBWVFRQcm9wZXJ0aWVzIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudnR0O1xuICB9XG5cbiAgZ2V0IHJlZ2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZWdpb247XG4gIH1cblxuICBnZXQgcmVnaW9uU3R5bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVnaW9uU3R5bGU7XG4gIH1cbn1cblxuY2xhc3MgQWN0aXZlU3VidGl0bGVNYW5hZ2VyIHtcblxuICBwcml2YXRlIGFjdGl2ZVN1YnRpdGxlQ3VlTWFwOiBBY3RpdmVTdWJ0aXRsZUN1ZU1hcDtcbiAgcHJpdmF0ZSBhY3RpdmVTdWJ0aXRsZUN1ZUNvdW50OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hY3RpdmVTdWJ0aXRsZUN1ZU1hcCA9IHt9O1xuICAgIHRoaXMuYWN0aXZlU3VidGl0bGVDdWVDb3VudCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBhIHVuaXF1ZSBJRCBmb3IgYSBzdWJ0aXRsZSBjdWUsIHdoaWNoIGlzIG5lZWRlZCB0byBhc3NvY2lhdGUgYW4gQ3VlRW50ZXIgd2l0aCBpdHMgQ3VlRXhpdFxuICAgKiBldmVudCBzbyB3ZSBjYW4gcmVtb3ZlIHRoZSBjb3JyZWN0IHN1YnRpdGxlIGluIEN1ZUV4aXQgd2hlbiBtdWx0aXBsZSBzdWJ0aXRsZXMgYXJlIGFjdGl2ZSBhdCB0aGUgc2FtZSB0aW1lLlxuICAgKiBUaGUgc3RhcnQgdGltZSBwbHVzIHRoZSB0ZXh0IHNob3VsZCBtYWtlIGEgdW5pcXVlIGlkZW50aWZpZXIsIGFuZCBpbiB0aGUgb25seSBjYXNlIHdoZXJlIGEgY29sbGlzaW9uXG4gICAqIGNhbiBoYXBwZW4sIHR3byBzaW1pbGFyIHRleHRzIHdpbGwgYmUgZGlzcGxheWVkIGF0IGEgc2ltaWxhciB0aW1lIGFuZCBhIHNpbWlsYXIgcG9zaXRpb24gKG9yIHdpdGhvdXQgcG9zaXRpb24pLlxuICAgKiBUaGUgc3RhcnQgdGltZSBzaG91bGQgYWx3YXlzIGJlIGtub3duLCBiZWNhdXNlIGl0IGlzIHJlcXVpcmVkIHRvIHNjaGVkdWxlIHRoZSBDdWVFbnRlciBldmVudC4gVGhlIGVuZCB0aW1lXG4gICAqIG11c3Qgbm90IG5lY2Vzc2FyaWx5IGJlIGtub3duIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIHVzZWQgZm9yIHRoZSBJRC5cbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNhbGN1bGF0ZUlkKGV2ZW50OiBTdWJ0aXRsZUN1ZUV2ZW50KTogc3RyaW5nIHtcbiAgICBsZXQgaWQgPSBldmVudC5zdGFydCArICctJyArIGV2ZW50LnRleHQ7XG5cbiAgICBpZiAoZXZlbnQucG9zaXRpb24pIHtcbiAgICAgIGlkICs9ICctJyArIGV2ZW50LnBvc2l0aW9uLnJvdyArICctJyArIGV2ZW50LnBvc2l0aW9uLmNvbHVtbjtcbiAgICB9XG5cbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICBjdWVFbnRlcihldmVudDogU3VidGl0bGVDdWVFdmVudCwgbGFiZWw6IFN1YnRpdGxlTGFiZWwpOiB2b2lkIHtcbiAgICB0aGlzLmFkZEN1ZVRvTWFwKGV2ZW50LCBsYWJlbCk7XG4gIH1cblxuICBjdWVVcGRhdGUoZXZlbnQ6IFN1YnRpdGxlQ3VlRXZlbnQsIGxhYmVsOiBTdWJ0aXRsZUxhYmVsKTogU3VidGl0bGVMYWJlbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbGFiZWxUb1JlcGxhY2UgPSB0aGlzLnBvcEN1ZUZyb21NYXAoZXZlbnQpO1xuXG4gICAgaWYgKGxhYmVsVG9SZXBsYWNlKSB7XG4gICAgICB0aGlzLmFkZEN1ZVRvTWFwKGV2ZW50LCBsYWJlbCk7XG4gICAgICByZXR1cm4gbGFiZWxUb1JlcGxhY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ3VlVG9NYXAoZXZlbnQ6IFN1YnRpdGxlQ3VlRXZlbnQsIGxhYmVsOiBTdWJ0aXRsZUxhYmVsKTogdm9pZCB7XG4gICAgbGV0IGlkID0gQWN0aXZlU3VidGl0bGVNYW5hZ2VyLmNhbGN1bGF0ZUlkKGV2ZW50KTtcblxuICAgIC8vIENyZWF0ZSBhcnJheSBmb3IgaWQgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICB0aGlzLmFjdGl2ZVN1YnRpdGxlQ3VlTWFwW2lkXSA9IHRoaXMuYWN0aXZlU3VidGl0bGVDdWVNYXBbaWRdIHx8IFtdO1xuXG4gICAgLy8gQWRkIGN1ZVxuICAgIHRoaXMuYWN0aXZlU3VidGl0bGVDdWVNYXBbaWRdLnB1c2goeyBldmVudCwgbGFiZWwgfSk7XG4gICAgdGhpcy5hY3RpdmVTdWJ0aXRsZUN1ZUNvdW50Kys7XG4gIH1cblxuICBwcml2YXRlIHBvcEN1ZUZyb21NYXAoZXZlbnQ6IFN1YnRpdGxlQ3VlRXZlbnQpOiBTdWJ0aXRsZUxhYmVsIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaWQgPSBBY3RpdmVTdWJ0aXRsZU1hbmFnZXIuY2FsY3VsYXRlSWQoZXZlbnQpO1xuICAgIGxldCBhY3RpdmVTdWJ0aXRsZUN1ZXMgPSB0aGlzLmFjdGl2ZVN1YnRpdGxlQ3VlTWFwW2lkXTtcblxuICAgIGlmIChhY3RpdmVTdWJ0aXRsZUN1ZXMgJiYgYWN0aXZlU3VidGl0bGVDdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFJlbW92ZSBjdWVcbiAgICAgIC8qIFdlIGFwcGx5IHRoZSBGSUZPIGFwcHJvYWNoIGhlcmUgYW5kIHJlbW92ZSB0aGUgb2xkZXN0IGN1ZSBmcm9tIHRoZSBhc3NvY2lhdGVkIGlkLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBjdWVzXG4gICAgICAgKiB3aXRoIHRoZSBzYW1lIGlkLCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGljaCBvbmUgb2YgdGhlIGN1ZXMgaXMgdG8gYmUgZGVsZXRlZCwgc28gd2UganVzdCBob3BlIHRoYXQgRklGT1xuICAgICAgICogd29ya3MgZmluZS4gVGhlb3JldGljYWxseSBpdCBjYW4gaGFwcGVuIHRoYXQgdHdvIGN1ZXMgd2l0aCBjb2xsaWRpbmcgaWRzIGFyZSByZW1vdmVkIGF0IGRpZmZlcmVudCB0aW1lcywgaW5cbiAgICAgICAqIHRoZSB3cm9uZyBvcmRlci4gVGhpcyByYXJlIGNhc2UgaGFzIHlldCB0byBiZSBvYnNlcnZlZC4gSWYgaXQgZXZlciBnZXRzIGFuIGlzc3VlLCB3ZSBjYW4gdGFrZSB0aGUgdW5zdGFibGVcbiAgICAgICAqIGN1ZSBlbmQgdGltZSAod2hpY2ggY2FuIGNoYW5nZSBiZXR3ZWVuIEN1ZUVudGVyIGFuZCBDdWVFeGl0IElOIEN1ZVVwZGF0ZSkgYW5kIHVzZSBpdCBhcyBhblxuICAgICAgICogYWRkaXRpb25hbCBoaW50IHRvIHRyeSBhbmQgcmVtb3ZlIHRoZSBjb3JyZWN0IG9uZSBvZiB0aGUgY29sbGlkaW5nIGN1ZXMuXG4gICAgICAgKi9cbiAgICAgIGxldCBhY3RpdmVTdWJ0aXRsZUN1ZSA9IGFjdGl2ZVN1YnRpdGxlQ3Vlcy5zaGlmdCgpO1xuICAgICAgdGhpcy5hY3RpdmVTdWJ0aXRsZUN1ZUNvdW50LS07XG5cbiAgICAgIHJldHVybiBhY3RpdmVTdWJ0aXRsZUN1ZS5sYWJlbDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2VuZXJhdGVJbWFnZVRhZ1RleHQoaW1hZ2VEYXRhOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghaW1hZ2VEYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW1nVGFnID0gbmV3IERPTSgnaW1nJywge1xuICAgICAgc3JjOiBpbWFnZURhdGEsXG4gICAgfSk7XG4gICAgaW1nVGFnLmNzcygnd2lkdGgnLCAnMTAwJScpO1xuICAgIHJldHVybiBpbWdUYWcuZ2V0KDApLm91dGVySFRNTDsgLy8gcmV0dXJuIHRoZSBodG1sIGFzIHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhYmVsIGFzc29jaWF0ZWQgd2l0aCBhbiBhbHJlYWR5IGFkZGVkIGN1ZS5cbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEByZXR1cm4ge1N1YnRpdGxlTGFiZWx9XG4gICAqL1xuICBnZXRDdWVzKGV2ZW50OiBTdWJ0aXRsZUN1ZUV2ZW50KTogU3VidGl0bGVMYWJlbFtdIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaWQgPSBBY3RpdmVTdWJ0aXRsZU1hbmFnZXIuY2FsY3VsYXRlSWQoZXZlbnQpO1xuICAgIGxldCBhY3RpdmVTdWJ0aXRsZUN1ZXMgPSB0aGlzLmFjdGl2ZVN1YnRpdGxlQ3VlTWFwW2lkXTtcbiAgICBpZiAoYWN0aXZlU3VidGl0bGVDdWVzICYmIGFjdGl2ZVN1YnRpdGxlQ3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYWN0aXZlU3VidGl0bGVDdWVzLm1hcCgoY3VlKSA9PiBjdWUubGFiZWwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzdWJ0aXRsZSBjdWUgZnJvbSB0aGUgbWFuYWdlciBhbmQgcmV0dXJucyB0aGUgbGFiZWwgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzdWJ0aXRsZSBvdmVybGF5LFxuICAgKiBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgbGFiZWwgZXhpc3RpbmcgKGUuZy4gYmVjYXVzZSBhbGwgbGFiZWxzIGhhdmUgYmVlbiB7QGxpbmsgI2NsZWFyIGNsZWFyZWR9LlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHJldHVybiB7U3VidGl0bGVMYWJlbHxudWxsfVxuICAgKi9cbiAgY3VlRXhpdChldmVudDogU3VidGl0bGVDdWVFdmVudCk6IFN1YnRpdGxlTGFiZWwge1xuICAgIHJldHVybiB0aGlzLnBvcEN1ZUZyb21NYXAoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhY3RpdmUgc3VidGl0bGUgY3Vlcy5cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGN1ZUNvdW50KCk6IG51bWJlciB7XG4gICAgLy8gV2UgZXhwbGljaXRseSBjb3VudCB0aGUgY3VlcyB0byBzYXZlIGFuIEFycmF5LnJlZHVjZSBvbiBldmVyeSBjdWVDb3VudCBjYWxsICh3aGljaCBjYW4gaGFwcGVuIGZyZXF1ZW50bHkpXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlU3VidGl0bGVDdWVDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFjdGl2ZSBzdWJ0aXRsZSBjdWVzLCBlbHNlIGZhbHNlLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGhhc0N1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VlQ291bnQgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIHN1YnRpdGxlIGN1ZXMgZnJvbSB0aGUgbWFuYWdlci5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlU3VidGl0bGVDdWVNYXAgPSB7fTtcbiAgICB0aGlzLmFjdGl2ZVN1YnRpdGxlQ3VlQ291bnQgPSAwO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lck1hbmFnZXIge1xuICBwcml2YXRlIHN1YnRpdGxlUmVnaW9uQ29udGFpbmVyczogeyBbcmVnaW9uTmFtZTogc3RyaW5nXTogU3VidGl0bGVSZWdpb25Db250YWluZXIgfSA9IHt9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3VidGl0bGVPdmVybGF5IFJlZmVyZW5jZSB0byB0aGUgc3VidGl0bGUgb3ZlcmxheSBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyB0aGUgY29udGFpbmVycy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3VidGl0bGVPdmVybGF5OiBTdWJ0aXRsZU92ZXJsYXkpIHtcbiAgICB0aGlzLnN1YnRpdGxlT3ZlcmxheSA9IHN1YnRpdGxlT3ZlcmxheTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVnaW9uKGxhYmVsOiBTdWJ0aXRsZUxhYmVsKTogeyByZWdpb25Db250YWluZXJJZDogc3RyaW5nLCByZWdpb25OYW1lOiBzdHJpbmcgfSB7XG4gICAgaWYgKGxhYmVsLnZ0dCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVnaW9uQ29udGFpbmVySWQ6IGxhYmVsLnZ0dC5yZWdpb24gJiYgbGFiZWwudnR0LnJlZ2lvbi5pZCA/IGxhYmVsLnZ0dC5yZWdpb24uaWQgOiAndnR0JyxcbiAgICAgICAgcmVnaW9uTmFtZTogJ3Z0dCcsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWdpb25Db250YWluZXJJZDogbGFiZWwucmVnaW9uIHx8ICdkZWZhdWx0JyxcbiAgICAgIHJlZ2lvbk5hbWU6IGxhYmVsLnJlZ2lvbiB8fCAnZGVmYXVsdCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCB3cmFwcyBhIHN1YnRpdGxlIGxhYmVsIGludG8gYSBjb250YWluZXIgZGl2IGJhc2VkIG9uIHRoZSBzdWJ0aXRsZSByZWdpb24uXG4gICAqIElmIHRoZSBzdWJ0aXRsZSBoYXMgcG9zaXRpb25pbmcgaW5mb3JtYXRpb24gaXQgaXMgYWRkZWQgdG8gdGhlIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIGxhYmVsIFRoZSBzdWJ0aXRsZSBsYWJlbCB0byB3cmFwXG4gICAqL1xuICBhZGRMYWJlbChsYWJlbDogU3VidGl0bGVMYWJlbCwgb3ZlcmxheVNpemU/OiBTaXplKTogdm9pZCB7XG4gICAgY29uc3QgeyByZWdpb25Db250YWluZXJJZCwgcmVnaW9uTmFtZSB9ID0gdGhpcy5nZXRSZWdpb24obGFiZWwpO1xuICAgIGNvbnN0IGNzc0NsYXNzZXMgPSBbYHN1YnRpdGxlLXBvc2l0aW9uLSR7cmVnaW9uTmFtZX1gXTtcblxuICAgIGlmIChsYWJlbC52dHQgJiYgbGFiZWwudnR0LnJlZ2lvbikge1xuICAgICAgY3NzQ2xhc3Nlcy5wdXNoKGB2dHQtcmVnaW9uLSR7bGFiZWwudnR0LnJlZ2lvbi5pZH1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzW3JlZ2lvbkNvbnRhaW5lcklkXSkge1xuICAgICAgY29uc3QgcmVnaW9uQ29udGFpbmVyID0gbmV3IFN1YnRpdGxlUmVnaW9uQ29udGFpbmVyKHtcbiAgICAgICAgY3NzQ2xhc3NlcyxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN1YnRpdGxlUmVnaW9uQ29udGFpbmVyc1tyZWdpb25Db250YWluZXJJZF0gPSByZWdpb25Db250YWluZXI7XG5cbiAgICAgIGlmIChsYWJlbC5yZWdpb25TdHlsZSkge1xuICAgICAgICByZWdpb25Db250YWluZXIuZ2V0RG9tRWxlbWVudCgpLmF0dHIoJ3N0eWxlJywgbGFiZWwucmVnaW9uU3R5bGUpO1xuICAgICAgfSBlbHNlIGlmIChsYWJlbC52dHQgJiYgIWxhYmVsLnZ0dC5yZWdpb24pIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHRoZXJlIGlzIG5vIHJlZ2lvbiBwcmVzZW50IHRvIHdyYXAgdGhlIEN1ZSBCb3gsIHRoZSBDdWUgYm94IGJlY29tZXMgdGhlXG4gICAgICAgICAqIHJlZ2lvbiBpdHNlbGYuIFRoZXJlZm9yZSB0aGUgcG9zaXRpb25pbmcgdmFsdWVzIGhhdmUgdG8gY29tZSBmcm9tIHRoZSBib3guXG4gICAgICAgICAqL1xuICAgICAgICByZWdpb25Db250YWluZXIuZ2V0RG9tRWxlbWVudCgpLmNzcygncG9zaXRpb24nLCAnc3RhdGljJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBnZXREb21FbGVtZW50IG5lZWRzIHRvIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHRvIGVuc3VyZSB0aGUgY29tcG9uZW50IGV4aXN0c1xuICAgICAgICByZWdpb25Db250YWluZXIuZ2V0RG9tRWxlbWVudCgpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlZ2lvbkNvbnRhaW5lcklkIGluIHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzKSB7XG4gICAgICAgIHRoaXMuc3VidGl0bGVPdmVybGF5LmFkZENvbXBvbmVudCh0aGlzLnN1YnRpdGxlUmVnaW9uQ29udGFpbmVyc1tyZWdpb25Db250YWluZXJJZF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzW3JlZ2lvbkNvbnRhaW5lcklkXS5hZGRMYWJlbChsYWJlbCwgb3ZlcmxheVNpemUpO1xuICB9XG5cbiAgcmVwbGFjZUxhYmVsKHByZXZpb3VzTGFiZWw6IFN1YnRpdGxlTGFiZWwsIG5ld0xhYmVsOiBTdWJ0aXRsZUxhYmVsKTogdm9pZCB7XG4gICAgY29uc3QgeyByZWdpb25Db250YWluZXJJZCB9ID0gdGhpcy5nZXRSZWdpb24ocHJldmlvdXNMYWJlbCk7XG5cbiAgICB0aGlzLnN1YnRpdGxlUmVnaW9uQ29udGFpbmVyc1tyZWdpb25Db250YWluZXJJZF0ucmVtb3ZlTGFiZWwocHJldmlvdXNMYWJlbCk7XG4gICAgdGhpcy5zdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lcnNbcmVnaW9uQ29udGFpbmVySWRdLmFkZExhYmVsKG5ld0xhYmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgc3VidGl0bGUgbGFiZWwgZnJvbSBhIGNvbnRhaW5lci5cbiAgICovXG4gIHJlbW92ZUxhYmVsKGxhYmVsOiBTdWJ0aXRsZUxhYmVsKTogdm9pZCB7XG4gICAgbGV0IHJlZ2lvbkNvbnRhaW5lcklkO1xuXG4gICAgaWYgKGxhYmVsLnZ0dCkge1xuICAgICAgcmVnaW9uQ29udGFpbmVySWQgPSBsYWJlbC52dHQucmVnaW9uICYmIGxhYmVsLnZ0dC5yZWdpb24uaWQgPyBsYWJlbC52dHQucmVnaW9uLmlkIDogJ3Z0dCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZ2lvbkNvbnRhaW5lcklkID0gbGFiZWwucmVnaW9uIHx8ICdkZWZhdWx0JztcbiAgICB9XG5cbiAgICB0aGlzLnN1YnRpdGxlUmVnaW9uQ29udGFpbmVyc1tyZWdpb25Db250YWluZXJJZF0ucmVtb3ZlTGFiZWwobGFiZWwpO1xuXG4gICAgLy8gUmVtb3ZlIGNvbnRhaW5lciBpZiBubyBtb3JlIGxhYmVscyBhcmUgZGlzcGxheWVkXG4gICAgaWYgKHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzW3JlZ2lvbkNvbnRhaW5lcklkXS5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuc3VidGl0bGVPdmVybGF5LnJlbW92ZUNvbXBvbmVudCh0aGlzLnN1YnRpdGxlUmVnaW9uQ29udGFpbmVyc1tyZWdpb25Db250YWluZXJJZF0pO1xuICAgICAgZGVsZXRlIHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzW3JlZ2lvbkNvbnRhaW5lcklkXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgc3VidGl0bGUgY29udGFpbmVycy5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcmVnaW9uTmFtZSBpbiB0aGlzLnN1YnRpdGxlUmVnaW9uQ29udGFpbmVycykge1xuICAgICAgdGhpcy5zdWJ0aXRsZU92ZXJsYXkucmVtb3ZlQ29tcG9uZW50KHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzW3JlZ2lvbk5hbWVdKTtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnRpdGxlUmVnaW9uQ29udGFpbmVycyA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lciBleHRlbmRzIENvbnRhaW5lcjxDb250YWluZXJDb25maWc+IHtcbiAgcHJpdmF0ZSBsYWJlbENvdW50ID0gMDtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbnRhaW5lckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAnc3VidGl0bGUtcmVnaW9uLWNvbnRhaW5lcicsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgYWRkTGFiZWwobGFiZWxUb0FkZDogU3VidGl0bGVMYWJlbCwgb3ZlcmxheVNpemU/OiBTaXplKSB7XG4gICAgdGhpcy5sYWJlbENvdW50Kys7XG5cbiAgICBpZiAobGFiZWxUb0FkZC52dHQpIHtcbiAgICAgIGlmIChsYWJlbFRvQWRkLnZ0dC5yZWdpb24gJiYgb3ZlcmxheVNpemUpIHtcbiAgICAgICAgVnR0VXRpbHMuc2V0VnR0UmVnaW9uU3R5bGVzKHRoaXMsIGxhYmVsVG9BZGQudnR0LnJlZ2lvbiwgb3ZlcmxheVNpemUpO1xuICAgICAgfVxuXG4gICAgICBWdHRVdGlscy5zZXRWdHRDdWVCb3hTdHlsZXMobGFiZWxUb0FkZCwgb3ZlcmxheVNpemUpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQ29tcG9uZW50KGxhYmVsVG9BZGQpO1xuICAgIHRoaXMudXBkYXRlQ29tcG9uZW50cygpO1xuICB9XG5cbiAgcmVtb3ZlTGFiZWwobGFiZWxUb1JlbW92ZTogU3VidGl0bGVMYWJlbCk6IHZvaWQge1xuICAgIHRoaXMubGFiZWxDb3VudC0tO1xuICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KGxhYmVsVG9SZW1vdmUpO1xuICAgIHRoaXMudXBkYXRlQ29tcG9uZW50cygpO1xuICB9XG5cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFiZWxDb3VudCA9PT0gMDtcbiAgfVxufVxuIiwiaW1wb3J0IHtTZWxlY3RCb3h9IGZyb20gJy4vc2VsZWN0Ym94JztcbmltcG9ydCB7TGlzdFNlbGVjdG9yQ29uZmlnfSBmcm9tICcuL2xpc3RzZWxlY3Rvcic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtTdWJ0aXRsZVN3aXRjaEhhbmRsZXJ9IGZyb20gJy4uL3N1YnRpdGxldXRpbHMnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBiZXR3ZWVuIGF2YWlsYWJsZSBzdWJ0aXRsZSBhbmQgY2FwdGlvbiB0cmFja3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWJ0aXRsZVNlbGVjdEJveCBleHRlbmRzIFNlbGVjdEJveCB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMaXN0U2VsZWN0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzc2VzOiBbJ3VpLXN1YnRpdGxlc2VsZWN0Ym94J10sXG4gICAgICBhcmlhTGFiZWw6IGkxOG4uZ2V0TG9jYWxpemVyKCdzdWJ0aXRsZS5zZWxlY3QnKSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbmV3IFN1YnRpdGxlU3dpdGNoSGFuZGxlcihwbGF5ZXIsIHRoaXMsIHVpbWFuYWdlcik7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCwgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnIH0gZnJvbSAnLi9zdWJ0aXRsZXNldHRpbmdzZWxlY3Rib3gnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgc2VsZWN0IGJveCBwcm92aWRpbmcgYSBzZWxlY3Rpb24gb2YgZGlmZmVyZW50IGJhY2tncm91bmQgY29sb3JzLlxuICovXG5leHBvcnQgY2xhc3MgQmFja2dyb3VuZENvbG9yU2VsZWN0Qm94IGV4dGVuZHMgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveENvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzc2VzOiBbJ3VpLXN1YnRpdGxlc2V0dGluZ3NiYWNrZ3JvdW5kY29sb3JzZWxlY3Rib3gnXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgdGhpcy5hZGRJdGVtKG51bGwsIGkxOG4uZ2V0TG9jYWxpemVyKCdkZWZhdWx0JykpO1xuICAgIHRoaXMuYWRkSXRlbSgnd2hpdGUnLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLndoaXRlJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnYmxhY2snLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLmJsYWNrJykpO1xuICAgIHRoaXMuYWRkSXRlbSgncmVkJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5yZWQnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdncmVlbicsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMuZ3JlZW4nKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdibHVlJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5ibHVlJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnY3lhbicsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMuY3lhbicpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ3llbGxvdycsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMueWVsbG93JykpO1xuICAgIHRoaXMuYWRkSXRlbSgnbWFnZW50YScsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMubWFnZW50YScpKTtcblxuICAgIGxldCBzZXRDb2xvckFuZE9wYWNpdHkgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZENvbG9yLmlzU2V0KCkgJiYgdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZE9wYWNpdHkuaXNTZXQoKSkge1xuICAgICAgICB0aGlzLnRvZ2dsZU92ZXJsYXlDbGFzcyhcbiAgICAgICAgICAnYmdjb2xvci0nICsgdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZENvbG9yLnZhbHVlICsgdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZE9wYWNpdHkudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2dnbGVPdmVybGF5Q2xhc3MobnVsbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMub25JdGVtU2VsZWN0ZWQuc3Vic2NyaWJlKChzZW5kZXIsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kQ29sb3IudmFsdWUgPSBrZXk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kQ29sb3Iub25DaGFuZ2VkLnN1YnNjcmliZSgoc2VuZGVyLCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgLy8gQ29sb3IgYW5kIG9wYWNpdHkgZ28gdG9nZXRoZXIsIHNvIHdlIG5lZWQgdG8uLi5cbiAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZENvbG9yLmlzU2V0KCkpIHtcbiAgICAgICAgLy8gLi4uIGNsZWFyIHRoZSBvcGFjaXR5IHdoZW4gdGhlIGNvbG9yIGlzIG5vdCBzZXRcbiAgICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZE9wYWNpdHkuY2xlYXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRPcGFjaXR5LmlzU2V0KCkpIHtcbiAgICAgICAgLy8gLi4uIHNldCBhbiBvcGFjaXR5IHdoZW4gdGhlIGNvbG9yIGlzIHNldFxuICAgICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kT3BhY2l0eS52YWx1ZSA9ICcxMDAnO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RJdGVtKHByb3BlcnR5LnZhbHVlKTtcbiAgICAgIHNldENvbG9yQW5kT3BhY2l0eSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZE9wYWNpdHkub25DaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBzZXRDb2xvckFuZE9wYWNpdHkoKTtcbiAgICB9KTtcblxuICAgIC8vIExvYWQgaW5pdGlhbCB2YWx1ZVxuICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kQ29sb3IuaXNTZXQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRDb2xvci52YWx1ZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gsIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveENvbmZpZyB9IGZyb20gJy4vc3VidGl0bGVzZXR0aW5nc2VsZWN0Ym94JztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uLy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uLy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIHNlbGVjdCBib3ggcHJvdmlkaW5nIGEgc2VsZWN0aW9uIG9mIGRpZmZlcmVudCBiYWNrZ3JvdW5kIG9wYWNpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kT3BhY2l0eVNlbGVjdEJveCBleHRlbmRzIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3NlczogWyd1aS1zdWJ0aXRsZXNldHRpbmdzYmFja2dyb3VuZG9wYWNpdHlzZWxlY3Rib3gnXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgdGhpcy5hZGRJdGVtKG51bGwsIGkxOG4uZ2V0TG9jYWxpemVyKCdkZWZhdWx0JykpO1xuICAgIHRoaXMuYWRkSXRlbSgnMTAwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAxMDAgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnNzUnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDc1IH0pKTtcbiAgICB0aGlzLmFkZEl0ZW0oJzUwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiA1MCB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCcyNScsIGkxOG4uZ2V0TG9jYWxpemVyKCdwZXJjZW50JywgeyB2YWx1ZTogMjUgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnMCcsIGkxOG4uZ2V0TG9jYWxpemVyKCdwZXJjZW50JywgeyB2YWx1ZTogMCB9KSk7XG5cbiAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoc2VuZGVyLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZE9wYWNpdHkudmFsdWUgPSBrZXk7XG5cbiAgICAgIC8vIENvbG9yIGFuZCBvcGFjaXR5IGdvIHRvZ2V0aGVyLCBzbyB3ZSBuZWVkIHRvLi4uXG4gICAgICBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRPcGFjaXR5LmlzU2V0KCkpIHtcbiAgICAgICAgLy8gLi4uIGNsZWFyIHRoZSBjb2xvciB3aGVuIHRoZSBvcGFjaXR5IGlzIG5vdCBzZXRcbiAgICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZENvbG9yLmNsZWFyKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kQ29sb3IuaXNTZXQoKSkge1xuICAgICAgICAvLyAuLi4gc2V0IGEgY29sb3Igd2hlbiB0aGUgb3BhY2l0eSBpcyBzZXRcbiAgICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZENvbG9yLnZhbHVlID0gJ2JsYWNrJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCBpdGVtIHdoZW4gdmFsdWUgaXMgc2V0IGZyb20gc29tZXdoZXJlIGVsc2VcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kT3BhY2l0eS5vbkNoYW5nZWQuc3Vic2NyaWJlKChzZW5kZXIsIHByb3BlcnR5KSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0ocHJvcGVydHkudmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLy8gTG9hZCBpbml0aWFsIHZhbHVlXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRPcGFjaXR5LmlzU2V0KCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbSh0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kT3BhY2l0eS52YWx1ZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gsIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveENvbmZpZyB9IGZyb20gJy4vc3VidGl0bGVzZXR0aW5nc2VsZWN0Ym94JztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uLy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uLy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIHNlbGVjdCBib3ggcHJvdmlkaW5nIGEgc2VsZWN0aW9uIG9mIGRpZmZlcmVudCBjaGFyYWN0ZXIgZWRnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYXJhY3RlckVkZ2VTZWxlY3RCb3ggZXh0ZW5kcyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc3VidGl0bGVzZXR0aW5nc2NoYXJhY3RlcmVkZ2VzZWxlY3Rib3gnXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgdGhpcy5hZGRJdGVtKG51bGwsIGkxOG4uZ2V0TG9jYWxpemVyKCdkZWZhdWx0JykpO1xuICAgIHRoaXMuYWRkSXRlbSgncmFpc2VkJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5jaGFyYWN0ZXJFZGdlLnJhaXNlZCcpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2RlcHJlc3NlZCcsIGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuY2hhcmFjdGVyRWRnZS5kZXByZXNzZWQnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCd1bmlmb3JtJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5jaGFyYWN0ZXJFZGdlLnVuaWZvcm0nKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdkcm9wc2hhZG93ZWQnLCBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UuZHJvcHNoYWRvd2VkJykpO1xuXG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuY2hhcmFjdGVyRWRnZS5vbkNoYW5nZWQuc3Vic2NyaWJlKChzZW5kZXIsIHByb3BlcnR5KSA9PiB7XG4gICAgICBpZiAocHJvcGVydHkuaXNTZXQoKSkge1xuICAgICAgICB0aGlzLnRvZ2dsZU92ZXJsYXlDbGFzcygnY2hhcmFjdGVyZWRnZS0nICsgcHJvcGVydHkudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2dnbGVPdmVybGF5Q2xhc3MobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlbGVjdCB0aGUgaXRlbSBpbiBjYXNlIHRoZSBwcm9wZXJ0eSB3YXMgc2V0IGZyb20gb3V0c2lkZVxuICAgICAgdGhpcy5zZWxlY3RJdGVtKHByb3BlcnR5LnZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMub25JdGVtU2VsZWN0ZWQuc3Vic2NyaWJlKChzZW5kZXIsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5jaGFyYWN0ZXJFZGdlLnZhbHVlID0ga2V5O1xuICAgIH0pO1xuXG4gICAgLy8gTG9hZCBpbml0aWFsIHZhbHVlXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmNoYXJhY3RlckVkZ2UuaXNTZXQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmNoYXJhY3RlckVkZ2UudmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94LCBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcgfSBmcm9tICcuL3N1YnRpdGxlc2V0dGluZ3NlbGVjdGJveCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi8uLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBvZiBkaWZmZXJlbnQgZm9udCBjb2xvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBGb250Q29sb3JTZWxlY3RCb3ggZXh0ZW5kcyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc3VidGl0bGVzZXR0aW5nc2ZvbnRjb2xvcnNlbGVjdGJveCddLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLmFkZEl0ZW0obnVsbCwgaTE4bi5nZXRMb2NhbGl6ZXIoJ2RlZmF1bHQnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCd3aGl0ZScsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMud2hpdGUnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdibGFjaycsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMuYmxhY2snKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdyZWQnLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLnJlZCcpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2dyZWVuJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5ncmVlbicpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2JsdWUnLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLmJsdWUnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdjeWFuJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5jeWFuJykpO1xuICAgIHRoaXMuYWRkSXRlbSgneWVsbG93JywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy55ZWxsb3cnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdtYWdlbnRhJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5tYWdlbnRhJykpO1xuXG4gICAgbGV0IHNldENvbG9yQW5kT3BhY2l0eSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5mb250Q29sb3IuaXNTZXQoKSAmJiB0aGlzLnNldHRpbmdzTWFuYWdlci5mb250T3BhY2l0eS5pc1NldCgpKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlT3ZlcmxheUNsYXNzKFxuICAgICAgICAgICdmb250Y29sb3ItJyArIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRDb2xvci52YWx1ZSArIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRPcGFjaXR5LnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9nZ2xlT3ZlcmxheUNsYXNzKG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoc2VuZGVyLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udENvbG9yLnZhbHVlID0ga2V5O1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udENvbG9yLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKHNlbmRlciwgcHJvcGVydHkpID0+IHtcbiAgICAgIC8vIENvbG9yIGFuZCBvcGFjaXR5IGdvIHRvZ2V0aGVyLCBzbyB3ZSBuZWVkIHRvLi4uXG4gICAgICBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRDb2xvci5pc1NldCgpKSB7XG4gICAgICAgIC8vIC4uLiBjbGVhciB0aGUgb3BhY2l0eSB3aGVuIHRoZSBjb2xvciBpcyBub3Qgc2V0XG4gICAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRPcGFjaXR5LmNsZWFyKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci5mb250T3BhY2l0eS5pc1NldCgpKSB7XG4gICAgICAgIC8vIC4uLiBzZXQgYW4gb3BhY2l0eSB3aGVuIHRoZSBjb2xvciBpcyBzZXRcbiAgICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udE9wYWNpdHkudmFsdWUgPSAnMTAwJztcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0SXRlbShwcm9wZXJ0eS52YWx1ZSk7XG4gICAgICBzZXRDb2xvckFuZE9wYWNpdHkoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRPcGFjaXR5Lm9uQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgc2V0Q29sb3JBbmRPcGFjaXR5KCk7XG4gICAgfSk7XG5cbiAgICAvLyBMb2FkIGluaXRpYWwgdmFsdWVcbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udENvbG9yLmlzU2V0KCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbSh0aGlzLnNldHRpbmdzTWFuYWdlci5mb250Q29sb3IudmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94LCBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcgfSBmcm9tICcuL3N1YnRpdGxlc2V0dGluZ3NlbGVjdGJveCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi8uLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBvZiBkaWZmZXJlbnQgZm9udCBmYW1pbHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBGb250RmFtaWx5U2VsZWN0Qm94IGV4dGVuZHMgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveENvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzc2VzOiBbJ3VpLXN1YnRpdGxlc2V0dGluZ3Nmb250ZmFtaWx5c2VsZWN0Ym94J10sXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMuYWRkSXRlbShudWxsLCBpMThuLmdldExvY2FsaXplcignZGVmYXVsdCcpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ21vbm9zcGFjZWRzZXJpZicsIGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkubW9ub3NwYWNlZHNlcmlmJykpO1xuICAgIHRoaXMuYWRkSXRlbSgncHJvcG9ydGlvbmFsc2VyaWYnLCBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5LnByb3BvcnRpb25hbHNlcmlmJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnbW9ub3NwYWNlZHNhbnNzZXJpZicsIGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkubW9ub3NwYWNlZHNhbnNzZXJpZicpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ3Byb3BvcnRpb25hbHNhbnNzZXJpZicsIGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkucHJvcG9ydGlvbmFsc2VyaWYnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdjYXN1YWwnLCBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5LmNhc3VhbCcpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2N1cnNpdmUnLCBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5LmN1cnNpdmUnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdzbWFsbGNhcGl0YWwnLCBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5LnNtYWxsY2FwaXRhbCcpKTtcblxuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRGYW1pbHkub25DaGFuZ2VkLnN1YnNjcmliZSgoc2VuZGVyLCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgaWYgKHByb3BlcnR5LmlzU2V0KCkpIHtcbiAgICAgICAgdGhpcy50b2dnbGVPdmVybGF5Q2xhc3MoJ2ZvbnRmYW1pbHktJyArIHByb3BlcnR5LnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9nZ2xlT3ZlcmxheUNsYXNzKG51bGwpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZWxlY3QgdGhlIGl0ZW0gaW4gY2FzZSB0aGUgcHJvcGVydHkgd2FzIHNldCBmcm9tIG91dHNpZGVcbiAgICAgIHRoaXMuc2VsZWN0SXRlbShwcm9wZXJ0eS52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoc2VuZGVyLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udEZhbWlseS52YWx1ZSA9IGtleTtcbiAgICB9KTtcblxuICAgIC8vIExvYWQgaW5pdGlhbCB2YWx1ZVxuICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5mb250RmFtaWx5LmlzU2V0KCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbSh0aGlzLnNldHRpbmdzTWFuYWdlci5mb250RmFtaWx5LnZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCwgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnIH0gZnJvbSAnLi9zdWJ0aXRsZXNldHRpbmdzZWxlY3Rib3gnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgc2VsZWN0IGJveCBwcm92aWRpbmcgYSBzZWxlY3Rpb24gb2YgZGlmZmVyZW50IGZvbnQgY29sb3JzLlxuICovXG5leHBvcnQgY2xhc3MgRm9udE9wYWNpdHlTZWxlY3RCb3ggZXh0ZW5kcyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc3VidGl0bGVzZXR0aW5nc2ZvbnRvcGFjaXR5c2VsZWN0Ym94J10sXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMuYWRkSXRlbShudWxsLCBpMThuLmdldExvY2FsaXplcignZGVmYXVsdCcpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJzEwMCcsIGkxOG4uZ2V0TG9jYWxpemVyKCdwZXJjZW50JywgeyB2YWx1ZTogMTAwIH0pKTtcbiAgICB0aGlzLmFkZEl0ZW0oJzc1JywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiA3NSB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCc1MCcsIGkxOG4uZ2V0TG9jYWxpemVyKCdwZXJjZW50JywgeyB2YWx1ZTogNTAgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnMjUnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDI1IH0pKTtcblxuICAgIHRoaXMub25JdGVtU2VsZWN0ZWQuc3Vic2NyaWJlKChzZW5kZXIsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5mb250T3BhY2l0eS52YWx1ZSA9IGtleTtcblxuICAgICAgLy8gQ29sb3IgYW5kIG9wYWNpdHkgZ28gdG9nZXRoZXIsIHNvIHdlIG5lZWQgdG8uLi5cbiAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udE9wYWNpdHkuaXNTZXQoKSkge1xuICAgICAgICAvLyAuLi4gY2xlYXIgdGhlIGNvbG9yIHdoZW4gdGhlIG9wYWNpdHkgaXMgbm90IHNldFxuICAgICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5mb250Q29sb3IuY2xlYXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRDb2xvci5pc1NldCgpKSB7XG4gICAgICAgIC8vIC4uLiBzZXQgYSBjb2xvciB3aGVuIHRoZSBvcGFjaXR5IGlzIHNldFxuICAgICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5mb250Q29sb3IudmFsdWUgPSAnd2hpdGUnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHNlbGVjdGVkIGl0ZW0gd2hlbiB2YWx1ZSBpcyBzZXQgZnJvbSBzb21ld2hlcmUgZWxzZVxuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRPcGFjaXR5Lm9uQ2hhbmdlZC5zdWJzY3JpYmUoKHNlbmRlciwgcHJvcGVydHkpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbShwcm9wZXJ0eS52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBMb2FkIGluaXRpYWwgdmFsdWVcbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udE9wYWNpdHkuaXNTZXQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRPcGFjaXR5LnZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCwgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnIH0gZnJvbSAnLi9zdWJ0aXRsZXNldHRpbmdzZWxlY3Rib3gnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgc2VsZWN0IGJveCBwcm92aWRpbmcgYSBzZWxlY3Rpb24gb2YgZGlmZmVyZW50IGZvbnQgY29sb3JzLlxuICovXG5leHBvcnQgY2xhc3MgRm9udFNpemVTZWxlY3RCb3ggZXh0ZW5kcyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc3VidGl0bGVzZXR0aW5nc2ZvbnRzaXplc2VsZWN0Ym94J10sXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMuYWRkSXRlbShudWxsLCBpMThuLmdldExvY2FsaXplcignZGVmYXVsdCcpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJzUwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiA1MCB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCc3NScsIGkxOG4uZ2V0TG9jYWxpemVyKCdwZXJjZW50JywgeyB2YWx1ZTogNzUgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnMTAwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAxMDAgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnMTUwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAxNTAgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnMjAwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAyMDAgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnMzAwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAzMDAgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnNDAwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiA0MDAgfSkpO1xuXG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udFNpemUub25DaGFuZ2VkLnN1YnNjcmliZSgoc2VuZGVyLCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgaWYgKHByb3BlcnR5LmlzU2V0KCkpIHtcbiAgICAgICAgdGhpcy50b2dnbGVPdmVybGF5Q2xhc3MoJ2ZvbnRzaXplLScgKyBwcm9wZXJ0eS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvZ2dsZU92ZXJsYXlDbGFzcyhudWxsKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VsZWN0IHRoZSBpdGVtIGluIGNhc2UgdGhlIHByb3BlcnR5IHdhcyBzZXQgZnJvbSBvdXRzaWRlXG4gICAgICB0aGlzLnNlbGVjdEl0ZW0ocHJvcGVydHkudmFsdWUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUoKHNlbmRlciwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRTaXplLnZhbHVlID0ga2V5O1xuICAgIH0pO1xuXG4gICAgLy8gTG9hZCBpbml0aWFsIHZhbHVlXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRTaXplLmlzU2V0KCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbSh0aGlzLnNldHRpbmdzTWFuYWdlci5mb250U2l6ZS52YWx1ZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1N1YnRpdGxlT3ZlcmxheX0gZnJvbSAnLi4vc3VidGl0bGVvdmVybGF5JztcbmltcG9ydCB7TGlzdFNlbGVjdG9yQ29uZmlnfSBmcm9tICcuLi9saXN0c2VsZWN0b3InO1xuaW1wb3J0IHtTZWxlY3RCb3h9IGZyb20gJy4uL3NlbGVjdGJveCc7XG5pbXBvcnQge1N1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyfSBmcm9tICcuL3N1YnRpdGxlc2V0dGluZ3NtYW5hZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcgZXh0ZW5kcyBMaXN0U2VsZWN0b3JDb25maWcge1xuICBvdmVybGF5OiBTdWJ0aXRsZU92ZXJsYXk7XG4gIHNldHRpbmdzTWFuYWdlcjogU3VidGl0bGVTZXR0aW5nc01hbmFnZXI7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIHN1YnRpdGxlcyBzZXR0aW5ncyBzZWxlY3QgYm94XG4gKiovXG5leHBvcnQgY2xhc3MgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94IGV4dGVuZHMgU2VsZWN0Qm94IHtcblxuICBwcm90ZWN0ZWQgc2V0dGluZ3NNYW5hZ2VyOiBTdWJ0aXRsZVNldHRpbmdzTWFuYWdlcjtcbiAgcHJvdGVjdGVkIG92ZXJsYXk6IFN1YnRpdGxlT3ZlcmxheTtcbiAgcHJpdmF0ZSBjdXJyZW50Q3NzQ2xhc3M6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveENvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IGNvbmZpZy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5vdmVybGF5ID0gY29uZmlnLm92ZXJsYXk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgc2V0IGNsYXNzIGFuZCBhZGRzIHRoZSBwYXNzZWQgaW4gY2xhc3MuXG4gICAqIEBwYXJhbSBjc3NDbGFzcyBUaGUgbmV3IGNsYXNzIHRvIHJlcGxhY2UgdGhlIHByZXZpb3VzIGNsYXNzIHdpdGggb3IgbnVsbCB0byBqdXN0IHJlbW92ZSB0aGUgcHJldmlvdXMgY2xhc3NcbiAgICovXG4gIHByb3RlY3RlZCB0b2dnbGVPdmVybGF5Q2xhc3MoY3NzQ2xhc3M6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBwcmV2aW91cyBjbGFzcyBpZiBleGlzdGluZ1xuICAgIGlmICh0aGlzLmN1cnJlbnRDc3NDbGFzcykge1xuICAgICAgdGhpcy5vdmVybGF5LmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLmN1cnJlbnRDc3NDbGFzcyk7XG4gICAgICB0aGlzLmN1cnJlbnRDc3NDbGFzcyA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQWRkIG5ldyBjbGFzcyBpZiBzcGVjaWZpZWQuIElmIHRoZSBuZXcgY2xhc3MgaXMgbnVsbCwgd2UgZG9uJ3QgYWRkIGFueXRoaW5nLlxuICAgIGlmIChjc3NDbGFzcykge1xuICAgICAgdGhpcy5jdXJyZW50Q3NzQ2xhc3MgPSB0aGlzLnByZWZpeENzcyhjc3NDbGFzcyk7XG4gICAgICB0aGlzLm92ZXJsYXkuZ2V0RG9tRWxlbWVudCgpLmFkZENsYXNzKHRoaXMuY3VycmVudENzc0NsYXNzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7TGFiZWxDb25maWd9IGZyb20gJy4uL2xhYmVsJztcbmltcG9ydCB7Q29udGFpbmVyLCBDb250YWluZXJDb25maWd9IGZyb20gJy4uL2NvbnRhaW5lcic7XG5pbXBvcnQge0RPTX0gZnJvbSAnLi4vLi4vZG9tJztcbmltcG9ydCB7U2V0dGluZ3NQYW5lbFBhZ2VPcGVuQnV0dG9ufSBmcm9tICcuLi9zZXR0aW5nc3BhbmVscGFnZW9wZW5idXR0b24nO1xuaW1wb3J0IHsgTG9jYWxpemFibGVUZXh0LCBpMThuIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1YnRpdGxlU2V0dGluZ3NMYWJlbENvbmZpZyBleHRlbmRzIExhYmVsQ29uZmlnIHtcbiAgb3BlbmVyOiBTZXR0aW5nc1BhbmVsUGFnZU9wZW5CdXR0b247XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJ0aXRsZVNldHRpbmdzTGFiZWwgZXh0ZW5kcyBDb250YWluZXI8Q29udGFpbmVyQ29uZmlnPiB7XG5cbiAgcHJpdmF0ZSBvcGVuZXI6IFNldHRpbmdzUGFuZWxQYWdlT3BlbkJ1dHRvbjtcblxuICBwcml2YXRlIHRleHQ6IExvY2FsaXphYmxlVGV4dDtcblxuICBwcml2YXRlIGZvcjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nc0xhYmVsQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMub3BlbmVyID0gY29uZmlnLm9wZW5lcjtcbiAgICB0aGlzLnRleHQgPSBjb25maWcudGV4dDtcbiAgICB0aGlzLmZvciA9IGNvbmZpZy5mb3I7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoPENvbnRhaW5lckNvbmZpZz5jb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktbGFiZWwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB0aGlzLm9wZW5lcixcbiAgICAgIF0sXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvRG9tRWxlbWVudCgpOiBET00ge1xuICAgIGxldCBsYWJlbEVsZW1lbnQgPSBuZXcgRE9NKCdsYWJlbCcsIHtcbiAgICAgICdpZCc6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgJ2NsYXNzJzogdGhpcy5nZXRDc3NDbGFzc2VzKCksXG4gICAgICAnZm9yJzogdGhpcy5mb3IsXG4gICAgfSkuYXBwZW5kKFxuICAgICAgbmV3IERPTSgnc3BhbicsIHt9KS5odG1sKGkxOG4ucGVyZm9ybUxvY2FsaXphdGlvbih0aGlzLnRleHQpKSxcbiAgICAgIHRoaXMub3BlbmVyLmdldERvbUVsZW1lbnQoKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGxhYmVsRWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHtTdG9yYWdlVXRpbHN9IGZyb20gJy4uLy4uL3N0b3JhZ2V1dGlscyc7XG5pbXBvcnQge0NvbXBvbmVudCwgQ29tcG9uZW50Q29uZmlnfSBmcm9tICcuLi9jb21wb25lbnQnO1xuaW1wb3J0IHtFdmVudERpc3BhdGNoZXIsIEV2ZW50fSBmcm9tICcuLi8uLi9ldmVudGRpc3BhdGNoZXInO1xuXG5pbnRlcmZhY2UgU3VidGl0bGVTZXR0aW5ncyB7XG4gIGZvbnRDb2xvcj86IHN0cmluZztcbiAgZm9udE9wYWNpdHk/OiBzdHJpbmc7XG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIGZvbnRTaXplPzogc3RyaW5nO1xuICBjaGFyYWN0ZXJFZGdlPzogc3RyaW5nO1xuICBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XG4gIGJhY2tncm91bmRPcGFjaXR5Pzogc3RyaW5nO1xuICB3aW5kb3dDb2xvcj86IHN0cmluZztcbiAgd2luZG93T3BhY2l0eT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFByb3BlcnRpZXMge1xuICBbbmFtZTogc3RyaW5nXTogU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz47XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJ0aXRsZVNldHRpbmdzTWFuYWdlciB7XG5cbiAgcHJpdmF0ZSB1c2VyU2V0dGluZ3M6IFN1YnRpdGxlU2V0dGluZ3M7XG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlS2V5OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfcHJvcGVydGllczogUHJvcGVydGllcyA9IHtcbiAgICBmb250Q29sb3I6IG5ldyBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPih0aGlzKSxcbiAgICBmb250T3BhY2l0eTogbmV3IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+KHRoaXMpLFxuICAgIGZvbnRGYW1pbHk6IG5ldyBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPih0aGlzKSxcbiAgICBmb250U2l6ZTogbmV3IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+KHRoaXMpLFxuICAgIGNoYXJhY3RlckVkZ2U6IG5ldyBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPih0aGlzKSxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IG5ldyBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPih0aGlzKSxcbiAgICBiYWNrZ3JvdW5kT3BhY2l0eTogbmV3IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+KHRoaXMpLFxuICAgIHdpbmRvd0NvbG9yOiBuZXcgU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4odGhpcyksXG4gICAgd2luZG93T3BhY2l0eTogbmV3IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+KHRoaXMpLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudXNlclNldHRpbmdzID0ge307XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VLZXkgPSBEdW1teUNvbXBvbmVudC5pbnN0YW5jZSgpLnByZWZpeENzcygnc3VidGl0bGVzZXR0aW5ncycpO1xuXG4gICAgZm9yIChsZXQgcHJvcGVydHlOYW1lIGluIHRoaXMuX3Byb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXS5vbkNoYW5nZWQuc3Vic2NyaWJlKChzZW5kZXIsIHByb3BlcnR5KSA9PiB7XG4gICAgICAgIGlmIChwcm9wZXJ0eS5pc1NldCgpKSB7XG4gICAgICAgICAgKDxhbnk+dGhpcy51c2VyU2V0dGluZ3MpW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eS52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHByb3BlcnR5IGZyb20gdGhlIHNldHRpbmdzIG9iamVjdCBpZiB1bnNldCB0byBhdm9pZCBzZXJpYWxpemF0aW9uIG9mIG51bGwgdmFsdWVzXG4gICAgICAgICAgZGVsZXRlICg8YW55PnRoaXMudXNlclNldHRpbmdzKVtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgc2V0dGluZ3Mgb2JqZWN0IHdoZW4gYSBwcm9wZXJ0eSBoYXMgY2hhbmdlZFxuICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9hZCgpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIGZvciAobGV0IHByb3BlcnR5TmFtZSBpbiB0aGlzLl9wcm9wZXJ0aWVzKSB7XG4gICAgICB0aGlzLl9wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0uY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvbnRDb2xvcigpOiBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXMuZm9udENvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmb250T3BhY2l0eSgpOiBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXMuZm9udE9wYWNpdHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvbnRGYW1pbHkoKTogU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzLmZvbnRGYW1pbHk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvbnRTaXplKCk6IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcy5mb250U2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2hhcmFjdGVyRWRnZSgpOiBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXMuY2hhcmFjdGVyRWRnZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmFja2dyb3VuZENvbG9yKCk6IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcy5iYWNrZ3JvdW5kQ29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJhY2tncm91bmRPcGFjaXR5KCk6IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcy5iYWNrZ3JvdW5kT3BhY2l0eTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd2luZG93Q29sb3IoKTogU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzLndpbmRvd0NvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCB3aW5kb3dPcGFjaXR5KCk6IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcy53aW5kb3dPcGFjaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBzZXR0aW5ncyB0byBsb2NhbCBzdG9yYWdlLlxuICAgKi9cbiAgcHVibGljIHNhdmUoKTogdm9pZCB7XG4gICAgU3RvcmFnZVV0aWxzLnNldE9iamVjdCh0aGlzLmxvY2FsU3RvcmFnZUtleSwgdGhpcy51c2VyU2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBzZXR0aW5ncyBmcm9tIGxvY2FsIHN0b3JhZ2VcbiAgICovXG4gIHB1YmxpYyBsb2FkKCk6IHZvaWQge1xuICAgIHRoaXMudXNlclNldHRpbmdzID0gU3RvcmFnZVV0aWxzLmdldE9iamVjdDxTdWJ0aXRsZVNldHRpbmdzPih0aGlzLmxvY2FsU3RvcmFnZUtleSkgfHwge307XG5cbiAgICAvLyBBcHBseSB0aGUgbG9hZGVkIHNldHRpbmdzXG4gICAgZm9yIChsZXQgcHJvcGVydHkgaW4gdGhpcy51c2VyU2V0dGluZ3MpIHtcbiAgICAgIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHldLnZhbHVlID0gKDxhbnk+dGhpcy51c2VyU2V0dGluZ3MpW3Byb3BlcnR5XTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIGR1bW15IGNvbXBvbmVudCB3aG9zZSBzb2xlIHB1cnBvc2UgaXMgdG8gZXhwb3NlIHRoZSB7QGxpbmsgI3ByZWZpeENzc30gbWV0aG9kIHRvIHRoZVxuICoge0BsaW5rIFN1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyfS5cbiAqL1xuY2xhc3MgRHVtbXlDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiB7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBEdW1teUNvbXBvbmVudDtcblxuICBwdWJsaWMgc3RhdGljIGluc3RhbmNlKCk6IER1bW15Q29tcG9uZW50IHtcbiAgICBpZiAoIUR1bW15Q29tcG9uZW50Ll9pbnN0YW5jZSkge1xuICAgICAgRHVtbXlDb21wb25lbnQuX2luc3RhbmNlID0gbmV3IER1bW15Q29tcG9uZW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIER1bW15Q29tcG9uZW50Ll9pbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVmaXhDc3MoY3NzQ2xhc3NPcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXBlci5wcmVmaXhDc3MoY3NzQ2xhc3NPcklkKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PFQ+IHtcblxuICBwcml2YXRlIF9tYW5hZ2VyOiBTdWJ0aXRsZVNldHRpbmdzTWFuYWdlcjtcbiAgcHJpdmF0ZSBfb25DaGFuZ2VkOiBFdmVudERpc3BhdGNoZXI8U3VidGl0bGVTZXR0aW5nc01hbmFnZXIsIFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxUPj47XG4gIHByaXZhdGUgX3ZhbHVlOiBUO1xuXG4gIGNvbnN0cnVjdG9yKG1hbmFnZXI6IFN1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyKSB7XG4gICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5fb25DaGFuZ2VkID0gbmV3IEV2ZW50RGlzcGF0Y2hlcjxTdWJ0aXRsZVNldHRpbmdzTWFuYWdlciwgU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PFQ+PigpO1xuICB9XG5cbiAgcHVibGljIGlzU2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPSBudWxsO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICB0aGlzLm9uQ2hhbmdlZEV2ZW50KG51bGwpO1xuICB9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBUKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgPT09ICdudWxsJykge1xuICAgICAgdmFsdWUgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vbkNoYW5nZWRFdmVudCh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGFuZ2VkRXZlbnQodmFsdWU6IFQpIHtcbiAgICB0aGlzLl9vbkNoYW5nZWQuZGlzcGF0Y2godGhpcy5fbWFuYWdlciwgdGhpcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9uQ2hhbmdlZCgpOiBFdmVudDxTdWJ0aXRsZVNldHRpbmdzTWFuYWdlciwgU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuX29uQ2hhbmdlZC5nZXRFdmVudCgpO1xuICB9XG59IiwiaW1wb3J0IHtTZXR0aW5nc1BhbmVsUGFnZX0gZnJvbSAnLi4vc2V0dGluZ3NwYW5lbHBhZ2UnO1xuaW1wb3J0IHtTZXR0aW5nc1BhbmVsfSBmcm9tICcuLi9zZXR0aW5nc3BhbmVsJztcbmltcG9ydCB7U3VidGl0bGVPdmVybGF5fSBmcm9tICcuLi9zdWJ0aXRsZW92ZXJsYXknO1xuaW1wb3J0IHtDb250YWluZXJDb25maWd9IGZyb20gJy4uL2NvbnRhaW5lcic7XG5pbXBvcnQge1N1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyfSBmcm9tICcuL3N1YnRpdGxlc2V0dGluZ3NtYW5hZ2VyJztcbmltcG9ydCB7Q29tcG9uZW50LCBDb21wb25lbnRDb25maWd9IGZyb20gJy4uL2NvbXBvbmVudCc7XG5pbXBvcnQge0ZvbnRTaXplU2VsZWN0Qm94fSBmcm9tICcuL2ZvbnRzaXplc2VsZWN0Ym94JztcbmltcG9ydCB7Rm9udEZhbWlseVNlbGVjdEJveH0gZnJvbSAnLi9mb250ZmFtaWx5c2VsZWN0Ym94JztcbmltcG9ydCB7Rm9udENvbG9yU2VsZWN0Qm94fSBmcm9tICcuL2ZvbnRjb2xvcnNlbGVjdGJveCc7XG5pbXBvcnQge0ZvbnRPcGFjaXR5U2VsZWN0Qm94fSBmcm9tICcuL2ZvbnRvcGFjaXR5c2VsZWN0Ym94JztcbmltcG9ydCB7Q2hhcmFjdGVyRWRnZVNlbGVjdEJveH0gZnJvbSAnLi9jaGFyYWN0ZXJlZGdlc2VsZWN0Ym94JztcbmltcG9ydCB7QmFja2dyb3VuZENvbG9yU2VsZWN0Qm94fSBmcm9tICcuL2JhY2tncm91bmRjb2xvcnNlbGVjdGJveCc7XG5pbXBvcnQge0JhY2tncm91bmRPcGFjaXR5U2VsZWN0Qm94fSBmcm9tICcuL2JhY2tncm91bmRvcGFjaXR5c2VsZWN0Ym94JztcbmltcG9ydCB7V2luZG93Q29sb3JTZWxlY3RCb3h9IGZyb20gJy4vd2luZG93Y29sb3JzZWxlY3Rib3gnO1xuaW1wb3J0IHtXaW5kb3dPcGFjaXR5U2VsZWN0Qm94fSBmcm9tICcuL3dpbmRvd29wYWNpdHlzZWxlY3Rib3gnO1xuaW1wb3J0IHtTdWJ0aXRsZVNldHRpbmdzUmVzZXRCdXR0b259IGZyb20gJy4vc3VidGl0bGVzZXR0aW5nc3Jlc2V0YnV0dG9uJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uLy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1NldHRpbmdzUGFuZWxQYWdlQmFja0J1dHRvbn0gZnJvbSAnLi4vc2V0dGluZ3NwYW5lbHBhZ2ViYWNrYnV0dG9uJztcbmltcG9ydCB7U2V0dGluZ3NQYW5lbEl0ZW19IGZyb20gJy4uL3NldHRpbmdzcGFuZWxpdGVtJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1YnRpdGxlU2V0dGluZ3NQYW5lbFBhZ2VDb25maWcgZXh0ZW5kcyBDb250YWluZXJDb25maWcge1xuICBzZXR0aW5nc1BhbmVsOiBTZXR0aW5nc1BhbmVsO1xuICBvdmVybGF5OiBTdWJ0aXRsZU92ZXJsYXk7XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJ0aXRsZVNldHRpbmdzUGFuZWxQYWdlIGV4dGVuZHMgU2V0dGluZ3NQYW5lbFBhZ2Uge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheTogU3VidGl0bGVPdmVybGF5O1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzUGFuZWw6IFNldHRpbmdzUGFuZWw7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdWJ0aXRsZVNldHRpbmdzUGFuZWxQYWdlQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMub3ZlcmxheSA9IGNvbmZpZy5vdmVybGF5O1xuICAgIHRoaXMuc2V0dGluZ3NQYW5lbCA9IGNvbmZpZy5zZXR0aW5nc1BhbmVsO1xuXG4gICAgbGV0IG1hbmFnZXIgPSBuZXcgU3VidGl0bGVTZXR0aW5nc01hbmFnZXIoKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNvbXBvbmVudHM6IDxDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPltdPltcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5zaXplJyksIG5ldyBGb250U2l6ZVNlbGVjdEJveCh7XG4gICAgICAgICAgb3ZlcmxheTogdGhpcy5vdmVybGF5LCBzZXR0aW5nc01hbmFnZXI6IG1hbmFnZXIsXG4gICAgICAgIH0pKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHknKSwgbmV3IEZvbnRGYW1pbHlTZWxlY3RCb3goe1xuICAgICAgICAgIG92ZXJsYXk6IHRoaXMub3ZlcmxheSwgc2V0dGluZ3NNYW5hZ2VyOiBtYW5hZ2VyLFxuICAgICAgICB9KSksXG4gICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbShpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuY29sb3InKSwgbmV3IEZvbnRDb2xvclNlbGVjdEJveCh7XG4gICAgICAgICAgb3ZlcmxheTogdGhpcy5vdmVybGF5LCBzZXR0aW5nc01hbmFnZXI6IG1hbmFnZXIsXG4gICAgICAgIH0pKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5vcGFjaXR5JyksIG5ldyBGb250T3BhY2l0eVNlbGVjdEJveCh7XG4gICAgICAgICAgb3ZlcmxheTogdGhpcy5vdmVybGF5LCBzZXR0aW5nc01hbmFnZXI6IG1hbmFnZXIsXG4gICAgICAgIH0pKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuY2hhcmFjdGVyRWRnZScpLCBuZXcgQ2hhcmFjdGVyRWRnZVNlbGVjdEJveCh7XG4gICAgICAgICAgb3ZlcmxheTogdGhpcy5vdmVybGF5LCBzZXR0aW5nc01hbmFnZXI6IG1hbmFnZXIsXG4gICAgICAgIH0pKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuYmFja2dyb3VuZC5jb2xvcicpLCBuZXcgQmFja2dyb3VuZENvbG9yU2VsZWN0Qm94KHtcbiAgICAgICAgICBvdmVybGF5OiB0aGlzLm92ZXJsYXksIHNldHRpbmdzTWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5iYWNrZ3JvdW5kLm9wYWNpdHknKSwgbmV3IEJhY2tncm91bmRPcGFjaXR5U2VsZWN0Qm94KHtcbiAgICAgICAgICBvdmVybGF5OiB0aGlzLm92ZXJsYXksIHNldHRpbmdzTWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy53aW5kb3cuY29sb3InKSwgbmV3IFdpbmRvd0NvbG9yU2VsZWN0Qm94KHtcbiAgICAgICAgICBvdmVybGF5OiB0aGlzLm92ZXJsYXksIHNldHRpbmdzTWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy53aW5kb3cub3BhY2l0eScpLCBuZXcgV2luZG93T3BhY2l0eVNlbGVjdEJveCh7XG4gICAgICAgICAgb3ZlcmxheTogdGhpcy5vdmVybGF5LCBzZXR0aW5nc01hbmFnZXI6IG1hbmFnZXIsXG4gICAgICAgIH0pKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKG5ldyBTZXR0aW5nc1BhbmVsUGFnZUJhY2tCdXR0b24oe1xuICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5zZXR0aW5nc1BhbmVsLFxuICAgICAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdiYWNrJyksXG4gICAgICAgIH0pLCBuZXcgU3VidGl0bGVTZXR0aW5nc1Jlc2V0QnV0dG9uKHtcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IG1hbmFnZXIsXG4gICAgICAgIH0pLCB7XG4gICAgICAgICAgcm9sZTogJ21lbnViYXInLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMub25BY3RpdmUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMub3ZlcmxheS5lbmFibGVQcmV2aWV3U3VidGl0bGVMYWJlbCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbkluYWN0aXZlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm92ZXJsYXkucmVtb3ZlUHJldmlld1N1YnRpdGxlTGFiZWwoKTtcbiAgICB9KTtcbiAgfVxufSIsImltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uLy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1N1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyfSBmcm9tICcuL3N1YnRpdGxlc2V0dGluZ3NtYW5hZ2VyJztcbmltcG9ydCB7QnV0dG9uLCBCdXR0b25Db25maWd9IGZyb20gJy4uL2J1dHRvbic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uLy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuZXhwb3J0IGludGVyZmFjZSBTdWJ0aXRsZVNldHRpbmdzUmVzZXRCdXR0b25Db25maWcgZXh0ZW5kcyBCdXR0b25Db25maWcge1xuICBzZXR0aW5nc01hbmFnZXI6IFN1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG4vKipcbiAqIEEgYnV0dG9uIHRoYXQgcmVzZXRzIGFsbCBzdWJ0aXRsZSBzZXR0aW5ncyB0byB0aGVpciBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1YnRpdGxlU2V0dGluZ3NSZXNldEJ1dHRvbiBleHRlbmRzIEJ1dHRvbjxCdXR0b25Db25maWc+IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFN1YnRpdGxlU2V0dGluZ3NSZXNldEJ1dHRvbkNvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXN1YnRpdGxlc2V0dGluZ3NyZXNldGJ1dHRvbicsXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcigncmVzZXQnKSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAoPFN1YnRpdGxlU2V0dGluZ3NSZXNldEJ1dHRvbkNvbmZpZz50aGlzLmNvbmZpZykuc2V0dGluZ3NNYW5hZ2VyLnJlc2V0KCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCwgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnIH0gZnJvbSAnLi9zdWJ0aXRsZXNldHRpbmdzZWxlY3Rib3gnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgc2VsZWN0IGJveCBwcm92aWRpbmcgYSBzZWxlY3Rpb24gb2YgZGlmZmVyZW50IGJhY2tncm91bmQgY29sb3JzLlxuICovXG5leHBvcnQgY2xhc3MgV2luZG93Q29sb3JTZWxlY3RCb3ggZXh0ZW5kcyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc3VidGl0bGVzZXR0aW5nc3dpbmRvd2NvbG9yc2VsZWN0Ym94J10sXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMuYWRkSXRlbShudWxsLCBpMThuLmdldExvY2FsaXplcignZGVmYXVsdCcpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ3doaXRlJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy53aGl0ZScpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2JsYWNrJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5ibGFjaycpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ3JlZCcsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMucmVkJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnZ3JlZW4nLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLmdyZWVuJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnYmx1ZScsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMuYmx1ZScpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2N5YW4nLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLmN5YW4nKSk7XG4gICAgdGhpcy5hZGRJdGVtKCd5ZWxsb3cnLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLnllbGxvdycpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ21hZ2VudGEnLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLm1hZ2VudGEnKSk7XG5cblxuXG4gICAgbGV0IHNldENvbG9yQW5kT3BhY2l0eSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dDb2xvci5pc1NldCgpICYmIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd09wYWNpdHkuaXNTZXQoKSkge1xuICAgICAgICB0aGlzLnRvZ2dsZU92ZXJsYXlDbGFzcyhcbiAgICAgICAgICAnd2luZG93Y29sb3ItJyArIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd0NvbG9yLnZhbHVlICsgdGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93T3BhY2l0eS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvZ2dsZU92ZXJsYXlDbGFzcyhudWxsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUoKHNlbmRlciwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd0NvbG9yLnZhbHVlID0ga2V5O1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93Q29sb3Iub25DaGFuZ2VkLnN1YnNjcmliZSgoc2VuZGVyLCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgLy8gQ29sb3IgYW5kIG9wYWNpdHkgZ28gdG9nZXRoZXIsIHNvIHdlIG5lZWQgdG8uLi5cbiAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93Q29sb3IuaXNTZXQoKSkge1xuICAgICAgICAvLyAuLi4gY2xlYXIgdGhlIG9wYWNpdHkgd2hlbiB0aGUgY29sb3IgaXMgbm90IHNldFxuICAgICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dPcGFjaXR5LmNsZWFyKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dPcGFjaXR5LmlzU2V0KCkpIHtcbiAgICAgICAgLy8gLi4uIHNldCBhbiBvcGFjaXR5IHdoZW4gdGhlIGNvbG9yIGlzIHNldFxuICAgICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dPcGFjaXR5LnZhbHVlID0gJzEwMCc7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0ocHJvcGVydHkudmFsdWUpO1xuICAgICAgc2V0Q29sb3JBbmRPcGFjaXR5KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dPcGFjaXR5Lm9uQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgc2V0Q29sb3JBbmRPcGFjaXR5KCk7XG4gICAgfSk7XG5cbiAgICAvLyBMb2FkIGluaXRpYWwgdmFsdWVcbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93Q29sb3IuaXNTZXQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd0NvbG9yLnZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCwgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnIH0gZnJvbSAnLi9zdWJ0aXRsZXNldHRpbmdzZWxlY3Rib3gnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgc2VsZWN0IGJveCBwcm92aWRpbmcgYSBzZWxlY3Rpb24gb2YgZGlmZmVyZW50IGJhY2tncm91bmQgb3BhY2l0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdpbmRvd09wYWNpdHlTZWxlY3RCb3ggZXh0ZW5kcyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc3VidGl0bGVzZXR0aW5nc3dpbmRvd29wYWNpdHlzZWxlY3Rib3gnXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgdGhpcy5hZGRJdGVtKG51bGwsIGkxOG4uZ2V0TG9jYWxpemVyKCdkZWZhdWx0JykpO1xuICAgIHRoaXMuYWRkSXRlbSgnMTAwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAxMDAgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnNzUnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDc1IH0pKTtcbiAgICB0aGlzLmFkZEl0ZW0oJzUwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiA1MCB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCcyNScsIGkxOG4uZ2V0TG9jYWxpemVyKCdwZXJjZW50JywgeyB2YWx1ZTogMjUgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnMCcsIGkxOG4uZ2V0TG9jYWxpemVyKCdwZXJjZW50JywgeyB2YWx1ZTogMCB9KSk7XG5cbiAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoc2VuZGVyLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93T3BhY2l0eS52YWx1ZSA9IGtleTtcblxuICAgICAgLy8gQ29sb3IgYW5kIG9wYWNpdHkgZ28gdG9nZXRoZXIsIHNvIHdlIG5lZWQgdG8uLi5cbiAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93T3BhY2l0eS5pc1NldCgpKSB7XG4gICAgICAgIC8vIC4uLiBjbGVhciB0aGUgY29sb3Igd2hlbiB0aGUgb3BhY2l0eSBpcyBub3Qgc2V0XG4gICAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd0NvbG9yLmNsZWFyKCk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dDb2xvci5pc1NldCgpKSB7XG4gICAgICAgIC8vIC4uLiBzZXQgYSBjb2xvciB3aGVuIHRoZSBvcGFjaXR5IGlzIHNldFxuICAgICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dDb2xvci52YWx1ZSA9ICdibGFjayc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgaXRlbSB3aGVuIHZhbHVlIGlzIHNldCBmcm9tIHNvbWV3aGVyZSBlbHNlXG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93T3BhY2l0eS5vbkNoYW5nZWQuc3Vic2NyaWJlKChzZW5kZXIsIHByb3BlcnR5KSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0ocHJvcGVydHkudmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLy8gTG9hZCBpbml0aWFsIHZhbHVlXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd09wYWNpdHkuaXNTZXQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd09wYWNpdHkudmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IFVJSW5zdGFuY2VNYW5hZ2VyIH0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IERPTSB9IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQgeyBDb21wb25lbnRDb25maWcgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBUaW1lbGluZU1hcmtlciB9IGZyb20gJy4uL3VpY29uZmlnJztcbmltcG9ydCB7IFNlZWtCYXJNYXJrZXIgfSBmcm9tICcuL3NlZWtiYXInO1xuaW1wb3J0IHsgUGxheWVyVXRpbHMgfSBmcm9tICcuLi9wbGF5ZXJ1dGlscyc7XG5pbXBvcnQgeyBUaW1lb3V0IH0gZnJvbSAnLi4vdGltZW91dCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFya2Vyc0NvbmZpZyBleHRlbmRzIENvbXBvbmVudENvbmZpZyB7XG4gIC8qKlxuICAgKiBVc2VkIGZvciBzZWVrQmFyIG1hcmtlciBzbmFwcGluZyByYW5nZSBwZXJjZW50YWdlXG4gICAqL1xuICBzbmFwcGluZ1JhbmdlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVGltZWxpbmVNYXJrZXJzSGFuZGxlciB7XG4gIHByaXZhdGUgbWFya2Vyc0NvbnRhaW5lcjogRE9NO1xuICBwcml2YXRlIHRpbWVsaW5lTWFya2VyczogU2Vla0Jhck1hcmtlcltdO1xuICBwcml2YXRlIHBsYXllcjogUGxheWVyQVBJO1xuICBwcml2YXRlIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXI7XG4gIHByaXZhdGUgcGF1c2VkVGltZXNoaWZ0VXBkYXRlcjogVGltZW91dDtcbiAgcHJpdmF0ZSBnZXRTZWVrQmFyV2lkdGg6ICgpID0+IG51bWJlcjtcbiAgcHJvdGVjdGVkIGNvbmZpZzogTWFya2Vyc0NvbmZpZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IE1hcmtlcnNDb25maWcsIGdldFNlZWtCYXJXaWR0aDogKCkgPT4gbnVtYmVyLCBtYXJrZXJzQ29udGFpbmVyOiBET00pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmdldFNlZWtCYXJXaWR0aCA9IGdldFNlZWtCYXJXaWR0aDtcbiAgICB0aGlzLm1hcmtlcnNDb250YWluZXIgPSBtYXJrZXJzQ29udGFpbmVyO1xuICAgIHRoaXMudGltZWxpbmVNYXJrZXJzID0gW107XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcikge1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMudWltYW5hZ2VyID0gdWltYW5hZ2VyO1xuICAgIHRoaXMuY29uZmlndXJlTWFya2VycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmVNYXJrZXJzKCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBtYXJrZXJzIHdoZW4gdW5sb2FkZWRcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZVVubG9hZGVkLCAoKSA9PiB0aGlzLmNsZWFyTWFya2VycygpKTtcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFkQnJlYWtTdGFydGVkLCAoKSA9PiB0aGlzLmNsZWFyTWFya2VycygpKTtcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFkQnJlYWtGaW5pc2hlZCwgKCkgPT4gdGhpcy51cGRhdGVNYXJrZXJzKCkpO1xuICAgIC8vIFVwZGF0ZSBtYXJrZXJzIHdoZW4gdGhlIHNpemUgb2YgdGhlIHNlZWtiYXIgY2hhbmdlc1xuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWVyUmVzaXplZCwgKCkgPT4gdGhpcy51cGRhdGVNYXJrZXJzRE9NKCkpO1xuXG4gICAgdGhpcy5wbGF5ZXIub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VMb2FkZWQsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBsYXllci5pc0xpdmUoKSkge1xuICAgICAgICAvLyBVcGRhdGUgbWFya2VyIHBvc2l0aW9uIGFzIHRpbWVzaGlmdCByYW5nZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVGltZUNoYW5nZWQsICgpID0+IHRoaXMudXBkYXRlTWFya2VycygpKTtcbiAgICAgICAgLy8gVXBkYXRlIG1hcmtlciBwb3N0aW9uIHdoZW4gcGF1c2VkIGFzIHRpbWVzaGlmdCByYW5nZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMuY29uZmlndXJlTGl2ZVBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIoKCkgPT4gdGhpcy51cGRhdGVNYXJrZXJzKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMudXBkYXRlTWFya2VycygpKTtcbiAgICB0aGlzLnVpbWFuYWdlci5vblJlbGVhc2Uuc3Vic2NyaWJlKCgpID0+IHRoaXMudWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQudW5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVNYXJrZXJzKCkpKTtcblxuICAgIC8vIEluaXQgbWFya2VycyBhdCBzdGFydHVwXG4gICAgdGhpcy51cGRhdGVNYXJrZXJzKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya2VyQXRQb3NpdGlvbihwZXJjZW50YWdlOiBudW1iZXIpOiBTZWVrQmFyTWFya2VyIHwgbnVsbCB7XG4gICAgY29uc3Qgc25hcHBpbmdSYW5nZSA9IHRoaXMuY29uZmlnLnNuYXBwaW5nUmFuZ2U7XG5cbiAgICBjb25zdCBtYXRjaGluZ01hcmtlciA9IHRoaXMudGltZWxpbmVNYXJrZXJzLmZpbmQobWFya2VyID0+IHtcbiAgICAgIGNvbnN0IGhhc0R1cmF0aW9uID0gbWFya2VyLmR1cmF0aW9uID4gMDtcbiAgICAgIC8vIEhhbmRsZSBpbnRlcnZhbCBtYXJrZXJzXG4gICAgICBjb25zdCBpbnRlcnZhbE1hcmtlck1hdGNoID1cbiAgICAgICAgaGFzRHVyYXRpb24gJiZcbiAgICAgICAgcGVyY2VudGFnZSA+PSBtYXJrZXIucG9zaXRpb24gLSBzbmFwcGluZ1JhbmdlICYmXG4gICAgICAgIHBlcmNlbnRhZ2UgPD0gbWFya2VyLnBvc2l0aW9uICsgbWFya2VyLmR1cmF0aW9uICsgc25hcHBpbmdSYW5nZTtcblxuICAgICAgLy8gSGFuZGxlIHBvc2l0aW9uIG1hcmtlcnNcbiAgICAgIGNvbnN0IHBvc2l0aW9uTWFya2VyTWF0Y2ggPVxuICAgICAgICBwZXJjZW50YWdlID49IG1hcmtlci5wb3NpdGlvbiAtIHNuYXBwaW5nUmFuZ2UgJiZcbiAgICAgICAgcGVyY2VudGFnZSA8PSBtYXJrZXIucG9zaXRpb24gKyBzbmFwcGluZ1JhbmdlO1xuXG4gICAgICByZXR1cm4gaW50ZXJ2YWxNYXJrZXJNYXRjaCB8fCBwb3NpdGlvbk1hcmtlck1hdGNoO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hdGNoaW5nTWFya2VyIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyTWFya2VycygpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVsaW5lTWFya2VycyA9IFtdO1xuICAgIHRoaXMubWFya2Vyc0NvbnRhaW5lci5lbXB0eSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVNYXJrZXJGcm9tQ29uZmlnKG1hcmtlcjogVGltZWxpbmVNYXJrZXIpOiB2b2lkIHtcbiAgICB0aGlzLnVpbWFuYWdlci5nZXRDb25maWcoKS5tZXRhZGF0YS5tYXJrZXJzID0gdGhpcy51aW1hbmFnZXIuZ2V0Q29uZmlnKCkubWV0YWRhdGEubWFya2Vycy5maWx0ZXIoX21hcmtlciA9PiBtYXJrZXIgIT09IF9tYXJrZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJSZW1vdmVkTWFya2VycygpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVsaW5lTWFya2VycyA9IHRoaXMudGltZWxpbmVNYXJrZXJzLmZpbHRlcihzZWVrYmFyTWFya2VyID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nTWFya2VyID0gdGhpcy51aW1hbmFnZXIuZ2V0Q29uZmlnKCkubWV0YWRhdGEubWFya2Vycy5maW5kKF9tYXJrZXIgPT4gc2Vla2Jhck1hcmtlci5tYXJrZXIgPT09IF9tYXJrZXIpO1xuICAgICAgaWYgKCFtYXRjaGluZ01hcmtlcikge1xuICAgICAgICB0aGlzLnJlbW92ZU1hcmtlckZyb21ET00oc2Vla2Jhck1hcmtlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2hpbmdNYXJrZXI7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU1hcmtlckZyb21ET00obWFya2VyOiBTZWVrQmFyTWFya2VyKTogdm9pZCB7XG4gICAgaWYgKG1hcmtlci5lbGVtZW50KSB7XG4gICAgICBtYXJrZXIuZWxlbWVudC5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1hcmtlcnMoKTogdm9pZCB7XG4gICAgaWYgKCFzaG91bGRQcm9jZXNzTWFya2Vycyh0aGlzLnBsYXllciwgdGhpcy51aW1hbmFnZXIpKSB7XG4gICAgICB0aGlzLmNsZWFyTWFya2VycygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyUmVtb3ZlZE1hcmtlcnMoKTtcblxuICAgIHRoaXMudWltYW5hZ2VyLmdldENvbmZpZygpLm1ldGFkYXRhLm1hcmtlcnMuZm9yRWFjaChtYXJrZXIgPT4ge1xuICAgICAgY29uc3QgeyBtYXJrZXJQb3NpdGlvbiwgbWFya2VyRHVyYXRpb24gfSA9IGdldE1hcmtlclBvc2l0aW9ucyh0aGlzLnBsYXllciwgbWFya2VyKTtcblxuICAgICAgaWYgKHNob3VsZFJlbW92ZU1hcmtlcihtYXJrZXJQb3NpdGlvbiwgbWFya2VyRHVyYXRpb24pKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTWFya2VyRnJvbUNvbmZpZyhtYXJrZXIpO1xuICAgICAgfSBlbHNlIGlmIChtYXJrZXJQb3NpdGlvbiA8PSAxMDApIHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdNYXJrZXIgPSB0aGlzLnRpbWVsaW5lTWFya2Vycy5maW5kKHNlZWtiYXJNYXJrZXIgPT4gc2Vla2Jhck1hcmtlci5tYXJrZXIgPT09IG1hcmtlcik7XG5cbiAgICAgICAgaWYgKG1hdGNoaW5nTWFya2VyKSB7XG4gICAgICAgICAgbWF0Y2hpbmdNYXJrZXIucG9zaXRpb24gPSBtYXJrZXJQb3NpdGlvbjtcbiAgICAgICAgICBtYXRjaGluZ01hcmtlci5kdXJhdGlvbiA9IG1hcmtlckR1cmF0aW9uO1xuXG4gICAgICAgICAgdGhpcy51cGRhdGVNYXJrZXJET00obWF0Y2hpbmdNYXJrZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5ld01hcmtlcjogU2Vla0Jhck1hcmtlciA9IHsgbWFya2VyLCBwb3NpdGlvbjogbWFya2VyUG9zaXRpb24sIGR1cmF0aW9uOiBtYXJrZXJEdXJhdGlvbiB9O1xuICAgICAgICAgIHRoaXMudGltZWxpbmVNYXJrZXJzLnB1c2gobmV3TWFya2VyKTtcblxuICAgICAgICAgIHRoaXMuY3JlYXRlTWFya2VyRE9NKG5ld01hcmtlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFya2VyQ3NzUHJvcGVydGllcyhtYXJrZXI6IFNlZWtCYXJNYXJrZXIpOiB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBzZWVrQmFyV2lkdGhQeCA9IHRoaXMuZ2V0U2Vla0JhcldpZHRoKCk7XG5cbiAgICBjb25zdCBwb3NpdGlvbkluUHggPSAoc2Vla0JhcldpZHRoUHggLyAxMDApICogKG1hcmtlci5wb3NpdGlvbiA8IDAgPyAwIDogbWFya2VyLnBvc2l0aW9uKTtcbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzOiB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgJ3RyYW5zZm9ybSc6IGB0cmFuc2xhdGVYKCR7cG9zaXRpb25JblB4fXB4KWAsXG4gICAgfTtcblxuICAgIGlmIChtYXJrZXIuZHVyYXRpb24gPiAwKSB7XG4gICAgICBjb25zdCBtYXJrZXJXaWR0aFB4ID0gTWF0aC5yb3VuZChzZWVrQmFyV2lkdGhQeCAvIDEwMCAqIG1hcmtlci5kdXJhdGlvbik7XG4gICAgICBjc3NQcm9wZXJ0aWVzWyd3aWR0aCddID0gYCR7bWFya2VyV2lkdGhQeH1weGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNzc1Byb3BlcnRpZXM7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1hcmtlckRPTShtYXJrZXI6IFNlZWtCYXJNYXJrZXIpOiB2b2lkIHtcbiAgICBtYXJrZXIuZWxlbWVudC5jc3ModGhpcy5nZXRNYXJrZXJDc3NQcm9wZXJ0aWVzKG1hcmtlcikpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNYXJrZXJET00obWFya2VyOiBTZWVrQmFyTWFya2VyKTogdm9pZCB7XG4gICAgY29uc3QgbWFya2VyQ2xhc3NlcyA9IFsnc2Vla2Jhci1tYXJrZXInXS5jb25jYXQobWFya2VyLm1hcmtlci5jc3NDbGFzc2VzIHx8IFtdKVxuICAgICAgLm1hcChjc3NDbGFzcyA9PiB0aGlzLnByZWZpeENzcyhjc3NDbGFzcykpO1xuXG4gICAgY29uc3QgbWFya2VyRWxlbWVudCA9IG5ldyBET00oJ2RpdicsIHtcbiAgICAgICdjbGFzcyc6IG1hcmtlckNsYXNzZXMuam9pbignICcpLFxuICAgICAgJ2RhdGEtbWFya2VyLXRpbWUnOiBTdHJpbmcobWFya2VyLm1hcmtlci50aW1lKSxcbiAgICAgICdkYXRhLW1hcmtlci10aXRsZSc6IFN0cmluZyhtYXJrZXIubWFya2VyLnRpdGxlKSxcbiAgICB9KS5jc3ModGhpcy5nZXRNYXJrZXJDc3NQcm9wZXJ0aWVzKG1hcmtlcikpO1xuXG4gICAgaWYgKG1hcmtlci5tYXJrZXIuaW1hZ2VVcmwpIHtcbiAgICAgIGNvbnN0IHJlbW92ZUltYWdlID0gKCkgPT4ge1xuICAgICAgICBpbWFnZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBuZXcgRE9NKCdpbWcnLCB7XG4gICAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCdzZWVrYmFyLW1hcmtlci1pbWFnZScpLFxuICAgICAgICAnc3JjJzogbWFya2VyLm1hcmtlci5pbWFnZVVybCxcbiAgICAgIH0pLm9uKCdlcnJvcicsIHJlbW92ZUltYWdlKTtcblxuICAgICAgbWFya2VyRWxlbWVudC5hcHBlbmQoaW1hZ2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICBtYXJrZXIuZWxlbWVudCA9IG1hcmtlckVsZW1lbnQ7XG4gICAgdGhpcy5tYXJrZXJzQ29udGFpbmVyLmFwcGVuZChtYXJrZXJFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWFya2Vyc0RPTSgpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVsaW5lTWFya2Vycy5mb3JFYWNoKG1hcmtlciA9PiB7XG4gICAgICBpZiAobWFya2VyLmVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVNYXJrZXJET00obWFya2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3JlYXRlTWFya2VyRE9NKG1hcmtlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZUxpdmVQYXVzZWRUaW1lc2hpZnRVcGRhdGVyKFxuICAgIGhhbmRsZXI6ICgpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIC8vIFJlZ3VsYXJseSB1cGRhdGUgdGhlIG1hcmtlciBwb3NpdGlvbiB3aGlsZSB0aGUgdGltZW91dCBpcyBhY3RpdmVcbiAgICB0aGlzLnBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIgPSBuZXcgVGltZW91dCgxMDAwLCBoYW5kbGVyLCB0cnVlKTtcblxuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGF1c2VkLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaXNMaXZlKCkgJiYgdGhpcy5wbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCkgPCAwKSB7XG4gICAgICAgIHRoaXMucGF1c2VkVGltZXNoaWZ0VXBkYXRlci5zdGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3RvcCB1cGRhdGVyIHdoZW4gcGxheWJhY2sgY29udGludWVzIChubyBtYXR0ZXIgaWYgdGhlIHVwZGF0ZXIgd2FzIHN0YXJ0ZWQgYmVmb3JlKVxuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheSwgKCkgPT4gdGhpcy5wYXVzZWRUaW1lc2hpZnRVcGRhdGVyLmNsZWFyKCkpO1xuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuRGVzdHJveSwgKCkgPT4gdGhpcy5wYXVzZWRUaW1lc2hpZnRVcGRhdGVyLmNsZWFyKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByZWZpeENzcyhjc3NDbGFzc09ySWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmNzc1ByZWZpeCArICctJyArIGNzc0NsYXNzT3JJZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYXJrZXJQb3NpdGlvbnMocGxheWVyOiBQbGF5ZXJBUEksIG1hcmtlcjogVGltZWxpbmVNYXJrZXIpIHtcbiAgY29uc3QgZHVyYXRpb24gPSBnZXREdXJhdGlvbihwbGF5ZXIpO1xuXG4gIGNvbnN0IG1hcmtlclBvc2l0aW9uID0gMTAwIC8gZHVyYXRpb24gKiBnZXRNYXJrZXJUaW1lKG1hcmtlciwgcGxheWVyLCBkdXJhdGlvbik7IC8vIGNvbnZlcnQgYWJzb2x1dGUgdGltZSB0byBwZXJjZW50YWdlXG4gIGxldCBtYXJrZXJEdXJhdGlvbiA9IDEwMCAvIGR1cmF0aW9uICogbWFya2VyLmR1cmF0aW9uO1xuXG4gIGlmIChtYXJrZXJQb3NpdGlvbiA8IDAgJiYgIWlzTmFOKG1hcmtlckR1cmF0aW9uKSkge1xuICAgIC8vIFNocmluayBtYXJrZXIgZHVyYXRpb24gZm9yIG9uIGxpdmUgc3RyZWFtcyBhcyB0aGV5IHJlYWNoIGVuZFxuICAgIG1hcmtlckR1cmF0aW9uID0gbWFya2VyRHVyYXRpb24gKyBtYXJrZXJQb3NpdGlvbjtcbiAgfVxuXG4gIGlmICgxMDAgLSBtYXJrZXJQb3NpdGlvbiA8IG1hcmtlckR1cmF0aW9uKSB7XG4gICAgLy8gU2hyaW5rIG1hcmtlciBpZiBpdCBvdmVyZmxvd3MgdGltZWxpbmVcbiAgICBtYXJrZXJEdXJhdGlvbiA9IDEwMCAtIG1hcmtlclBvc2l0aW9uO1xuICB9XG5cbiAgcmV0dXJuIHsgbWFya2VyRHVyYXRpb24sIG1hcmtlclBvc2l0aW9uIH07XG59XG5cbmZ1bmN0aW9uIGdldE1hcmtlclRpbWUobWFya2VyOiBUaW1lbGluZU1hcmtlciwgcGxheWVyOiBQbGF5ZXJBUEksIGR1cmF0aW9uOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoIXBsYXllci5pc0xpdmUoKSkge1xuICAgIHJldHVybiBtYXJrZXIudGltZTtcbiAgfVxuXG4gIHJldHVybiBkdXJhdGlvbiAtIChQbGF5ZXJVdGlscy5nZXRTZWVrYWJsZVJhbmdlUmVzcGVjdGluZ0xpdmUocGxheWVyKS5lbmQgLSBtYXJrZXIudGltZSk7XG59XG5cbmZ1bmN0aW9uIGdldER1cmF0aW9uKHBsYXllcjogUGxheWVyQVBJKTogbnVtYmVyIHtcbiAgaWYgKCFwbGF5ZXIuaXNMaXZlKCkpIHtcbiAgICByZXR1cm4gcGxheWVyLmdldER1cmF0aW9uKCk7XG4gIH1cbiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSBQbGF5ZXJVdGlscy5nZXRTZWVrYWJsZVJhbmdlUmVzcGVjdGluZ0xpdmUocGxheWVyKTtcblxuICByZXR1cm4gZW5kIC0gc3RhcnQ7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZU1hcmtlcihtYXJrZXJQb3NpdGlvbjogbnVtYmVyLCBtYXJrZXJEdXJhdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAobWFya2VyRHVyYXRpb24gPCAwIHx8IGlzTmFOKG1hcmtlckR1cmF0aW9uKSkgJiYgbWFya2VyUG9zaXRpb24gPCAwO1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcm9jZXNzTWFya2VycyhwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IGJvb2xlYW4ge1xuICAvLyBEb24ndCBnZW5lcmF0ZSB0aW1lbGluZSBtYXJrZXJzIGlmIHdlIGRvbid0IHlldCBoYXZlIGEgZHVyYXRpb25cbiAgLy8gVGhlIGR1cmF0aW9uIGNoZWNrIGlzIGZvciBidWdneSBwbGF0Zm9ybXMgd2hlcmUgdGhlIGR1cmF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW5zdGFudGx5IChDaHJvbWUgb24gQW5kcm9pZCA0LjMpXG4gIGNvbnN0IHZhbGlkVG9Qcm9jZXNzID0gcGxheWVyLmdldER1cmF0aW9uKCkgIT09IEluZmluaXR5IHx8IHBsYXllci5pc0xpdmUoKTtcbiAgY29uc3QgaGFzTWFya2VycyA9IHVpbWFuYWdlci5nZXRDb25maWcoKS5tZXRhZGF0YS5tYXJrZXJzLmxlbmd0aCA+IDA7XG5cbiAgcmV0dXJuIHZhbGlkVG9Qcm9jZXNzICYmIGhhc01hcmtlcnM7XG59XG4iLCJpbXBvcnQge0NvbnRhaW5lciwgQ29udGFpbmVyQ29uZmlnfSBmcm9tICcuL2NvbnRhaW5lcic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtNZXRhZGF0YUxhYmVsLCBNZXRhZGF0YUxhYmVsQ29udGVudH0gZnJvbSAnLi9tZXRhZGF0YWxhYmVsJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIFRpdGxlQmFyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaXRsZUJhckNvbmZpZyBleHRlbmRzIENvbnRhaW5lckNvbmZpZyB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaWYgdGhlIHRpdGxlIGJhciBzaG91bGQgc3RheSBoaWRkZW4gd2hlbiBubyBtZXRhZGF0YSBsYWJlbCBjb250YWlucyBhbnkgdGV4dC4gRG9lcyBub3QgbWFrZSBhIGxvdFxuICAgKiBvZiBzZW5zZSBpZiB0aGUgdGl0bGUgYmFyIGNvbnRhaW5zIG90aGVyIGNvbXBvbmVudHMgdGhhbiBqdXN0IE1ldGFkYXRhTGFiZWxzIChsaWtlIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24pLlxuICAgKiBEZWZhdWx0OiBmYWxzZVxuICAgKi9cbiAga2VlcEhpZGRlbldpdGhvdXRNZXRhZGF0YT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGlzcGxheXMgYSB0aXRsZSBiYXIgY29udGFpbmluZyBhIGxhYmVsIHdpdGggdGhlIHRpdGxlIG9mIHRoZSB2aWRlby5cbiAqL1xuZXhwb3J0IGNsYXNzIFRpdGxlQmFyIGV4dGVuZHMgQ29udGFpbmVyPFRpdGxlQmFyQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBUaXRsZUJhckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktdGl0bGViYXInLFxuICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBuZXcgTWV0YWRhdGFMYWJlbCh7IGNvbnRlbnQ6IE1ldGFkYXRhTGFiZWxDb250ZW50LlRpdGxlIH0pLFxuICAgICAgICBuZXcgTWV0YWRhdGFMYWJlbCh7IGNvbnRlbnQ6IE1ldGFkYXRhTGFiZWxDb250ZW50LkRlc2NyaXB0aW9uIH0pLFxuICAgICAgXSxcbiAgICAgIGtlZXBIaWRkZW5XaXRob3V0TWV0YWRhdGE6IGZhbHNlLFxuICAgIH0sIDxUaXRsZUJhckNvbmZpZz50aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbGV0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgbGV0IHNob3VsZEJlU2hvd24gPSAhdGhpcy5pc0hpZGRlbigpO1xuICAgIGxldCBoYXNNZXRhZGF0YVRleHQgPSB0cnVlOyAvLyBGbGFnIHRvIHRyYWNrIGlmIGFueSBtZXRhZGF0YSBsYWJlbCBjb250YWlucyB0ZXh0XG5cbiAgICBsZXQgY2hlY2tNZXRhZGF0YVRleHRBbmRVcGRhdGVWaXNpYmlsaXR5ID0gKCkgPT4ge1xuICAgICAgaGFzTWV0YWRhdGFUZXh0ID0gZmFsc2U7XG5cbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBtZXRhZGF0YSBsYWJlbHMgYW5kIGNoZWNrIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGNvbnRhaW5zIHRleHRcbiAgICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiB0aGlzLmdldENvbXBvbmVudHMoKSkge1xuICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTWV0YWRhdGFMYWJlbCkge1xuICAgICAgICAgIGlmICghY29tcG9uZW50LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgaGFzTWV0YWRhdGFUZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgICAgLy8gSGlkZSBhIHZpc2libGUgdGl0bGViYXIgaWYgaXQgZG9lcyBub3QgY29udGFpbiBhbnkgdGV4dCBhbmQgdGhlIGhpZGRlbiBmbGFnIGlzIHNldFxuICAgICAgICBpZiAoY29uZmlnLmtlZXBIaWRkZW5XaXRob3V0TWV0YWRhdGEgJiYgIWhhc01ldGFkYXRhVGV4dCkge1xuICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNob3VsZEJlU2hvd24pIHtcbiAgICAgICAgLy8gU2hvdyBhIGhpZGRlbiB0aXRsZWJhciBpZiBpdCBzaG91bGQgYWN0dWFsbHkgYmUgc2hvd25cbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIExpc3RlbiB0byB0ZXh0IGNoYW5nZSBldmVudHMgdG8gdXBkYXRlIHRoZSBoYXNNZXRhZGF0YVRleHQgZmxhZyB3aGVuIHRoZSBtZXRhZGF0YSBkeW5hbWljYWxseSBjaGFuZ2VzXG4gICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0Q29tcG9uZW50cygpKSB7XG4gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgTWV0YWRhdGFMYWJlbCkge1xuICAgICAgICBjb21wb25lbnQub25UZXh0Q2hhbmdlZC5zdWJzY3JpYmUoY2hlY2tNZXRhZGF0YVRleHRBbmRVcGRhdGVWaXNpYmlsaXR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1aW1hbmFnZXIub25Db250cm9sc1Nob3cuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHNob3VsZEJlU2hvd24gPSB0cnVlO1xuICAgICAgaWYgKCEoY29uZmlnLmtlZXBIaWRkZW5XaXRob3V0TWV0YWRhdGEgJiYgIWhhc01ldGFkYXRhVGV4dCkpIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdWltYW5hZ2VyLm9uQ29udHJvbHNIaWRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBzaG91bGRCZVNob3duID0gZmFsc2U7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9KTtcblxuICAgIC8vIGluaXRcbiAgICBjaGVja01ldGFkYXRhVGV4dEFuZFVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgfVxufSIsImltcG9ydCB7QnV0dG9uLCBCdXR0b25Db25maWd9IGZyb20gJy4vYnV0dG9uJztcbmltcG9ydCB7Tm9BcmdzLCBFdmVudERpc3BhdGNoZXIsIEV2ZW50fSBmcm9tICcuLi9ldmVudGRpc3BhdGNoZXInO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IExvY2FsaXphYmxlVGV4dCB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgYSB0b2dnbGUgYnV0dG9uIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb2dnbGVCdXR0b25Db25maWcgZXh0ZW5kcyBCdXR0b25Db25maWcge1xuICAvKipcbiAgICogVGhlIENTUyBjbGFzcyB0aGF0IG1hcmtzIHRoZSBvbi1zdGF0ZSBvZiB0aGUgYnV0dG9uLlxuICAgKi9cbiAgb25DbGFzcz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBDU1MgY2xhc3MgdGhhdCBtYXJrcyB0aGUgb2ZmLXN0YXRlIG9mIHRoZSBidXR0b24uXG4gICAqL1xuICBvZmZDbGFzcz86IHN0cmluZztcbiAgLyoqXG4gICAqIFdDQUcyMCBzdGFuZGFyZCBmb3IgZGVmaW5pbmcgaW5mbyBhYm91dCB0aGUgY29tcG9uZW50ICh1c3VhbGx5IHRoZSBuYW1lKVxuICAgKlxuICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYG9uQXJpYUxhYmVsYCBhbmQgYG9mZkFyaWFMYWJlbGAgZm9yIHRvZ2dsZSBidXR0b25zXG4gICAqIGFzIHRoZSBjb21wb25lbnQgY2FuIHRoZW4gdXBkYXRlIHRoZW0gYXMgdGhlIGJ1dHRvbiBpcyB1c2VkLlxuICAgKlxuICAgKiBJZiBib3RoIGBhcmlhTGFiZWxgIGFuZCBgb25BcmlhTGFiZWxgIGFyZSBzZXQsIGBvbkFyaWFMYWJlbGAgaXMgdXNlZC5cbiAgICovXG4gIGFyaWFMYWJlbD86IExvY2FsaXphYmxlVGV4dDtcbiAgLyoqXG4gICAqIFRoZSBhcmlhIGxhYmVsIHRoYXQgbWFya3MgdGhlIG9uLXN0YXRlIG9mIHRoZSBidXR0b24uXG4gICAqL1xuICBvbkFyaWFMYWJlbD86IExvY2FsaXphYmxlVGV4dDtcbiAgLyoqXG4gICAqIFRoZSBhcmlhIGxhYmVsIHRoYXQgbWFya3MgdGhlIG9mZi1zdGF0ZSBvZiB0aGUgYnV0dG9uLlxuICAgKi9cbiAgb2ZmQXJpYUxhYmVsPzogTG9jYWxpemFibGVUZXh0O1xuICAvKipcbiAgICogVGhlIHRleHQgYXMgc3RyaW5nIG9yIGFzIGxvY2FsaXplIGNhbGxiYWNrIG9uIHRoZSBidXR0b24uXG4gICAqL1xuICB0ZXh0PzogTG9jYWxpemFibGVUZXh0O1xufVxuXG4vKipcbiAqIEEgYnV0dG9uIHRoYXQgY2FuIGJlIHRvZ2dsZWQgYmV0d2VlbiAnb24nIGFuZCAnb2ZmJyBzdGF0ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUb2dnbGVCdXR0b248Q29uZmlnIGV4dGVuZHMgVG9nZ2xlQnV0dG9uQ29uZmlnPiBleHRlbmRzIEJ1dHRvbjxDb25maWc+IHtcblxuICBwcml2YXRlIG9uU3RhdGU6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSB0b2dnbGVCdXR0b25FdmVudHMgPSB7XG4gICAgb25Ub2dnbGU6IG5ldyBFdmVudERpc3BhdGNoZXI8VG9nZ2xlQnV0dG9uPENvbmZpZz4sIE5vQXJncz4oKSxcbiAgICBvblRvZ2dsZU9uOiBuZXcgRXZlbnREaXNwYXRjaGVyPFRvZ2dsZUJ1dHRvbjxDb25maWc+LCBOb0FyZ3M+KCksXG4gICAgb25Ub2dnbGVPZmY6IG5ldyBFdmVudERpc3BhdGNoZXI8VG9nZ2xlQnV0dG9uPENvbmZpZz4sIE5vQXJncz4oKSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnOiBUb2dnbGVCdXR0b25Db25maWcgPSB7XG4gICAgICBjc3NDbGFzczogJ3VpLXRvZ2dsZWJ1dHRvbicsXG4gICAgICBvbkNsYXNzOiAnb24nLFxuICAgICAgb2ZmQ2xhc3M6ICdvZmYnLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLm9uQXJpYUxhYmVsKSB7XG4gICAgICBjb25maWcuYXJpYUxhYmVsID0gY29uZmlnLm9uQXJpYUxhYmVsO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIGRlZmF1bHRDb25maWcgYXMgQ29uZmlnLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgdGhpcy5nZXREb21FbGVtZW50KCkuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoY29uZmlnLm9mZkNsYXNzKSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgYnV0dG9uIHRvIHRoZSAnb24nIHN0YXRlLlxuICAgKi9cbiAgb24oKSB7XG4gICAgaWYgKHRoaXMuaXNPZmYoKSkge1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgICAgdGhpcy5vblN0YXRlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKHRoaXMucHJlZml4Q3NzKGNvbmZpZy5vZmZDbGFzcykpO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoY29uZmlnLm9uQ2xhc3MpKTtcblxuICAgICAgdGhpcy5vblRvZ2dsZUV2ZW50KCk7XG4gICAgICB0aGlzLm9uVG9nZ2xlT25FdmVudCgpO1xuXG4gICAgICB0aGlzLnNldEFyaWFBdHRyKCdwcmVzc2VkJywgJ3RydWUnKTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLm9uQXJpYUxhYmVsKSB7XG4gICAgICAgIHRoaXMuc2V0QXJpYUxhYmVsKHRoaXMuY29uZmlnLm9uQXJpYUxhYmVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgYnV0dG9uIHRvIHRoZSAnb2ZmJyBzdGF0ZS5cbiAgICovXG4gIG9mZigpIHtcbiAgICBpZiAodGhpcy5pc09uKCkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG5cbiAgICAgIHRoaXMub25TdGF0ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoY29uZmlnLm9uQ2xhc3MpKTtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKGNvbmZpZy5vZmZDbGFzcykpO1xuXG4gICAgICB0aGlzLm9uVG9nZ2xlRXZlbnQoKTtcbiAgICAgIHRoaXMub25Ub2dnbGVPZmZFdmVudCgpO1xuXG4gICAgICB0aGlzLnNldEFyaWFBdHRyKCdwcmVzc2VkJywgJ2ZhbHNlJyk7XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5vZmZBcmlhTGFiZWwpIHtcbiAgICAgICAgdGhpcy5zZXRBcmlhTGFiZWwodGhpcy5jb25maWcub2ZmQXJpYUxhYmVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSBidXR0b24gJ29uJyBpZiBpdCBpcyAnb2ZmJywgb3IgJ29mZicgaWYgaXQgaXMgJ29uJy5cbiAgICovXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5pc09uKCkpIHtcbiAgICAgIHRoaXMub2ZmKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB0b2dnbGUgYnV0dG9uIGlzIGluIHRoZSAnb24nIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBidXR0b24gaXMgJ29uJywgZmFsc2UgaWYgJ29mZidcbiAgICovXG4gIGlzT24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub25TdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHRvZ2dsZSBidXR0b24gaXMgaW4gdGhlICdvZmYnIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBidXR0b24gaXMgJ29mZicsIGZhbHNlIGlmICdvbidcbiAgICovXG4gIGlzT2ZmKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc09uKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DbGlja0V2ZW50KCkge1xuICAgIHN1cGVyLm9uQ2xpY2tFdmVudCgpO1xuXG4gICAgLy8gRmlyZSB0aGUgdG9nZ2xlIGV2ZW50IHRvZ2V0aGVyIHdpdGggdGhlIGNsaWNrIGV2ZW50XG4gICAgLy8gKHRoZXkgYXJlIHRlY2huaWNhbGx5IHRoZSBzYW1lLCBvbmx5IHRoZSBzZW1hbnRpY3MgYXJlIGRpZmZlcmVudClcbiAgICB0aGlzLm9uVG9nZ2xlRXZlbnQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblRvZ2dsZUV2ZW50KCkge1xuICAgIHRoaXMudG9nZ2xlQnV0dG9uRXZlbnRzLm9uVG9nZ2xlLmRpc3BhdGNoKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlT25FdmVudCgpIHtcbiAgICB0aGlzLnRvZ2dsZUJ1dHRvbkV2ZW50cy5vblRvZ2dsZU9uLmRpc3BhdGNoKHRoaXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlT2ZmRXZlbnQoKSB7XG4gICAgdGhpcy50b2dnbGVCdXR0b25FdmVudHMub25Ub2dnbGVPZmYuZGlzcGF0Y2godGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIHRoZSBidXR0b24gaXMgdG9nZ2xlZC5cbiAgICogQHJldHVybnMge0V2ZW50PFRvZ2dsZUJ1dHRvbjxDb25maWc+LCBOb0FyZ3M+fVxuICAgKi9cbiAgZ2V0IG9uVG9nZ2xlKCk6IEV2ZW50PFRvZ2dsZUJ1dHRvbjxDb25maWc+LCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGVCdXR0b25FdmVudHMub25Ub2dnbGUuZ2V0RXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIGJ1dHRvbiBpcyB0b2dnbGVkICdvbicuXG4gICAqIEByZXR1cm5zIHtFdmVudDxUb2dnbGVCdXR0b248Q29uZmlnPiwgTm9BcmdzPn1cbiAgICovXG4gIGdldCBvblRvZ2dsZU9uKCk6IEV2ZW50PFRvZ2dsZUJ1dHRvbjxDb25maWc+LCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGVCdXR0b25FdmVudHMub25Ub2dnbGVPbi5nZXRFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHRvZ2dsZWQgJ29mZicuXG4gICAqIEByZXR1cm5zIHtFdmVudDxUb2dnbGVCdXR0b248Q29uZmlnPiwgTm9BcmdzPn1cbiAgICovXG4gIGdldCBvblRvZ2dsZU9mZigpOiBFdmVudDxUb2dnbGVCdXR0b248Q29uZmlnPiwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlQnV0dG9uRXZlbnRzLm9uVG9nZ2xlT2ZmLmdldEV2ZW50KCk7XG4gIH1cbn0iLCJpbXBvcnQge0NvbXBvbmVudCwgQ29tcG9uZW50Q29uZmlnfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQge0RPTX0gZnJvbSAnLi4vZG9tJztcblxuLyoqXG4gKiBBbmltYXRlZCBhbmFsb2cgVFYgc3RhdGljIG5vaXNlLlxuICovXG5leHBvcnQgY2xhc3MgVHZOb2lzZUNhbnZhcyBleHRlbmRzIENvbXBvbmVudDxDb21wb25lbnRDb25maWc+IHtcblxuICBwcml2YXRlIGNhbnZhczogRE9NO1xuXG4gIHByaXZhdGUgY2FudmFzRWxlbWVudDogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHByaXZhdGUgY2FudmFzQ29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICBwcml2YXRlIGNhbnZhc1dpZHRoID0gMTYwO1xuICBwcml2YXRlIGNhbnZhc0hlaWdodCA9IDkwO1xuICBwcml2YXRlIGludGVyZmVyZW5jZUhlaWdodCA9IDUwO1xuICBwcml2YXRlIGxhc3RGcmFtZVVwZGF0ZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBmcmFtZUludGVydmFsOiBudW1iZXIgPSA2MDtcbiAgcHJpdmF0ZSB1c2VBbmltYXRpb25GcmFtZTogYm9vbGVhbiA9ICEhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgcHJpdmF0ZSBub2lzZUFuaW1hdGlvbldpbmRvd1BvczogbnVtYmVyO1xuICBwcml2YXRlIGZyYW1lVXBkYXRlSGFuZGxlcklkOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb21wb25lbnRDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXR2bm9pc2VjYW52YXMnLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b0RvbUVsZW1lbnQoKTogRE9NIHtcbiAgICByZXR1cm4gdGhpcy5jYW52YXMgPSBuZXcgRE9NKCdjYW52YXMnLCB7ICdjbGFzcyc6IHRoaXMuZ2V0Q3NzQ2xhc3NlcygpIH0pO1xuICB9XG5cbiAgc3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jYW52YXNFbGVtZW50ID0gPEhUTUxDYW52YXNFbGVtZW50PnRoaXMuY2FudmFzLmdldCgwKTtcbiAgICB0aGlzLmNhbnZhc0NvbnRleHQgPSB0aGlzLmNhbnZhc0VsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB0aGlzLm5vaXNlQW5pbWF0aW9uV2luZG93UG9zID0gLXRoaXMuY2FudmFzSGVpZ2h0O1xuICAgIHRoaXMubGFzdEZyYW1lVXBkYXRlID0gMDtcblxuICAgIHRoaXMuY2FudmFzRWxlbWVudC53aWR0aCA9IHRoaXMuY2FudmFzV2lkdGg7XG4gICAgdGhpcy5jYW52YXNFbGVtZW50LmhlaWdodCA9IHRoaXMuY2FudmFzSGVpZ2h0O1xuXG4gICAgdGhpcy5yZW5kZXJGcmFtZSgpO1xuICB9XG5cbiAgc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy51c2VBbmltYXRpb25GcmFtZSkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5mcmFtZVVwZGF0ZUhhbmRsZXJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZyYW1lVXBkYXRlSGFuZGxlcklkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckZyYW1lKCk6IHZvaWQge1xuICAgIC8vIFRoaXMgY29kZSBoYXMgYmVlbiBjb3BpZWQgZnJvbSB0aGUgcGxheWVyIGNvbnRyb2xzLmpzIGFuZCBzaW1wbGlmaWVkXG5cbiAgICBpZiAodGhpcy5sYXN0RnJhbWVVcGRhdGUgKyB0aGlzLmZyYW1lSW50ZXJ2YWwgPiBuZXcgRGF0ZSgpLmdldFRpbWUoKSkge1xuICAgICAgLy8gSXQncyB0b28gZWFybHkgdG8gcmVuZGVyIHRoZSBuZXh0IGZyYW1lXG4gICAgICB0aGlzLnNjaGVkdWxlTmV4dFJlbmRlcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjdXJyZW50UGl4ZWxPZmZzZXQ7XG4gICAgbGV0IGNhbnZhc1dpZHRoID0gdGhpcy5jYW52YXNXaWR0aDtcbiAgICBsZXQgY2FudmFzSGVpZ2h0ID0gdGhpcy5jYW52YXNIZWlnaHQ7XG5cbiAgICAvLyBDcmVhdGUgdGV4dHVyZVxuICAgIGxldCBub2lzZUltYWdlID0gdGhpcy5jYW52YXNDb250ZXh0LmNyZWF0ZUltYWdlRGF0YShjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0KTtcblxuICAgIC8vIEZpbGwgdGV4dHVyZSB3aXRoIG5vaXNlXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBjYW52YXNIZWlnaHQ7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBjYW52YXNXaWR0aDsgeCsrKSB7XG4gICAgICAgIGN1cnJlbnRQaXhlbE9mZnNldCA9IChjYW52YXNXaWR0aCAqIHkgKiA0KSArIHggKiA0O1xuICAgICAgICBub2lzZUltYWdlLmRhdGFbY3VycmVudFBpeGVsT2Zmc2V0XSA9IE1hdGgucmFuZG9tKCkgKiAyNTU7XG4gICAgICAgIGlmICh5IDwgdGhpcy5ub2lzZUFuaW1hdGlvbldpbmRvd1BvcyB8fCB5ID4gdGhpcy5ub2lzZUFuaW1hdGlvbldpbmRvd1BvcyArIHRoaXMuaW50ZXJmZXJlbmNlSGVpZ2h0KSB7XG4gICAgICAgICAgbm9pc2VJbWFnZS5kYXRhW2N1cnJlbnRQaXhlbE9mZnNldF0gKj0gMC44NTtcbiAgICAgICAgfVxuICAgICAgICBub2lzZUltYWdlLmRhdGFbY3VycmVudFBpeGVsT2Zmc2V0ICsgMV0gPSBub2lzZUltYWdlLmRhdGFbY3VycmVudFBpeGVsT2Zmc2V0XTtcbiAgICAgICAgbm9pc2VJbWFnZS5kYXRhW2N1cnJlbnRQaXhlbE9mZnNldCArIDJdID0gbm9pc2VJbWFnZS5kYXRhW2N1cnJlbnRQaXhlbE9mZnNldF07XG4gICAgICAgIG5vaXNlSW1hZ2UuZGF0YVtjdXJyZW50UGl4ZWxPZmZzZXQgKyAzXSA9IDUwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFB1dCB0ZXh0dXJlIG9udG8gY2FudmFzXG4gICAgdGhpcy5jYW52YXNDb250ZXh0LnB1dEltYWdlRGF0YShub2lzZUltYWdlLCAwLCAwKTtcblxuICAgIHRoaXMubGFzdEZyYW1lVXBkYXRlID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgdGhpcy5ub2lzZUFuaW1hdGlvbldpbmRvd1BvcyArPSA3O1xuICAgIGlmICh0aGlzLm5vaXNlQW5pbWF0aW9uV2luZG93UG9zID4gY2FudmFzSGVpZ2h0KSB7XG4gICAgICB0aGlzLm5vaXNlQW5pbWF0aW9uV2luZG93UG9zID0gLWNhbnZhc0hlaWdodDtcbiAgICB9XG5cbiAgICB0aGlzLnNjaGVkdWxlTmV4dFJlbmRlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZU5leHRSZW5kZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudXNlQW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHRoaXMuZnJhbWVVcGRhdGVIYW5kbGVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyRnJhbWUuYmluZCh0aGlzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZnJhbWVVcGRhdGVIYW5kbGVySWQgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJlbmRlckZyYW1lLmJpbmQodGhpcyksIHRoaXMuZnJhbWVJbnRlcnZhbCk7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IHtDb250YWluZXJDb25maWcsIENvbnRhaW5lcn0gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHtUaW1lb3V0fSBmcm9tICcuLi90aW1lb3V0JztcbmltcG9ydCB7UGxheWVyVXRpbHN9IGZyb20gJy4uL3BsYXllcnV0aWxzJztcbmltcG9ydCB7IENhbmNlbEV2ZW50QXJncywgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vZXZlbnRkaXNwYXRjaGVyJztcbmltcG9ydCB7IFBsYXllckFQSSwgUGxheWVyUmVzaXplZEV2ZW50IH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIFVJQ29udGFpbmVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVSUNvbnRhaW5lckNvbmZpZyBleHRlbmRzIENvbnRhaW5lckNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBjb250cm9sIGJhciB3aWxsIGJlIGhpZGRlbiB3aGVuIHRoZXJlIGlzIG5vIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAqIFNldCB0byAtMSBmb3IgdGhlIFVJIHRvIGJlIGFsd2F5cyBzaG93bi5cbiAgICogRGVmYXVsdDogNSBzZWNvbmRzICg1MDAwKVxuICAgKi9cbiAgaGlkZURlbGF5PzogbnVtYmVyO1xuICAvKipcbiAgICogQW4gYXJyYXkgb2YgcGxheWVyIHN0YXRlcyBpbiB3aGljaCB0aGUgVUkgd2lsbCBub3QgYmUgaGlkZGVuLCBubyBtYXR0ZXIgd2hhdCB0aGUge0BsaW5rIGhpZGVEZWxheX0gaXMuXG4gICAqL1xuICBoaWRlUGxheWVyU3RhdGVFeGNlcHRpb25zPzogUGxheWVyVXRpbHMuUGxheWVyU3RhdGVbXTtcbiAgLyoqXG4gICAqIFRoZSBIVE1MIGVsZW1lbnQgb24gd2hpY2ggdXNlciBpbnRlcmFjdGlvbiBldmVudHMgKGUuZy4gbW91c2UgYW5kIHRvdWNoIGV2ZW50cykgd2lsbCBiZSB0cmFja2VkIHRvIGRldGVjdFxuICAgKiBpbnRlcmFjdGlvbiB3aXRoIHRoZSBVSS4gVGhlc2UgYmFzaWNhbGx5IHRyaWdnZXIgc2hvd2luZyBhbmQgaGlkaW5nIG9mIHRoZSBVSS5cbiAgICogRGVmYXVsdDogdGhlIFVJIGNvbnRhaW5lciBpdHNlbGZcbiAgICovXG4gIHVzZXJJbnRlcmFjdGlvbkV2ZW50U291cmNlPzogSFRNTEVsZW1lbnQ7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgY29udGFpbmVyIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBVSS4gVGhlIFVJQ29udGFpbmVyIGlzIHBhc3NlZCB0byB0aGUge0BsaW5rIFVJTWFuYWdlcn0gdG8gYnVpbGQgYW5kXG4gKiBzZXR1cCB0aGUgVUkuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSUNvbnRhaW5lciBleHRlbmRzIENvbnRhaW5lcjxVSUNvbnRhaW5lckNvbmZpZz4ge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNUQVRFX1BSRUZJWCA9ICdwbGF5ZXItc3RhdGUtJztcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBGVUxMU0NSRUVOID0gJ2Z1bGxzY3JlZW4nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBCVUZGRVJJTkcgPSAnYnVmZmVyaW5nJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkVNT1RFX0NPTlRST0wgPSAncmVtb3RlLWNvbnRyb2wnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDT05UUk9MU19TSE9XTiA9ICdjb250cm9scy1zaG93bic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENPTlRST0xTX0hJRERFTiA9ICdjb250cm9scy1oaWRkZW4nO1xuXG4gIHByaXZhdGUgdWlIaWRlVGltZW91dDogVGltZW91dDtcbiAgcHJpdmF0ZSBwbGF5ZXJTdGF0ZUNoYW5nZTogRXZlbnREaXNwYXRjaGVyPFVJQ29udGFpbmVyLCBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZT47XG5cbiAgcHJpdmF0ZSB1c2VySW50ZXJhY3Rpb25FdmVudFNvdXJjZTogRE9NO1xuICBwcml2YXRlIHVzZXJJbnRlcmFjdGlvbkV2ZW50czogeyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QgfVtdO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogVUlDb250YWluZXJDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywgPFVJQ29udGFpbmVyQ29uZmlnPntcbiAgICAgIGNzc0NsYXNzOiAndWktdWljb250YWluZXInLFxuICAgICAgcm9sZTogJ3JlZ2lvbicsXG4gICAgICBhcmlhTGFiZWw6IGkxOG4uZ2V0TG9jYWxpemVyKCdwbGF5ZXInKSxcbiAgICAgIGhpZGVEZWxheTogNTAwMCxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG5cbiAgICB0aGlzLnBsYXllclN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RGlzcGF0Y2hlcjxVSUNvbnRhaW5lciwgUGxheWVyVXRpbHMuUGxheWVyU3RhdGU+KCk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuXG4gICAgaWYgKGNvbmZpZy51c2VySW50ZXJhY3Rpb25FdmVudFNvdXJjZSkge1xuICAgICAgdGhpcy51c2VySW50ZXJhY3Rpb25FdmVudFNvdXJjZSA9IG5ldyBET00oY29uZmlnLnVzZXJJbnRlcmFjdGlvbkV2ZW50U291cmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51c2VySW50ZXJhY3Rpb25FdmVudFNvdXJjZSA9IHRoaXMuZ2V0RG9tRWxlbWVudCgpO1xuICAgIH1cblxuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLmNvbmZpZ3VyZVVJU2hvd0hpZGUocGxheWVyLCB1aW1hbmFnZXIpO1xuICAgIHRoaXMuY29uZmlndXJlUGxheWVyU3RhdGVzKHBsYXllciwgdWltYW5hZ2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlVUlTaG93SGlkZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIGxldCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuXG4gICAgaWYgKGNvbmZpZy5oaWRlRGVsYXkgPT09IC0xKSB7XG4gICAgICB1aW1hbmFnZXIub25Db25maWd1cmVkLnN1YnNjcmliZSgoKSA9PiB1aW1hbmFnZXIub25Db250cm9sc1Nob3cuZGlzcGF0Y2godGhpcykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpc1VpU2hvd24gPSBmYWxzZTtcbiAgICBsZXQgaXNTZWVraW5nID0gZmFsc2U7XG4gICAgbGV0IGlzRmlyc3RUb3VjaCA9IHRydWU7XG4gICAgbGV0IHBsYXllclN0YXRlOiBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZTtcblxuICAgIGNvbnN0IGhpZGluZ1ByZXZlbnRlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiBjb25maWcuaGlkZVBsYXllclN0YXRlRXhjZXB0aW9ucyAmJiBjb25maWcuaGlkZVBsYXllclN0YXRlRXhjZXB0aW9ucy5pbmRleE9mKHBsYXllclN0YXRlKSA+IC0xO1xuICAgIH07XG5cbiAgICBsZXQgc2hvd1VpID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc1VpU2hvd24pIHtcbiAgICAgICAgLy8gTGV0IHN1YnNjcmliZXJzIGtub3cgdGhhdCB0aGV5IHNob3VsZCByZXZlYWwgdGhlbXNlbHZlc1xuICAgICAgICB1aW1hbmFnZXIub25Db250cm9sc1Nob3cuZGlzcGF0Y2godGhpcyk7XG4gICAgICAgIGlzVWlTaG93biA9IHRydWU7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCB0cmlnZ2VyIHRpbWVvdXQgd2hpbGUgc2Vla2luZyAoaXQgd2lsbCBiZSB0cmlnZ2VyZWQgb25jZSB0aGUgc2VlayBpcyBmaW5pc2hlZCkgb3IgY2FzdGluZ1xuICAgICAgaWYgKCFpc1NlZWtpbmcgJiYgIXBsYXllci5pc0Nhc3RpbmcoKSAmJiAhaGlkaW5nUHJldmVudGVkKCkpIHtcbiAgICAgICAgdGhpcy51aUhpZGVUaW1lb3V0LnN0YXJ0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCBoaWRlVWkgPSAoKSA9PiB7XG4gICAgICAvLyBIaWRlIHRoZSBVSSBvbmx5IGlmIGl0IGlzIHNob3duLCBhbmQgaWYgbm90IGNhc3RpbmdcbiAgICAgIGlmIChpc1VpU2hvd24gJiYgIXBsYXllci5pc0Nhc3RpbmcoKSkge1xuICAgICAgICAvLyBJc3N1ZSBhIHByZXZpZXcgZXZlbnQgdG8gY2hlY2sgaWYgd2UgYXJlIGdvb2QgdG8gaGlkZSB0aGUgY29udHJvbHNcbiAgICAgICAgbGV0IHByZXZpZXdIaWRlRXZlbnRBcmdzID0gPENhbmNlbEV2ZW50QXJncz57fTtcbiAgICAgICAgdWltYW5hZ2VyLm9uUHJldmlld0NvbnRyb2xzSGlkZS5kaXNwYXRjaCh0aGlzLCBwcmV2aWV3SGlkZUV2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKCFwcmV2aWV3SGlkZUV2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgcHJldmlldyB3YXNuJ3QgY2FuY2VsZWQsIGxldCBzdWJzY3JpYmVycyBrbm93IHRoYXQgdGhleSBzaG91bGQgbm93IGhpZGUgdGhlbXNlbHZlc1xuICAgICAgICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzSGlkZS5kaXNwYXRjaCh0aGlzKTtcbiAgICAgICAgICBpc1VpU2hvd24gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiB0aGUgaGlkZSBwcmV2aWV3IHdhcyBjYW5jZWxlZCwgY29udGludWUgdG8gc2hvdyBVSVxuICAgICAgICAgIHNob3dVaSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFRpbWVvdXQgdG8gZGVmZXIgVUkgaGlkaW5nIGJ5IHRoZSBjb25maWd1cmVkIGRlbGF5IHRpbWVcbiAgICB0aGlzLnVpSGlkZVRpbWVvdXQgPSBuZXcgVGltZW91dChjb25maWcuaGlkZURlbGF5LCBoaWRlVWkpO1xuXG4gICAgdGhpcy51c2VySW50ZXJhY3Rpb25FdmVudHMgPSBbe1xuICAgICAgLy8gT24gdG91Y2ggZGlzcGxheXMsIHRoZSBmaXJzdCB0b3VjaCByZXZlYWxzIHRoZSBVSVxuICAgICAgbmFtZTogJ3RvdWNoZW5kJyxcbiAgICAgIGhhbmRsZXI6IChlKSA9PiB7XG4gICAgICAgIGlmICghaXNVaVNob3duKSB7XG4gICAgICAgICAgLy8gT25seSBpZiB0aGUgVUkgaXMgaGlkZGVuLCB3ZSBwcmV2ZW50IG90aGVyIGFjdGlvbnMgKGV4Y2VwdCBmb3IgdGhlIGZpcnN0IHRvdWNoKSBhbmQgcmV2ZWFsIHRoZSBVSVxuICAgICAgICAgIC8vIGluc3RlYWQuIFRoZSBmaXJzdCB0b3VjaCBpcyBub3QgcHJldmVudGVkIHRvIGxldCBvdGhlciBsaXN0ZW5lcnMgcmVjZWl2ZSB0aGUgZXZlbnQgYW5kIHRyaWdnZXIgYW5cbiAgICAgICAgICAvLyBpbml0aWFsIGFjdGlvbiwgZS5nLiB0aGUgaHVnZSBwbGF5YmFjayBidXR0b24gY2FuIGRpcmVjdGx5IHN0YXJ0IHBsYXliYWNrIGluc3RlYWQgb2YgcmVxdWlyaW5nIGEgZG91YmxlXG4gICAgICAgICAgLy8gdGFwIHdoaWNoIDEuIHJldmVhbHMgdGhlIFVJIGFuZCAyLiBzdGFydHMgcGxheWJhY2suXG4gICAgICAgICAgaWYgKGlzRmlyc3RUb3VjaCAmJiAhcGxheWVyLmlzUGxheWluZygpKSB7XG4gICAgICAgICAgICBpc0ZpcnN0VG91Y2ggPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaG93VWkoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAvLyBXaGVuIHRoZSBtb3VzZSBlbnRlcnMsIHdlIHNob3cgdGhlIFVJXG4gICAgICBuYW1lOiAnbW91c2VlbnRlcicsXG4gICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgIHNob3dVaSgpO1xuICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAvLyBXaGVuIHRoZSBtb3VzZSBtb3ZlcyB3aXRoaW4sIHdlIHNob3cgdGhlIFVJXG4gICAgICBuYW1lOiAnbW91c2Vtb3ZlJyxcbiAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgc2hvd1VpKCk7XG4gICAgICB9LFxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdmb2N1c2luJyxcbiAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgc2hvd1VpKCk7XG4gICAgICB9LFxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdrZXlkb3duJyxcbiAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgc2hvd1VpKCk7XG4gICAgICB9LFxuICAgIH0sIHtcbiAgICAgIC8vIFdoZW4gdGhlIG1vdXNlIGxlYXZlcywgd2UgY2FuIHByZXBhcmUgdG8gaGlkZSB0aGUgVUksIGV4Y2VwdCBhIHNlZWsgaXMgZ29pbmcgb25cbiAgICAgIG5hbWU6ICdtb3VzZWxlYXZlJyxcbiAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgLy8gV2hlbiBhIHNlZWsgaXMgZ29pbmcgb24sIHRoZSBzZWVrIHNjcnViIHBvaW50ZXIgbWF5IGV4aXQgdGhlIFVJIGFyZWEgd2hpbGUgc3RpbGwgc2Vla2luZywgYW5kIHdlIGRvIG5vdFxuICAgICAgICAvLyBoaWRlIHRoZSBVSSBpbiBzdWNoIGNhc2VzXG4gICAgICAgIGlmICghaXNTZWVraW5nICYmICFoaWRpbmdQcmV2ZW50ZWQoKSkge1xuICAgICAgICAgIHRoaXMudWlIaWRlVGltZW91dC5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1dO1xuXG4gICAgdGhpcy51c2VySW50ZXJhY3Rpb25FdmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHRoaXMudXNlckludGVyYWN0aW9uRXZlbnRTb3VyY2Uub24oZXZlbnQubmFtZSwgZXZlbnQuaGFuZGxlcikpO1xuXG4gICAgdWltYW5hZ2VyLm9uU2Vlay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51aUhpZGVUaW1lb3V0LmNsZWFyKCk7IC8vIERvbid0IGhpZGUgVUkgd2hpbGUgYSBzZWVrIGlzIGluIHByb2dyZXNzXG4gICAgICBpc1NlZWtpbmcgPSB0cnVlO1xuICAgIH0pO1xuICAgIHVpbWFuYWdlci5vblNlZWtlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaXNTZWVraW5nID0gZmFsc2U7XG4gICAgICBpZiAoIWhpZGluZ1ByZXZlbnRlZCgpKSB7XG4gICAgICAgIHRoaXMudWlIaWRlVGltZW91dC5zdGFydCgpOyAvLyBSZS1lbmFibGUgVUkgaGlkZSB0aW1lb3V0IGFmdGVyIGEgc2Vla1xuICAgICAgfVxuICAgIH0pO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5DYXN0U3RhcnRlZCwgKCkgPT4ge1xuICAgICAgc2hvd1VpKCk7IC8vIFNob3cgVUkgd2hlbiBhIENhc3Qgc2Vzc2lvbiBoYXMgc3RhcnRlZCAoVUkgd2lsbCB0aGVuIHN0YXkgcGVybWFuZW50bHkgb24gZHVyaW5nIHRoZSBzZXNzaW9uKVxuICAgIH0pO1xuICAgIHRoaXMucGxheWVyU3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKChfLCBzdGF0ZSkgPT4ge1xuICAgICAgcGxheWVyU3RhdGUgPSBzdGF0ZTtcbiAgICAgIGlmIChoaWRpbmdQcmV2ZW50ZWQoKSkge1xuICAgICAgICAvLyBFbnRlcmluZyBhIHBsYXllciBzdGF0ZSB0aGF0IHByZXZlbnRzIGhpZGluZyBhbmQgZm9yY2VzIHRoZSBjb250cm9scyB0byBiZSBzaG93blxuICAgICAgICB0aGlzLnVpSGlkZVRpbWVvdXQuY2xlYXIoKTtcbiAgICAgICAgc2hvd1VpKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFbnRlcmluZyBhIHBsYXllciBzdGF0ZSB0aGF0IGFsbG93cyBoaWRpbmdcbiAgICAgICAgdGhpcy51aUhpZGVUaW1lb3V0LnN0YXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZVBsYXllclN0YXRlcyhwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIGxldCBjb250YWluZXIgPSB0aGlzLmdldERvbUVsZW1lbnQoKTtcblxuICAgIC8vIENvbnZlcnQgcGxheWVyIHN0YXRlcyBpbnRvIENTUyBjbGFzcyBuYW1lc1xuICAgIGxldCBzdGF0ZUNsYXNzTmFtZXMgPSA8YW55PltdO1xuICAgIGZvciAobGV0IHN0YXRlIGluIFBsYXllclV0aWxzLlBsYXllclN0YXRlKSB7XG4gICAgICBpZiAoaXNOYU4oTnVtYmVyKHN0YXRlKSkpIHtcbiAgICAgICAgbGV0IGVudW1OYW1lID0gUGxheWVyVXRpbHMuUGxheWVyU3RhdGVbPGFueT5QbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZVtzdGF0ZV1dO1xuICAgICAgICBzdGF0ZUNsYXNzTmFtZXNbUGxheWVyVXRpbHMuUGxheWVyU3RhdGVbc3RhdGVdXSA9XG4gICAgICAgICAgdGhpcy5wcmVmaXhDc3MoVUlDb250YWluZXIuU1RBVEVfUFJFRklYICsgZW51bU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlbW92ZVN0YXRlcyA9ICgpID0+IHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcyhzdGF0ZUNsYXNzTmFtZXNbUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuSWRsZV0pO1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKHN0YXRlQ2xhc3NOYW1lc1tQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5QcmVwYXJlZF0pO1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKHN0YXRlQ2xhc3NOYW1lc1tQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5QbGF5aW5nXSk7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3Moc3RhdGVDbGFzc05hbWVzW1BsYXllclV0aWxzLlBsYXllclN0YXRlLlBhdXNlZF0pO1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKHN0YXRlQ2xhc3NOYW1lc1tQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5GaW5pc2hlZF0pO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVTdGF0ZSA9IChzdGF0ZTogUGxheWVyVXRpbHMuUGxheWVyU3RhdGUpID0+IHtcbiAgICAgIHJlbW92ZVN0YXRlcygpO1xuICAgICAgY29udGFpbmVyLmFkZENsYXNzKHN0YXRlQ2xhc3NOYW1lc1tzdGF0ZV0pO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZUNoYW5nZS5kaXNwYXRjaCh0aGlzLCBzdGF0ZSk7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VMb2FkZWQsICgpID0+IHtcbiAgICAgIHVwZGF0ZVN0YXRlKFBsYXllclV0aWxzLlBsYXllclN0YXRlLlByZXBhcmVkKTtcbiAgICB9KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheSwgKCkgPT4ge1xuICAgICAgdXBkYXRlU3RhdGUoUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUGxheWluZyk7XG4gICAgfSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXlpbmcsICgpID0+IHtcbiAgICAgIHVwZGF0ZVN0YXRlKFBsYXllclV0aWxzLlBsYXllclN0YXRlLlBsYXlpbmcpO1xuICAgIH0pO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QYXVzZWQsICgpID0+IHtcbiAgICAgIHVwZGF0ZVN0YXRlKFBsYXllclV0aWxzLlBsYXllclN0YXRlLlBhdXNlZCk7XG4gICAgfSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXliYWNrRmluaXNoZWQsICgpID0+IHtcbiAgICAgIHVwZGF0ZVN0YXRlKFBsYXllclV0aWxzLlBsYXllclN0YXRlLkZpbmlzaGVkKTtcbiAgICB9KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlVW5sb2FkZWQsICgpID0+IHtcbiAgICAgIHVwZGF0ZVN0YXRlKFBsYXllclV0aWxzLlBsYXllclN0YXRlLklkbGUpO1xuICAgIH0pO1xuICAgIHVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB1cGRhdGVTdGF0ZShQbGF5ZXJVdGlscy5nZXRTdGF0ZShwbGF5ZXIpKTtcbiAgICB9KTtcblxuICAgIC8vIEZ1bGxzY3JlZW4gbWFya2VyIGNsYXNzXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlZpZXdNb2RlQ2hhbmdlZCwgKCkgPT4ge1xuICAgICAgaWYgKHBsYXllci5nZXRWaWV3TW9kZSgpID09PSBwbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5GdWxsc2NyZWVuKSB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhVSUNvbnRhaW5lci5GVUxMU0NSRUVOKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoVUlDb250YWluZXIuRlVMTFNDUkVFTikpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIEluaXQgZnVsbHNjcmVlbiBzdGF0ZVxuICAgIGlmIChwbGF5ZXIuZ2V0Vmlld01vZGUoKSA9PT0gcGxheWVyLmV4cG9ydHMuVmlld01vZGUuRnVsbHNjcmVlbikge1xuICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKFVJQ29udGFpbmVyLkZVTExTQ1JFRU4pKTtcbiAgICB9XG5cbiAgICAvLyBCdWZmZXJpbmcgbWFya2VyIGNsYXNzXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlN0YWxsU3RhcnRlZCwgKCkgPT4ge1xuICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKFVJQ29udGFpbmVyLkJVRkZFUklORykpO1xuICAgIH0pO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TdGFsbEVuZGVkLCAoKSA9PiB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoVUlDb250YWluZXIuQlVGRkVSSU5HKSk7XG4gICAgfSk7XG4gICAgLy8gSW5pdCBidWZmZXJpbmcgc3RhdGVcbiAgICBpZiAocGxheWVyLmlzU3RhbGxlZCgpKSB7XG4gICAgICBjb250YWluZXIuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoVUlDb250YWluZXIuQlVGRkVSSU5HKSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3RlQ29udHJvbCBtYXJrZXIgY2xhc3NcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQ2FzdFN0YXJ0ZWQsICgpID0+IHtcbiAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhVSUNvbnRhaW5lci5SRU1PVEVfQ09OVFJPTCkpO1xuICAgIH0pO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5DYXN0U3RvcHBlZCwgKCkgPT4ge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKHRoaXMucHJlZml4Q3NzKFVJQ29udGFpbmVyLlJFTU9URV9DT05UUk9MKSk7XG4gICAgfSk7XG4gICAgLy8gSW5pdCBSZW1vdGVDb250cm9sIHN0YXRlXG4gICAgaWYgKHBsYXllci5pc0Nhc3RpbmcoKSkge1xuICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKFVJQ29udGFpbmVyLlJFTU9URV9DT05UUk9MKSk7XG4gICAgfVxuXG4gICAgLy8gQ29udHJvbHMgdmlzaWJpbGl0eSBtYXJrZXIgY2xhc3NcbiAgICB1aW1hbmFnZXIub25Db250cm9sc1Nob3cuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhVSUNvbnRhaW5lci5DT05UUk9MU19ISURERU4pKTtcbiAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhVSUNvbnRhaW5lci5DT05UUk9MU19TSE9XTikpO1xuICAgIH0pO1xuICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzSGlkZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKHRoaXMucHJlZml4Q3NzKFVJQ29udGFpbmVyLkNPTlRST0xTX1NIT1dOKSk7XG4gICAgICBjb250YWluZXIuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoVUlDb250YWluZXIuQ09OVFJPTFNfSElEREVOKSk7XG4gICAgfSk7XG5cbiAgICAvLyBMYXlvdXQgc2l6ZSBjbGFzc2VzXG4gICAgbGV0IHVwZGF0ZUxheW91dFNpemVDbGFzc2VzID0gKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoJ2xheW91dC1tYXgtd2lkdGgtNDAwJykpO1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKHRoaXMucHJlZml4Q3NzKCdsYXlvdXQtbWF4LXdpZHRoLTYwMCcpKTtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcygnbGF5b3V0LW1heC13aWR0aC04MDAnKSk7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoJ2xheW91dC1tYXgtd2lkdGgtMTIwMCcpKTtcblxuICAgICAgaWYgKHdpZHRoIDw9IDQwMCkge1xuICAgICAgICBjb250YWluZXIuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoJ2xheW91dC1tYXgtd2lkdGgtNDAwJykpO1xuICAgICAgfSBlbHNlIGlmICh3aWR0aCA8PSA2MDApIHtcbiAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKCdsYXlvdXQtbWF4LXdpZHRoLTYwMCcpKTtcbiAgICAgIH0gZWxzZSBpZiAod2lkdGggPD0gODAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLnByZWZpeENzcygnbGF5b3V0LW1heC13aWR0aC04MDAnKSk7XG4gICAgICB9IGVsc2UgaWYgKHdpZHRoIDw9IDEyMDApIHtcbiAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKCdsYXlvdXQtbWF4LXdpZHRoLTEyMDAnKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWVyUmVzaXplZCwgKGU6IFBsYXllclJlc2l6ZWRFdmVudCkgPT4ge1xuICAgICAgLy8gQ29udmVydCBzdHJpbmdzICh3aXRoIFwicHhcIiBzdWZmaXgpIHRvIGludHNcbiAgICAgIGxldCB3aWR0aCA9IE1hdGgucm91bmQoTnVtYmVyKGUud2lkdGguc3Vic3RyaW5nKDAsIGUud2lkdGgubGVuZ3RoIC0gMikpKTtcbiAgICAgIGxldCBoZWlnaHQgPSBNYXRoLnJvdW5kKE51bWJlcihlLmhlaWdodC5zdWJzdHJpbmcoMCwgZS5oZWlnaHQubGVuZ3RoIC0gMikpKTtcblxuICAgICAgdXBkYXRlTGF5b3V0U2l6ZUNsYXNzZXMod2lkdGgsIGhlaWdodCk7XG4gICAgfSk7XG4gICAgLy8gSW5pdCBsYXlvdXQgc3RhdGVcbiAgICB1cGRhdGVMYXlvdXRTaXplQ2xhc3NlcyhuZXcgRE9NKHBsYXllci5nZXRDb250YWluZXIoKSkud2lkdGgoKSwgbmV3IERPTShwbGF5ZXIuZ2V0Q29udGFpbmVyKCkpLmhlaWdodCgpKTtcbiAgfVxuXG4gIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgLy8gRXhwbGljaXRseSB1bnN1YnNjcmliZSB1c2VyIGludGVyYWN0aW9uIGV2ZW50IGhhbmRsZXJzIGJlY2F1c2UgdGhleSBjb3VsZCBiZSBhdHRhY2hlZCB0byBhbiBleHRlcm5hbCBlbGVtZW50XG4gICAgLy8gdGhhdCBpc24ndCBvd25lZCBieSB0aGUgVUkgYW5kIHRoZXJlZm9yZSBub3QgcmVtb3ZlZCBvbiByZWxlYXNlLlxuICAgIGlmICh0aGlzLnVzZXJJbnRlcmFjdGlvbkV2ZW50cykge1xuICAgICAgdGhpcy51c2VySW50ZXJhY3Rpb25FdmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHRoaXMudXNlckludGVyYWN0aW9uRXZlbnRTb3VyY2Uub2ZmKGV2ZW50Lm5hbWUsIGV2ZW50LmhhbmRsZXIpKTtcbiAgICB9XG5cbiAgICBzdXBlci5yZWxlYXNlKCk7XG5cbiAgICBpZiAodGhpcy51aUhpZGVUaW1lb3V0KSB7XG4gICAgICB0aGlzLnVpSGlkZVRpbWVvdXQuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgbGV0IGNvbnRhaW5lciA9IHN1cGVyLnRvRG9tRWxlbWVudCgpO1xuXG4gICAgLy8gRGV0ZWN0IGZsZXhib3ggc3VwcG9ydCAobm90IHN1cHBvcnRlZCBpbiBJRTkpXG4gICAgaWYgKGRvY3VtZW50ICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJykuc3R5bGUuZmxleCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLnByZWZpeENzcygnZmxleGJveCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKCduby1mbGV4Ym94JykpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cbn1cbiIsImltcG9ydCB7U2VsZWN0Qm94fSBmcm9tICcuL3NlbGVjdGJveCc7XG5pbXBvcnQge0xpc3RTZWxlY3RvckNvbmZpZ30gZnJvbSAnLi9saXN0c2VsZWN0b3InO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgc2VsZWN0IGJveCBwcm92aWRpbmcgYSBzZWxlY3Rpb24gYmV0d2VlbiAnYXV0bycgYW5kIHRoZSBhdmFpbGFibGUgdmlkZW8gcXVhbGl0aWVzLlxuICovXG5leHBvcnQgY2xhc3MgVmlkZW9RdWFsaXR5U2VsZWN0Qm94IGV4dGVuZHMgU2VsZWN0Qm94IHtcblxuICBwcml2YXRlIGhhc0F1dG86IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMaXN0U2VsZWN0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzc2VzOiBbJ3VpLXZpZGVvcXVhbGl0eXNlbGVjdGJveCddLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgc2VsZWN0Q3VycmVudFZpZGVvUXVhbGl0eSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbShwbGF5ZXIuZ2V0VmlkZW9RdWFsaXR5KCkuaWQpO1xuICAgIH07XG5cbiAgICBsZXQgdXBkYXRlVmlkZW9RdWFsaXRpZXMgPSAoKSA9PiB7XG4gICAgICBsZXQgdmlkZW9RdWFsaXRpZXMgPSBwbGF5ZXIuZ2V0QXZhaWxhYmxlVmlkZW9RdWFsaXRpZXMoKTtcblxuICAgICAgdGhpcy5jbGVhckl0ZW1zKCk7XG5cbiAgICAgIC8vIFByb2dyZXNzaXZlIHN0cmVhbXMgZG8gbm90IHN1cHBvcnQgYXV0b21hdGljIHF1YWxpdHkgc2VsZWN0aW9uXG4gICAgICB0aGlzLmhhc0F1dG8gPSBwbGF5ZXIuZ2V0U3RyZWFtVHlwZSgpICE9PSAncHJvZ3Jlc3NpdmUnO1xuXG4gICAgICBpZiAodGhpcy5oYXNBdXRvKSB7XG4gICAgICAgIC8vIEFkZCBlbnRyeSBmb3IgYXV0b21hdGljIHF1YWxpdHkgc3dpdGNoaW5nIChkZWZhdWx0IHNldHRpbmcpXG4gICAgICAgIHRoaXMuYWRkSXRlbSgnYXV0bycsIGkxOG4uZ2V0TG9jYWxpemVyKCdhdXRvJykpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdmlkZW8gcXVhbGl0aWVzXG4gICAgICBmb3IgKGxldCB2aWRlb1F1YWxpdHkgb2YgdmlkZW9RdWFsaXRpZXMpIHtcbiAgICAgICAgdGhpcy5hZGRJdGVtKHZpZGVvUXVhbGl0eS5pZCwgdmlkZW9RdWFsaXR5LmxhYmVsKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VsZWN0IGluaXRpYWwgcXVhbGl0eVxuICAgICAgc2VsZWN0Q3VycmVudFZpZGVvUXVhbGl0eSgpO1xuICAgIH07XG5cbiAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoc2VuZGVyOiBWaWRlb1F1YWxpdHlTZWxlY3RCb3gsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHBsYXllci5zZXRWaWRlb1F1YWxpdHkodmFsdWUpO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHF1YWxpdGllcyB3aGVuIHNvdXJjZSBnb2VzIGF3YXlcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlVW5sb2FkZWQsIHVwZGF0ZVZpZGVvUXVhbGl0aWVzKTtcbiAgICAvLyBVcGRhdGUgcXVhbGl0aWVzIHdoZW4gdGhlIHBlcmlvZCB3aXRoaW4gYSBzb3VyY2UgY2hhbmdlc1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QZXJpb2RTd2l0Y2hlZCwgdXBkYXRlVmlkZW9RdWFsaXRpZXMpO1xuICAgIC8vIFVwZGF0ZSBxdWFsaXR5IHNlbGVjdGlvbiB3aGVuIHF1YWxpdHkgaXMgY2hhbmdlZCAoZnJvbSBvdXRzaWRlKVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5WaWRlb1F1YWxpdHlDaGFuZ2VkLCBzZWxlY3RDdXJyZW50VmlkZW9RdWFsaXR5KTtcblxuICAgIGlmICgocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQgYXMgYW55KS5WaWRlb1F1YWxpdHlBZGRlZCkge1xuICAgICAgLy8gVXBkYXRlIHF1YWxpdGllcyB3aGVuIHRoZWlyIGF2YWlsYWJpbGl0eSBjaGFuZ2VkXG4gICAgICAvLyBUT0RPOiByZW1vdmUgYW55IGNhc3QgYWZ0ZXIgbmV4dCBwbGF5ZXIgcmVsZWFzZVxuICAgICAgcGxheWVyLm9uKChwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudCBhcyBhbnkpLlZpZGVvUXVhbGl0eUFkZGVkLCB1cGRhdGVWaWRlb1F1YWxpdGllcyk7XG4gICAgICBwbGF5ZXIub24oKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50IGFzIGFueSkuVmlkZW9RdWFsaXR5UmVtb3ZlZCwgdXBkYXRlVmlkZW9RdWFsaXRpZXMpO1xuICAgIH1cblxuICAgIHVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSh1cGRhdGVWaWRlb1F1YWxpdGllcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3QgYm94IGNvbnRhaW5zIGFuICdhdXRvJyBpdGVtIGZvciBhdXRvbWF0aWMgcXVhbGl0eSBzZWxlY3Rpb24gbW9kZS5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGhhc0F1dG9JdGVtKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0F1dG87XG4gIH1cbn0iLCJpbXBvcnQge0NvbnRhaW5lciwgQ29udGFpbmVyQ29uZmlnfSBmcm9tICcuL2NvbnRhaW5lcic7XG5pbXBvcnQge1ZvbHVtZVNsaWRlcn0gZnJvbSAnLi92b2x1bWVzbGlkZXInO1xuaW1wb3J0IHtWb2x1bWVUb2dnbGVCdXR0b259IGZyb20gJy4vdm9sdW1ldG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1RpbWVvdXR9IGZyb20gJy4uL3RpbWVvdXQnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgYSB7QGxpbmsgVm9sdW1lQ29udHJvbEJ1dHRvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdW1lQ29udHJvbEJ1dHRvbkNvbmZpZyBleHRlbmRzIENvbnRhaW5lckNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgZGVsYXkgYWZ0ZXIgd2hpY2ggdGhlIHZvbHVtZSBzbGlkZXIgd2lsbCBiZSBoaWRkZW4gd2hlbiB0aGVyZSBpcyBubyB1c2VyIGludGVyYWN0aW9uLlxuICAgKiBDYXJlIG11c3QgYmUgdGFrZW4gdGhhdCB0aGUgZGVsYXkgaXMgbG9uZyBlbm91Z2ggc28gdXNlcnMgY2FuIHJlYWNoIHRoZSBzbGlkZXIgZnJvbSB0aGUgdG9nZ2xlIGJ1dHRvbiwgZS5nLiBieVxuICAgKiBtb3VzZSBtb3ZlbWVudC4gSWYgdGhlIGRlbGF5IGlzIHRvbyBzaG9ydCwgdGhlIHNsaWRlcnMgZGlzYXBwZWFycyBiZWZvcmUgdGhlIG1vdXNlIHBvaW50ZXIgaGFzIHJlYWNoZWQgaXQgYW5kXG4gICAqIHRoZSB1c2VyIGlzIG5vdCBhYmxlIHRvIHVzZSBpdC5cbiAgICogRGVmYXVsdDogNTAwbXNcbiAgICovXG4gIGhpZGVEZWxheT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBpZiB0aGUgdm9sdW1lIHNsaWRlciBzaG91bGQgYmUgdmVydGljYWxseSBvciBob3Jpem9udGFsbHkgYWxpZ25lZC5cbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgdmVydGljYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgY29tcG9zaXRlIHZvbHVtZSBjb250cm9sIHRoYXQgY29uc2lzdHMgb2YgYW5kIGludGVybmFsbHkgbWFuYWdlcyBhIHZvbHVtZSBjb250cm9sIGJ1dHRvbiB0aGF0IGNhbiBiZSB1c2VkXG4gKiBmb3IgbXV0aW5nLCBhbmQgYSAoZGVwZW5kaW5nIG9uIHRoZSBDU1Mgc3R5bGUsIGUuZy4gc2xpZGUtb3V0KSB2b2x1bWUgY29udHJvbCBiYXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBWb2x1bWVDb250cm9sQnV0dG9uIGV4dGVuZHMgQ29udGFpbmVyPFZvbHVtZUNvbnRyb2xCdXR0b25Db25maWc+IHtcblxuICBwcml2YXRlIHZvbHVtZVRvZ2dsZUJ1dHRvbjogVm9sdW1lVG9nZ2xlQnV0dG9uO1xuICBwcml2YXRlIHZvbHVtZVNsaWRlcjogVm9sdW1lU2xpZGVyO1xuXG4gIHByaXZhdGUgdm9sdW1lU2xpZGVySGlkZVRpbWVvdXQ6IFRpbWVvdXQ7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBWb2x1bWVDb250cm9sQnV0dG9uQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy52b2x1bWVUb2dnbGVCdXR0b24gPSBuZXcgVm9sdW1lVG9nZ2xlQnV0dG9uKCk7XG4gICAgdGhpcy52b2x1bWVTbGlkZXIgPSBuZXcgVm9sdW1lU2xpZGVyKHtcbiAgICAgIHZlcnRpY2FsOiBjb25maWcudmVydGljYWwgIT0gbnVsbCA/IGNvbmZpZy52ZXJ0aWNhbCA6IHRydWUsXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXZvbHVtZWNvbnRyb2xidXR0b24nLFxuICAgICAgY29tcG9uZW50czogW3RoaXMudm9sdW1lVG9nZ2xlQnV0dG9uLCB0aGlzLnZvbHVtZVNsaWRlcl0sXG4gICAgICBoaWRlRGVsYXk6IDUwMCxcbiAgICB9LCA8Vm9sdW1lQ29udHJvbEJ1dHRvbkNvbmZpZz50aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbGV0IHZvbHVtZVRvZ2dsZUJ1dHRvbiA9IHRoaXMuZ2V0Vm9sdW1lVG9nZ2xlQnV0dG9uKCk7XG4gICAgbGV0IHZvbHVtZVNsaWRlciA9IHRoaXMuZ2V0Vm9sdW1lU2xpZGVyKCk7XG5cbiAgICB0aGlzLnZvbHVtZVNsaWRlckhpZGVUaW1lb3V0ID0gbmV3IFRpbWVvdXQodGhpcy5nZXRDb25maWcoKS5oaWRlRGVsYXksICgpID0+IHtcbiAgICAgIHZvbHVtZVNsaWRlci5oaWRlKCk7XG4gICAgfSk7XG5cbiAgICAvKlxuICAgICAqIFZvbHVtZSBTbGlkZXIgdmlzaWJpbGl0eSBoYW5kbGluZ1xuICAgICAqXG4gICAgICogVGhlIHZvbHVtZSBzbGlkZXIgc2hhbGwgYmUgdmlzaWJsZSB3aGlsZSB0aGUgdXNlciBob3ZlcnMgdGhlIG11dGUgdG9nZ2xlIGJ1dHRvbiwgd2hpbGUgdGhlIHVzZXIgaG92ZXJzIHRoZVxuICAgICAqIHZvbHVtZSBzbGlkZXIsIGFuZCB3aGlsZSB0aGUgdXNlciBzbGlkZXMgdGhlIHZvbHVtZSBzbGlkZXIuIElmIG5vbmUgb2YgdGhlc2Ugc2l0dWF0aW9ucyBhcmUgdHJ1ZSwgdGhlIHNsaWRlclxuICAgICAqIHNoYWxsIGRpc2FwcGVhci5cbiAgICAgKi9cbiAgICBsZXQgdm9sdW1lU2xpZGVySG92ZXJlZCA9IGZhbHNlO1xuICAgIHZvbHVtZVRvZ2dsZUJ1dHRvbi5nZXREb21FbGVtZW50KCkub24oJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICAvLyBTaG93IHZvbHVtZSBzbGlkZXIgd2hlbiBtb3VzZSBlbnRlcnMgdGhlIGJ1dHRvbiBhcmVhXG4gICAgICBpZiAodm9sdW1lU2xpZGVyLmlzSGlkZGVuKCkpIHtcbiAgICAgICAgdm9sdW1lU2xpZGVyLnNob3coKTtcbiAgICAgIH1cbiAgICAgIC8vIEF2b2lkIGhpZGluZyBvZiB0aGUgc2xpZGVyIHdoZW4gYnV0dG9uIGlzIGhvdmVyZWRcbiAgICAgIHRoaXMudm9sdW1lU2xpZGVySGlkZVRpbWVvdXQuY2xlYXIoKTtcbiAgICB9KTtcbiAgICB2b2x1bWVUb2dnbGVCdXR0b24uZ2V0RG9tRWxlbWVudCgpLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgLy8gSGlkZSBzbGlkZXIgZGVsYXllZCB3aGVuIGJ1dHRvbiBpcyBsZWZ0XG4gICAgICB0aGlzLnZvbHVtZVNsaWRlckhpZGVUaW1lb3V0LnJlc2V0KCk7XG4gICAgfSk7XG4gICAgdm9sdW1lU2xpZGVyLmdldERvbUVsZW1lbnQoKS5vbignbW91c2VlbnRlcicsICgpID0+IHtcbiAgICAgIC8vIFdoZW4gdGhlIHNsaWRlciBpcyBlbnRlcmVkLCBjYW5jZWwgdGhlIGhpZGUgdGltZW91dCBhY3RpdmF0ZWQgYnkgbGVhdmluZyB0aGUgYnV0dG9uXG4gICAgICB0aGlzLnZvbHVtZVNsaWRlckhpZGVUaW1lb3V0LmNsZWFyKCk7XG4gICAgICB2b2x1bWVTbGlkZXJIb3ZlcmVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB2b2x1bWVTbGlkZXIuZ2V0RG9tRWxlbWVudCgpLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgLy8gV2hlbiBtb3VzZSBsZWF2ZXMgdGhlIHNsaWRlciwgb25seSBoaWRlIGl0IGlmIHRoZXJlIGlzIG5vIHNsaWRlIG9wZXJhdGlvbiBpbiBwcm9ncmVzc1xuICAgICAgaWYgKHZvbHVtZVNsaWRlci5pc1NlZWtpbmcoKSkge1xuICAgICAgICB0aGlzLnZvbHVtZVNsaWRlckhpZGVUaW1lb3V0LmNsZWFyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZvbHVtZVNsaWRlckhpZGVUaW1lb3V0LnJlc2V0KCk7XG4gICAgICB9XG4gICAgICB2b2x1bWVTbGlkZXJIb3ZlcmVkID0gZmFsc2U7XG4gICAgfSk7XG4gICAgdm9sdW1lU2xpZGVyLm9uU2Vla2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBXaGVuIGEgc2xpZGUgb3BlcmF0aW9uIGlzIGRvbmUgYW5kIHRoZSBzbGlkZXIgbm90IGhvdmVyZWQgKG1vdXNlIG91dHNpZGUgc2xpZGVyKSwgaGlkZSBzbGlkZXIgZGVsYXllZFxuICAgICAgaWYgKCF2b2x1bWVTbGlkZXJIb3ZlcmVkKSB7XG4gICAgICAgIHRoaXMudm9sdW1lU2xpZGVySGlkZVRpbWVvdXQucmVzZXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgc3VwZXIucmVsZWFzZSgpO1xuICAgIHRoaXMudm9sdW1lU2xpZGVySGlkZVRpbWVvdXQuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFsbHkgbWFuYWdlZCB2b2x1bWUgdG9nZ2xlIGJ1dHRvbi5cbiAgICogQHJldHVybnMge1ZvbHVtZVRvZ2dsZUJ1dHRvbn1cbiAgICovXG4gIGdldFZvbHVtZVRvZ2dsZUJ1dHRvbigpOiBWb2x1bWVUb2dnbGVCdXR0b24ge1xuICAgIHJldHVybiB0aGlzLnZvbHVtZVRvZ2dsZUJ1dHRvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFsbHkgbWFuYWdlZCB2b2x1bWUgc2lsZGVyLlxuICAgKiBAcmV0dXJucyB7Vm9sdW1lU2xpZGVyfVxuICAgKi9cbiAgZ2V0Vm9sdW1lU2xpZGVyKCk6IFZvbHVtZVNsaWRlciB7XG4gICAgcmV0dXJuIHRoaXMudm9sdW1lU2xpZGVyO1xuICB9XG59IiwiaW1wb3J0IHsgU2Vla0JhciwgU2Vla0JhckNvbmZpZywgU2Vla1ByZXZpZXdFdmVudEFyZ3MgfSBmcm9tICcuL3NlZWtiYXInO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IFZvbHVtZVRyYW5zaXRpb24gfSBmcm9tICcuLi92b2x1bWVjb250cm9sbGVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgVm9sdW1lU2xpZGVyfSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdW1lU2xpZGVyQ29uZmlnIGV4dGVuZHMgU2Vla0JhckNvbmZpZyB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaWYgdGhlIHZvbHVtZSBzbGlkZXIgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgaGlkZGVuIHdoZW4gdm9sdW1lIGNvbnRyb2wgaXMgcHJvaGliaXRlZCBieSB0aGVcbiAgICogYnJvd3NlciBvciBwbGF0Zm9ybS4gVGhpcyBjdXJyZW50bHkgb25seSBhcHBsaWVzIHRvIGlPUy5cbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgaGlkZUlmVm9sdW1lQ29udHJvbFByb2hpYml0ZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgc2ltcGxlIHZvbHVtZSBzbGlkZXIgY29tcG9uZW50IHRvIGFkanVzdCB0aGUgcGxheWVyJ3Mgdm9sdW1lIHNldHRpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBWb2x1bWVTbGlkZXIgZXh0ZW5kcyBTZWVrQmFyIHtcbiAgcHJpdmF0ZSB2b2x1bWVUcmFuc2l0aW9uOiBWb2x1bWVUcmFuc2l0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogVm9sdW1lU2xpZGVyQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywgPFZvbHVtZVNsaWRlckNvbmZpZz57XG4gICAgICBjc3NDbGFzczogJ3VpLXZvbHVtZXNsaWRlcicsXG4gICAgICBoaWRlSWZWb2x1bWVDb250cm9sUHJvaGliaXRlZDogdHJ1ZSxcbiAgICAgIGFyaWFMYWJlbDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLmF1ZGlvLnZvbHVtZScpLFxuICAgICAgdGFiSW5kZXg6IDAsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWb2x1bWVBcmlhU2xpZGVyVmFsdWVzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hdHRyKCdhcmlhLXZhbHVlbm93JywgTWF0aC5jZWlsKHZhbHVlKS50b1N0cmluZygpKTtcbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hdHRyKCdhcmlhLXZhbHVldGV4dCcsIGAke2kxOG4ucGVyZm9ybUxvY2FsaXphdGlvbihpMThuLmdldExvY2FsaXplcignc2Vla0Jhci52YWx1ZScpKX06ICR7TWF0aC5jZWlsKHZhbHVlKX1gKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlciwgZmFsc2UpO1xuXG4gICAgdGhpcy5zZXRBcmlhU2xpZGVyTWluTWF4KCcwJywgJzEwMCcpO1xuXG4gICAgbGV0IGNvbmZpZyA9IDxWb2x1bWVTbGlkZXJDb25maWc+dGhpcy5nZXRDb25maWcoKTtcblxuICAgIGNvbnN0IHZvbHVtZUNvbnRyb2xsZXIgPSB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkudm9sdW1lQ29udHJvbGxlcjtcblxuICAgIGlmIChjb25maWcuaGlkZUlmVm9sdW1lQ29udHJvbFByb2hpYml0ZWQgJiYgIXRoaXMuZGV0ZWN0Vm9sdW1lQ29udHJvbEF2YWlsYWJpbGl0eSgpKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcblxuICAgICAgLy8gV2UgY2FuIGp1c3QgcmV0dXJuIGZyb20gaGVyZSwgYmVjYXVzZSB0aGUgdXNlciB3aWxsIG5ldmVyIGludGVyYWN0IHdpdGggdGhlIGNvbnRyb2wgYW5kIGFueSBjb25maWd1cmVkXG4gICAgICAvLyBmdW5jdGlvbmFsaXR5IHdvdWxkIG9ubHkgZWF0IHJlc291cmNlcyBmb3Igbm8gcmVhc29uLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZvbHVtZUNvbnRyb2xsZXIub25DaGFuZ2VkLnN1YnNjcmliZSgoXywgYXJncykgPT4ge1xuICAgICAgaWYgKGFyZ3MubXV0ZWQpIHtcbiAgICAgICAgdGhpcy5zZXRWb2x1bWVBcmlhU2xpZGVyVmFsdWVzKDApO1xuICAgICAgICB0aGlzLnNldFBsYXliYWNrUG9zaXRpb24oMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFBsYXliYWNrUG9zaXRpb24oYXJncy52b2x1bWUpO1xuICAgICAgICB0aGlzLnNldFZvbHVtZUFyaWFTbGlkZXJWYWx1ZXMoYXJncy52b2x1bWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vblNlZWsuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudm9sdW1lVHJhbnNpdGlvbiA9IHZvbHVtZUNvbnRyb2xsZXIuc3RhcnRUcmFuc2l0aW9uKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uU2Vla1ByZXZpZXcuc3Vic2NyaWJlUmF0ZUxpbWl0ZWQodGhpcy51cGRhdGVWb2x1bWVXaGlsZVNjcnViYmluZywgNTApO1xuICAgIHRoaXMub25TZWVrZWQuc3Vic2NyaWJlKChzZW5kZXIsIHBlcmNlbnRhZ2UpID0+IHtcbiAgICAgIGlmICh0aGlzLnZvbHVtZVRyYW5zaXRpb24pIHtcbiAgICAgICAgdGhpcy52b2x1bWVUcmFuc2l0aW9uLmZpbmlzaChwZXJjZW50YWdlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgdm9sdW1lIHNsaWRlciBtYXJrZXIgd2hlbiB0aGUgcGxheWVyIHJlc2l6ZWQsIGEgc291cmNlIGlzIGxvYWRlZCxcbiAgICAvLyBvciB0aGUgVUkgaXMgY29uZmlndXJlZC4gQ2hlY2sgdGhlIHNlZWtiYXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24uXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXllclJlc2l6ZWQsICgpID0+IHtcbiAgICAgIHRoaXMucmVmcmVzaFBsYXliYWNrUG9zaXRpb24oKTtcbiAgICB9KTtcbiAgICB1aW1hbmFnZXIub25Db25maWd1cmVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hQbGF5YmFja1Bvc2l0aW9uKCk7XG4gICAgfSk7XG5cbiAgICB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICAgIH0pO1xuXG4gICAgdWltYW5hZ2VyLm9uQ29tcG9uZW50U2hvdy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICAgIH0pO1xuICAgIHVpbWFuYWdlci5vbkNvbXBvbmVudEhpZGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucmVmcmVzaFBsYXliYWNrUG9zaXRpb24oKTtcbiAgICB9KTtcblxuICAgIC8vIEluaXQgdm9sdW1lIGJhclxuICAgIHZvbHVtZUNvbnRyb2xsZXIub25DaGFuZ2VkRXZlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVm9sdW1lV2hpbGVTY3J1YmJpbmcgPSAoc2VuZGVyOiBWb2x1bWVTbGlkZXIsIGFyZ3M6IFNlZWtQcmV2aWV3RXZlbnRBcmdzKSA9PiB7XG4gICAgaWYgKGFyZ3Muc2NydWJiaW5nICYmIHRoaXMudm9sdW1lVHJhbnNpdGlvbikge1xuICAgICAgdGhpcy52b2x1bWVUcmFuc2l0aW9uLnVwZGF0ZShhcmdzLnBvc2l0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBkZXRlY3RWb2x1bWVDb250cm9sQXZhaWxhYmlsaXR5KCk6IGJvb2xlYW4ge1xuICAgIC8qXG4gICAgICogXCJPbiBpT1MgZGV2aWNlcywgdGhlIGF1ZGlvIGxldmVsIGlzIGFsd2F5cyB1bmRlciB0aGUgdXNlcuKAmXMgcGh5c2ljYWwgY29udHJvbC4gVGhlIHZvbHVtZSBwcm9wZXJ0eSBpcyBub3RcbiAgICAgKiBzZXR0YWJsZSBpbiBKYXZhU2NyaXB0LiBSZWFkaW5nIHRoZSB2b2x1bWUgcHJvcGVydHkgYWx3YXlzIHJldHVybnMgMS5cIlxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L2NvbnRlbnQvZG9jdW1lbnRhdGlvbi9BdWRpb1ZpZGVvL0NvbmNlcHR1YWwvVXNpbmdfSFRNTDVfQXVkaW9fVmlkZW8vRGV2aWNlLVNwZWNpZmljQ29uc2lkZXJhdGlvbnMvRGV2aWNlLVNwZWNpZmljQ29uc2lkZXJhdGlvbnMuaHRtbFxuICAgICAqL1xuICAgIC8vIGFzIG11dGVkIGF1dG9wbGF5IGdldHMgcGF1c2VkIGFzIHNvb24gYXMgd2UgdW5tdXRlIGl0LCB3ZSBtYXkgbm90IHRvdWNoIHRoZSB2b2x1bWUgb2YgdGhlIGFjdHVhbCBwbGF5ZXIgc28gd2VcbiAgICAvLyBwcm9iZSBhIGR1bW15IGF1ZGlvIGVsZW1lbnRcbiAgICBjb25zdCBkdW1teVZpZGVvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgLy8gdHJ5IHNldHRpbmcgdGhlIHZvbHVtZSB0byAwLjcgYW5kIGlmIGl0J3Mgc3RpbGwgMSB3ZSBhcmUgb24gYSB2b2x1bWUgY29udHJvbCByZXN0cmljdGVkIGRldmljZVxuICAgIGR1bW15VmlkZW9FbGVtZW50LnZvbHVtZSA9IDAuNztcbiAgICByZXR1cm4gZHVtbXlWaWRlb0VsZW1lbnQudm9sdW1lICE9PSAxO1xuICB9XG5cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBzdXBlci5yZWxlYXNlKCk7XG5cbiAgICB0aGlzLm9uU2Vla1ByZXZpZXcudW5zdWJzY3JpYmUodGhpcy51cGRhdGVWb2x1bWVXaGlsZVNjcnViYmluZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7VG9nZ2xlQnV0dG9uLCBUb2dnbGVCdXR0b25Db25maWd9IGZyb20gJy4vdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7IFVJSW5zdGFuY2VNYW5hZ2VyIH0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgYnV0dG9uIHRoYXQgdG9nZ2xlcyBhdWRpbyBtdXRpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBWb2x1bWVUb2dnbGVCdXR0b24gZXh0ZW5kcyBUb2dnbGVCdXR0b248VG9nZ2xlQnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBUb2dnbGVCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnOiBUb2dnbGVCdXR0b25Db25maWcgPSB7XG4gICAgICBjc3NDbGFzczogJ3VpLXZvbHVtZXRvZ2dsZWJ1dHRvbicsXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3MuYXVkaW8ubXV0ZScpLFxuICAgICAgb25DbGFzczogJ211dGVkJyxcbiAgICAgIG9mZkNsYXNzOiAndW5tdXRlZCcsXG4gICAgICBhcmlhTGFiZWw6IGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5hdWRpby5tdXRlJyksXG4gICAgfTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIGRlZmF1bHRDb25maWcsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBjb25zdCB2b2x1bWVDb250cm9sbGVyID0gdWltYW5hZ2VyLmdldENvbmZpZygpLnZvbHVtZUNvbnRyb2xsZXI7XG5cbiAgICB2b2x1bWVDb250cm9sbGVyLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKF8sIGFyZ3MpID0+IHtcbiAgICAgIGlmIChhcmdzLm11dGVkKSB7XG4gICAgICAgIHRoaXMub24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub2ZmKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZvbHVtZUxldmVsVGVucyA9IE1hdGguY2VpbChhcmdzLnZvbHVtZSAvIDEwKTtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmRhdGEodGhpcy5wcmVmaXhDc3MoJ3ZvbHVtZS1sZXZlbC10ZW5zJyksIFN0cmluZyh2b2x1bWVMZXZlbFRlbnMpKTtcbiAgICB9KTtcblxuICAgIHRoaXMub25DbGljay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdm9sdW1lQ29udHJvbGxlci50b2dnbGVNdXRlZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gU3RhcnR1cCBpbml0XG4gICAgdm9sdW1lQ29udHJvbGxlci5vbkNoYW5nZWRFdmVudCgpO1xuICB9XG59IiwiaW1wb3J0IHtUb2dnbGVCdXR0b24sIFRvZ2dsZUJ1dHRvbkNvbmZpZ30gZnJvbSAnLi90b2dnbGVidXR0b24nO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSwgUGxheWVyRXZlbnRCYXNlLCBXYXJuaW5nRXZlbnQgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IHRvZ2dsZXMgdGhlIHZpZGVvIHZpZXcgYmV0d2VlbiBub3JtYWwvbW9ubyBhbmQgVlIvc3RlcmVvLlxuICovXG5leHBvcnQgY2xhc3MgVlJUb2dnbGVCdXR0b24gZXh0ZW5kcyBUb2dnbGVCdXR0b248VG9nZ2xlQnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBUb2dnbGVCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXZydG9nZ2xlYnV0dG9uJyxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCd2cicpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgaXNWUkNvbmZpZ3VyZWQgPSAoKSA9PiB7XG4gICAgICAvLyBWUiBhdmFpbGFiaWxpdHkgY2Fubm90IGJlIGNoZWNrZWQgdGhyb3VnaCBnZXRWUlN0YXR1cygpIGJlY2F1c2UgaXQgaXMgYXN5bmNocm9ub3VzbHkgcG9wdWxhdGVkIGFuZCBub3RcbiAgICAgIC8vIGF2YWlsYWJsZSBhdCBVSSBpbml0aWFsaXphdGlvbi4gQXMgYW4gYWx0ZXJuYXRpdmUsIHdlIGNoZWNrIHRoZSBWUiBzZXR0aW5ncyBpbiB0aGUgY29uZmlnLlxuICAgICAgLy8gVE9ETyB1c2UgZ2V0VlJTdGF0dXMoKSB0aHJvdWdoIGlzVlJTdGVyZW9BdmFpbGFibGUoKSBvbmNlIHRoZSBwbGF5ZXIgaGFzIGJlZW4gcmV3cml0dGVuIGFuZCB0aGUgc3RhdHVzIGlzXG4gICAgICAvLyBhdmFpbGFibGUgaW4gUmVhZHlcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHBsYXllci5nZXRTb3VyY2UoKTtcbiAgICAgIHJldHVybiBzb3VyY2UgJiYgQm9vbGVhbihzb3VyY2UudnIpO1xuICAgIH07XG5cbiAgICBsZXQgaXNWUlN0ZXJlb0F2YWlsYWJsZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHBsYXllci5nZXRTb3VyY2UoKTtcbiAgICAgIHJldHVybiBwbGF5ZXIudnIgJiYgQm9vbGVhbihzb3VyY2UudnIpO1xuICAgIH07XG5cbiAgICBsZXQgdnJTdGF0ZUhhbmRsZXIgPSAoZXY6IFBsYXllckV2ZW50QmFzZSkgPT4ge1xuICAgICAgaWYgKGV2LnR5cGUgPT09IHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50Lldhcm5pbmdcbiAgICAgICAgJiYgKGV2IGFzIFdhcm5pbmdFdmVudCkuY29kZSAhPT0gcGxheWVyLmV4cG9ydHMuV2FybmluZ0NvZGUuVlJfUkVOREVSSU5HX0VSUk9SKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVlJDb25maWd1cmVkKCkgJiYgaXNWUlN0ZXJlb0F2YWlsYWJsZSgpKSB7XG4gICAgICAgIHRoaXMuc2hvdygpOyAvLyBzaG93IGJ1dHRvbiBpbiBjYXNlIGl0IGlzIGhpZGRlblxuXG4gICAgICAgIGlmIChwbGF5ZXIudnIgJiYgcGxheWVyLnZyLmdldFN0ZXJlbygpKSB7XG4gICAgICAgICAgdGhpcy5vbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub2ZmKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZSgpOyAvLyBoaWRlIGJ1dHRvbiBpZiBubyBzdGVyZW8gbW9kZSBhdmFpbGFibGVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IHZyQnV0dG9uVmlzaWJpbGl0eUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBpZiAoaXNWUkNvbmZpZ3VyZWQoKSkge1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVlJTdGVyZW9DaGFuZ2VkLCB2clN0YXRlSGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50Lldhcm5pbmcsIHZyU3RhdGVIYW5kbGVyKTtcbiAgICAvLyBIaWRlIGJ1dHRvbiB3aGVuIFZSIHNvdXJjZSBnb2VzIGF3YXlcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlVW5sb2FkZWQsIHZyQnV0dG9uVmlzaWJpbGl0eUhhbmRsZXIpO1xuICAgIHVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSh2ckJ1dHRvblZpc2liaWxpdHlIYW5kbGVyKTtcblxuICAgIHRoaXMub25DbGljay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKCFpc1ZSU3RlcmVvQXZhaWxhYmxlKCkpIHtcbiAgICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnTm8gVlIgY29udGVudCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGxheWVyLnZyICYmIHBsYXllci52ci5nZXRTdGVyZW8oKSkge1xuICAgICAgICAgIHBsYXllci52ci5zZXRTdGVyZW8oZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBsYXllci52ci5zZXRTdGVyZW8odHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFNldCBzdGFydHVwIHZpc2liaWxpdHlcbiAgICB2ckJ1dHRvblZpc2liaWxpdHlIYW5kbGVyKCk7XG4gIH1cbn0iLCJpbXBvcnQge0NsaWNrT3ZlcmxheSwgQ2xpY2tPdmVybGF5Q29uZmlnfSBmcm9tICcuL2NsaWNrb3ZlcmxheSc7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciBhIHtAbGluayBDbGlja092ZXJsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGVybWFya0NvbmZpZyBleHRlbmRzIENsaWNrT3ZlcmxheUNvbmZpZyB7XG4gIC8vIG5vdGhpbmcgeWV0XG59XG5cbi8qKlxuICogQSB3YXRlcm1hcmsgb3ZlcmxheSB3aXRoIGEgY2xpY2thYmxlIGxvZ28uXG4gKi9cbmV4cG9ydCBjbGFzcyBXYXRlcm1hcmsgZXh0ZW5kcyBDbGlja092ZXJsYXkge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogV2F0ZXJtYXJrQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS13YXRlcm1hcmsnLFxuICAgICAgdXJsOiAnaHR0cDovL2JpdG1vdmluLmNvbScsXG4gICAgICByb2xlOiAnbGluaycsXG4gICAgICB0ZXh0OiAnbG9nbycsXG4gICAgICBhcmlhTGFiZWw6IGkxOG4uZ2V0TG9jYWxpemVyKCd3YXRlcm1hcmtMaW5rJyksXG4gICAgfSwgPFdhdGVybWFya0NvbmZpZz50aGlzLmNvbmZpZyk7XG4gIH1cbn0iLCJpbXBvcnQge1ZSVG9nZ2xlQnV0dG9ufSBmcm9tICcuL2NvbXBvbmVudHMvdnJ0b2dnbGVidXR0b24nO1xuaW1wb3J0IHtTZXR0aW5nc1RvZ2dsZUJ1dHRvbn0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7Vm9sdW1lU2xpZGVyfSBmcm9tICcuL2NvbXBvbmVudHMvdm9sdW1lc2xpZGVyJztcbmltcG9ydCB7UGxheWJhY2tUaW1lTGFiZWwsIFBsYXliYWNrVGltZUxhYmVsTW9kZX0gZnJvbSAnLi9jb21wb25lbnRzL3BsYXliYWNrdGltZWxhYmVsJztcbmltcG9ydCB7QWlyUGxheVRvZ2dsZUJ1dHRvbn0gZnJvbSAnLi9jb21wb25lbnRzL2FpcnBsYXl0b2dnbGVidXR0b24nO1xuaW1wb3J0IHtFcnJvck1lc3NhZ2VPdmVybGF5fSBmcm9tICcuL2NvbXBvbmVudHMvZXJyb3JtZXNzYWdlb3ZlcmxheSc7XG5pbXBvcnQge0NvbnRyb2xCYXJ9IGZyb20gJy4vY29tcG9uZW50cy9jb250cm9sYmFyJztcbmltcG9ydCB7Q2FzdFRvZ2dsZUJ1dHRvbn0gZnJvbSAnLi9jb21wb25lbnRzL2Nhc3R0b2dnbGVidXR0b24nO1xuaW1wb3J0IHtGdWxsc2NyZWVuVG9nZ2xlQnV0dG9ufSBmcm9tICcuL2NvbXBvbmVudHMvZnVsbHNjcmVlbnRvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1JlY29tbWVuZGF0aW9uT3ZlcmxheX0gZnJvbSAnLi9jb21wb25lbnRzL3JlY29tbWVuZGF0aW9ub3ZlcmxheSc7XG5pbXBvcnQge1BsYXliYWNrU3BlZWRTZWxlY3RCb3h9IGZyb20gJy4vY29tcG9uZW50cy9wbGF5YmFja3NwZWVkc2VsZWN0Ym94JztcbmltcG9ydCB7QXVkaW9RdWFsaXR5U2VsZWN0Qm94fSBmcm9tICcuL2NvbXBvbmVudHMvYXVkaW9xdWFsaXR5c2VsZWN0Ym94JztcbmltcG9ydCB7Q2FzdFN0YXR1c092ZXJsYXl9IGZyb20gJy4vY29tcG9uZW50cy9jYXN0c3RhdHVzb3ZlcmxheSc7XG5pbXBvcnQge1VJQ29udGFpbmVyfSBmcm9tICcuL2NvbXBvbmVudHMvdWljb250YWluZXInO1xuaW1wb3J0IHtXYXRlcm1hcmt9IGZyb20gJy4vY29tcG9uZW50cy93YXRlcm1hcmsnO1xuaW1wb3J0IHtTdWJ0aXRsZU92ZXJsYXl9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZW92ZXJsYXknO1xuaW1wb3J0IHtTZXR0aW5nc1BhbmVsfSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbCc7XG5pbXBvcnQge1NlZWtCYXJMYWJlbH0gZnJvbSAnLi9jb21wb25lbnRzL3NlZWtiYXJsYWJlbCc7XG5pbXBvcnQge1BsYXliYWNrVG9nZ2xlT3ZlcmxheX0gZnJvbSAnLi9jb21wb25lbnRzL3BsYXliYWNrdG9nZ2xlb3ZlcmxheSc7XG5pbXBvcnQge1BpY3R1cmVJblBpY3R1cmVUb2dnbGVCdXR0b259IGZyb20gJy4vY29tcG9uZW50cy9waWN0dXJlaW5waWN0dXJldG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7U3BhY2VyfSBmcm9tICcuL2NvbXBvbmVudHMvc3BhY2VyJztcbmltcG9ydCB7Q29udGFpbmVyfSBmcm9tICcuL2NvbXBvbmVudHMvY29udGFpbmVyJztcbmltcG9ydCB7Vm9sdW1lVG9nZ2xlQnV0dG9ufSBmcm9tICcuL2NvbXBvbmVudHMvdm9sdW1ldG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7UGxheWJhY2tUb2dnbGVCdXR0b259IGZyb20gJy4vY29tcG9uZW50cy9wbGF5YmFja3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1NlZWtCYXJ9IGZyb20gJy4vY29tcG9uZW50cy9zZWVrYmFyJztcbmltcG9ydCB7VmlkZW9RdWFsaXR5U2VsZWN0Qm94fSBmcm9tICcuL2NvbXBvbmVudHMvdmlkZW9xdWFsaXR5c2VsZWN0Ym94JztcbmltcG9ydCB7VUlDb25kaXRpb25Db250ZXh0LCBVSU1hbmFnZXJ9IGZyb20gJy4vdWltYW5hZ2VyJztcbmltcG9ydCB7VGl0bGVCYXJ9IGZyb20gJy4vY29tcG9uZW50cy90aXRsZWJhcic7XG5pbXBvcnQge0J1ZmZlcmluZ092ZXJsYXl9IGZyb20gJy4vY29tcG9uZW50cy9idWZmZXJpbmdvdmVybGF5JztcbmltcG9ydCB7U3VidGl0bGVMaXN0Qm94fSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVsaXN0Ym94JztcbmltcG9ydCB7QXVkaW9UcmFja0xpc3RCb3h9IGZyb20gJy4vY29tcG9uZW50cy9hdWRpb3RyYWNrbGlzdGJveCc7XG5pbXBvcnQge1NldHRpbmdzUGFuZWxJdGVtfSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbGl0ZW0nO1xuaW1wb3J0IHtTZXR0aW5nc1BhbmVsUGFnZX0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzcGFuZWxwYWdlJztcbmltcG9ydCB7IFVJRmFjdG9yeSB9IGZyb20gJy4vdWlmYWN0b3J5JztcbmltcG9ydCB7IFVJQ29uZmlnIH0gZnJvbSAnLi91aWNvbmZpZyc7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuXG5leHBvcnQgbmFtZXNwYWNlIERlbW9GYWN0b3J5IHtcblxuICBleHBvcnQgZnVuY3Rpb24gYnVpbGREZW1vV2l0aFNlcGFyYXRlQXVkaW9TdWJ0aXRsZXNCdXR0b25zKHBsYXllcjogUGxheWVyQVBJLCBjb25maWc6IFVJQ29uZmlnID0ge30pOiBVSU1hbmFnZXIge1xuICAgIC8vIHNob3cgc21hbGxTY3JlZW4gVUkgb25seSBvbiBtb2JpbGUvaGFuZGhlbGQgZGV2aWNlc1xuICAgIGxldCBzbWFsbFNjcmVlblN3aXRjaFdpZHRoID0gNjAwO1xuXG4gICAgcmV0dXJuIG5ldyBVSU1hbmFnZXIocGxheWVyLCBbe1xuICAgICAgdWk6IFVJRmFjdG9yeS5tb2Rlcm5TbWFsbFNjcmVlbkFkc1VJKCksXG4gICAgICBjb25kaXRpb246IChjb250ZXh0OiBVSUNvbmRpdGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuaXNNb2JpbGUgJiYgY29udGV4dC5kb2N1bWVudFdpZHRoIDwgc21hbGxTY3JlZW5Td2l0Y2hXaWR0aFxuICAgICAgICAgICYmIGNvbnRleHQuaXNBZCAmJiBjb250ZXh0LmFkUmVxdWlyZXNVaTtcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgdWk6IFVJRmFjdG9yeS5tb2Rlcm5BZHNVSSgpLFxuICAgICAgY29uZGl0aW9uOiAoY29udGV4dDogVUlDb25kaXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmlzQWQgJiYgY29udGV4dC5hZFJlcXVpcmVzVWk7XG4gICAgICB9LFxuICAgIH0sIHtcbiAgICAgIHVpOiBVSUZhY3RvcnkubW9kZXJuU21hbGxTY3JlZW5VSSgpLFxuICAgICAgY29uZGl0aW9uOiAoY29udGV4dDogVUlDb25kaXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmlzTW9iaWxlICYmIGNvbnRleHQuZG9jdW1lbnRXaWR0aCA8IHNtYWxsU2NyZWVuU3dpdGNoV2lkdGg7XG4gICAgICB9LFxuICAgIH0sIHtcbiAgICAgIHVpOiBtb2Rlcm5VSVdpdGhTZXBhcmF0ZUF1ZGlvU3VidGl0bGVzQnV0dG9ucygpLFxuICAgIH1dLCBjb25maWcpO1xuICB9XG5cbiAgZnVuY3Rpb24gbW9kZXJuVUlXaXRoU2VwYXJhdGVBdWRpb1N1YnRpdGxlc0J1dHRvbnMoKSB7XG4gICAgbGV0IHN1YnRpdGxlT3ZlcmxheSA9IG5ldyBTdWJ0aXRsZU92ZXJsYXkoKTtcblxuICAgIGxldCBzZXR0aW5nc1BhbmVsID0gbmV3IFNldHRpbmdzUGFuZWwoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbFBhZ2Uoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbSgnVmlkZW8gUXVhbGl0eScsIG5ldyBWaWRlb1F1YWxpdHlTZWxlY3RCb3goKSksXG4gICAgICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oJ1NwZWVkJywgbmV3IFBsYXliYWNrU3BlZWRTZWxlY3RCb3goKSksXG4gICAgICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oJ0F1ZGlvIFF1YWxpdHknLCBuZXcgQXVkaW9RdWFsaXR5U2VsZWN0Qm94KCkpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGxldCBzdWJ0aXRsZUxpc3RCb3ggPSBuZXcgU3VidGl0bGVMaXN0Qm94KCk7XG4gICAgbGV0IHN1YnRpdGxlU2V0dGluZ3NQYW5lbCA9IG5ldyBTZXR0aW5nc1BhbmVsKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxQYWdlKHtcbiAgICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0obnVsbCwgc3VidGl0bGVMaXN0Qm94KSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgfSk7XG5cbiAgICBsZXQgYXVkaW9UcmFja0xpc3RCb3ggPSBuZXcgQXVkaW9UcmFja0xpc3RCb3goKTtcbiAgICBsZXQgYXVkaW9UcmFja1NldHRpbmdzUGFuZWwgPSBuZXcgU2V0dGluZ3NQYW5lbCh7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsUGFnZSh7XG4gICAgICAgICAgY29tcG9uZW50czogW1xuICAgICAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKG51bGwsIGF1ZGlvVHJhY2tMaXN0Qm94KSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgfSk7XG5cbiAgICBsZXQgY29udHJvbEJhciA9IG5ldyBDb250cm9sQmFyKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgYXVkaW9UcmFja1NldHRpbmdzUGFuZWwsXG4gICAgICAgIHN1YnRpdGxlU2V0dGluZ3NQYW5lbCxcbiAgICAgICAgc2V0dGluZ3NQYW5lbCxcbiAgICAgICAgbmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgY29tcG9uZW50czogW1xuICAgICAgICAgICAgbmV3IFBsYXliYWNrVGltZUxhYmVsKHsgdGltZUxhYmVsTW9kZTogUGxheWJhY2tUaW1lTGFiZWxNb2RlLkN1cnJlbnRUaW1lLCBoaWRlSW5MaXZlUGxheWJhY2s6IHRydWUgfSksXG4gICAgICAgICAgICBuZXcgU2Vla0Jhcih7IGxhYmVsOiBuZXcgU2Vla0JhckxhYmVsKCkgfSksXG4gICAgICAgICAgICBuZXcgUGxheWJhY2tUaW1lTGFiZWwoeyB0aW1lTGFiZWxNb2RlOiBQbGF5YmFja1RpbWVMYWJlbE1vZGUuVG90YWxUaW1lLCBjc3NDbGFzc2VzOiBbJ3RleHQtcmlnaHQnXSB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGNzc0NsYXNzZXM6IFsnY29udHJvbGJhci10b3AnXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBDb250YWluZXIoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQbGF5YmFja1RvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IFZvbHVtZVRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IFZvbHVtZVNsaWRlcigpLFxuICAgICAgICAgICAgbmV3IFNwYWNlcigpLFxuICAgICAgICAgICAgbmV3IFBpY3R1cmVJblBpY3R1cmVUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgIG5ldyBBaXJQbGF5VG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgQ2FzdFRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IFZSVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgU2V0dGluZ3NUb2dnbGVCdXR0b24oe1xuICAgICAgICAgICAgICBzZXR0aW5nc1BhbmVsOiBhdWRpb1RyYWNrU2V0dGluZ3NQYW5lbCxcbiAgICAgICAgICAgICAgY3NzQ2xhc3M6ICd1aS1hdWRpb3RyYWNrc2V0dGluZ3N0b2dnbGVidXR0b24nLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgU2V0dGluZ3NUb2dnbGVCdXR0b24oe1xuICAgICAgICAgICAgICBzZXR0aW5nc1BhbmVsOiBzdWJ0aXRsZVNldHRpbmdzUGFuZWwsXG4gICAgICAgICAgICAgIGNzc0NsYXNzOiAndWktc3VidGl0bGVzZXR0aW5nc3RvZ2dsZWJ1dHRvbicsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nc1RvZ2dsZUJ1dHRvbih7IHNldHRpbmdzUGFuZWw6IHNldHRpbmdzUGFuZWwgfSksXG4gICAgICAgICAgICBuZXcgRnVsbHNjcmVlblRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY3NzQ2xhc3NlczogWydjb250cm9sYmFyLWJvdHRvbSddLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFVJQ29udGFpbmVyKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgc3VidGl0bGVPdmVybGF5LFxuICAgICAgICBuZXcgQnVmZmVyaW5nT3ZlcmxheSgpLFxuICAgICAgICBuZXcgUGxheWJhY2tUb2dnbGVPdmVybGF5KCksXG4gICAgICAgIG5ldyBDYXN0U3RhdHVzT3ZlcmxheSgpLFxuICAgICAgICBjb250cm9sQmFyLFxuICAgICAgICBuZXcgVGl0bGVCYXIoKSxcbiAgICAgICAgbmV3IFJlY29tbWVuZGF0aW9uT3ZlcmxheSgpLFxuICAgICAgICBuZXcgV2F0ZXJtYXJrKCksXG4gICAgICAgIG5ldyBFcnJvck1lc3NhZ2VPdmVybGF5KCksXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59IiwiZXhwb3J0IGludGVyZmFjZSBPZmZzZXQge1xuICBsZWZ0OiBudW1iZXI7XG4gIHRvcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDc3NQcm9wZXJ0aWVzIHtcbiAgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNpbXBsZSBET00gbWFuaXB1bGF0aW9uIGFuZCBET00gZWxlbWVudCBldmVudCBoYW5kbGluZyBtb2RlbGVkIGFmdGVyIGpRdWVyeSAoYXMgcmVwbGFjZW1lbnQgZm9yIGpRdWVyeSkuXG4gKlxuICogTGlrZSBqUXVlcnksIERPTSBvcGVyYXRlcyBvbiBzaW5nbGUgZWxlbWVudHMgYW5kIGxpc3RzIG9mIGVsZW1lbnRzLiBGb3IgZXhhbXBsZTogY3JlYXRpbmcgYW4gZWxlbWVudCByZXR1cm5zIGEgRE9NXG4gKiBpbnN0YW5jZSB3aXRoIGEgc2luZ2xlIGVsZW1lbnQsIHNlbGVjdGluZyBlbGVtZW50cyByZXR1cm5zIGEgRE9NIGluc3RhbmNlIHdpdGggemVybywgb25lLCBvciBtYW55IGVsZW1lbnRzLiBTaW1pbGFyXG4gKiB0byBqUXVlcnksIHNldHRlcnMgdXN1YWxseSBhZmZlY3QgYWxsIGVsZW1lbnRzLCB3aGlsZSBnZXR0ZXJzIG9wZXJhdGUgb24gb25seSB0aGUgZmlyc3QgZWxlbWVudC5cbiAqIEFsc28gc2ltaWxhciB0byBqUXVlcnksIG1vc3QgbWV0aG9kcyAoZXhjZXB0IGdldHRlcnMpIHJldHVybiB0aGUgRE9NIGluc3RhbmNlIGZhY2lsaXRhdGluZyBlYXN5IGNoYWluaW5nIG9mIG1ldGhvZFxuICogY2FsbHMuXG4gKlxuICogQnVpbHQgd2l0aCB0aGUgaGVscCBvZjogaHR0cDovL3lvdW1pZ2h0bm90bmVlZGpxdWVyeS5jb20vXG4gKi9cbmV4cG9ydCBjbGFzcyBET00ge1xuXG4gIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBlbGVtZW50cyB0aGF0IHRoZSBpbnN0YW5jZSB3cmFwcy4gVGFrZSBjYXJlIHRoYXQgbm90IGFsbCBtZXRob2RzIGNhbiBvcGVyYXRlIG9uIHRoZSB3aG9sZSBsaXN0LFxuICAgKiBnZXR0ZXJzIHVzdWFsbHkganVzdCB3b3JrIG9uIHRoZSBmaXJzdCBlbGVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBlbGVtZW50czogSFRNTEVsZW1lbnRbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIERPTSBlbGVtZW50LlxuICAgKiBAcGFyYW0gdGFnTmFtZSB0aGUgdGFnIG5hbWUgb2YgdGhlIERPTSBlbGVtZW50XG4gICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50XG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YWdOYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZXM6IHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfSk7XG4gIC8qKlxuICAgKiBTZWxlY3RzIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBET00gdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIG1hdGNoIERPTSBlbGVtZW50cyB3aXRoXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZWxlY3Rvcjogc3RyaW5nKTtcbiAgLyoqXG4gICAqIFdyYXBzIGEgcGxhaW4gSFRNTEVsZW1lbnQgd2l0aCBhIERPTSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIEhUTUxFbGVtZW50IHRvIHdyYXAgd2l0aCBET01cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTtcbiAgLyoqXG4gICAqIFdyYXBzIGEgbGlzdCBvZiBwbGFpbiBIVE1MRWxlbWVudHMgd2l0aCBhIERPTSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGVsZW1lbnRzIHRoZSBIVE1MRWxlbWVudHMgdG8gd3JhcCB3aXRoIERPTVxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxlbWVudHM6IEhUTUxFbGVtZW50W10pO1xuICAvKipcbiAgICogV3JhcHMgdGhlIGRvY3VtZW50IHdpdGggYSBET00gaW5zdGFuY2UuIFVzZWZ1bCB0byBhdHRhY2ggZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBkb2N1bWVudC5cbiAgICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB0byB3cmFwXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihkb2N1bWVudDogRG9jdW1lbnQpO1xuICBjb25zdHJ1Y3Rvcihzb21ldGhpbmc6IHN0cmluZyB8IEhUTUxFbGVtZW50IHwgSFRNTEVsZW1lbnRbXSB8IERvY3VtZW50LCBhdHRyaWJ1dGVzPzoge1tuYW1lOiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OyAvLyBTZXQgdGhlIGdsb2JhbCBkb2N1bWVudCB0byB0aGUgbG9jYWwgZG9jdW1lbnQgZmllbGRcblxuICAgIGlmIChzb21ldGhpbmcgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgaWYgKHNvbWV0aGluZy5sZW5ndGggPiAwICYmIHNvbWV0aGluZ1swXSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGxldCBlbGVtZW50cyA9IHNvbWV0aGluZztcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzb21ldGhpbmcgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgbGV0IGVsZW1lbnQgPSBzb21ldGhpbmc7XG4gICAgICB0aGlzLmVsZW1lbnRzID0gW2VsZW1lbnRdO1xuICAgIH1cbiAgICBlbHNlIGlmIChzb21ldGhpbmcgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgLy8gV2hlbiBhIGRvY3VtZW50IGlzIHBhc3NlZCBpbiwgd2UgZG8gbm90IGRvIGFueXRoaW5nIHdpdGggaXQsIGJ1dCBieSBzZXR0aW5nIHRoaXMuZWxlbWVudHMgdG8gbnVsbFxuICAgICAgLy8gd2UgZ2l2ZSB0aGUgZXZlbnQgaGFuZGxpbmcgbWV0aG9kIGEgbWVhbnMgdG8gZGV0ZWN0IGlmIHRoZSBldmVudHMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgb24gdGhlIGRvY3VtZW50XG4gICAgICAvLyBpbnN0ZWFkIG9mIGVsZW1lbnRzLlxuICAgICAgdGhpcy5lbGVtZW50cyA9IG51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgIGxldCB0YWdOYW1lID0gc29tZXRoaW5nO1xuICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgbGV0IGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5lbGVtZW50cyA9IFtlbGVtZW50XTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsZXQgc2VsZWN0b3IgPSBzb21ldGhpbmc7XG4gICAgICB0aGlzLmVsZW1lbnRzID0gdGhpcy5maW5kQ2hpbGRFbGVtZW50cyhzZWxlY3Rvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IHRoaXMgRE9NIGluc3RhbmNlIGN1cnJlbnRseSBob2xkcy5cbiAgICogQHJldHVybnMge251bWJlcn0gdGhlIG51bWJlciBvZiBlbGVtZW50c1xuICAgKi9cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzID8gdGhpcy5lbGVtZW50cy5sZW5ndGggOiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEhUTUwgZWxlbWVudHMgdGhhdCB0aGlzIERPTSBpbnN0YW5jZSBjdXJyZW50bHkgaG9sZHMuXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfSB0aGUgcmF3IEhUTUwgZWxlbWVudHNcbiAgICovXG4gIGdldCgpOiBIVE1MRWxlbWVudFtdO1xuICAvKipcbiAgICogR2V0cyBhbiBIVE1MIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCBlbGVtZW50cyB0aGF0IHRoaXMgRE9NIGluc3RhbmNlIGN1cnJlbnRseSBob2xkcy5cbiAgICogQHBhcmFtIGluZGV4IFRoZSB6ZXJvLWJhc2VkIGluZGV4IGludG8gdGhlIGVsZW1lbnQgbGlzdC4gQ2FuIGJlIG5lZ2F0aXZlIHRvIHJldHVybiBhbiBlbGVtZW50IGZyb20gdGhlIGVuZCxcbiAgICogICAgZS5nLiAtMSByZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQuXG4gICAqL1xuICBnZXQoaW5kZXg6IG51bWJlcik6IEhUTUxFbGVtZW50O1xuICBnZXQoaW5kZXg/OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IEhUTUxFbGVtZW50W10ge1xuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50cztcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmVsZW1lbnRzIHx8IGluZGV4ID49IHRoaXMuZWxlbWVudHMubGVuZ3RoIHx8IGluZGV4IDwgLXRoaXMuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50c1t0aGlzLmVsZW1lbnRzLmxlbmd0aCAtIGluZGV4XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNob3J0Y3V0IG1ldGhvZCBmb3IgaXRlcmF0aW5nIGFsbCBlbGVtZW50cy4gU2hvcnRzIHRoaXMuZWxlbWVudHMuZm9yRWFjaCguLi4pIHRvIHRoaXMuZm9yRWFjaCguLi4pLlxuICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgaGFuZGxlciB0byBleGVjdXRlIGFuIG9wZXJhdGlvbiBvbiBhbiBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIGZvckVhY2goaGFuZGxlcjogKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaGFuZGxlcihlbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZENoaWxkRWxlbWVudHNPZkVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCwgc2VsZWN0b3I6IHN0cmluZyk6IEhUTUxFbGVtZW50W10ge1xuICAgIGxldCBjaGlsZEVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcblxuICAgIC8vIENvbnZlcnQgTm9kZUxpc3QgdG8gQXJyYXlcbiAgICAvLyBodHRwczovL3RvZGRtb3R0by5jb20vYS1jb21wcmVoZW5zaXZlLWRpdmUtaW50by1ub2RlbGlzdHMtYXJyYXlzLWNvbnZlcnRpbmctbm9kZWxpc3RzLWFuZC11bmRlcnN0YW5kaW5nLXRoZS1kb20vXG4gICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwoY2hpbGRFbGVtZW50cyk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRDaGlsZEVsZW1lbnRzKHNlbGVjdG9yOiBzdHJpbmcpOiBIVE1MRWxlbWVudFtdIHtcbiAgICBsZXQgYWxsQ2hpbGRFbGVtZW50cyA9IDxIVE1MRWxlbWVudFtdPltdO1xuXG4gICAgaWYgKHRoaXMuZWxlbWVudHMpIHtcbiAgICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBhbGxDaGlsZEVsZW1lbnRzID0gYWxsQ2hpbGRFbGVtZW50cy5jb25jYXQodGhpcy5maW5kQ2hpbGRFbGVtZW50c09mRWxlbWVudChlbGVtZW50LCBzZWxlY3RvcikpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZENoaWxkRWxlbWVudHNPZkVsZW1lbnQoZG9jdW1lbnQsIHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWxsQ2hpbGRFbGVtZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgY2hpbGQgZWxlbWVudHMgb2YgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzdXBwbGllZCBzZWxlY3Rvci5cbiAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBtYXRjaCB3aXRoIGNoaWxkIGVsZW1lbnRzXG4gICAqIEByZXR1cm5zIHtET019IGEgbmV3IERPTSBpbnN0YW5jZSByZXByZXNlbnRpbmcgYWxsIG1hdGNoZWQgY2hpbGRyZW5cbiAgICovXG4gIGZpbmQoc2VsZWN0b3I6IHN0cmluZyk6IERPTSB7XG4gICAgbGV0IGFsbENoaWxkRWxlbWVudHMgPSB0aGlzLmZpbmRDaGlsZEVsZW1lbnRzKHNlbGVjdG9yKTtcbiAgICByZXR1cm4gbmV3IERPTShhbGxDaGlsZEVsZW1lbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VzIHRvIHRoZSBmaXJzdCBpbnB1dCBlbGVtZW50XG4gICAqL1xuICBmb2N1c1RvRmlyc3RJbnB1dCgpIHtcbiAgICBjb25zdCBpbnB1dEVsZW1lbnRzID0gdGhpcy5maW5kQ2hpbGRFbGVtZW50cygnYnV0dG9uLCBbaHJlZl0sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSknKTtcblxuICAgIGlmIChpbnB1dEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlucHV0RWxlbWVudHNbMF0uZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNlcyB0byB0aGUgZmlyc3QgaW5wdXQgZWxlbWVudFxuICAgKi9cbiAgc2Nyb2xsVG8oeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICB0aGlzLmVsZW1lbnRzWzBdLnNjcm9sbFRvKHgsIHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGlubmVyIEhUTUwgY29udGVudCBvZiB0aGUgZmlyc3QgZWxlbWVudC5cbiAgICovXG4gIGh0bWwoKTogc3RyaW5nO1xuICAvKipcbiAgICogU2V0cyB0aGUgaW5uZXIgSFRNTCBjb250ZW50IG9mIGFsbCBlbGVtZW50cy5cbiAgICogQHBhcmFtIGNvbnRlbnQgYSBzdHJpbmcgb2YgcGxhaW4gdGV4dCBvciBIVE1MIG1hcmt1cFxuICAgKi9cbiAgaHRtbChjb250ZW50OiBzdHJpbmcpOiBET007XG4gIGh0bWwoY29udGVudD86IHN0cmluZyk6IHN0cmluZyB8IERPTSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRIdG1sKGNvbnRlbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEh0bWwoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEh0bWwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbMF0uaW5uZXJIVE1MO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIdG1sKGNvbnRlbnQ6IHN0cmluZyk6IERPTSB7XG4gICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCB8fCBjb250ZW50ID09IG51bGwpIHtcbiAgICAgIC8vIFNldCB0byBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgaW5uZXJIVE1MIGdldHRpbmcgc2V0IHRvICd1bmRlZmluZWQnIChhbGwgYnJvd3NlcnMpIG9yICdudWxsJyAoSUU5KVxuICAgICAgY29udGVudCA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBpbm5lciBIVE1MIG9mIGFsbCBlbGVtZW50cyAoZGVsZXRlcyBhbGwgY2hpbGRyZW4pLlxuICAgKiBAcmV0dXJucyB7RE9NfVxuICAgKi9cbiAgZW1wdHkoKTogRE9NIHtcbiAgICB0aGlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmlyc3QgZm9ybSBlbGVtZW50LCBlLmcuIHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiBhIHNlbGVjdCBib3ggb3IgdGhlIHRleHQgaWYgYW5cbiAgICogaW5wdXQgZmllbGQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSB2YWx1ZSBvZiBhIGZvcm0gZWxlbWVudFxuICAgKi9cbiAgdmFsKCk6IHN0cmluZyB7XG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRzWzBdO1xuXG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgbWlzc2luZyBmb3JtIGVsZW1lbnRzXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHZhbCgpIG5vdCBzdXBwb3J0ZWQgZm9yICR7dHlwZW9mIGVsZW1lbnR9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBvbiB0aGUgZmlyc3QgZWxlbWVudC5cbiAgICogQHBhcmFtIGF0dHJpYnV0ZVxuICAgKi9cbiAgYXR0cihhdHRyaWJ1dGU6IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiBTZXRzIGFuIGF0dHJpYnV0ZSBvbiBhbGwgZWxlbWVudHMuXG4gICAqIEBwYXJhbSBhdHRyaWJ1dGUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZVxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAgICovXG4gIGF0dHIoYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBET007XG4gIGF0dHIoYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IERPTSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRBdHRyKGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEF0dHIoYXR0cmlidXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgYXR0cmlidXRlIG9mIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gYXR0cmlidXRlXG4gICAqL1xuICByZW1vdmVBdHRyKGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdHRyKGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbMF0uZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gIH1cblxuICBwcml2YXRlIHNldEF0dHIoYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBET00ge1xuICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBkYXRhIGVsZW1lbnQgb24gdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSBkYXRhQXR0cmlidXRlIHRoZSBuYW1lIG9mIHRoZSBkYXRhIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSAnZGF0YS0nIHByZWZpeFxuICAgKi9cbiAgZGF0YShkYXRhQXR0cmlidXRlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogU2V0cyBhIGRhdGEgYXR0cmlidXRlIG9uIGFsbCBlbGVtZW50cy5cbiAgICogQHBhcmFtIGRhdGFBdHRyaWJ1dGUgdGhlIG5hbWUgb2YgdGhlIGRhdGEgYXR0cmlidXRlIHdpdGhvdXQgdGhlICdkYXRhLScgcHJlZml4XG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGRhdGEgYXR0cmlidXRlXG4gICAqL1xuICBkYXRhKGRhdGFBdHRyaWJ1dGU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IERPTTtcbiAgZGF0YShkYXRhQXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IERPTSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXREYXRhKGRhdGFBdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREYXRhKGRhdGFBdHRyaWJ1dGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0YShkYXRhQXR0cmlidXRlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtJyArIGRhdGFBdHRyaWJ1dGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRhKGRhdGFBdHRyaWJ1dGU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IERPTSB7XG4gICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS0nICsgZGF0YUF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIG9yIG1vcmUgRE9NIGVsZW1lbnRzIGFzIGNoaWxkcmVuIHRvIGFsbCBlbGVtZW50cy5cbiAgICogQHBhcmFtIGNoaWxkRWxlbWVudHMgdGhlIGNocmlsZCBlbGVtZW50cyB0byBhcHBlbmRcbiAgICogQHJldHVybnMge0RPTX1cbiAgICovXG4gIGFwcGVuZCguLi5jaGlsZEVsZW1lbnRzOiBET01bXSk6IERPTSB7XG4gICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBjaGlsZEVsZW1lbnRzLmZvckVhY2goKGNoaWxkRWxlbWVudCkgPT4ge1xuICAgICAgICBjaGlsZEVsZW1lbnQuZWxlbWVudHMuZm9yRWFjaCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlbWVudC5lbGVtZW50c1tpbmRleF0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIERPTS5cbiAgICovXG4gIHJlbW92ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgZG9jdW1lbnQncyB0b3AgbGVmdCBjb3JuZXIuXG4gICAqIEByZXR1cm5zIHtPZmZzZXR9XG4gICAqL1xuICBvZmZzZXQoKTogT2Zmc2V0IHtcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuZWxlbWVudHNbMF07XG4gICAgbGV0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgaHRtbFJlY3QgPSBkb2N1bWVudC5ib2R5LnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAvLyBWaXJ0dWFsIHZpZXdwb3J0IHNjcm9sbCBoYW5kbGluZyAoZS5nLiBwaW5jaCB6b29tZWQgdmlld3BvcnRzIGluIG1vYmlsZSBicm93c2VycyBvciBkZXNrdG9wIENocm9tZS9FZGdlKVxuICAgIC8vICdub3JtYWwnIHpvb21zIGFuZCB2aXJ0dWFsIHZpZXdwb3J0IHpvb21zIChha2EgbGF5b3V0IHZpZXdwb3J0KSByZXN1bHQgaW4gZGlmZmVyZW50XG4gICAgLy8gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSByZXN1bHRzOlxuICAgIC8vICAtIHdpdGggbm9ybWFsIHNjcm9sbHMsIHRoZSBjbGllbnRSZWN0IGRlY3JlYXNlcyB3aXRoIGFuIGluY3JlYXNlIGluIHNjcm9sbChUb3B8TGVmdCkvcGFnZShYfFkpT2Zmc2V0XG4gICAgLy8gIC0gd2l0aCBwaW5jaCB6b29tIHNjcm9sbHMsIHRoZSBjbGllbnRSZWN0IHN0YXlzIHRoZSBzYW1lIHdoaWxlIHNjcm9sbC9wYWdlT2Zmc2V0IGNoYW5nZXNcbiAgICAvLyBUaGlzIG1lYW5zLCB0aGF0IHRoZSBjb21iaW5hdGlvbiBvZiBjbGllbnRSZWN0ICsgc2Nyb2xsL3BhZ2VPZmZzZXQgZG9lcyBub3Qgd29yayB0byBjYWxjdWxhdGUgdGhlIG9mZnNldFxuICAgIC8vIGZyb20gdGhlIGRvY3VtZW50J3MgdXBwZXIgbGVmdCBvcmlnaW4gd2hlbiBwaW5jaCB6b29tIGlzIHVzZWQuXG4gICAgLy8gVG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSwgd2UgZG8gbm90IHVzZSBzY3JvbGwvcGFnZU9mZnNldCBidXQgZ2V0IHRoZSBjbGllbnRSZWN0IG9mIHRoZSBodG1sIGVsZW1lbnQgYW5kXG4gICAgLy8gc3VidHJhY3QgaXQgZnJvbSB0aGUgZWxlbWVudCdzIHJlY3QsIHdoaWNoIGFsd2F5cyByZXN1bHRzIGluIHRoZSBvZmZzZXQgZnJvbSB0aGUgZG9jdW1lbnQgb3JpZ2luLlxuICAgIC8vIE5PVEU6IHRoZSBjdXJyZW50IHdheSBvZiBvZmZzZXQgY2FsY3VsYXRpb24gd2FzIGltcGxlbWVudGVkIHNwZWNpZmljYWxseSB0byB0cmFjayBldmVudCBwb3NpdGlvbnMgb24gdGhlXG4gICAgLy8gc2VlayBiYXIsIGFuZCBpdCBtaWdodCBicmVhayBjb21wYXRpYmlsaXR5IHdpdGggalF1ZXJ5J3Mgb2Zmc2V0KCkgbWV0aG9kLiBJZiB0aGlzIGV2ZXIgdHVybnMgb3V0IHRvIGJlIGFcbiAgICAvLyBwcm9ibGVtLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgcmV2ZXJ0ZWQgdG8gdGhlIG9sZCB2ZXJzaW9uIGFuZCB0aGUgb2Zmc2V0IGNhbGN1bGF0aW9uIG1vdmVkIHRvIHRoZSBzZWVrIGJhci5cblxuICAgIHJldHVybiB7XG4gICAgICB0b3A6IGVsZW1lbnRSZWN0LnRvcCAtIGh0bWxSZWN0LnRvcCxcbiAgICAgIGxlZnQ6IGVsZW1lbnRSZWN0LmxlZnQgLSBodG1sUmVjdC5sZWZ0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgd2lkdGggb2YgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgZWxlbWVudFxuICAgKi9cbiAgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAvLyBUT0RPIGNoZWNrIGlmIHRoaXMgaXMgdGhlIHNhbWUgYXMgalF1ZXJ5J3Mgd2lkdGgoKSAocHJvYmFibHkgbm90KVxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzWzBdLm9mZnNldFdpZHRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgZmlyc3QgZWxlbWVudC5cbiAgICogQHJldHVybnMge251bWJlcn0gdGhlIGhlaWdodCBvZiB0aGUgZmlyc3QgZWxlbWVudFxuICAgKi9cbiAgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgLy8gVE9ETyBjaGVjayBpZiB0aGlzIGlzIHRoZSBzYW1lIGFzIGpRdWVyeSdzIGhlaWdodCgpIChwcm9iYWJseSBub3QpXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbMF0ub2Zmc2V0SGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAqIEByZXR1cm4ge1NpemV9IHRoZSBzaXplIG9mIHRoZSBmaXJzdCBlbGVtZW50XG4gICAqL1xuICBzaXplKCk6IFNpemUge1xuICAgIHJldHVybiB7IHdpZHRoOiB0aGlzLndpZHRoKCksIGhlaWdodDogdGhpcy5oZWlnaHQoKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGFuIGV2ZW50IGhhbmRsZXIgdG8gb25lIG9yIG1vcmUgZXZlbnRzIG9uIGFsbCBlbGVtZW50cy5cbiAgICogQHBhcmFtIGV2ZW50TmFtZSB0aGUgZXZlbnQgbmFtZSAob3IgbXVsdGlwbGUgbmFtZXMgc2VwYXJhdGVkIGJ5IHNwYWNlKSB0byBsaXN0ZW4gdG9cbiAgICogQHBhcmFtIGV2ZW50SGFuZGxlciB0aGUgZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGZpcmVzXG4gICAqIEByZXR1cm5zIHtET019XG4gICAqL1xuICBvbihldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0KTogRE9NIHtcbiAgICBsZXQgZXZlbnRzID0gZXZlbnROYW1lLnNwbGl0KCcgJyk7XG5cbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBldmVudEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZXZlbnRIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGhhbmRsZXIgZnJvbSBvbmUgb3IgbW9yZSBldmVudHMgb24gYWxsIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIHRoZSBldmVudCBuYW1lIChvciBtdWx0aXBsZSBuYW1lcyBzZXBhcmF0ZWQgYnkgc3BhY2UpIHRvIHJlbW92ZSB0aGUgaGFuZGxlciBmcm9tXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgdGhlIGV2ZW50IGhhbmRsZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtET019XG4gICAqL1xuICBvZmYoZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50SGFuZGxlcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCk6IERPTSB7XG4gICAgbGV0IGV2ZW50cyA9IGV2ZW50TmFtZS5zcGxpdCgnICcpO1xuXG4gICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5lbGVtZW50cyA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgZXZlbnRIYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGV2ZW50SGFuZGxlcik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGNsYXNzKGVzKSB0byBhbGwgZWxlbWVudHMuXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGNsYXNzKGVzKSB0byBhZGQsIG11bHRpcGxlIGNsYXNzZXMgc2VwYXJhdGVkIGJ5IHNwYWNlXG4gICAqIEByZXR1cm5zIHtET019XG4gICAqL1xuICBhZGRDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IERPTSB7XG4gICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzTmFtZS5zcGxpdCgnICcpXG4gICAgICAgICAgLmZpbHRlcihjbGFzc05hbWUgPT4gY2xhc3NOYW1lLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIGlmIChjbGFzc05hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uY2xhc3NOYW1lcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSArPSAnICcgKyBjbGFzc05hbWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVkIHRoZSBzcGVjaWZpZWQgY2xhc3MoZXMpIGZyb20gYWxsIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBjbGFzcyhlcykgdG8gcmVtb3ZlLCBtdWx0aXBsZSBjbGFzc2VzIHNlcGFyYXRlZCBieSBzcGFjZVxuICAgKiBAcmV0dXJucyB7RE9NfVxuICAgKi9cbiAgcmVtb3ZlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBET00ge1xuICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc05hbWUuc3BsaXQoJyAnKVxuICAgICAgICAgIC5maWx0ZXIoY2xhc3NOYW1lID0+IGNsYXNzTmFtZS5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAoY2xhc3NOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLmNsYXNzTmFtZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKFxuICAgICAgICAgIG5ldyBSZWdFeHAoJyhefFxcXFxiKScgKyBjbGFzc05hbWUuc3BsaXQoJyAnKS5qb2luKCd8JykgKyAnKFxcXFxifCQpJywgJ2dpJyksICcgJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBoYXMgdGhlIHNwZWNpZmllZCBjbGFzcy5cbiAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBvbmUgb2YgdGhlIGVsZW1lbnRzIGhhcyB0aGUgY2xhc3MgYXR0YWNoZWQsIGVsc2UgaWYgbm8gZWxlbWVudCBoYXMgaXQgYXR0YWNoZWRcbiAgICovXG4gIGhhc0NsYXNzKGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0NsYXNzID0gZmFsc2U7XG5cbiAgICB0aGlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkge1xuICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBpbnNpZGUgYSBoYW5kbGVyLCB3ZSBjYW4ndCBqdXN0ICdyZXR1cm4gdHJ1ZScuIEluc3RlYWQsIHdlIHNhdmUgaXQgdG8gYSB2YXJpYWJsZVxuICAgICAgICAgIC8vIGFuZCByZXR1cm4gaXQgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gYm9keS5cbiAgICAgICAgICBoYXNDbGFzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAobmV3IFJlZ0V4cCgnKF58ICknICsgY2xhc3NOYW1lICsgJyggfCQpJywgJ2dpJykudGVzdChlbGVtZW50LmNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAvLyBTZWUgY29tbWVudCBhYm92ZVxuICAgICAgICAgIGhhc0NsYXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhc0NsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgQ1NTIHByb3BlcnR5IG9mIHRoZSBmaXJzdCBlbGVtZW50LlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mXG4gICAqL1xuICBjc3MocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBDU1MgcHJvcGVydHkgb24gYWxsIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkgdG8gc2V0IHRoZSB2YWx1ZSBmb3JcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBnaXZlbiBDU1MgcHJvcGVydHlcbiAgICovXG4gIGNzcyhwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IERPTTtcbiAgLyoqXG4gICAqIFNldHMgYSBjb2xsZWN0aW9uIG9mIENTUyBwcm9wZXJ0aWVzIGFuZCB0aGVpciB2YWx1ZXMgb24gYWxsIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gcHJvcGVydHlWYWx1ZUNvbGxlY3Rpb24gYW4gb2JqZWN0IGNvbnRhaW5pbmcgcGFpcnMgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHRoZWlyIHZhbHVlc1xuICAgKi9cbiAgY3NzKHByb3BlcnR5VmFsdWVDb2xsZWN0aW9uOiBDc3NQcm9wZXJ0aWVzKTogRE9NO1xuICBjc3MocHJvcGVydHlOYW1lT3JDb2xsZWN0aW9uOiBzdHJpbmcgfCBDc3NQcm9wZXJ0aWVzLCB2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGwgfCBET00ge1xuICAgIGlmICh0eXBlb2YgcHJvcGVydHlOYW1lT3JDb2xsZWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgbGV0IHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZU9yQ29sbGVjdGlvbjtcblxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Q3NzKHByb3BlcnR5TmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENzcyhwcm9wZXJ0eU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxldCBwcm9wZXJ0eVZhbHVlQ29sbGVjdGlvbiA9IHByb3BlcnR5TmFtZU9yQ29sbGVjdGlvbjtcbiAgICAgIHJldHVybiB0aGlzLnNldENzc0NvbGxlY3Rpb24ocHJvcGVydHlWYWx1ZUNvbGxlY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3NzKHByb3BlcnR5TmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50c1swXSlbPGFueT5wcm9wZXJ0eU5hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDc3MocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBET00ge1xuICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgLy8gPGFueT4gY2FzdCB0byByZXNvbHZlIFRTNzAxNTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzY2MjcxMTQvMzcwMjUyXG4gICAgICBlbGVtZW50LnN0eWxlWzxhbnk+cHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDc3NDb2xsZWN0aW9uKHJ1bGVWYWx1ZUNvbGxlY3Rpb246IHtbcnVsZU5hbWU6IHN0cmluZ106IHN0cmluZ30pOiBET00ge1xuICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzQ0OTA1NzMvMzcwMjUyXG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHJ1bGVWYWx1ZUNvbGxlY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCB7RXJyb3JNZXNzYWdlTWFwLCBFcnJvck1lc3NhZ2VUcmFuc2xhdG9yfSBmcm9tICcuL2NvbXBvbmVudHMvZXJyb3JtZXNzYWdlb3ZlcmxheSc7XG5pbXBvcnQgeyBFcnJvckV2ZW50IH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IE1vYmlsZVYzUGxheWVyRXJyb3JFdmVudCwgTW9iaWxlVjNTb3VyY2VFcnJvckV2ZW50IH0gZnJvbSAnLi9tb2JpbGV2M3BsYXllcmFwaSc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgRXJyb3JVdGlscyB7XG5cbiAgZXhwb3J0IGNvbnN0IGRlZmF1bHRFcnJvck1lc3NhZ2VzOiBFcnJvck1lc3NhZ2VNYXAgPSB7XG4gICAgMTAwMDogJ0Vycm9yIGlzIHVua25vd24nLFxuICAgIDEwMDE6ICdUaGUgcGxheWVyIEFQSSBpcyBub3QgYXZhaWxhYmxlIGFmdGVyIGEgY2FsbCB0byBQbGF5ZXJBUEkuZGVzdHJveS4nLFxuICAgIDExMDA6ICdHZW5lcmFsIHNldHVwIGVycm9yJyxcbiAgICAxMTAxOiAnVGhlcmUgd2FzIGFuIGVycm9yIHdoZW4gaW5zZXJ0aW5nIHRoZSBIVE1MIHZpZGVvIGVsZW1lbnQnLFxuICAgIDExMDI6ICdObyBjb25maWd1cmF0aW9uIHdhcyBwcm92aWRlZCcsXG4gICAgMTEwMzogJ1RoZSBsaWNlbnNlIGlzIG5vdCB2YWxpZCcsXG4gICAgMTEwNDogJ1RoZSB0aGUgZG9tYWluLWxvY2tlZCBwbGF5ZXIgaXMgbm90IGF1dGhvcml6ZWQgdG8gcGxheWJhY2sgb24gdGhpcyBkb21haW4nLFxuICAgIDExMDU6ICdUaGUgZG9tYWluIGlzIG5vdCBhbGxvd2xpc3RlZCcsXG4gICAgMTEwNjogJ1RoZSBsaWNlbnNlIHNlcnZlciBVUkwgaXMgaW52YWxpZCcsXG4gICAgMTEwNzogJ1RoZSBpbXByZXNzaW9uIHNlcnZlciBVUkwgaXMgaW52YWxpZCcsXG4gICAgMTEwODogJ0NvdWxkIG5vdCBpbml0aWFsaXplIGEgcmVuZGVyaW5nIGVuZ2luZScsXG4gICAgMTEwOTogJ1RoZSB1c2VkIGZsYXNoIHZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCBwbGF5YmFjaycsXG4gICAgMTExMDogJ05hdGl2ZSBGbGFzaCBpcyBub3QgYXV0aG9yaXplZCBieSBhIHZhbGlkIEFkb2JlIHRva2VuJyxcbiAgICAxMTExOiAnRmxhc2ggZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCByZXNvdXJjZXMnLFxuICAgIDExMTI6ICdGbGFzaCBjb250YWluZXIgQVBJIG5vdCBhdmFpbGFibGUnLFxuICAgIDExMTM6ICdQcm90b2NvbCBub3Qgc3VwcG9ydGVkLiBUaGlzIHNpdGUgaGFzIGJlZW4gbG9hZGVkIHVzaW5nIFwiZmlsZVwiIHByb3RvY29sLCBidXQgdW5mb3J0dW5hdGVseSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSBsb2FkIHRoZSBwYWdlIHVzaW5nIGEgd2ViIHNlcnZlciAodXNpbmcgaHR0cCBvciBodHRwcyknLFxuICAgIDEyMDA6ICdHZW5lcmFsIHNvdXJjZSBlcnJvcicsXG4gICAgMTIwMTogJ05vIHZhbGlkIHNvdXJjZSB3YXMgcHJvdmlkZWQnLFxuICAgIDEyMDI6ICdUaGUgZG93bmxvYWRlZCBtYW5pZmVzdCBpcyBpbnZhbGlkJyxcbiAgICAxMjAzOiAnVGhlcmUgd2FzIG5vIHRlY2hub2xvZ3kgZGV0ZWN0ZWQgdG8gcGxheWJhY2sgdGhlIHByb3ZpZGVkIHNvdXJjZScsXG4gICAgMTIwNDogJ1RoZSBzdHJlYW0gdHlwZSBpcyBub3Qgc3VwcG9ydGVkJyxcbiAgICAxMjA1OiAnVGhlIGZvcmNlZCB0ZWNobm9sb2d5IGlzIG5vdCBzdXBwb3J0ZWQnLFxuICAgIDEyMDY6ICdObyBzdHJlYW0gZm91bmQgZm9yIHN1cHBvcnRlZCB0ZWNobm9sb2dpZXMuJyxcbiAgICAxMjA3OiAnVGhlIGRvd25sb2FkZWQgc2VnbWVudCBpcyBlbXB0eScsXG4gICAgMTIwODogJ1RoZSBtYW5pZmVzdCBjb3VsZCBub3QgYmUgbG9hZGVkJyxcbiAgICAxMjA5OiAnUHJvZ3Jlc3NpdmUgc3RyZWFtIHR5cGUgbm90IHN1cHBvcnRlZCBvciB0aGUgc3RyZWFtIGhhcyBhbiBlcnJvcicsXG4gICAgMTIxMDogJ0hMUyBzdHJlYW0gaGFzIGFuIGVycm9yJyxcbiAgICAxMjExOiAnVGhlIGVuY3J5cHRpb24gbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQnLFxuICAgIDEzMDA6ICdHZW5lcmFsIHBsYXliYWNrIGVycm9yJyxcbiAgICAxMzAxOiAnVmlkZW8gZGVjb2RlciBvciBkZW11eGVyIGhhZCBhbiBlcnJvciB3aXRoIHRoZSBjb250ZW50JyxcbiAgICAxMzAyOiAnR2VuZXJhbCBlcnJvciBpZiBGbGFzaCByZW5kZXJlciBoYXMgYW4gZXJyb3InLFxuICAgIDEzMDM6ICdGbGFzaCBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IHJlc291cmNlcycsXG4gICAgMTMwNDogJ1RoZSB0cmFuc211eGVyIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZCcsXG4gICAgMTQwMDogJ05ldHdvcmsgZXJyb3Igd2hpbGUgZG93bmxvYWRpbmcnLFxuICAgIDE0MDE6ICdUaGUgbWFuaWZlc3QgZG93bmxvYWQgdGltZWQgb3V0JyxcbiAgICAxNDAyOiAnVGhlIHNlZ21lbnQgZG93bmxvYWQgdGltZWQgb3V0JyxcbiAgICAxNDAzOiAnVGhlIHByb2dyZXNzaXZlIHN0cmVhbSBkb3dubG9hZCB0aW1lZCBvdXQnLFxuICAgIDE0MDQ6ICdUaGUgQ2VydGlmaWNhdGUgY291bGQgbm90IGJlIGxvYWRlZCcsXG4gICAgMjAwMDogJ0dlbmVyYWwgRFJNIGVycm9yJyxcbiAgICAyMDAxOiAnUmVxdWlyZWQgRFJNIGNvbmZpZ3VyYXRpb24gaXMgbWlzc2luZycsXG4gICAgMjAwMjogJ1RoZSBsaWNlbnNpbmcgc2VydmVyIFVSTCBpcyBtaXNzaW5nJyxcbiAgICAyMDAzOiAnTGljZW5zZSByZXF1ZXN0IGZhaWxlZCcsXG4gICAgMjAwNDogJ0tleSBvciBLZXlJZCBpcyBtaXNzaW5nJyxcbiAgICAyMDA1OiAnS2V5IHNpemUgaXMgbm90IHN1cHBvcnRlZCcsXG4gICAgMjAwNjogJ1VuYWJsZSB0byBpbnN0YW50aWF0ZSBhIGtleSBzeXN0ZW0gc3VwcG9ydGluZyB0aGUgcmVxdWlyZWQgY29tYmluYXRpb25zJyxcbiAgICAyMDA3OiAnVW5hYmxlIHRvIGNyZWF0ZSBvciBpbml0aWFsaXplIGtleSBzZXNzaW9uJyxcbiAgICAyMDA4OiAnVGhlIE1lZGlhS2V5IG9iamVjdCBjb3VsZCBub3QgYmUgY3JlYXRlZC9pbml0aWFsaXplZCcsXG4gICAgMjAwOTogJ0tleSBlcnJvcicsXG4gICAgMjAxMDogJ1RoZSBrZXkgc3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQnLFxuICAgIDIwMTE6ICdUaGUgY2VydGlmaWNhdGUgaXMgbm90IHZhbGlkJyxcbiAgICAyMDEyOiAnSW52YWxpZCBoZWFkZXIga2V5L3ZhbHVlIHBhaXIgZm9yIFBsYXlSZWFkeSBsaWNlbnNlIHJlcXVlc3QnLFxuICAgIDIwMTM6ICdDb250ZW50IGNhbm5vdCBiZSBwbGF5ZWQgYmFjayBiZWNhdXNlIHRoZSBvdXRwdXQgaXMgcmVzdHJpY3RlZCBvbiB0aGlzIG1hY2hpbmUnLFxuICAgIDIwMTQ6ICdEUk0gZXJyb3IgZm9yIHRoZSBGbGFzaCByZW5kZXJlcicsXG4gICAgMjEwMDogJ0dlbmVyYWwgVlIgZXJyb3InLFxuICAgIDIxMDE6ICdQbGF5ZXIgdGVjaG5vbG9neSBub3QgY29tcGF0aWJsZSB3aXRoIFZSIHBsYXliYWNrJyxcbiAgICAzMDAwOiAnR2VuZXJhbCBtb2R1bGUgZXJyb3InLFxuICAgIDMwMDE6ICdUaGUgZGVmaW5pdGlvbiBvZiB0aGUgbW9kdWxlIGlzIGludmFsaWQgKGUuZy4gaW5jb21wbGV0ZSkuJyxcbiAgICAzMDAyOiAnVGhlIG1vZHVsZSBkZWZpbml0aW9uIHNwZWNpZmllcyBkZXBlbmRlbmNpZXMgYnV0IHRoZSBtb2R1bGUgaXMgbm90IHByb3ZpZGVkIHZpYSBhIGZ1bmN0aW9uIGZvciBkZWZlcnJlZCBsb2FkaW5nLicsXG4gICAgMzAwMzogJ0EgbW9kdWxlIGNhbm5vdCBiZSBsb2FkZWQgYmVjYXVzZSBpdCBoYXMgbm90IGJlZW4gYWRkZWQgdG8gdGhlIHBsYXllciBjb3JlLicsXG4gICAgMzAwNDogJ0EgbW9kdWxlIGNhbm5vdCBiZSBsb2FkZWQgYmVjYXVzZSBvbmUgb3IgbW9yZSBkZXBlbmRlbmNpZXMgYXJlIG1pc3NpbmcuJyxcbiAgICAzMTAwOiAnQW4gQWR2ZXJ0aXNpbmcgbW9kdWxlIGVycm9yIGhhcyBvY2N1cnJlZC4gUmVmZXIgdG8gdGhlIGF0dGFjaGVkIEFkdmVydGlzaW5nRXJyb3IuJyxcbiAgfTtcblxuICBleHBvcnQgY29uc3QgZGVmYXVsdE1vYmlsZVYzRXJyb3JNZXNzYWdlVHJhbnNsYXRvciA9IChlcnJvcjogTW9iaWxlVjNQbGF5ZXJFcnJvckV2ZW50IHwgTW9iaWxlVjNTb3VyY2VFcnJvckV2ZW50KSA9PiB7XG4gICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gIH07XG5cbiAgZXhwb3J0IGNvbnN0IGRlZmF1bHRXZWJFcnJvck1lc3NhZ2VUcmFuc2xhdG9yOiBFcnJvck1lc3NhZ2VUcmFuc2xhdG9yID0gKGVycm9yOiBFcnJvckV2ZW50KSA9PiB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gRXJyb3JVdGlscy5kZWZhdWx0RXJyb3JNZXNzYWdlc1tlcnJvci5jb2RlXTtcblxuICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgIC8vIFVzZSB0aGUgZXJyb3IgbWVzc2FnZSB0ZXh0IGlmIHRoZXJlIGlzIG9uZVxuICAgICAgcmV0dXJuIGAke2Vycm9yTWVzc2FnZX1cXG4oJHtlcnJvci5uYW1lfSlgOyAvLyBkZWZhdWx0IGVycm9yIG1lc3NhZ2Ugc3R5bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZXJyb3IgY29kZS9uYW1lIGlmIG5vIG1lc3NhZ2UgaXMgZGVmaW5lZFxuICAgICAgcmV0dXJuIGAke2Vycm9yLmNvZGV9ICR7ZXJyb3IubmFtZX1gO1xuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7QXJyYXlVdGlsc30gZnJvbSAnLi9hcnJheXV0aWxzJztcbmltcG9ydCB7IFRpbWVvdXQgfSBmcm9tICcuL3RpbWVvdXQnO1xuLyoqXG4gKiBGdW5jdGlvbiBpbnRlcmZhY2UgZm9yIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUge0BsaW5rIEV2ZW50RGlzcGF0Y2hlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+IHtcbiAgKHNlbmRlcjogU2VuZGVyLCBhcmdzOiBBcmdzKTogdm9pZDtcbn1cblxuLyoqXG4gKiBFbXB0eSB0eXBlIGZvciBjcmVhdGluZyB7QGxpbmsgRXZlbnREaXNwYXRjaGVyIGV2ZW50IGRpc3BhdGNoZXJzfSB0aGF0IGRvIG5vdCBjYXJyeSBhbnkgYXJndW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vQXJncyB7XG59XG5cbi8qKlxuICogRXZlbnQgYXJncyBmb3IgYW4gZXZlbnQgdGhhdCBjYW4gYmUgY2FuY2VsZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsRXZlbnRBcmdzIGV4dGVuZHMgTm9BcmdzIHtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIGZsYWcgd2hldGhlciB0aGUgZXZlbnQgc2hvdWxkIGJlIGNhbmNlbGVkLlxuICAgKi9cbiAgY2FuY2VsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQdWJsaWMgaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cyBhbiBldmVudC4gQ2FuIGJlIHVzZWQgdG8gc3Vic2NyaWJlIHRvIGFuZCB1bnN1YnNjcmliZSBmcm9tIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmVudDxTZW5kZXIsIEFyZ3M+IHtcbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBldmVudCBkaXNwYXRjaGVyLlxuICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKi9cbiAgc3Vic2NyaWJlKGxpc3RlbmVyOiBFdmVudExpc3RlbmVyPFNlbmRlciwgQXJncz4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgZXZlbnQgZGlzcGF0Y2hlciB0aGF0IGlzIG9ubHkgY2FsbGVkIG9uY2UuXG4gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqL1xuICBzdWJzY3JpYmVPbmNlKGxpc3RlbmVyOiBFdmVudExpc3RlbmVyPFNlbmRlciwgQXJncz4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgZXZlbnQgZGlzcGF0Y2hlciB0aGF0IHdpbGwgYmUgY2FsbGVkIGF0IGEgbGltaXRlZCByYXRlIHdpdGggYSBtaW5pbXVtXG4gICAqIGludGVydmFsIG9mIHRoZSBzcGVjaWZpZWQgbWlsbGlzZWNvbmRzLlxuICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0gcmF0ZU1zIHRoZSByYXRlIGluIG1pbGxpc2Vjb25kcyB0byB3aGljaCBjYWxsaW5nIG9mIHRoZSBsaXN0ZW5lcnMgc2hvdWxkIGJlIGxpbWl0ZWRcbiAgICovXG4gIHN1YnNjcmliZVJhdGVMaW1pdGVkKGxpc3RlbmVyOiBFdmVudExpc3RlbmVyPFNlbmRlciwgQXJncz4sIHJhdGVNczogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGEgc3Vic2NyaWJlZCBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgZGlzcGF0Y2hlci5cbiAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGxpc3RlbmVyIHdhcyBzdWNjZXNzZnVsbHkgdW5zdWJzY3JpYmVkLCBmYWxzZSBpZiBpdCBpc24ndCBzdWJzY3JpYmVkIG9uIHRoaXNcbiAgICogICBkaXNwYXRjaGVyXG4gICAqL1xuICB1bnN1YnNjcmliZShsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+KTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFdmVudCBkaXNwYXRjaGVyIHRvIHN1YnNjcmliZSBhbmQgdHJpZ2dlciBldmVudHMuIEVhY2ggZXZlbnQgc2hvdWxkIGhhdmUgaXRzIG93biBkaXNwYXRjaGVyLlxuICovXG5leHBvcnQgY2xhc3MgRXZlbnREaXNwYXRjaGVyPFNlbmRlciwgQXJncz4gaW1wbGVtZW50cyBFdmVudDxTZW5kZXIsIEFyZ3M+IHtcblxuICBwcml2YXRlIGxpc3RlbmVyczogRXZlbnRMaXN0ZW5lcldyYXBwZXI8U2VuZGVyLCBBcmdzPltdID0gW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gIH1cblxuICAvKipcbiAgICoge0Bpbmhlcml0RG9jfVxuICAgKi9cbiAgc3Vic2NyaWJlKGxpc3RlbmVyOiBFdmVudExpc3RlbmVyPFNlbmRlciwgQXJncz4pIHtcbiAgICB0aGlzLmxpc3RlbmVycy5wdXNoKG5ldyBFdmVudExpc3RlbmVyV3JhcHBlcihsaXN0ZW5lcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAaW5oZXJpdERvY31cbiAgICovXG4gIHN1YnNjcmliZU9uY2UobGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI8U2VuZGVyLCBBcmdzPikge1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobmV3IEV2ZW50TGlzdGVuZXJXcmFwcGVyKGxpc3RlbmVyLCB0cnVlKSk7XG4gIH1cblxuICAvKipcbiAgICoge0Bpbmhlcml0RG9jfVxuICAgKi9cbiAgc3Vic2NyaWJlUmF0ZUxpbWl0ZWQobGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI8U2VuZGVyLCBBcmdzPiwgcmF0ZU1zOiBudW1iZXIpIHtcbiAgICB0aGlzLmxpc3RlbmVycy5wdXNoKG5ldyBSYXRlTGltaXRlZEV2ZW50TGlzdGVuZXJXcmFwcGVyKGxpc3RlbmVyLCByYXRlTXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGluaGVyaXREb2N9XG4gICAqL1xuICB1bnN1YnNjcmliZShsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+KTogYm9vbGVhbiB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGxpc3RlbmVycywgY29tcGFyZSB3aXRoIHBhcmFtZXRlciwgYW5kIHJlbW92ZSBpZiBmb3VuZFxuICAgIC8vIE5PVEU6IEluIGNhc2Ugd2UgZXZlciByZW1vdmUgYWxsIG1hdGNoaW5nIGxpc3RlbmVycyBpbnN0ZWFkIG9mIGp1c3QgdGhlIGZpcnN0LCB3ZSBuZWVkIHRvIHJldmVyc2UtaXRlcmF0ZSBoZXJlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHN1YnNjcmliZWRMaXN0ZW5lciA9IHRoaXMubGlzdGVuZXJzW2ldO1xuICAgICAgaWYgKHN1YnNjcmliZWRMaXN0ZW5lci5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgc3Vic2NyaWJlZExpc3RlbmVyLmNsZWFyKCk7XG4gICAgICAgIEFycmF5VXRpbHMucmVtb3ZlKHRoaXMubGlzdGVuZXJzLCBzdWJzY3JpYmVkTGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgbGlzdGVuZXJzIGZyb20gdGhpcyBkaXNwYXRjaGVyLlxuICAgKi9cbiAgdW5zdWJzY3JpYmVBbGwoKTogdm9pZCB7XG4gICAgLy8gSW4gY2FzZSBvZiBSYXRlTGltaXRlZEV2ZW50TGlzdGVuZXJXcmFwcGVyIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRpbWVvdXQgY2FsbGJhY2sgd29uJ3QgYmUgY2FsbGVkXG4gICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IHRvIGFsbCBzdWJzY3JpYmVkIGxpc3RlbmVycy5cbiAgICogQHBhcmFtIHNlbmRlciB0aGUgc291cmNlIG9mIHRoZSBldmVudFxuICAgKiBAcGFyYW0gYXJncyB0aGUgYXJndW1lbnRzIGZvciB0aGUgZXZlbnRcbiAgICovXG4gIGRpc3BhdGNoKHNlbmRlcjogU2VuZGVyLCBhcmdzOiBBcmdzID0gbnVsbCkge1xuICAgIGxldCBsaXN0ZW5lcnNUb1JlbW92ZSA9IFtdO1xuXG4gICAgLy8gQ2FsbCBldmVyeSBsaXN0ZW5lclxuICAgIC8vIFdlIGl0ZXJhdGUgb3ZlciBhIGNvcHkgb2YgdGhlIGFycmF5IG9mIGxpc3RlbmVycyB0byBhdm9pZCB0aGUgY2FzZSB3aGVyZSBldmVudHMgYXJlIG5vdCBmaXJlZCBvbiBsaXN0ZW5lcnMgd2hlblxuICAgIC8vIGxpc3RlbmVycyBhcmUgdW5zdWJzY3JpYmVkIGZyb20gd2l0aGluIHRoZSBldmVudCBoYW5kbGVycyBkdXJpbmcgYSBkaXNwYXRjaCAoYmVjYXVzZSB0aGUgaW5kaWNlcyBjaGFuZ2UgYW5kXG4gICAgLy8gbGlzdGVuZXJzIGFyZSBzaGlmdGVkIHdpdGhpbiB0aGUgYXJyYXkpLlxuICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBsaXN0ZW5lciB4KzEgd2lsbCBzdGlsbCBiZSBjYWxsZWQgaWYgdW5zdWJzY3JpYmVkIGZyb20gd2l0aGluIHRoZSBoYW5kbGVyIG9mIGxpc3RlbmVyIHgsIGFzIHdlbGxcbiAgICAvLyBhcyBsaXN0ZW5lciB5KzEgd2lsbCBub3QgYmUgY2FsbGVkIHdoZW4gc3Vic2NyaWJlZCBmcm9tIHdpdGhpbiB0aGUgaGFuZGxlciBvZiBsaXN0ZW5lciB5LlxuICAgIC8vIEFycmF5LnNsaWNlKDApIGlzIHRoZSBmYXN0ZXN0IGFycmF5IGNvcHkgbWV0aG9kIGFjY29yZGluZyB0bzogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIxNTE0MjU0LzM3MDI1MlxuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLnNsaWNlKDApO1xuICAgIGZvciAobGV0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIuZmlyZShzZW5kZXIsIGFyZ3MpO1xuXG4gICAgICBpZiAobGlzdGVuZXIuaXNPbmNlKCkpIHtcbiAgICAgICAgbGlzdGVuZXJzVG9SZW1vdmUucHVzaChsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVyXG4gICAgZm9yIChsZXQgbGlzdGVuZXJUb1JlbW92ZSBvZiBsaXN0ZW5lcnNUb1JlbW92ZSkge1xuICAgICAgQXJyYXlVdGlscy5yZW1vdmUodGhpcy5saXN0ZW5lcnMsIGxpc3RlbmVyVG9SZW1vdmUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBldmVudCB0aGF0IHRoaXMgZGlzcGF0Y2hlciBtYW5hZ2VzIGFuZCBvbiB3aGljaCBsaXN0ZW5lcnMgY2FuIHN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgZXZlbnQgaGFuZGxlcnMuXG4gICAqIEByZXR1cm5zIHtFdmVudH1cbiAgICovXG4gIGdldEV2ZW50KCk6IEV2ZW50PFNlbmRlciwgQXJncz4ge1xuICAgIC8vIEZvciBub3csIGp1c3QgY2FzdCB0aGUgZXZlbnQgZGlzcGF0Y2hlciB0byB0aGUgZXZlbnQgaW50ZXJmYWNlLiBBdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgd2hlbiB0aGVcbiAgICAvLyBjb2RlYmFzZSBncm93cywgaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBzcGxpdCB0aGUgZGlzcGF0Y2hlciBpbnRvIHNlcGFyYXRlIGRpc3BhdGNoZXIgYW5kIGV2ZW50IGNsYXNzZXMuXG4gICAgcmV0dXJuIDxFdmVudDxTZW5kZXIsIEFyZ3M+PnRoaXM7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGJhc2ljIGV2ZW50IGxpc3RlbmVyIHdyYXBwZXIgdG8gbWFuYWdlIGxpc3RlbmVycyB3aXRoaW4gdGhlIHtAbGluayBFdmVudERpc3BhdGNoZXJ9LiBUaGlzIGlzIGEgJ3ByaXZhdGUnIGNsYXNzXG4gKiBmb3IgaW50ZXJuYWwgZGlzcGF0Y2hlciB1c2UgYW5kIGl0IGlzIHRoZXJlZm9yZSBub3QgZXhwb3J0ZWQuXG4gKi9cbmNsYXNzIEV2ZW50TGlzdGVuZXJXcmFwcGVyPFNlbmRlciwgQXJncz4ge1xuXG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+O1xuICBwcml2YXRlIG9uY2U6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IobGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI8U2VuZGVyLCBBcmdzPiwgb25jZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdGhpcy5ldmVudExpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgdGhpcy5vbmNlID0gb25jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3cmFwcGVkIGV2ZW50IGxpc3RlbmVyLlxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+fVxuICAgKi9cbiAgZ2V0IGxpc3RlbmVyKCk6IEV2ZW50TGlzdGVuZXI8U2VuZGVyLCBBcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRMaXN0ZW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgd3JhcHBlZCBldmVudCBsaXN0ZW5lciB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSBzZW5kZXJcbiAgICogQHBhcmFtIGFyZ3NcbiAgICovXG4gIGZpcmUoc2VuZGVyOiBTZW5kZXIsIGFyZ3M6IEFyZ3MpIHtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXIoc2VuZGVyLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhpcyBsaXN0ZW5lciBpcyBzY2hlZHVsZWQgdG8gYmUgY2FsbGVkIG9ubHkgb25jZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IG9uY2UgaWYgdHJ1ZVxuICAgKi9cbiAgaXNPbmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9uY2U7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgfVxufVxuXG5pbnRlcmZhY2UgRXZlbnRBdHRyaWJ1dGVzPFNlbmRlciwgQXJncz4ge1xuICBzZW5kZXI6IFNlbmRlcjtcbiAgYXJnczogQXJncztcbn1cblxuLyoqXG4gKiBFeHRlbmRzIHRoZSBiYXNpYyB7QGxpbmsgRXZlbnRMaXN0ZW5lcldyYXBwZXJ9IHdpdGggcmF0ZS1saW1pdGluZyBmdW5jdGlvbmFsaXR5LlxuICovXG5jbGFzcyBSYXRlTGltaXRlZEV2ZW50TGlzdGVuZXJXcmFwcGVyPFNlbmRlciwgQXJncz4gZXh0ZW5kcyBFdmVudExpc3RlbmVyV3JhcHBlcjxTZW5kZXIsIEFyZ3M+IHtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJhdGVNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJhdGVMaW1pdGluZ0V2ZW50TGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI8U2VuZGVyLCBBcmdzPjtcblxuICAvLyBzYXZlIGxhc3Qgc2VlbiBldmVudCBhdHRyaWJ1dGVzXG4gIHByaXZhdGUgbGFzdFNlZW5FdmVudDogRXZlbnRBdHRyaWJ1dGVzPFNlbmRlciwgQXJncz47XG5cbiAgcHJpdmF0ZSByYXRlTGltaXRUaW1vdXQ6IFRpbWVvdXQ7XG5cbiAgY29uc3RydWN0b3IobGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI8U2VuZGVyLCBBcmdzPiwgcmF0ZU1zOiBudW1iZXIpIHtcbiAgICBzdXBlcihsaXN0ZW5lcik7IC8vIHNldHMgdGhlIGV2ZW50IGxpc3RlbmVyIHNpbmtcblxuICAgIHRoaXMucmF0ZU1zID0gcmF0ZU1zO1xuXG4gICAgLy8gc3RhcnRpbmcgbGltaXRpbmcgdGhlIGV2ZW50cyB0byB0aGUgZ2l2ZW4gdmFsdWVcbiAgICBjb25zdCBzdGFydFJhdGVMaW1pdGluZyA9ICgpID0+IHtcbiAgICAgIHRoaXMucmF0ZUxpbWl0VGltb3V0LnN0YXJ0KCk7XG4gICAgfTtcblxuICAgIC8vIHRpbW91dCBmb3IgbGltaXRpbmcgdGhlIGV2ZW50c1xuICAgIHRoaXMucmF0ZUxpbWl0VGltb3V0ID0gbmV3IFRpbWVvdXQodGhpcy5yYXRlTXMsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmxhc3RTZWVuRXZlbnQpIHtcbiAgICAgICAgdGhpcy5maXJlU3VwZXIodGhpcy5sYXN0U2VlbkV2ZW50LnNlbmRlciwgdGhpcy5sYXN0U2VlbkV2ZW50LmFyZ3MpO1xuICAgICAgICBzdGFydFJhdGVMaW1pdGluZygpOyAvLyBzdGFydCByYXRlTGltaXRpbmcgYWdhaW4gdG8ga2VlcCByYXRlIGxpbWl0IGFjdGl2ZSBldmVuIGFmdGVyIGZpcmluZyB0aGUgbGFzdCBzZWVuIGV2ZW50XG4gICAgICAgIHRoaXMubGFzdFNlZW5FdmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSBldmVudHMgc3RvcHBpbmcgZHVyaW5nIHRoZSByYXRlTGltaXRpbmcgd2UgbmVlZCB0byB0cmFjayB0aGUgbGFzdCBzZWVuIG9uZSBhbmQgZGVsZWdhdGUgYWZ0ZXIgdGhlXG4gICAgLy8gcmF0ZSBsaW1pdGluZyBpcyBmaW5pc2hlZC4gVGhpcyBwcmV2ZW50cyBtaXNzaW5nIHRoZSBsYXN0IHVwZGF0ZSBkdWUgdG8gdGhlIHJhdGUgbGltaXQuXG4gICAgdGhpcy5yYXRlTGltaXRpbmdFdmVudExpc3RlbmVyID0gKHNlbmRlcjogU2VuZGVyLCBhcmdzOiBBcmdzKSA9PiB7XG4gICAgICAvLyBvbmx5IGZpcmUgZXZlbnRzIGlmIHRoZSByYXRlTGltaXRpbmcgaXMgbm90IHJ1bm5pbmdcbiAgICAgIGlmICh0aGlzLnNob3VsZEZpcmVFdmVudCgpKSB7XG4gICAgICAgIHRoaXMuZmlyZVN1cGVyKHNlbmRlciwgYXJncyk7XG4gICAgICAgIHN0YXJ0UmF0ZUxpbWl0aW5nKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sYXN0U2VlbkV2ZW50ID0ge1xuICAgICAgICBzZW5kZXI6IHNlbmRlcixcbiAgICAgICAgYXJnczogYXJncyxcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkRmlyZUV2ZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5yYXRlTGltaXRUaW1vdXQuaXNBY3RpdmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlyZVN1cGVyKHNlbmRlcjogU2VuZGVyLCBhcmdzOiBBcmdzKSB7XG4gICAgLy8gRmlyZSB0aGUgYWN0dWFsIGV4dGVybmFsIGV2ZW50IGxpc3RlbmVyXG4gICAgc3VwZXIuZmlyZShzZW5kZXIsIGFyZ3MpO1xuICB9XG5cbiAgZmlyZShzZW5kZXI6IFNlbmRlciwgYXJnczogQXJncykge1xuICAgIC8vIEZpcmUgdGhlIGludGVybmFsIHJhdGUtbGltaXRpbmcgbGlzdGVuZXIgaW5zdGVhZCBvZiB0aGUgZXh0ZXJuYWwgZXZlbnQgbGlzdGVuZXJcbiAgICB0aGlzLnJhdGVMaW1pdGluZ0V2ZW50TGlzdGVuZXIoc2VuZGVyLCBhcmdzKTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHN1cGVyLmNsZWFyKCk7XG4gICAgdGhpcy5yYXRlTGltaXRUaW1vdXQuY2xlYXIoKTtcbiAgfVxufVxuIiwiY29uc3QgRm9jdXNWaXNpYmxlQ3NzQ2xhc3NOYW1lID0gJ3t7UFJFRklYfX0tZm9jdXMtdmlzaWJsZSc7XG5cbmV4cG9ydCBjbGFzcyBGb2N1c1Zpc2liaWxpdHlUcmFja2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEhhbmRsZXJNYXA6IHsgW2V2ZW50TmFtZTogc3RyaW5nXTogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCB9O1xuICBwcml2YXRlIGxhc3RJbnRlcmFjdGlvbldhc0tleWJvYXJkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJpdG1vdmluVWlQcmVmaXg6IHN0cmluZykge1xuICAgIHRoaXMuZXZlbnRIYW5kbGVyTWFwID0ge1xuICAgICAgbW91c2Vkb3duOiB0aGlzLm9uTW91c2VPclBvaW50ZXJPclRvdWNoLFxuICAgICAgcG9pbnRlcmRvd246IHRoaXMub25Nb3VzZU9yUG9pbnRlck9yVG91Y2gsXG4gICAgICB0b3VjaHN0YXJ0OiB0aGlzLm9uTW91c2VPclBvaW50ZXJPclRvdWNoLFxuICAgICAga2V5ZG93bjogdGhpcy5vbktleURvd24sXG4gICAgICBmb2N1czogdGhpcy5vbkZvY3VzLFxuICAgICAgYmx1cjogdGhpcy5vbkJsdXIsXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25LZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZS5tZXRhS2V5IHx8IGUuYWx0S2V5IHx8IGUuY3RybEtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubGFzdEludGVyYWN0aW9uV2FzS2V5Ym9hcmQgPSB0cnVlO1xuICB9O1xuXG4gIHByaXZhdGUgb25Nb3VzZU9yUG9pbnRlck9yVG91Y2ggPSAoKSA9PiAodGhpcy5sYXN0SW50ZXJhY3Rpb25XYXNLZXlib2FyZCA9IGZhbHNlKTtcblxuICBwcml2YXRlIG9uRm9jdXMgPSAoeyB0YXJnZXQ6IGVsZW1lbnQgfTogRm9jdXNFdmVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMubGFzdEludGVyYWN0aW9uV2FzS2V5Ym9hcmQgJiZcbiAgICAgIGlzSHRtbEVsZW1lbnQoZWxlbWVudCkgJiZcbiAgICAgIGlzQml0bW92aW5VaShlbGVtZW50LCB0aGlzLmJpdG1vdmluVWlQcmVmaXgpICYmXG4gICAgICAhZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoRm9jdXNWaXNpYmxlQ3NzQ2xhc3NOYW1lKVxuICAgICkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKEZvY3VzVmlzaWJsZUNzc0NsYXNzTmFtZSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgb25CbHVyID0gKHsgdGFyZ2V0OiBlbGVtZW50IH06IEZvY3VzRXZlbnQpID0+IHtcbiAgICBpZiAoaXNIdG1sRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKEZvY3VzVmlzaWJsZUNzc0NsYXNzTmFtZSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgcmVnaXN0ZXJFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuZXZlbnRIYW5kbGVyTWFwKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCB0aGlzLmV2ZW50SGFuZGxlck1hcFtldmVudF0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5yZWdpc3RlckV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5ldmVudEhhbmRsZXJNYXApIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIHRoaXMuZXZlbnRIYW5kbGVyTWFwW2V2ZW50XSwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgdGhpcy51bnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0JpdG1vdmluVWkoZWxlbWVudDogRWxlbWVudCwgYml0bW92aW5VaVByZWZpeDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50LmlkLmluZGV4T2YoYml0bW92aW5VaVByZWZpeCkgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGlzSHRtbEVsZW1lbnQoZWxlbWVudDogdW5rbm93bik6IGVsZW1lbnQgaXMgSFRNTEVsZW1lbnQgJiB7IGNsYXNzTGlzdDogRE9NVG9rZW5MaXN0IH0ge1xuICByZXR1cm4gKFxuICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlbGVtZW50LmNsYXNzTGlzdCBpbnN0YW5jZW9mIERPTVRva2VuTGlzdFxuICApO1xufVxuIiwiZXhwb3J0IG5hbWVzcGFjZSBHdWlkIHtcblxuICBsZXQgZ3VpZCA9IDE7XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgcmV0dXJuIGd1aWQrKztcbiAgfVxufVxuIiwiaW1wb3J0IHtET019IGZyb20gJy4vZG9tJztcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUxvYWRlZENhbGxiYWNrIHtcbiAgKHVybDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJbWFnZUxvYWRlclN0YXRlIHtcbiAgdXJsOiBzdHJpbmc7XG4gIGltYWdlOiBET007XG4gIGxvYWRlZENhbGxiYWNrOiBJbWFnZUxvYWRlZENhbGxiYWNrO1xuICBsb2FkZWQ6IGJvb2xlYW47XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRyYWNrcyB0aGUgbG9hZGluZyBzdGF0ZSBvZiBpbWFnZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbWFnZUxvYWRlciB7XG5cbiAgcHJpdmF0ZSBzdGF0ZTogeyBbdXJsOiBzdHJpbmddOiBJbWFnZUxvYWRlclN0YXRlOyB9ID0ge307XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuIGltYWdlIGFuZCBjYWxsIHRoZSBjYWxsYmFjayBvbmNlIHRoZSBpbWFnZSBpcyBsb2FkZWQuIElmIHRoZSBpbWFnZSBpcyBhbHJlYWR5IGxvYWRlZCwgdGhlIGNhbGxiYWNrXG4gICAqIGlzIGNhbGxlZCBpbW1lZGlhdGVseSwgZWxzZSBpdCBpcyBjYWxsZWQgb25jZSBsb2FkaW5nIGhhcyBmaW5pc2hlZC4gQ2FsbGluZyB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlXG4gICAqIHNhbWUgaW1hZ2Ugd2hpbGUgaXQgaXMgbG9hZGluZyBjYWxscyBvbmx5IGxldCBjYWxsYmFjayBwYXNzZWQgaW50byB0aGUgbGFzdCBjYWxsLlxuICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwgdG8gdGhlIGltYWdlIHRvIGxvYWRcbiAgICogQHBhcmFtIGxvYWRlZENhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBpbWFnZSBpcyBsb2FkZWRcbiAgICovXG4gIGxvYWQodXJsOiBzdHJpbmcsIGxvYWRlZENhbGxiYWNrOiBJbWFnZUxvYWRlZENhbGxiYWNrKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0YXRlW3VybF0pIHtcbiAgICAgIC8vIFdoZW4gdGhlIGltYWdlIHdhcyBuZXZlciBhdHRlbXB0ZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSwgd2UgY3JlYXRlIGEgc3RhdGUgYW5kIHN0b3JlIGl0IGluIHRoZSBzdGF0ZSBtYXBcbiAgICAgIC8vIGZvciBsYXRlciB1c2Ugd2hlbiB0aGUgc2FtZSBpbWFnZSBpcyByZXF1ZXN0ZWQgdG8gYmUgbG9hZGVkIGFnYWluLlxuICAgICAgbGV0IHN0YXRlOiBJbWFnZUxvYWRlclN0YXRlID0ge1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgaW1hZ2U6IG5ldyBET00oJ2ltZycsIHt9KSxcbiAgICAgICAgbG9hZGVkQ2FsbGJhY2s6IGxvYWRlZENhbGxiYWNrLFxuICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgfTtcbiAgICAgIHRoaXMuc3RhdGVbdXJsXSA9IHN0YXRlO1xuXG4gICAgICAvLyBMaXN0ZW4gdG8gdGhlIGxvYWQgZXZlbnQsIHVwZGF0ZSB0aGUgc3RhdGUgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgdGhlIGltYWdlIGlzIGxvYWRlZFxuICAgICAgc3RhdGUuaW1hZ2Uub24oJ2xvYWQnLCAoZSkgPT4ge1xuICAgICAgICBzdGF0ZS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICBzdGF0ZS53aWR0aCA9ICg8SFRNTEltYWdlRWxlbWVudD5zdGF0ZS5pbWFnZS5nZXQoMCkpLndpZHRoO1xuICAgICAgICBzdGF0ZS5oZWlnaHQgPSAoPEhUTUxJbWFnZUVsZW1lbnQ+c3RhdGUuaW1hZ2UuZ2V0KDApKS5oZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5jYWxsTG9hZGVkQ2FsbGJhY2soc3RhdGUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCB0aGUgaW1hZ2UgVVJMIHRvIHN0YXJ0IHRoZSBsb2FkaW5nXG4gICAgICBzdGF0ZS5pbWFnZS5hdHRyKCdzcmMnLCBzdGF0ZS51cmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBoYXZlIGEgc3RhdGUgZm9yIHRoZSByZXF1ZXN0ZWQgaW1hZ2UsIHNvIGl0IGlzIGVpdGhlciBhbHJlYWR5IGxvYWRlZCBvciBjdXJyZW50bHkgbG9hZGluZ1xuICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZVt1cmxdO1xuXG4gICAgICAvLyBXZSBvdmVyd3JpdGUgdGhlIGNhbGxiYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG9ubHkgdGhlIGNhbGxiYWNrIG9mIHRoZSBsYXRlc3QgY2FsbCBnZXRzIGV4ZWN1dGVkLlxuICAgICAgLy8gRWFybGllciBjYWxsYmFja3MgYmVjb21lIGludmFsaWQgb25jZSBhIG5ldyBsb2FkIGNhbGwgYXJyaXZlcywgYW5kIHRoZXkgYXJlIG5vdCBjYWxsZWQgYXMgbG9uZyBhcyB0aGUgaW1hZ2VcbiAgICAgIC8vIGlzIG5vdCBsb2FkZWQuXG4gICAgICBzdGF0ZS5sb2FkZWRDYWxsYmFjayA9IGxvYWRlZENhbGxiYWNrO1xuXG4gICAgICAvLyBXaGVuIHRoZSBpbWFnZSBpcyBhbHJlYWR5IGxvYWRlZCwgd2UgZGlyZWN0bHkgZXhlY3V0ZSB0aGUgY2FsbGJhY2sgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgbG9hZCBldmVudFxuICAgICAgaWYgKHN0YXRlLmxvYWRlZCkge1xuICAgICAgICB0aGlzLmNhbGxMb2FkZWRDYWxsYmFjayhzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxsTG9hZGVkQ2FsbGJhY2soc3RhdGU6IEltYWdlTG9hZGVyU3RhdGUpOiB2b2lkIHtcbiAgICBzdGF0ZS5sb2FkZWRDYWxsYmFjayhzdGF0ZS51cmwsIHN0YXRlLndpZHRoLCBzdGF0ZS5oZWlnaHQpO1xuICB9XG59XG4iLCJpbXBvcnQgdm9jYWJ1bGFyeURlIGZyb20gJy4vbGFuZ3VhZ2VzL2RlLmpzb24nO1xuaW1wb3J0IHZvY2FidWxhcnlFbiBmcm9tICcuL2xhbmd1YWdlcy9lbi5qc29uJztcbmltcG9ydCB7IExvY2FsaXphdGlvbkNvbmZpZyB9IGZyb20gJy4uL3VpbWFuYWdlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Vm9jYWJ1bGFyaWVzOiBWb2NhYnVsYXJpZXMgPSB7XG4gICdlbic6IHZvY2FidWxhcnlFbixcbiAgJ2RlJzogdm9jYWJ1bGFyeURlLFxufTtcblxuY29uc3QgZGVmYXVsdExvY2FsaXphdGlvbkNvbmZpZzogTG9jYWxpemF0aW9uQ29uZmlnID0ge1xuICBsYW5ndWFnZTogJ2VuJyxcbiAgdm9jYWJ1bGFyaWVzOiBkZWZhdWx0Vm9jYWJ1bGFyaWVzLFxufTtcblxudHlwZSBMb2NhbGl6ZXIgPSAoKSA9PiBzdHJpbmc7XG5leHBvcnQgdHlwZSBMb2NhbGl6YWJsZVRleHQgPSBzdHJpbmcgfCBMb2NhbGl6ZXI7XG5cbmludGVyZmFjZSBWb2NhYnVsYXJ5IHtcbiAgJ3NldHRpbmdzLnZpZGVvLnF1YWxpdHknOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5hdWRpby5xdWFsaXR5Jzogc3RyaW5nO1xuICAnc2V0dGluZ3MuYXVkaW8udHJhY2snOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5hdWRpby5tdXRlJzogc3RyaW5nO1xuICAnc2V0dGluZ3MuYXVkaW8udm9sdW1lJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuY29sb3InOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5vcGFjaXR5Jzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmJhY2tncm91bmQuY29sb3InOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuYmFja2dyb3VuZC5vcGFjaXR5Jzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuc2l6ZSc6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5jaGFyYWN0ZXJFZGdlJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UucmFpc2VkJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UuZGVwcmVzc2VkJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UudW5pZm9ybSc6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5jaGFyYWN0ZXJFZGdlLmRyb3BzaGFkb3dlZCc6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseSc6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5tb25vc3BhY2Vkc2VyaWYnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkucHJvcG9ydGlvbmFsc2VyaWYnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkubW9ub3NwYWNlZHNhbnNzZXJpZic6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5wcm9wb3J0aW9uYWxzYW5zc2VyaWYnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkuY2FzdWFsJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5LmN1cnNpdmUnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkuc21hbGxjYXBpdGFsJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLndpbmRvdy5jb2xvcic6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy53aW5kb3cub3BhY2l0eSc6IHN0cmluZztcbiAgJ3BsYXknOiBzdHJpbmc7XG4gICdzZXR0aW5ncy50aW1lLmhvdXJzJzogc3RyaW5nO1xuICAnc2V0dGluZ3MudGltZS5taW51dGVzJzogc3RyaW5nO1xuICAnc2V0dGluZ3MudGltZS5zZWNvbmRzJzogc3RyaW5nO1xuICAnY29sb3JzLndoaXRlJzogc3RyaW5nO1xuICAnY29sb3JzLmJsYWNrJzogc3RyaW5nO1xuICAnY29sb3JzLnJlZCc6IHN0cmluZztcbiAgJ2NvbG9ycy5ncmVlbic6IHN0cmluZztcbiAgJ2NvbG9ycy5ibHVlJzogc3RyaW5nO1xuICAnY29sb3JzLmN5YW4nOiBzdHJpbmc7XG4gICdjb2xvcnMueWVsbG93Jzogc3RyaW5nO1xuICAnY29sb3JzLm1hZ2VudGEnOiBzdHJpbmc7XG4gICdwZXJjZW50Jzogc3RyaW5nO1xuICAnc2V0dGluZ3MnOiBzdHJpbmc7XG4gICdhZHMucmVtYWluaW5nVGltZSc6IHN0cmluZztcbiAgJ3BpY3R1cmVJblBpY3R1cmUnOiBzdHJpbmc7XG4gICdhcHBsZUFpcnBsYXknOiBzdHJpbmc7XG4gICdnb29nbGVDYXN0Jzogc3RyaW5nO1xuICAndnInOiBzdHJpbmc7XG4gICdvZmYnOiBzdHJpbmc7XG4gICdhdXRvJzogc3RyaW5nO1xuICAnYmFjayc6IHN0cmluZztcbiAgJ3Jlc2V0Jzogc3RyaW5nO1xuICAncmVwbGF5Jzogc3RyaW5nO1xuICAnbm9ybWFsJzogc3RyaW5nO1xuICAnZGVmYXVsdCc6IHN0cmluZztcbiAgJ29wZW4nOiBzdHJpbmc7XG4gICdjbG9zZSc6IHN0cmluZztcbiAgJ2Z1bGxzY3JlZW4nOiBzdHJpbmc7XG4gICdzcGVlZCc6IHN0cmluZztcbiAgJ3BsYXlQYXVzZSc6IHN0cmluZztcbiAgJ2xpdmUnOiBzdHJpbmc7XG4gICdzdWJ0aXRsZS5leGFtcGxlJzogc3RyaW5nO1xuICAnc3VidGl0bGUuc2VsZWN0Jzogc3RyaW5nO1xuICAncGxheWluZ09uJzogc3RyaW5nO1xuICAnY29ubmVjdGluZ1RvJzogc3RyaW5nO1xuICAnd2F0ZXJtYXJrTGluayc6IHN0cmluZztcbiAgJ2NvbnRyb2xCYXInOiBzdHJpbmc7XG4gICdwbGF5ZXInOiBzdHJpbmc7XG4gICdzZWVrQmFyJzogc3RyaW5nO1xuICAnc2Vla0Jhci52YWx1ZSc6IHN0cmluZztcbiAgJ3NlZWtCYXIudGltZXNoaWZ0Jzogc3RyaW5nO1xuICAnc2Vla0Jhci5kdXJhdGlvblRleHQnOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIEN1c3RvbVZvY2FidWxhcnk8Vj4gPSBWICYgUGFydGlhbDxWb2NhYnVsYXJ5PjtcblxuZXhwb3J0IGludGVyZmFjZSBWb2NhYnVsYXJpZXMge1xuICBba2V5OiBzdHJpbmddOiBDdXN0b21Wb2NhYnVsYXJ5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xufVxuXG5jbGFzcyBJMThuIHtcbiAgcHJpdmF0ZSBsYW5ndWFnZTogc3RyaW5nO1xuICBwcml2YXRlIHZvY2FidWxhcnk6IEN1c3RvbVZvY2FidWxhcnk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMb2NhbGl6YXRpb25Db25maWcpIHtcbiAgICB0aGlzLnNldENvbmZpZyhjb25maWcpO1xuICB9XG5cbiAgcHVibGljIHNldENvbmZpZyhjb25maWc6IExvY2FsaXphdGlvbkNvbmZpZykge1xuICAgIGNvbnN0IG1lcmdlZENvbmZpZyA9IHsgLi4uZGVmYXVsdExvY2FsaXphdGlvbkNvbmZpZywgLi4uY29uZmlnIH07XG4gICAgY29uc3QgZGV0ZWN0QnJvd3Nlckxhbmd1YWdlID0gbWVyZ2VkQ29uZmlnLmxhbmd1YWdlID09PSAnYXV0byc7XG4gICAgY29uc3Qgdm9jYWJ1bGFyaWVzID0gdGhpcy5tZXJnZVZvY2FidWxhcmllc1dpdGhEZWZhdWx0Vm9jYWJ1bGFyaWVzKG1lcmdlZENvbmZpZy52b2NhYnVsYXJpZXMpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUxhbmd1YWdlKG1lcmdlZENvbmZpZy5sYW5ndWFnZSwgZGV0ZWN0QnJvd3Nlckxhbmd1YWdlLCB2b2NhYnVsYXJpZXMpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVZvY2FidWxhcnkodm9jYWJ1bGFyaWVzKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvbnRhaW5zTGFuZ3VhZ2Uodm9jYWJ1bGFyaWVzOiBWb2NhYnVsYXJpZXMsIGxhbmd1YWdlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdm9jYWJ1bGFyaWVzLmhhc093blByb3BlcnR5KGxhbmd1YWdlKTtcbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VWb2NhYnVsYXJpZXNXaXRoRGVmYXVsdFZvY2FidWxhcmllcyh2b2NhYnVsYXJpZXM6IFZvY2FidWxhcmllcyA9IHt9KSB7XG4gICAgY29uc3QgcmF3Vm9jYWJ1bGFyaWVzOiBWb2NhYnVsYXJpZXMgPSB7IC4uLmRlZmF1bHRWb2NhYnVsYXJpZXMsIC4uLnZvY2FidWxhcmllcyB9O1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhyYXdWb2NhYnVsYXJpZXMpLnJlZHVjZSgobWVyZ2VkVm9jYWJ1bGFyaWVzLCBsYW5ndWFnZSkgPT4ge1xuICAgICAgbGV0IHZvY2FidWxhcnkgPSByYXdWb2NhYnVsYXJpZXNbbGFuZ3VhZ2VdO1xuICAgICAgaWYgKEkxOG4uY29udGFpbnNMYW5ndWFnZShkZWZhdWx0Vm9jYWJ1bGFyaWVzLCBsYW5ndWFnZSkgJiYgSTE4bi5jb250YWluc0xhbmd1YWdlKHZvY2FidWxhcmllcywgbGFuZ3VhZ2UpKSB7XG4gICAgICAgIHZvY2FidWxhcnkgPSB7IC4uLmRlZmF1bHRWb2NhYnVsYXJpZXNbbGFuZ3VhZ2VdLCAuLi52b2NhYnVsYXJpZXNbbGFuZ3VhZ2VdIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5tZXJnZWRWb2NhYnVsYXJpZXMsIFtsYW5ndWFnZV06IHZvY2FidWxhcnkgfTtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVMYW5ndWFnZShcbiAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgIGJyb3dzZXJMYW5ndWFnZURldGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgdm9jYWJ1bGFyaWVzOiBWb2NhYnVsYXJpZXMsXG4gICkge1xuICAgIGlmIChicm93c2VyTGFuZ3VhZ2VEZXRlY3Rpb25FbmFibGVkKSB7XG4gICAgICBjb25zdCB1c2VyTGFuZ3VhZ2UgPSB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlO1xuXG4gICAgICBpZiAoSTE4bi5jb250YWluc0xhbmd1YWdlKHZvY2FidWxhcmllcywgdXNlckxhbmd1YWdlKSkge1xuICAgICAgICB0aGlzLmxhbmd1YWdlID0gdXNlckxhbmd1YWdlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzaG9ydGVuZWRVc2VyTGFuZ3VhZ2UgPSB1c2VyTGFuZ3VhZ2Uuc2xpY2UoMCwgMik7XG4gICAgICBpZiAoSTE4bi5jb250YWluc0xhbmd1YWdlKHZvY2FidWxhcmllcywgc2hvcnRlbmVkVXNlckxhbmd1YWdlKSkge1xuICAgICAgICB0aGlzLmxhbmd1YWdlID0gc2hvcnRlbmVkVXNlckxhbmd1YWdlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVm9jYWJ1bGFyeSh2b2NhYnVsYXJpZXM6IFZvY2FidWxhcmllcykge1xuICAgIHRoaXMudm9jYWJ1bGFyeSA9IFsnZW4nLCB0aGlzLmxhbmd1YWdlXVxuICAgICAgLnJlZHVjZSgodm9jYWIsIGxhbmcpID0+ICh7IC4uLnZvY2FiLCAuLi4odm9jYWJ1bGFyaWVzW2xhbmddIHx8IHt9KSB9KSwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlVmFyaWFibGVXaXRoUGxhY2Vob2xkZXJJZkV4aXN0cyh0ZXh0OiBzdHJpbmcsIGNvbmZpZzogYW55KSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHRleHQubWF0Y2gobmV3IFJlZ0V4cCgne1thLXpBLVowLTldK30nLCAnZycpKTtcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVzXG4gICAgICAubWFwKChtOiBzdHJpbmcpID0+ICh7IG1hdGNoOiBtLCBrZXk6IG0uc2xpY2UoMSwgLTEpIH0pKVxuICAgICAgLnJlZHVjZSgoc3RyLCB7IGtleSwgbWF0Y2ggfSkgPT4gY29uZmlnLmhhc093blByb3BlcnR5KGtleSkgPyBzdHIucmVwbGFjZShtYXRjaCwgY29uZmlnW2tleV0pIDogc3RyLCB0ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2NhbGl6ZXI8ViBleHRlbmRzIEN1c3RvbVZvY2FidWxhcnk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSBDdXN0b21Wb2NhYnVsYXJ5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PihcbiAgICBrZXk6IGtleW9mIFYsXG4gICAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPixcbiAgKTogTG9jYWxpemVyIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7IC8vIGJlY2F1c2Ugc29tZXRpbWVzIHdlIGNhbGwgdG9Eb21FbGVtZW50KCkgd2l0aG91dCBjb25maWd1cmluZyB0aGUgY29tcG9uZW50IG9yIHNldHRpbmcgdGV4dC4uLlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgbGV0IHZvY2FidWxhcnlTdHJpbmcgPSB0aGlzLnZvY2FidWxhcnlba2V5IGFzIHN0cmluZ107XG5cbiAgICAgIGlmICh2b2NhYnVsYXJ5U3RyaW5nID09IG51bGwpIHtcbiAgICAgICAgdm9jYWJ1bGFyeVN0cmluZyA9IGtleSBhcyBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICB2b2NhYnVsYXJ5U3RyaW5nID0gdGhpcy5yZXBsYWNlVmFyaWFibGVXaXRoUGxhY2Vob2xkZXJJZkV4aXN0cyh2b2NhYnVsYXJ5U3RyaW5nLCBjb25maWcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdm9jYWJ1bGFyeVN0cmluZztcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHBlcmZvcm1Mb2NhbGl6YXRpb24odGV4dDogTG9jYWxpemFibGVUZXh0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ZXh0ID09PSAnZnVuY3Rpb24nID8gdGV4dCgpIDogdGV4dDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaTE4biA9IG5ldyBJMThuKGRlZmF1bHRMb2NhbGl6YXRpb25Db25maWcpO1xuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcInNldHRpbmdzLnZpZGVvLnF1YWxpdHlcIjogXCJWaWRlb3F1YWxpdMOkdFwiLFxuICBcInNldHRpbmdzLmF1ZGlvLnF1YWxpdHlcIjogXCJBdWRpb3F1YWxpdMOkdFwiLFxuICBcInNldHRpbmdzLmF1ZGlvLnRyYWNrXCI6IFwiQXVkaW9zcHVyXCIsXG4gIFwic3BlZWRcIjogXCJHZXNjaHdpbmRpZ2tlaXRcIixcbiAgXCJwbGF5XCI6IFwiQWJzcGllbGVuXCIsXG4gIFwicGF1c2VcIjogXCJQYXVzZVwiLFxuICBcInBsYXlQYXVzZVwiOiBcIkFic3BpZWxlbi9QYXVzZVwiLFxuICBcIm9wZW5cIjogXCLDtmZmbmVuXCIsXG4gIFwiY2xvc2VcIjogXCJTY2hsaWXDn2VuXCIsXG4gIFwic2V0dGluZ3MuYXVkaW8ubXV0ZVwiOiBcIlN0dW1tc2NoYWx0dW5nXCIsXG4gIFwic2V0dGluZ3MuYXVkaW8udm9sdW1lXCI6IFwiTGF1dHN0w6Rya2VcIixcbiAgXCJwaWN0dXJlSW5QaWN0dXJlXCI6IFwiQmlsZCBpbSBCaWxkXCIsXG4gIFwiYXBwbGVBaXJwbGF5XCI6IFwiQXBwbGUgQWlyUGxheVwiLFxuICBcImdvb2dsZUNhc3RcIjogXCJHb29nbGUgQ2FzdFwiLFxuICBcInZyXCI6IFwiVlJcIixcbiAgXCJzZXR0aW5nc1wiOiBcIkVpbnN0ZWxsdW5nZW5cIixcbiAgXCJmdWxsc2NyZWVuXCI6IFwiVm9sbGJpbGRcIixcbiAgXCJvZmZcIjogXCJhdXNcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXNcIjogXCJVbnRlcnRpdGVsXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuc2l6ZVwiOiBcIkdyw7bDn2VcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHlcIjogXCJTY2hyaWZ0YXJ0XCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuY29sb3JcIjogXCJGYXJiZVwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250Lm9wYWNpdHlcIjogXCJEZWNra3JhZnRcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuY2hhcmFjdGVyRWRnZVwiOiBcIlLDpG5kZXJcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuYmFja2dyb3VuZC5jb2xvclwiOiBcIkhpbnRlcmdydW5kZmFyYmVcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuYmFja2dyb3VuZC5vcGFjaXR5XCI6IFwiSGludGVyZ3J1bmRkZWNra3JhZnRcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMud2luZG93LmNvbG9yXCI6IFwiSGludGVyZ3J1bmRmYXJiZVwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy53aW5kb3cub3BhY2l0eVwiOiBcIkhpbnRlcmdydW5kZGVja2tyYWZ0XCIsXG4gIFwic2V0dGluZ3MudGltZS5ob3Vyc1wiOiBcIlN0dW5kZW5cIixcbiAgXCJzZXR0aW5ncy50aW1lLm1pbnV0ZXNcIjogXCJNaW51dGVuXCIsXG4gIFwic2V0dGluZ3MudGltZS5zZWNvbmRzXCI6IFwiU2VrdW5kZW5cIixcbiAgXCJiYWNrXCI6IFwiWnVyw7xja1wiLFxuICBcInJlc2V0XCI6IFwiWnVyw7xja3NldHplblwiLFxuICBcInJlcGxheVwiOiBcIldpZWRlcmhvbGVuXCIsXG4gIFwiYWRzLnJlbWFpbmluZ1RpbWVcIjogXCJEaWVzZSBBbnplaWdlIGVuZGV0IGluIHtyZW1haW5pbmdUaW1lfSBTZWt1bmRlblwiLFxuICBcImRlZmF1bHRcIjogXCJzdGFuZGFyZFwiLFxuICBcImNvbG9ycy53aGl0ZVwiOiBcIndlacOfXCIsXG4gIFwiY29sb3JzLmJsYWNrXCI6IFwic2Nod2FyelwiLFxuICBcImNvbG9ycy5yZWRcIjogXCJyb3RcIixcbiAgXCJjb2xvcnMuZ3JlZW5cIjogXCJncsO8blwiLFxuICBcImNvbG9ycy5ibHVlXCI6IFwiYmxhdVwiLFxuICBcImNvbG9ycy55ZWxsb3dcIjogXCJnZWxiXCIsXG4gIFwic3VidGl0bGUuZXhhbXBsZVwiOiBcIkJlaXNwaWVsIFVudGVydGl0ZWxcIixcbiAgXCJzdWJ0aXRsZS5zZWxlY3RcIjogXCJVbnRlcnRpdGVsIGF1c3fDpGhsZW5cIixcbiAgXCJwbGF5aW5nT25cIjogXCJTcGllbHQgYXVmIDxzdHJvbmc+e2Nhc3REZXZpY2VOYW1lfTwvc3Ryb25nPlwiLFxuICBcImNvbm5lY3RpbmdUb1wiOiBcIlZlcmJpbmR1bmcgbWl0IDxzdHJvbmc+e2Nhc3REZXZpY2VOYW1lfTwvc3Ryb25nPiB3aXJkIGhlcmdlc3RlbGx0Li4uXCIsXG4gIFwid2F0ZXJtYXJrTGlua1wiOiBcIkxpbmsgenVtIEhvbWVwYWdlXCIsXG4gIFwiY29udHJvbEJhclwiOiBcIlZpZGVvcGxheWVyIEtvbnRyb2xsZW5cIixcbiAgXCJwbGF5ZXJcIjogXCJWaWRlbyBwbGF5ZXJcIixcbiAgXCJzZWVrQmFyXCI6IFwiVmlkZW8tVGltZWxpbmVcIixcbiAgXCJzZWVrQmFyLnZhbHVlXCI6IFwiV2VydFwiLFxuICBcInNlZWtCYXIudGltZXNoaWZ0XCI6IFwiVGltZXNoaWZ0XCIsXG4gIFwic2Vla0Jhci5kdXJhdGlvblRleHRcIjogXCJhdXNcIlxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcInNldHRpbmdzLnZpZGVvLnF1YWxpdHlcIjogXCJWaWRlbyBRdWFsaXR5XCIsXG4gIFwic2V0dGluZ3MuYXVkaW8ucXVhbGl0eVwiOiBcIkF1ZGlvIFF1YWxpdHlcIixcbiAgXCJzZXR0aW5ncy5hdWRpby50cmFja1wiOiBcIkF1ZGlvIFRyYWNrXCIsXG4gIFwic2V0dGluZ3MuYXVkaW8ubXV0ZVwiIDogXCJNdXRlXCIsXG4gIFwic2V0dGluZ3MuYXVkaW8udm9sdW1lXCIgOiBcIlZvbHVtZVwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy53aW5kb3cuY29sb3JcIiA6IFwiV2luZG93IGNvbG9yXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLndpbmRvdy5vcGFjaXR5XCIgOiBcIldpbmRvdyBvcGFjaXR5XCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzXCIgOiBcIlN1YnRpdGxlc1wiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250LmNvbG9yXCIgOiBcIkZvbnQgY29sb3JcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5vcGFjaXR5XCIgOiBcIkZvbnQgb3BhY2l0eVwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5iYWNrZ3JvdW5kLmNvbG9yXCIgOiBcIkJhY2tncm91bmQgY29sb3JcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuYmFja2dyb3VuZC5vcGFjaXR5XCI6IFwiQmFja2dyb3VuZCBvcGFjaXR5XCIsXG4gIFwiY29sb3JzLndoaXRlXCI6IFwid2hpdGVcIixcbiAgXCJjb2xvcnMuYmxhY2tcIjogXCJibGFja1wiLFxuICBcImNvbG9ycy5yZWRcIjogXCJyZWRcIixcbiAgXCJjb2xvcnMuZ3JlZW5cIjogXCJncmVlblwiLFxuICBcImNvbG9ycy5ibHVlXCI6IFwiYmx1ZVwiLFxuICBcImNvbG9ycy5jeWFuXCI6IFwiY3lhblwiLFxuICBcImNvbG9ycy55ZWxsb3dcIjogXCJ5ZWxsb3dcIixcbiAgXCJjb2xvcnMubWFnZW50YVwiOiBcIm1hZ2VudGFcIixcbiAgXCJwZXJjZW50XCI6IFwie3ZhbHVlfSVcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5zaXplXCI6IFwiRm9udCBzaXplXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2VcIjogXCJDaGFyYWN0ZXIgZWRnZVwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5jaGFyYWN0ZXJFZGdlLnJhaXNlZFwiOiBcInJhaXNlZFwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5jaGFyYWN0ZXJFZGdlLmRlcHJlc3NlZFwiOiBcImRlcHJlc3NlZFwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5jaGFyYWN0ZXJFZGdlLnVuaWZvcm1cIjogXCJ1bmlmb3JtXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UuZHJvcHNoYWRvd2VkXCI6IFwiZHJvcCBzaGFkb3dlZFwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseVwiOiBcIkZvbnQgZmFtaWx5XCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5Lm1vbm9zcGFjZWRzZXJpZlwiOiBcIm1vbm9zcGFjZWQgc2VyaWZcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkucHJvcG9ydGlvbmFsc2VyaWZcIjogXCJwcm9wb3J0aW9uYWwgc2VyaWZcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkubW9ub3NwYWNlZHNhbnNzZXJpZlwiOiBcIm1vbm9zcGFjZWQgc2FucyBzZXJpZlwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5wcm9wb3J0aW9uYWxzYW5zc2VyaWZcIjogXCJwcm9wb3J0aW9uYWwgc2FucyBzZXJpZlwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5jYXN1YWxcIjogXCJjYXN1YWxcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkuY3Vyc2l2ZVwiOiBcImN1cnNpdmVcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkuc21hbGxjYXBpdGFsXCI6IFwic21hbGwgY2FwaXRhbFwiLFxuICBcInNldHRpbmdzLnRpbWUuaG91cnNcIjogXCJIb3Vyc1wiLFxuICBcInNldHRpbmdzLnRpbWUubWludXRlc1wiOiBcIk1pbnV0ZXNcIixcbiAgXCJzZXR0aW5ncy50aW1lLnNlY29uZHNcIjogXCJTZWNvbmRzXCIsXG4gIFwiYWRzLnJlbWFpbmluZ1RpbWVcIjogXCJUaGlzIGFkIHdpbGwgZW5kIGluIHtyZW1haW5pbmdUaW1lfSBzZWNvbmRzLlwiLFxuICBcInNldHRpbmdzXCI6IFwiU2V0dGluZ3NcIixcbiAgXCJmdWxsc2NyZWVuXCIgOiBcIkZ1bGxzY3JlZW5cIixcbiAgXCJzcGVlZFwiOiBcIlNwZWVkXCIsXG4gIFwicGxheVBhdXNlXCIgOiBcIlBsYXkvUGF1c2VcIixcbiAgXCJwbGF5XCI6IFwiUGxheVwiLFxuICBcInBhdXNlXCI6IFwiUGF1c2VcIixcbiAgXCJvcGVuXCI6IFwib3BlblwiLFxuICBcImNsb3NlXCI6IFwiQ2xvc2VcIixcbiAgXCJwaWN0dXJlSW5QaWN0dXJlXCI6IFwiUGljdHVyZS1pbi1QaWN0dXJlXCIsXG4gIFwiYXBwbGVBaXJwbGF5XCIgOiBcIkFwcGxlIEFpclBsYXlcIixcbiAgXCJnb29nbGVDYXN0XCI6IFwiR29vZ2xlIENhc3RcIixcbiAgXCJ2clwiIDogXCJWUlwiLFxuICBcIm9mZlwiOiBcIm9mZlwiLFxuICBcImF1dG9cIjogXCJhdXRvXCIsXG4gIFwiYmFja1wiIDogXCJCYWNrXCIsXG4gIFwicmVzZXRcIjogXCJSZXNldFwiLFxuICBcInJlcGxheVwiOiBcIlJlcGxheVwiLFxuICBcIm5vcm1hbFwiOiBcIm5vcm1hbFwiLFxuICBcImRlZmF1bHRcIjogXCJkZWZhdWx0XCIsXG4gIFwibGl2ZVwiOiBcIkxpdmVcIixcbiAgXCJzdWJ0aXRsZS5leGFtcGxlXCI6IFwiZXhhbXBsZSBzdWJ0aXRsZVwiLFxuICBcInN1YnRpdGxlLnNlbGVjdFwiOiBcIlNlbGVjdCBzdWJ0aXRsZVwiLFxuICBcInBsYXlpbmdPblwiOiBcIlBsYXlpbmcgb24gPHN0cm9uZz57Y2FzdERldmljZU5hbWV9PC9zdHJvbmc+XCIsXG4gIFwiY29ubmVjdGluZ1RvXCI6IFwiQ29ubmVjdGluZyB0byA8c3Ryb25nPntjYXN0RGV2aWNlTmFtZX08L3N0cm9uZz4uLi5cIixcbiAgXCJ3YXRlcm1hcmtMaW5rXCI6IFwiTGluayB0byBIb21lcGFnZVwiLFxuICBcImNvbnRyb2xCYXJcIjogXCJWaWRlbyBwbGF5ZXIgY29udHJvbHNcIixcbiAgXCJwbGF5ZXJcIjogXCJWaWRlbyBwbGF5ZXJcIixcbiAgXCJzZWVrQmFyXCI6IFwiVmlkZW8gdGltZWxpbmVcIixcbiAgXCJzZWVrQmFyLnZhbHVlXCI6IFwiVmFsdWVcIixcbiAgXCJzZWVrQmFyLnRpbWVzaGlmdFwiOiBcIlRpbWVzaGlmdFwiLFxuICBcInNlZWtCYXIuZHVyYXRpb25UZXh0XCI6IFwib3V0IG9mXCJcbn1cbiIsImV4cG9ydCBjb25zdCB2ZXJzaW9uOiBzdHJpbmcgPSAne3tWRVJTSU9OfX0nO1xuLy8gTWFuYWdlbWVudFxuZXhwb3J0IHsgVUlNYW5hZ2VyLCBVSUluc3RhbmNlTWFuYWdlciB9IGZyb20gJy4vdWltYW5hZ2VyJztcbi8vIEZhY3Rvcmllc1xuZXhwb3J0IHsgVUlGYWN0b3J5IH0gZnJvbSAnLi91aWZhY3RvcnknO1xuZXhwb3J0IHsgRGVtb0ZhY3RvcnkgfSBmcm9tICcuL2RlbW9mYWN0b3J5Jztcbi8vIFV0aWxzXG5leHBvcnQgeyBBcnJheVV0aWxzIH0gZnJvbSAnLi9hcnJheXV0aWxzJztcbmV4cG9ydCB7IFN0cmluZ1V0aWxzIH0gZnJvbSAnLi9zdHJpbmd1dGlscyc7XG5leHBvcnQgeyBQbGF5ZXJVdGlscyB9IGZyb20gJy4vcGxheWVydXRpbHMnO1xuZXhwb3J0IHsgVUlVdGlscyB9IGZyb20gJy4vdWl1dGlscyc7XG5leHBvcnQgeyBCcm93c2VyVXRpbHMgfSBmcm9tICcuL2Jyb3dzZXJ1dGlscyc7XG5leHBvcnQgeyBTdG9yYWdlVXRpbHMgfSBmcm9tICcuL3N0b3JhZ2V1dGlscyc7XG5leHBvcnQgeyBFcnJvclV0aWxzIH0gZnJvbSAnLi9lcnJvcnV0aWxzJztcbi8vIENvbXBvbmVudHNcbmV4cG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9idXR0b24nO1xuZXhwb3J0IHsgQ29udHJvbEJhciB9IGZyb20gJy4vY29tcG9uZW50cy9jb250cm9sYmFyJztcbmV4cG9ydCB7IEZ1bGxzY3JlZW5Ub2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvZnVsbHNjcmVlbnRvZ2dsZWJ1dHRvbic7XG5leHBvcnQgeyBIdWdlUGxheWJhY2tUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvaHVnZXBsYXliYWNrdG9nZ2xlYnV0dG9uJztcbmV4cG9ydCB7IFBsYXliYWNrVGltZUxhYmVsLCBQbGF5YmFja1RpbWVMYWJlbE1vZGUgfSBmcm9tICcuL2NvbXBvbmVudHMvcGxheWJhY2t0aW1lbGFiZWwnO1xuZXhwb3J0IHsgUGxheWJhY2tUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvcGxheWJhY2t0b2dnbGVidXR0b24nO1xuZXhwb3J0IHsgU2Vla0JhciB9IGZyb20gJy4vY29tcG9uZW50cy9zZWVrYmFyJztcbmV4cG9ydCB7IFNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zZWxlY3Rib3gnO1xuZXhwb3J0IHsgSXRlbVNlbGVjdGlvbkxpc3QgfSBmcm9tICcuL2NvbXBvbmVudHMvaXRlbXNlbGVjdGlvbmxpc3QnO1xuZXhwb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gJy4vY29tcG9uZW50cy9zZXR0aW5nc3BhbmVsJztcbmV4cG9ydCB7IFNldHRpbmdzVG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzdG9nZ2xlYnV0dG9uJztcbmV4cG9ydCB7IFRvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy90b2dnbGVidXR0b24nO1xuZXhwb3J0IHsgVmlkZW9RdWFsaXR5U2VsZWN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL3ZpZGVvcXVhbGl0eXNlbGVjdGJveCc7XG5leHBvcnQgeyBWb2x1bWVUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvdm9sdW1ldG9nZ2xlYnV0dG9uJztcbmV4cG9ydCB7IFZSVG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3ZydG9nZ2xlYnV0dG9uJztcbmV4cG9ydCB7IFdhdGVybWFyayB9IGZyb20gJy4vY29tcG9uZW50cy93YXRlcm1hcmsnO1xuZXhwb3J0IHsgVUlDb250YWluZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvdWljb250YWluZXInO1xuZXhwb3J0IHsgQ29udGFpbmVyIH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnRhaW5lcic7XG5leHBvcnQgeyBMYWJlbCB9IGZyb20gJy4vY29tcG9uZW50cy9sYWJlbCc7XG5leHBvcnQgeyBBdWRpb1F1YWxpdHlTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvYXVkaW9xdWFsaXR5c2VsZWN0Ym94JztcbmV4cG9ydCB7IEF1ZGlvVHJhY2tTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvYXVkaW90cmFja3NlbGVjdGJveCc7XG5leHBvcnQgeyBDYXN0U3RhdHVzT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9jYXN0c3RhdHVzb3ZlcmxheSc7XG5leHBvcnQgeyBDYXN0VG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2Nhc3R0b2dnbGVidXR0b24nO1xuZXhwb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbXBvbmVudCc7XG5leHBvcnQgeyBFcnJvck1lc3NhZ2VPdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL2Vycm9ybWVzc2FnZW92ZXJsYXknO1xuZXhwb3J0IHsgUmVjb21tZW5kYXRpb25PdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL3JlY29tbWVuZGF0aW9ub3ZlcmxheSc7XG5leHBvcnQgeyBTZWVrQmFyTGFiZWwgfSBmcm9tICcuL2NvbXBvbmVudHMvc2Vla2JhcmxhYmVsJztcbmV4cG9ydCB7IFN1YnRpdGxlT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZW92ZXJsYXknO1xuZXhwb3J0IHsgU3VidGl0bGVTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZWxlY3Rib3gnO1xuZXhwb3J0IHsgVGl0bGVCYXIgfSBmcm9tICcuL2NvbXBvbmVudHMvdGl0bGViYXInO1xuZXhwb3J0IHsgVm9sdW1lQ29udHJvbEJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy92b2x1bWVjb250cm9sYnV0dG9uJztcbmV4cG9ydCB7IENsaWNrT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9jbGlja292ZXJsYXknO1xuZXhwb3J0IHsgQWRTa2lwQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2Fkc2tpcGJ1dHRvbic7XG5leHBvcnQgeyBBZE1lc3NhZ2VMYWJlbCB9IGZyb20gJy4vY29tcG9uZW50cy9hZG1lc3NhZ2VsYWJlbCc7XG5leHBvcnQgeyBBZENsaWNrT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9hZGNsaWNrb3ZlcmxheSc7XG5leHBvcnQgeyBQbGF5YmFja1NwZWVkU2VsZWN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL3BsYXliYWNrc3BlZWRzZWxlY3Rib3gnO1xuZXhwb3J0IHsgSHVnZVJlcGxheUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9odWdlcmVwbGF5YnV0dG9uJztcbmV4cG9ydCB7IEJ1ZmZlcmluZ092ZXJsYXkgfSBmcm9tICcuL2NvbXBvbmVudHMvYnVmZmVyaW5nb3ZlcmxheSc7XG5leHBvcnQgeyBDYXN0VUlDb250YWluZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvY2FzdHVpY29udGFpbmVyJztcbmV4cG9ydCB7IFBsYXliYWNrVG9nZ2xlT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9wbGF5YmFja3RvZ2dsZW92ZXJsYXknO1xuZXhwb3J0IHsgQ2xvc2VCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvY2xvc2VidXR0b24nO1xuZXhwb3J0IHsgTWV0YWRhdGFMYWJlbCwgTWV0YWRhdGFMYWJlbENvbnRlbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbWV0YWRhdGFsYWJlbCc7XG5leHBvcnQgeyBBaXJQbGF5VG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2FpcnBsYXl0b2dnbGVidXR0b24nO1xuZXhwb3J0IHsgVm9sdW1lU2xpZGVyIH0gZnJvbSAnLi9jb21wb25lbnRzL3ZvbHVtZXNsaWRlcic7XG5leHBvcnQgeyBQaWN0dXJlSW5QaWN0dXJlVG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3BpY3R1cmVpbnBpY3R1cmV0b2dnbGVidXR0b24nO1xuZXhwb3J0IHsgU3BhY2VyIH0gZnJvbSAnLi9jb21wb25lbnRzL3NwYWNlcic7XG5leHBvcnQgeyBCYWNrZ3JvdW5kQ29sb3JTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9iYWNrZ3JvdW5kY29sb3JzZWxlY3Rib3gnO1xuZXhwb3J0IHsgQmFja2dyb3VuZE9wYWNpdHlTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9iYWNrZ3JvdW5kb3BhY2l0eXNlbGVjdGJveCc7XG5leHBvcnQgeyBDaGFyYWN0ZXJFZGdlU2VsZWN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3MvY2hhcmFjdGVyZWRnZXNlbGVjdGJveCc7XG5leHBvcnQgeyBGb250Q29sb3JTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9mb250Y29sb3JzZWxlY3Rib3gnO1xuZXhwb3J0IHsgRm9udEZhbWlseVNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2ZvbnRmYW1pbHlzZWxlY3Rib3gnO1xuZXhwb3J0IHsgRm9udE9wYWNpdHlTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9mb250b3BhY2l0eXNlbGVjdGJveCc7XG5leHBvcnQgeyBGb250U2l6ZVNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2ZvbnRzaXplc2VsZWN0Ym94JztcbmV4cG9ydCB7IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NlbGVjdGJveCc7XG5leHBvcnQgeyBTdWJ0aXRsZVNldHRpbmdzTGFiZWwgfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9zdWJ0aXRsZXNldHRpbmdzbGFiZWwnO1xuZXhwb3J0IHsgV2luZG93Q29sb3JTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy93aW5kb3djb2xvcnNlbGVjdGJveCc7XG5leHBvcnQgeyBXaW5kb3dPcGFjaXR5U2VsZWN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3Mvd2luZG93b3BhY2l0eXNlbGVjdGJveCc7XG5leHBvcnQgeyBTdWJ0aXRsZVNldHRpbmdzUmVzZXRCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9zdWJ0aXRsZXNldHRpbmdzcmVzZXRidXR0b24nO1xuZXhwb3J0IHsgTGlzdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9saXN0Ym94JztcbmV4cG9ydCB7IFN1YnRpdGxlTGlzdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZWxpc3Rib3gnO1xuZXhwb3J0IHsgQXVkaW9UcmFja0xpc3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvYXVkaW90cmFja2xpc3Rib3gnO1xuZXhwb3J0IHsgU2V0dGluZ3NQYW5lbFBhZ2UgfSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbHBhZ2UnO1xuZXhwb3J0IHsgU2V0dGluZ3NQYW5lbFBhZ2VCYWNrQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzcGFuZWxwYWdlYmFja2J1dHRvbic7XG5leHBvcnQgeyBTZXR0aW5nc1BhbmVsUGFnZU9wZW5CdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbHBhZ2VvcGVuYnV0dG9uJztcbmV4cG9ydCB7IFN1YnRpdGxlU2V0dGluZ3NQYW5lbFBhZ2UgfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9zdWJ0aXRsZXNldHRpbmdzcGFuZWxwYWdlJztcbmV4cG9ydCB7IFNldHRpbmdzUGFuZWxJdGVtIH0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzcGFuZWxpdGVtJztcblxuLy8gT2JqZWN0LmFzc2lnbiBwb2x5ZmlsbCBmb3IgRVM1L0lFOVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZGUvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduICE9PSAnZnVuY3Rpb24nKSB7XG4gIE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbih0YXJnZXQ6IGFueSkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHRhcmdldCA9IE9iamVjdCh0YXJnZXQpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBsZXQgc291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59IiwiaW1wb3J0IHsgUGxheWVyQVBJLCBQbGF5ZXJFdmVudCwgUGxheWVyRXZlbnRCYXNlLCBQbGF5ZXJFdmVudENhbGxiYWNrIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IFdyYXBwZWRQbGF5ZXIgfSBmcm9tICcuL3VpbWFuYWdlcic7XG5cbmV4cG9ydCBlbnVtIE1vYmlsZVYzUGxheWVyRXZlbnQge1xuICBTb3VyY2VFcnJvciA9ICdzb3VyY2VlcnJvcicsXG4gIFBsYXllckVycm9yID0gJ3BsYXllcmVycm9yJyxcbiAgUGxheWxpc3RUcmFuc2l0aW9uID0gJ3BsYXlsaXN0dHJhbnNpdGlvbicsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlVjNQbGF5ZXJFcnJvckV2ZW50IGV4dGVuZHMgUGxheWVyRXZlbnRCYXNlIHtcbiAgY29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlVjNTb3VyY2VFcnJvckV2ZW50IGV4dGVuZHMgUGxheWVyRXZlbnRCYXNlIHtcbiAgY29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1vYmlsZVYzUGxheWVyRXZlbnRUeXBlID0gUGxheWVyRXZlbnQgfCBNb2JpbGVWM1BsYXllckV2ZW50O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vYmlsZVYzUGxheWVyQVBJIGV4dGVuZHMgUGxheWVyQVBJIHtcbiAgb24oZXZlbnRUeXBlOiBNb2JpbGVWM1BsYXllckV2ZW50VHlwZSwgY2FsbGJhY2s6IFBsYXllckV2ZW50Q2FsbGJhY2spOiB2b2lkO1xuICBleHBvcnRzOiBQbGF5ZXJBUElbJ2V4cG9ydHMnXSAmIHsgUGxheWVyRXZlbnQ6IE1vYmlsZVYzUGxheWVyRXZlbnRUeXBlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vYmlsZVYzUGxheWVyQVBJKHBsYXllcjogV3JhcHBlZFBsYXllciB8IFBsYXllckFQSSB8IE1vYmlsZVYzUGxheWVyQVBJKTogcGxheWVyIGlzIE1vYmlsZVYzUGxheWVyQVBJIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gTW9iaWxlVjNQbGF5ZXJFdmVudCkge1xuICAgIGlmIChNb2JpbGVWM1BsYXllckV2ZW50Lmhhc093blByb3BlcnR5KGtleSkgJiYgIXBsYXllci5leHBvcnRzLlBsYXllckV2ZW50Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7RXZlbnQsIEV2ZW50RGlzcGF0Y2hlciwgTm9BcmdzfSBmcm9tICcuL2V2ZW50ZGlzcGF0Y2hlcic7XG5pbXBvcnQge0Jyb3dzZXJVdGlsc30gZnJvbSAnLi9icm93c2VydXRpbHMnO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEksIFRpbWVSYW5nZSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbmV4cG9ydCBuYW1lc3BhY2UgUGxheWVyVXRpbHMge1xuXG4gIGV4cG9ydCBlbnVtIFBsYXllclN0YXRlIHtcbiAgICBJZGxlLFxuICAgIFByZXBhcmVkLFxuICAgIFBsYXlpbmcsXG4gICAgUGF1c2VkLFxuICAgIEZpbmlzaGVkLFxuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzVGltZVNoaWZ0QXZhaWxhYmxlKHBsYXllcjogUGxheWVyQVBJKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBsYXllci5pc0xpdmUoKSAmJiBwbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCkgIT09IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZ2V0U3RhdGUocGxheWVyOiBQbGF5ZXJBUEkpOiBQbGF5ZXJTdGF0ZSB7XG4gICAgaWYgKHBsYXllci5oYXNFbmRlZCgpKSB7XG4gICAgICByZXR1cm4gUGxheWVyU3RhdGUuRmluaXNoZWQ7XG4gICAgfSBlbHNlIGlmIChwbGF5ZXIuaXNQbGF5aW5nKCkpIHtcbiAgICAgIHJldHVybiBQbGF5ZXJTdGF0ZS5QbGF5aW5nO1xuICAgIH0gZWxzZSBpZiAocGxheWVyLmlzUGF1c2VkKCkpIHtcbiAgICAgIHJldHVybiBQbGF5ZXJTdGF0ZS5QYXVzZWQ7XG4gICAgfSBlbHNlIGlmIChwbGF5ZXIuZ2V0U291cmNlKCkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFBsYXllclN0YXRlLlByZXBhcmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUGxheWVyU3RhdGUuSWRsZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudFRpbWUgLSBzZWVrYWJsZVJhbmdlLnN0YXJ0LiBUaGlzIGVuc3VyZXMgYSB1c2VyLWZyaWVuZGx5IGN1cnJlbnRUaW1lIGFmdGVyIGEgbGl2ZSBzdHJlYW1cbiAgICogdHJhbnNpdGlvbmVkIHRvIFZvRC5cbiAgICogQHBhcmFtIHBsYXllclxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lUmVsYXRpdmVUb1NlZWthYmxlUmFuZ2UocGxheWVyOiBQbGF5ZXJBUEkpOiBudW1iZXIge1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gcGxheWVyLmdldEN1cnJlbnRUaW1lKCk7XG4gICAgaWYgKHBsYXllci5pc0xpdmUoKSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lO1xuICAgIH1cblxuICAgIGNvbnN0IHNlZWthYmxlUmFuZ2VTdGFydCA9IFBsYXllclV0aWxzLmdldFNlZWthYmxlUmFuZ2VTdGFydChwbGF5ZXIsIDApO1xuICAgIHJldHVybiBjdXJyZW50VGltZSAtIHNlZWthYmxlUmFuZ2VTdGFydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdGFydCB2YWx1ZSBvZiB0aGUgc2Vla2FibGUgcmFuZ2Ugb3IgdGhlIGRlZmF1bHRWYWx1ZSBpZiBubyBzZWVrYWJsZVJhbmdlIGlzIHByZXNlbnQuXG4gICAqIEZvciBub3cgdGhpcyBoYXBwZW5zIG9ubHkgaW4gY29tYmluYXRpb24gd2l0aCBNb2JpbGUgU0RLcy5cbiAgICpcbiAgICogVE9ETzogcmVtb3ZlIHRoaXMgZnVuY3Rpb24gaW4gbmV4dCBtYWpvciByZWxlYXNlXG4gICAqXG4gICAqIEBwYXJhbSBwbGF5ZXJcbiAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZVxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWthYmxlUmFuZ2VTdGFydChwbGF5ZXI6IFBsYXllckFQSSwgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwKSB7XG4gICAgcmV0dXJuIHBsYXllci5nZXRTZWVrYWJsZVJhbmdlKCkgJiYgcGxheWVyLmdldFNlZWthYmxlUmFuZ2UoKS5zdGFydCB8fCBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBwbGF5ZXIgc2Vla2FibGUgdGltZSByYW5nZSBmb3IgbGl2ZS5cbiAgICogQXMgdGhlIHBsYXllciByZXR1cm5zIGB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9YCBmb3IgbGl2ZSBzdHJlYW1zIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBgc2Vla2FibGVSYW5nZWAgYmFzZWQgb24gYG1heFRpbWVzaGlmdGAuXG4gICAqXG4gICAqIEBwYXJhbSBwbGF5ZXJcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRTZWVrYWJsZVJhbmdlUmVzcGVjdGluZ0xpdmUocGxheWVyOiBQbGF5ZXJBUEkpOiBUaW1lUmFuZ2Uge1xuICAgIGlmICghcGxheWVyLmlzTGl2ZSgpKSB7XG4gICAgICByZXR1cm4gcGxheWVyLmdldFNlZWthYmxlUmFuZ2UoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VGltZXNoaWZ0ID0gLXBsYXllci5nZXRUaW1lU2hpZnQoKTtcbiAgICBjb25zdCBtYXhUaW1lc2hpZnQgPSAtcGxheWVyLmdldE1heFRpbWVTaGlmdCgpO1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gcGxheWVyLmdldEN1cnJlbnRUaW1lKCk7XG5cbiAgICBjb25zdCBlbmQgPSBjdXJyZW50VGltZSArIChjdXJyZW50VGltZXNoaWZ0KTtcbiAgICBjb25zdCBzdGFydCA9IGN1cnJlbnRUaW1lIC0gKG1heFRpbWVzaGlmdCAtIGN1cnJlbnRUaW1lc2hpZnQpO1xuXG4gICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBUaW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkQXJncyBleHRlbmRzIE5vQXJncyB7XG4gICAgdGltZVNoaWZ0QXZhaWxhYmxlOiBib29sZWFuO1xuICB9XG5cbiAgZXhwb3J0IGNsYXNzIFRpbWVTaGlmdEF2YWlsYWJpbGl0eURldGVjdG9yIHtcblxuICAgIHByaXZhdGUgcGxheWVyOiBQbGF5ZXJBUEk7XG4gICAgcHJpdmF0ZSB0aW1lU2hpZnRBdmFpbGFibGU6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSB0aW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkRXZlbnQgPSBuZXcgRXZlbnREaXNwYXRjaGVyPFBsYXllckFQSSwgVGltZVNoaWZ0QXZhaWxhYmlsaXR5Q2hhbmdlZEFyZ3M+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllckFQSSkge1xuICAgICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgICB0aGlzLnRpbWVTaGlmdEF2YWlsYWJsZSA9IHVuZGVmaW5lZDtcblxuICAgICAgbGV0IHRpbWVTaGlmdERldGVjdG9yID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRldGVjdCgpO1xuICAgICAgfTtcbiAgICAgIC8vIFRyeSB0byBkZXRlY3QgdGltZXNoaWZ0IGF2YWlsYWJpbGl0eSB3aGVuIHNvdXJjZSBpcyBsb2FkZWQsIHdoaWNoIHdvcmtzIGZvciBEQVNIIHN0cmVhbXNcbiAgICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VMb2FkZWQsIHRpbWVTaGlmdERldGVjdG9yKTtcbiAgICAgIC8vIFdpdGggSExTL05hdGl2ZVBsYXllciBzdHJlYW1zLCBnZXRNYXhUaW1lU2hpZnQgY2FuIGJlIDAgYmVmb3JlIHRoZSBidWZmZXIgZmlsbHMsIHNvIHdlIG5lZWQgdG8gYWRkaXRpb25hbGx5XG4gICAgICAvLyBjaGVjayB0aW1lc2hpZnQgYXZhaWxhYmlsaXR5IGluIFRpbWVDaGFuZ2VkXG4gICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVGltZUNoYW5nZWQsIHRpbWVTaGlmdERldGVjdG9yKTtcbiAgICB9XG5cbiAgICBkZXRlY3QoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaXNMaXZlKCkpIHtcbiAgICAgICAgbGV0IHRpbWVTaGlmdEF2YWlsYWJsZU5vdyA9IFBsYXllclV0aWxzLmlzVGltZVNoaWZ0QXZhaWxhYmxlKHRoaXMucGxheWVyKTtcblxuICAgICAgICAvLyBXaGVuIHRoZSBhdmFpbGFiaWxpdHkgY2hhbmdlcywgd2UgZmlyZSB0aGUgZXZlbnRcbiAgICAgICAgaWYgKHRpbWVTaGlmdEF2YWlsYWJsZU5vdyAhPT0gdGhpcy50aW1lU2hpZnRBdmFpbGFibGUpIHtcbiAgICAgICAgICB0aGlzLnRpbWVTaGlmdEF2YWlsYWJpbGl0eUNoYW5nZWRFdmVudC5kaXNwYXRjaCh0aGlzLnBsYXllciwgeyB0aW1lU2hpZnRBdmFpbGFibGU6IHRpbWVTaGlmdEF2YWlsYWJsZU5vdyB9KTtcbiAgICAgICAgICB0aGlzLnRpbWVTaGlmdEF2YWlsYWJsZSA9IHRpbWVTaGlmdEF2YWlsYWJsZU5vdztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGdldCBvblRpbWVTaGlmdEF2YWlsYWJpbGl0eUNoYW5nZWQoKTogRXZlbnQ8UGxheWVyQVBJLCBUaW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkQXJncz4ge1xuICAgICAgcmV0dXJuIHRoaXMudGltZVNoaWZ0QXZhaWxhYmlsaXR5Q2hhbmdlZEV2ZW50LmdldEV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBMaXZlU3RyZWFtRGV0ZWN0b3JFdmVudEFyZ3MgZXh0ZW5kcyBOb0FyZ3Mge1xuICAgIGxpdmU6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0cyBjaGFuZ2VzIG9mIHRoZSBzdHJlYW0gdHlwZSwgaS5lLiBjaGFuZ2VzIG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHBsYXllciNpc0xpdmUgbWV0aG9kLlxuICAgKiBOb3JtYWxseSwgYSBzdHJlYW0gY2Fubm90IGNoYW5nZSBpdHMgdHlwZSBkdXJpbmcgcGxheWJhY2ssIGl0J3MgZWl0aGVyIFZPRCBvciBsaXZlLiBEdWUgdG8gYnVncyBvbiBzb21lXG4gICAqIHBsYXRmb3JtcyBvciBicm93c2VycywgaXQgY2FuIHN0aWxsIGNoYW5nZS4gSXQgaXMgdGhlcmVmb3JlIHVucmVsaWFibGUgdG8ganVzdCBjaGVjayAjaXNMaXZlIGFuZCB0aGlzIGRldGVjdG9yXG4gICAqIHNob3VsZCBiZSB1c2VkIGFzIGEgd29ya2Fyb3VuZCBpbnN0ZWFkLlxuICAgKlxuICAgKiBBZGRpdGlvbmFsbHkgc3RhcnRpbmcgd2l0aCBwbGF5ZXIgdjguMTkuMCB3ZSBoYXZlIHRoZSB1c2UtY2FzZSB0aGF0IGEgbGl2ZSBzdHJlYW0gY2hhbmdlcyBpbnRvIGEgdm9kLlxuICAgKiBUaGUgRHVyYXRpb25DaGFuZ2VkIGV2ZW50IGluZGljYXRlcyB0aGlzIHN3aXRjaC5cbiAgICpcbiAgICogS25vd24gY2FzZXM6XG4gICAqXG4gICAqIC0gSExTIFZPRCBvbiBBbmRyb2lkIDQuM1xuICAgKiBWaWRlbyBkdXJhdGlvbiBpcyBpbml0aWFsbHkgJ0luZmluaXR5JyBhbmQgb25seSBnZXRzIGF2YWlsYWJsZSBhZnRlciBwbGF5YmFjayBzdGFydHMsIHNvIHN0cmVhbXMgYXJlIHdyb25nbHlcbiAgICogcmVwb3J0ZWQgYXMgJ2xpdmUnIGJlZm9yZSBwbGF5YmFjayAodGhlIGxpdmUtY2hlY2sgaW4gdGhlIHBsYXllciBjaGVja3MgZm9yIGluZmluaXRlIGR1cmF0aW9uKS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgVUkgdjMuOS4wIGluIGNvbWJpbmF0aW9uIHdpdGggcGxheWVyIHY4LjE5LjAgdXNlIFBsYXllckV2ZW50LkR1cmF0aW9uQ2hhbmdlZCBpbnN0ZWFkXG4gICAqXG4gICAqIFRPRE86IHJlbW92ZSB0aGlzIGNsYXNzIGluIG5leHQgbWFqb3IgcmVsZWFzZVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIExpdmVTdHJlYW1EZXRlY3RvciB7XG5cbiAgICBwcml2YXRlIHBsYXllcjogUGxheWVyQVBJO1xuICAgIHByaXZhdGUgbGl2ZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIGxpdmVDaGFuZ2VkRXZlbnQgPSBuZXcgRXZlbnREaXNwYXRjaGVyPFBsYXllckFQSSwgTGl2ZVN0cmVhbURldGVjdG9yRXZlbnRBcmdzPigpO1xuICAgIHByaXZhdGUgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcjtcblxuICAgIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKSB7XG4gICAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICAgIHRoaXMudWltYW5hZ2VyID0gdWltYW5hZ2VyO1xuICAgICAgdGhpcy5saXZlID0gdW5kZWZpbmVkO1xuXG4gICAgICBsZXQgbGl2ZURldGVjdG9yID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRldGVjdCgpO1xuICAgICAgfTtcbiAgICAgIHRoaXMudWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKGxpdmVEZXRlY3Rvcik7XG4gICAgICAvLyBSZS1ldmFsdWF0ZSB3aGVuIHBsYXliYWNrIHN0YXJ0c1xuICAgICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXksIGxpdmVEZXRlY3Rvcik7XG5cbiAgICAgIC8vIEhMUyBsaXZlIGRldGVjdGlvbiB3b3JrYXJvdW5kIGZvciBBbmRyb2lkOlxuICAgICAgLy8gQWxzbyByZS1ldmFsdWF0ZSBkdXJpbmcgcGxheWJhY2ssIGJlY2F1c2UgdGhhdCBpcyB3aGVuIHRoZSBsaXZlIGZsYWcgbWlnaHQgY2hhbmdlLlxuICAgICAgLy8gKERvaW5nIGl0IG9ubHkgaW4gQW5kcm9pZCBDaHJvbWUgc2F2ZXMgdW5uZWNlc3Nhcnkgb3ZlcmhlYWQgb24gb3RoZXIgcGxhdGZvcm1zKVxuICAgICAgaWYgKEJyb3dzZXJVdGlscy5pc0FuZHJvaWQgJiYgQnJvd3NlclV0aWxzLmlzQ2hyb21lKSB7XG4gICAgICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lQ2hhbmdlZCwgbGl2ZURldGVjdG9yKTtcbiAgICAgIH1cblxuICAgICAgLy8gRHVyYXRpb25DaGFuZ2VkIGV2ZW50IHdhcyBpbnRyb2R1Y2VkIHdpdGggcGxheWVyIHY4LjE5LjBcbiAgICAgIGlmIChwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5EdXJhdGlvbkNoYW5nZWQpIHtcbiAgICAgICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkR1cmF0aW9uQ2hhbmdlZCwgbGl2ZURldGVjdG9yKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWQgdmlkZW8ncyBpc0xpdmUoKSBtaWdodCBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgYWN0dWFsIHZpZGVvJ3MgaXNMaXZlKCkuXG4gICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRCcmVha1N0YXJ0ZWQsIGxpdmVEZXRlY3Rvcik7XG4gICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRCcmVha0ZpbmlzaGVkLCBsaXZlRGV0ZWN0b3IpO1xuICAgIH1cblxuICAgIGRldGVjdCgpOiB2b2lkIHtcbiAgICAgIGxldCBsaXZlTm93ID0gdGhpcy5wbGF5ZXIuaXNMaXZlKCk7XG5cbiAgICAgIC8vIENvbXBhcmUgY3VycmVudCB0byBwcmV2aW91cyBsaXZlIHN0YXRlIGZsYWcgYW5kIGZpcmUgZXZlbnQgd2hlbiBpdCBjaGFuZ2VzLiBTaW5jZSB3ZSBpbml0aWFsaXplIHRoZSBmbGFnXG4gICAgICAvLyB3aXRoIHVuZGVmaW5lZCwgdGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IGFuIGluaXRpYWwgZXZlbnQgZmlyZWQgdGhhdCB0ZWxscyBsaXN0ZW5lcnMgdGhlIGxpdmUgc3RhdGUuXG4gICAgICBpZiAobGl2ZU5vdyAhPT0gdGhpcy5saXZlKSB7XG4gICAgICAgIHRoaXMubGl2ZUNoYW5nZWRFdmVudC5kaXNwYXRjaCh0aGlzLnBsYXllciwgeyBsaXZlOiBsaXZlTm93IH0pO1xuICAgICAgICB0aGlzLmxpdmUgPSBsaXZlTm93O1xuICAgICAgfVxuICAgIH1cblxuICAgIGdldCBvbkxpdmVDaGFuZ2VkKCk6IEV2ZW50PFBsYXllckFQSSwgTGl2ZVN0cmVhbURldGVjdG9yRXZlbnRBcmdzPiB7XG4gICAgICByZXR1cm4gdGhpcy5saXZlQ2hhbmdlZEV2ZW50LmdldEV2ZW50KCk7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgbmFtZXNwYWNlIFN0b3JhZ2VVdGlscyB7XG4gIGxldCBoYXNMb2NhbFN0b3JhZ2VDYWNoZTogYm9vbGVhbjtcblxuICBleHBvcnQgZnVuY3Rpb24gaGFzTG9jYWxTdG9yYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmIChoYXNMb2NhbFN0b3JhZ2VDYWNoZSkge1xuICAgICAgcmV0dXJuIGhhc0xvY2FsU3RvcmFnZUNhY2hlO1xuICAgIH1cblxuICAgIC8vIGhhc0xvY2FsU3RvcmFnZSBpcyB1c2VkIHRvIHNhZmVseSBlbnN1cmUgd2UgY2FuIHVzZSBsb2NhbFN0b3JhZ2VcbiAgICAvLyB0YWtlbiBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfU3RvcmFnZV9BUEkvVXNpbmdfdGhlX1dlYl9TdG9yYWdlX0FQSSNGZWF0dXJlLWRldGVjdGluZ19sb2NhbFN0b3JhZ2VcbiAgICBsZXQgc3RvcmFnZTogYW55ID0geyBsZW5ndGg6IDAgfTtcbiAgICB0cnkge1xuICAgICAgc3RvcmFnZSA9IHdpbmRvd1snbG9jYWxTdG9yYWdlJ107XG4gICAgICBsZXQgeCA9ICdfX3N0b3JhZ2VfdGVzdF9fJztcbiAgICAgIHN0b3JhZ2Uuc2V0SXRlbSh4LCB4KTtcbiAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbSh4KTtcbiAgICAgIGhhc0xvY2FsU3RvcmFnZUNhY2hlID0gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgIGhhc0xvY2FsU3RvcmFnZUNhY2hlID0gZSBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiAoXG4gICAgICAgICAgLy8gZXZlcnl0aGluZyBleGNlcHQgRmlyZWZveFxuICAgICAgICBlLmNvZGUgPT09IDIyIHx8XG4gICAgICAgIC8vIEZpcmVmb3hcbiAgICAgICAgZS5jb2RlID09PSAxMDE0IHx8XG4gICAgICAgIC8vIHRlc3QgbmFtZSBmaWVsZCB0b28sIGJlY2F1c2UgY29kZSBtaWdodCBub3QgYmUgcHJlc2VudFxuICAgICAgICAvLyBldmVyeXRoaW5nIGV4Y2VwdCBGaXJlZm94XG4gICAgICAgIGUubmFtZSA9PT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicgfHxcbiAgICAgICAgLy8gRmlyZWZveFxuICAgICAgICBlLm5hbWUgPT09ICdOU19FUlJPUl9ET01fUVVPVEFfUkVBQ0hFRCcpICYmXG4gICAgICAgIC8vIGFja25vd2xlZGdlIFF1b3RhRXhjZWVkZWRFcnJvciBvbmx5IGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGFscmVhZHkgc3RvcmVkXG4gICAgICAgIHN0b3JhZ2UubGVuZ3RoICE9PSAwO1xuICAgIH1cbiAgICByZXR1cm4gaGFzTG9jYWxTdG9yYWdlQ2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmVzIGEgc3RyaW5nIGl0ZW0gaW50byBsb2NhbFN0b3JhZ2UuXG4gICAqIEBwYXJhbSBrZXkgdGhlIGl0ZW0ncyBrZXlcbiAgICogQHBhcmFtIGRhdGEgdGhlIGl0ZW0ncyBkYXRhXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gc2V0SXRlbShrZXk6IHN0cmluZywgZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKFN0b3JhZ2VVdGlscy5oYXNMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gaXRlbSdzIHN0cmluZyB2YWx1ZSBmcm9tIHRoZSBsb2NhbFN0b3JhZ2UuXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwIGl0cyBhc3NvY2lhdGVkIHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IG51bGx9IFJldHVybnMgdGhlIHN0cmluZyBpZiBmb3VuZCwgbnVsbCBpZiB0aGVyZSBpcyBubyBkYXRhIHN0b3JlZCBmb3IgdGhlIGtleVxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldEl0ZW0oa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoU3RvcmFnZVV0aWxzLmhhc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZXMgYW4gb2JqZWN0IGludG8gbG9jYWxTdG9yYWdlLiBUaGUgb2JqZWN0IHdpbGwgYmUgc2VyaWFsaXplZCB0byBKU09OLiBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBzdXBwb3J0ZWRcbiAgICogaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgdHlwZXM6XG4gICAqICAtIENvbG9yVXRpbHMuQ29sb3JcbiAgICpcbiAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIHN0b3JlIHRoZSBkYXRhIHRvXG4gICAqIEBwYXJhbSBkYXRhIHRoZSBvYmplY3QgdG8gc3RvcmVcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBzZXRPYmplY3Q8VD4oa2V5OiBzdHJpbmcsIGRhdGE6IFQpOiB2b2lkIHtcbiAgICBpZiAoU3RvcmFnZVV0aWxzLmhhc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgc2V0SXRlbShrZXksIGpzb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIG9iamVjdCBmb3IgdGhlIGdpdmVuIGtleSBmcm9tIGxvY2FsU3RvcmFnZS4gVGhlIG9iamVjdCB3aWxsIGJlIGRlc2VyaWFsaXplZCBmcm9tIEpTT04uIEJlc2lkZSB0aGVcbiAgICogZGVmYXVsdCB0eXBlcywgdGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgc3VwcG9ydGVkOlxuICAgKiAgLSBDb2xvclV0aWxzLkNvbG9yXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byBsb29rIHVwIGl0cyBhc3NvY2lhdGVkIG9iamVjdFxuICAgKiBAcmV0dXJuIHthbnl9IFJldHVybnMgdGhlIG9iamVjdCBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2VcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRPYmplY3Q8VD4oa2V5OiBzdHJpbmcpOiBUIHtcbiAgICBpZiAoU3RvcmFnZVV0aWxzLmhhc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICBsZXQganNvbiA9IGdldEl0ZW0oa2V5KTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBsZXQgb2JqZWN0ID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgcmV0dXJuIDxUPm9iamVjdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3RyaW5nVXRpbHMge1xuXG4gIGV4cG9ydCBsZXQgRk9STUFUX0hITU1TUzogc3RyaW5nID0gJ2hoOm1tOnNzJztcbiAgZXhwb3J0IGxldCBGT1JNQVRfTU1TUzogc3RyaW5nID0gJ21tOnNzJztcblxuICAvKipcbiAgICogRm9ybWF0cyBhIG51bWJlciBvZiBzZWNvbmRzIGludG8gYSB0aW1lIHN0cmluZyB3aXRoIHRoZSBwYXR0ZXJuIGhoOm1tOnNzLlxuICAgKlxuICAgKiBAcGFyYW0gdG90YWxTZWNvbmRzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2Vjb25kcyB0byBmb3JtYXQgdG8gc3RyaW5nXG4gICAqIEBwYXJhbSBmb3JtYXQgdGhlIHRpbWUgZm9ybWF0IHRvIG91dHB1dCAoZGVmYXVsdDogaGg6bW06c3MpXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBmb3JtYXR0ZWQgdGltZSBzdHJpbmdcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBzZWNvbmRzVG9UaW1lKHRvdGFsU2Vjb25kczogbnVtYmVyLCBmb3JtYXQ6IHN0cmluZyA9IEZPUk1BVF9ISE1NU1MpOiBzdHJpbmcge1xuICAgIGxldCBpc05lZ2F0aXZlID0gdG90YWxTZWNvbmRzIDwgMDtcblxuICAgIGlmIChpc05lZ2F0aXZlKSB7XG4gICAgICAvLyBJZiB0aGUgdGltZSBpcyBuZWdhdGl2ZSwgd2UgbWFrZSBpdCBwb3NpdGl2ZSBmb3IgdGhlIGNhbGN1bGF0aW9uIGJlbG93XG4gICAgICAvLyAoZWxzZSB3ZSdkIGdldCBhbGwgbmVnYXRpdmUgbnVtYmVycykgYW5kIHJlYXR0YWNoIHRoZSBuZWdhdGl2ZSBzaWduIGxhdGVyLlxuICAgICAgdG90YWxTZWNvbmRzID0gLXRvdGFsU2Vjb25kcztcbiAgICB9XG5cbiAgICAvLyBTcGxpdCBpbnRvIHNlcGFyYXRlIHRpbWUgcGFydHNcbiAgICBsZXQgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDM2MDApO1xuICAgIGxldCBtaW51dGVzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyA2MCkgLSBob3VycyAqIDYwO1xuICAgIGxldCBzZWNvbmRzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMpICUgNjA7XG5cbiAgICByZXR1cm4gKGlzTmVnYXRpdmUgPyAnLScgOiAnJykgKyBmb3JtYXRcbiAgICAgICAgLnJlcGxhY2UoJ2hoJywgbGVmdFBhZFdpdGhaZXJvcyhob3VycywgMikpXG4gICAgICAgIC5yZXBsYWNlKCdtbScsIGxlZnRQYWRXaXRoWmVyb3MobWludXRlcywgMikpXG4gICAgICAgIC5yZXBsYWNlKCdzcycsIGxlZnRQYWRXaXRoWmVyb3Moc2Vjb25kcywgMikpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHNlY29uZHNUb1RleHQodG90YWxTZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB0b3RhbFNlY29uZHMgPCAwO1xuXG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIC8vIElmIHRoZSB0aW1lIGlzIG5lZ2F0aXZlLCB3ZSBtYWtlIGl0IHBvc2l0aXZlIGZvciB0aGUgY2FsY3VsYXRpb24gYmVsb3dcbiAgICAgIC8vIChlbHNlIHdlJ2QgZ2V0IGFsbCBuZWdhdGl2ZSBudW1iZXJzKSBhbmQgcmVhdHRhY2ggdGhlIG5lZ2F0aXZlIHNpZ24gbGF0ZXIuXG4gICAgICB0b3RhbFNlY29uZHMgPSAtdG90YWxTZWNvbmRzO1xuICAgIH1cblxuICAgIC8vIFNwbGl0IGludG8gc2VwYXJhdGUgdGltZSBwYXJ0c1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyA2MCkgLSBob3VycyAqIDYwO1xuICAgIGNvbnN0IHNlY29uZHMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcykgJSA2MDtcblxuICAgIHJldHVybiAoaXNOZWdhdGl2ZSA/ICctJyA6ICcnKSArXG4gICAgKGhvdXJzICE9PSAwID8gYCR7bGVmdFBhZFdpdGhaZXJvcyhob3VycywgMil9ICR7aTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy50aW1lLmhvdXJzJykpfSBgIDogJycpICtcbiAgICAobWludXRlcyAhPT0gMCA/IGAke2xlZnRQYWRXaXRoWmVyb3MobWludXRlcywgMil9ICR7aTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy50aW1lLm1pbnV0ZXMnKSl9IGAgOiAnJykgK1xuICAgIGAke2xlZnRQYWRXaXRoWmVyb3Moc2Vjb25kcywgMil9ICR7aTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy50aW1lLnNlY29uZHMnKSl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIG51bWJlciB0byBhIHN0cmluZyBhbmQgbGVmdC1wYWRzIGl0IHdpdGggemVyb3MgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguXG4gICAqIEV4YW1wbGU6IGxlZnRQYWRXaXRoWmVyb3MoMTIzLCA1KSA9PiAnMDAxMjMnXG4gICAqXG4gICAqIEBwYXJhbSBudW0gdGhlIG51bWJlciB0byBjb252ZXJ0IHRvIHN0cmluZyBhbmQgcGFkIHdpdGggemVyb3NcbiAgICogQHBhcmFtIGxlbmd0aCB0aGUgZGVzaXJlZCBsZW5ndGggb2YgdGhlIHBhZGRlZCBzdHJpbmdcbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHBhZGRlZCBudW1iZXIgYXMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiBsZWZ0UGFkV2l0aFplcm9zKG51bTogbnVtYmVyIHwgc3RyaW5nLCBsZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgbGV0IHRleHQgPSBudW0gKyAnJztcbiAgICBsZXQgcGFkZGluZyA9ICcwMDAwMDAwMDAwJy5zdWJzdHIoMCwgbGVuZ3RoIC0gdGV4dC5sZW5ndGgpO1xuICAgIHJldHVybiBwYWRkaW5nICsgdGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWxscyBvdXQgcGxhY2Vob2xkZXJzIGluIGFuIGFkIG1lc3NhZ2UuXG4gICAqXG4gICAqIEhhcyB0aGUgcGxhY2Vob2xkZXJzICd7cmVtYWluaW5nVGltZVtmb3JtYXRTdHJpbmddfScsICd7cGxheWVkVGltZVtmb3JtYXRTdHJpbmddfScgYW5kXG4gICAqICd7YWREdXJhdGlvbltmb3JtYXRTdHJpbmddfScsIHdoaWNoIGFyZSByZXBsYWNlZCBieSB0aGUgcmVtYWluaW5nIHRpbWUgdW50aWwgdGhlIGFkIGNhbiBiZSBza2lwcGVkLCB0aGUgY3VycmVudFxuICAgKiB0aW1lIG9yIHRoZSBhZCBkdXJhdGlvbi4gVGhlIGZvcm1hdCBzdHJpbmcgaXMgb3B0aW9uYWwuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBwbGFjZWhvbGRlciBpcyByZXBsYWNlZCBieSB0aGUgdGltZVxuICAgKiBpbiBzZWNvbmRzLiBJZiBzcGVjaWZpZWQsIGl0IG11c3QgYmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAqIC0gJWQgLSBJbnNlcnRzIHRoZSB0aW1lIGFzIGFuIGludGVnZXIuXG4gICAqIC0gJTBOZCAtIEluc2VydHMgdGhlIHRpbWUgYXMgYW4gaW50ZWdlciB3aXRoIGxlYWRpbmcgemVyb2VzLCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSB0aW1lIHN0cmluZyBpcyBzbWFsbGVyIHRoYW4gTi5cbiAgICogLSAlZiAtIEluc2VydHMgdGhlIHRpbWUgYXMgYSBmbG9hdC5cbiAgICogLSAlME5mIC0gSW5zZXJ0cyB0aGUgdGltZSBhcyBhIGZsb2F0IHdpdGggbGVhZGluZyB6ZXJvZXMuXG4gICAqIC0gJS5NZiAtIEluc2VydHMgdGhlIHRpbWUgYXMgYSBmbG9hdCB3aXRoIE0gZGVjaW1hbCBwbGFjZXMuIENhbiBiZSBjb21iaW5lZCB3aXRoICUwTmYsIGUuZy4gJTA0LjJmICh0aGUgdGltZVxuICAgKiAxMC4xMjMgd291bGQgYmUgcHJpbnRlZCBhcyAwMDEwLjEyKS5cbiAgICogLSAlaGg6bW06c3NcbiAgICogLSAlbW06c3NcbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqIC0geyB0ZXh0OiAnQWQ6IHtyZW1haW5pbmdUaW1lJW1tOnNzfSBzZWNzJyB9XG4gICAqIEFuIGlucHV0IHZhbHVlIG9mIDEwMCB3b3VsZCBiZSBkaXNwbGF5ZWQgYXM6ICdBZDogMDE6NDAgc2VjcydcbiAgICogLSB7IHRleHQ6ICdBZDoge3JlbWFpbmluZ1RpbWUlZn0gc2VjcycgfVxuICAgKiBBbiBpbnB1dCB2YWx1ZSBvZiAxMDAgd291bGQgYmUgZGlzcGxheWVkIGFzOiAnQWQ6IDEwMC4wIHNlY3MnXG4gICAqXG4gICAqIEBwYXJhbSBhZE1lc3NhZ2UgYW4gYWQgbWVzc2FnZSB3aXRoIG9wdGlvbmFsIHBsYWNlaG9sZGVycyB0byBmaWxsXG4gICAqIEBwYXJhbSBza2lwT2Zmc2V0IGlmIHNwZWNpZmllZCwge3JlbWFpbmluZ1RpbWV9IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHJlbWFpbmluZyB0aW1lIHVudGlsIHRoZSBhZCBjYW4gYmUgc2tpcHBlZFxuICAgKiBAcGFyYW0gcGxheWVyIHRoZSBwbGF5ZXIgdG8gZ2V0IHRoZSB0aW1lIGRhdGEgZnJvbVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgYWQgbWVzc2FnZSB3aXRoIGZpbGxlZCBwbGFjZWhvbGRlcnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZXBsYWNlQWRNZXNzYWdlUGxhY2Vob2xkZXJzKGFkTWVzc2FnZTogc3RyaW5nLCBza2lwT2Zmc2V0OiBudW1iZXIsIHBsYXllcjogUGxheWVyQVBJKSB7XG4gICAgbGV0IGFkTWVzc2FnZVBsYWNlaG9sZGVyUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgJ1xcXFx7KHJlbWFpbmluZ1RpbWV8cGxheWVkVGltZXxhZER1cmF0aW9uKSh9fCUoKDBbMS05XVxcXFxkKihcXFxcLlxcXFxkKyhkfGYpfGR8Zil8XFxcXC5cXFxcZCtmfGR8Zil8aGg6bW06c3N8bW06c3MpfSknLFxuICAgICAgJ2cnLFxuICAgICk7XG5cbiAgICByZXR1cm4gYWRNZXNzYWdlLnJlcGxhY2UoYWRNZXNzYWdlUGxhY2Vob2xkZXJSZWdleCwgKGZvcm1hdFN0cmluZykgPT4ge1xuICAgICAgbGV0IHRpbWUgPSAwO1xuICAgICAgaWYgKGZvcm1hdFN0cmluZy5pbmRleE9mKCdyZW1haW5pbmdUaW1lJykgPiAtMSkge1xuICAgICAgICBpZiAoc2tpcE9mZnNldCkge1xuICAgICAgICAgIHRpbWUgPSBNYXRoLmNlaWwoc2tpcE9mZnNldCAtIHBsYXllci5nZXRDdXJyZW50VGltZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aW1lID0gcGxheWVyLmdldER1cmF0aW9uKCkgLSBwbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmb3JtYXRTdHJpbmcuaW5kZXhPZigncGxheWVkVGltZScpID4gLTEpIHtcbiAgICAgICAgdGltZSA9IHBsYXllci5nZXRDdXJyZW50VGltZSgpO1xuICAgICAgfSBlbHNlIGlmIChmb3JtYXRTdHJpbmcuaW5kZXhPZignYWREdXJhdGlvbicpID4gLTEpIHtcbiAgICAgICAgdGltZSA9IHBsYXllci5nZXREdXJhdGlvbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcihNYXRoLnJvdW5kKHRpbWUpLCBmb3JtYXRTdHJpbmcpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0TnVtYmVyKHRpbWU6IG51bWJlciwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgICBsZXQgZm9ybWF0U3RyaW5nVmFsaWRhdGlvblJlZ2V4ID0gLyUoKDBbMS05XVxcZCooXFwuXFxkKyhkfGYpfGR8Zil8XFwuXFxkK2Z8ZHxmKXxoaDptbTpzc3xtbTpzcykvO1xuICAgIGxldCBsZWFkaW5nWmVyb2VzUmVnZXggPSAvKCUwWzEtOV1cXGQqKSg/PShcXC5cXGQrZnxmfGQpKS87XG4gICAgbGV0IGRlY2ltYWxQbGFjZXNSZWdleCA9IC9cXC5cXGQqKD89ZikvO1xuXG4gICAgaWYgKCFmb3JtYXRTdHJpbmdWYWxpZGF0aW9uUmVnZXgudGVzdChmb3JtYXQpKSB7XG4gICAgICAvLyBJZiB0aGUgZm9ybWF0IGlzIGludmFsaWQsIHdlIHNldCBhIGRlZmF1bHQgZmFsbGJhY2sgZm9ybWF0XG4gICAgICBmb3JtYXQgPSAnJWQnO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3NcbiAgICBsZXQgbGVhZGluZ1plcm9lcyA9IDA7XG4gICAgbGV0IGxlYWRpbmdaZXJvZXNNYXRjaGVzID0gZm9ybWF0Lm1hdGNoKGxlYWRpbmdaZXJvZXNSZWdleCk7XG4gICAgaWYgKGxlYWRpbmdaZXJvZXNNYXRjaGVzKSB7XG4gICAgICBsZWFkaW5nWmVyb2VzID0gcGFyc2VJbnQobGVhZGluZ1plcm9lc01hdGNoZXNbMF0uc3Vic3RyaW5nKDIpKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuICAgIGxldCBudW1EZWNpbWFsUGxhY2VzID0gbnVsbDtcbiAgICBsZXQgZGVjaW1hbFBsYWNlc01hdGNoZXMgPSBmb3JtYXQubWF0Y2goZGVjaW1hbFBsYWNlc1JlZ2V4KTtcbiAgICBpZiAoZGVjaW1hbFBsYWNlc01hdGNoZXMgJiYgIWlzTmFOKHBhcnNlSW50KGRlY2ltYWxQbGFjZXNNYXRjaGVzWzBdLnN1YnN0cmluZygxKSkpKSB7XG4gICAgICBudW1EZWNpbWFsUGxhY2VzID0gcGFyc2VJbnQoZGVjaW1hbFBsYWNlc01hdGNoZXNbMF0uc3Vic3RyaW5nKDEpKTtcbiAgICAgIGlmIChudW1EZWNpbWFsUGxhY2VzID4gMjApIHtcbiAgICAgICAgbnVtRGVjaW1hbFBsYWNlcyA9IDIwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZsb2F0IGZvcm1hdFxuICAgIGlmIChmb3JtYXQuaW5kZXhPZignZicpID4gLTEpIHtcbiAgICAgIGxldCB0aW1lU3RyaW5nID0gJyc7XG5cbiAgICAgIGlmIChudW1EZWNpbWFsUGxhY2VzICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEFwcGx5IGZpeGVkIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuICAgICAgICB0aW1lU3RyaW5nID0gdGltZS50b0ZpeGVkKG51bURlY2ltYWxQbGFjZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGltZVN0cmluZyA9ICcnICsgdGltZTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgbGVhZGluZyB6ZXJvc1xuICAgICAgaWYgKHRpbWVTdHJpbmcuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIGxlZnRQYWRXaXRoWmVyb3ModGltZVN0cmluZywgdGltZVN0cmluZy5sZW5ndGggKyAobGVhZGluZ1plcm9lcyAtIHRpbWVTdHJpbmcuaW5kZXhPZignLicpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbGVmdFBhZFdpdGhaZXJvcyh0aW1lU3RyaW5nLCBsZWFkaW5nWmVyb2VzKTtcbiAgICAgIH1cblxuICAgIH1cbiAgICAvLyBUaW1lIGZvcm1hdFxuICAgIGVsc2UgaWYgKGZvcm1hdC5pbmRleE9mKCc6JykgPiAtMSkge1xuICAgICAgbGV0IHRvdGFsU2Vjb25kcyA9IE1hdGguY2VpbCh0aW1lKTtcblxuICAgICAgLy8gaGg6bW06c3MgZm9ybWF0XG4gICAgICBpZiAoZm9ybWF0LmluZGV4T2YoJ2hoJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gc2Vjb25kc1RvVGltZSh0b3RhbFNlY29uZHMpO1xuICAgICAgfVxuICAgICAgLy8gbW06c3MgZm9ybWF0XG4gICAgICBlbHNlIHtcbiAgICAgICAgbGV0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDYwKTtcbiAgICAgICAgbGV0IHNlY29uZHMgPSB0b3RhbFNlY29uZHMgJSA2MDtcblxuICAgICAgICByZXR1cm4gbGVmdFBhZFdpdGhaZXJvcyhtaW51dGVzLCAyKSArICc6JyArIGxlZnRQYWRXaXRoWmVyb3Moc2Vjb25kcywgMik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEludGVnZXIgZm9ybWF0XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbGVmdFBhZFdpdGhaZXJvcyhNYXRoLmNlaWwodGltZSksIGxlYWRpbmdaZXJvZXMpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTGlzdEl0ZW0sIExpc3RTZWxlY3RvciwgTGlzdFNlbGVjdG9yQ29uZmlnIH0gZnJvbSAnLi9jb21wb25lbnRzL2xpc3RzZWxlY3Rvcic7XG5pbXBvcnQgeyBVSUluc3RhbmNlTWFuYWdlciB9IGZyb20gJy4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSwgU3VidGl0bGVFdmVudCwgU3VidGl0bGVUcmFjayB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBhbGwgc3VidGl0bGUgcmVsYXRlZCBldmVudHNcbiAqXG4gKiBUaGlzIGNsYXNzIGxpc3RlbnMgdG8gcGxheWVyIGV2ZW50cyBhcyB3ZWxsIGFzIHRoZSBgTGlzdFNlbGVjdG9yYCBldmVudCBpZiBzZWxlY3Rpb24gY2hhbmdlZFxuICovXG5leHBvcnQgY2xhc3MgU3VidGl0bGVTd2l0Y2hIYW5kbGVyIHtcblxuICBwcml2YXRlIHN0YXRpYyBTVUJUSVRMRVNfT0ZGX0tFWTogc3RyaW5nID0gJ251bGwnO1xuXG4gIHByaXZhdGUgcGxheWVyOiBQbGF5ZXJBUEk7XG4gIHByaXZhdGUgbGlzdEVsZW1lbnQ6IExpc3RTZWxlY3RvcjxMaXN0U2VsZWN0b3JDb25maWc+O1xuICBwcml2YXRlIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXJBUEksIGVsZW1lbnQ6IExpc3RTZWxlY3RvcjxMaXN0U2VsZWN0b3JDb25maWc+LCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKSB7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy5saXN0RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy51aW1hbmFnZXIgPSB1aW1hbmFnZXI7XG5cbiAgICB0aGlzLmJpbmRTZWxlY3Rpb25FdmVudCgpO1xuICAgIHRoaXMuYmluZFBsYXllckV2ZW50cygpO1xuICAgIHRoaXMucmVmcmVzaFN1YnRpdGxlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kU2VsZWN0aW9uRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5saXN0RWxlbWVudC5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUoKF8sIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFRPRE8gYWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbmN1cnJlbnQgc3VidGl0bGUgc2VsZWN0aW9uc1xuICAgICAgaWYgKHZhbHVlID09PSBTdWJ0aXRsZVN3aXRjaEhhbmRsZXIuU1VCVElUTEVTX09GRl9LRVkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN1YnRpdGxlID0gdGhpcy5wbGF5ZXIuc3VidGl0bGVzLmxpc3QoKS5maWx0ZXIoKHN1YnRpdGxlKSA9PiBzdWJ0aXRsZS5lbmFibGVkKS5wb3AoKTtcbiAgICAgICAgaWYgKGN1cnJlbnRTdWJ0aXRsZSkge1xuICAgICAgICAgIHRoaXMucGxheWVyLnN1YnRpdGxlcy5kaXNhYmxlKGN1cnJlbnRTdWJ0aXRsZS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGxheWVyLnN1YnRpdGxlcy5lbmFibGUodmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kUGxheWVyRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3VidGl0bGVBZGRlZCwgdGhpcy5hZGRTdWJ0aXRsZSk7XG4gICAgdGhpcy5wbGF5ZXIub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TdWJ0aXRsZUVuYWJsZWQsIHRoaXMuc2VsZWN0Q3VycmVudFN1YnRpdGxlKTtcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlN1YnRpdGxlRGlzYWJsZWQsIHRoaXMuc2VsZWN0Q3VycmVudFN1YnRpdGxlKTtcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlN1YnRpdGxlUmVtb3ZlZCwgdGhpcy5yZW1vdmVTdWJ0aXRsZSk7XG4gICAgLy8gVXBkYXRlIHN1YnRpdGxlcyB3aGVuIHNvdXJjZSBnb2VzIGF3YXlcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZVVubG9hZGVkLCB0aGlzLmNsZWFyU3VidGl0bGVzKTtcbiAgICAvLyBVcGRhdGUgc3VidGl0bGVzIHdoZW4gdGhlIHBlcmlvZCB3aXRoaW4gYSBzb3VyY2UgY2hhbmdlc1xuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGVyaW9kU3dpdGNoZWQsIHRoaXMucmVmcmVzaFN1YnRpdGxlcyk7XG4gICAgdGhpcy51aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUodGhpcy5yZWZyZXNoU3VidGl0bGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkU3VidGl0bGUgPSAoZXZlbnQ6IFN1YnRpdGxlRXZlbnQpID0+IHtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IGV2ZW50LnN1YnRpdGxlO1xuICAgIGlmICghdGhpcy5saXN0RWxlbWVudC5oYXNJdGVtKHN1YnRpdGxlLmlkKSkge1xuICAgICAgdGhpcy5saXN0RWxlbWVudC5hZGRJdGVtKHN1YnRpdGxlLmlkLCBzdWJ0aXRsZS5sYWJlbCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgcmVtb3ZlU3VidGl0bGUgPSAoZXZlbnQ6IFN1YnRpdGxlRXZlbnQpID0+IHtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IGV2ZW50LnN1YnRpdGxlO1xuICAgIGlmICh0aGlzLmxpc3RFbGVtZW50Lmhhc0l0ZW0oc3VidGl0bGUuaWQpKSB7XG4gICAgICB0aGlzLmxpc3RFbGVtZW50LnJlbW92ZUl0ZW0oc3VidGl0bGUuaWQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHNlbGVjdEN1cnJlbnRTdWJ0aXRsZSA9ICgpID0+IHtcbiAgICBpZiAoIXRoaXMucGxheWVyLnN1YnRpdGxlcykge1xuICAgICAgLy8gU3VidGl0bGVzIEFQSSBub3QgYXZhaWxhYmxlICh5ZXQpXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRTdWJ0aXRsZSA9IHRoaXMucGxheWVyLnN1YnRpdGxlcy5saXN0KCkuZmlsdGVyKChzdWJ0aXRsZSkgPT4gc3VidGl0bGUuZW5hYmxlZCkucG9wKCk7XG4gICAgdGhpcy5saXN0RWxlbWVudC5zZWxlY3RJdGVtKGN1cnJlbnRTdWJ0aXRsZSA/IGN1cnJlbnRTdWJ0aXRsZS5pZCA6IFN1YnRpdGxlU3dpdGNoSGFuZGxlci5TVUJUSVRMRVNfT0ZGX0tFWSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBjbGVhclN1YnRpdGxlcyA9ICgpID0+IHtcbiAgICB0aGlzLmxpc3RFbGVtZW50LmNsZWFySXRlbXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFN1YnRpdGxlcyA9ICgpID0+IHtcbiAgICBpZiAoIXRoaXMucGxheWVyLnN1YnRpdGxlcykge1xuICAgICAgLy8gU3VidGl0bGVzIEFQSSBub3QgYXZhaWxhYmxlICh5ZXQpXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2ZmTGlzdEl0ZW06IExpc3RJdGVtID0ge1xuICAgICAga2V5OiBTdWJ0aXRsZVN3aXRjaEhhbmRsZXIuU1VCVElUTEVTX09GRl9LRVksXG4gICAgICBsYWJlbDogaTE4bi5nZXRMb2NhbGl6ZXIoJ29mZicpLFxuICAgIH07XG5cbiAgICBjb25zdCBzdWJ0aXRsZXMgPSB0aGlzLnBsYXllci5zdWJ0aXRsZXMubGlzdCgpO1xuICAgIGNvbnN0IHN1YnRpdGxlVG9MaXN0SXRlbSA9IChzdWJ0aXRsZTogU3VidGl0bGVUcmFjayk6IExpc3RJdGVtID0+IHtcbiAgICAgIHJldHVybiB7IGtleTogc3VidGl0bGUuaWQsIGxhYmVsOiBzdWJ0aXRsZS5sYWJlbCB9O1xuICAgIH07XG5cbiAgICB0aGlzLmxpc3RFbGVtZW50LnN5bmNocm9uaXplSXRlbXMoW1xuICAgICAgb2ZmTGlzdEl0ZW0sIC4uLnN1YnRpdGxlcy5tYXAoc3VidGl0bGVUb0xpc3RJdGVtKSxcbiAgICBdKTtcbiAgICB0aGlzLnNlbGVjdEN1cnJlbnRTdWJ0aXRsZSgpO1xuICB9O1xufVxuIiwiLy8gVE9ETyBjaGFuZ2UgdG8gaW50ZXJuYWwgKG5vdCBleHBvcnRlZCkgY2xhc3MsIGhvdyB0byB1c2UgaW4gb3RoZXIgZmlsZXM/XG4vKipcbiAqIEV4ZWN1dGVzIGEgY2FsbGJhY2sgYWZ0ZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUsIG9wdGlvbmFsbHkgcmVwZWF0ZWRseSB1bnRpbCBzdG9wcGVkLlxuICovXG5leHBvcnQgY2xhc3MgVGltZW91dCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWxheTogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcGVhdDogYm9vbGVhbjtcbiAgLy8gVGhlcmUncyB0d28gc2V0VGltZW91dCBkZWNsYXJhdGlvbnMsIG9uZSBvbiBXaW5kb3cgd2hpY2ggcmV0dXJucyB0eXBlIFwibnVtYmVyXCIgYW5kIG9uZSBpbiBOb2RlSlMgd2hpY2ggcmV0dXJuc1xuICAvLyB0eXBlIFwiVGltZXJcIi4gRm9yIHVua25vd24gcmVhc29ucyBidWlsZHMgb24gSmVua2lucyBmYWlsIGR1ZSB0byBhIHR5cGUgbWlzbWF0Y2ggd2hlbiB3ZSB1c2UgdHlwZSBcIm51bWJlclwiIGhlcmUsXG4gIC8vIGFsdGhvdWdoIGl0IHdvcmtzIG9uIG90aGVyIHBsYXRmb3JtcyAoZS5nLiBXaW5kb3dzLCBDb2Rlc2hpcCkuXG4gIC8vIFRvIHdvcmsgYXJvdW5kIHRoZSBpc3N1ZSB3ZSB1c2UgdHlwZSBcImFueVwiLiBUaGUgdHlwZSBkb2VzIG5vdCBtYXR0ZXIgYW55d2F5IGJlY2F1c2Ugd2UncmUgbm90IHdvcmtpbmcgd2l0aFxuICAvLyB0aGlzIHZhbHVlIGV4Y2VwdCBwcm92aWRpbmcgaXQgdG8gY2xlYXJUaW1lb3V0LlxuICBwcml2YXRlIHRpbWVvdXRPckludGVydmFsSWQ6IGFueTtcbiAgcHJpdmF0ZSBhY3RpdmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGltZW91dCBjYWxsYmFjayBoYW5kbGVyLlxuICAgKiBAcGFyYW0gZGVsYXkgdGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgY2FsbGJhY2sgc2hvdWxkIGJlIGV4ZWN1dGVkXG4gICAqIEBwYXJhbSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBhZnRlciB0aGUgZGVsYXkgdGltZVxuICAgKiBAcGFyYW0gcmVwZWF0IGlmIHRydWUsIGNhbGwgdGhlIGNhbGxiYWNrIHJlcGVhdGVkbHkgaW4gZGVsYXkgaW50ZXJ2YWxzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkZWxheTogbnVtYmVyLCBjYWxsYmFjazogKCkgPT4gdm9pZCwgcmVwZWF0OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMucmVwZWF0ID0gcmVwZWF0O1xuICAgIHRoaXMudGltZW91dE9ySW50ZXJ2YWxJZCA9IDA7XG4gICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHRpbWVvdXQgYW5kIGNhbGxzIHRoZSBjYWxsYmFjayB3aGVuIHRoZSB0aW1lb3V0IGRlbGF5IGhhcyBwYXNzZWQuXG4gICAqIEByZXR1cm5zIHtUaW1lb3V0fSB0aGUgY3VycmVudCB0aW1lb3V0IChzbyB0aGUgc3RhcnQgY2FsbCBjYW4gYmUgY2hhaW5lZCB0byB0aGUgY29uc3RydWN0b3IpXG4gICAqL1xuICBzdGFydCgpOiB0aGlzIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSB0aW1lb3V0LiBUaGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkIGlmIGNsZWFyIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHRpbWVvdXQuXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFySW50ZXJuYWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHBhc3NlZCB0aW1lb3V0IGRlbGF5IHRvIHplcm8uIENhbiBiZSB1c2VkIHRvIGRlZmVyIHRoZSBjYWxsaW5nIG9mIHRoZSBjYWxsYmFjay5cbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJJbnRlcm5hbCgpO1xuXG4gICAgaWYgKHRoaXMucmVwZWF0KSB7XG4gICAgICB0aGlzLnRpbWVvdXRPckludGVydmFsSWQgPSBzZXRJbnRlcnZhbCh0aGlzLmNhbGxiYWNrLCB0aGlzLmRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aW1lb3V0T3JJbnRlcnZhbElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FsbGJhY2soKTtcbiAgICAgIH0sIHRoaXMuZGVsYXkpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gIH1cblxuICBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gIH1cblxuICBwcml2YXRlIGNsZWFySW50ZXJuYWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVwZWF0KSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMudGltZW91dE9ySW50ZXJ2YWxJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRPckludGVydmFsSWQpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG59IiwiaW1wb3J0IHsgU3VidGl0bGVPdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlb3ZlcmxheSc7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsUGFnZSB9IGZyb20gJy4vY29tcG9uZW50cy9zZXR0aW5nc3BhbmVscGFnZSc7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsSXRlbSB9IGZyb20gJy4vY29tcG9uZW50cy9zZXR0aW5nc3BhbmVsaXRlbSc7XG5pbXBvcnQgeyBWaWRlb1F1YWxpdHlTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvdmlkZW9xdWFsaXR5c2VsZWN0Ym94JztcbmltcG9ydCB7IFBsYXliYWNrU3BlZWRTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvcGxheWJhY2tzcGVlZHNlbGVjdGJveCc7XG5pbXBvcnQgeyBBdWRpb1RyYWNrU2VsZWN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL2F1ZGlvdHJhY2tzZWxlY3Rib3gnO1xuaW1wb3J0IHsgQXVkaW9RdWFsaXR5U2VsZWN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL2F1ZGlvcXVhbGl0eXNlbGVjdGJveCc7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzcGFuZWwnO1xuaW1wb3J0IHsgU3VidGl0bGVTZXR0aW5nc1BhbmVsUGFnZSB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NwYW5lbHBhZ2UnO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbFBhZ2VPcGVuQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzcGFuZWxwYWdlb3BlbmJ1dHRvbic7XG5pbXBvcnQgeyBTdWJ0aXRsZVNldHRpbmdzTGFiZWwgfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9zdWJ0aXRsZXNldHRpbmdzbGFiZWwnO1xuaW1wb3J0IHsgU3VidGl0bGVTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZWxlY3Rib3gnO1xuaW1wb3J0IHsgQ29udHJvbEJhciB9IGZyb20gJy4vY29tcG9uZW50cy9jb250cm9sYmFyJztcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gJy4vY29tcG9uZW50cy9jb250YWluZXInO1xuaW1wb3J0IHsgUGxheWJhY2tUaW1lTGFiZWwsIFBsYXliYWNrVGltZUxhYmVsTW9kZSB9IGZyb20gJy4vY29tcG9uZW50cy9wbGF5YmFja3RpbWVsYWJlbCc7XG5pbXBvcnQgeyBTZWVrQmFyIH0gZnJvbSAnLi9jb21wb25lbnRzL3NlZWtiYXInO1xuaW1wb3J0IHsgU2Vla0JhckxhYmVsIH0gZnJvbSAnLi9jb21wb25lbnRzL3NlZWtiYXJsYWJlbCc7XG5pbXBvcnQgeyBQbGF5YmFja1RvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9wbGF5YmFja3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQgeyBWb2x1bWVUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvdm9sdW1ldG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7IFZvbHVtZVNsaWRlciB9IGZyb20gJy4vY29tcG9uZW50cy92b2x1bWVzbGlkZXInO1xuaW1wb3J0IHsgU3BhY2VyIH0gZnJvbSAnLi9jb21wb25lbnRzL3NwYWNlcic7XG5pbXBvcnQgeyBQaWN0dXJlSW5QaWN0dXJlVG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3BpY3R1cmVpbnBpY3R1cmV0b2dnbGVidXR0b24nO1xuaW1wb3J0IHsgQWlyUGxheVRvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9haXJwbGF5dG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7IENhc3RUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvY2FzdHRvZ2dsZWJ1dHRvbic7XG5pbXBvcnQgeyBWUlRvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy92cnRvZ2dsZWJ1dHRvbic7XG5pbXBvcnQgeyBTZXR0aW5nc1RvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9zZXR0aW5nc3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQgeyBGdWxsc2NyZWVuVG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2Z1bGxzY3JlZW50b2dnbGVidXR0b24nO1xuaW1wb3J0IHsgVUlDb250YWluZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvdWljb250YWluZXInO1xuaW1wb3J0IHsgQnVmZmVyaW5nT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9idWZmZXJpbmdvdmVybGF5JztcbmltcG9ydCB7IFBsYXliYWNrVG9nZ2xlT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9wbGF5YmFja3RvZ2dsZW92ZXJsYXknO1xuaW1wb3J0IHsgQ2FzdFN0YXR1c092ZXJsYXkgfSBmcm9tICcuL2NvbXBvbmVudHMvY2FzdHN0YXR1c292ZXJsYXknO1xuaW1wb3J0IHsgVGl0bGVCYXIgfSBmcm9tICcuL2NvbXBvbmVudHMvdGl0bGViYXInO1xuaW1wb3J0IHsgUmVjb21tZW5kYXRpb25PdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL3JlY29tbWVuZGF0aW9ub3ZlcmxheSc7XG5pbXBvcnQgeyBXYXRlcm1hcmsgfSBmcm9tICcuL2NvbXBvbmVudHMvd2F0ZXJtYXJrJztcbmltcG9ydCB7IEVycm9yTWVzc2FnZU92ZXJsYXkgfSBmcm9tICcuL2NvbXBvbmVudHMvZXJyb3JtZXNzYWdlb3ZlcmxheSc7XG5pbXBvcnQgeyBBZENsaWNrT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9hZGNsaWNrb3ZlcmxheSc7XG5pbXBvcnQgeyBBZE1lc3NhZ2VMYWJlbCB9IGZyb20gJy4vY29tcG9uZW50cy9hZG1lc3NhZ2VsYWJlbCc7XG5pbXBvcnQgeyBBZFNraXBCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvYWRza2lwYnV0dG9uJztcbmltcG9ydCB7IENsb3NlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2Nsb3NlYnV0dG9uJztcbmltcG9ydCB7IE1ldGFkYXRhTGFiZWwsIE1ldGFkYXRhTGFiZWxDb250ZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21ldGFkYXRhbGFiZWwnO1xuaW1wb3J0IHsgUGxheWVyVXRpbHMgfSBmcm9tICcuL3BsYXllcnV0aWxzJztcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnLi9jb21wb25lbnRzL2xhYmVsJztcbmltcG9ydCB7IENhc3RVSUNvbnRhaW5lciB9IGZyb20gJy4vY29tcG9uZW50cy9jYXN0dWljb250YWluZXInO1xuaW1wb3J0IHsgVUlDb25kaXRpb25Db250ZXh0LCBVSU1hbmFnZXIgfSBmcm9tICcuL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBVSUNvbmZpZyB9IGZyb20gJy4vdWljb25maWcnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuL2xvY2FsaXphdGlvbi9pMThuJztcblxuZXhwb3J0IG5hbWVzcGFjZSBVSUZhY3Rvcnkge1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBidWlsZERlZmF1bHRVSShwbGF5ZXI6IFBsYXllckFQSSwgY29uZmlnOiBVSUNvbmZpZyA9IHt9KTogVUlNYW5hZ2VyIHtcbiAgICByZXR1cm4gVUlGYWN0b3J5LmJ1aWxkTW9kZXJuVUkocGxheWVyLCBjb25maWcpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGVmYXVsdFNtYWxsU2NyZWVuVUkocGxheWVyOiBQbGF5ZXJBUEksIGNvbmZpZzogVUlDb25maWcgPSB7fSk6IFVJTWFuYWdlciB7XG4gICAgcmV0dXJuIFVJRmFjdG9yeS5idWlsZE1vZGVyblNtYWxsU2NyZWVuVUkocGxheWVyLCBjb25maWcpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGVmYXVsdENhc3RSZWNlaXZlclVJKHBsYXllcjogUGxheWVyQVBJLCBjb25maWc6IFVJQ29uZmlnID0ge30pOiBVSU1hbmFnZXIge1xuICAgIHJldHVybiBVSUZhY3RvcnkuYnVpbGRNb2Rlcm5DYXN0UmVjZWl2ZXJVSShwbGF5ZXIsIGNvbmZpZyk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbW9kZXJuVUkoKSB7XG4gICAgbGV0IHN1YnRpdGxlT3ZlcmxheSA9IG5ldyBTdWJ0aXRsZU92ZXJsYXkoKTtcblxuICAgIGxldCBtYWluU2V0dGluZ3NQYW5lbFBhZ2UgPSBuZXcgU2V0dGluZ3NQYW5lbFBhZ2Uoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnZpZGVvLnF1YWxpdHknKSwgbmV3IFZpZGVvUXVhbGl0eVNlbGVjdEJveCgpKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzcGVlZCcpLCBuZXcgUGxheWJhY2tTcGVlZFNlbGVjdEJveCgpKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5hdWRpby50cmFjaycpLCBuZXcgQXVkaW9UcmFja1NlbGVjdEJveCgpKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5hdWRpby5xdWFsaXR5JyksIG5ldyBBdWRpb1F1YWxpdHlTZWxlY3RCb3goKSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgbGV0IHNldHRpbmdzUGFuZWwgPSBuZXcgU2V0dGluZ3NQYW5lbCh7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG1haW5TZXR0aW5nc1BhbmVsUGFnZSxcbiAgICAgIF0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgfSk7XG5cbiAgICBsZXQgc3VidGl0bGVTZXR0aW5nc1BhbmVsUGFnZSA9IG5ldyBTdWJ0aXRsZVNldHRpbmdzUGFuZWxQYWdlKHtcbiAgICAgIHNldHRpbmdzUGFuZWw6IHNldHRpbmdzUGFuZWwsXG4gICAgICBvdmVybGF5OiBzdWJ0aXRsZU92ZXJsYXksXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdWJ0aXRsZVNlbGVjdEJveCA9IG5ldyBTdWJ0aXRsZVNlbGVjdEJveCgpO1xuXG4gICAgbGV0IHN1YnRpdGxlU2V0dGluZ3NPcGVuQnV0dG9uID0gbmV3IFNldHRpbmdzUGFuZWxQYWdlT3BlbkJ1dHRvbih7XG4gICAgICB0YXJnZXRQYWdlOiBzdWJ0aXRsZVNldHRpbmdzUGFuZWxQYWdlLFxuICAgICAgY29udGFpbmVyOiBzZXR0aW5nc1BhbmVsLFxuICAgICAgYXJpYUxhYmVsOiBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzJyksXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcignb3BlbicpLFxuICAgIH0pO1xuXG4gICAgbWFpblNldHRpbmdzUGFuZWxQYWdlLmFkZENvbXBvbmVudChcbiAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbShcbiAgICAgICAgbmV3IFN1YnRpdGxlU2V0dGluZ3NMYWJlbCh7XG4gICAgICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcycpLFxuICAgICAgICAgIG9wZW5lcjogc3VidGl0bGVTZXR0aW5nc09wZW5CdXR0b24sXG4gICAgICAgIH0pLFxuICAgICAgICBzdWJ0aXRsZVNlbGVjdEJveCxcbiAgICAgICAge1xuICAgICAgICAgIHJvbGU6ICdtZW51YmFyJyxcbiAgICAgICAgfSxcbiAgICAgICkpO1xuXG4gICAgc2V0dGluZ3NQYW5lbC5hZGRDb21wb25lbnQoc3VidGl0bGVTZXR0aW5nc1BhbmVsUGFnZSk7XG5cbiAgICBsZXQgY29udHJvbEJhciA9IG5ldyBDb250cm9sQmFyKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgc2V0dGluZ3NQYW5lbCxcbiAgICAgICAgbmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgY29tcG9uZW50czogW1xuICAgICAgICAgICAgbmV3IFBsYXliYWNrVGltZUxhYmVsKHsgdGltZUxhYmVsTW9kZTogUGxheWJhY2tUaW1lTGFiZWxNb2RlLkN1cnJlbnRUaW1lLCBoaWRlSW5MaXZlUGxheWJhY2s6IHRydWUgfSksXG4gICAgICAgICAgICBuZXcgU2Vla0Jhcih7IGxhYmVsOiBuZXcgU2Vla0JhckxhYmVsKCkgfSksXG4gICAgICAgICAgICBuZXcgUGxheWJhY2tUaW1lTGFiZWwoeyB0aW1lTGFiZWxNb2RlOiBQbGF5YmFja1RpbWVMYWJlbE1vZGUuVG90YWxUaW1lLCBjc3NDbGFzc2VzOiBbJ3RleHQtcmlnaHQnXSB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGNzc0NsYXNzZXM6IFsnY29udHJvbGJhci10b3AnXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBDb250YWluZXIoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQbGF5YmFja1RvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IFZvbHVtZVRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IFZvbHVtZVNsaWRlcigpLFxuICAgICAgICAgICAgbmV3IFNwYWNlcigpLFxuICAgICAgICAgICAgbmV3IFBpY3R1cmVJblBpY3R1cmVUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgIG5ldyBBaXJQbGF5VG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgQ2FzdFRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IFZSVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgU2V0dGluZ3NUb2dnbGVCdXR0b24oeyBzZXR0aW5nc1BhbmVsOiBzZXR0aW5nc1BhbmVsIH0pLFxuICAgICAgICAgICAgbmV3IEZ1bGxzY3JlZW5Ub2dnbGVCdXR0b24oKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGNzc0NsYXNzZXM6IFsnY29udHJvbGJhci1ib3R0b20nXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBVSUNvbnRhaW5lcih7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIHN1YnRpdGxlT3ZlcmxheSxcbiAgICAgICAgbmV3IEJ1ZmZlcmluZ092ZXJsYXkoKSxcbiAgICAgICAgbmV3IFBsYXliYWNrVG9nZ2xlT3ZlcmxheSgpLFxuICAgICAgICBuZXcgQ2FzdFN0YXR1c092ZXJsYXkoKSxcbiAgICAgICAgY29udHJvbEJhcixcbiAgICAgICAgbmV3IFRpdGxlQmFyKCksXG4gICAgICAgIG5ldyBSZWNvbW1lbmRhdGlvbk92ZXJsYXkoKSxcbiAgICAgICAgbmV3IFdhdGVybWFyaygpLFxuICAgICAgICBuZXcgRXJyb3JNZXNzYWdlT3ZlcmxheSgpLFxuICAgICAgXSxcbiAgICAgIGhpZGVEZWxheTogMjAwMCxcbiAgICAgIGhpZGVQbGF5ZXJTdGF0ZUV4Y2VwdGlvbnM6IFtcbiAgICAgICAgUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUHJlcGFyZWQsXG4gICAgICAgIFBsYXllclV0aWxzLlBsYXllclN0YXRlLlBhdXNlZCxcbiAgICAgICAgUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuRmluaXNoZWQsXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG1vZGVybkFkc1VJKCkge1xuICAgIHJldHVybiBuZXcgVUlDb250YWluZXIoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBuZXcgQnVmZmVyaW5nT3ZlcmxheSgpLFxuICAgICAgICBuZXcgQWRDbGlja092ZXJsYXkoKSxcbiAgICAgICAgbmV3IFBsYXliYWNrVG9nZ2xlT3ZlcmxheSgpLFxuICAgICAgICBuZXcgQ29udGFpbmVyKHtcbiAgICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAgICBuZXcgQWRNZXNzYWdlTGFiZWwoeyB0ZXh0OiBpMThuLmdldExvY2FsaXplcignYWRzLnJlbWFpbmluZ1RpbWUnKX0pLFxuICAgICAgICAgICAgbmV3IEFkU2tpcEJ1dHRvbigpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY3NzQ2xhc3M6ICd1aS1hZHMtc3RhdHVzJyxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBDb250cm9sQmFyKHtcbiAgICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAgICBuZXcgQ29udGFpbmVyKHtcbiAgICAgICAgICAgICAgY29tcG9uZW50czogW1xuICAgICAgICAgICAgICAgIG5ldyBQbGF5YmFja1RvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgICAgIG5ldyBWb2x1bWVUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgICAgICBuZXcgVm9sdW1lU2xpZGVyKCksXG4gICAgICAgICAgICAgICAgbmV3IFNwYWNlcigpLFxuICAgICAgICAgICAgICAgIG5ldyBGdWxsc2NyZWVuVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGNzc0NsYXNzZXM6IFsnY29udHJvbGJhci1ib3R0b20nXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc2tpbi1hZHMnXSxcbiAgICAgIGhpZGVEZWxheTogMjAwMCxcbiAgICAgIGhpZGVQbGF5ZXJTdGF0ZUV4Y2VwdGlvbnM6IFtcbiAgICAgICAgUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUHJlcGFyZWQsXG4gICAgICAgIFBsYXllclV0aWxzLlBsYXllclN0YXRlLlBhdXNlZCxcbiAgICAgICAgUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuRmluaXNoZWQsXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG1vZGVyblNtYWxsU2NyZWVuVUkoKSB7XG4gICAgbGV0IHN1YnRpdGxlT3ZlcmxheSA9IG5ldyBTdWJ0aXRsZU92ZXJsYXkoKTtcblxuICAgIGxldCBtYWluU2V0dGluZ3NQYW5lbFBhZ2UgPSBuZXcgU2V0dGluZ3NQYW5lbFBhZ2Uoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnZpZGVvLnF1YWxpdHknKSwgbmV3IFZpZGVvUXVhbGl0eVNlbGVjdEJveCgpKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzcGVlZCcpLCBuZXcgUGxheWJhY2tTcGVlZFNlbGVjdEJveCgpKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5hdWRpby50cmFjaycpLCBuZXcgQXVkaW9UcmFja1NlbGVjdEJveCgpKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5hdWRpby5xdWFsaXR5JyksIG5ldyBBdWRpb1F1YWxpdHlTZWxlY3RCb3goKSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgbGV0IHNldHRpbmdzUGFuZWwgPSBuZXcgU2V0dGluZ3NQYW5lbCh7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG1haW5TZXR0aW5nc1BhbmVsUGFnZSxcbiAgICAgIF0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICBwYWdlVHJhbnNpdGlvbkFuaW1hdGlvbjogZmFsc2UsXG4gICAgICBoaWRlRGVsYXk6IC0xLFxuICAgIH0pO1xuXG4gICAgbGV0IHN1YnRpdGxlU2V0dGluZ3NQYW5lbFBhZ2UgPSBuZXcgU3VidGl0bGVTZXR0aW5nc1BhbmVsUGFnZSh7XG4gICAgICBzZXR0aW5nc1BhbmVsOiBzZXR0aW5nc1BhbmVsLFxuICAgICAgb3ZlcmxheTogc3VidGl0bGVPdmVybGF5LFxuICAgIH0pO1xuXG4gICAgbGV0IHN1YnRpdGxlU2V0dGluZ3NPcGVuQnV0dG9uID0gbmV3IFNldHRpbmdzUGFuZWxQYWdlT3BlbkJ1dHRvbih7XG4gICAgICB0YXJnZXRQYWdlOiBzdWJ0aXRsZVNldHRpbmdzUGFuZWxQYWdlLFxuICAgICAgY29udGFpbmVyOiBzZXR0aW5nc1BhbmVsLFxuICAgICAgYXJpYUxhYmVsOiBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzJyksXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcignb3BlbicpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3VidGl0bGVTZWxlY3RCb3ggPSBuZXcgU3VidGl0bGVTZWxlY3RCb3goKTtcblxuICAgIG1haW5TZXR0aW5nc1BhbmVsUGFnZS5hZGRDb21wb25lbnQoXG4gICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oXG4gICAgICAgIG5ldyBTdWJ0aXRsZVNldHRpbmdzTGFiZWwoe1xuICAgICAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMnKSxcbiAgICAgICAgICBvcGVuZXI6IHN1YnRpdGxlU2V0dGluZ3NPcGVuQnV0dG9uLFxuICAgICAgICB9KSxcbiAgICAgICAgc3VidGl0bGVTZWxlY3RCb3gsXG4gICAgICAgIHtcbiAgICAgICAgICByb2xlOiAnbWVudWJhcicsXG4gICAgICAgIH0sXG4gICAgICApKTtcblxuICAgIHNldHRpbmdzUGFuZWwuYWRkQ29tcG9uZW50KHN1YnRpdGxlU2V0dGluZ3NQYW5lbFBhZ2UpO1xuXG4gICAgc2V0dGluZ3NQYW5lbC5hZGRDb21wb25lbnQobmV3IENsb3NlQnV0dG9uKHsgdGFyZ2V0OiBzZXR0aW5nc1BhbmVsIH0pKTtcbiAgICBzdWJ0aXRsZVNldHRpbmdzUGFuZWxQYWdlLmFkZENvbXBvbmVudChuZXcgQ2xvc2VCdXR0b24oeyB0YXJnZXQ6IHNldHRpbmdzUGFuZWwgfSkpO1xuXG4gICAgbGV0IGNvbnRyb2xCYXIgPSBuZXcgQ29udHJvbEJhcih7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG5ldyBDb250YWluZXIoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQbGF5YmFja1RpbWVMYWJlbCh7IHRpbWVMYWJlbE1vZGU6IFBsYXliYWNrVGltZUxhYmVsTW9kZS5DdXJyZW50VGltZSwgaGlkZUluTGl2ZVBsYXliYWNrOiB0cnVlIH0pLFxuICAgICAgICAgICAgbmV3IFNlZWtCYXIoeyBsYWJlbDogbmV3IFNlZWtCYXJMYWJlbCgpIH0pLFxuICAgICAgICAgICAgbmV3IFBsYXliYWNrVGltZUxhYmVsKHsgdGltZUxhYmVsTW9kZTogUGxheWJhY2tUaW1lTGFiZWxNb2RlLlRvdGFsVGltZSwgY3NzQ2xhc3NlczogWyd0ZXh0LXJpZ2h0J10gfSksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBjc3NDbGFzc2VzOiBbJ2NvbnRyb2xiYXItdG9wJ10sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgVUlDb250YWluZXIoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBzdWJ0aXRsZU92ZXJsYXksXG4gICAgICAgIG5ldyBCdWZmZXJpbmdPdmVybGF5KCksXG4gICAgICAgIG5ldyBDYXN0U3RhdHVzT3ZlcmxheSgpLFxuICAgICAgICBuZXcgUGxheWJhY2tUb2dnbGVPdmVybGF5KCksXG4gICAgICAgIG5ldyBSZWNvbW1lbmRhdGlvbk92ZXJsYXkoKSxcbiAgICAgICAgY29udHJvbEJhcixcbiAgICAgICAgbmV3IFRpdGxlQmFyKHtcbiAgICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAgICBuZXcgTWV0YWRhdGFMYWJlbCh7IGNvbnRlbnQ6IE1ldGFkYXRhTGFiZWxDb250ZW50LlRpdGxlIH0pLFxuICAgICAgICAgICAgbmV3IENhc3RUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgIG5ldyBWUlRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IFBpY3R1cmVJblBpY3R1cmVUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgIG5ldyBBaXJQbGF5VG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgVm9sdW1lVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgU2V0dGluZ3NUb2dnbGVCdXR0b24oeyBzZXR0aW5nc1BhbmVsOiBzZXR0aW5nc1BhbmVsIH0pLFxuICAgICAgICAgICAgbmV3IEZ1bGxzY3JlZW5Ub2dnbGVCdXR0b24oKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgICAgc2V0dGluZ3NQYW5lbCxcbiAgICAgICAgbmV3IFdhdGVybWFyaygpLFxuICAgICAgICBuZXcgRXJyb3JNZXNzYWdlT3ZlcmxheSgpLFxuICAgICAgXSxcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc2tpbi1zbWFsbHNjcmVlbiddLFxuICAgICAgaGlkZURlbGF5OiAyMDAwLFxuICAgICAgaGlkZVBsYXllclN0YXRlRXhjZXB0aW9uczogW1xuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5QcmVwYXJlZCxcbiAgICAgICAgUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUGF1c2VkLFxuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5GaW5pc2hlZCxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbW9kZXJuU21hbGxTY3JlZW5BZHNVSSgpIHtcbiAgICByZXR1cm4gbmV3IFVJQ29udGFpbmVyKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgbmV3IEJ1ZmZlcmluZ092ZXJsYXkoKSxcbiAgICAgICAgbmV3IEFkQ2xpY2tPdmVybGF5KCksXG4gICAgICAgIG5ldyBQbGF5YmFja1RvZ2dsZU92ZXJsYXkoKSxcbiAgICAgICAgbmV3IFRpdGxlQmFyKHtcbiAgICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAgICAvLyBkdW1teSBsYWJlbCB3aXRoIG5vIGNvbnRlbnQgdG8gbW92ZSBidXR0b25zIHRvIHRoZSByaWdodFxuICAgICAgICAgICAgbmV3IExhYmVsKHsgY3NzQ2xhc3M6ICdsYWJlbC1tZXRhZGF0YS10aXRsZScgfSksXG4gICAgICAgICAgICBuZXcgRnVsbHNjcmVlblRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgQ29udGFpbmVyKHtcbiAgICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAgICBuZXcgQWRNZXNzYWdlTGFiZWwoeyB0ZXh0OiAnQWQ6IHtyZW1haW5pbmdUaW1lfSBzZWNzJyB9KSxcbiAgICAgICAgICAgIG5ldyBBZFNraXBCdXR0b24oKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGNzc0NsYXNzOiAndWktYWRzLXN0YXR1cycsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc2tpbi1hZHMnLCAndWktc2tpbi1zbWFsbHNjcmVlbiddLFxuICAgICAgaGlkZURlbGF5OiAyMDAwLFxuICAgICAgaGlkZVBsYXllclN0YXRlRXhjZXB0aW9uczogW1xuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5QcmVwYXJlZCxcbiAgICAgICAgUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUGF1c2VkLFxuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5GaW5pc2hlZCxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbW9kZXJuQ2FzdFJlY2VpdmVyVUkoKSB7XG4gICAgbGV0IGNvbnRyb2xCYXIgPSBuZXcgQ29udHJvbEJhcih7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG5ldyBDb250YWluZXIoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIG5ldyBQbGF5YmFja1RpbWVMYWJlbCh7IHRpbWVMYWJlbE1vZGU6IFBsYXliYWNrVGltZUxhYmVsTW9kZS5DdXJyZW50VGltZSwgaGlkZUluTGl2ZVBsYXliYWNrOiB0cnVlIH0pLFxuICAgICAgICAgICAgbmV3IFNlZWtCYXIoeyBzbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlSW50ZXJ2YWxNczogLTEgfSksXG4gICAgICAgICAgICBuZXcgUGxheWJhY2tUaW1lTGFiZWwoeyB0aW1lTGFiZWxNb2RlOiBQbGF5YmFja1RpbWVMYWJlbE1vZGUuVG90YWxUaW1lLCBjc3NDbGFzc2VzOiBbJ3RleHQtcmlnaHQnXSB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGNzc0NsYXNzZXM6IFsnY29udHJvbGJhci10b3AnXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBDYXN0VUlDb250YWluZXIoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBuZXcgU3VidGl0bGVPdmVybGF5KCksXG4gICAgICAgIG5ldyBCdWZmZXJpbmdPdmVybGF5KCksXG4gICAgICAgIG5ldyBQbGF5YmFja1RvZ2dsZU92ZXJsYXkoKSxcbiAgICAgICAgbmV3IFdhdGVybWFyaygpLFxuICAgICAgICBjb250cm9sQmFyLFxuICAgICAgICBuZXcgVGl0bGVCYXIoeyBrZWVwSGlkZGVuV2l0aG91dE1ldGFkYXRhOiB0cnVlIH0pLFxuICAgICAgICBuZXcgRXJyb3JNZXNzYWdlT3ZlcmxheSgpLFxuICAgICAgXSxcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc2tpbi1jYXN0LXJlY2VpdmVyJ10sXG4gICAgICBoaWRlRGVsYXk6IDIwMDAsXG4gICAgICBoaWRlUGxheWVyU3RhdGVFeGNlcHRpb25zOiBbXG4gICAgICAgIFBsYXllclV0aWxzLlBsYXllclN0YXRlLlByZXBhcmVkLFxuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5QYXVzZWQsXG4gICAgICAgIFBsYXllclV0aWxzLlBsYXllclN0YXRlLkZpbmlzaGVkLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBidWlsZE1vZGVyblVJKHBsYXllcjogUGxheWVyQVBJLCBjb25maWc6IFVJQ29uZmlnID0ge30pOiBVSU1hbmFnZXIge1xuICAgIC8vIHNob3cgc21hbGxTY3JlZW4gVUkgb25seSBvbiBtb2JpbGUvaGFuZGhlbGQgZGV2aWNlc1xuICAgIGxldCBzbWFsbFNjcmVlblN3aXRjaFdpZHRoID0gNjAwO1xuXG4gICAgcmV0dXJuIG5ldyBVSU1hbmFnZXIocGxheWVyLCBbe1xuICAgICAgdWk6IG1vZGVyblNtYWxsU2NyZWVuQWRzVUkoKSxcbiAgICAgIGNvbmRpdGlvbjogKGNvbnRleHQ6IFVJQ29uZGl0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICByZXR1cm4gY29udGV4dC5pc01vYmlsZSAmJiBjb250ZXh0LmRvY3VtZW50V2lkdGggPCBzbWFsbFNjcmVlblN3aXRjaFdpZHRoICYmIGNvbnRleHQuaXNBZFxuICAgICAgICAgICYmIGNvbnRleHQuYWRSZXF1aXJlc1VpO1xuICAgICAgfSxcbiAgICB9LCB7XG4gICAgICB1aTogbW9kZXJuQWRzVUkoKSxcbiAgICAgIGNvbmRpdGlvbjogKGNvbnRleHQ6IFVJQ29uZGl0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICByZXR1cm4gY29udGV4dC5pc0FkICYmIGNvbnRleHQuYWRSZXF1aXJlc1VpO1xuICAgICAgfSxcbiAgICB9LCB7XG4gICAgICB1aTogbW9kZXJuU21hbGxTY3JlZW5VSSgpLFxuICAgICAgY29uZGl0aW9uOiAoY29udGV4dDogVUlDb25kaXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgIHJldHVybiAhY29udGV4dC5pc0FkICYmICFjb250ZXh0LmFkUmVxdWlyZXNVaSAmJiBjb250ZXh0LmlzTW9iaWxlXG4gICAgICAgICAgJiYgY29udGV4dC5kb2N1bWVudFdpZHRoIDwgc21hbGxTY3JlZW5Td2l0Y2hXaWR0aDtcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgdWk6IG1vZGVyblVJKCksXG4gICAgICBjb25kaXRpb246IChjb250ZXh0OiBVSUNvbmRpdGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgcmV0dXJuICFjb250ZXh0LmlzQWQgJiYgIWNvbnRleHQuYWRSZXF1aXJlc1VpO1xuICAgICAgfSxcbiAgICB9XSwgY29uZmlnKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBidWlsZE1vZGVyblNtYWxsU2NyZWVuVUkocGxheWVyOiBQbGF5ZXJBUEksIGNvbmZpZzogVUlDb25maWcgPSB7fSk6IFVJTWFuYWdlciB7XG4gICAgcmV0dXJuIG5ldyBVSU1hbmFnZXIocGxheWVyLCBbe1xuICAgICAgdWk6IG1vZGVyblNtYWxsU2NyZWVuQWRzVUkoKSxcbiAgICAgIGNvbmRpdGlvbjogKGNvbnRleHQ6IFVJQ29uZGl0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICByZXR1cm4gY29udGV4dC5pc0FkICYmIGNvbnRleHQuYWRSZXF1aXJlc1VpO1xuICAgICAgfSxcbiAgICB9LCB7XG4gICAgICB1aTogbW9kZXJuU21hbGxTY3JlZW5VSSgpLFxuICAgICAgY29uZGl0aW9uOiAoY29udGV4dDogVUlDb25kaXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgIHJldHVybiAhY29udGV4dC5pc0FkICYmICFjb250ZXh0LmFkUmVxdWlyZXNVaTtcbiAgICAgIH0sXG4gICAgfV0sIGNvbmZpZyk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gYnVpbGRNb2Rlcm5DYXN0UmVjZWl2ZXJVSShwbGF5ZXI6IFBsYXllckFQSSwgY29uZmlnOiBVSUNvbmZpZyA9IHt9KTogVUlNYW5hZ2VyIHtcbiAgICByZXR1cm4gbmV3IFVJTWFuYWdlcihwbGF5ZXIsIG1vZGVybkNhc3RSZWNlaXZlclVJKCksIGNvbmZpZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7VUlDb250YWluZXJ9IGZyb20gJy4vY29tcG9uZW50cy91aWNvbnRhaW5lcic7XG5pbXBvcnQge0RPTX0gZnJvbSAnLi9kb20nO1xuaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudENvbmZpZ30gZnJvbSAnLi9jb21wb25lbnRzL2NvbXBvbmVudCc7XG5pbXBvcnQge0NvbnRhaW5lcn0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnRhaW5lcic7XG5pbXBvcnQgeyBTZWVrQmFyLCBTZWVrQmFyTWFya2VyIH0gZnJvbSAnLi9jb21wb25lbnRzL3NlZWtiYXInO1xuaW1wb3J0IHtOb0FyZ3MsIEV2ZW50RGlzcGF0Y2hlciwgQ2FuY2VsRXZlbnRBcmdzfSBmcm9tICcuL2V2ZW50ZGlzcGF0Y2hlcic7XG5pbXBvcnQge1VJVXRpbHN9IGZyb20gJy4vdWl1dGlscyc7XG5pbXBvcnQge0FycmF5VXRpbHN9IGZyb20gJy4vYXJyYXl1dGlscyc7XG5pbXBvcnQge0Jyb3dzZXJVdGlsc30gZnJvbSAnLi9icm93c2VydXRpbHMnO1xuaW1wb3J0IHsgVGltZWxpbmVNYXJrZXIsIFVJQ29uZmlnIH0gZnJvbSAnLi91aWNvbmZpZyc7XG5pbXBvcnQgeyBQbGF5ZXJBUEksIFBsYXllckV2ZW50Q2FsbGJhY2ssIFBsYXllckV2ZW50QmFzZSwgUGxheWVyRXZlbnQsIEFkRXZlbnQsIExpbmVhckFkIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IFZvbHVtZUNvbnRyb2xsZXIgfSBmcm9tICcuL3ZvbHVtZWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgaTE4biwgQ3VzdG9tVm9jYWJ1bGFyeSwgVm9jYWJ1bGFyaWVzIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vaTE4bic7XG5pbXBvcnQgeyBGb2N1c1Zpc2liaWxpdHlUcmFja2VyIH0gZnJvbSAnLi9mb2N1c3Zpc2liaWxpdHl0cmFja2VyJztcbmltcG9ydCB7IGlzTW9iaWxlVjNQbGF5ZXJBUEksIE1vYmlsZVYzUGxheWVyQVBJLCBNb2JpbGVWM1BsYXllckV2ZW50IH0gZnJvbSAnLi9tb2JpbGV2M3BsYXllcmFwaSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxpemF0aW9uQ29uZmlnIHtcbiAgLyoqXG4gICAqIFNldHMgdGhlIGRlc2lyZWQgbGFuZ3VhZ2UsIGFuZCBmYWxscyBiYWNrIHRvICdlbicgaWYgdGhlcmUgaXMgbm8gdm9jYWJ1bGFyeSBmb3IgdGhlIGRlc2lyZWQgbGFuZ3VhZ2UuIFNldHRpbmcgaXRcbiAgICogdG8gXCJhdXRvXCIgd2lsbCBlbmFibGUgbGFuZ3VhZ2UgZGV0ZWN0aW9uIGZyb20gdGhlIGJyb3dzZXIncyBsb2NhbGUuXG4gICAqL1xuICBsYW5ndWFnZT86ICdhdXRvJyB8ICdlbicgfCAnZGUnIHwgc3RyaW5nO1xuICAvKipcbiAgICogQSBtYXAgb2YgYGxhbmd1YWdlYCB0byB7QGxpbmsgQ3VzdG9tVm9jYWJ1bGFyeX0gZGVmaW5pdGlvbnMuIENhbiBiZSB1c2VkIHRvIG92ZXJ3cml0ZSBkZWZhdWx0IHRyYW5zbGF0aW9ucyBhbmQgYWRkXG4gICAqIGN1c3RvbSBzdHJpbmdzIG9yIGFkZGl0aW9uYWwgbGFuZ3VhZ2VzLlxuICAgKi9cbiAgdm9jYWJ1bGFyaWVzPzogVm9jYWJ1bGFyaWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsVUlDb25maWcgZXh0ZW5kcyBVSUNvbmZpZyB7XG4gIGV2ZW50czoge1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gdXBkYXRlZC9jaGFuZ2VkLlxuICAgICAqL1xuICAgIG9uVXBkYXRlZDogRXZlbnREaXNwYXRjaGVyPFVJTWFuYWdlciwgdm9pZD47XG4gIH07XG4gIHZvbHVtZUNvbnRyb2xsZXI6IFZvbHVtZUNvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogVGhlIGNvbnRleHQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBhIHtAbGluayBVSUNvbmRpdGlvblJlc29sdmVyfSB0byBkZXRlcm1pbmUgaWYgaXQncyBjb25kaXRpb25zIGZ1bGZpbCB0aGUgY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVSUNvbmRpdGlvbkNvbnRleHQge1xuICAvKipcbiAgICogVGVsbHMgaWYgdGhlIHBsYXllciBpcyBsb2FkaW5nIG9yIHBsYXlpbmcgYW4gYWQuXG4gICAqL1xuICBpc0FkOiBib29sZWFuO1xuICAvKipcbiAgICogVGVsbHMgaWYgdGhlIGN1cnJlbnQgYWQgcmVxdWlyZXMgYW4gZXh0ZXJuYWwgVUksIGlmIHtAbGluayAjaXNBZH0gaXMgdHJ1ZS5cbiAgICovXG4gIGFkUmVxdWlyZXNVaTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRlbGxzIGlmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGluIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICovXG4gIGlzRnVsbHNjcmVlbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRlbGxzIGlmIHRoZSBVSSBpcyBydW5uaW5nIGluIGEgbW9iaWxlIGJyb3dzZXIuXG4gICAqL1xuICBpc01vYmlsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRlbGxzIGlmIHRoZSBwbGF5ZXIgaXMgaW4gcGxheWluZyBvciBwYXVzZWQgc3RhdGUuXG4gICAqL1xuICBpc1BsYXlpbmc6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgd2lkdGggb2YgdGhlIHBsYXllci9VSSBlbGVtZW50LlxuICAgKi9cbiAgd2lkdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiB0aGUgZG9jdW1lbnQgd2hlcmUgdGhlIHBsYXllci9VSSBpcyBlbWJlZGRlZCBpbi5cbiAgICovXG4gIGRvY3VtZW50V2lkdGg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgY29uZGl0aW9ucyBvZiBpdHMgYXNzb2NpYXRlZCBVSSBpbiBhIHtAbGluayBVSVZhcmlhbnR9IHVwb24gYSB7QGxpbmsgVUlDb25kaXRpb25Db250ZXh0fSBhbmQgZGVjaWRlc1xuICogaWYgdGhlIFVJIHNob3VsZCBiZSBkaXNwbGF5ZWQuIElmIGl0IHJldHVybnMgdHJ1ZSwgdGhlIFVJIGlzIGEgY2FuZGlkYXRlIGZvciBkaXNwbGF5OyBpZiBpdCByZXR1cm5zIGZhbHNlLCBpdCB3aWxsXG4gKiBub3QgYmUgZGlzcGxheWVkIGluIHRoZSBnaXZlbiBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVJQ29uZGl0aW9uUmVzb2x2ZXIge1xuICAoY29udGV4dDogVUlDb25kaXRpb25Db250ZXh0KTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBc3NvY2lhdGVzIGEgVUkgaW5zdGFuY2Ugd2l0aCBhbiBvcHRpb25hbCB7QGxpbmsgVUlDb25kaXRpb25SZXNvbHZlcn0gdGhhdCBkZXRlcm1pbmVzIGlmIHRoZSBVSSBzaG91bGQgYmUgZGlzcGxheWVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVJVmFyaWFudCB7XG4gIHVpOiBVSUNvbnRhaW5lcjtcbiAgY29uZGl0aW9uPzogVUlDb25kaXRpb25SZXNvbHZlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFVJTWFuYWdlciB7XG5cbiAgcHJpdmF0ZSBwbGF5ZXI6IFBsYXllckFQSTtcbiAgcHJpdmF0ZSB1aUNvbnRhaW5lckVsZW1lbnQ6IERPTTtcbiAgcHJpdmF0ZSB1aVZhcmlhbnRzOiBVSVZhcmlhbnRbXTtcbiAgcHJpdmF0ZSB1aUluc3RhbmNlTWFuYWdlcnM6IEludGVybmFsVUlJbnN0YW5jZU1hbmFnZXJbXTtcbiAgcHJpdmF0ZSBjdXJyZW50VWk6IEludGVybmFsVUlJbnN0YW5jZU1hbmFnZXI7XG4gIHByaXZhdGUgY29uZmlnOiBJbnRlcm5hbFVJQ29uZmlnOyAvLyBDb25qdW5jdGlvbiBvZiBwcm92aWRlZCB1aUNvbmZpZyBhbmQgc291cmNlQ29uZmlnIGZyb20gdGhlIHBsYXllclxuICBwcml2YXRlIG1hbmFnZXJQbGF5ZXJXcmFwcGVyOiBQbGF5ZXJXcmFwcGVyO1xuICBwcml2YXRlIGZvY3VzVmlzaWJpbGl0eVRyYWNrZXI6IEZvY3VzVmlzaWJpbGl0eVRyYWNrZXI7XG5cbiAgcHJpdmF0ZSBldmVudHMgPSB7XG4gICAgb25VaVZhcmlhbnRSZXNvbHZlOiBuZXcgRXZlbnREaXNwYXRjaGVyPFVJTWFuYWdlciwgVUlDb25kaXRpb25Db250ZXh0PigpLFxuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVUkgbWFuYWdlciB3aXRoIGEgc2luZ2xlIFVJIHZhcmlhbnQgdGhhdCB3aWxsIGJlIHBlcm1hbmVudGx5IHNob3duLlxuICAgKiBAcGFyYW0gcGxheWVyIHRoZSBhc3NvY2lhdGVkIHBsYXllciBvZiB0aGlzIFVJXG4gICAqIEBwYXJhbSB1aSB0aGUgVUkgdG8gYWRkIHRvIHRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIHVpY29uZmlnIG9wdGlvbmFsIFVJIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyQVBJLCB1aTogVUlDb250YWluZXIsIHVpY29uZmlnPzogVUlDb25maWcpO1xuICAvKipcbiAgICogQ3JlYXRlcyBhIFVJIG1hbmFnZXIgd2l0aCBhIGxpc3Qgb2YgVUkgdmFyaWFudHMgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IHNlbGVjdGVkIGFuZCBzd2l0Y2hlZCBhY2NvcmRpbmcgdG9cbiAgICogdGhlIGNvbnRleHQgb2YgdGhlIFVJLlxuICAgKlxuICAgKiBFdmVyeSB0aW1lIHRoZSBVSSBjb250ZXh0IGNoYW5nZXMsIHRoZSBjb25kaXRpb25zIG9mIHRoZSBVSSB2YXJpYW50cyB3aWxsIGJlIHNlcXVlbnRpYWxseSByZXNvbHZlZCBhbmQgdGhlIGZpcnN0XG4gICAqIFVJLCB3aG9zZSBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWUsIHdpbGwgYmUgc2VsZWN0ZWQgYW5kIGRpc3BsYXllZC4gVGhlIGxhc3QgdmFyaWFudCBpbiB0aGUgbGlzdCBtaWdodCBvbWl0IHRoZVxuICAgKiBjb25kaXRpb24gcmVzb2x2ZXIgYW5kIHdpbGwgYmUgc2VsZWN0ZWQgYXMgZGVmYXVsdC9mYWxsYmFjayBVSSB3aGVuIGFsbCBvdGhlciBjb25kaXRpb25zIGZhaWwuIElmIHRoZXJlIGlzIG5vXG4gICAqIGZhbGxiYWNrIFVJIGFuZCBhbGwgY29uZGl0aW9ucyBmYWlsLCBubyBVSSB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICpcbiAgICogQHBhcmFtIHBsYXllciB0aGUgYXNzb2NpYXRlZCBwbGF5ZXIgb2YgdGhpcyBVSVxuICAgKiBAcGFyYW0gdWlWYXJpYW50cyBhIGxpc3Qgb2YgVUkgdmFyaWFudHMgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IHN3aXRjaGVkXG4gICAqIEBwYXJhbSB1aWNvbmZpZyBvcHRpb25hbCBVSSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllckFQSSwgdWlWYXJpYW50czogVUlWYXJpYW50W10sIHVpY29uZmlnPzogVUlDb25maWcpO1xuICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllckFQSSwgcGxheWVyVWlPclVpVmFyaWFudHM6IFVJQ29udGFpbmVyIHwgVUlWYXJpYW50W10sIHVpY29uZmlnOiBVSUNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKHBsYXllclVpT3JVaVZhcmlhbnRzIGluc3RhbmNlb2YgVUlDb250YWluZXIpIHtcbiAgICAgIC8vIFNpbmdsZS1VSSBjb25zdHJ1Y3RvciBoYXMgYmVlbiBjYWxsZWQsIHRyYW5zZm9ybSBhcmd1bWVudHMgdG8gVUlWYXJpYW50W10gc2lnbmF0dXJlXG4gICAgICBsZXQgcGxheWVyVWkgPSA8VUlDb250YWluZXI+cGxheWVyVWlPclVpVmFyaWFudHM7XG4gICAgICBsZXQgdWlWYXJpYW50cyA9IFtdO1xuXG4gICAgICAvLyBBZGQgdGhlIGRlZmF1bHQgcGxheWVyIFVJXG4gICAgICB1aVZhcmlhbnRzLnB1c2goeyB1aTogcGxheWVyVWkgfSk7XG5cbiAgICAgIHRoaXMudWlWYXJpYW50cyA9IHVpVmFyaWFudHM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciAoVUlWYXJpYW50W10pIGhhcyBiZWVuIGNhbGxlZFxuICAgICAgdGhpcy51aVZhcmlhbnRzID0gPFVJVmFyaWFudFtdPnBsYXllclVpT3JVaVZhcmlhbnRzO1xuICAgIH1cblxuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMubWFuYWdlclBsYXllcldyYXBwZXIgPSBuZXcgUGxheWVyV3JhcHBlcihwbGF5ZXIpO1xuXG4gICAgLy8gZW5zdXJlIHRoYXQgYXQgbGVhc3QgdGhlIG1ldGFkYXRhIG9iamVjdCBkb2VzIGV4aXN0IGluIHRoZSB1aWNvbmZpZ1xuICAgIHVpY29uZmlnLm1ldGFkYXRhID0gdWljb25maWcubWV0YWRhdGEgPyB1aWNvbmZpZy5tZXRhZGF0YSA6IHt9O1xuXG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBwbGF5YmFja1NwZWVkU2VsZWN0aW9uRW5hYmxlZDogdHJ1ZSwgLy8gU3dpdGNoIG9uIHNwZWVkIHNlbGVjdG9yIGJ5IGRlZmF1bHRcbiAgICAgIGF1dG9VaVZhcmlhbnRSZXNvbHZlOiB0cnVlLCAvLyBTd2l0Y2ggb24gYXV0byBVSSByZXNvbHZpbmcgYnkgZGVmYXVsdFxuICAgICAgZGlzYWJsZUF1dG9IaWRlV2hlbkhvdmVyZWQ6IGZhbHNlLCAvLyBEaXNhYmxlIGF1dG8gaGlkZSB3aGVuIFVJIGlzIGhvdmVyZWRcbiAgICAgIC4uLnVpY29uZmlnLFxuICAgICAgZXZlbnRzOiB7XG4gICAgICAgIG9uVXBkYXRlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxVSU1hbmFnZXIsIHZvaWQ+KCksXG4gICAgICB9LFxuICAgICAgdm9sdW1lQ29udHJvbGxlcjogbmV3IFZvbHVtZUNvbnRyb2xsZXIodGhpcy5tYW5hZ2VyUGxheWVyV3JhcHBlci5nZXRQbGF5ZXIoKSksXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdhdGhlcnMgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gdGhlIFVJIGNvbmZpZyBhbmQgcGxheWVyIHNvdXJjZSBjb25maWcgYW5kIGNyZWF0ZXMgYSBtZXJnZWQgVUkgY29uZmlnXG4gICAgICogdGhhdCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIFVJIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUNvbmZpZyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHBsYXllclNvdXJjZUNvbmZpZyA9IHBsYXllci5nZXRTb3VyY2UoKSB8fCB7fTtcbiAgICAgIHRoaXMuY29uZmlnLm1ldGFkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh1aWNvbmZpZy5tZXRhZGF0YSB8fCB7fSkpO1xuXG4gICAgICAvLyBFeHRyYWN0IHRoZSBVSS1yZWxhdGVkIGNvbmZpZyBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBjb25maWdcbiAgICAgIGNvbnN0IHBsYXllclNvdXJjZVVpQ29uZmlnOiBVSUNvbmZpZyA9IHtcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAvLyBUT0RPIG1vdmUgbWV0YWRhdGEgaW50byBzb3VyY2UubWV0YWRhdGEgbmFtZXNwYWNlIGluIHBsYXllciB2OFxuICAgICAgICAgIHRpdGxlOiBwbGF5ZXJTb3VyY2VDb25maWcudGl0bGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHBsYXllclNvdXJjZUNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICBtYXJrZXJzOiAocGxheWVyU291cmNlQ29uZmlnIGFzIGFueSkubWFya2VycyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb21tZW5kYXRpb25zOiAocGxheWVyU291cmNlQ29uZmlnIGFzIGFueSkucmVjb21tZW5kYXRpb25zLFxuICAgICAgfTtcblxuICAgICAgLy8gUGxheWVyIHNvdXJjZSBjb25maWcgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBVSSBjb25maWcsIGJlY2F1c2UgdGhlIGNvbmZpZyBpbiB0aGUgc291cmNlIGlzIGF0dGFjaGVkXG4gICAgICAvLyB0byBhIHNvdXJjZSB3aGljaCBjaGFuZ2VzIHdpdGggZXZlcnkgcGxheWVyLmxvYWQsIHdoZXJlYXMgdGhlIFVJIGNvbmZpZyBzdGF5cyB0aGUgc2FtZSBmb3IgdGhlIHdob2xlXG4gICAgICAvLyBsaWZldGltZSBvZiB0aGUgcGxheWVyIGluc3RhbmNlLlxuICAgICAgdGhpcy5jb25maWcubWV0YWRhdGEudGl0bGUgPSBwbGF5ZXJTb3VyY2VVaUNvbmZpZy5tZXRhZGF0YS50aXRsZSB8fCB1aWNvbmZpZy5tZXRhZGF0YS50aXRsZTtcbiAgICAgIHRoaXMuY29uZmlnLm1ldGFkYXRhLmRlc2NyaXB0aW9uID0gcGxheWVyU291cmNlVWlDb25maWcubWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgdWljb25maWcubWV0YWRhdGEuZGVzY3JpcHRpb247XG4gICAgICB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tYXJrZXJzID0gcGxheWVyU291cmNlVWlDb25maWcubWV0YWRhdGEubWFya2VycyB8fCB1aWNvbmZpZy5tZXRhZGF0YS5tYXJrZXJzIHx8IFtdO1xuICAgICAgdGhpcy5jb25maWcucmVjb21tZW5kYXRpb25zID0gcGxheWVyU291cmNlVWlDb25maWcucmVjb21tZW5kYXRpb25zIHx8IHVpY29uZmlnLnJlY29tbWVuZGF0aW9ucyB8fCBbXTtcbiAgICB9O1xuXG4gICAgdXBkYXRlQ29uZmlnKCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHNvdXJjZSBjb25maWd1cmF0aW9uIHdoZW4gYSBuZXcgc291cmNlIGlzIGxvYWRlZCBhbmQgZGlzcGF0Y2ggb25VcGRhdGVkXG4gICAgY29uc3QgdXBkYXRlU291cmNlID0gKCkgPT4ge1xuICAgICAgdXBkYXRlQ29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZy5ldmVudHMub25VcGRhdGVkLmRpc3BhdGNoKHRoaXMpO1xuICAgIH07XG5cbiAgICBjb25zdCB3cmFwcGVkUGxheWVyID0gdGhpcy5tYW5hZ2VyUGxheWVyV3JhcHBlci5nZXRQbGF5ZXIoKTtcblxuICAgIHdyYXBwZWRQbGF5ZXIub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VMb2FkZWQsIHVwZGF0ZVNvdXJjZSk7XG5cbiAgICAvLyBUaGUgUGxheWxpc3RUcmFuc2l0aW9uIGV2ZW50IGlzIG9ubHkgYXZhaWxhYmxlIG9uIE1vYmlsZSB2MyBmb3Igbm93LlxuICAgIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIG5ldyBzb3VyY2UgYmVjb21lcyBhY3RpdmUgaW4gdGhlIHBsYXllci5cbiAgICBpZiAoaXNNb2JpbGVWM1BsYXllckFQSSh3cmFwcGVkUGxheWVyKSkge1xuICAgICAgd3JhcHBlZFBsYXllci5vbihNb2JpbGVWM1BsYXllckV2ZW50LlBsYXlsaXN0VHJhbnNpdGlvbiwgdXBkYXRlU291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAodWljb25maWcuY29udGFpbmVyKSB7XG4gICAgICAvLyBVbmZvcnR1bmF0ZWx5IFwidWlDb250YWluZXJFbGVtZW50ID0gbmV3IERPTShjb25maWcuY29udGFpbmVyKVwiIHdpbGwgbm90IGFjY2VwdCB0aGUgY29udGFpbmVyIHdpdGhcbiAgICAgIC8vIHN0cmluZ3xIVE1MRWxlbWVudCB0eXBlIGRpcmVjdGx5LCBhbHRob3VnaCBpdCBhY2NlcHRzIGJvdGggdHlwZXMsIHNvIHdlIG5lZWQgdG8gc3BpdCB0aGVzZSB0d28gY2FzZXMgdXAgaGVyZS5cbiAgICAgIC8vIFRPRE8gY2hlY2sgaW4gdXBjb21pbmcgVFMgdmVyc2lvbnMgaWYgdGhlIGNvbnRhaW5lciBjYW4gYmUgcGFzc2VkIGluIGRpcmVjdGx5LCBvciBmaXggdGhlIGNvbnN0cnVjdG9yXG4gICAgICB0aGlzLnVpQ29udGFpbmVyRWxlbWVudCA9IHVpY29uZmlnLmNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID9cbiAgICAgICAgbmV3IERPTSh1aWNvbmZpZy5jb250YWluZXIpIDogbmV3IERPTSh1aWNvbmZpZy5jb250YWluZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVpQ29udGFpbmVyRWxlbWVudCA9IG5ldyBET00ocGxheWVyLmdldENvbnRhaW5lcigpKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgVUkgaW5zdGFuY2UgbWFuYWdlcnMgZm9yIHRoZSBVSSB2YXJpYW50c1xuICAgIC8vIFRoZSBpbnN0YW5jZSBtYW5hZ2VycyBtYXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgVUkgdmFyaWFudHMgYnkgdGhlaXIgYXJyYXkgaW5kZXhcbiAgICB0aGlzLnVpSW5zdGFuY2VNYW5hZ2VycyA9IFtdO1xuICAgIGxldCB1aVZhcmlhbnRzV2l0aG91dENvbmRpdGlvbiA9IFtdO1xuICAgIGZvciAobGV0IHVpVmFyaWFudCBvZiB0aGlzLnVpVmFyaWFudHMpIHtcbiAgICAgIGlmICh1aVZhcmlhbnQuY29uZGl0aW9uID09IG51bGwpIHtcbiAgICAgICAgLy8gQ29sbGVjdCB2YXJpYW50cyB3aXRob3V0IGNvbmRpdGlvbnMgZm9yIGVycm9yIGNoZWNraW5nXG4gICAgICAgIHVpVmFyaWFudHNXaXRob3V0Q29uZGl0aW9uLnB1c2godWlWYXJpYW50KTtcbiAgICAgIH1cbiAgICAgIC8vIENyZWF0ZSB0aGUgaW5zdGFuY2UgbWFuYWdlciBmb3IgYSBVSSB2YXJpYW50XG4gICAgICB0aGlzLnVpSW5zdGFuY2VNYW5hZ2Vycy5wdXNoKG5ldyBJbnRlcm5hbFVJSW5zdGFuY2VNYW5hZ2VyKHBsYXllciwgdWlWYXJpYW50LnVpLCB0aGlzLmNvbmZpZykpO1xuICAgIH1cbiAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBVSSB2YXJpYW50IHdpdGhvdXQgYSBjb25kaXRpb25cbiAgICAvLyBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGhhdmUgbXVsdGlwbGUgdmFyaWFudHMgd2l0aG91dCBjb25kaXRpb24sIGJlY2F1c2Ugb25seSB0aGUgZmlyc3Qgb25lIGluIHRoZSBsaXN0XG4gICAgLy8gKHRoZSBvbmUgd2l0aCB0aGUgbG93ZXN0IGluZGV4KSB3aWxsIGV2ZXIgYmUgc2VsZWN0ZWQuXG4gICAgaWYgKHVpVmFyaWFudHNXaXRob3V0Q29uZGl0aW9uLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IEVycm9yKCdUb28gbWFueSBVSXMgd2l0aG91dCBhIGNvbmRpdGlvbjogWW91IGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgZGVmYXVsdCBVSScpO1xuICAgIH1cbiAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVmYXVsdCBVSSB2YXJpYW50LCBpZiBkZWZpbmVkLCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IChsYXN0IGluZGV4KVxuICAgIC8vIElmIGl0IGNvbWVzIGVhcmxpZXIsIHRoZSB2YXJpYW50cyB3aXRoIGNvbmRpdGlvbnMgdGhhdCBjb21lIGFmdGVyd2FyZHMgd2lsbCBuZXZlciBiZSBzZWxlY3RlZCBiZWNhdXNlIHRoZVxuICAgIC8vIGRlZmF1bHQgdmFyaWFudCB3aXRob3V0IGEgY29uZGl0aW9uIGFsd2F5cyBldmFsdWF0ZXMgdG8gJ3RydWUnXG4gICAgaWYgKHVpVmFyaWFudHNXaXRob3V0Q29uZGl0aW9uLmxlbmd0aCA+IDBcbiAgICAgICYmIHVpVmFyaWFudHNXaXRob3V0Q29uZGl0aW9uWzBdICE9PSB0aGlzLnVpVmFyaWFudHNbdGhpcy51aVZhcmlhbnRzLmxlbmd0aCAtIDFdKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBVSSB2YXJpYW50IG9yZGVyOiB0aGUgZGVmYXVsdCBVSSAod2l0aG91dCBjb25kaXRpb24pIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCcpO1xuICAgIH1cblxuICAgIGxldCBhZFN0YXJ0ZWRFdmVudDogQWRFdmVudCA9IG51bGw7IC8vIGtlZXAgdGhlIGV2ZW50IHN0b3JlZCBoZXJlIGR1cmluZyBhZCBwbGF5YmFja1xuXG4gICAgLy8gRHluYW1pY2FsbHkgc2VsZWN0IGEgVUkgdmFyaWFudCB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgVUkgY29uZGl0aW9uLlxuICAgIGxldCByZXNvbHZlVWlWYXJpYW50ID0gKGV2ZW50OiBQbGF5ZXJFdmVudEJhc2UpID0+IHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBBZFN0YXJ0ZWQgZXZlbnQgZGF0YSBpcyBwZXJzaXN0ZWQgdGhyb3VnaCBhZCBwbGF5YmFjayBpbiBjYXNlIG90aGVyIGV2ZW50cyBoYXBwZW5cbiAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgZS5nLiBwbGF5ZXIgcmVzaXplLiBXZSBuZWVkIHRvIHN0b3JlIHRoaXMgZGF0YSBiZWNhdXNlIHRoZXJlIGlzIG5vIG90aGVyIHdheSB0byBmaW5kIG91dFxuICAgICAgLy8gYWQgZGV0YWlscyB3aGlsZSBhbiBhZCBpcyBwbGF5aW5nIChpbiB2OC4wIGF0IGxlYXN0OyBmcm9tIHY4LjEgdGhlcmUgd2lsbCBiZSBhZHMuZ2V0QWN0aXZlQWQoKSkuXG4gICAgICAvLyBFeGlzdGluZyBldmVudCBkYXRhIHNpZ25hbHMgdGhhdCBhbiBhZCBpcyBjdXJyZW50bHkgYWN0aXZlIChpbnN0ZWFkIG9mIGFkcy5pc0xpbmVhckFkQWN0aXZlKCkpLlxuICAgICAgaWYgKGV2ZW50ICE9IG51bGwpIHtcbiAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgICAgLy8gVGhlIGFkcyBVSSBpcyBzaG93biB1cG9uIHRoZSBmaXJzdCBBZFN0YXJ0ZWQgZXZlbnQuIFN1YnNlcXVlbnQgQWRTdGFydGVkIGV2ZW50cyB3aXRoaW4gYW4gYWQgYnJlYWtcbiAgICAgICAgICAvLyB3aWxsIG5vdCBjaGFuZ2UgdGhlIGNvbmRpdGlvbiBjb250ZXh0IGFuZCB0aHVzIG5vdCBsZWFkIHRvIHVuZGVzaXJlZCBVSSB2YXJpYW50IHJlc29sdmluZy5cbiAgICAgICAgICAvLyBUaGUgYWRzIFVJIGlzIHNob3duIHVwb24gQWRTdGFydGVkIGluc3RlYWQgb2YgQWRCcmVha1N0YXJ0ZWQgYmVjYXVzZSB0aGVyZSBjYW4gYmUgYSBsb2FkaW5nIGRlbGF5XG4gICAgICAgICAgLy8gYmV0d2VlbiB0aGVzZSB0d28gZXZlbnRzIGluIHRoZSBwbGF5ZXIsIGFuZCB0aGUgQWRCcmVha1N0YXJ0ZWQgZXZlbnQgZG9lcyBub3QgY2FycnkgYW55IG1ldGFkYXRhIHRvXG4gICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgYWRzIFVJLCBzbyBpdCB3b3VsZCBiZSByZW5kZXJlZCBpbiBhbiB1bmluaXRpYWxpemVkIHN0YXRlIGZvciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuXG4gICAgICAgICAgLy8gVE9ETyBzaG93IGFkcyBVSSB1cG9uIEFkQnJlYWtTdGFydGVkIGFuZCBkaXNwbGF5IGxvYWRpbmcgb3ZlcmxheSBiZXR3ZWVuIEFkQnJlYWtTdGFydGVkIGFuZCBmaXJzdCBBZFN0YXJ0ZWRcbiAgICAgICAgICAvLyBUT0RPIGRpc3BsYXkgbG9hZGluZyBvdmVybGF5IGJldHdlZW4gQWRGaW5pc2hlZCBhbmQgbmV4dCBBZFN0YXJ0ZWRcbiAgICAgICAgICBjYXNlIHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFkU3RhcnRlZDpcbiAgICAgICAgICAgIGFkU3RhcnRlZEV2ZW50ID0gZXZlbnQgYXMgQWRFdmVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIC8vIFRoZSBhZHMgVUkgaXMgaGlkZGVuIG9ubHkgd2hlbiB0aGUgYWQgYnJlYWsgaXMgZmluaXNoZWQsIGkuZS4gbm90IG9uIEFkRmluaXNoZWQgZXZlbnRzLiBUaGlzIHdheSB3ZSBrZWVwXG4gICAgICAgICAgLy8gdGhlIGFkcyBVSSB2YXJpYW50IGFjdGl2ZSB0aHJvdWdob3V0IGFuIGFkIGJyZWFrLCBhcyByZWFjdGluZyB0byBBZEZpbmlzaGVkIHdvdWxkIGxlYWQgdG8gdW5kZXNpcmVkIFVJXG4gICAgICAgICAgLy8gdmFyaWFudCBzd2l0Y2hpbmcgYmV0d2VlbiB0d28gYWRzIGluIGFuIGFkIGJyZWFrLCBlLmcuIGFkcyBVSSAtPiBBZEZpbmlzaGVkIC0+IGNvbnRlbnQgVUkgLT5cbiAgICAgICAgICAvLyBBZFN0YXJ0ZWQgLT4gYWRzIFVJLlxuICAgICAgICAgIGNhc2UgcGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRCcmVha0ZpbmlzaGVkOlxuICAgICAgICAgICAgYWRTdGFydGVkRXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgLy8gV2hlbiBzd2l0Y2hpbmcgdG8gYSB2YXJpYW50IGZvciB0aGUgZmlyc3QgdGltZSwgYSBjb25maWcuZXZlbnRzLm9uVXBkYXRlZCBldmVudCBpcyBmaXJlZCB0byB0cmlnZ2VyIGEgVUlcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBvZiB0aGUgbmV3IHZhcmlhbnQsIGJlY2F1c2UgbW9zdCBjb21wb25lbnRzIHN1YnNjcmliZSB0byB0aGlzIGV2ZW50IHRvIHVwZGF0ZSB0aGVtc2VsdmVzLiBXaGVuXG4gICAgICAgICAgICAvLyBzd2l0Y2hpbmcgdG8gdGhlIGFkcyBVSSBvbiB0aGUgZmlyc3QgQWRTdGFydGVkLCBhbGwgVUkgdmFyaWFudHMgdXBkYXRlIHRoZW1zZWx2ZXMgd2l0aCB0aGUgYWQgZGF0YSwgc29cbiAgICAgICAgICAgIC8vIHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gdGhlIFwibm9ybWFsXCIgVUkgaXQgd2lsbCBjYXJyeSBwcm9wZXJ0aWVzIG9mIHRoZSBhZCBpbnN0ZWFkIG9mIHRoZSBtYWluIGNvbnRlbnQuXG4gICAgICAgICAgICAvLyBXZSB0aHVzIGZpcmUgdGhpcyBldmVudCBoZXJlIHRvIGZvcmNlIGFuIFVJIHVwZGF0ZSB3aXRoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtYWluIGNvbnRlbnQuIFRoaXMgaXNcbiAgICAgICAgICAgIC8vIGJhc2ljYWxseSBhIGhhY2sgYmVjYXVzZSB0aGUgY29uZmlnLmV2ZW50cy5vblVwZGF0ZWQgZXZlbnQgaXMgYWJ1c2VkIGluIG1hbnkgcGxhY2VzIGFuZCBub3QganVzdCB1c2VkXG4gICAgICAgICAgICAvLyBmb3IgY29uZmlnIHVwZGF0ZXMgKGUuZy4gYWRkaW5nIGEgbWFya2VyIHRvIHRoZSBzZWVrYmFyKS5cbiAgICAgICAgICAgIC8vIFRPRE8gaW50cm9kdWNlIGFuIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgcGxheWJhY2sgY29udGVudCBpcyB1cGRhdGVkLCBhIHN3aXRjaCB0by9mcm9tIGFkc1xuICAgICAgICAgICAgdGhpcy5jb25maWcuZXZlbnRzLm9uVXBkYXRlZC5kaXNwYXRjaCh0aGlzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIC8vIFdoZW4gYSBuZXcgc291cmNlIGlzIGxvYWRlZCBkdXJpbmcgYWQgcGxheWJhY2ssIHRoZXJlIHdpbGwgYmUgbm8gQWQoQnJlYWspRmluaXNoZWQgZXZlbnRcbiAgICAgICAgICBjYXNlIHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZUxvYWRlZDpcbiAgICAgICAgICBjYXNlIHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZVVubG9hZGVkOlxuICAgICAgICAgICAgYWRTdGFydGVkRXZlbnQgPSBudWxsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZWN0IGlmIGFuIGFkIGhhcyBzdGFydGVkXG4gICAgICBsZXQgaXNBZCA9IGFkU3RhcnRlZEV2ZW50ICE9IG51bGw7XG4gICAgICBsZXQgYWRSZXF1aXJlc1VpID0gZmFsc2U7XG4gICAgICBpZiAoaXNBZCkge1xuICAgICAgICBsZXQgYWQgPSBhZFN0YXJ0ZWRFdmVudC5hZDtcbiAgICAgICAgLy8gZm9yIG5vdyBvbmx5IGxpbmVhciBhZHMgY2FuIHJlcXVlc3QgYSBVSVxuICAgICAgICBpZiAoYWQuaXNMaW5lYXIpIHtcbiAgICAgICAgICBsZXQgbGluZWFyQWQgPSBhZCBhcyBMaW5lYXJBZDtcbiAgICAgICAgICBhZFJlcXVpcmVzVWkgPSBsaW5lYXJBZC51aUNvbmZpZyAmJiBsaW5lYXJBZC51aUNvbmZpZy5yZXF1ZXN0c1VpIHx8IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZFJlcXVpcmVzVWkpIHtcbiAgICAgICAgLy8gd2UgZGlzcGF0Y2ggb25VcGRhdGVkIGV2ZW50IGJlY2F1c2UgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGFkQnJlYWtzIGZvciBzYW1lIHBvc2l0aW9uXG4gICAgICAgIC8vIGBQbGF5YCBhbmQgYFBsYXlpbmdgIGV2ZW50cyB3aWxsIG5vdCBiZSBkaXNwYXRjaGVkIHdoaWNoIHdpbGwgY2F1c2UgYFBsYXliYWNrQnV0dG9uYCBzdGF0ZVxuICAgICAgICAvLyB0byBiZSBvdXQgb2Ygc3luY1xuICAgICAgICB0aGlzLmNvbmZpZy5ldmVudHMub25VcGRhdGVkLmRpc3BhdGNoKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc29sdmVVaVZhcmlhbnQoe1xuICAgICAgICBpc0FkOiBpc0FkLFxuICAgICAgICBhZFJlcXVpcmVzVWk6IGFkUmVxdWlyZXNVaSxcbiAgICAgIH0sIChjb250ZXh0KSA9PiB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gYWQgVUksIHdlIG5lZWQgdG8gcmVsYXkgdGhlIHNhdmVkIE9OX0FEX1NUQVJURUQgZXZlbnQgZGF0YSBzbyBhZCBjb21wb25lbnRzIGNhbiBjb25maWd1cmVcbiAgICAgICAgLy8gdGhlbXNlbHZlcyBmb3IgdGhlIGN1cnJlbnQgYWQuXG4gICAgICAgIGlmIChjb250ZXh0LmlzQWQpIHtcbiAgICAgICAgICAvKiBSZWxheSB0aGUgT05fQURfU1RBUlRFRCBldmVudCB0byB0aGUgYWRzIFVJXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBCZWNhdXNlIHRoZSBhZHMgVUkgaXMgaW5pdGlhbGl6ZWQgaW4gdGhlIE9OX0FEX1NUQVJURUQgaGFuZGxlciwgaS5lLiB3aGVuIHRoZSBPTl9BRF9TVEFSVEVEIGV2ZW50IGhhc1xuICAgICAgICAgICAqIGFscmVhZHkgYmVlbiBmaXJlZCwgY29tcG9uZW50cyBpbiB0aGUgYWRzIFVJIHRoYXQgbGlzdGVuIGZvciB0aGUgT05fQURfU1RBUlRFRCBldmVudCBuZXZlciByZWNlaXZlIGl0LlxuICAgICAgICAgICAqIFNpbmNlIHRoaXMgY2FuIGJyZWFrIGZ1bmN0aW9uYWxpdHkgb2YgY29tcG9uZW50cyB0aGF0IHJlbHkgb24gdGhpcyBldmVudCwgd2UgcmVsYXkgdGhlIGV2ZW50IHRvIHRoZVxuICAgICAgICAgICAqIGFkcyBVSSBjb21wb25lbnRzIHdpdGggdGhlIGZvbGxvd2luZyBjYWxsLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuY3VycmVudFVpLmdldFdyYXBwZWRQbGF5ZXIoKS5maXJlRXZlbnRJblVJKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRTdGFydGVkLCBhZFN0YXJ0ZWRFdmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gdG8gdGhlIGZvbGxvd2luZyBldmVudHMgdG8gdHJpZ2dlciBVSSB2YXJpYW50IHJlc29sdXRpb25cbiAgICBpZiAodGhpcy5jb25maWcuYXV0b1VpVmFyaWFudFJlc29sdmUpIHtcbiAgICAgIHRoaXMubWFuYWdlclBsYXllcldyYXBwZXIuZ2V0UGxheWVyKCkub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VMb2FkZWQsIHJlc29sdmVVaVZhcmlhbnQpO1xuICAgICAgdGhpcy5tYW5hZ2VyUGxheWVyV3JhcHBlci5nZXRQbGF5ZXIoKS5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZVVubG9hZGVkLCByZXNvbHZlVWlWYXJpYW50KTtcbiAgICAgIHRoaXMubWFuYWdlclBsYXllcldyYXBwZXIuZ2V0UGxheWVyKCkub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCByZXNvbHZlVWlWYXJpYW50KTtcbiAgICAgIHRoaXMubWFuYWdlclBsYXllcldyYXBwZXIuZ2V0UGxheWVyKCkub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QYXVzZWQsIHJlc29sdmVVaVZhcmlhbnQpO1xuICAgICAgdGhpcy5tYW5hZ2VyUGxheWVyV3JhcHBlci5nZXRQbGF5ZXIoKS5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFkU3RhcnRlZCwgcmVzb2x2ZVVpVmFyaWFudCk7XG4gICAgICB0aGlzLm1hbmFnZXJQbGF5ZXJXcmFwcGVyLmdldFBsYXllcigpLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRCcmVha0ZpbmlzaGVkLCByZXNvbHZlVWlWYXJpYW50KTtcbiAgICAgIHRoaXMubWFuYWdlclBsYXllcldyYXBwZXIuZ2V0UGxheWVyKCkub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5ZXJSZXNpemVkLCByZXNvbHZlVWlWYXJpYW50KTtcbiAgICAgIHRoaXMubWFuYWdlclBsYXllcldyYXBwZXIuZ2V0UGxheWVyKCkub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5WaWV3TW9kZUNoYW5nZWQsIHJlc29sdmVVaVZhcmlhbnQpO1xuICAgIH1cblxuICAgIHRoaXMuZm9jdXNWaXNpYmlsaXR5VHJhY2tlciA9IG5ldyBGb2N1c1Zpc2liaWxpdHlUcmFja2VyKCd7e1BSRUZJWH19Jyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBVSVxuICAgIHJlc29sdmVVaVZhcmlhbnQobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3NlcyBpMThuLmdldExvY2FsaXplcigpIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIHtJMThuQXBpLmdldExvY2FsaXplcigpfVxuICAgKi9cbiAgc3RhdGljIGxvY2FsaXplPFYgZXh0ZW5kcyBDdXN0b21Wb2NhYnVsYXJ5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PihrZXk6IGtleW9mIFYpIHtcbiAgICByZXR1cm4gaTE4bi5nZXRMb2NhbGl6ZXIoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlIGNvbmZpZ3VyYXRpb24gdG8gc3VwcG9ydCBDdXN0b20gVUkgbGFuZ3VhZ2VzXG4gICAqIGRlZmF1bHQgbGFuZ3VhZ2U6ICdlbidcbiAgICovXG4gIHN0YXRpYyBzZXRMb2NhbGl6YXRpb25Db25maWcobG9jYWxpemF0aW9uQ29uZmlnOiBMb2NhbGl6YXRpb25Db25maWcpIHtcbiAgICBpMThuLnNldENvbmZpZyhsb2NhbGl6YXRpb25Db25maWcpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IFVJQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBVSSB2YXJpYW50cyBhcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igb2Yge0BsaW5rIFVJTWFuYWdlcn0uXG4gICAqIEByZXR1cm5zIHtVSVZhcmlhbnRbXX0gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIFVJIHZhcmlhbnRzXG4gICAqL1xuICBnZXRVaVZhcmlhbnRzKCk6IFVJVmFyaWFudFtdIHtcbiAgICByZXR1cm4gdGhpcy51aVZhcmlhbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaGVzIHRvIGEgVUkgdmFyaWFudCBmcm9tIHRoZSBsaXN0IHJldHVybmVkIGJ5IHtAbGluayBnZXRVaVZhcmlhbnRzfS5cbiAgICogQHBhcmFtIHtVSVZhcmlhbnR9IHVpVmFyaWFudCB0aGUgVUkgdmFyaWFudCB0byBzd2l0Y2ggdG9cbiAgICogQHBhcmFtIHsoKSA9PiB2b2lkfSBvblNob3cgYSBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIGp1c3QgYmVmb3JlIHRoZSBuZXcgVUkgdmFyaWFudCBpcyBzaG93blxuICAgKi9cbiAgc3dpdGNoVG9VaVZhcmlhbnQodWlWYXJpYW50OiBVSVZhcmlhbnQsIG9uU2hvdz86ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBsZXQgdWlWYXJpYW50SW5kZXggPSB0aGlzLnVpVmFyaWFudHMuaW5kZXhPZih1aVZhcmlhbnQpO1xuXG4gICAgY29uc3QgbmV4dFVpOiBJbnRlcm5hbFVJSW5zdGFuY2VNYW5hZ2VyID0gdGhpcy51aUluc3RhbmNlTWFuYWdlcnNbdWlWYXJpYW50SW5kZXhdO1xuICAgIGxldCB1aVZhcmlhbnRDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIFVJIHZhcmlhbnQgaXMgY2hhbmdpbmdcbiAgICBpZiAobmV4dFVpICE9PSB0aGlzLmN1cnJlbnRVaSkge1xuICAgICAgdWlWYXJpYW50Q2hhbmdlZCA9IHRydWU7XG4gICAgICAvLyBjb25zb2xlLmxvZygnc3dpdGNoZWQgZnJvbSAnLCB0aGlzLmN1cnJlbnRVaSA/IHRoaXMuY3VycmVudFVpLmdldFVJKCkgOiAnbm9uZScsXG4gICAgICAvLyAgICcgdG8gJywgbmV4dFVpID8gbmV4dFVpLmdldFVJKCkgOiAnbm9uZScpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgaWYgdGhlIFVJIHZhcmlhbnQgaXMgY2hhbmdpbmcsIHdlIG5lZWQgdG8gZG8gc29tZSBzdHVmZi4gRWxzZSB3ZSBqdXN0IGxlYXZlIGV2ZXJ5dGhpbmcgYXMtaXMuXG4gICAgaWYgKHVpVmFyaWFudENoYW5nZWQpIHtcbiAgICAgIC8vIEhpZGUgdGhlIGN1cnJlbnRseSBhY3RpdmUgVUkgdmFyaWFudFxuICAgICAgaWYgKHRoaXMuY3VycmVudFVpKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFVpLmdldFVJKCkuaGlkZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ24gdGhlIG5ldyBVSSB2YXJpYW50IGFzIGN1cnJlbnQgVUlcbiAgICAgIHRoaXMuY3VycmVudFVpID0gbmV4dFVpO1xuXG4gICAgICAvLyBXaGVuIHdlIHN3aXRjaCB0byBhIGRpZmZlcmVudCBVSSBpbnN0YW5jZSwgdGhlcmUncyBzb21lIGFkZGl0aW9uYWwgc3R1ZmYgdG8gbWFuYWdlLiBJZiB3ZSBkbyBub3Qgc3dpdGNoXG4gICAgICAvLyB0byBhbiBpbnN0YW5jZSwgd2UncmUgZG9uZSBoZXJlLlxuICAgICAgaWYgKHRoaXMuY3VycmVudFVpICE9IG51bGwpIHtcbiAgICAgICAgLy8gQWRkIHRoZSBVSSB0byB0aGUgRE9NIChhbmQgY29uZmlndXJlIGl0KSB0aGUgZmlyc3QgdGltZSBpdCBpcyBzZWxlY3RlZFxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFVpLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgICAgICAgdGhpcy5hZGRVaSh0aGlzLmN1cnJlbnRVaSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob25TaG93KSB7XG4gICAgICAgICAgb25TaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cnJlbnRVaS5nZXRVSSgpLnNob3coKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBVSSB2YXJpYW50IHN3aXRjaCBhcyB0cmlnZ2VyZWQgYnkgZXZlbnRzIHdoZW4gYXV0b21hdGljIHN3aXRjaGluZyBpcyBlbmFibGVkLiBJdCBhbGxvd3MgdG8gb3ZlcndyaXRlXG4gICAqIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBVSUNvbmRpdGlvbkNvbnRleHR9LlxuICAgKiBAcGFyYW0ge1BhcnRpYWw8VUlDb25kaXRpb25Db250ZXh0Pn0gY29udGV4dCBhbiBvcHRpb25hbCBzZXQgb2YgcHJvcGVydGllcyB0aGF0IG92ZXJ3cml0ZSBwcm9wZXJ0aWVzIG9mIHRoZVxuICAgKiAgIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBjb250ZXh0XG4gICAqIEBwYXJhbSB7KGNvbnRleHQ6IFVJQ29uZGl0aW9uQ29udGV4dCkgPT4gdm9pZH0gb25TaG93IGEgY2FsbGJhY2sgdGhhdCBpcyBleGVjdXRlZCBqdXN0IGJlZm9yZSB0aGUgbmV3IFVJIHZhcmlhbnRcbiAgICogICBpcyBzaG93biAoaWYgYSBzd2l0Y2ggaXMgaGFwcGVuaW5nKVxuICAgKi9cbiAgcmVzb2x2ZVVpVmFyaWFudChjb250ZXh0OiBQYXJ0aWFsPFVJQ29uZGl0aW9uQ29udGV4dD4gPSB7fSwgb25TaG93PzogKGNvbnRleHQ6IFVJQ29uZGl0aW9uQ29udGV4dCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIC8vIERldGVybWluZSB0aGUgY3VycmVudCBjb250ZXh0IGZvciB3aGljaCB0aGUgVUkgdmFyaWFudCB3aWxsIGJlIHJlc29sdmVkXG4gICAgY29uc3QgZGVmYXVsdENvbnRleHQ6IFVJQ29uZGl0aW9uQ29udGV4dCA9IHtcbiAgICAgIGlzQWQ6IGZhbHNlLFxuICAgICAgYWRSZXF1aXJlc1VpOiBmYWxzZSxcbiAgICAgIGlzRnVsbHNjcmVlbjogdGhpcy5wbGF5ZXIuZ2V0Vmlld01vZGUoKSA9PT0gdGhpcy5wbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5GdWxsc2NyZWVuLFxuICAgICAgaXNNb2JpbGU6IEJyb3dzZXJVdGlscy5pc01vYmlsZSxcbiAgICAgIGlzUGxheWluZzogdGhpcy5wbGF5ZXIuaXNQbGF5aW5nKCksXG4gICAgICB3aWR0aDogdGhpcy51aUNvbnRhaW5lckVsZW1lbnQud2lkdGgoKSxcbiAgICAgIGRvY3VtZW50V2lkdGg6IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsXG4gICAgfTtcblxuICAgIC8vIE92ZXJ3cml0ZSBwcm9wZXJ0aWVzIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQgd2l0aCBwYXNzZWQgaW4gY29udGV4dCBwcm9wZXJ0aWVzXG4gICAgY29uc3Qgc3dpdGNoaW5nQ29udGV4dCA9IHsgLi4uZGVmYXVsdENvbnRleHQsIC4uLmNvbnRleHQgfTtcblxuICAgIC8vIEZpcmUgdGhlIGV2ZW50IGFuZCBhbGxvdyBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRleHQgYmVmb3JlIGl0IGlzIHVzZWQgdG8gcmVzb2x2ZSB0aGUgVUkgdmFyaWFudFxuICAgIHRoaXMuZXZlbnRzLm9uVWlWYXJpYW50UmVzb2x2ZS5kaXNwYXRjaCh0aGlzLCBzd2l0Y2hpbmdDb250ZXh0KTtcblxuICAgIGxldCBuZXh0VWlWYXJpYW50OiBVSVZhcmlhbnQgPSBudWxsO1xuXG4gICAgLy8gU2VsZWN0IG5ldyBVSSB2YXJpYW50XG4gICAgLy8gSWYgbm8gdmFyaWFudCBjb25kaXRpb24gaXMgZnVsZmlsbGVkLCB3ZSBzd2l0Y2ggdG8gKm5vKiBVSVxuICAgIGZvciAobGV0IHVpVmFyaWFudCBvZiB0aGlzLnVpVmFyaWFudHMpIHtcbiAgICAgIGlmICh1aVZhcmlhbnQuY29uZGl0aW9uID09IG51bGwgfHwgdWlWYXJpYW50LmNvbmRpdGlvbihzd2l0Y2hpbmdDb250ZXh0KSA9PT0gdHJ1ZSkge1xuICAgICAgICBuZXh0VWlWYXJpYW50ID0gdWlWYXJpYW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN3aXRjaFRvVWlWYXJpYW50KG5leHRVaVZhcmlhbnQsICgpID0+IHtcbiAgICAgIGlmIChvblNob3cpIHtcbiAgICAgICAgb25TaG93KHN3aXRjaGluZ0NvbnRleHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRVaSh1aTogSW50ZXJuYWxVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIGxldCBkb20gPSB1aS5nZXRVSSgpLmdldERvbUVsZW1lbnQoKTtcbiAgICBsZXQgcGxheWVyID0gdWkuZ2V0V3JhcHBlZFBsYXllcigpO1xuXG4gICAgdWkuY29uZmlndXJlQ29udHJvbHMoKTtcbiAgICAvKiBBcHBlbmQgdGhlIFVJIERPTSBhZnRlciBjb25maWd1cmF0aW9uIHRvIGF2b2lkIENTUyB0cmFuc2l0aW9ucyBhdCBpbml0aWFsaXphdGlvblxuICAgICAqIEV4YW1wbGU6IENvbXBvbmVudHMgYXJlIGhpZGRlbiBkdXJpbmcgY29uZmlndXJhdGlvbiBhbmQgdGhlc2UgaGlkZXMgbWF5IHRyaWdnZXIgQ1NTIHRyYW5zaXRpb25zIHRoYXQgYXJlXG4gICAgICogdW5kZXNpcmFibGUgYXQgdGhpcyB0aW1lLiAqL1xuICAgIHRoaXMudWlDb250YWluZXJFbGVtZW50LmFwcGVuZChkb20pO1xuXG4gICAgLy8gV2hlbiB0aGUgVUkgaXMgbG9hZGVkIGFmdGVyIGEgc291cmNlIHdhcyBsb2FkZWQsIHdlIG5lZWQgdG8gdGVsbCB0aGUgY29tcG9uZW50cyB0byBpbml0aWFsaXplIHRoZW1zZWx2ZXNcbiAgICBpZiAocGxheWVyLmdldFNvdXJjZSgpKSB7XG4gICAgICB0aGlzLmNvbmZpZy5ldmVudHMub25VcGRhdGVkLmRpc3BhdGNoKHRoaXMpO1xuICAgIH1cblxuICAgIC8vIEZpcmUgb25Db25maWd1cmVkIGFmdGVyIFVJIERPTSBlbGVtZW50cyBhcmUgc3VjY2Vzc2Z1bGx5IGFkZGVkLiBXaGVuIGZpcmVkIGltbWVkaWF0ZWx5LCB0aGUgRE9NIGVsZW1lbnRzXG4gICAgLy8gbWlnaHQgbm90IGJlIGZ1bGx5IGNvbmZpZ3VyZWQgYW5kIGUuZy4gZG8gbm90IGhhdmUgYSBzaXplLlxuICAgIC8vIGh0dHBzOi8vc3dpemVjLmNvbS9ibG9nL2hvdy10by1wcm9wZXJseS13YWl0LWZvci1kb20tZWxlbWVudHMtdG8tc2hvdy11cC1pbi1tb2Rlcm4tYnJvd3NlcnMvc3dpemVjLzY2NjNcbiAgICBpZiAod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgdWkub25Db25maWd1cmVkLmRpc3BhdGNoKHVpLmdldFVJKCkpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSUU5IGZhbGxiYWNrXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdWkub25Db25maWd1cmVkLmRpc3BhdGNoKHVpLmdldFVJKCkpOyB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbGVhc2VVaSh1aTogSW50ZXJuYWxVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHVpLnJlbGVhc2VDb250cm9scygpO1xuICAgIHVpLmdldFVJKCkuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZSgpO1xuICAgIHVpLmNsZWFyRXZlbnRIYW5kbGVycygpO1xuICB9XG5cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBmb3IgKGxldCB1aUluc3RhbmNlTWFuYWdlciBvZiB0aGlzLnVpSW5zdGFuY2VNYW5hZ2Vycykge1xuICAgICAgdGhpcy5yZWxlYXNlVWkodWlJbnN0YW5jZU1hbmFnZXIpO1xuICAgIH1cbiAgICB0aGlzLm1hbmFnZXJQbGF5ZXJXcmFwcGVyLmNsZWFyRXZlbnRIYW5kbGVycygpO1xuICAgIHRoaXMuZm9jdXNWaXNpYmlsaXR5VHJhY2tlci5yZWxlYXNlKCk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMganVzdCBiZWZvcmUgVUkgdmFyaWFudHMgYXJlIGFib3V0IHRvIGJlIHJlc29sdmVkIGFuZCB0aGUgVUkgdmFyaWFudCBpcyBwb3NzaWJseSBzd2l0Y2hlZC4gSXQgaXMgZmlyZWQgd2hlblxuICAgKiB0aGUgc3dpdGNoIGlzIHRyaWdnZXJlZCBmcm9tIGFuIGF1dG9tYXRpYyBzd2l0Y2ggYW5kIHdoZW4gY2FsbGluZyB7QGxpbmsgcmVzb2x2ZVVpVmFyaWFudH0uXG4gICAqIENhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUge0BsaW5rIFVJQ29uZGl0aW9uQ29udGV4dH0gYmVmb3JlIHJlc29sdmluZyBpcyBkb25lLlxuICAgKiBAcmV0dXJucyB7RXZlbnREaXNwYXRjaGVyPFVJTWFuYWdlciwgVUlDb25kaXRpb25Db250ZXh0Pn1cbiAgICovXG4gIGdldCBvblVpVmFyaWFudFJlc29sdmUoKTogRXZlbnREaXNwYXRjaGVyPFVJTWFuYWdlciwgVUlDb25kaXRpb25Db250ZXh0PiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLm9uVWlWYXJpYW50UmVzb2x2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBhZGRlZCBtYXJrZXJzIGluIHVuZGVmaW5lZCBvcmRlci5cbiAgICovXG4gIGdldFRpbWVsaW5lTWFya2VycygpOiBUaW1lbGluZU1hcmtlcltdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubWV0YWRhdGEubWFya2VycztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbWFya2VyIHRvIHRoZSB0aW1lbGluZS4gRG9lcyBub3QgY2hlY2sgZm9yIGR1cGxpY2F0ZXMvb3ZlcmxhcHMgYXQgdGhlIGB0aW1lYC5cbiAgICovXG4gIGFkZFRpbWVsaW5lTWFya2VyKHRpbWVsaW5lTWFya2VyOiBUaW1lbGluZU1hcmtlcik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLm1ldGFkYXRhLm1hcmtlcnMucHVzaCh0aW1lbGluZU1hcmtlcik7XG4gICAgdGhpcy5jb25maWcuZXZlbnRzLm9uVXBkYXRlZC5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgbWFya2VyIGZyb20gdGhlIHRpbWVsaW5lIChieSByZWZlcmVuY2UpIGFuZCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWFya2VyIGhhc1xuICAgKiBiZWVuIHBhcnQgb2YgdGhlIHRpbWVsaW5lIGFuZCBzdWNjZXNzZnVsbHkgcmVtb3ZlZCwgb3IgYGZhbHNlYCBpZiB0aGUgbWFya2VyIGNvdWxkIG5vdFxuICAgKiBiZSBmb3VuZCBhbmQgdGh1cyBub3QgcmVtb3ZlZC5cbiAgICovXG4gIHJlbW92ZVRpbWVsaW5lTWFya2VyKHRpbWVsaW5lTWFya2VyOiBUaW1lbGluZU1hcmtlcik6IGJvb2xlYW4ge1xuICAgIGlmIChBcnJheVV0aWxzLnJlbW92ZSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tYXJrZXJzLCB0aW1lbGluZU1hcmtlcikgPT09IHRpbWVsaW5lTWFya2VyKSB7XG4gICAgICB0aGlzLmNvbmZpZy5ldmVudHMub25VcGRhdGVkLmRpc3BhdGNoKHRoaXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vla1ByZXZpZXdBcmdzIGV4dGVuZHMgTm9BcmdzIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lbGluZSBwb3NpdGlvbiBpbiBwZXJjZW50IHdoZXJlIHRoZSBldmVudCBvcmlnaW5hdGVzIGZyb20uXG4gICAqL1xuICBwb3NpdGlvbjogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRpbWVsaW5lIG1hcmtlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgcG9zaXRpb24sIGlmIGV4aXN0aW5nLlxuICAgKi9cbiAgbWFya2VyPzogU2Vla0Jhck1hcmtlcjtcbn1cblxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgZnVuY3Rpb25hbGl0eSB0byBtYW5hZ2UgYSBVSSBpbnN0YW5jZS4gVXNlZCBieSB0aGUge0BsaW5rIFVJTWFuYWdlcn0gdG8gbWFuYWdlIG11bHRpcGxlIFVJIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFVJSW5zdGFuY2VNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBwbGF5ZXJXcmFwcGVyOiBQbGF5ZXJXcmFwcGVyO1xuICBwcml2YXRlIHVpOiBVSUNvbnRhaW5lcjtcbiAgcHJpdmF0ZSBjb25maWc6IEludGVybmFsVUlDb25maWc7XG5cbiAgcHJpdmF0ZSBldmVudHMgPSB7XG4gICAgb25Db25maWd1cmVkOiBuZXcgRXZlbnREaXNwYXRjaGVyPFVJQ29udGFpbmVyLCBOb0FyZ3M+KCksXG4gICAgb25TZWVrOiBuZXcgRXZlbnREaXNwYXRjaGVyPFNlZWtCYXIsIE5vQXJncz4oKSxcbiAgICBvblNlZWtQcmV2aWV3OiBuZXcgRXZlbnREaXNwYXRjaGVyPFNlZWtCYXIsIFNlZWtQcmV2aWV3QXJncz4oKSxcbiAgICBvblNlZWtlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxTZWVrQmFyLCBOb0FyZ3M+KCksXG4gICAgb25Db21wb25lbnRTaG93OiBuZXcgRXZlbnREaXNwYXRjaGVyPENvbXBvbmVudDxDb21wb25lbnRDb25maWc+LCBOb0FyZ3M+KCksXG4gICAgb25Db21wb25lbnRIaWRlOiBuZXcgRXZlbnREaXNwYXRjaGVyPENvbXBvbmVudDxDb21wb25lbnRDb25maWc+LCBOb0FyZ3M+KCksXG4gICAgb25Db250cm9sc1Nob3c6IG5ldyBFdmVudERpc3BhdGNoZXI8VUlDb250YWluZXIsIE5vQXJncz4oKSxcbiAgICBvblByZXZpZXdDb250cm9sc0hpZGU6IG5ldyBFdmVudERpc3BhdGNoZXI8VUlDb250YWluZXIsIENhbmNlbEV2ZW50QXJncz4oKSxcbiAgICBvbkNvbnRyb2xzSGlkZTogbmV3IEV2ZW50RGlzcGF0Y2hlcjxVSUNvbnRhaW5lciwgTm9BcmdzPigpLFxuICAgIG9uUmVsZWFzZTogbmV3IEV2ZW50RGlzcGF0Y2hlcjxVSUNvbnRhaW5lciwgTm9BcmdzPigpLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyQVBJLCB1aTogVUlDb250YWluZXIsIGNvbmZpZzogSW50ZXJuYWxVSUNvbmZpZykge1xuICAgIHRoaXMucGxheWVyV3JhcHBlciA9IG5ldyBQbGF5ZXJXcmFwcGVyKHBsYXllcik7XG4gICAgdGhpcy51aSA9IHVpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IEludGVybmFsVUlDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIGdldFVJKCk6IFVJQ29udGFpbmVyIHtcbiAgICByZXR1cm4gdGhpcy51aTtcbiAgfVxuXG4gIGdldFBsYXllcigpOiBQbGF5ZXJBUEkge1xuICAgIHJldHVybiB0aGlzLnBsYXllcldyYXBwZXIuZ2V0UGxheWVyKCk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgVUkgaXMgZnVsbHkgY29uZmlndXJlZCBhbmQgYWRkZWQgdG8gdGhlIERPTS5cbiAgICogQHJldHVybnMge0V2ZW50RGlzcGF0Y2hlcn1cbiAgICovXG4gIGdldCBvbkNvbmZpZ3VyZWQoKTogRXZlbnREaXNwYXRjaGVyPFVJQ29udGFpbmVyLCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMub25Db25maWd1cmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gYSBzZWVrIHN0YXJ0cy5cbiAgICogQHJldHVybnMge0V2ZW50RGlzcGF0Y2hlcn1cbiAgICovXG4gIGdldCBvblNlZWsoKTogRXZlbnREaXNwYXRjaGVyPFNlZWtCYXIsIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5vblNlZWs7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgc2VlayB0aW1lbGluZSBpcyBzY3J1YmJlZC5cbiAgICogQHJldHVybnMge0V2ZW50RGlzcGF0Y2hlcn1cbiAgICovXG4gIGdldCBvblNlZWtQcmV2aWV3KCk6IEV2ZW50RGlzcGF0Y2hlcjxTZWVrQmFyLCBTZWVrUHJldmlld0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMub25TZWVrUHJldmlldztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGEgc2VlayBpcyBmaW5pc2hlZC5cbiAgICogQHJldHVybnMge0V2ZW50RGlzcGF0Y2hlcn1cbiAgICovXG4gIGdldCBvblNlZWtlZCgpOiBFdmVudERpc3BhdGNoZXI8U2Vla0JhciwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLm9uU2Vla2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gYSBjb21wb25lbnQgaXMgc2hvd2luZy5cbiAgICogQHJldHVybnMge0V2ZW50RGlzcGF0Y2hlcn1cbiAgICovXG4gIGdldCBvbkNvbXBvbmVudFNob3coKTogRXZlbnREaXNwYXRjaGVyPENvbXBvbmVudDxDb21wb25lbnRDb25maWc+LCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMub25Db21wb25lbnRTaG93O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gYSBjb21wb25lbnQgaXMgaGlkaW5nLlxuICAgKiBAcmV0dXJucyB7RXZlbnREaXNwYXRjaGVyfVxuICAgKi9cbiAgZ2V0IG9uQ29tcG9uZW50SGlkZSgpOiBFdmVudERpc3BhdGNoZXI8Q29tcG9uZW50PENvbXBvbmVudENvbmZpZz4sIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5vbkNvbXBvbmVudEhpZGU7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgVUkgY29udHJvbHMgYXJlIHNob3dpbmcuXG4gICAqIEByZXR1cm5zIHtFdmVudERpc3BhdGNoZXJ9XG4gICAqL1xuICBnZXQgb25Db250cm9sc1Nob3coKTogRXZlbnREaXNwYXRjaGVyPFVJQ29udGFpbmVyLCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMub25Db250cm9sc1Nob3c7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgYmVmb3JlIHRoZSBVSSBjb250cm9scyBhcmUgaGlkaW5nIHRvIGNoZWNrIGlmIHRoZXkgYXJlIGFsbG93ZWQgdG8gaGlkZS5cbiAgICogQHJldHVybnMge0V2ZW50RGlzcGF0Y2hlcn1cbiAgICovXG4gIGdldCBvblByZXZpZXdDb250cm9sc0hpZGUoKTogRXZlbnREaXNwYXRjaGVyPFVJQ29udGFpbmVyLCBDYW5jZWxFdmVudEFyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMub25QcmV2aWV3Q29udHJvbHNIaWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIFVJIGNvbnRyb2xzIGFyZSBoaWRpbmcuXG4gICAqIEByZXR1cm5zIHtFdmVudERpc3BhdGNoZXJ9XG4gICAqL1xuICBnZXQgb25Db250cm9sc0hpZGUoKTogRXZlbnREaXNwYXRjaGVyPFVJQ29udGFpbmVyLCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMub25Db250cm9sc0hpZGU7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgVUkgY29udHJvbHMgYXJlIHJlbGVhc2VkLlxuICAgKiBAcmV0dXJucyB7RXZlbnREaXNwYXRjaGVyfVxuICAgKi9cbiAgZ2V0IG9uUmVsZWFzZSgpOiBFdmVudERpc3BhdGNoZXI8VUlDb250YWluZXIsIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5vblJlbGVhc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIHRoaXMucGxheWVyV3JhcHBlci5jbGVhckV2ZW50SGFuZGxlcnMoKTtcblxuICAgIGxldCBldmVudHMgPSA8YW55PnRoaXMuZXZlbnRzOyAvLyBhdm9pZCBUUzcwMTdcbiAgICBmb3IgKGxldCBldmVudCBpbiBldmVudHMpIHtcbiAgICAgIGxldCBkaXNwYXRjaGVyID0gPEV2ZW50RGlzcGF0Y2hlcjxPYmplY3QsIE9iamVjdD4+ZXZlbnRzW2V2ZW50XTtcbiAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmVBbGwoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRlbmRzIHRoZSB7QGxpbmsgVUlJbnN0YW5jZU1hbmFnZXJ9IGZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIHtAbGluayBVSU1hbmFnZXJ9IGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gZnVuY3Rpb25hbGl0eVxuICogdGhhdCBjb21wb25lbnRzIHJlY2VpdmluZyBhIHJlZmVyZW5jZSB0byB0aGUge0BsaW5rIFVJSW5zdGFuY2VNYW5hZ2VyfSBzaG91bGQgbm90IGhhdmUgYWNjZXNzIHRvLlxuICovXG5jbGFzcyBJbnRlcm5hbFVJSW5zdGFuY2VNYW5hZ2VyIGV4dGVuZHMgVUlJbnN0YW5jZU1hbmFnZXIge1xuXG4gIHByaXZhdGUgY29uZmlndXJlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWxlYXNlZDogYm9vbGVhbjtcblxuICBnZXRXcmFwcGVkUGxheWVyKCk6IFdyYXBwZWRQbGF5ZXIge1xuICAgIC8vIFRPRE8gZmluZCBhIG5vbi1oYWNreSB3YXkgdG8gcHJvdmlkZSB0aGUgV3JhcHBlZFBsYXllciB0byB0aGUgVUlNYW5hZ2VyIHdpdGhvdXQgZXhwb3J0aW5nIGl0XG4gICAgLy8gZ2V0UGxheWVyKCkgYWN0dWFsbHkgcmV0dXJucyB0aGUgV3JhcHBlZFBsYXllciBidXQgaXRzIHJldHVybiB0eXBlIGlzIHNldCB0byBQbGF5ZXIgc28gdGhlIFdyYXBwZWRQbGF5ZXIgZG9lc1xuICAgIC8vIG5vdCBuZWVkIHRvIGJlIGV4cG9ydGVkXG4gICAgcmV0dXJuIDxXcmFwcGVkUGxheWVyPnRoaXMuZ2V0UGxheWVyKCk7XG4gIH1cblxuICBjb25maWd1cmVDb250cm9scygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ3VyZUNvbnRyb2xzVHJlZSh0aGlzLmdldFVJKCkpO1xuICAgIHRoaXMuY29uZmlndXJlZCA9IHRydWU7XG4gIH1cblxuICBpc0NvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJlZDtcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlQ29udHJvbHNUcmVlKGNvbXBvbmVudDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4pIHtcbiAgICBsZXQgY29uZmlndXJlZENvbXBvbmVudHM6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+W10gPSBbXTtcblxuICAgIFVJVXRpbHMudHJhdmVyc2VUcmVlKGNvbXBvbmVudCwgKGNvbXBvbmVudCkgPT4ge1xuICAgICAgLy8gRmlyc3QsIGNoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBjb25maWd1cmVkIGEgY29tcG9uZW50LCBhbmQgdGhyb3cgYW4gZXJyb3IgaWYgd2UgZGlkLiBNdWx0aXBsZSBjb25maWd1cmF0aW9uXG4gICAgICAvLyBvZiB0aGUgc2FtZSBjb21wb25lbnQgbGVhZHMgdG8gdW5leHBlY3RlZCBVSSBiZWhhdmlvci4gQWxzbywgYSBjb21wb25lbnQgdGhhdCBpcyBpbiB0aGUgVUkgdHJlZSBtdWx0aXBsZVxuICAgICAgLy8gdGltZXMgaGludHMgYXQgYSB3cm9uZyBVSSBzdHJ1Y3R1cmUuXG4gICAgICAvLyBXZSBjb3VsZCBqdXN0IHNraXAgY29uZmlndXJhdGlvbiBpbiBzdWNoIGEgY2FzZSBhbmQgbm90IHRocm93IGFuIGV4Y2VwdGlvbiwgYnV0IGVuZm9yY2luZyBhIGNsZWFuIFVJIHRyZWVcbiAgICAgIC8vIHNlZW1zIGxpa2UgdGhlIGJldHRlciBjaG9pY2UuXG4gICAgICBmb3IgKGxldCBjb25maWd1cmVkQ29tcG9uZW50IG9mIGNvbmZpZ3VyZWRDb21wb25lbnRzKSB7XG4gICAgICAgIGlmIChjb25maWd1cmVkQ29tcG9uZW50ID09PSBjb21wb25lbnQpIHtcbiAgICAgICAgICAvLyBXcml0ZSB0aGUgY29tcG9uZW50IHRvIHRoZSBjb25zb2xlIHRvIHNpbXBsaWZ5IGlkZW50aWZpY2F0aW9uIG9mIHRoZSBjdWxwcml0XG4gICAgICAgICAgLy8gKGUuZy4gYnkgaW5zcGVjdGluZyB0aGUgY29uZmlnKVxuICAgICAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDaXJjdWxhciByZWZlcmVuY2UgaW4gVUkgdHJlZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWRkaXRpb25hbGx5IHRocm93IGFuIGVycm9yLCBiZWNhdXNlIHRoaXMgY2FzZSBtdXN0IG5vdCBoYXBwZW4gYW5kIGxlYWRzIHRvIHVuZXhwZWN0ZWQgVUkgYmVoYXZpb3IuXG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ0NpcmN1bGFyIHJlZmVyZW5jZSBpbiBVSSB0cmVlOiAnICsgY29tcG9uZW50LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudC5pbml0aWFsaXplKCk7XG4gICAgICBjb21wb25lbnQuY29uZmlndXJlKHRoaXMuZ2V0UGxheWVyKCksIHRoaXMpO1xuICAgICAgY29uZmlndXJlZENvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVsZWFzZUNvbnRyb2xzKCk6IHZvaWQge1xuICAgIC8vIERvIG5vdCBjYWxsIHJlbGVhc2UgbWV0aG9kcyBpZiB0aGUgY29tcG9uZW50cyBoYXZlIG5ldmVyIGJlZW4gY29uZmlndXJlZDsgdGhpcyBjYW4gcmVzdWx0IGluIGV4Y2VwdGlvbnNcbiAgICBpZiAodGhpcy5jb25maWd1cmVkKSB7XG4gICAgICB0aGlzLm9uUmVsZWFzZS5kaXNwYXRjaCh0aGlzLmdldFVJKCkpO1xuICAgICAgdGhpcy5yZWxlYXNlQ29udHJvbHNUcmVlKHRoaXMuZ2V0VUkoKSk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5yZWxlYXNlZCA9IHRydWU7XG4gIH1cblxuICBpc1JlbGVhc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlbGVhc2VkO1xuICB9XG5cbiAgcHJpdmF0ZSByZWxlYXNlQ29udHJvbHNUcmVlKGNvbXBvbmVudDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4pIHtcbiAgICBjb21wb25lbnQucmVsZWFzZSgpO1xuXG4gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbnRhaW5lcikge1xuICAgICAgZm9yIChsZXQgY2hpbGRDb21wb25lbnQgb2YgY29tcG9uZW50LmdldENvbXBvbmVudHMoKSkge1xuICAgICAgICB0aGlzLnJlbGVhc2VDb250cm9sc1RyZWUoY2hpbGRDb21wb25lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICBzdXBlci5jbGVhckV2ZW50SGFuZGxlcnMoKTtcbiAgfVxufVxuXG4vKipcbiAqIEV4dGVuZGVkIGludGVyZmFjZSBvZiB0aGUge0BsaW5rIFBsYXllcn0gZm9yIHVzZSBpbiB0aGUgVUkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3JhcHBlZFBsYXllciBleHRlbmRzIFBsYXllckFQSSB7XG4gIC8qKlxuICAgKiBGaXJlcyBhbiBldmVudCBvbiB0aGUgcGxheWVyIHRoYXQgdGFyZ2V0cyBhbGwgaGFuZGxlcnMgaW4gdGhlIFVJIGJ1dCBuZXZlciBlbnRlcnMgdGhlIHJlYWwgcGxheWVyLlxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIGZpcmVcbiAgICogQHBhcmFtIGRhdGEgZGF0YSB0byBzZW5kIHdpdGggdGhlIGV2ZW50XG4gICAqL1xuICBmaXJlRXZlbnRJblVJKGV2ZW50OiBQbGF5ZXJFdmVudCwgZGF0YToge30pOiB2b2lkO1xufVxuXG4vKipcbiAqIFdyYXBzIHRoZSBwbGF5ZXIgdG8gdHJhY2sgZXZlbnQgaGFuZGxlcnMgYW5kIHByb3ZpZGUgYSBzaW1wbGUgbWV0aG9kIHRvIHJlbW92ZSBhbGwgcmVnaXN0ZXJlZCBldmVudFxuICogaGFuZGxlcnMgZnJvbSB0aGUgcGxheWVyLlxuICovXG5leHBvcnQgY2xhc3MgUGxheWVyV3JhcHBlciB7XG5cbiAgcHJpdmF0ZSBwbGF5ZXI6IFBsYXllckFQSTtcbiAgcHJpdmF0ZSB3cmFwcGVyOiBXcmFwcGVkUGxheWVyO1xuXG4gIHByaXZhdGUgZXZlbnRIYW5kbGVyczogeyBbZXZlbnRUeXBlOiBzdHJpbmddOiBQbGF5ZXJFdmVudENhbGxiYWNrW107IH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllckFQSSkge1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuXG4gICAgLy8gQ29sbGVjdCBhbGwgbWVtYmVycyBvZiB0aGUgcGxheWVyIChwdWJsaWMgQVBJIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgb2YgdGhlIHBsYXllcilcbiAgICBjb25zdCBvYmplY3RQcm90b1Byb3BlcnR5TmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2Yoe30pKTtcbiAgICBjb25zdCBuYW1lc1RvSWdub3JlID0gWydjb25zdHJ1Y3RvcicsIC4uLm9iamVjdFByb3RvUHJvcGVydHlOYW1lc107XG4gICAgY29uc3QgbWVtYmVycyA9IGdldEFsbFByb3BlcnR5TmFtZXMocGxheWVyKS5maWx0ZXIobmFtZSA9PiBuYW1lc1RvSWdub3JlLmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAvLyBTcGxpdCB0aGUgbWVtYmVycyBpbnRvIG1ldGhvZHMgYW5kIHByb3BlcnRpZXNcbiAgICBsZXQgbWV0aG9kcyA9IDxhbnlbXT5bXTtcbiAgICBsZXQgcHJvcGVydGllcyA9IDxhbnlbXT5bXTtcblxuICAgIGZvciAobGV0IG1lbWJlciBvZiBtZW1iZXJzKSB7XG4gICAgICBpZiAodHlwZW9mICg8YW55PnBsYXllcilbbWVtYmVyXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtZXRob2RzLnB1c2gobWVtYmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3BlcnRpZXMucHVzaChtZW1iZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB3cmFwcGVyIG9iamVjdFxuICAgIGxldCB3cmFwcGVyID0gPGFueT57fTtcblxuICAgIC8vIEFkZCBmdW5jdGlvbiB3cmFwcGVycyBmb3IgYWxsIEFQSSBtZXRob2RzIHRoYXQgZG8gbm90aGluZyBidXQgY2FsbGluZyB0aGUgYmFzZSBtZXRob2Qgb24gdGhlIHBsYXllclxuICAgIGZvciAobGV0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICB3cmFwcGVyW21ldGhvZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxlZCAnICsgbWVtYmVyKTsgLy8gdHJhY2sgbWV0aG9kIGNhbGxzIG9uIHRoZSBwbGF5ZXJcbiAgICAgICAgcmV0dXJuICg8YW55PnBsYXllcilbbWV0aG9kXS5hcHBseShwbGF5ZXIsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEFkZCBhbGwgcHVibGljIHByb3BlcnRpZXMgb2YgdGhlIHBsYXllciB0byB0aGUgd3JhcHBlclxuICAgIGZvciAobGV0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICAgIC8vIEdldCBhbiBldmVudHVhbGx5IGV4aXN0aW5nIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHBsYWluIHByb3BlcnRpZXMgYW5kIHByb3BlcnRpZXMgd2l0aFxuICAgICAgLy8gZ2V0dGVycy9zZXR0ZXJzLlxuICAgICAgY29uc3QgcHJvcGVydHlEZXNjcmlwdG9yID0gKCh0YXJnZXQ6IFBsYXllckFQSSkgPT4ge1xuICAgICAgICB3aGlsZSAodGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5KTtcbiAgICAgICAgICBpZiAocHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgUHJvcGVydHlEZXNjcmlwdG9yIGV4aXN0cyBvbiBhIGNoaWxkIHByb3RvdHlwZSBpbiBjYXNlIHdlIGhhdmUgYW4gaW5oZXJpdGFuY2Ugb2YgdGhlIHBsYXllclxuICAgICAgICAgIHRhcmdldCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICB9KShwbGF5ZXIpO1xuXG4gICAgICAvLyBJZiB0aGUgcHJvcGVydHkgaGFzIGdldHRlcnMvc2V0dGVycywgd3JhcCB0aGVtIGFjY29yZGluZ2x5Li4uXG4gICAgICBpZiAocHJvcGVydHlEZXNjcmlwdG9yICYmIChwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0IHx8IHByb3BlcnR5RGVzY3JpcHRvci5zZXQpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwcGVyLCBwcm9wZXJ0eSwge1xuICAgICAgICAgIGdldDogKCkgPT4gcHJvcGVydHlEZXNjcmlwdG9yLmdldC5jYWxsKHBsYXllciksXG4gICAgICAgICAgc2V0OiAodmFsdWU6IGFueSkgPT4gcHJvcGVydHlEZXNjcmlwdG9yLnNldC5jYWxsKHBsYXllciwgdmFsdWUpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIC4uLiBlbHNlIGp1c3QgdHJhbnNmZXIgdGhlIHByb3BlcnR5IHRvIHRoZSB3cmFwcGVyXG4gICAgICBlbHNlIHtcbiAgICAgICAgd3JhcHBlcltwcm9wZXJ0eV0gPSAoPGFueT5wbGF5ZXIpW3Byb3BlcnR5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFeHBsaWNpdGx5IGFkZCBhIHdyYXBwZXIgbWV0aG9kIGZvciAnb24nIHRoYXQgYWRkcyBhZGRlZCBldmVudCBoYW5kbGVycyB0byB0aGUgZXZlbnQgbGlzdFxuICAgIHdyYXBwZXIub24gPSAoZXZlbnRUeXBlOiBQbGF5ZXJFdmVudCwgY2FsbGJhY2s6IFBsYXllckV2ZW50Q2FsbGJhY2spID0+IHtcbiAgICAgIHBsYXllci5vbihldmVudFR5cGUsIGNhbGxiYWNrKTtcblxuICAgICAgaWYgKCF0aGlzLmV2ZW50SGFuZGxlcnNbZXZlbnRUeXBlXSkge1xuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlcnNbZXZlbnRUeXBlXSA9IFtdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmV2ZW50SGFuZGxlcnNbZXZlbnRUeXBlXS5wdXNoKGNhbGxiYWNrKTtcblxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfTtcblxuICAgIC8vIEV4cGxpY2l0bHkgYWRkIGEgd3JhcHBlciBtZXRob2QgZm9yICdvZmYnIHRoYXQgcmVtb3ZlcyByZW1vdmVkIGV2ZW50IGhhbmRsZXJzIGZyb20gdGhlIGV2ZW50IGxpc3RcbiAgICB3cmFwcGVyLm9mZiA9IChldmVudFR5cGU6IFBsYXllckV2ZW50LCBjYWxsYmFjazogUGxheWVyRXZlbnRDYWxsYmFjaykgPT4ge1xuICAgICAgcGxheWVyLm9mZihldmVudFR5cGUsIGNhbGxiYWNrKTtcblxuICAgICAgaWYgKHRoaXMuZXZlbnRIYW5kbGVyc1tldmVudFR5cGVdKSB7XG4gICAgICAgIEFycmF5VXRpbHMucmVtb3ZlKHRoaXMuZXZlbnRIYW5kbGVyc1tldmVudFR5cGVdLCBjYWxsYmFjayk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH07XG5cbiAgICB3cmFwcGVyLmZpcmVFdmVudEluVUkgPSAoZXZlbnQ6IFBsYXllckV2ZW50LCBkYXRhOiB7fSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZXZlbnRIYW5kbGVyc1tldmVudF0pIHsgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50IHJlZ2lzdGVyZWRcbiAgICAgICAgLy8gRXh0ZW5kIHRoZSBkYXRhIG9iamVjdCB3aXRoIGRlZmF1bHQgdmFsdWVzIHRvIGNvbnZlcnQgaXQgdG8gYSB7QGxpbmsgUGxheWVyRXZlbnRCYXNlfSBvYmplY3QuXG4gICAgICAgIGxldCBwbGF5ZXJFdmVudERhdGEgPSA8UGxheWVyRXZlbnRCYXNlPk9iamVjdC5hc3NpZ24oe30sIHtcbiAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgdHlwZTogZXZlbnQsXG4gICAgICAgICAgLy8gQWRkIGEgbWFya2VyIHByb3BlcnR5IHNvIHRoZSBVSSBjYW4gZGV0ZWN0IFVJLWludGVybmFsIHBsYXllciBldmVudHNcbiAgICAgICAgICB1aVNvdXJjZWQ6IHRydWUsXG4gICAgICAgIH0sIGRhdGEpO1xuXG4gICAgICAgIC8vIEV4ZWN1dGUgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzXG4gICAgICAgIGZvciAobGV0IGNhbGxiYWNrIG9mIHRoaXMuZXZlbnRIYW5kbGVyc1tldmVudF0pIHtcbiAgICAgICAgICBjYWxsYmFjayhwbGF5ZXJFdmVudERhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMud3JhcHBlciA9IDxXcmFwcGVkUGxheWVyPndyYXBwZXI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHdyYXBwZWQgcGxheWVyIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIG9uIHBsYWNlIG9mIHRoZSBub3JtYWwgcGxheWVyIG9iamVjdC5cbiAgICogQHJldHVybnMge1dyYXBwZWRQbGF5ZXJ9IGEgd3JhcHBlZCBwbGF5ZXJcbiAgICovXG4gIGdldFBsYXllcigpOiBXcmFwcGVkUGxheWVyIHtcbiAgICByZXR1cm4gdGhpcy53cmFwcGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgcmVnaXN0ZXJlZCBldmVudCBoYW5kbGVycyBmcm9tIHRoZSBwbGF5ZXIgdGhhdCB3ZXJlIGFkZGVkIHRocm91Z2ggdGhlIHdyYXBwZWQgcGxheWVyLlxuICAgKi9cbiAgY2xlYXJFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICAvLyBDYWxsIHRoZSBwbGF5ZXIgQVBJIHRvIGNoZWNrIGlmIHRoZSBpbnN0YW5jZSBpcyBzdGlsbCB2YWxpZCBvciBhbHJlYWR5IGRlc3Ryb3llZC5cbiAgICAgIC8vIFRoaXMgY2FuIGJlIGFueSBjYWxsIHRocm93aW5nIHRoZSBQbGF5ZXJBUElOb3RBdmFpbGFibGVFcnJvciB3aGVuIHRoZSBwbGF5ZXIgaW5zdGFuY2UgaXMgZGVzdHJveWVkLlxuICAgICAgdGhpcy5wbGF5ZXIuZ2V0U291cmNlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyQVBJTm90QXZhaWxhYmxlRXJyb3IpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBkZXRlY3RlZCB0aGF0IHRoZSBwbGF5ZXIgaW5zdGFuY2UgaXMgYWxyZWFkeSBkZXN0cm95ZWQsIHNvIHdlIGNsZWFyIHRoZSBldmVudCBoYW5kbGVycyB0byBhdm9pZFxuICAgICAgICAvLyBldmVudCBoYW5kbGVyIHVuc3Vic2NyaXB0aW9uIGF0dGVtcHRzICh3aGljaCB3b3VsZCByZXN1bHQgaW4gUGxheWVyQVBJTm90QXZhaWxhYmxlRXJyb3IgZXJyb3JzKS5cbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzID0ge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgZXZlbnRUeXBlIGluIHRoaXMuZXZlbnRIYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgY2FsbGJhY2sgb2YgdGhpcy5ldmVudEhhbmRsZXJzW2V2ZW50VHlwZV0pIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIub2ZmKGV2ZW50VHlwZSBhcyBQbGF5ZXJFdmVudCwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBbGxQcm9wZXJ0eU5hbWVzKHRhcmdldDogT2JqZWN0KTogc3RyaW5nW10ge1xuICBsZXQgbmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgd2hpbGUgKHRhcmdldCkge1xuICAgIGNvbnN0IG5ld05hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KS5maWx0ZXIobmFtZSA9PiBuYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSk7XG4gICAgbmFtZXMgPSBuYW1lcy5jb25jYXQobmV3TmFtZXMpO1xuICAgIC8vIGdvIHVwIHByb3RvdHlwZSBjaGFpblxuICAgIHRhcmdldCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufVxuIiwiaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudENvbmZpZ30gZnJvbSAnLi9jb21wb25lbnRzL2NvbXBvbmVudCc7XG5pbXBvcnQge0NvbnRhaW5lcn0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnRhaW5lcic7XG5cbmV4cG9ydCBuYW1lc3BhY2UgVUlVdGlscyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgVHJlZVRyYXZlcnNhbENhbGxiYWNrIHtcbiAgICAoY29tcG9uZW50OiBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiwgcGFyZW50PzogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4pOiB2b2lkO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRyYXZlcnNlVHJlZShjb21wb25lbnQ6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+LCB2aXNpdDogVHJlZVRyYXZlcnNhbENhbGxiYWNrKTogdm9pZCB7XG4gICAgbGV0IHJlY3Vyc2l2ZVRyZWVXYWxrZXIgPSAoY29tcG9uZW50OiBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiwgcGFyZW50PzogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4pID0+IHtcbiAgICAgIHZpc2l0KGNvbXBvbmVudCwgcGFyZW50KTtcblxuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgY29tcG9uZW50IGlzIGEgY29udGFpbmVyLCB2aXNpdCBpdCdzIGNoaWxkcmVuXG4gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgQ29udGFpbmVyKSB7XG4gICAgICAgIGZvciAobGV0IGNoaWxkQ29tcG9uZW50IG9mIGNvbXBvbmVudC5nZXRDb21wb25lbnRzKCkpIHtcbiAgICAgICAgICByZWN1cnNpdmVUcmVlV2Fsa2VyKGNoaWxkQ29tcG9uZW50LCBjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFdhbGsgYW5kIGNvbmZpZ3VyZSB0aGUgY29tcG9uZW50IHRyZWVcbiAgICByZWN1cnNpdmVUcmVlV2Fsa2VyKGNvbXBvbmVudCk7XG4gIH1cblxuICAvLyBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vbmZyaWVuZC90cy1rZXljb2RlLWVudW0vYmxvYi9tYXN0ZXIvS2V5LmVudW0udHNcbiAgZXhwb3J0IGVudW0gS2V5Q29kZSB7XG4gICAgTGVmdEFycm93ID0gMzcsXG4gICAgVXBBcnJvdyA9IDM4LFxuICAgIFJpZ2h0QXJyb3cgPSAzOSxcbiAgICBEb3duQXJyb3cgPSA0MCxcbiAgICBTcGFjZSA9IDMyLFxuICAgIEVuZCA9IDM1LFxuICAgIEhvbWUgPSAzNixcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXZlbnQsIEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4vZXZlbnRkaXNwYXRjaGVyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdW1lU2V0dGluZ0NoYW5nZWRBcmdzIHtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIG11dGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIENhbiBiZSB1c2VkIHRvIGNlbnRyYWxseSBtYW5hZ2UgYW5kIGNvbnRyb2wgdGhlIHZvbHVtZSBhbmQgbXV0ZSBzdGF0ZSBvZiB0aGUgcGxheWVyIGZyb20gbXVsdGlwbGUgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFZvbHVtZUNvbnRyb2xsZXIge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGlzc3Vlck5hbWUgPSAndWktdm9sdW1lY29udHJvbGxlcic7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBldmVudHMgPSB7XG4gICAgb25DaGFuZ2VkOiBuZXcgRXZlbnREaXNwYXRjaGVyPFZvbHVtZUNvbnRyb2xsZXIsIFZvbHVtZVNldHRpbmdDaGFuZ2VkQXJncz4oKSxcbiAgfTtcblxuICBwcml2YXRlIHN0b3JlZFZvbHVtZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXJBUEkpIHtcbiAgICB0aGlzLnN0b3JlVm9sdW1lKCk7XG5cbiAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkNoYW5nZWRFdmVudCgpO1xuICAgIH07XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlTG9hZGVkLCBoYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVm9sdW1lQ2hhbmdlZCwgaGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50Lk11dGVkLCBoYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVW5tdXRlZCwgaGFuZGxlcik7XG4gIH1cblxuICBzZXRWb2x1bWUodm9sdW1lOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBsYXllci5zZXRWb2x1bWUodm9sdW1lLCBWb2x1bWVDb250cm9sbGVyLmlzc3Vlck5hbWUpO1xuICB9XG5cbiAgZ2V0Vm9sdW1lKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmdldFZvbHVtZSgpO1xuICB9XG5cbiAgc2V0TXV0ZWQobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAobXV0ZWQpIHtcbiAgICAgIHRoaXMucGxheWVyLm11dGUoVm9sdW1lQ29udHJvbGxlci5pc3N1ZXJOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGF5ZXIudW5tdXRlKFZvbHVtZUNvbnRyb2xsZXIuaXNzdWVyTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlTXV0ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNdXRlZCgpIHx8IHRoaXMuZ2V0Vm9sdW1lKCkgPT09IDApIHtcbiAgICAgIC8vIFVubXV0aW5nIGZyb20gdGhlIG11dGUgb3IgemVyby12b2x1bWUgc3RhdGUgcmVjYWxscyB0aGUgcHJldmlvdXNseSBzYXZlZCB2b2x1bWUgc2V0dGluZy4gU2V0dGluZyB0aGVcbiAgICAgIC8vIHZvbHVtZSBhdXRvbWF0aWNhbGx5IHVubXV0ZXMgdGhlIHBsYXllciBpbiB2Ny5cbiAgICAgIHRoaXMucmVjYWxsVm9sdW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0TXV0ZWQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgaXNNdXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIuaXNNdXRlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlcyAoc2F2ZXMpIHRoZSBjdXJyZW50IHZvbHVtZSBzbyBpdCBjYW4gbGF0ZXIgYmUgcmVzdG9yZWQgd2l0aCB7QGxpbmsgcmVjYWxsVm9sdW1lfS5cbiAgICovXG4gIHN0b3JlVm9sdW1lKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmVkVm9sdW1lID0gdGhpcy5nZXRWb2x1bWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNhbGxzIChzZXRzKSB0aGUgdm9sdW1lIHByZXZpb3VzbHkgc3RvcmVkIHdpdGgge0BsaW5rIHN0b3JlVm9sdW1lfS5cbiAgICovXG4gIHJlY2FsbFZvbHVtZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldE11dGVkKHRoaXMuc3RvcmVkVm9sdW1lID09PSAwKTtcbiAgICB0aGlzLnNldFZvbHVtZSh0aGlzLnN0b3JlZFZvbHVtZSk7XG4gIH1cblxuICBzdGFydFRyYW5zaXRpb24oKTogVm9sdW1lVHJhbnNpdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBWb2x1bWVUcmFuc2l0aW9uKHRoaXMpO1xuICB9XG5cbiAgb25DaGFuZ2VkRXZlbnQoKSB7XG4gICAgY29uc3QgcGxheWVyTXV0ZWQgPSB0aGlzLmlzTXV0ZWQoKTtcbiAgICBjb25zdCBwbGF5ZXJWb2x1bWUgPSB0aGlzLmdldFZvbHVtZSgpO1xuXG4gICAgY29uc3QgdWlNdXRlZCA9IHBsYXllck11dGVkIHx8IHBsYXllclZvbHVtZSA9PT0gMDtcbiAgICBjb25zdCB1aVZvbHVtZSA9IHBsYXllck11dGVkID8gMCA6IHBsYXllclZvbHVtZTtcblxuICAgIHRoaXMuZXZlbnRzLm9uQ2hhbmdlZC5kaXNwYXRjaCh0aGlzLCB7IHZvbHVtZTogdWlWb2x1bWUsIG11dGVkOiB1aU11dGVkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgdm9sdW1lIHNldHRpbmdzIGhhdmUgY2hhbmdlZC5cbiAgICovXG4gIGdldCBvbkNoYW5nZWQoKTogRXZlbnQ8Vm9sdW1lQ29udHJvbGxlciwgVm9sdW1lU2V0dGluZ0NoYW5nZWRBcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLm9uQ2hhbmdlZC5nZXRFdmVudCgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWb2x1bWVUcmFuc2l0aW9uIHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbnRyb2xsZXI6IFZvbHVtZUNvbnRyb2xsZXIpIHtcbiAgICAvLyBTdG9yZSB0aGUgdm9sdW1lIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSB2b2x1bWUgY2hhbmdlIHNvIHdlIGNhbiByZWNhbGwgaXQgbGF0ZXIgaW4gY2FzZSB3ZSBzZXQgdGhlIHZvbHVtZSB0b1xuICAgIC8vIHplcm8gYW5kIGFjdHVhbGx5IG11dGUgdGhlIHBsYXllci5cbiAgICBjb250cm9sbGVyLnN0b3JlVm9sdW1lKCk7XG4gIH1cblxuICB1cGRhdGUodm9sdW1lOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZvbHVtZSB3aGlsZSB0cmFuc2l0aW9uaW5nIHNvIHRoZSB1c2VyIGhhcyBhIFwibGl2ZSBwcmV2aWV3XCIgb2YgdGhlIGRlc2lyZWQgdGFyZ2V0IHZvbHVtZVxuICAgIHRoaXMuY29udHJvbGxlci5zZXRNdXRlZChmYWxzZSk7XG4gICAgdGhpcy5jb250cm9sbGVyLnNldFZvbHVtZSh2b2x1bWUpO1xuICB9XG5cbiAgZmluaXNoKHZvbHVtZTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZvbHVtZSA9PT0gMCkge1xuICAgICAgLy8gV2hlbiB0aGUgdm9sdW1lIGlzIHplcm8gd2UgZXNzZW50aWFsbHkgbXV0ZSB0aGUgdm9sdW1lIHNvIHdlIHJlY2FsbCB0aGUgdm9sdW1lIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICAgIC8vIHRyYW5zaXRpb24gYW5kIG11dGUgdGhlIHBsYXllciBpbnN0ZWFkLiBSZWNhbGxpbmcgaXMgbmVjZXNzYXJ5IHRvIHJldHVybiB0byB0aGUgYWN0dWFsIGF1ZGlvIHZvbHVtZVxuICAgICAgLy8gd2hlbiB1bm11dGluZy5cbiAgICAgIC8vIFdlIG11c3QgZmlyc3QgcmVjYWxsIHRoZSB2b2x1bWUgYW5kIHRoZW4gbXV0ZSwgYmVjYXVzZSByZWNhbGxpbmcgc2V0cyB0aGUgdm9sdW1lIG9uIHRoZSBwbGF5ZXJcbiAgICAgIC8vIGFuZCBzZXR0aW5nIGEgcGxheWVyIHZvbHVtZSA+IDAgdW5tdXRlcyB0aGUgcGxheWVyIGluIHY3LlxuICAgICAgdGhpcy5jb250cm9sbGVyLnJlY2FsbFZvbHVtZSgpO1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldE11dGVkKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0TXV0ZWQoZmFsc2UpO1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgdGhpcy5jb250cm9sbGVyLnN0b3JlVm9sdW1lKCk7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IHsgU3VidGl0bGVSZWdpb25Db250YWluZXIsIFN1YnRpdGxlTGFiZWwgfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVvdmVybGF5JztcbmltcG9ydCB7IFZUVFByb3BlcnRpZXMsIFZUVFJlZ2lvblByb3BlcnRpZXMgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXIvdHlwZXMvc3VidGl0bGVzL3Z0dC9BUEknO1xuaW1wb3J0IHsgRE9NLCBTaXplIH0gZnJvbSAnLi9kb20nO1xuXG4vLyBPdXIgZGVmYXVsdCBoZWlnaHQgb2YgYSBsaW5lXG5jb25zdCBsaW5lSGVpZ2h0ID0gMjg7XG5jb25zdCBkZWZhdWx0TGluZU51bWJlciA9IDIxOyAvLyBPdXIgZGVmYXVsdCBhbW91bnQgb2YgbGluZXNcblxuZW51bSBEaXJlY3Rpb24ge1xuICBUb3AgPSAndG9wJyxcbiAgQm90dG9tID0gJ2JvdHRvbScsXG4gIExlZnQgPSAnbGVmdCcsXG4gIFJpZ2h0ID0gJ3JpZ2h0Jyxcbn1cblxuY29uc3QgRGlyZWN0aW9uUGFpciA9IG5ldyBNYXA8RGlyZWN0aW9uLCBEaXJlY3Rpb24+KFtcbiAgW0RpcmVjdGlvbi5Ub3AsIERpcmVjdGlvbi5Cb3R0b21dLFxuICBbRGlyZWN0aW9uLkxlZnQsIERpcmVjdGlvbi5SaWdodF0sXG4gIFtEaXJlY3Rpb24uUmlnaHQsIERpcmVjdGlvbi5MZWZ0XSxcbl0pO1xuXG4vKipcbiAqIFNldHMgdGhlIGRlZmF1bHQgc3RhbmRhcmRpemVkIHN0eWxlcyBmb3IgdGhlIEN1ZSBCb3hcbiAqIGh0dHBzOi8vdzMub3JnL1RSL3dlYnZ0dDEvI2FwcGx5aW5nLWNzcy1wcm9wZXJ0aWVzXG4gKi9cbmNvbnN0IHNldERlZmF1bHRWdHRTdHlsZXMgPSAoY3VlQ29udGFpbmVyRG9tOiBET00sIHZ0dDogVlRUUHJvcGVydGllcykgPT4ge1xuICBpZiAodnR0LnJlZ2lvbikge1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcygndW5pY29kZS1iaWRpJywgJ3BsYWludGV4dCcpO1xuICB9IGVsc2Uge1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcygnb3ZlcmZsb3ctd3JhcCcsICdicmVhay13b3JkJyk7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcygnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcygnZmxleC1mbG93JywgJ2NvbHVtbicpO1xuICB9XG4gIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWZsZXgnKTtcbn07XG5cbi8qKlxuICogQWxpZ24gdGhlIEN1ZSBCb3gncyBsaW5lXG4gKiBodHRwczovL3czLm9yZy9UUi93ZWJ2dHQxLyN3ZWJ2dHQtY3VlLWxpbmUtYWxpZ25tZW50XG4gKi9cbmNvbnN0IHNldFZ0dExpbmVBbGlnbiA9IChjdWVDb250YWluZXJEb206IERPTSwgeyBsaW5lQWxpZ24gfTogVlRUUHJvcGVydGllcywgZGlyZWN0aW9uOiBEaXJlY3Rpb24pID0+IHtcbiAgc3dpdGNoIChsaW5lQWxpZ24pIHtcbiAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY3VlQ29udGFpbmVyRG9tLmNzcyhgbWFyZ2luLSR7ZGlyZWN0aW9ufWAsIGAkey1saW5lSGVpZ2h0IC8gMn1weGApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW5kJzpcbiAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoYG1hcmdpbi0ke2RpcmVjdGlvbn1gLCBgJHstbGluZUhlaWdodH1weGApO1xuICB9XG59O1xuXG4vKipcbiAqIERlZmluZXMgdGhlIGxpbmUgcG9zaXRpb25pbmcgb2YgdGhlIEN1ZSBCb3hcbiAqIGh0dHBzOi8vdzMub3JnL1RSL3dlYnZ0dDEvI3dlYnZ0dC1jdWUtbGluZVxuICovXG5jb25zdCBzZXRWdHRMaW5lID0gKFxuICBjdWVDb250YWluZXJEb206IERPTSxcbiAgdnR0OiBWVFRQcm9wZXJ0aWVzLFxuICBkaXJlY3Rpb246IERpcmVjdGlvbixcbiAgc3VidGl0bGVPdmVyTGF5U2l6ZTogU2l6ZSxcbikgPT4ge1xuICBpZiAodnR0LmxpbmUgPT09ICdhdXRvJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCByZWxhdGl2ZUxpbmVQb3NpdGlvbiA9IHBhcnNlRmxvYXQodnR0LmxpbmUgYXMgc3RyaW5nKTtcblxuICBpZiAodnR0LnNuYXBUb0xpbmVzKSB7XG4gICAgbGV0IHRhcmdldExpbmUgPSBOdW1iZXIodnR0LmxpbmUpO1xuICAgIGlmICh0YXJnZXRMaW5lIDwgMCkge1xuICAgICAgdGFyZ2V0TGluZSA9IGRlZmF1bHRMaW5lTnVtYmVyICsgdGFyZ2V0TGluZTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gc3VidGl0bGVPdmVyTGF5U2l6ZS5oZWlnaHQgLyBkZWZhdWx0TGluZU51bWJlcjtcbiAgICBjb25zdCBhYnNvbHV0ZUxpbmVQb3NpdGlvbiA9IGxpbmVIZWlnaHQgKiB0YXJnZXRMaW5lO1xuICAgIHJlbGF0aXZlTGluZVBvc2l0aW9uID0gKDEwMCAqIGFic29sdXRlTGluZVBvc2l0aW9uKSAvIHN1YnRpdGxlT3ZlckxheVNpemUuaGVpZ2h0O1xuICB9XG5cbiAgY3VlQ29udGFpbmVyRG9tLmNzcyhkaXJlY3Rpb24sIGAke3JlbGF0aXZlTGluZVBvc2l0aW9ufSVgKTtcbiAgc2V0VnR0TGluZUFsaWduKGN1ZUNvbnRhaW5lckRvbSwgdnR0LCBkaXJlY3Rpb24pO1xufTtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB3cml0aW5nIGRpcmVjdGlvbiBvZiB0aGUgQ3VlIEJveFxuICogaHR0cHM6Ly93My5vcmcvVFIvd2VidnR0MS8jd2VidnR0LWN1ZS13cml0aW5nLWRpcmVjdGlvblxuICovXG5jb25zdCBzZXRWdHRXcml0aW5nRGlyZWN0aW9uID0gKFxuICBjdWVDb250YWluZXJEb206IERPTSwgdnR0OiBWVFRQcm9wZXJ0aWVzLFxuICBzdWJ0aXRsZU92ZXJsYXlTaXplOiBTaXplLFxuKSA9PiB7XG4gIGlmICh2dHQudmVydGljYWwgPT09ICcnKSB7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcygnd3JpdGluZy1tb2RlJywgJ2hvcml6b250YWwtdGInKTtcbiAgICBjdWVDb250YWluZXJEb20uY3NzKERpcmVjdGlvbi5Cb3R0b20sICcwJyk7XG4gICAgc2V0VnR0TGluZShjdWVDb250YWluZXJEb20sIHZ0dCwgRGlyZWN0aW9uLlRvcCwgc3VidGl0bGVPdmVybGF5U2l6ZSk7XG4gIH0gZWxzZSBpZiAodnR0LnZlcnRpY2FsID09PSAnbHInKSB7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcygnd3JpdGluZy1tb2RlJywgJ3ZlcnRpY2FsLWxyJyk7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcyhEaXJlY3Rpb24uUmlnaHQsICcwJyk7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcyhEaXJlY3Rpb24uVG9wLCAnMCcpO1xuICAgIHNldFZ0dExpbmUoY3VlQ29udGFpbmVyRG9tLCB2dHQsIERpcmVjdGlvbi5SaWdodCwgc3VidGl0bGVPdmVybGF5U2l6ZSk7XG4gIH0gZWxzZSBpZiAodnR0LnZlcnRpY2FsID09PSAncmwnKSB7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcygnd3JpdGluZy1tb2RlJywgJ3ZlcnRpY2FsLXJsJyk7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcyhEaXJlY3Rpb24uTGVmdCwgJzAnKTtcbiAgICBjdWVDb250YWluZXJEb20uY3NzKERpcmVjdGlvbi5Ub3AsICcwJyk7XG4gICAgc2V0VnR0TGluZShjdWVDb250YWluZXJEb20sIHZ0dCwgRGlyZWN0aW9uLkxlZnQsIHN1YnRpdGxlT3ZlcmxheVNpemUpO1xuICB9XG59O1xuXG4vKipcbiAqIERlZmluZXMgdGhlIEN1ZSBwb3NpdGlvbiBhbGlnbm1lbnRcbiAqIGh0dHBzOi8vdzMub3JnL1RSL3dlYnZ0dDEvI3dlYnZ0dC1jdWUtcG9zaXRpb24tYWxpZ25tZW50XG4gKi9cbmNvbnN0IHNldFZ0dFBvc2l0aW9uQWxpZ24gPSAoY3VlQ29udGFpbmVyRG9tOiBET00sIHZ0dDogVlRUUHJvcGVydGllcywgZGlyZWN0aW9uOiBEaXJlY3Rpb24pID0+IHtcbiAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYnZ0dDEvI3dlYnZ0dC1jdWUtcG9zaXRpb25cbiAgaWYgKHZ0dC5wb3NpdGlvbiA9PT0gJ2F1dG8nKSB7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcyhkaXJlY3Rpb24sICcwJyk7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh2dHQucG9zaXRpb25BbGlnbikge1xuICAgICAgY2FzZSAnbGluZS1sZWZ0JzpcbiAgICAgICAgY3VlQ29udGFpbmVyRG9tLmNzcyhkaXJlY3Rpb24sIGAke3Z0dC5wb3NpdGlvbn0lYCk7XG4gICAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoRGlyZWN0aW9uUGFpci5nZXQoZGlyZWN0aW9uKSwgJ2F1dG8nKTtcbiAgICAgICAgY3VlQ29udGFpbmVyRG9tLmNzcygnanVzdGlmeS1jb250ZW50JywgJ2ZsZXgtc3RhcnQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICBjdWVDb250YWluZXJEb20uY3NzKGRpcmVjdGlvbiwgYCR7dnR0LnBvc2l0aW9uIC0gdnR0LnNpemUgLyAyfSVgKTtcbiAgICAgICAgY3VlQ29udGFpbmVyRG9tLmNzcyhEaXJlY3Rpb25QYWlyLmdldChkaXJlY3Rpb24pLCAnYXV0bycpO1xuICAgICAgICBjdWVDb250YWluZXJEb20uY3NzKCdqdXN0aWZ5LWNvbnRlbnQnLCAnY2VudGVyJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGluZS1yaWdodCc6XG4gICAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoZGlyZWN0aW9uLCAnYXV0bycpO1xuICAgICAgICBjdWVDb250YWluZXJEb20uY3NzKERpcmVjdGlvblBhaXIuZ2V0KGRpcmVjdGlvbiksIGAkezEwMCAtIHZ0dC5wb3NpdGlvbn0lYCk7XG4gICAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ2p1c3RpZnktY29udGVudCcsICdmbGV4LWVuZCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoZGlyZWN0aW9uLCBgJHt2dHQucG9zaXRpb259JWApO1xuICAgICAgICBjdWVDb250YWluZXJEb20uY3NzKCdqdXN0aWZ5LWNvbnRlbnQnLCAnZmxleC1zdGFydCcpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IG5hbWVzcGFjZSBWdHRVdGlscyB7XG4gIGV4cG9ydCBjb25zdCBzZXRWdHRDdWVCb3hTdHlsZXMgPSAoXG4gICAgY3VlQ29udGFpbmVyOiBTdWJ0aXRsZUxhYmVsLFxuICAgIHN1YnRpdGxlT3ZlcmxheVNpemU6IFNpemUsXG4gICkgPT4ge1xuICAgIGNvbnN0IHZ0dCA9IGN1ZUNvbnRhaW5lci52dHQ7XG4gICAgY29uc3QgY3VlQ29udGFpbmVyRG9tID0gY3VlQ29udGFpbmVyLmdldERvbUVsZW1lbnQoKTtcblxuICAgIHNldERlZmF1bHRWdHRTdHlsZXMoY3VlQ29udGFpbmVyRG9tLCB2dHQpO1xuICAgIHNldFZ0dFdyaXRpbmdEaXJlY3Rpb24oY3VlQ29udGFpbmVyRG9tLCB2dHQsIHN1YnRpdGxlT3ZlcmxheVNpemUpO1xuXG4gICAgLy8gaHR0cHM6Ly93My5vcmcvVFIvd2VidnR0MS8jd2VidnR0LWN1ZS10ZXh0LWFsaWdubWVudFxuICAgIGNvbnN0IHRleHRBbGlnbiA9IHZ0dC5hbGlnbiA9PT0gJ21pZGRsZScgPyAnY2VudGVyJyA6IHZ0dC5hbGlnbjtcbiAgICBjdWVDb250YWluZXJEb20uY3NzKCd0ZXh0LWFsaWduJywgdGV4dEFsaWduKTtcblxuICAgIC8vIGh0dHBzOi8vdzMub3JnL1RSL3dlYnZ0dDEvI3dlYnZ0dC1jdWUtc2l6ZVxuICAgIGNvbnN0IGNvbnRhaW5lclNpemUgPSB2dHQuc2l6ZTtcbiAgICBpZiAodnR0LnZlcnRpY2FsID09PSAnJykge1xuICAgICAgY3VlQ29udGFpbmVyRG9tLmNzcygnd2lkdGgnLCBgJHtjb250YWluZXJTaXplfSVgKTtcbiAgICAgIHNldFZ0dFBvc2l0aW9uQWxpZ24oY3VlQ29udGFpbmVyRG9tLCB2dHQsIERpcmVjdGlvbi5MZWZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VlQ29udGFpbmVyRG9tLmNzcygnaGVpZ2h0JywgYCR7Y29udGFpbmVyU2l6ZX0lYCk7XG4gICAgICBzZXRWdHRQb3NpdGlvbkFsaWduKGN1ZUNvbnRhaW5lckRvbSwgdnR0LCBEaXJlY3Rpb24uVG9wKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJ2dHQxLyNyZWdpb25zXG4gICAqICBodHRwczovL3d3dy5zcGVlY2hwYWQuY29tL2NhcHRpb25zL3dlYnZ0dCN0b2NfMTZcbiAgICovXG4gIGV4cG9ydCBjb25zdCBzZXRWdHRSZWdpb25TdHlsZXMgPSAoXG4gICAgcmVnaW9uQ29udGFpbmVyOiBTdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lcixcbiAgICByZWdpb246IFZUVFJlZ2lvblByb3BlcnRpZXMsXG4gICAgb3ZlcmxheVNpemU6IFNpemUsXG4gICkgPT4ge1xuICAgIGNvbnN0IHJlZ2lvbkNvbnRhaW5lckRvbSA9IHJlZ2lvbkNvbnRhaW5lci5nZXREb21FbGVtZW50KCk7XG4gICAgY29uc3QgcmVnaW9uUG9zaXRpb25YID0gb3ZlcmxheVNpemUud2lkdGggKiByZWdpb24udmlld3BvcnRBbmNob3JYIC8gMTAwIC0gKChvdmVybGF5U2l6ZS53aWR0aCAqIHJlZ2lvbi53aWR0aCAvIDEwMCkgKiByZWdpb24ucmVnaW9uQW5jaG9yWCAvIDEwMCk7XG4gICAgY29uc3QgcmVnaW9uUG9zaXRpb25ZID0gb3ZlcmxheVNpemUuaGVpZ2h0ICogcmVnaW9uLnZpZXdwb3J0QW5jaG9yWSAvIDEwMCAtICgocmVnaW9uLmxpbmVzICogbGluZUhlaWdodCkgKiByZWdpb24ucmVnaW9uQW5jaG9yWSAvIDEwMCk7XG4gICAgcmVnaW9uQ29udGFpbmVyRG9tLmNzcygncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgICByZWdpb25Db250YWluZXJEb20uY3NzKCdvdmVyZmxvdycsICdoaWRkZW4nKTtcbiAgICByZWdpb25Db250YWluZXJEb20uY3NzKCd3aWR0aCcsIGAke3JlZ2lvbi53aWR0aH0lYCk7XG4gICAgcmVnaW9uQ29udGFpbmVyRG9tLmNzcyhEaXJlY3Rpb24uTGVmdCwgYCR7cmVnaW9uUG9zaXRpb25YfXB4YCk7XG4gICAgcmVnaW9uQ29udGFpbmVyRG9tLmNzcyhEaXJlY3Rpb24uUmlnaHQsICd1bnNldCcpO1xuICAgIHJlZ2lvbkNvbnRhaW5lckRvbS5jc3MoRGlyZWN0aW9uLlRvcCwgYCR7cmVnaW9uUG9zaXRpb25ZfXB4YCk7XG4gICAgcmVnaW9uQ29udGFpbmVyRG9tLmNzcyhEaXJlY3Rpb24uQm90dG9tLCAndW5zZXQnKTtcbiAgICByZWdpb25Db250YWluZXJEb20uY3NzKCdoZWlnaHQnLCBgJHtyZWdpb24ubGluZXMgKiBsaW5lSGVpZ2h0fXB4YCk7XG4gIH07XG59XG4iXX0=
|
|
12298
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvdHMvYXJyYXl1dGlscy50cyIsInNyYy90cy9hdWRpb3RyYWNrdXRpbHMudHMiLCJzcmMvdHMvYnJvd3NlcnV0aWxzLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvYWRjbGlja292ZXJsYXkudHMiLCJzcmMvdHMvY29tcG9uZW50cy9hZG1lc3NhZ2VsYWJlbC50cyIsInNyYy90cy9jb21wb25lbnRzL2Fkc2tpcGJ1dHRvbi50cyIsInNyYy90cy9jb21wb25lbnRzL2FpcnBsYXl0b2dnbGVidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy9hdWRpb3F1YWxpdHlzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9hdWRpb3RyYWNrbGlzdGJveC50cyIsInNyYy90cy9jb21wb25lbnRzL2F1ZGlvdHJhY2tzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9idWZmZXJpbmdvdmVybGF5LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvY2FzdHN0YXR1c292ZXJsYXkudHMiLCJzcmMvdHMvY29tcG9uZW50cy9jYXN0dG9nZ2xlYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvY2FzdHVpY29udGFpbmVyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvY2xpY2tvdmVybGF5LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvY2xvc2VidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy9jb21wb25lbnQudHMiLCJzcmMvdHMvY29tcG9uZW50cy9jb250YWluZXIudHMiLCJzcmMvdHMvY29tcG9uZW50cy9jb250cm9sYmFyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvZXJyb3JtZXNzYWdlb3ZlcmxheS50cyIsInNyYy90cy9jb21wb25lbnRzL2Z1bGxzY3JlZW50b2dnbGVidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy9odWdlcGxheWJhY2t0b2dnbGVidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy9odWdlcmVwbGF5YnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvaXRlbXNlbGVjdGlvbmxpc3QudHMiLCJzcmMvdHMvY29tcG9uZW50cy9sYWJlbC50cyIsInNyYy90cy9jb21wb25lbnRzL2xpc3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9saXN0c2VsZWN0b3IudHMiLCJzcmMvdHMvY29tcG9uZW50cy9tZXRhZGF0YWxhYmVsLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvcGljdHVyZWlucGljdHVyZXRvZ2dsZWJ1dHRvbi50cyIsInNyYy90cy9jb21wb25lbnRzL3BsYXliYWNrc3BlZWRzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9wbGF5YmFja3RpbWVsYWJlbC50cyIsInNyYy90cy9jb21wb25lbnRzL3BsYXliYWNrdG9nZ2xlYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvcGxheWJhY2t0b2dnbGVvdmVybGF5LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvcmVjb21tZW5kYXRpb25vdmVybGF5LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc2Vla2Jhci50cyIsInNyYy90cy9jb21wb25lbnRzL3NlZWtiYXJidWZmZXJsZXZlbC50cyIsInNyYy90cy9jb21wb25lbnRzL3NlZWtiYXJjb250cm9sbGVyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc2Vla2JhcmxhYmVsLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc2VsZWN0Ym94LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbC50cyIsInNyYy90cy9jb21wb25lbnRzL3NldHRpbmdzcGFuZWxpdGVtLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbHBhZ2UudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zZXR0aW5nc3BhbmVscGFnZWJhY2tidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy9zZXR0aW5nc3BhbmVscGFnZW5hdmlnYXRvcmJ1dHRvbi50cyIsInNyYy90cy9jb21wb25lbnRzL3NldHRpbmdzcGFuZWxwYWdlb3BlbmJ1dHRvbi50cyIsInNyYy90cy9jb21wb25lbnRzL3NldHRpbmdzdG9nZ2xlYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc3BhY2VyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc3VidGl0bGVsaXN0Ym94LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc3VidGl0bGVvdmVybGF5LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc3VidGl0bGVzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2JhY2tncm91bmRjb2xvcnNlbGVjdGJveC50cyIsInNyYy90cy9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3MvYmFja2dyb3VuZG9wYWNpdHlzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2NoYXJhY3RlcmVkZ2VzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2ZvbnRjb2xvcnNlbGVjdGJveC50cyIsInNyYy90cy9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3MvZm9udGZhbWlseXNlbGVjdGJveC50cyIsInNyYy90cy9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3MvZm9udG9wYWNpdHlzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2ZvbnRzaXplc2VsZWN0Ym94LnRzIiwic3JjL3RzL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9zdWJ0aXRsZXNldHRpbmdzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NsYWJlbC50cyIsInNyYy90cy9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3Mvc3VidGl0bGVzZXR0aW5nc21hbmFnZXIudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NwYW5lbHBhZ2UudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NyZXNldGJ1dHRvbi50cyIsInNyYy90cy9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3Mvd2luZG93Y29sb3JzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3dpbmRvd29wYWNpdHlzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy90aW1lbGluZW1hcmtlcnNoYW5kbGVyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvdGl0bGViYXIudHMiLCJzcmMvdHMvY29tcG9uZW50cy90b2dnbGVidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy90dm5vaXNlY2FudmFzLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvdWljb250YWluZXIudHMiLCJzcmMvdHMvY29tcG9uZW50cy92aWRlb3F1YWxpdHlzZWxlY3Rib3gudHMiLCJzcmMvdHMvY29tcG9uZW50cy92b2x1bWVjb250cm9sYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvdm9sdW1lc2xpZGVyLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvdm9sdW1ldG9nZ2xlYnV0dG9uLnRzIiwic3JjL3RzL2NvbXBvbmVudHMvdnJ0b2dnbGVidXR0b24udHMiLCJzcmMvdHMvY29tcG9uZW50cy93YXRlcm1hcmsudHMiLCJzcmMvdHMvZGVtb2ZhY3RvcnkudHMiLCJzcmMvdHMvZG9tLnRzIiwic3JjL3RzL2Vycm9ydXRpbHMudHMiLCJzcmMvdHMvZXZlbnRkaXNwYXRjaGVyLnRzIiwic3JjL3RzL2ZvY3VzdmlzaWJpbGl0eXRyYWNrZXIudHMiLCJzcmMvdHMvZ3VpZC50cyIsInNyYy90cy9pbWFnZWxvYWRlci50cyIsInNyYy90cy9sb2NhbGl6YXRpb24vaTE4bi50cyIsInNyYy90cy9sb2NhbGl6YXRpb24vbGFuZ3VhZ2VzL2RlLmpzb24iLCJzcmMvdHMvbG9jYWxpemF0aW9uL2xhbmd1YWdlcy9lbi5qc29uIiwic3JjL3RzL21haW4udHMiLCJzcmMvdHMvbW9iaWxldjNwbGF5ZXJhcGkudHMiLCJzcmMvdHMvcGxheWVydXRpbHMudHMiLCJzcmMvdHMvc3RvcmFnZXV0aWxzLnRzIiwic3JjL3RzL3N0cmluZ3V0aWxzLnRzIiwic3JjL3RzL3N1YnRpdGxldXRpbHMudHMiLCJzcmMvdHMvdGltZW91dC50cyIsInNyYy90cy91aWZhY3RvcnkudHMiLCJzcmMvdHMvdWltYW5hZ2VyLnRzIiwic3JjL3RzL3VpdXRpbHMudHMiLCJzcmMvdHMvdm9sdW1lY29udHJvbGxlci50cyIsInNyYy90cy92dHR1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztBQ0FBLElBQWlCLFVBQVUsQ0FnQjFCO0FBaEJELFdBQWlCLFVBQVU7SUFDekI7Ozs7O09BS0c7SUFDSCxTQUFnQixNQUFNLENBQUksS0FBVSxFQUFFLElBQU87UUFDM0MsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNkLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEM7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBUmUsaUJBQU0sU0FRckIsQ0FBQTtBQUNILENBQUMsRUFoQmdCLFVBQVUsR0FBVixrQkFBVSxLQUFWLGtCQUFVLFFBZ0IxQjs7Ozs7O0FDYkQsNENBQTJDO0FBRTNDOzs7O0dBSUc7QUFDSDtJQU1FLGlDQUFZLE1BQWlCLEVBQUUsT0FBeUMsRUFBRSxTQUE0QjtRQUF0RyxpQkFRQztRQXFCTyxrQkFBYSxHQUFHLFVBQUMsS0FBc0I7WUFDN0MsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMs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SixJQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDdkksa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUssTUFBTSxDQUFDLEtBQUssTUFBRyxDQUFDLENBQUM7UUFDcEQsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUssZUFBZSxPQUFJLENBQUMsQ0FBQztRQUMvRCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRCxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBSyxlQUFlLE9BQUksQ0FBQyxDQUFDO1FBQzlELGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUssTUFBTSxDQUFDLEtBQUssR0FBRyxVQUFVLE9BQUksQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQztBQUNKLENBQUMsRUE5Q2dCLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBOEN4QiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJleHBvcnQgbmFtZXNwYWNlIEFycmF5VXRpbHMge1xuICAvKipcbiAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gYW4gYXJyYXkuXG4gICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgdGhhdCBtYXkgY29udGFpbiB0aGUgaXRlbSB0byByZW1vdmVcbiAgICogQHBhcmFtIGl0ZW0gdGhlIGl0ZW0gdG8gcmVtb3ZlIGZyb20gdGhlIGFycmF5XG4gICAqIEByZXR1cm5zIHthbnl9IHRoZSByZW1vdmVkIGl0ZW0gb3IgbnVsbCBpZiBpdCB3YXNuJ3QgcGFydCBvZiB0aGUgYXJyYXlcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZW1vdmU8VD4oYXJyYXk6IFRbXSwgaXRlbTogVCk6IFQgfCBudWxsIHtcbiAgICBsZXQgaW5kZXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJldHVybiBhcnJheS5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IExpc3RJdGVtLCBMaXN0U2VsZWN0b3IsIExpc3RTZWxlY3RvckNvbmZpZyB9IGZyb20gJy4vY29tcG9uZW50cy9saXN0c2VsZWN0b3InO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBBdWRpb1RyYWNrRXZlbnQsIFBsYXllckFQSSwgQXVkaW9UcmFjayB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBhbGwgYXVkaW8gdHJhY2tzIHJlbGF0ZWQgZXZlbnRzXG4gKlxuICogVGhpcyBjbGFzcyBsaXN0ZW5zIHRvIHBsYXllciBldmVudHMgYXMgd2VsbCBhcyB0aGUgYExpc3RTZWxlY3RvcmAgZXZlbnQgaWYgc2VsZWN0aW9uIGNoYW5nZWRcbiAqL1xuZXhwb3J0IGNsYXNzIEF1ZGlvVHJhY2tTd2l0Y2hIYW5kbGVyIHtcblxuICBwcml2YXRlIHBsYXllcjogUGxheWVyQVBJO1xuICBwcml2YXRlIGxpc3RFbGVtZW50OiBMaXN0U2VsZWN0b3I8TGlzdFNlbGVjdG9yQ29uZmlnPjtcbiAgcHJpdmF0ZSB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyQVBJLCBlbGVtZW50OiBMaXN0U2VsZWN0b3I8TGlzdFNlbGVjdG9yQ29uZmlnPiwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcikge1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMubGlzdEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMudWltYW5hZ2VyID0gdWltYW5hZ2VyO1xuXG4gICAgdGhpcy5iaW5kU2VsZWN0aW9uRXZlbnQoKTtcbiAgICB0aGlzLmJpbmRQbGF5ZXJFdmVudHMoKTtcbiAgICB0aGlzLnJlZnJlc2hBdWRpb1RyYWNrcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kU2VsZWN0aW9uRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5saXN0RWxlbWVudC5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUoKF8sIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMucGxheWVyLnNldEF1ZGlvKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZFBsYXllckV2ZW50cygpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIHdoZW4gc2VsZWN0ZWQgdHJhY2sgaGFzIGNoYW5nZWRcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkF1ZGlvQ2hhbmdlZCwgdGhpcy5zZWxlY3RDdXJyZW50QXVkaW9UcmFjayk7XG4gICAgLy8gVXBkYXRlIHRyYWNrcyB3aGVuIHNvdXJjZSBnb2VzIGF3YXlcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZVVubG9hZGVkLCB0aGlzLnJlZnJlc2hBdWRpb1RyYWNrcyk7XG4gICAgLy8gVXBkYXRlIHRyYWNrcyB3aGVuIHRoZSBwZXJpb2Qgd2l0aGluIGEgc291cmNlIGNoYW5nZXNcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBlcmlvZFN3aXRjaGVkLCB0aGlzLnJlZnJlc2hBdWRpb1RyYWNrcyk7XG4gICAgLy8gVXBkYXRlIHRyYWNrcyB3aGVuIGEgdHJhY2sgaXMgYWRkZWQgb3IgcmVtb3ZlZFxuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQXVkaW9BZGRlZCwgdGhpcy5hZGRBdWRpb1RyYWNrKTtcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkF1ZGlvUmVtb3ZlZCwgdGhpcy5yZW1vdmVBdWRpb1RyYWNrKTtcbiAgICB0aGlzLnVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSh0aGlzLnJlZnJlc2hBdWRpb1RyYWNrcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZEF1ZGlvVHJhY2sgPSAoZXZlbnQ6IEF1ZGlvVHJhY2tFdmVudCkgPT4ge1xuICAgIGNvbnN0IGF1ZGlvVHJhY2sgPSBldmVudC50cmFjaztcbiAgICBpZiAoIXRoaXMubGlzdEVsZW1lbnQuaGFzSXRlbShhdWRpb1RyYWNrLmlkKSkge1xuICAgICAgdGhpcy5saXN0RWxlbWVudC5hZGRJdGVtKGF1ZGlvVHJhY2suaWQsIGkxOG4uZ2V0TG9jYWxpemVyKGF1ZGlvVHJhY2subGFiZWwpLCB0cnVlKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZW1vdmVBdWRpb1RyYWNrID0gKGV2ZW50OiBBdWRpb1RyYWNrRXZlbnQpID0+IHtcbiAgICBjb25zdCBhdWRpb1RyYWNrID0gZXZlbnQudHJhY2s7XG4gICAgaWYgKHRoaXMubGlzdEVsZW1lbnQuaGFzSXRlbShhdWRpb1RyYWNrLmlkKSkge1xuICAgICAgdGhpcy5saXN0RWxlbWVudC5yZW1vdmVJdGVtKGF1ZGlvVHJhY2suaWQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHNlbGVjdEN1cnJlbnRBdWRpb1RyYWNrID0gKCkgPT4ge1xuICAgIGxldCBjdXJyZW50QXVkaW9UcmFjayA9IHRoaXMucGxheWVyLmdldEF1ZGlvKCk7XG5cbiAgICAvLyBITFMgc3RyZWFtcyBkb24ndCBhbHdheXMgcHJvdmlkZSB0aGlzLCBzbyB3ZSBoYXZlIHRvIGNoZWNrXG4gICAgaWYgKGN1cnJlbnRBdWRpb1RyYWNrKSB7XG4gICAgICB0aGlzLmxpc3RFbGVtZW50LnNlbGVjdEl0ZW0oY3VycmVudEF1ZGlvVHJhY2suaWQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHJlZnJlc2hBdWRpb1RyYWNrcyA9ICgpID0+IHtcbiAgICBjb25zdCBhdWRpb1RyYWNrcyA9IHRoaXMucGxheWVyLmdldEF2YWlsYWJsZUF1ZGlvKCk7XG4gICAgY29uc3QgYXVkaW9UcmFja1RvTGlzdEl0ZW0gPSAoYXVkaW9UcmFjazogQXVkaW9UcmFjayk6IExpc3RJdGVtID0+IHtcbiAgICAgIHJldHVybiB7IGtleTogYXVkaW9UcmFjay5pZCwgbGFiZWw6IGF1ZGlvVHJhY2subGFiZWwgfTtcbiAgICB9O1xuXG4gICAgdGhpcy5saXN0RWxlbWVudC5zeW5jaHJvbml6ZUl0ZW1zKGF1ZGlvVHJhY2tzLm1hcChhdWRpb1RyYWNrVG9MaXN0SXRlbSkpO1xuICAgIHRoaXMuc2VsZWN0Q3VycmVudEF1ZGlvVHJhY2soKTtcbiAgfTtcbn1cbiIsImV4cG9ydCBjbGFzcyBCcm93c2VyVXRpbHMge1xuXG4gIC8vIGlzTW9iaWxlIG9ubHkgbmVlZHMgdG8gYmUgZXZhbHVhdGVkIG9uY2UgKGl0IGNhbm5vdCBjaGFuZ2UgZHVyaW5nIGEgYnJvd3NlciBzZXNzaW9uKVxuICAvLyBNb2JpbGUgZGV0ZWN0aW9uIGFjY29yZGluZyB0byBNb3ppbGxhIHJlY29tbWVuZGF0aW9uOiBcIkluIHN1bW1hcnksIHdlIHJlY29tbWVuZCBsb29raW5nIGZvciB0aGUgc3RyaW5nIOKAnE1vYmnigJ1cbiAgLy8gYW55d2hlcmUgaW4gdGhlIFVzZXIgQWdlbnQgdG8gZGV0ZWN0IGEgbW9iaWxlIGRldmljZS5cIlxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0Jyb3dzZXJfZGV0ZWN0aW9uX3VzaW5nX3RoZV91c2VyX2FnZW50XG4gIHN0YXRpYyBnZXQgaXNNb2JpbGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLndpbmRvd0V4aXN0cygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAvTW9iaS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgaXNDaHJvbWUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLndpbmRvd0V4aXN0cygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAvQ2hyb21lLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgc3RhdGljIGdldCBpc0FuZHJvaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLndpbmRvd0V4aXN0cygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAvQW5kcm9pZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgaXNJT1MoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLndpbmRvd0V4aXN0cygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgaXNNYWNJbnRlbCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMud2luZG93RXhpc3RzKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJztcbiAgfVxuXG4gIC8vIGh0dHBzOi8vaGFja3MubW96aWxsYS5vcmcvMjAxMy8wNC9kZXRlY3RpbmctdG91Y2gtaXRzLXRoZS13aHktbm90LXRoZS1ob3cvXG4gIHN0YXRpYyBnZXQgaXNUb3VjaFN1cHBvcnRlZCgpIHtcbiAgICBpZiAoIXRoaXMud2luZG93RXhpc3RzKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAobmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMCB8fCBuYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cyA+IDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgd2luZG93RXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2xpY2tPdmVybGF5IH0gZnJvbSAnLi9jbGlja292ZXJsYXknO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgQWQsIEFkRXZlbnQsIFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbi8qKlxuICogQSBzaW1wbGUgY2xpY2sgY2FwdHVyZSBvdmVybGF5IGZvciBjbGlja1Rocm91Z2hVcmxzIG9mIGFkcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFkQ2xpY2tPdmVybGF5IGV4dGVuZHMgQ2xpY2tPdmVybGF5IHtcblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbGV0IGNsaWNrVGhyb3VnaENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbnVsbDtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZFN0YXJ0ZWQsIChldmVudDogQWRFdmVudCkgPT4ge1xuICAgICAgbGV0IGFkID0gZXZlbnQuYWQ7XG4gICAgICB0aGlzLnNldFVybChhZC5jbGlja1Rocm91Z2hVcmwpO1xuICAgICAgY2xpY2tUaHJvdWdoQ2FsbGJhY2sgPSBhZC5jbGlja1Rocm91Z2hVcmxPcGVuZWQ7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhciBjbGljay10aHJvdWdoIFVSTCB3aGVuIGFkIGhhcyBmaW5pc2hlZFxuICAgIGxldCBhZEZpbmlzaGVkSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2V0VXJsKG51bGwpO1xuICAgIH07XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRGaW5pc2hlZCwgYWRGaW5pc2hlZEhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZFNraXBwZWQsIGFkRmluaXNoZWRIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRFcnJvciwgYWRGaW5pc2hlZEhhbmRsZXIpO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBQYXVzZSB0aGUgYWQgd2hlbiBvdmVybGF5IGlzIGNsaWNrZWRcbiAgICAgIHBsYXllci5wYXVzZSgndWktYWQtY2xpY2stb3ZlcmxheScpO1xuXG4gICAgICBpZiAoY2xpY2tUaHJvdWdoQ2FsbGJhY2spIHtcbiAgICAgICAgY2xpY2tUaHJvdWdoQ2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtMYWJlbCwgTGFiZWxDb25maWd9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7U3RyaW5nVXRpbHN9IGZyb20gJy4uL3N0cmluZ3V0aWxzJztcbmltcG9ydCB7IEFkRXZlbnQsIExpbmVhckFkLCBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIGxhYmVsIHRoYXQgZGlzcGxheXMgYSBtZXNzYWdlIGFib3V0IGEgcnVubmluZyBhZCwgb3B0aW9uYWxseSB3aXRoIGEgY291bnRkb3duLlxuICovXG5leHBvcnQgY2xhc3MgQWRNZXNzYWdlTGFiZWwgZXh0ZW5kcyBMYWJlbDxMYWJlbENvbmZpZz4ge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogTGFiZWxDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWxhYmVsLWFkLW1lc3NhZ2UnLFxuICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ2Fkcy5yZW1haW5pbmdUaW1lJykgLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBsZXQgdGV4dCA9IGNvbmZpZy50ZXh0O1xuXG4gICAgbGV0IHVwZGF0ZU1lc3NhZ2VIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zZXRUZXh0KFN0cmluZ1V0aWxzLnJlcGxhY2VBZE1lc3NhZ2VQbGFjZWhvbGRlcnMoaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRleHQpLCBudWxsLCBwbGF5ZXIpKTtcbiAgICB9O1xuXG4gICAgbGV0IGFkU3RhcnRIYW5kbGVyID0gKGV2ZW50OiBBZEV2ZW50KSA9PiB7XG4gICAgICBsZXQgdWlDb25maWcgPSAoZXZlbnQuYWQgYXMgTGluZWFyQWQpLnVpQ29uZmlnO1xuICAgICAgdGV4dCA9IHVpQ29uZmlnICYmIHVpQ29uZmlnLm1lc3NhZ2UgfHwgY29uZmlnLnRleHQ7XG5cbiAgICAgIHVwZGF0ZU1lc3NhZ2VIYW5kbGVyKCk7XG5cbiAgICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lQ2hhbmdlZCwgdXBkYXRlTWVzc2FnZUhhbmRsZXIpO1xuICAgIH07XG5cbiAgICBsZXQgYWRFbmRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcGxheWVyLm9mZihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lQ2hhbmdlZCwgdXBkYXRlTWVzc2FnZUhhbmRsZXIpO1xuICAgIH07XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRTdGFydGVkLCBhZFN0YXJ0SGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFkU2tpcHBlZCwgYWRFbmRIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRFcnJvciwgYWRFbmRIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRGaW5pc2hlZCwgYWRFbmRIYW5kbGVyKTtcbiAgfVxufSIsImltcG9ydCB7IEJ1dHRvbkNvbmZpZywgQnV0dG9uIH0gZnJvbSAnLi9idXR0b24nO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgU3RyaW5nVXRpbHMgfSBmcm9tICcuLi9zdHJpbmd1dGlscyc7XG5pbXBvcnQgeyBBZEV2ZW50LCBMaW5lYXJBZCwgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIHtAbGluayBBZFNraXBCdXR0b259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkU2tpcEJ1dHRvbkNvbmZpZyBleHRlbmRzIEJ1dHRvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBNZXNzYWdlIHdoaWNoIGdldHMgZGlzcGxheWVkIGR1cmluZyB0aGUgY291bnRkb3duIGlzIGFjdGl2ZS5cbiAgICogU3VwcG9ydGVkIHBsYWNlaG9sZGVyczogbG9vayBhdCB7QGxpbmsgU3RyaW5nVXRpbHMucmVwbGFjZUFkTWVzc2FnZVBsYWNlaG9sZGVyc31cbiAgICovXG4gIHVudGlsU2tpcHBhYmxlTWVzc2FnZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlIGFkIGlzIHNraXBwYWJsZS5cbiAgICogU3VwcG9ydGVkIHBsYWNlaG9sZGVyczogbG9vayBhdCB7QGxpbmsgU3RyaW5nVXRpbHMucmVwbGFjZUFkTWVzc2FnZVBsYWNlaG9sZGVyc31cbiAgICovXG4gIHNraXBwYWJsZU1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCBpcyBkaXNwbGF5ZWQgZHVyaW5nIGFkcyBhbmQgY2FuIGJlIHVzZWQgdG8gc2tpcCB0aGUgYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBZFNraXBCdXR0b24gZXh0ZW5kcyBCdXR0b248QWRTa2lwQnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBBZFNraXBCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCA8QWRTa2lwQnV0dG9uQ29uZmlnPntcbiAgICAgIGNzc0NsYXNzOiAndWktYnV0dG9uLWFkLXNraXAnLFxuICAgICAgdW50aWxTa2lwcGFibGVNZXNzYWdlOiAnU2tpcCBhZCBpbiB7cmVtYWluaW5nVGltZX0nLFxuICAgICAgc2tpcHBhYmxlTWVzc2FnZTogJ1NraXAgYWQnLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBsZXQgdW50aWxTa2lwcGFibGVNZXNzYWdlID0gY29uZmlnLnVudGlsU2tpcHBhYmxlTWVzc2FnZTtcbiAgICBsZXQgc2tpcHBhYmxlTWVzc2FnZSA9IGNvbmZpZy5za2lwcGFibGVNZXNzYWdlO1xuICAgIGxldCBza2lwT2Zmc2V0ID0gLTE7XG5cbiAgICBsZXQgdXBkYXRlU2tpcE1lc3NhZ2VIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5zaG93KCk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgc2tpcCBtZXNzYWdlIG9uIHRoZSBidXR0b25cbiAgICAgIGlmIChwbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKSA8IHNraXBPZmZzZXQpIHtcbiAgICAgICAgdGhpcy5zZXRUZXh0KFN0cmluZ1V0aWxzLnJlcGxhY2VBZE1lc3NhZ2VQbGFjZWhvbGRlcnModW50aWxTa2lwcGFibGVNZXNzYWdlLCBza2lwT2Zmc2V0LCBwbGF5ZXIpKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFRleHQoc2tpcHBhYmxlTWVzc2FnZSk7XG4gICAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCBhZFN0YXJ0SGFuZGxlciA9IChldmVudDogQWRFdmVudCkgPT4ge1xuICAgICAgbGV0IGFkID0gZXZlbnQuYWQgYXMgTGluZWFyQWQ7XG4gICAgICBza2lwT2Zmc2V0ID0gYWQuc2tpcHBhYmxlQWZ0ZXI7XG4gICAgICB1bnRpbFNraXBwYWJsZU1lc3NhZ2UgPSBhZC51aUNvbmZpZyAmJiBhZC51aUNvbmZpZy51bnRpbFNraXBwYWJsZU1lc3NhZ2UgfHwgY29uZmlnLnVudGlsU2tpcHBhYmxlTWVzc2FnZTtcbiAgICAgIHNraXBwYWJsZU1lc3NhZ2UgPSBhZC51aUNvbmZpZyAmJiBhZC51aUNvbmZpZy5za2lwcGFibGVNZXNzYWdlIHx8IGNvbmZpZy5za2lwcGFibGVNZXNzYWdlO1xuXG4gICAgICAvLyBEaXNwbGF5IHRoaXMgYnV0dG9uIG9ubHkgaWYgYWQgaXMgc2tpcHBhYmxlLlxuICAgICAgLy8gTm9uLXNraXBwYWJsZSBhZHMgd2lsbCByZXR1cm4gLTEgZm9yIHNraXBwYWJsZUFmdGVyIGZvciBwbGF5ZXIgdmVyc2lvbiA8IHY4LjMuMC5cbiAgICAgIGlmICh0eXBlb2Ygc2tpcE9mZnNldCA9PT0gJ251bWJlcicgJiYgc2tpcE9mZnNldCA+PSAwKSB7XG4gICAgICAgIHVwZGF0ZVNraXBNZXNzYWdlSGFuZGxlcigpO1xuICAgICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVGltZUNoYW5nZWQsIHVwZGF0ZVNraXBNZXNzYWdlSGFuZGxlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IGFkRW5kSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHBsYXllci5vZmYocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVGltZUNoYW5nZWQsIHVwZGF0ZVNraXBNZXNzYWdlSGFuZGxlcik7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZFN0YXJ0ZWQsIGFkU3RhcnRIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRTa2lwcGVkLCBhZEVuZEhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZEVycm9yLCBhZEVuZEhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZEZpbmlzaGVkLCBhZEVuZEhhbmRsZXIpO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBUcnkgdG8gc2tpcCB0aGUgYWQgKHRoaXMgb25seSB3b3JrcyBpZiBpdCBpcyBza2lwcGFibGUgc28gd2UgZG9uJ3QgbmVlZCB0byB0YWtlIGV4dHJhIGNhcmUgb2YgdGhhdCBoZXJlKVxuICAgICAgcGxheWVyLmFkcy5za2lwKCk7XG4gICAgfSk7XG4gIH1cbn0iLCJpbXBvcnQge1RvZ2dsZUJ1dHRvbiwgVG9nZ2xlQnV0dG9uQ29uZmlnfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCB0b2dnbGVzIEFwcGxlIEFpclBsYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBaXJQbGF5VG9nZ2xlQnV0dG9uIGV4dGVuZHMgVG9nZ2xlQnV0dG9uPFRvZ2dsZUJ1dHRvbkNvbmZpZz4ge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogVG9nZ2xlQnV0dG9uQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1haXJwbGF5dG9nZ2xlYnV0dG9uJyxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdhcHBsZUFpcnBsYXknKSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgaWYgKCFwbGF5ZXIuaXNBaXJwbGF5QXZhaWxhYmxlKSB7XG4gICAgICAvLyBJZiB0aGUgcGxheWVyIGRvZXMgbm90IHN1cHBvcnQgQWlycGxheSAocGxheWVyIDcuMCksIHdlIGp1c3QgaGlkZSB0aGlzIGNvbXBvbmVudCBhbmQgc2tpcCBjb25maWd1cmF0aW9uXG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmIChwbGF5ZXIuaXNBaXJwbGF5QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgcGxheWVyLnNob3dBaXJwbGF5VGFyZ2V0UGlja2VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdBaXJQbGF5IHVuYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGFpclBsYXlBdmFpbGFibGVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgaWYgKHBsYXllci5pc0FpcnBsYXlBdmFpbGFibGUoKSkge1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhaXJQbGF5Q2hhbmdlZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBpZiAocGxheWVyLmlzQWlycGxheUFjdGl2ZSgpKSB7XG4gICAgICAgIHRoaXMub24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub2ZmKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BaXJwbGF5QXZhaWxhYmxlLCBhaXJQbGF5QXZhaWxhYmxlSGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFpcnBsYXlDaGFuZ2VkLCBhaXJQbGF5Q2hhbmdlZEhhbmRsZXIpO1xuXG4gICAgLy8gU3RhcnR1cCBpbml0XG4gICAgYWlyUGxheUF2YWlsYWJsZUhhbmRsZXIoKTsgLy8gSGlkZSBidXR0b24gaWYgQWlyUGxheSBpcyBub3QgYXZhaWxhYmxlXG4gICAgYWlyUGxheUNoYW5nZWRIYW5kbGVyKCk7XG4gIH1cbn0iLCJpbXBvcnQge1NlbGVjdEJveH0gZnJvbSAnLi9zZWxlY3Rib3gnO1xuaW1wb3J0IHtMaXN0U2VsZWN0b3JDb25maWd9IGZyb20gJy4vbGlzdHNlbGVjdG9yJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIHNlbGVjdCBib3ggcHJvdmlkaW5nIGEgc2VsZWN0aW9uIGJldHdlZW4gJ2F1dG8nIGFuZCB0aGUgYXZhaWxhYmxlIGF1ZGlvIHF1YWxpdGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEF1ZGlvUXVhbGl0eVNlbGVjdEJveCBleHRlbmRzIFNlbGVjdEJveCB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMaXN0U2VsZWN0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzc2VzOiBbJ3VpLWF1ZGlvcXVhbGl0eXNlbGVjdGJveCddLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgc2VsZWN0Q3VycmVudEF1ZGlvUXVhbGl0eSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbShwbGF5ZXIuZ2V0QXVkaW9RdWFsaXR5KCkuaWQpO1xuICAgIH07XG5cbiAgICBsZXQgdXBkYXRlQXVkaW9RdWFsaXRpZXMgPSAoKSA9PiB7XG4gICAgICBsZXQgYXVkaW9RdWFsaXRpZXMgPSBwbGF5ZXIuZ2V0QXZhaWxhYmxlQXVkaW9RdWFsaXRpZXMoKTtcblxuICAgICAgdGhpcy5jbGVhckl0ZW1zKCk7XG5cbiAgICAgIC8vIEFkZCBlbnRyeSBmb3IgYXV0b21hdGljIHF1YWxpdHkgc3dpdGNoaW5nIChkZWZhdWx0IHNldHRpbmcpXG4gICAgICB0aGlzLmFkZEl0ZW0oJ2F1dG8nLCBpMThuLmdldExvY2FsaXplcignYXV0bycpKTtcblxuICAgICAgLy8gQWRkIGF1ZGlvIHF1YWxpdGllc1xuICAgICAgZm9yIChsZXQgYXVkaW9RdWFsaXR5IG9mIGF1ZGlvUXVhbGl0aWVzKSB7XG4gICAgICAgIHRoaXMuYWRkSXRlbShhdWRpb1F1YWxpdHkuaWQsIGF1ZGlvUXVhbGl0eS5sYWJlbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlbGVjdCBpbml0aWFsIHF1YWxpdHlcbiAgICAgIHNlbGVjdEN1cnJlbnRBdWRpb1F1YWxpdHkoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUoKHNlbmRlcjogQXVkaW9RdWFsaXR5U2VsZWN0Qm94LCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBwbGF5ZXIuc2V0QXVkaW9RdWFsaXR5KHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBxdWFsaXRpZXMgd2hlbiBhdWRpbyB0cmFjayBoYXMgY2hhbmdlZFxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BdWRpb0NoYW5nZWQsIHVwZGF0ZUF1ZGlvUXVhbGl0aWVzKTtcbiAgICAvLyBVcGRhdGUgcXVhbGl0aWVzIHdoZW4gc291cmNlIGdvZXMgYXdheVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgdXBkYXRlQXVkaW9RdWFsaXRpZXMpO1xuICAgIC8vIFVwZGF0ZSBxdWFsaXRpZXMgd2hlbiB0aGUgcGVyaW9kIHdpdGhpbiBhIHNvdXJjZSBjaGFuZ2VzXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBlcmlvZFN3aXRjaGVkLCB1cGRhdGVBdWRpb1F1YWxpdGllcyk7XG4gICAgLy8gVXBkYXRlIHF1YWxpdHkgc2VsZWN0aW9uIHdoZW4gcXVhbGl0eSBpcyBjaGFuZ2VkIChmcm9tIG91dHNpZGUpXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkF1ZGlvUXVhbGl0eUNoYW5nZWQsIHNlbGVjdEN1cnJlbnRBdWRpb1F1YWxpdHkpO1xuICAgIGlmICgocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQgYXMgYW55KS5BdWRpb1F1YWxpdHlBZGRlZCkge1xuICAgICAgLy8gVXBkYXRlIHF1YWxpdGllcyB3aGVuIHRoZWlyIGF2YWlsYWJpbGl0eSBjaGFuZ2VkXG4gICAgICAvLyBUT0RPOiByZW1vdmUgYW55IGNhc3QgYWZ0ZXIgbmV4dCBwbGF5ZXIgcmVsZWFzZVxuICAgICAgcGxheWVyLm9uKChwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudCBhcyBhbnkpLkF1ZGlvUXVhbGl0eUFkZGVkLCB1cGRhdGVBdWRpb1F1YWxpdGllcyk7XG4gICAgICBwbGF5ZXIub24oKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50IGFzIGFueSkuQXVkaW9RdWFsaXR5UmVtb3ZlZCwgdXBkYXRlQXVkaW9RdWFsaXRpZXMpO1xuICAgIH1cblxuICAgIHVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSh1cGRhdGVBdWRpb1F1YWxpdGllcyk7XG4gIH1cbn0iLCJpbXBvcnQge0xpc3RCb3h9IGZyb20gJy4vbGlzdGJveCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtBdWRpb1RyYWNrU3dpdGNoSGFuZGxlcn0gZnJvbSAnLi4vYXVkaW90cmFja3V0aWxzJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbi8qKlxuICogQSBlbGVtZW50IHRoYXQgaXMgc2ltaWxhciB0byBhIHNlbGVjdCBib3ggd2hlcmUgdGhlIHVzZXIgY2FuIHNlbGVjdCBhIHN1YnRpdGxlXG4gKi9cbmV4cG9ydCBjbGFzcyBBdWRpb1RyYWNrTGlzdEJveCBleHRlbmRzIExpc3RCb3gge1xuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgbmV3IEF1ZGlvVHJhY2tTd2l0Y2hIYW5kbGVyKHBsYXllciwgdGhpcywgdWltYW5hZ2VyKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtTZWxlY3RCb3h9IGZyb20gJy4vc2VsZWN0Ym94JztcbmltcG9ydCB7TGlzdFNlbGVjdG9yQ29uZmlnfSBmcm9tICcuL2xpc3RzZWxlY3Rvcic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtBdWRpb1RyYWNrU3dpdGNoSGFuZGxlcn0gZnJvbSAnLi4vYXVkaW90cmFja3V0aWxzJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBiZXR3ZWVuIGF2YWlsYWJsZSBhdWRpbyB0cmFja3MgKGUuZy4gZGlmZmVyZW50IGxhbmd1YWdlcykuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdWRpb1RyYWNrU2VsZWN0Qm94IGV4dGVuZHMgU2VsZWN0Qm94IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExpc3RTZWxlY3RvckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktYXVkaW90cmFja3NlbGVjdGJveCddLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBuZXcgQXVkaW9UcmFja1N3aXRjaEhhbmRsZXIocGxheWVyLCB0aGlzLCB1aW1hbmFnZXIpO1xuICB9XG59IiwiaW1wb3J0IHtDb250YWluZXJDb25maWcsIENvbnRhaW5lcn0gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7Q29tcG9uZW50LCBDb21wb25lbnRDb25maWd9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7VGltZW91dH0gZnJvbSAnLi4vdGltZW91dCc7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciB0aGUge0BsaW5rIEJ1ZmZlcmluZ092ZXJsYXl9IGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWZmZXJpbmdPdmVybGF5Q29uZmlnIGV4dGVuZHMgQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIERlbGF5IGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgYnVmZmVyaW5nIG92ZXJsYXkgd2lsbCBiZSBkaXNwbGF5ZWQuIFVzZWZ1bCB0byBieXBhc3Mgc2hvcnQgc3RhbGxzIHdpdGhvdXRcbiAgICogZGlzcGxheWluZyB0aGUgb3ZlcmxheS4gU2V0IHRvIDAgdG8gZGlzcGxheSB0aGUgb3ZlcmxheSBpbnN0YW50bHkuXG4gICAqIERlZmF1bHQ6IDEwMDBtcyAoMSBzZWNvbmQpXG4gICAqL1xuICBzaG93RGVsYXlNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPdmVybGF5cyB0aGUgcGxheWVyIGFuZCBkaXNwbGF5cyBhIGJ1ZmZlcmluZyBpbmRpY2F0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWZmZXJpbmdPdmVybGF5IGV4dGVuZHMgQ29udGFpbmVyPEJ1ZmZlcmluZ092ZXJsYXlDb25maWc+IHtcblxuICBwcml2YXRlIGluZGljYXRvcnM6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+W107XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdWZmZXJpbmdPdmVybGF5Q29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5pbmRpY2F0b3JzID0gW1xuICAgICAgbmV3IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+KHsgdGFnOiAnZGl2JywgY3NzQ2xhc3M6ICd1aS1idWZmZXJpbmctb3ZlcmxheS1pbmRpY2F0b3InLCByb2xlOiAnaW1nJyB9KSxcbiAgICAgIG5ldyBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPih7IHRhZzogJ2RpdicsIGNzc0NsYXNzOiAndWktYnVmZmVyaW5nLW92ZXJsYXktaW5kaWNhdG9yJywgcm9sZTogJ2ltZycgfSksXG4gICAgICBuZXcgQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4oeyB0YWc6ICdkaXYnLCBjc3NDbGFzczogJ3VpLWJ1ZmZlcmluZy1vdmVybGF5LWluZGljYXRvcicsIHJvbGU6ICdpbWcnIH0pLFxuICAgIF07XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCA8QnVmZmVyaW5nT3ZlcmxheUNvbmZpZz57XG4gICAgICBjc3NDbGFzczogJ3VpLWJ1ZmZlcmluZy1vdmVybGF5JyxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgIGNvbXBvbmVudHM6IHRoaXMuaW5kaWNhdG9ycyxcbiAgICAgIHNob3dEZWxheU1zOiAxMDAwLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgIGxldCBvdmVybGF5U2hvd1RpbWVvdXQgPSBuZXcgVGltZW91dChjb25maWcuc2hvd0RlbGF5TXMsICgpID0+IHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH0pO1xuXG4gICAgbGV0IHNob3dPdmVybGF5ID0gKCkgPT4ge1xuICAgICAgb3ZlcmxheVNob3dUaW1lb3V0LnN0YXJ0KCk7XG4gICAgfTtcblxuICAgIGxldCBoaWRlT3ZlcmxheSA9ICgpID0+IHtcbiAgICAgIG92ZXJsYXlTaG93VGltZW91dC5jbGVhcigpO1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TdGFsbFN0YXJ0ZWQsIHNob3dPdmVybGF5KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3RhbGxFbmRlZCwgaGlkZU92ZXJsYXkpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCBzaG93T3ZlcmxheSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXlpbmcsIGhpZGVPdmVybGF5KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGF1c2VkLCBoaWRlT3ZlcmxheSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNlZWssIHNob3dPdmVybGF5KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU2Vla2VkLCBoaWRlT3ZlcmxheSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlRpbWVTaGlmdCwgc2hvd092ZXJsYXkpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lU2hpZnRlZCwgaGlkZU92ZXJsYXkpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgaGlkZU92ZXJsYXkpO1xuXG4gICAgLy8gU2hvdyBvdmVybGF5IGlmIHBsYXllciBpcyBhbHJlYWR5IHN0YWxsZWQgYXQgaW5pdFxuICAgIGlmIChwbGF5ZXIuaXNTdGFsbGVkKCkpIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnRDb25maWcsIENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHtET019IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQge0V2ZW50RGlzcGF0Y2hlciwgTm9BcmdzLCBFdmVudH0gZnJvbSAnLi4vZXZlbnRkaXNwYXRjaGVyJztcbmltcG9ydCB7IExvY2FsaXphYmxlVGV4dCAsIGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIEJ1dHRvbn0gY29tcG9uZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1dHRvbkNvbmZpZyBleHRlbmRzIENvbXBvbmVudENvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBhcyBzdHJpbmcgb3IgbG9jYWxpemUgY2FsbGJhY2sgb24gdGhlIGJ1dHRvbi5cbiAgICovXG4gIHRleHQ/OiBMb2NhbGl6YWJsZVRleHQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgY2xpY2thYmxlIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1dHRvbjxDb25maWcgZXh0ZW5kcyBCdXR0b25Db25maWc+IGV4dGVuZHMgQ29tcG9uZW50PENvbmZpZz4ge1xuXG4gIHByaXZhdGUgYnV0dG9uRXZlbnRzID0ge1xuICAgIG9uQ2xpY2s6IG5ldyBFdmVudERpc3BhdGNoZXI8QnV0dG9uPENvbmZpZz4sIE5vQXJncz4oKSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWJ1dHRvbicsXG4gICAgICByb2xlOiAnYnV0dG9uJyxcbiAgICAgIHRhYkluZGV4OiAwLFxuICAgIH0gYXMgQ29uZmlnLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgY29uc3QgYnV0dG9uRWxlbWVudEF0dHJpYnV0ZXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgJ2lkJzogdGhpcy5jb25maWcuaWQsXG4gICAgICAnYXJpYS1sYWJlbCc6IGkxOG4ucGVyZm9ybUxvY2FsaXphdGlvbih0aGlzLmNvbmZpZy5hcmlhTGFiZWwgfHwgdGhpcy5jb25maWcudGV4dCksXG4gICAgICAnY2xhc3MnOiB0aGlzLmdldENzc0NsYXNzZXMoKSxcbiAgICAgICd0eXBlJyA6ICdidXR0b24nLFxuICAgICAgLyoqXG4gICAgICAqIFdDQUcyMCBzdGFuZGFyZCB0byBkaXNwbGF5IGlmIGEgYnV0dG9uIGlzIHByZXNzZWQgb3Igbm90XG4gICAgICAqL1xuICAgICAgJ2FyaWEtcHJlc3NlZCc6ICdmYWxzZScsXG4gICAgICAndGFiaW5kZXgnOiB0aGlzLmNvbmZpZy50YWJJbmRleC50b1N0cmluZygpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jb25maWcucm9sZSAhPSBudWxsKSB7XG4gICAgICBidXR0b25FbGVtZW50QXR0cmlidXRlc1sncm9sZSddID0gdGhpcy5jb25maWcucm9sZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIGJ1dHRvbiBlbGVtZW50IHdpdGggdGhlIHRleHQgbGFiZWxcbiAgICBsZXQgYnV0dG9uRWxlbWVudCA9IG5ldyBET00oJ2J1dHRvbicsIGJ1dHRvbkVsZW1lbnRBdHRyaWJ1dGVzKS5hcHBlbmQobmV3IERPTSgnc3BhbicsIHtcbiAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCdsYWJlbCcpLFxuICAgIH0pLmh0bWwoaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRoaXMuY29uZmlnLnRleHQpKSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHRoZSBjbGljayBldmVudCBvbiB0aGUgYnV0dG9uIGVsZW1lbnQgYW5kIHRyaWdnZXIgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQgb24gdGhlIGJ1dHRvbiBjb21wb25lbnRcbiAgICBidXR0b25FbGVtZW50Lm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMub25DbGlja0V2ZW50KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnV0dG9uRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRleHQgb24gdGhlIGxhYmVsIG9mIHRoZSBidXR0b24uXG4gICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIHB1dCBpbnRvIHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uXG4gICAqL1xuICBzZXRUZXh0KHRleHQ6IExvY2FsaXphYmxlVGV4dCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmZpbmQoJy4nICsgdGhpcy5wcmVmaXhDc3MoJ2xhYmVsJykpLmh0bWwoaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRleHQpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNsaWNrRXZlbnQoKSB7XG4gICAgdGhpcy5idXR0b25FdmVudHMub25DbGljay5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8QnV0dG9uPENvbmZpZz4sIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25DbGljaygpOiBFdmVudDxCdXR0b248Q29uZmlnPiwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uRXZlbnRzLm9uQ2xpY2suZ2V0RXZlbnQoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb250YWluZXJDb25maWcsIENvbnRhaW5lcn0gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHtMYWJlbCwgTGFiZWxDb25maWd9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IENhc3RTdGFydGVkRXZlbnQsIENhc3RXYWl0aW5nRm9yRGV2aWNlRXZlbnQsIFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIE92ZXJsYXlzIHRoZSBwbGF5ZXIgYW5kIGRpc3BsYXlzIHRoZSBzdGF0dXMgb2YgYSBDYXN0IHNlc3Npb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDYXN0U3RhdHVzT3ZlcmxheSBleHRlbmRzIENvbnRhaW5lcjxDb250YWluZXJDb25maWc+IHtcblxuICBwcml2YXRlIHN0YXR1c0xhYmVsOiBMYWJlbDxMYWJlbENvbmZpZz47XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb250YWluZXJDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLnN0YXR1c0xhYmVsID0gbmV3IExhYmVsPExhYmVsQ29uZmlnPih7IGNzc0NsYXNzOiAndWktY2FzdC1zdGF0dXMtbGFiZWwnIH0pO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1jYXN0LXN0YXR1cy1vdmVybGF5JyxcbiAgICAgIGNvbXBvbmVudHM6IFt0aGlzLnN0YXR1c0xhYmVsXSxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RXYWl0aW5nRm9yRGV2aWNlLFxuICAgICAgKGV2ZW50OiBDYXN0V2FpdGluZ0ZvckRldmljZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICAvLyBHZXQgZGV2aWNlIG5hbWUgYW5kIHVwZGF0ZSBzdGF0dXMgdGV4dCB3aGlsZSBjb25uZWN0aW5nXG4gICAgICAgIGxldCBjYXN0RGV2aWNlTmFtZSA9IGV2ZW50LmNhc3RQYXlsb2FkLmRldmljZU5hbWU7XG4gICAgICAgIHRoaXMuc3RhdHVzTGFiZWwuc2V0VGV4dChpMThuLmdldExvY2FsaXplcignY29ubmVjdGluZ1RvJywgeyBjYXN0RGV2aWNlTmFtZSB9KSk7XG4gICAgICB9KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQ2FzdFN0YXJ0ZWQsIChldmVudDogQ2FzdFN0YXJ0ZWRFdmVudCkgPT4ge1xuICAgICAgLy8gU2Vzc2lvbiBpcyBzdGFydGVkIG9yIHJlc3VtZWRcbiAgICAgIC8vIEZvciBjYXNlcyB3aGVuIGEgc2Vzc2lvbiBpcyByZXN1bWVkLCB3ZSBkbyBub3QgcmVjZWl2ZSB0aGUgcHJldmlvdXMgZXZlbnRzIGFuZCB0aGVyZWZvcmUgc2hvdyB0aGUgc3RhdHVzIHBhbmVsXG4gICAgICAvLyBoZXJlIHRvb1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgICBsZXQgY2FzdERldmljZU5hbWUgPSBldmVudC5kZXZpY2VOYW1lO1xuICAgICAgdGhpcy5zdGF0dXNMYWJlbC5zZXRUZXh0KGkxOG4uZ2V0TG9jYWxpemVyKCdwbGF5aW5nT24nLCB7IGNhc3REZXZpY2VOYW1lIH0pKTtcbiAgICB9KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQ2FzdFN0b3BwZWQsIChldmVudCkgPT4ge1xuICAgICAgLy8gQ2FzdCBzZXNzaW9uIGdvbmUsIGhpZGUgdGhlIHN0YXR1cyBwYW5lbFxuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSk7XG4gIH1cbn0iLCJpbXBvcnQge1RvZ2dsZUJ1dHRvbiwgVG9nZ2xlQnV0dG9uQ29uZmlnfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCB0b2dnbGVzIGNhc3RpbmcgdG8gYSBDYXN0IHJlY2VpdmVyLlxuICovXG5leHBvcnQgY2xhc3MgQ2FzdFRvZ2dsZUJ1dHRvbiBleHRlbmRzIFRvZ2dsZUJ1dHRvbjxUb2dnbGVCdXR0b25Db25maWc+IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFRvZ2dsZUJ1dHRvbkNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktY2FzdHRvZ2dsZWJ1dHRvbicsXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcignZ29vZ2xlQ2FzdCcpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmIChwbGF5ZXIuaXNDYXN0QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgaWYgKHBsYXllci5pc0Nhc3RpbmcoKSkge1xuICAgICAgICAgIHBsYXllci5jYXN0U3RvcCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBsYXllci5jYXN0VmlkZW8oKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQ2FzdCB1bmF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgY2FzdEF2YWlsYWJsZUhhbmRlciA9ICgpID0+IHtcbiAgICAgIGlmIChwbGF5ZXIuaXNDYXN0QXZhaWxhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RBdmFpbGFibGUsIGNhc3RBdmFpbGFibGVIYW5kZXIpO1xuXG4gICAgLy8gVG9nZ2xlIGJ1dHRvbiAnb24nIHN0YXRlXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RXYWl0aW5nRm9yRGV2aWNlLCAoKSA9PiB7XG4gICAgICB0aGlzLm9uKCk7XG4gICAgfSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RTdGFydGVkLCAoKSA9PiB7XG4gICAgICAvLyBXaGVuIGEgc2Vzc2lvbiBpcyByZXN1bWVkLCB0aGVyZSBpcyBubyBDYXN0U3RhcnQgZXZlbnQsIHNvIHdlIGFsc28gbmVlZCB0byB0b2dnbGUgaGVyZSBmb3Igc3VjaCBjYXNlc1xuICAgICAgdGhpcy5vbigpO1xuICAgIH0pO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5DYXN0U3RvcHBlZCwgKCkgPT4ge1xuICAgICAgdGhpcy5vZmYoKTtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0dXAgaW5pdFxuICAgIGNhc3RBdmFpbGFibGVIYW5kZXIoKTsgLy8gSGlkZSBidXR0b24gaWYgQ2FzdCBub3QgYXZhaWxhYmxlXG4gICAgaWYgKHBsYXllci5pc0Nhc3RpbmcoKSkge1xuICAgICAgdGhpcy5vbigpO1xuICAgIH1cbiAgfVxufSIsImltcG9ydCB7VUlDb250YWluZXIsIFVJQ29udGFpbmVyQ29uZmlnfSBmcm9tICcuL3VpY29udGFpbmVyJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1RpbWVvdXR9IGZyb20gJy4uL3RpbWVvdXQnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcblxuLyoqXG4gKiBUaGUgYmFzZSBjb250YWluZXIgZm9yIENhc3QgcmVjZWl2ZXJzIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBVSSBhbmQgdGFrZXMgY2FyZSB0aGF0IHRoZSBVSSBpcyBzaG93biBvblxuICogY2VydGFpbiBwbGF5YmFjayBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYXN0VUlDb250YWluZXIgZXh0ZW5kcyBVSUNvbnRhaW5lciB7XG5cbiAgcHJpdmF0ZSBjYXN0VWlIaWRlVGltZW91dDogVGltZW91dDtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFVJQ29udGFpbmVyQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgIC8qXG4gICAgICogU2hvdyBVSSBvbiBDYXN0IGRldmljZXMgYXQgY2VydGFpbiBwbGF5YmFjayBldmVudHNcbiAgICAgKlxuICAgICAqIFNpbmNlIGEgQ2FzdCByZWNlaXZlciBkb2VzIG5vdCBoYXZlIGEgZGlyZWN0IEhDSSwgd2Ugc2hvdyB0aGUgVUkgb24gY2VydGFpbiBwbGF5YmFjayBldmVudHMgdG8gZ2l2ZSB0aGUgdXNlclxuICAgICAqIGEgY2hhbmNlIHRvIHNlZSBvbiB0aGUgc2NyZWVuIHdoYXQncyBnb2luZyBvbiwgZS5nLiBvbiBwbGF5L3BhdXNlIG9yIGEgc2VlayB0aGUgVUkgaXMgc2hvd24gYW5kIHRoZSB1c2VyIGNhblxuICAgICAqIHNlZSB0aGUgY3VycmVudCB0aW1lIGFuZCBwb3NpdGlvbiBvbiB0aGUgc2VlayBiYXIuXG4gICAgICogVGhlIFVJIGlzIHNob3duIHBlcm1hbmVudGx5IHdoaWxlIHBsYXliYWNrIGlzIHBhdXNlZCwgb3RoZXJ3aXNlIGhpZGVzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGNvbmZpZ3VyZWRcbiAgICAgKiBoaWRlIGRlbGF5IHRpbWUuXG4gICAgICovXG5cbiAgICBsZXQgaXNVaVNob3duID0gZmFsc2U7XG5cbiAgICBsZXQgaGlkZVVpID0gKCkgPT4ge1xuICAgICAgdWltYW5hZ2VyLm9uQ29udHJvbHNIaWRlLmRpc3BhdGNoKHRoaXMpO1xuICAgICAgaXNVaVNob3duID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHRoaXMuY2FzdFVpSGlkZVRpbWVvdXQgPSBuZXcgVGltZW91dChjb25maWcuaGlkZURlbGF5LCBoaWRlVWkpO1xuXG4gICAgbGV0IHNob3dVaSA9ICgpID0+IHtcbiAgICAgIGlmICghaXNVaVNob3duKSB7XG4gICAgICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzU2hvdy5kaXNwYXRjaCh0aGlzKTtcbiAgICAgICAgaXNVaVNob3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IHNob3dVaVBlcm1hbmVudGx5ID0gKCkgPT4ge1xuICAgICAgc2hvd1VpKCk7XG4gICAgICB0aGlzLmNhc3RVaUhpZGVUaW1lb3V0LmNsZWFyKCk7XG4gICAgfTtcblxuICAgIGxldCBzaG93VWlXaXRoVGltZW91dCA9ICgpID0+IHtcbiAgICAgIHNob3dVaSgpO1xuICAgICAgdGhpcy5jYXN0VWlIaWRlVGltZW91dC5zdGFydCgpO1xuICAgIH07XG5cbiAgICBsZXQgc2hvd1VpQWZ0ZXJTZWVrID0gKCkgPT4ge1xuICAgICAgaWYgKHBsYXllci5pc1BsYXlpbmcoKSkge1xuICAgICAgICBzaG93VWlXaXRoVGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd1VpUGVybWFuZW50bHkoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXksIHNob3dVaVdpdGhUaW1lb3V0KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGF1c2VkLCBzaG93VWlQZXJtYW5lbnRseSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNlZWssIHNob3dVaVBlcm1hbmVudGx5KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU2Vla2VkLCBzaG93VWlBZnRlclNlZWspO1xuXG4gICAgdWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKHNob3dVaVdpdGhUaW1lb3V0KTtcbiAgfVxuXG4gIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgc3VwZXIucmVsZWFzZSgpO1xuICAgIHRoaXMuY2FzdFVpSGlkZVRpbWVvdXQuY2xlYXIoKTtcbiAgfVxufSIsImltcG9ydCB7QnV0dG9uLCBCdXR0b25Db25maWd9IGZyb20gJy4vYnV0dG9uJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgYSB7QGxpbmsgQ2xpY2tPdmVybGF5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGlja092ZXJsYXlDb25maWcgZXh0ZW5kcyBCdXR0b25Db25maWcge1xuICAvKipcbiAgICogVGhlIHVybCB0byBvcGVuIHdoZW4gdGhlIG92ZXJsYXkgaXMgY2xpY2tlZC4gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgY2xpY2sgaGFuZGxlci5cbiAgICovXG4gIHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNsaWNrIG92ZXJsYXkgdGhhdCBvcGVucyBhbiB1cmwgaW4gYSBuZXcgdGFiIGlmIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGlja092ZXJsYXkgZXh0ZW5kcyBCdXR0b248Q2xpY2tPdmVybGF5Q29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDbGlja092ZXJsYXlDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWNsaWNrb3ZlcmxheScsXG4gICAgICByb2xlOiB0aGlzLmNvbmZpZy5yb2xlLFxuICAgIH0sIDxDbGlja092ZXJsYXlDb25maWc+dGhpcy5jb25maWcpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG5cbiAgICB0aGlzLnNldFVybCgoPENsaWNrT3ZlcmxheUNvbmZpZz50aGlzLmNvbmZpZykudXJsKTtcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuZ2V0RG9tRWxlbWVudCgpO1xuICAgIGVsZW1lbnQub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZGF0YSgndXJsJykpIHtcbiAgICAgICAgd2luZG93Lm9wZW4oZWxlbWVudC5kYXRhKCd1cmwnKSwgJ19ibGFuaycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFVSTCB0aGF0IHNob3VsZCBiZSBmb2xsb3dlZCB3aGVuIHRoZSB3YXRlcm1hcmsgaXMgY2xpY2tlZC5cbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHdhdGVybWFyayBVUkxcbiAgICovXG4gIGdldFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldERvbUVsZW1lbnQoKS5kYXRhKCd1cmwnKTtcbiAgfVxuXG4gIHNldFVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh1cmwgPT09IHVuZGVmaW5lZCB8fCB1cmwgPT0gbnVsbCkge1xuICAgICAgdXJsID0gJyc7XG4gICAgfVxuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmRhdGEoJ3VybCcsIHVybCk7XG4gIH1cbn0iLCJpbXBvcnQge0J1dHRvbkNvbmZpZywgQnV0dG9ufSBmcm9tICcuL2J1dHRvbic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudENvbmZpZ30gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgQ2xvc2VCdXR0b259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsb3NlQnV0dG9uQ29uZmlnIGV4dGVuZHMgQnV0dG9uQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgY2xvc2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKi9cbiAgdGFyZ2V0OiBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPjtcbn1cblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IGNsb3NlcyAoaGlkZXMpIGEgY29uZmlndXJlZCBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG9zZUJ1dHRvbiBleHRlbmRzIEJ1dHRvbjxDbG9zZUJ1dHRvbkNvbmZpZz4ge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ2xvc2VCdXR0b25Db25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1jbG9zZWJ1dHRvbicsXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcignY2xvc2UnKSxcbiAgICB9IGFzIENsb3NlQnV0dG9uQ29uZmlnLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbGV0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbmZpZy50YXJnZXQuaGlkZSgpO1xuICAgIH0pO1xuICB9XG59IiwiaW1wb3J0IHtHdWlkfSBmcm9tICcuLi9ndWlkJztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHtFdmVudERpc3BhdGNoZXIsIE5vQXJncywgRXZlbnR9IGZyb20gJy4uL2V2ZW50ZGlzcGF0Y2hlcic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4sIExvY2FsaXphYmxlVGV4dCB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBCYXNlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciBhIGNvbXBvbmVudC5cbiAqIFNob3VsZCBiZSBleHRlbmRlZCBieSBjb21wb25lbnRzIHRoYXQgd2FudCB0byBhZGQgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBIVE1MIHRhZyBuYW1lIG9mIHRoZSBjb21wb25lbnQuXG4gICAqIERlZmF1bHQ6ICdkaXYnXG4gICAqL1xuICB0YWc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgSFRNTCBJRCBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBEZWZhdWx0OiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aXRoIHBhdHRlcm4gJ3VpLWlkLXtndWlkfScuXG4gICAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBwcmVmaXggdG8gcHJlcGVuZCBhbGwgQ1NTIGNsYXNzZXMgd2l0aC5cbiAgICovXG4gIGNzc1ByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENTUyBjbGFzc2VzIG9mIHRoZSBjb21wb25lbnQuIFRoaXMgaXMgdXN1YWxseSB0aGUgY2xhc3MgZnJvbSB3aGVyZSB0aGUgY29tcG9uZW50IHRha2VzIGl0cyBzdHlsaW5nLlxuICAgKi9cbiAgY3NzQ2xhc3M/OiBzdHJpbmc7IC8vICdjbGFzcycgaXMgYSByZXNlcnZlZCBrZXl3b3JkLCBzbyB3ZSBuZWVkIHRvIG1ha2UgdGhlIG5hbWUgbW9yZSBjb21wbGljYXRlZFxuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBjc3NDbGFzc2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBiZSBoaWRkZW4gYXQgc3RhcnR1cC5cbiAgICogRGVmYXVsdDogZmFsc2VcbiAgICovXG4gIGhpZGRlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgKGludGVyYWN0aXZlKSBvciBub3QuXG4gICAqIERlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgY29tcG9uZW50IHJvbGUgZm9yIFdDQUcyMCBzdGFuZGFyZFxuICAgKi9cbiAgcm9sZT86IHN0cmluZztcblxuICAvKipcbiAgICogV0NBRzIwIHJlcXVpcmVtZW50IGZvciBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICovXG4gIHRhYkluZGV4PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXQ0FHMjAgc3RhbmRhcmQgZm9yIGRlZmluaW5nIGluZm8gYWJvdXQgdGhlIGNvbXBvbmVudCAodXN1YWxseSB0aGUgbmFtZSlcbiAgICovXG4gIGFyaWFMYWJlbD86IExvY2FsaXphYmxlVGV4dDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRIb3ZlckNoYW5nZWRFdmVudEFyZ3MgZXh0ZW5kcyBOb0FyZ3Mge1xuICAvKipcbiAgICogVHJ1ZSBpcyB0aGUgY29tcG9uZW50IGlzIGhvdmVyZWQsIGVsc2UgZmFsc2UuXG4gICAqL1xuICBob3ZlcmVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIG9mIHRoZSBVSSBmcmFtZXdvcmsuXG4gKiBFYWNoIGNvbXBvbmVudCBtdXN0IGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBvcHRpb25hbGx5IHRoZSBjb25maWcgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50PENvbmZpZyBleHRlbmRzIENvbXBvbmVudENvbmZpZz4ge1xuXG4gIC8qKlxuICAgKiBUaGUgY2xhc3NuYW1lIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQgd2hlbiBpdCBpcyBpbiB0aGUgaGlkZGVuIHN0YXRlLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xBU1NfSElEREVOID0gJ2hpZGRlbic7XG5cbiAgLyoqXG4gICAqIFRoZSBjbGFzc25hbWUgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCB3aGVuIGl0IGlzIGluIHRoZSBkaXNhYmxlZCBzdGF0ZS5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMQVNTX0RJU0FCTEVEID0gJ2Rpc2FibGVkJztcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBvYmplY3Qgb2YgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uZmlnOiBDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQncyBET00gZWxlbWVudC5cbiAgICovXG4gIHByaXZhdGUgZWxlbWVudDogRE9NO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIGhpZGRlbiBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgaGlkZGVuOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGbGF0IHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIGRpc2FibGVkIHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogRmxhZyB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZSBob3ZlciBzdGF0ZS5cbiAgICovXG4gIHByaXZhdGUgaG92ZXJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZXZlbnRzIHRoYXQgdGhpcyBjb21wb25lbnQgb2ZmZXJzLiBUaGVzZSBldmVudHMgc2hvdWxkIGFsd2F5cyBiZSBwcml2YXRlIGFuZCBvbmx5IGRpcmVjdGx5XG4gICAqIGFjY2Vzc2VkIGZyb20gd2l0aGluIHRoZSBpbXBsZW1lbnRpbmcgY29tcG9uZW50LlxuICAgKlxuICAgKiBCZWNhdXNlIFR5cGVTY3JpcHQgZG9lcyBub3Qgc3VwcG9ydCBwcml2YXRlIHByb3BlcnRpZXMgd2l0aCB0aGUgc2FtZSBuYW1lIG9uIGRpZmZlcmVudCBjbGFzcyBoaWVyYXJjaHkgbGV2ZWxzXG4gICAqIChpLmUuIHN1cGVyY2xhc3MgYW5kIHN1YmNsYXNzIGNhbm5vdCBjb250YWluIGEgcHJpdmF0ZSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUpLCB0aGUgZGVmYXVsdCBuYW1pbmdcbiAgICogY29udmVudGlvbiBmb3IgdGhlIGV2ZW50IGxpc3Qgb2YgYSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgc3ViY2xhc3NlcyBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGVcbiAgICogY2FtZWwtY2FzZWQgY2xhc3MgbmFtZSArICdFdmVudHMnIChlLmcuIFN1YkNsYXNzIGV4dGVuZHMgQ29tcG9uZW50ID0+IHN1YkNsYXNzRXZlbnRzKS5cbiAgICogU2VlIHtAbGluayAjY29tcG9uZW50RXZlbnRzfSBmb3IgYW4gZXhhbXBsZS5cbiAgICpcbiAgICogRXZlbnQgcHJvcGVydGllcyBzaG91bGQgYmUgbmFtZWQgaW4gY2FtZWwgY2FzZSB3aXRoIGFuICdvbicgcHJlZml4IGFuZCBpbiB0aGUgcHJlc2VudCB0ZW5zZS4gQXN5bmMgZXZlbnRzIG1heVxuICAgKiBoYXZlIGEgc3RhcnQgZXZlbnQgKHdoZW4gdGhlIG9wZXJhdGlvbiBzdGFydHMpIGluIHRoZSBwcmVzZW50IHRlbnNlLCBhbmQgbXVzdCBoYXZlIGFuIGVuZCBldmVudCAod2hlbiB0aGVcbiAgICogb3BlcmF0aW9uIGVuZHMpIGluIHRoZSBwYXN0IHRlbnNlIChvciBwcmVzZW50IHRlbnNlIGluIHNwZWNpYWwgY2FzZXMgKGUuZy4gb25TdGFydC9vblN0YXJ0ZWQgb3Igb25QbGF5L29uUGxheWluZykuXG4gICAqIFNlZSB7QGxpbmsgI2NvbXBvbmVudEV2ZW50cyNvblNob3d9IGZvciBhbiBleGFtcGxlLlxuICAgKlxuICAgKiBFYWNoIGV2ZW50IHNob3VsZCBiZSBhY2NvbXBhbmllZCB3aXRoIGEgcHJvdGVjdGVkIG1ldGhvZCBuYW1lZCBieSB0aGUgY29udmVudGlvbiBldmVudE5hbWUgKyAnRXZlbnQnXG4gICAqIChlLmcuIG9uU3RhcnRFdmVudCksIHRoYXQgYWN0dWFsbHkgdHJpZ2dlcnMgdGhlIGV2ZW50IGJ5IGNhbGxpbmcge0BsaW5rIEV2ZW50RGlzcGF0Y2hlciNkaXNwYXRjaCBkaXNwYXRjaH0gYW5kXG4gICAqIHBhc3NpbmcgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCBhcyBmaXJzdCBwYXJhbWV0ZXIuIENvbXBvbmVudHMgc2hvdWxkIGFsd2F5cyB0cmlnZ2VyIHRoZWlyIGV2ZW50cyB3aXRoIHRoZXNlXG4gICAqIG1ldGhvZHMuIEltcGxlbWVudGluZyB0aGlzIHBhdHRlcm4gZ2l2ZXMgc3ViY2xhc3NlcyBtZWFucyB0byBkaXJlY3RseSBsaXN0ZW4gdG8gdGhlIGV2ZW50cyBieSBvdmVycmlkaW5nIHRoZVxuICAgKiBtZXRob2QgKGFuZCBzYXZpbmcgdGhlIG92ZXJoZWFkIG9mIHBhc3NpbmcgYSBoYW5kbGVyIHRvIHRoZSBldmVudCBkaXNwYXRjaGVyKSBhbmQgbW9yZSBpbXBvcnRhbnRseSB0byB0cmlnZ2VyXG4gICAqIHRoZXNlIGV2ZW50cyB3aXRob3V0IGhhdmluZyBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgZXZlbnQgbGlzdC5cbiAgICogU2VlIHtAbGluayAjb25TaG93fSBmb3IgYW4gZXhhbXBsZS5cbiAgICpcbiAgICogVG8gcHJvdmlkZSBleHRlcm5hbCBjb2RlIHRoZSBwb3NzaWJpbGl0eSB0byBsaXN0ZW4gdG8gdGhpcyBjb21wb25lbnQncyBldmVudHMgKHN1YnNjcmliZSwgdW5zdWJzY3JpYmUsIGV0Yy4pLFxuICAgKiBlYWNoIGV2ZW50IHNob3VsZCBhbHNvIGJlIGFjY29tcGFuaWVkIGJ5IGEgcHVibGljIGdldHRlciBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50J3MgcHJvcGVydHksXG4gICAqIHRoYXQgcmV0dXJucyB0aGUge0BsaW5rIEV2ZW50fSBvYnRhaW5lZCBmcm9tIHRoZSBldmVudCBkaXNwYXRjaGVyIGJ5IGNhbGxpbmcge0BsaW5rIEV2ZW50RGlzcGF0Y2hlciNnZXRFdmVudH0uXG4gICAqIFNlZSB7QGxpbmsgI29uU2hvd30gZm9yIGFuIGV4YW1wbGUuXG4gICAqXG4gICAqIEZ1bGwgZXhhbXBsZSBmb3IgYW4gZXZlbnQgcmVwcmVzZW50aW5nIGFuIGV4YW1wbGUgYWN0aW9uIGluIGEgZXhhbXBsZSBjb21wb25lbnQ6XG4gICAqXG4gICAqIDxjb2RlPlxuICAgKiAvLyBEZWZpbmUgYW4gZXhhbXBsZSBjb21wb25lbnQgY2xhc3Mgd2l0aCBhbiBleGFtcGxlIGV2ZW50XG4gICAqIGNsYXNzIEV4YW1wbGVDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiB7XG4gICAgICpcbiAgICAgKiAgICAgcHJpdmF0ZSBleGFtcGxlQ29tcG9uZW50RXZlbnRzID0ge1xuICAgICAqICAgICAgICAgb25FeGFtcGxlQWN0aW9uOiBuZXcgRXZlbnREaXNwYXRjaGVyPEV4YW1wbGVDb21wb25lbnQsIE5vQXJncz4oKVxuICAgICAqICAgICB9XG4gICAgICpcbiAgICAgKiAgICAgLy8gY29uc3RydWN0b3IgYW5kIG90aGVyIHN0dWZmLi4uXG4gICAgICpcbiAgICAgKiAgICAgcHJvdGVjdGVkIG9uRXhhbXBsZUFjdGlvbkV2ZW50KCkge1xuICAgICAqICAgICAgICB0aGlzLmV4YW1wbGVDb21wb25lbnRFdmVudHMub25FeGFtcGxlQWN0aW9uLmRpc3BhdGNoKHRoaXMpO1xuICAgICAqICAgIH1cbiAgICAgKlxuICAgICAqICAgIGdldCBvbkV4YW1wbGVBY3Rpb24oKTogRXZlbnQ8RXhhbXBsZUNvbXBvbmVudCwgTm9BcmdzPiB7XG4gICAgICogICAgICAgIHJldHVybiB0aGlzLmV4YW1wbGVDb21wb25lbnRFdmVudHMub25FeGFtcGxlQWN0aW9uLmdldEV2ZW50KCk7XG4gICAgICogICAgfVxuICAgICAqIH1cbiAgICpcbiAgICogLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQgc29tZXdoZXJlXG4gICAqIHZhciBleGFtcGxlQ29tcG9uZW50SW5zdGFuY2UgPSBuZXcgRXhhbXBsZUNvbXBvbmVudCgpO1xuICAgKlxuICAgKiAvLyBTdWJzY3JpYmUgdG8gdGhlIGV4YW1wbGUgZXZlbnQgb24gdGhlIGNvbXBvbmVudFxuICAgKiBleGFtcGxlQ29tcG9uZW50SW5zdGFuY2Uub25FeGFtcGxlQWN0aW9uLnN1YnNjcmliZShmdW5jdGlvbiAoc2VuZGVyOiBFeGFtcGxlQ29tcG9uZW50KSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdvbkV4YW1wbGVBY3Rpb24gb2YgJyArIHNlbmRlciArICcgaGFzIGZpcmVkIScpO1xuICAgICAqIH0pO1xuICAgKiA8L2NvZGU+XG4gICAqL1xuICBwcml2YXRlIGNvbXBvbmVudEV2ZW50cyA9IHtcbiAgICBvblNob3c6IG5ldyBFdmVudERpc3BhdGNoZXI8Q29tcG9uZW50PENvbmZpZz4sIE5vQXJncz4oKSxcbiAgICBvbkhpZGU6IG5ldyBFdmVudERpc3BhdGNoZXI8Q29tcG9uZW50PENvbmZpZz4sIE5vQXJncz4oKSxcbiAgICBvbkhvdmVyQ2hhbmdlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxDb21wb25lbnQ8Q29uZmlnPiwgQ29tcG9uZW50SG92ZXJDaGFuZ2VkRXZlbnRBcmdzPigpLFxuICAgIG9uRW5hYmxlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxDb21wb25lbnQ8Q29uZmlnPiwgTm9BcmdzPigpLFxuICAgIG9uRGlzYWJsZWQ6IG5ldyBFdmVudERpc3BhdGNoZXI8Q29tcG9uZW50PENvbmZpZz4sIE5vQXJncz4oKSxcbiAgfTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIGNvbXBvbmVudCB3aXRoIGFuIG9wdGlvbmFsbHkgc3VwcGxpZWQgY29uZmlnLiBBbGwgc3ViY2xhc3NlcyBtdXN0IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZWlyXG4gICAqIHN1cGVyY2xhc3MgYW5kIHRoZW4gbWVyZ2UgdGhlaXIgY29uZmlndXJhdGlvbiBpbnRvIHRoZSBjb21wb25lbnQncyBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0gY29uZmlnIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgY29tcG9uZW50XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbXBvbmVudENvbmZpZyA9IHt9KSB7XG4gICAgLy8gQ3JlYXRlIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIGNvbXBvbmVudFxuICAgIHRoaXMuY29uZmlnID0gPENvbmZpZz50aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgdGFnOiAnZGl2JyxcbiAgICAgIGlkOiAne3tQUkVGSVh9fS1pZC0nICsgR3VpZC5uZXh0KCksXG4gICAgICBjc3NQcmVmaXg6ICd7e1BSRUZJWH19JyxcbiAgICAgIGNzc0NsYXNzOiAndWktY29tcG9uZW50JyxcbiAgICAgIGNzc0NsYXNzZXM6IFtdLFxuICAgICAgaGlkZGVuOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICB9LCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCwgZS5nLiBieSBhcHBseWluZyBjb25maWcgc2V0dGluZ3MuXG4gICAqIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgdGhlIFVJIGZyYW1ld29yay5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgYnkgdGhlIHtAbGluayBVSUluc3RhbmNlTWFuYWdlcn0uIElmIHRoZSBjb21wb25lbnQgaXMgYW4gaW5uZXIgY29tcG9uZW50IG9mXG4gICAqIHNvbWUgY29tcG9uZW50LCBhbmQgdGh1cyBlbmNhcHN1bGF0ZWQgYWJkIG1hbmFnZWQgaW50ZXJuYWxseSBhbmQgbmV2ZXIgZGlyZWN0bHkgZXhwb3NlZCB0byB0aGUgVUlNYW5hZ2VyLFxuICAgKiB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBtYW5hZ2luZyBjb21wb25lbnQncyB7QGxpbmsgI2luaXRpYWxpemV9IG1ldGhvZC5cbiAgICovXG4gIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgdGhpcy5oaWRkZW4gPSB0aGlzLmNvbmZpZy5oaWRkZW47XG4gICAgdGhpcy5kaXNhYmxlZCA9IHRoaXMuY29uZmlnLmRpc2FibGVkO1xuXG4gICAgLy8gSGlkZSB0aGUgY29tcG9uZW50IGF0IGluaXRpYWxpemF0aW9uIGlmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gYmUgaGlkZGVuXG4gICAgaWYgKHRoaXMuaXNIaWRkZW4oKSkge1xuICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTsgLy8gU2V0IGZsYWcgdG8gZmFsc2UgZm9yIHRoZSBmb2xsb3dpbmcgaGlkZSgpIGNhbGwgdG8gd29yayAoaGlkZSgpIGNoZWNrcyB0aGUgZmxhZylcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cblxuICAgIC8vIERpc2FibGUgdGhlIGNvbXBvbmVudCBhdCBpbml0aWFsaXphdGlvbiBpZiBpdCBpcyBjb25maWd1cmVkIHRvIGJlIGRpc2FibGVkXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7IC8vIFNldCBmbGFnIHRvIGZhbHNlIGZvciB0aGUgZm9sbG93aW5nIGRpc2FibGUoKSBjYWxsIHRvIHdvcmsgKGRpc2FibGUoKSBjaGVja3MgdGhlIGZsYWcpXG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlcyB0aGUgY29tcG9uZW50IGZvciB0aGUgc3VwcGxpZWQgUGxheWVyIGFuZCBVSUluc3RhbmNlTWFuYWdlci4gVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgYWxsIHRoZSBtYWdpY1xuICAgKiBoYXBwZW5zLCB3aGVyZSBjb21wb25lbnRzIHR5cGljYWxseSBzdWJzY3JpYmUgYW5kIHJlYWN0IHRvIGV2ZW50cyAob24gdGhlaXIgRE9NIGVsZW1lbnQsIHRoZSBQbGF5ZXIsIG9yIHRoZVxuICAgKiBVSUluc3RhbmNlTWFuYWdlciksIGFuZCBiYXNpY2FsbHkgZXZlcnl0aGluZyB0aGF0IG1ha2VzIHRoZW0gaW50ZXJhY3RpdmUuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IG9uY2UsIHdoZW4gdGhlIFVJTWFuYWdlciBpbml0aWFsaXplcyB0aGUgVUkuXG4gICAqXG4gICAqIFN1YmNsYXNzZXMgdXN1YWxseSBvdmVyd3JpdGUgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gcGxheWVyIHRoZSBwbGF5ZXIgd2hpY2ggdGhpcyBjb21wb25lbnQgY29udHJvbHNcbiAgICogQHBhcmFtIHVpbWFuYWdlciB0aGUgVUlJbnN0YW5jZU1hbmFnZXIgdGhhdCBtYW5hZ2VzIHRoaXMgY29tcG9uZW50XG4gICAqL1xuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICB0aGlzLm9uU2hvdy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdWltYW5hZ2VyLm9uQ29tcG9uZW50U2hvdy5kaXNwYXRjaCh0aGlzKTtcbiAgICB9KTtcbiAgICB0aGlzLm9uSGlkZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdWltYW5hZ2VyLm9uQ29tcG9uZW50SGlkZS5kaXNwYXRjaCh0aGlzKTtcbiAgICB9KTtcblxuICAgIC8vIFRyYWNrIHRoZSBob3ZlcmVkIHN0YXRlIG9mIHRoZSBlbGVtZW50XG4gICAgdGhpcy5nZXREb21FbGVtZW50KCkub24oJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgICB0aGlzLm9uSG92ZXJDaGFuZ2VkRXZlbnQodHJ1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5nZXREb21FbGVtZW50KCkub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICB0aGlzLm9uSG92ZXJDaGFuZ2VkRXZlbnQoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgYW5kIGRlcGVuZGVuY2llcyB0aGF0IHRoZSBjb21wb25lbnQgaG9sZHMuIFBsYXllciwgRE9NLCBhbmQgVUlNYW5hZ2VyIGV2ZW50cyBhcmVcbiAgICogYXV0b21hdGljYWxseSByZW1vdmVkIGR1cmluZyByZWxlYXNlIGFuZCBkbyBub3QgZXhwbGljaXRseSBuZWVkIHRvIGJlIHJlbW92ZWQgaGVyZS5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBVSU1hbmFnZXIgd2hlbiBpdCByZWxlYXNlcyB0aGUgVUkuXG4gICAqXG4gICAqIFN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIHJlbGVhc2UgcmVzb3VyY2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgY2FsbCBzdXBlci5yZWxlYXNlKCkuXG4gICAqL1xuICByZWxlYXNlKCk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZSwgb3ZlcnJpZGUgd2hlcmUgbmVjZXNzYXJ5XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIERPTSBlbGVtZW50IGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICpcbiAgICogU3ViY2xhc3NlcyB1c3VhbGx5IG92ZXJ3cml0ZSB0aGlzIG1ldGhvZCB0byBleHRlbmQgb3IgcmVwbGFjZSB0aGUgRE9NIGVsZW1lbnQgd2l0aCB0aGVpciBvd24gZGVzaWduLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvRG9tRWxlbWVudCgpOiBET00ge1xuICAgIGxldCBlbGVtZW50ID0gbmV3IERPTSh0aGlzLmNvbmZpZy50YWcsIHtcbiAgICAgICdpZCc6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgJ2NsYXNzJzogdGhpcy5nZXRDc3NDbGFzc2VzKCksXG4gICAgICAncm9sZSc6IHRoaXMuY29uZmlnLnJvbGUsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBET00gZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudC4gQ3JlYXRlcyB0aGUgRE9NIGVsZW1lbnQgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0LlxuICAgKlxuICAgKiBTaG91bGQgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHN1YmNsYXNzZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtET019XG4gICAqL1xuICBnZXREb21FbGVtZW50KCk6IERPTSB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMudG9Eb21FbGVtZW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudDtcbiAgfVxuXG4gIHNldEFyaWFMYWJlbChsYWJlbDogTG9jYWxpemFibGVUZXh0KTogdm9pZCB7XG4gICAgdGhpcy5zZXRBcmlhQXR0cignbGFiZWwnLCBpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24obGFiZWwpKTtcbiAgfVxuXG4gIHNldEFyaWFBdHRyKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmF0dHIoYGFyaWEtJHtuYW1lfWAsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgYSBjb25maWd1cmF0aW9uIHdpdGggYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYW5kIGEgYmFzZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIHN1cGVyY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZSBjb21wb25lbnRzLCBhcyB1c3VhbGx5IHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGRlZmF1bHRzIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBzZXR0aW5ncyB0aGF0IGFyZSBub3QgcGFzc2VkIHdpdGggdGhlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIGJhc2UgY29uZmlndXJhdGlvbiBpbmhlcml0ZWQgZnJvbSBhIHN1cGVyY2xhc3NcbiAgICogQHJldHVybnMge0NvbmZpZ31cbiAgICovXG4gIHByb3RlY3RlZCBtZXJnZUNvbmZpZzxDb25maWc+KGNvbmZpZzogQ29uZmlnLCBkZWZhdWx0czogQ29uZmlnLCBiYXNlOiBDb25maWcpOiBDb25maWcge1xuICAgIC8vIEV4dGVuZCBkZWZhdWx0IGNvbmZpZyB3aXRoIHN1cHBsaWVkIGNvbmZpZ1xuICAgIGxldCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKHt9LCBiYXNlLCBkZWZhdWx0cywgY29uZmlnKTtcblxuICAgIC8vIFJldHVybiB0aGUgZXh0ZW5kZWQgY29uZmlnXG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHN0cmluZyBvZiBhbGwgQ1NTIGNsYXNzZXMgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHByb3RlY3RlZCBnZXRDc3NDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgLy8gTWVyZ2UgYWxsIENTUyBjbGFzc2VzIGludG8gc2luZ2xlIGFycmF5XG4gICAgbGV0IGZsYXR0ZW5lZEFycmF5ID0gW3RoaXMuY29uZmlnLmNzc0NsYXNzXS5jb25jYXQodGhpcy5jb25maWcuY3NzQ2xhc3Nlcyk7XG4gICAgLy8gUHJlZml4IGNsYXNzZXNcbiAgICBmbGF0dGVuZWRBcnJheSA9IGZsYXR0ZW5lZEFycmF5Lm1hcCgoY3NzKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVmaXhDc3MoY3NzKTtcbiAgICB9KTtcbiAgICAvLyBKb2luIGFycmF5IHZhbHVlcyBpbnRvIGEgc3RyaW5nXG4gICAgbGV0IGZsYXR0ZW5lZFN0cmluZyA9IGZsYXR0ZW5lZEFycmF5LmpvaW4oJyAnKTtcbiAgICAvLyBSZXR1cm4gdHJpbW1lZCBzdHJpbmcgdG8gcHJldmVudCB3aGl0ZXNwYWNlIGF0IHRoZSBlbmQgZnJvbSB0aGUgam9pbiBvcGVyYXRpb25cbiAgICByZXR1cm4gZmxhdHRlbmVkU3RyaW5nLnRyaW0oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVmaXhDc3MoY3NzQ2xhc3NPcklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5jc3NQcmVmaXggKyAnLScgKyBjc3NDbGFzc09ySWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvYmplY3Qgb2YgdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMge0NvbmZpZ31cbiAgICovXG4gIHB1YmxpYyBnZXRDb25maWcoKTogQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGNvbXBvbmVudCBpZiBzaG93bi5cbiAgICogVGhpcyBtZXRob2QgYmFzaWNhbGx5IHRyYW5zZmVycyB0aGUgY29tcG9uZW50IGludG8gdGhlIGhpZGRlbiBzdGF0ZS4gQWN0dWFsIGhpZGluZyBpcyBkb25lIHZpYSBDU1MuXG4gICAqL1xuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5oaWRkZW4pIHtcbiAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKENvbXBvbmVudC5DTEFTU19ISURERU4pKTtcbiAgICAgIHRoaXMub25IaWRlRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgdGhlIGNvbXBvbmVudCBpZiBoaWRkZW4uXG4gICAqL1xuICBzaG93KCkge1xuICAgIGlmICh0aGlzLmhpZGRlbikge1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoQ29tcG9uZW50LkNMQVNTX0hJRERFTikpO1xuICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMub25TaG93RXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY29tcG9uZW50IGlzIGhpZGRlbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyBoaWRkZW4sIGVsc2UgZmFsc2VcbiAgICovXG4gIGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpZGRlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjb21wb25lbnQgaXMgc2hvd24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgdmlzaWJsZSwgZWxzZSBmYWxzZVxuICAgKi9cbiAgaXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNIaWRkZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBoaWRkZW4gc3RhdGUgYnkgaGlkaW5nIHRoZSBjb21wb25lbnQgaWYgaXQgaXMgc2hvd24sIG9yIHNob3dpbmcgaXQgaWYgaGlkZGVuLlxuICAgKi9cbiAgdG9nZ2xlSGlkZGVuKCkge1xuICAgIGlmICh0aGlzLmlzSGlkZGVuKCkpIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZXMgdGhlIGNvbXBvbmVudC5cbiAgICogVGhpcyBtZXRob2QgYmFzaWNhbGx5IHRyYW5zZmVycyB0aGUgY29tcG9uZW50IGludG8gdGhlIGRpc2FibGVkIHN0YXRlLiBBY3R1YWwgZGlzYWJsaW5nIGlzIGRvbmUgdmlhIENTUyBvciBjaGlsZFxuICAgKiBjb21wb25lbnRzLiAoZS5nLiBCdXR0b24gbmVlZHMgdG8gdW5zdWJzY3JpYmUgY2xpY2sgbGlzdGVuZXJzKVxuICAgKi9cbiAgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoQ29tcG9uZW50LkNMQVNTX0RJU0FCTEVEKSk7XG4gICAgICB0aGlzLm9uRGlzYWJsZWRFdmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBjb21wb25lbnQuXG4gICAqIFRoaXMgbWV0aG9kIGJhc2ljYWxseSB0cmFuc2ZlcnMgdGhlIGNvbXBvbmVudCBpbnRvIHRoZSBlbmFibGVkIHN0YXRlLiBBY3R1YWwgZW5hYmxpbmcgaXMgZG9uZSB2aWEgQ1NTIG9yIGNoaWxkXG4gICAqIGNvbXBvbmVudHMuIChlLmcuIEJ1dHRvbiBuZWVkcyB0byBzdWJzY3JpYmUgY2xpY2sgbGlzdGVuZXJzKVxuICAgKi9cbiAgZW5hYmxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhDb21wb25lbnQuQ0xBU1NfRElTQUJMRUQpKTtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMub25FbmFibGVkRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGNvbXBvbmVudCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQsIGVsc2UgZmFsc2VcbiAgICovXG4gIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgaG92ZXJlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyBob3ZlcmVkLCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc0hvdmVyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaG92ZXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgb25TaG93IGV2ZW50LlxuICAgKiBTZWUgdGhlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIGV2ZW50IGFyY2hpdGVjdHVyZSBvbiB0aGUge0BsaW5rICNjb21wb25lbnRFdmVudHMgZXZlbnRzIGxpc3R9LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uU2hvd0V2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uU2hvdy5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgb25IaWRlIGV2ZW50LlxuICAgKiBTZWUgdGhlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIGV2ZW50IGFyY2hpdGVjdHVyZSBvbiB0aGUge0BsaW5rICNjb21wb25lbnRFdmVudHMgZXZlbnRzIGxpc3R9LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uSGlkZUV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uSGlkZS5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgb25FbmFibGVkIGV2ZW50LlxuICAgKiBTZWUgdGhlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIGV2ZW50IGFyY2hpdGVjdHVyZSBvbiB0aGUge0BsaW5rICNjb21wb25lbnRFdmVudHMgZXZlbnRzIGxpc3R9LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRW5hYmxlZEV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uRW5hYmxlZC5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgb25EaXNhYmxlZCBldmVudC5cbiAgICogU2VlIHRoZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvbiBldmVudCBhcmNoaXRlY3R1cmUgb24gdGhlIHtAbGluayAjY29tcG9uZW50RXZlbnRzIGV2ZW50cyBsaXN0fS5cbiAgICovXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkRXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jb21wb25lbnRFdmVudHMub25EaXNhYmxlZC5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgb25Ib3ZlckNoYW5nZWQgZXZlbnQuXG4gICAqIFNlZSB0aGUgZGV0YWlsZWQgZXhwbGFuYXRpb24gb24gZXZlbnQgYXJjaGl0ZWN0dXJlIG9uIHRoZSB7QGxpbmsgI2NvbXBvbmVudEV2ZW50cyBldmVudHMgbGlzdH0uXG4gICAqL1xuICBwcm90ZWN0ZWQgb25Ib3ZlckNoYW5nZWRFdmVudChob3ZlcmVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5ob3ZlcmVkID0gaG92ZXJlZDtcbiAgICB0aGlzLmNvbXBvbmVudEV2ZW50cy5vbkhvdmVyQ2hhbmdlZC5kaXNwYXRjaCh0aGlzLCB7IGhvdmVyZWQ6IGhvdmVyZWQgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgc2hvd2luZy5cbiAgICogU2VlIHRoZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvbiBldmVudCBhcmNoaXRlY3R1cmUgb24gdGhlIHtAbGluayAjY29tcG9uZW50RXZlbnRzIGV2ZW50cyBsaXN0fS5cbiAgICogQHJldHVybnMge0V2ZW50PENvbXBvbmVudDxDb25maWc+LCBOb0FyZ3M+fVxuICAgKi9cbiAgZ2V0IG9uU2hvdygpOiBFdmVudDxDb21wb25lbnQ8Q29uZmlnPiwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uU2hvdy5nZXRFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGhpZGluZy5cbiAgICogU2VlIHRoZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvbiBldmVudCBhcmNoaXRlY3R1cmUgb24gdGhlIHtAbGluayAjY29tcG9uZW50RXZlbnRzIGV2ZW50cyBsaXN0fS5cbiAgICogQHJldHVybnMge0V2ZW50PENvbXBvbmVudDxDb25maWc+LCBOb0FyZ3M+fVxuICAgKi9cbiAgZ2V0IG9uSGlkZSgpOiBFdmVudDxDb21wb25lbnQ8Q29uZmlnPiwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uSGlkZS5nZXRFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGVuYWJsaW5nLlxuICAgKiBTZWUgdGhlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIGV2ZW50IGFyY2hpdGVjdHVyZSBvbiB0aGUge0BsaW5rICNjb21wb25lbnRFdmVudHMgZXZlbnRzIGxpc3R9LlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8Q29tcG9uZW50PENvbmZpZz4sIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25FbmFibGVkKCk6IEV2ZW50PENvbXBvbmVudDxDb25maWc+LCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRFdmVudHMub25FbmFibGVkLmdldEV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsaW5nLlxuICAgKiBTZWUgdGhlIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9uIGV2ZW50IGFyY2hpdGVjdHVyZSBvbiB0aGUge0BsaW5rICNjb21wb25lbnRFdmVudHMgZXZlbnRzIGxpc3R9LlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8Q29tcG9uZW50PENvbmZpZz4sIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25EaXNhYmxlZCgpOiBFdmVudDxDb21wb25lbnQ8Q29uZmlnPiwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50RXZlbnRzLm9uRGlzYWJsZWQuZ2V0RXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIGNvbXBvbmVudCdzIGhvdmVyLXN0YXRlIGlzIGNoYW5naW5nLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8Q29tcG9uZW50PENvbmZpZz4sIENvbXBvbmVudEhvdmVyQ2hhbmdlZEV2ZW50QXJncz59XG4gICAqL1xuICBnZXQgb25Ib3ZlckNoYW5nZWQoKTogRXZlbnQ8Q29tcG9uZW50PENvbmZpZz4sIENvbXBvbmVudEhvdmVyQ2hhbmdlZEV2ZW50QXJncz4ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEV2ZW50cy5vbkhvdmVyQ2hhbmdlZC5nZXRFdmVudCgpO1xuICB9XG59IiwiaW1wb3J0IHtDb21wb25lbnRDb25maWcsIENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHtET019IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQge0FycmF5VXRpbHN9IGZyb20gJy4uL2FycmF5dXRpbHMnO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgYSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250YWluZXJDb25maWcgZXh0ZW5kcyBDb21wb25lbnRDb25maWcge1xuICAvKipcbiAgICogQ2hpbGQgY29tcG9uZW50cyBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgY29tcG9uZW50cz86IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+W107XG59XG5cbi8qKlxuICogQSBjb250YWluZXIgY29tcG9uZW50IHRoYXQgY2FuIGNvbnRhaW4gYSBjb2xsZWN0aW9uIG9mIGNoaWxkIGNvbXBvbmVudHMuXG4gKiBDb21wb25lbnRzIGNhbiBiZSBhZGRlZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSB0aHJvdWdoIHRoZSB7QGxpbmsgQ29udGFpbmVyQ29uZmlnI2NvbXBvbmVudHN9IHNldHRpbmcsIG9yIGxhdGVyXG4gKiB0aHJvdWdoIHRoZSB7QGxpbmsgQ29udGFpbmVyI2FkZENvbXBvbmVudH0gbWV0aG9kLiBUaGUgVUlNYW5hZ2VyIGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBvZiBhbGwgY29tcG9uZW50cywgaS5lLiBpdFxuICogaW5pdGlhbGl6ZXMgYW5kIGNvbmZpZ3VyZXMgdGhlbSBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEluIHRoZSBET00sIHRoZSBjb250YWluZXIgY29uc2lzdHMgb2YgYW4gb3V0ZXIgPGRpdj4gKHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgdGhlIGNvbmZpZykgYW5kIGFuIGlubmVyIHdyYXBwZXJcbiAqIDxkaXY+IHRoYXQgY29udGFpbnMgdGhlIGNvbXBvbmVudHMuIFRoaXMgZG91YmxlLTxkaXY+LXN0cnVjdHVyZSBpcyBvZnRlbiByZXF1aXJlZCB0byBhY2hpZXZlIG1hbnkgYWR2YW5jZWQgZWZmZWN0c1xuICogaW4gQ1NTIGFuZC9vciBKUywgZS5nLiBhbmltYXRpb25zIGFuZCBjZXJ0YWluIGZvcm1hdHRpbmcgd2l0aCBhYnNvbHV0ZSBwb3NpdGlvbmluZy5cbiAqXG4gKiBET00gZXhhbXBsZTpcbiAqIDxjb2RlPlxuICogICAgIDxkaXYgY2xhc3M9J3VpLWNvbnRhaW5lcic+XG4gKiAgICAgICAgIDxkaXYgY2xhc3M9J2NvbnRhaW5lci13cmFwcGVyJz5cbiAqICAgICAgICAgICAgIC4uLiBjaGlsZCBjb21wb25lbnRzIC4uLlxuICogICAgICAgICA8L2Rpdj5cbiAqICAgICA8L2Rpdj5cbiAqIDwvY29kZT5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRhaW5lcjxDb25maWcgZXh0ZW5kcyBDb250YWluZXJDb25maWc+IGV4dGVuZHMgQ29tcG9uZW50PENvbmZpZz4ge1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgaW5uZXIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBjb21wb25lbnRzIG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwcml2YXRlIGlubmVyQ29udGFpbmVyRWxlbWVudDogRE9NO1xuICBwcml2YXRlIGNvbXBvbmVudHNUb0FkZDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz5bXTtcbiAgcHJpdmF0ZSBjb21wb25lbnRzVG9SZW1vdmU6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+W107XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1jb250YWluZXInLFxuICAgICAgY29tcG9uZW50czogW10sXG4gICAgfSBhcyBDb25maWcsIHRoaXMuY29uZmlnKTtcblxuICAgIHRoaXMuY29tcG9uZW50c1RvQWRkID0gW107XG4gICAgdGhpcy5jb21wb25lbnRzVG9SZW1vdmUgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hpbGQgY29tcG9uZW50IHRvIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB0byBhZGRcbiAgICovXG4gIGFkZENvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+KSB7XG4gICAgdGhpcy5jb25maWcuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgdGhpcy5jb21wb25lbnRzVG9BZGQucHVzaChjb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjaGlsZCBjb21wb25lbnQgZnJvbSB0aGUgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IHRoZSBjb21wb25lbnQgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVtb3ZlZCwgZmFsc2UgaWYgaXQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGlzIGNvbnRhaW5lclxuICAgKi9cbiAgcmVtb3ZlQ29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4pOiBib29sZWFuIHtcbiAgICBpZiAoQXJyYXlVdGlscy5yZW1vdmUodGhpcy5jb25maWcuY29tcG9uZW50cywgY29tcG9uZW50KSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudHNUb1JlbW92ZS5wdXNoKGNvbXBvbmVudCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGFycmF5IG9mIGFsbCBjaGlsZCBjb21wb25lbnRzIGluIHRoaXMgY29udGFpbmVyLlxuICAgKiBAcmV0dXJucyB7Q29tcG9uZW50PENvbXBvbmVudENvbmZpZz5bXX1cbiAgICovXG4gIGdldENvbXBvbmVudHMoKTogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz5bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmNvbXBvbmVudHM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgY2hpbGQgY29tcG9uZW50cyBmcm9tIHRoZSBjb250YWluZXIuXG4gICAqL1xuICByZW1vdmVDb21wb25lbnRzKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiB0aGlzLmdldENvbXBvbmVudHMoKS5zbGljZSgpKSB7XG4gICAgICB0aGlzLnJlbW92ZUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBET00gb2YgdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBjdXJyZW50IGNvbXBvbmVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgICAvKiBXZSBjYW5ub3QganVzdCBjbGVhciB0aGUgY29udGFpbmVyIHRvIHJlbW92ZSBhbGwgZWxlbWVudHMgYW5kIHRoZW4gcmUtYWRkIHRob3NlIHRoYXQgc2hvdWxkIHN0YXksIGJlY2F1c2VcbiAgICAgKiBJRSBsb29zZXMgdGhlIGlubmVySFRNTCBvZiB1bmF0dGFjaGVkIGVsZW1lbnRzLCBsZWFkaW5nIHRvIGVtcHR5IGVsZW1lbnRzIHdpdGhpbiB0aGUgY29udGFpbmVyIChlLmcuIG1pc3NpbmdcbiAgICAgKiBzdWJ0aXRsZSB0ZXh0IGluIFN1YnRpdGxlTGFiZWwpLlxuICAgICAqIEluc3RlYWQsIHdlIGtlZXAgYSBsaXN0IG9mIGVsZW1lbnRzIHRvIGFkZCBhbmQgcmVtb3ZlLCBsZWF2aW5nIHJlbWFpbmluZyBlbGVtZW50cyBhbG9uZS4gQnkga2VlcGluZyB0aGVtIGluXG4gICAgICogdGhlIERPTSwgdGhlaXIgY29udGVudCBnZXRzIHByZXNlcnZlZCBpbiBhbGwgYnJvd3NlcnMuXG4gICAgICovXG4gICAgbGV0IGNvbXBvbmVudDtcblxuICAgIHdoaWxlIChjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNUb1JlbW92ZS5zaGlmdCgpKSB7XG4gICAgICBjb21wb25lbnQuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHdoaWxlIChjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNUb0FkZC5zaGlmdCgpKSB7XG4gICAgICB0aGlzLmlubmVyQ29udGFpbmVyRWxlbWVudC5hcHBlbmQoY29tcG9uZW50LmdldERvbUVsZW1lbnQoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHRvRG9tRWxlbWVudCgpOiBET00ge1xuICAgIC8vIENyZWF0ZSB0aGUgY29udGFpbmVyIGVsZW1lbnQgKHRoZSBvdXRlciA8ZGl2PilcbiAgICBsZXQgY29udGFpbmVyRWxlbWVudCA9IG5ldyBET00odGhpcy5jb25maWcudGFnLCB7XG4gICAgICAnaWQnOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICdjbGFzcyc6IHRoaXMuZ2V0Q3NzQ2xhc3NlcygpLFxuICAgICAgJ3JvbGUnOiB0aGlzLmNvbmZpZy5yb2xlLFxuICAgICAgJ2FyaWEtbGFiZWwnOiBpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24odGhpcy5jb25maWcuYXJpYUxhYmVsKSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSB0aGUgaW5uZXIgY29udGFpbmVyIGVsZW1lbnQgKHRoZSBpbm5lciA8ZGl2PikgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGNvbXBvbmVudHNcbiAgICBsZXQgaW5uZXJDb250YWluZXIgPSBuZXcgRE9NKHRoaXMuY29uZmlnLnRhZywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ2NvbnRhaW5lci13cmFwcGVyJyksXG4gICAgfSk7XG4gICAgdGhpcy5pbm5lckNvbnRhaW5lckVsZW1lbnQgPSBpbm5lckNvbnRhaW5lcjtcblxuICAgIGZvciAobGV0IGluaXRpYWxDb21wb25lbnQgb2YgdGhpcy5jb25maWcuY29tcG9uZW50cykge1xuICAgICAgdGhpcy5jb21wb25lbnRzVG9BZGQucHVzaChpbml0aWFsQ29tcG9uZW50KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb21wb25lbnRzKCk7XG5cbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZChpbm5lckNvbnRhaW5lcik7XG5cbiAgICByZXR1cm4gY29udGFpbmVyRWxlbWVudDtcbiAgfVxufSIsImltcG9ydCB7Q29udGFpbmVyQ29uZmlnLCBDb250YWluZXJ9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1VJVXRpbHN9IGZyb20gJy4uL3VpdXRpbHMnO1xuaW1wb3J0IHtTcGFjZXJ9IGZyb20gJy4vc3BhY2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuaW1wb3J0IHsgQnJvd3NlclV0aWxzIH0gZnJvbSAnLi4vYnJvd3NlcnV0aWxzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIHtAbGluayBDb250cm9sQmFyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sQmFyQ29uZmlnIGV4dGVuZHMgQ29udGFpbmVyQ29uZmlnIHtcbiAgLy8gbm90aGluZyB5ZXRcbn1cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBmb3IgbWFpbiBwbGF5ZXIgY29udHJvbCBjb21wb25lbnRzLCBlLmcuIHBsYXkgdG9nZ2xlIGJ1dHRvbiwgc2VlayBiYXIsIHZvbHVtZSBjb250cm9sLCBmdWxsc2NyZWVuIHRvZ2dsZVxuICogYnV0dG9uLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbEJhciBleHRlbmRzIENvbnRhaW5lcjxDb250cm9sQmFyQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb250cm9sQmFyQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktY29udHJvbGJhcicsXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICByb2xlOiAncmVnaW9uJyxcbiAgICAgIGFyaWFMYWJlbDogaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbnRyb2xCYXInKSxcbiAgICB9LCA8Q29udHJvbEJhckNvbmZpZz50aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgLy8gQ291bnRzIGhvdyBtYW55IGNvbXBvbmVudHMgYXJlIGhvdmVyZWQgYW5kIGJsb2NrIGhpZGluZyBvZiB0aGUgY29udHJvbCBiYXJcbiAgICBsZXQgaG92ZXJTdGFja0NvdW50ID0gMDtcblxuICAgIC8vIG9ubHkgZW5hYmxpbmcgdGhpcyBmb3Igbm9uLW1vYmlsZSBwbGF0Zm9ybXMgd2l0aG91dCB0b3VjaCBpbnB1dC4gZW5hYmxpbmcgdGhpc1xuICAgIC8vIGZvciB0b3VjaCBkZXZpY2VzIGNhdXNlcyB0aGUgVUkgdG8gbm90IGRpc2FwcGVhciBhZnRlciBoaWRlRGVsYXkgc2Vjb25kcy5cbiAgICAvLyBJbnN0ZWFkLCBpdCB3aWxsIHN0YXkgdmlzaWJsZSB1bnRpbCBhbm90aGVyIG1hbnVhbCBpbnRlcmFjdGlvbiBpcyBwZXJmb3JtZWQuXG4gICAgaWYgKHVpbWFuYWdlci5nZXRDb25maWcoKS5kaXNhYmxlQXV0b0hpZGVXaGVuSG92ZXJlZCAmJiAhQnJvd3NlclV0aWxzLmlzTW9iaWxlKSB7XG4gICAgICAvLyBUcmFjayBob3ZlciBzdGF0dXMgb2YgY2hpbGQgY29tcG9uZW50c1xuICAgICAgVUlVdGlscy50cmF2ZXJzZVRyZWUodGhpcywgKGNvbXBvbmVudCkgPT4ge1xuICAgICAgICAvLyBEbyBub3QgdHJhY2sgaG92ZXIgc3RhdHVzIG9mIGNoaWxkIGNvbnRhaW5lcnMgb3Igc3BhY2Vycywgb25seSBvZiAncmVhbCcgY29udHJvbHNcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbnRhaW5lciB8fCBjb21wb25lbnQgaW5zdGFuY2VvZiBTcGFjZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWJzY3JpYmUgaG92ZXIgZXZlbnQgYW5kIGtlZXAgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGhvdmVyZWQgY2hpbGRyZW5cbiAgICAgICAgY29tcG9uZW50Lm9uSG92ZXJDaGFuZ2VkLnN1YnNjcmliZSgoXywgYXJncykgPT4ge1xuICAgICAgICAgIGlmIChhcmdzLmhvdmVyZWQpIHtcbiAgICAgICAgICAgIGhvdmVyU3RhY2tDb3VudCsrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob3ZlclN0YWNrQ291bnQtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdWltYW5hZ2VyLm9uQ29udHJvbHNTaG93LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9KTtcblxuICAgIHVpbWFuYWdlci5vblByZXZpZXdDb250cm9sc0hpZGUuc3Vic2NyaWJlKChzZW5kZXIsIGFyZ3MpID0+IHtcbiAgICAgIC8vIENhbmNlbCB0aGUgaGlkZSBldmVudCBpZiBob3ZlcmVkIGNoaWxkIGNvbXBvbmVudHMgYmxvY2sgaGlkaW5nXG4gICAgICBhcmdzLmNhbmNlbCA9IChob3ZlclN0YWNrQ291bnQgPiAwKTtcbiAgICB9KTtcblxuICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzSGlkZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7Q29udGFpbmVyQ29uZmlnLCBDb250YWluZXJ9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7TGFiZWwsIExhYmVsQ29uZmlnfSBmcm9tICcuL2xhYmVsJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1R2Tm9pc2VDYW52YXN9IGZyb20gJy4vdHZub2lzZWNhbnZhcyc7XG5pbXBvcnQgeyBFcnJvclV0aWxzIH0gZnJvbSAnLi4vZXJyb3J1dGlscyc7XG5pbXBvcnQgeyBFcnJvckV2ZW50LCBQbGF5ZXJBUEksIFBsYXllckV2ZW50QmFzZSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQge1xuICBpc01vYmlsZVYzUGxheWVyQVBJLFxuICBNb2JpbGVWM1BsYXllckFQSSwgTW9iaWxlVjNQbGF5ZXJFcnJvckV2ZW50LCBNb2JpbGVWM1BsYXllckV2ZW50LCBNb2JpbGVWM1NvdXJjZUVycm9yRXZlbnQsXG59IGZyb20gJy4uL21vYmlsZXYzcGxheWVyYXBpJztcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvck1lc3NhZ2VUcmFuc2xhdG9yIHtcbiAgKGVycm9yOiBFcnJvckV2ZW50IHwgTW9iaWxlVjNQbGF5ZXJFcnJvckV2ZW50KTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTWVzc2FnZU1hcCB7XG4gIFtjb2RlOiBudW1iZXJdOiBzdHJpbmcgfCBFcnJvck1lc3NhZ2VUcmFuc2xhdG9yO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciB0aGUge0BsaW5rIEVycm9yTWVzc2FnZU92ZXJsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTWVzc2FnZU92ZXJsYXlDb25maWcgZXh0ZW5kcyBDb250YWluZXJDb25maWcge1xuICAvKipcbiAgICogQWxsb3dzIG92ZXJ3cml0aW5nIG9mIHRoZSBlcnJvciBtZXNzYWdlcyBkaXNwbGF5ZWQgaW4gdGhlIG92ZXJsYXkgZm9yIGN1c3RvbWl6YXRpb24gYW5kIGxvY2FsaXphdGlvbi5cbiAgICogVGhpcyBpcyBlaXRoZXIgYSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGFueSB7QGxpbmsgRXJyb3JFdmVudH0gYXMgcGFyYW1ldGVyIGFuZCB0cmFuc2xhdGVzIGVycm9yIG1lc3NhZ2VzLFxuICAgKiBvciBhIG1hcCBvZiBlcnJvciBjb2RlcyB0aGF0IG92ZXJ3cml0ZXMgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZXMgd2l0aCBhIHBsYWluIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHtAbGluayBFcnJvckV2ZW50fSBhcyBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBjdXN0b21pemVkIHN0cmluZy5cbiAgICogVGhlIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IGRhdGEgKGUuZy4gcGFyYW1ldGVycykgZnJvbSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZS5cbiAgICpcbiAgICogRXhhbXBsZSAxIChjYXRjaC1hbGwgdHJhbnNsYXRpb24gZnVuY3Rpb24pOlxuICAgKiA8Y29kZT5cbiAgICogZXJyb3JNZXNzYWdlT3ZlcmxheUNvbmZpZyA9IHtcbiAgICogICBtZXNzYWdlczogZnVuY3Rpb24oZXJyb3IpIHtcbiAgICogICAgIHN3aXRjaCAoZXJyb3IuY29kZSkge1xuICAgKiAgICAgICAvLyBPdmVyd3JpdGUgZXJyb3IgMTAwMCAnVW5rbm93biBlcnJvcidcbiAgICogICAgICAgY2FzZSAxMDAwOlxuICAgKiAgICAgICAgIHJldHVybiAnSG91c3Rvbiwgd2UgaGF2ZSBhIHByb2JsZW0nXG4gICAqXG4gICAqICAgICAgIC8vIFRyYW5zZm9ybSBlcnJvciAxMjAxICdUaGUgZG93bmxvYWRlZCBtYW5pZmVzdCBpcyBpbnZhbGlkJyB0byB1cHBlcmNhc2VcbiAgICogICAgICAgY2FzZSAxMjAxOlxuICAgKiAgICAgICAgIHZhciBkZXNjcmlwdGlvbiA9IEVycm9yVXRpbHMuZGVmYXVsdEVycm9yTWVzc2FnZXNbZXJyb3IuY29kZV07XG4gICAqICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uLnRvVXBwZXJDYXNlKCk7XG4gICAqXG4gICAqICAgICAgIC8vIEN1c3RvbWl6ZSBlcnJvciAxMjA3ICdUaGUgbWFuaWZlc3QgY291bGQgbm90IGJlIGxvYWRlZCdcbiAgICogICAgICAgY2FzZSAxMjA3OlxuICAgKiAgICAgICAgIHZhciBzdGF0dXNDb2RlID0gZXJyb3IuZGF0YS5zdGF0dXNDb2RlO1xuICAgKiAgICAgICAgIHJldHVybiAnTWFuaWZlc3QgbG9hZGluZyBmYWlsZWQgd2l0aCBIVFRQIGVycm9yICcgKyBzdGF0dXNDb2RlO1xuICAgKiAgICAgfVxuICAgKiAgICAgLy8gUmV0dXJuIHVubW9kaWZpZWQgZXJyb3IgbWVzc2FnZSBmb3IgYWxsIG90aGVyIGVycm9yc1xuICAgKiAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gICAqICAgfVxuICAgKiB9O1xuICAgKiA8L2NvZGU+XG4gICAqXG4gICAqIEV4YW1wbGUgMiAodHJhbnNsYXRpbmcgc3BlY2lmaWMgZXJyb3JzKTpcbiAgICogPGNvZGU+XG4gICAqIGVycm9yTWVzc2FnZU92ZXJsYXlDb25maWcgPSB7XG4gICAqICAgbWVzc2FnZXM6IHtcbiAgICogICAgIC8vIE92ZXJ3cml0ZSBlcnJvciAxMDAwICdVbmtub3duIGVycm9yJ1xuICAgKiAgICAgMTAwMDogJ0hvdXN0b24sIHdlIGhhdmUgYSBwcm9ibGVtJyxcbiAgICpcbiAgICogICAgIC8vIFRyYW5zZm9ybSBlcnJvciAxMjAxICdVbnN1cHBvcnRlZCBtYW5pZmVzdCBmb3JtYXQnIHRvIHVwcGVyY2FzZVxuICAgKiAgICAgMTIwMTogZnVuY3Rpb24oZXJyb3IpIHtcbiAgICogICAgICAgdmFyIGRlc2NyaXB0aW9uID0gRXJyb3JVdGlscy5kZWZhdWx0RXJyb3JNZXNzYWdlc1tlcnJvci5jb2RlXTtcbiAgICogICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uLnRvVXBwZXJDYXNlKCk7XG4gICAqICAgICB9LFxuICAgKlxuICAgKiAgICAgLy8gQ3VzdG9taXplIGVycm9yIDEyMDcgJ1RoZSBtYW5pZmVzdCBjb3VsZCBub3QgYmUgbG9hZGVkJ1xuICAgKiAgICAgMTIwNzogZnVuY3Rpb24oZXJyb3IpIHtcbiAgICogICAgICAgdmFyIHN0YXR1c0NvZGUgPSBlcnJvci5kYXRhLnN0YXR1c0NvZGU7XG4gICAqICAgICAgIHJldHVybiAnTWFuaWZlc3QgbG9hZGluZyBmYWlsZWQgd2l0aCBIVFRQIGVycm9yICcgKyBzdGF0dXNDb2RlO1xuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfTtcbiAgICogPC9jb2RlPlxuICAgKi9cbiAgbWVzc2FnZXM/OiBFcnJvck1lc3NhZ2VNYXAgfCBFcnJvck1lc3NhZ2VUcmFuc2xhdG9yO1xufVxuXG4vKipcbiAqIE92ZXJsYXlzIHRoZSBwbGF5ZXIgYW5kIGRpc3BsYXlzIGVycm9yIG1lc3NhZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JNZXNzYWdlT3ZlcmxheSBleHRlbmRzIENvbnRhaW5lcjxFcnJvck1lc3NhZ2VPdmVybGF5Q29uZmlnPiB7XG5cbiAgcHJpdmF0ZSBlcnJvckxhYmVsOiBMYWJlbDxMYWJlbENvbmZpZz47XG4gIHByaXZhdGUgdHZOb2lzZUJhY2tncm91bmQ6IFR2Tm9pc2VDYW52YXM7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBFcnJvck1lc3NhZ2VPdmVybGF5Q29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5lcnJvckxhYmVsID0gbmV3IExhYmVsPExhYmVsQ29uZmlnPih7IGNzc0NsYXNzOiAndWktZXJyb3JtZXNzYWdlLWxhYmVsJyB9KTtcbiAgICB0aGlzLnR2Tm9pc2VCYWNrZ3JvdW5kID0gbmV3IFR2Tm9pc2VDYW52YXMoKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktZXJyb3JtZXNzYWdlLW92ZXJsYXknLFxuICAgICAgY29tcG9uZW50czogW3RoaXMudHZOb2lzZUJhY2tncm91bmQsIHRoaXMuZXJyb3JMYWJlbF0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJIHwgTW9iaWxlVjNQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbGV0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG5cbiAgICBjb25zdCBoYW5kbGVFcnJvck1lc3NhZ2UgPSAoXG4gICAgICBldmVudDogRXJyb3JFdmVudCB8IE1vYmlsZVYzU291cmNlRXJyb3JFdmVudCB8IE1vYmlsZVYzUGxheWVyRXJyb3JFdmVudCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbWl6ZWRNZXNzYWdlID0gY3VzdG9taXplRXJyb3JNZXNzYWdlKHVpbWFuYWdlci5nZXRDb25maWcoKS5lcnJvck1lc3NhZ2VzIHx8IGNvbmZpZy5tZXNzYWdlcywgZXZlbnQpO1xuICAgICAgaWYgKGN1c3RvbWl6ZWRNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBjdXN0b21pemVkTWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lcnJvckxhYmVsLnNldFRleHQobWVzc2FnZSk7XG4gICAgICB0aGlzLnR2Tm9pc2VCYWNrZ3JvdW5kLnN0YXJ0KCk7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9O1xuXG4gICAgaWYgKGlzTW9iaWxlVjNQbGF5ZXJBUEkocGxheWVyKSkge1xuICAgICAgY29uc3QgZXJyb3JFdmVudEhhbmRsZXIgPSAoZXZlbnQ6IE1vYmlsZVYzU291cmNlRXJyb3JFdmVudCB8IE1vYmlsZVYzUGxheWVyRXJyb3JFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gRXJyb3JVdGlscy5kZWZhdWx0TW9iaWxlVjNFcnJvck1lc3NhZ2VUcmFuc2xhdG9yKGV2ZW50KTtcbiAgICAgICAgaGFuZGxlRXJyb3JNZXNzYWdlKGV2ZW50LCBtZXNzYWdlKTtcbiAgICAgIH07XG5cbiAgICAgIHBsYXllci5vbihNb2JpbGVWM1BsYXllckV2ZW50LlBsYXllckVycm9yLCBlcnJvckV2ZW50SGFuZGxlcik7XG4gICAgICBwbGF5ZXIub24oTW9iaWxlVjNQbGF5ZXJFdmVudC5Tb3VyY2VFcnJvciwgZXJyb3JFdmVudEhhbmRsZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuRXJyb3IsIChldmVudDogRXJyb3JFdmVudCkgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IEVycm9yVXRpbHMuZGVmYXVsdFdlYkVycm9yTWVzc2FnZVRyYW5zbGF0b3IoZXZlbnQpO1xuICAgICAgICBoYW5kbGVFcnJvck1lc3NhZ2UoZXZlbnQsIG1lc3NhZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZUxvYWRlZCwgKGV2ZW50OiBQbGF5ZXJFdmVudEJhc2UpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU2hvd24oKSkge1xuICAgICAgICB0aGlzLnR2Tm9pc2VCYWNrZ3JvdW5kLnN0b3AoKTtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZWxlYXNlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlbGVhc2UoKTtcblxuICAgIC8vIENhbnZhcyByZW5kZXJpbmcgbXVzdCBiZSBleHBsaWNpdGx5IHN0b3BwZWQsIGVsc2UgaXQganVzdCBjb250aW51ZXMgZm9yZXZlciBhbmQgaG9ncyByZXNvdXJjZXNcbiAgICB0aGlzLnR2Tm9pc2VCYWNrZ3JvdW5kLnN0b3AoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjdXN0b21pemVFcnJvck1lc3NhZ2UoXG4gIGVycm9yTWVzc2FnZXM6IEVycm9yTWVzc2FnZVRyYW5zbGF0b3IgfCBFcnJvck1lc3NhZ2VNYXAsXG4gIGV2ZW50OiBFcnJvckV2ZW50IHwgTW9iaWxlVjNQbGF5ZXJFcnJvckV2ZW50IHwgTW9iaWxlVjNTb3VyY2VFcnJvckV2ZW50LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvck1lc3NhZ2VzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFByb2Nlc3MgbWVzc2FnZSB2b2NhYnVsYXJpZXNcbiAgaWYgKHR5cGVvZiBlcnJvck1lc3NhZ2VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVHJhbnNsYXRpb24gZnVuY3Rpb24gZm9yIGFsbCBlcnJvcnNcbiAgICByZXR1cm4gZXJyb3JNZXNzYWdlcyhldmVudCk7XG4gIH1cbiAgaWYgKGVycm9yTWVzc2FnZXNbZXZlbnQuY29kZV0pIHtcbiAgICAvLyBJdCdzIG5vdCBhIHRyYW5zbGF0aW9uIGZ1bmN0aW9uLCBzbyBpdCBtdXN0IGJlIGEgbWFwIG9mIHN0cmluZ3Mgb3IgdHJhbnNsYXRpb24gZnVuY3Rpb25zXG4gICAgY29uc3QgY3VzdG9tTWVzc2FnZSA9IGVycm9yTWVzc2FnZXNbZXZlbnQuY29kZV07XG5cbiAgICByZXR1cm4gdHlwZW9mIGN1c3RvbU1lc3NhZ2UgPT09ICdzdHJpbmcnID8gY3VzdG9tTWVzc2FnZSA6IGN1c3RvbU1lc3NhZ2UoZXZlbnQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUb2dnbGVCdXR0b24sIFRvZ2dsZUJ1dHRvbkNvbmZpZyB9IGZyb20gJy4vdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7IFVJSW5zdGFuY2VNYW5hZ2VyIH0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgYnV0dG9uIHRoYXQgdG9nZ2xlcyB0aGUgcGxheWVyIGJldHdlZW4gd2luZG93ZWQgYW5kIGZ1bGxzY3JlZW4gdmlldy5cbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bGxzY3JlZW5Ub2dnbGVCdXR0b24gZXh0ZW5kcyBUb2dnbGVCdXR0b248VG9nZ2xlQnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBUb2dnbGVCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWZ1bGxzY3JlZW50b2dnbGVidXR0b24nLFxuICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ2Z1bGxzY3JlZW4nKSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgY29uc3QgaXNGdWxsU2NyZWVuQXZhaWxhYmxlID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHBsYXllci5pc1ZpZXdNb2RlQXZhaWxhYmxlKHBsYXllci5leHBvcnRzLlZpZXdNb2RlLkZ1bGxzY3JlZW4pO1xuICAgIH07XG5cbiAgICBjb25zdCBmdWxsc2NyZWVuU3RhdGVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcGxheWVyLmdldFZpZXdNb2RlKCkgPT09IHBsYXllci5leHBvcnRzLlZpZXdNb2RlLkZ1bGxzY3JlZW4gPyB0aGlzLm9uKCkgOiB0aGlzLm9mZigpO1xuICAgIH07XG5cbiAgICBjb25zdCBmdWxsc2NyZWVuQXZhaWxhYmlsaXR5Q2hhbmdlZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBpc0Z1bGxTY3JlZW5BdmFpbGFibGUoKSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5WaWV3TW9kZUNoYW5nZWQsIGZ1bGxzY3JlZW5TdGF0ZUhhbmRsZXIpO1xuXG4gICAgLy8gQXZhaWxhYmxlIG9ubHkgaW4gb3VyIG5hdGl2ZSBTREtzIGZvciBub3dcbiAgICBpZiAoKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50IGFzIGFueSkuVmlld01vZGVBdmFpbGFiaWxpdHlDaGFuZ2VkKSB7XG4gICAgICBwbGF5ZXIub24oXG4gICAgICAgIChwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudCBhcyBhbnkpLlZpZXdNb2RlQXZhaWxhYmlsaXR5Q2hhbmdlZCxcbiAgICAgICAgZnVsbHNjcmVlbkF2YWlsYWJpbGl0eUNoYW5nZWRIYW5kbGVyLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUoZnVsbHNjcmVlbkF2YWlsYWJpbGl0eUNoYW5nZWRIYW5kbGVyKTtcblxuICAgIHRoaXMub25DbGljay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKCFpc0Z1bGxTY3JlZW5BdmFpbGFibGUoKSkge1xuICAgICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdGdWxsc2NyZWVuIHVuYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXRWaWV3TW9kZSA9XG4gICAgICAgIHBsYXllci5nZXRWaWV3TW9kZSgpID09PSBwbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5GdWxsc2NyZWVuXG4gICAgICAgICAgPyBwbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5JbmxpbmVcbiAgICAgICAgICA6IHBsYXllci5leHBvcnRzLlZpZXdNb2RlLkZ1bGxzY3JlZW47XG5cbiAgICAgIHBsYXllci5zZXRWaWV3TW9kZSh0YXJnZXRWaWV3TW9kZSk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGFydHVwIGluaXRcbiAgICBmdWxsc2NyZWVuQXZhaWxhYmlsaXR5Q2hhbmdlZEhhbmRsZXIoKTtcbiAgICBmdWxsc2NyZWVuU3RhdGVIYW5kbGVyKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7VG9nZ2xlQnV0dG9uQ29uZmlnfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1BsYXliYWNrVG9nZ2xlQnV0dG9ufSBmcm9tICcuL3BsYXliYWNrdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSwgUGxheWVyRXZlbnRCYXNlLCBXYXJuaW5nRXZlbnQgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IG92ZXJsYXlzIHRoZSB2aWRlbyBhbmQgdG9nZ2xlcyBiZXR3ZWVuIHBsYXliYWNrIGFuZCBwYXVzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEh1Z2VQbGF5YmFja1RvZ2dsZUJ1dHRvbiBleHRlbmRzIFBsYXliYWNrVG9nZ2xlQnV0dG9uIHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFRvZ2dsZUJ1dHRvbkNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktaHVnZXBsYXliYWNrdG9nZ2xlYnV0dG9uJyxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdwbGF5UGF1c2UnKSxcbiAgICAgIHJvbGU6ICdidXR0b24nLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSBidXR0b24gc3RhdGUgdGhyb3VnaCBBUEkgZXZlbnRzXG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyLCBmYWxzZSk7XG5cbiAgICBsZXQgdG9nZ2xlUGxheWJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAocGxheWVyLmlzUGxheWluZygpIHx8IHRoaXMuaXNQbGF5SW5pdGlhdGVkKSB7XG4gICAgICAgIHBsYXllci5wYXVzZSgndWknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBsYXllci5wbGF5KCd1aScpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgdG9nZ2xlRnVsbHNjcmVlbiA9ICgpID0+IHtcbiAgICAgIGlmIChwbGF5ZXIuZ2V0Vmlld01vZGUoKSA9PT0gcGxheWVyLmV4cG9ydHMuVmlld01vZGUuRnVsbHNjcmVlbikge1xuICAgICAgICBwbGF5ZXIuc2V0Vmlld01vZGUocGxheWVyLmV4cG9ydHMuVmlld01vZGUuSW5saW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBsYXllci5zZXRWaWV3TW9kZShwbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5GdWxsc2NyZWVuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IGZpcnN0UGxheSA9IHRydWU7XG4gICAgbGV0IGNsaWNrVGltZSA9IDA7XG4gICAgbGV0IGRvdWJsZUNsaWNrVGltZSA9IDA7XG5cbiAgICAvKlxuICAgICAqIFlvdVR1YmUtc3R5bGUgdG9nZ2xlIGJ1dHRvbiBoYW5kbGluZ1xuICAgICAqXG4gICAgICogVGhlIGdvYWwgaXMgdG8gcHJldmVudCBhIHNob3J0IHBhdXNlIG9yIHBsYXliYWNrIGludGVydmFsIGJldHdlZW4gYSBjbGljaywgdGhhdCB0b2dnbGVzIHBsYXliYWNrLCBhbmQgYVxuICAgICAqIGRvdWJsZSBjbGljaywgdGhhdCB0b2dnbGVzIGZ1bGxzY3JlZW4uIEluIHRoaXMgbmFpdmUgYXBwcm9hY2gsIHRoZSBmaXJzdCBjbGljayB3b3VsZCBlLmcuIHN0YXJ0IHBsYXliYWNrLFxuICAgICAqIHRoZSBzZWNvbmQgY2xpY2sgd291bGQgYmUgZGV0ZWN0ZWQgYXMgZG91YmxlIGNsaWNrIGFuZCB0b2dnbGUgdG8gZnVsbHNjcmVlbiwgYW5kIGFzIHNlY29uZCBub3JtYWwgY2xpY2sgc3RvcFxuICAgICAqIHBsYXliYWNrLCB3aGljaCByZXN1bHRzIGlzIGEgc2hvcnQgcGxheWJhY2sgaW50ZXJ2YWwgd2l0aCBtYXggbGVuZ3RoIG9mIHRoZSBkb3VibGUgY2xpY2sgZGV0ZWN0aW9uXG4gICAgICogcGVyaW9kICh1c3VhbGx5IDUwMG1zKS5cbiAgICAgKlxuICAgICAqIFRvIHNvbHZlIHRoaXMgaXNzdWUsIHdlIGRlZmVyIGhhbmRsaW5nIG9mIHRoZSBmaXJzdCBjbGljayBmb3IgMjAwbXMsIHdoaWNoIGlzIGFsbW9zdCB1bm5vdGljZWFibGUgdG8gdGhlIHVzZXIsXG4gICAgICogYW5kIGp1c3QgdG9nZ2xlIHBsYXliYWNrIGlmIG5vIHNlY29uZCBjbGljayAoZG91YmxlIGNsaWNrKSBoYXMgYmVlbiByZWdpc3RlcmVkIGR1cmluZyB0aGlzIHBlcmlvZC4gSWYgYSBkb3VibGVcbiAgICAgKiBjbGljayBpcyByZWdpc3RlcmVkLCB3ZSBqdXN0IHRvZ2dsZSB0aGUgZnVsbHNjcmVlbi4gSW4gdGhlIGZpcnN0IDIwMG1zLCB1bmRlc2lyZWQgcGxheWJhY2sgY2hhbmdlcyB0aHVzIGNhbm5vdFxuICAgICAqIGhhcHBlbi4gSWYgYSBkb3VibGUgY2xpY2sgaXMgcmVnaXN0ZXJlZCB3aXRoaW4gNTAwbXMsIHdlIHVuZG8gdGhlIHBsYXliYWNrIGNoYW5nZSBhbmQgc3dpdGNoIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAgKiBJbiB0aGUgZW5kLCB0aGlzIG1ldGhvZCBiYXNpY2FsbHkgaW50cm9kdWNlcyBhIDIwMG1zIG9ic2VydmluZyBpbnRlcnZhbCBpbiB3aGljaCBwbGF5YmFjayBjaGFuZ2VzIGFyZSBwcmV2ZW50ZWRcbiAgICAgKiBpZiBhIGRvdWJsZSBjbGljayBoYXBwZW5zLlxuICAgICAqL1xuICAgIHRoaXMub25DbGljay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgLy8gRGlyZWN0bHkgc3RhcnQgcGxheWJhY2sgb24gZmlyc3QgY2xpY2sgb2YgdGhlIGJ1dHRvbi5cbiAgICAgIC8vIFRoaXMgaXMgYSByZXF1aXJlZCB3b3JrYXJvdW5kIGZvciBtb2JpbGUgYnJvd3NlcnMgd2hlcmUgdmlkZW8gcGxheWJhY2sgbmVlZHMgdG8gYmUgdHJpZ2dlcmVkIGRpcmVjdGx5XG4gICAgICAvLyBieSB0aGUgdXNlci4gQSBkZWZlcnJlZCBwbGF5YmFjayBzdGFydCB0aHJvdWdoIHRoZSB0aW1lb3V0IGJlbG93IGlzIG5vdCBjb25zaWRlcmVkIGFzIHVzZXIgYWN0aW9uIGFuZFxuICAgICAgLy8gdGhlcmVmb3JlIGlnbm9yZWQgYnkgbW9iaWxlIGJyb3dzZXJzLlxuICAgICAgaWYgKGZpcnN0UGxheSkge1xuICAgICAgICAvLyBUcnkgdG8gc3RhcnQgcGxheWJhY2suIFRoZW4gd2Ugd2FpdCBmb3IgUGxheSBhbmQgb25seSB3aGVuIGl0IGFycml2ZXMsIHdlIGRpc2FibGUgdGhlIGZpcnN0UGxheSBmbGFnLlxuICAgICAgICAvLyBJZiB3ZSBkaXNhYmxlIHRoZSBmbGFnIGhlcmUsIG9uQ2xpY2sgd2FzIHRyaWdnZXJlZCBwcm9ncmFtbWF0aWNhbGx5IGluc3RlYWQgb2YgYnkgYSB1c2VyIGludGVyYWN0aW9uLCBhbmRcbiAgICAgICAgLy8gcGxheWJhY2sgaXMgYmxvY2tlZCAoZS5nLiBvbiBtb2JpbGUgZGV2aWNlcyBkdWUgdG8gdGhlIHByb2dyYW1tYXRpYyBwbGF5KCkgY2FsbCksIHdlIGxvb3NlIHRoZSBjaGFuY2UgdG9cbiAgICAgICAgLy8gZXZlciBzdGFydCBwbGF5YmFjayB0aHJvdWdoIGEgdXNlciBpbnRlcmFjdGlvbiBhZ2FpbiB3aXRoIHRoaXMgYnV0dG9uLlxuICAgICAgICB0b2dnbGVQbGF5YmFjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICBpZiAobm93IC0gY2xpY2tUaW1lIDwgMjAwKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYSBkb3VibGUgY2xpY2sgaW5zaWRlIHRoZSAyMDBtcyBpbnRlcnZhbCwganVzdCB0b2dnbGUgZnVsbHNjcmVlbiBtb2RlXG4gICAgICAgIHRvZ2dsZUZ1bGxzY3JlZW4oKTtcbiAgICAgICAgZG91YmxlQ2xpY2tUaW1lID0gbm93O1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKG5vdyAtIGNsaWNrVGltZSA8IDUwMCkge1xuICAgICAgICAvLyBXZSBoYXZlIGEgZG91YmxlIGNsaWNrIGluc2lkZSB0aGUgNTAwbXMgaW50ZXJ2YWwsIHVuZG8gcGxheWJhY2sgdG9nZ2xlIGFuZCB0b2dnbGUgZnVsbHNjcmVlbiBtb2RlXG4gICAgICAgIHRvZ2dsZUZ1bGxzY3JlZW4oKTtcbiAgICAgICAgdG9nZ2xlUGxheWJhY2soKTtcbiAgICAgICAgZG91YmxlQ2xpY2tUaW1lID0gbm93O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNsaWNrVGltZSA9IG5vdztcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpIC0gZG91YmxlQ2xpY2tUaW1lID4gMjAwKSB7XG4gICAgICAgICAgLy8gTm8gZG91YmxlIGNsaWNrIGRldGVjdGVkLCBzbyB3ZSB0b2dnbGUgcGxheWJhY2sgYW5kIHdhaXQgd2hhdCBoYXBwZW5zIG5leHRcbiAgICAgICAgICB0b2dnbGVQbGF5YmFjaygpO1xuICAgICAgICB9XG4gICAgICB9LCAyMDApO1xuICAgIH0pO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXksICgpID0+IHtcbiAgICAgIC8vIFBsYXliYWNrIGhhcyByZWFsbHkgc3RhcnRlZCwgd2UgY2FuIGRpc2FibGUgdGhlIGZsYWcgdG8gc3dpdGNoIHRvIG5vcm1hbCB0b2dnbGUgYnV0dG9uIGhhbmRsaW5nXG4gICAgICBmaXJzdFBsYXkgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5XYXJuaW5nLCAoZXZlbnQ6IFdhcm5pbmdFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IHBsYXllci5leHBvcnRzLldhcm5pbmdDb2RlLlBMQVlCQUNLX0NPVUxEX05PVF9CRV9TVEFSVEVEKSB7XG4gICAgICAgIC8vIGlmIHBsYXliYWNrIGNvdWxkIG5vdCBiZSBzdGFydGVkLCByZXNldCB0aGUgZmlyc3QgcGxheSBmbGFnIGFzIHdlIG5lZWQgdGhlIHVzZXIgaW50ZXJhY3Rpb24gdG8gc3RhcnRcbiAgICAgICAgZmlyc3RQbGF5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHN1cHByZXNzUGxheUJ1dHRvblRyYW5zaXRpb25BbmltYXRpb24gPSAoKSA9PiB7XG4gICAgICAvLyBEaXNhYmxlIHRoZSBjdXJyZW50IGFuaW1hdGlvblxuICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uQW5pbWF0aW9uc0VuYWJsZWQoZmFsc2UpO1xuXG4gICAgICAvLyBFbmFibGUgdGhlIHRyYW5zaXRpb24gYW5pbWF0aW9ucyBmb3IgdGhlIG5leHQgc3RhdGUgY2hhbmdlXG4gICAgICB0aGlzLm9uVG9nZ2xlLnN1YnNjcmliZU9uY2UoKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25BbmltYXRpb25zRW5hYmxlZCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBIaWRlIHRoZSBwbGF5IGJ1dHRvbiBhbmltYXRpb24gd2hlbiB0aGUgVUkgaXMgbG9hZGVkIChpdCBzaG91bGQgb25seSBiZSBhbmltYXRlZCBvbiBzdGF0ZSBjaGFuZ2VzKVxuICAgIHN1cHByZXNzUGxheUJ1dHRvblRyYW5zaXRpb25BbmltYXRpb24oKTtcblxuICAgIGNvbnN0IGlzQXV0b3BsYXlFbmFibGVkID0gcGxheWVyLmdldENvbmZpZygpLnBsYXliYWNrICYmIEJvb2xlYW4ocGxheWVyLmdldENvbmZpZygpLnBsYXliYWNrLmF1dG9wbGF5KTtcbiAgICAvLyBXZSBvbmx5IGtub3cgaWYgYW4gYXV0b3BsYXkgYXR0ZW1wdCBpcyB1cGNvbWluZyBpZiB0aGUgcGxheWVyIGlzIG5vdCB5ZXQgcmVhZHkuIEl0IHRoZSBwbGF5ZXIgaXMgYWxyZWFkeSByZWFkeSxcbiAgICAvLyB0aGUgYXR0ZW1wdCBtaWdodCBiZSB1cGNvbWluZyBvciBtaWdodCBoYXZlIGFscmVhZHkgaGFwcGVuZWQsIGJ1dCB3ZSBkb24ndCBoYXZlIHRvIGhhbmRsZSB0aGF0IGJlY2F1c2Ugd2UgY2FuXG4gICAgLy8gc2ltcGx5IHJlbHkgb24gaXNQbGF5aW5nIGFuZCB0aGUgcGxheSBzdGF0ZSBldmVudHMuXG4gICAgY29uc3QgaXNBdXRvcGxheVVwY29taW5nID0gIXBsYXllci5nZXRTb3VyY2UoKSAmJiBpc0F1dG9wbGF5RW5hYmxlZDtcblxuICAgIC8vIEhpZGUgdGhlIHBsYXkgYnV0dG9uIHdoZW4gdGhlIHBsYXllciBpcyBhbHJlYWR5IHBsYXlpbmcgb3IgYXV0b3BsYXkgaXMgdXBjb21pbmdcbiAgICBpZiAocGxheWVyLmlzUGxheWluZygpIHx8IGlzQXV0b3BsYXlVcGNvbWluZykge1xuICAgICAgLy8gSGlkZSB0aGUgcGxheSBidXR0b24gKHN3aXRjaCB0byBwbGF5aW5nIHN0YXRlKVxuICAgICAgdGhpcy5vbigpO1xuICAgICAgLy8gRGlzYWJsZSB0aGUgYW5pbWF0aW9uIG9mIHRoZSBwbGF5aW5nIHN0YXRlIHN3aXRjaFxuICAgICAgc3VwcHJlc3NQbGF5QnV0dG9uVHJhbnNpdGlvbkFuaW1hdGlvbigpO1xuXG4gICAgICAvLyBTaG93IHRoZSBwbGF5IGJ1dHRvbiB3aXRob3V0IGFuIGFuaW1hdGlvbiBpZiBhIHBsYXkgYXR0ZW1wdCBpcyBibG9ja2VkXG4gICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuV2FybmluZywgKGV2ZW50OiBXYXJuaW5nRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IHBsYXllci5leHBvcnRzLldhcm5pbmdDb2RlLlBMQVlCQUNLX0NPVUxEX05PVF9CRV9TVEFSVEVEKSB7XG4gICAgICAgICAgc3VwcHJlc3NQbGF5QnV0dG9uVHJhbnNpdGlvbkFuaW1hdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgbGV0IGJ1dHRvbkVsZW1lbnQgPSBzdXBlci50b0RvbUVsZW1lbnQoKTtcblxuICAgIC8vIEFkZCBjaGlsZCB0aGF0IGNvbnRhaW5zIHRoZSBwbGF5IGJ1dHRvbiBpbWFnZVxuICAgIC8vIFNldHRpbmcgdGhlIGltYWdlIGRpcmVjdGx5IG9uIHRoZSBidXR0b24gZG9lcyBub3Qgd29yayB0b2dldGhlciB3aXRoIHNjYWxpbmcgYW5pbWF0aW9ucywgYmVjYXVzZSB0aGUgYnV0dG9uXG4gICAgLy8gY2FuIGNvdmVyIHRoZSB3aG9sZSB2aWRlbyBwbGF5ZXIgYXJlIGFuZCBzY2FsaW5nIHdvdWxkIGV4dGVuZCBpdCBiZXlvbmQuIEJ5IGFkZGluZyBhbiBpbm5lciBlbGVtZW50LCBjb25maW5lZFxuICAgIC8vIHRvIHRoZSBzaXplIGlmIHRoZSBpbWFnZSwgaXQgY2FuIHNjYWxlIGluc2lkZSB0aGUgcGxheWVyIHdpdGhvdXQgb3ZlcnNob290aW5nLlxuICAgIGJ1dHRvbkVsZW1lbnQuYXBwZW5kKG5ldyBET00oJ2RpdicsIHtcbiAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCdpbWFnZScpLFxuICAgIH0pKTtcblxuICAgIHJldHVybiBidXR0b25FbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHBsYXkgc3RhdGUgdHJhbnNpdGlvbiBhbmltYXRpb25zIG9mIHRoZSBwbGF5IGJ1dHRvbiBpbWFnZS4gQ2FuIGJlIHVzZWQgdG8gc3VwcHJlc3NcbiAgICogYW5pbWF0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIHRydWUgdG8gZW5hYmxlIHRoZSBhbmltYXRpb25zIChkZWZhdWx0KSwgZmFsc2UgdG8gZGlzYWJsZSB0aGVtXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0VHJhbnNpdGlvbkFuaW1hdGlvbnNFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBub1RyYW5zaXRpb25BbmltYXRpb25zQ2xhc3MgPSB0aGlzLnByZWZpeENzcygnbm8tdHJhbnNpdGlvbi1hbmltYXRpb25zJyk7XG5cbiAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkucmVtb3ZlQ2xhc3Mobm9UcmFuc2l0aW9uQW5pbWF0aW9uc0NsYXNzKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmdldERvbUVsZW1lbnQoKS5oYXNDbGFzcyhub1RyYW5zaXRpb25BbmltYXRpb25zQ2xhc3MpKSB7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyhub1RyYW5zaXRpb25BbmltYXRpb25zQ2xhc3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtCdXR0b25Db25maWcsIEJ1dHRvbn0gZnJvbSAnLi9idXR0b24nO1xuaW1wb3J0IHtET019IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBidXR0b24gdG8gcGxheS9yZXBsYXkgYSB2aWRlby5cbiAqL1xuZXhwb3J0IGNsYXNzIEh1Z2VSZXBsYXlCdXR0b24gZXh0ZW5kcyBCdXR0b248QnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWh1Z2VyZXBsYXlidXR0b24nLFxuICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3JlcGxheScpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHBsYXllci5wbGF5KCd1aScpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvRG9tRWxlbWVudCgpOiBET00ge1xuICAgIGxldCBidXR0b25FbGVtZW50ID0gc3VwZXIudG9Eb21FbGVtZW50KCk7XG5cbiAgICAvLyBBZGQgY2hpbGQgdGhhdCBjb250YWlucyB0aGUgcGxheSBidXR0b24gaW1hZ2VcbiAgICAvLyBTZXR0aW5nIHRoZSBpbWFnZSBkaXJlY3RseSBvbiB0aGUgYnV0dG9uIGRvZXMgbm90IHdvcmsgdG9nZXRoZXIgd2l0aCBzY2FsaW5nIGFuaW1hdGlvbnMsIGJlY2F1c2UgdGhlIGJ1dHRvblxuICAgIC8vIGNhbiBjb3ZlciB0aGUgd2hvbGUgdmlkZW8gcGxheWVyIGFyZSBhbmQgc2NhbGluZyB3b3VsZCBleHRlbmQgaXQgYmV5b25kLiBCeSBhZGRpbmcgYW4gaW5uZXIgZWxlbWVudCwgY29uZmluZWRcbiAgICAvLyB0byB0aGUgc2l6ZSBpZiB0aGUgaW1hZ2UsIGl0IGNhbiBzY2FsZSBpbnNpZGUgdGhlIHBsYXllciB3aXRob3V0IG92ZXJzaG9vdGluZy5cbiAgICBidXR0b25FbGVtZW50LmFwcGVuZChuZXcgRE9NKCdkaXYnLCB7XG4gICAgICAnY2xhc3MnOiB0aGlzLnByZWZpeENzcygnaW1hZ2UnKSxcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gYnV0dG9uRWxlbWVudDtcbiAgfVxufSIsImltcG9ydCB7TGlzdFNlbGVjdG9yLCBMaXN0U2VsZWN0b3JDb25maWd9IGZyb20gJy4vbGlzdHNlbGVjdG9yJztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuZXhwb3J0IGNsYXNzIEl0ZW1TZWxlY3Rpb25MaXN0IGV4dGVuZHMgTGlzdFNlbGVjdG9yPExpc3RTZWxlY3RvckNvbmZpZz4ge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMQVNTX1NFTEVDVEVEID0gJ3NlbGVjdGVkJztcblxuICBwcml2YXRlIGxpc3RFbGVtZW50OiBET007XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMaXN0U2VsZWN0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICB0YWc6ICd1bCcsXG4gICAgICBjc3NDbGFzczogJ3VpLWl0ZW1zZWxlY3Rpb25saXN0JyxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoID4gMTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b0RvbUVsZW1lbnQoKTogRE9NIHtcbiAgICBsZXQgbGlzdEVsZW1lbnQgPSBuZXcgRE9NKCd1bCcsIHtcbiAgICAgICdpZCc6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgJ2NsYXNzJzogdGhpcy5nZXRDc3NDbGFzc2VzKCksXG4gICAgfSk7XG5cbiAgICB0aGlzLmxpc3RFbGVtZW50ID0gbGlzdEVsZW1lbnQ7XG4gICAgdGhpcy51cGRhdGVEb21JdGVtcygpO1xuXG4gICAgcmV0dXJuIGxpc3RFbGVtZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZURvbUl0ZW1zKHNlbGVjdGVkVmFsdWU6IHN0cmluZyA9IG51bGwpIHtcbiAgICAvLyBEZWxldGUgYWxsIGNoaWxkcmVuXG4gICAgdGhpcy5saXN0RWxlbWVudC5lbXB0eSgpO1xuXG4gICAgbGV0IHNlbGVjdGVkTGlzdEl0ZW06IERPTSA9IG51bGw7XG5cbiAgICBjb25zdCBzZWxlY3RJdGVtID0gKGxpc3RJdGVtOiBET00pID0+IHtcbiAgICAgIGxpc3RJdGVtLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKEl0ZW1TZWxlY3Rpb25MaXN0LkNMQVNTX1NFTEVDVEVEKSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlc2VsZWN0SXRlbSA9IChsaXN0SXRlbTogRE9NKSA9PiB7XG4gICAgICBsaXN0SXRlbS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhJdGVtU2VsZWN0aW9uTGlzdC5DTEFTU19TRUxFQ1RFRCkpO1xuICAgIH07XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgIGxldCBsaXN0SXRlbSA9IG5ldyBET00oJ2xpJywge1xuICAgICAgICAndHlwZSc6ICdsaScsXG4gICAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCd1aS1zZWxlY3Rpb25saXN0aXRlbScpLFxuICAgICAgfSkuYXBwZW5kKG5ldyBET00oJ2EnLCB7XG4gICAgICB9KS5odG1sKGkxOG4ucGVyZm9ybUxvY2FsaXphdGlvbihpdGVtLmxhYmVsKSkpO1xuXG4gICAgICBpZiAoIXNlbGVjdGVkTGlzdEl0ZW0pIHtcbiAgICAgICAgaWYgKHNlbGVjdGVkVmFsdWUgPT0gbnVsbCkgeyAvLyBJZiB0aGVyZSBpcyBubyBwcmUtc2VsZWN0ZWQgdmFsdWUsIHNlbGVjdCB0aGUgZmlyc3Qgb25lXG4gICAgICAgICAgc2VsZWN0ZWRMaXN0SXRlbSA9IGxpc3RJdGVtO1xuICAgICAgICB9IGVsc2UgaWYgKFN0cmluZyhzZWxlY3RlZFZhbHVlKSA9PT0gaXRlbS5rZXkpIHsgLy8gY29udmVydCBzZWxlY3RlZFZhbHVlIHRvIHN0cmluZyB0byBjYXRjaCAnbnVsbCcvbnVsbCBjYXNlXG4gICAgICAgICAgc2VsZWN0ZWRMaXN0SXRlbSA9IGxpc3RJdGVtO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBsaXN0IGl0ZW0gc2VsZWN0aW9uc1xuICAgICAgbGlzdEl0ZW0ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAvLyBEZXNlbGVjdCB0aGUgcHJldmlvdXMgaXRlbSAoaWYgdGhlcmUgd2FzIGEgc2VsZWN0ZWQgaXRlbSlcbiAgICAgICAgaWYgKHNlbGVjdGVkTGlzdEl0ZW0pIHtcbiAgICAgICAgICBkZXNlbGVjdEl0ZW0oc2VsZWN0ZWRMaXN0SXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWxlY3QgdGhlIGNsaWNrZWQgaXRlbVxuICAgICAgICBzZWxlY3RlZExpc3RJdGVtID0gbGlzdEl0ZW07XG4gICAgICAgIHNlbGVjdEl0ZW0obGlzdEl0ZW0pO1xuXG4gICAgICAgIC8vIEZpcmUgdGhlIGV2ZW50XG4gICAgICAgIHRoaXMub25JdGVtU2VsZWN0ZWRFdmVudChpdGVtLmtleSwgZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNlbGVjdCBkZWZhdWx0IGl0ZW1cbiAgICAgIGlmIChzZWxlY3RlZExpc3RJdGVtKSB7XG4gICAgICAgIHNlbGVjdEl0ZW0oc2VsZWN0ZWRMaXN0SXRlbSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGlzdEVsZW1lbnQuYXBwZW5kKGxpc3RJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JdGVtQWRkZWRFdmVudCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIub25JdGVtQWRkZWRFdmVudCh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVEb21JdGVtcyh0aGlzLnNlbGVjdGVkSXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JdGVtUmVtb3ZlZEV2ZW50KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5vbkl0ZW1SZW1vdmVkRXZlbnQodmFsdWUpO1xuICAgIHRoaXMudXBkYXRlRG9tSXRlbXModGhpcy5zZWxlY3RlZEl0ZW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSXRlbVNlbGVjdGVkRXZlbnQodmFsdWU6IHN0cmluZywgdXBkYXRlRG9tSXRlbXM6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIub25JdGVtU2VsZWN0ZWRFdmVudCh2YWx1ZSk7XG4gICAgaWYgKHVwZGF0ZURvbUl0ZW1zKSB7XG4gICAgICB0aGlzLnVwZGF0ZURvbUl0ZW1zKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7Q29tcG9uZW50Q29uZmlnLCBDb21wb25lbnR9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHtFdmVudERpc3BhdGNoZXIsIEV2ZW50LCBOb0FyZ3N9IGZyb20gJy4uL2V2ZW50ZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVRleHQsIGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIExhYmVsfSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFiZWxDb25maWcgZXh0ZW5kcyBDb21wb25lbnRDb25maWcge1xuICAvKipcbiAgICogVGhlIHRleHQgYXMgc3RyaW5nIG9yIGxvY2FsaXplIGNhbGxiYWNrIG9uIHRoZSBsYWJlbC5cbiAgICovXG4gIHRleHQ/OiBMb2NhbGl6YWJsZVRleHQ7XG5cbiAgLyoqXG4gICAqIFdDQUcyMCBzdGFuZGFyZDogQXNzb2NpYXRlIGxhYmVsIHRvIGZvcm0gY29udHJvbC5cbiAgICovXG4gIGZvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNpbXBsZSB0ZXh0IGxhYmVsLlxuICpcbiAqIERPTSBleGFtcGxlOlxuICogPGNvZGU+XG4gKiAgICAgPHNwYW4gY2xhc3M9J3VpLWxhYmVsJz4uLi5zb21lIHRleHQuLi48L3NwYW4+XG4gKiA8L2NvZGU+XG4gKi9cbmV4cG9ydCBjbGFzcyBMYWJlbDxDb25maWcgZXh0ZW5kcyBMYWJlbENvbmZpZz4gZXh0ZW5kcyBDb21wb25lbnQ8Q29uZmlnPiB7XG5cbiAgcHJpdmF0ZSB0ZXh0OiBMb2NhbGl6YWJsZVRleHQ7XG5cbiAgcHJpdmF0ZSBsYWJlbEV2ZW50cyA9IHtcbiAgICBvbkNsaWNrOiBuZXcgRXZlbnREaXNwYXRjaGVyPExhYmVsPENvbmZpZz4sIE5vQXJncz4oKSxcbiAgICBvblRleHRDaGFuZ2VkOiBuZXcgRXZlbnREaXNwYXRjaGVyPExhYmVsPENvbmZpZz4sIHN0cmluZz4oKSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbmZpZyA9IHt9IGFzIENvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWxhYmVsJyxcbiAgICB9IGFzIENvbmZpZywgdGhpcy5jb25maWcpO1xuICAgIHRoaXMudGV4dCA9IHRoaXMuY29uZmlnLnRleHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IHRoaXMuY29uZmlnLmZvciAhPSBudWxsID8gJ2xhYmVsJyA6ICdzcGFuJztcblxuICAgIGxldCBsYWJlbEVsZW1lbnQgPSBuZXcgRE9NKHRhZ05hbWUsIHtcbiAgICAgICdpZCc6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgJ2Zvcic6IHRoaXMuY29uZmlnLmZvcixcbiAgICAgICdjbGFzcyc6IHRoaXMuZ2V0Q3NzQ2xhc3NlcygpLFxuICAgIH0pLmh0bWwoaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRoaXMudGV4dCkpO1xuXG4gICAgbGFiZWxFbGVtZW50Lm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMub25DbGlja0V2ZW50KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGFiZWxFbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdGV4dCBvbiB0aGlzIGxhYmVsLlxuICAgKiBAcGFyYW0gdGV4dFxuICAgKi9cbiAgc2V0VGV4dCh0ZXh0OiBMb2NhbGl6YWJsZVRleHQpIHtcbiAgICBpZiAodGV4dCA9PT0gdGhpcy50ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICBjb25zdCBsb2NhbGl6ZWRUZXh0ID0gaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRleHQpO1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmh0bWwobG9jYWxpemVkVGV4dCk7XG4gICAgdGhpcy5vblRleHRDaGFuZ2VkRXZlbnQobG9jYWxpemVkVGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGV4dCBvbiB0aGlzIGxhYmVsLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0ZXh0IG9uIHRoZSBsYWJlbFxuICAgKi9cbiAgZ2V0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24odGhpcy50ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHRleHQgb24gdGhpcyBsYWJlbC5cbiAgICovXG4gIGNsZWFyVGV4dCgpIHtcbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5odG1sKCcnKTtcbiAgICB0aGlzLm9uVGV4dENoYW5nZWRFdmVudChudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyBpZiB0aGUgbGFiZWwgaXMgZW1wdHkgYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IHRleHQuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGxhYmVsIGlzIGVtcHR5LCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy50ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHRoZSB7QGxpbmsgI29uQ2xpY2t9IGV2ZW50LlxuICAgKiBDYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzIHRvIGxpc3RlbiB0byB0aGlzIGV2ZW50IHdpdGhvdXQgc3Vic2NyaWJpbmcgYW4gZXZlbnQgbGlzdGVuZXIgYnkgb3ZlcndyaXRpbmcgdGhlIG1ldGhvZFxuICAgKiBhbmQgY2FsbGluZyB0aGUgc3VwZXIgbWV0aG9kLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQ2xpY2tFdmVudCgpIHtcbiAgICB0aGlzLmxhYmVsRXZlbnRzLm9uQ2xpY2suZGlzcGF0Y2godGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgdGhlIHtAbGluayAjb25DbGlja30gZXZlbnQuXG4gICAqIENhbiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8gbGlzdGVuIHRvIHRoaXMgZXZlbnQgd2l0aG91dCBzdWJzY3JpYmluZyBhbiBldmVudCBsaXN0ZW5lciBieSBvdmVyd3JpdGluZyB0aGUgbWV0aG9kXG4gICAqIGFuZCBjYWxsaW5nIHRoZSBzdXBlciBtZXRob2QuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25UZXh0Q2hhbmdlZEV2ZW50KHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMubGFiZWxFdmVudHMub25UZXh0Q2hhbmdlZC5kaXNwYXRjaCh0aGlzLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIGxhYmVsIGlzIGNsaWNrZWQuXG4gICAqIEByZXR1cm5zIHtFdmVudDxMYWJlbDxMYWJlbENvbmZpZz4sIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25DbGljaygpOiBFdmVudDxMYWJlbDxMYWJlbENvbmZpZz4sIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLmxhYmVsRXZlbnRzLm9uQ2xpY2suZ2V0RXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIHRleHQgb24gdGhlIGxhYmVsIGlzIGNoYW5nZWQuXG4gICAqIEByZXR1cm5zIHtFdmVudDxMYWJlbDxMYWJlbENvbmZpZz4sIHN0cmluZz59XG4gICAqL1xuICBnZXQgb25UZXh0Q2hhbmdlZCgpOiBFdmVudDxMYWJlbDxMYWJlbENvbmZpZz4sIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmxhYmVsRXZlbnRzLm9uVGV4dENoYW5nZWQuZ2V0RXZlbnQoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVG9nZ2xlQnV0dG9uLCBUb2dnbGVCdXR0b25Db25maWcgfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQgeyBMaXN0SXRlbSwgTGlzdFNlbGVjdG9yLCBMaXN0U2VsZWN0b3JDb25maWcgfSBmcm9tICcuL2xpc3RzZWxlY3Rvcic7XG5pbXBvcnQge0RPTX0gZnJvbSAnLi4vZG9tJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBVSUluc3RhbmNlTWFuYWdlciB9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBBcnJheVV0aWxzIH0gZnJvbSAnLi4vYXJyYXl1dGlscyc7XG5cbi8qKlxuICogQSBlbGVtZW50IHRvIHNlbGVjdCBhIHNpbmdsZSBpdGVtIG91dCBvZiBhIGxpc3Qgb2YgYXZhaWxhYmxlIGl0ZW1zLlxuICpcbiAqIERPTSBleGFtcGxlOlxuICogPGNvZGU+XG4gKiAgIDxkaXYgY2xhc3M9J3VpLWxpc3Rib3gnPlxuICogICAgIDxidXR0b24gY2xhc3M9J3VpLWxpc3Rib3gtYnV0dG9uJz5sYWJlbDwvYnV0dG9uPlxuICogICAgIC4uLlxuICogICA8L2RpdlxuICogPC9jb2RlPlxuICovXG4vLyBUT0RPOiBjaGFuZ2UgTGlzdFNlbGVjdG9yIHRvIGV4dGVuZHMgY29udGFpbmVyIGluIHY0IHRvIGltcHJvdmUgdXNhZ2Ugb2YgTGlzdEJveC5cbi8vICAgICAgIEN1cnJlbnRseSB3ZSBhcmUgY3JlYXRpbmcgdGhlIGRvbSBlbGVtZW50IG9mIHRoZSBsaXN0IGJveCB3aXRoIGNoaWxkIGVsZW1lbnRzIG1hbnVhbGx5IGhlcmUuXG4vLyAgICAgICBCdXQgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGFscmVhZHkgY292ZXJlZCB3aXRoaW4gdGhlIENvbnRhaW5lciBjb21wb25lbnQuXG5leHBvcnQgY2xhc3MgTGlzdEJveCBleHRlbmRzIExpc3RTZWxlY3RvcjxMaXN0U2VsZWN0b3JDb25maWc+IHtcbiAgcHJpdmF0ZSBsaXN0Qm94RWxlbWVudDogRE9NO1xuICBwcml2YXRlIGNvbXBvbmVudHM6IExpc3RCb3hJdGVtQnV0dG9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExpc3RTZWxlY3RvckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktbGlzdGJveCcsXG4gICAgfSBhcyBMaXN0U2VsZWN0b3JDb25maWcsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICAvLyBTdWJzY3JpYmUgYmVmb3JlIHN1cGVyIGNhbGwgdG8gcmVjZWl2ZSBpbml0aWFsIGV2ZW50c1xuICAgIHRoaXMub25JdGVtQWRkZWQuc3Vic2NyaWJlKHRoaXMuYWRkTGlzdEJveERvbUl0ZW0pO1xuICAgIHRoaXMub25JdGVtUmVtb3ZlZC5zdWJzY3JpYmUodGhpcy5yZW1vdmVMaXN0Qm94RG9tSXRlbSk7XG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUodGhpcy5yZWZyZXNoU2VsZWN0ZWRJdGVtKTtcblxuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgbGV0IGxpc3RCb3hFbGVtZW50ID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2lkJzogdGhpcy5jb25maWcuaWQsXG4gICAgICAnY2xhc3MnOiB0aGlzLmdldENzc0NsYXNzZXMoKSxcbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEJveEVsZW1lbnQgPSBsaXN0Qm94RWxlbWVudDtcbiAgICB0aGlzLmNyZWF0ZUxpc3RCb3hEb21JdGVtcygpO1xuICAgIHRoaXMucmVmcmVzaFNlbGVjdGVkSXRlbSgpO1xuXG4gICAgcmV0dXJuIGxpc3RCb3hFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMaXN0Qm94RG9tSXRlbXMoKSB7XG4gICAgLy8gRGVsZXRlIGFsbCBjaGlsZHJlblxuICAgIHRoaXMubGlzdEJveEVsZW1lbnQuZW1wdHkoKTtcbiAgICB0aGlzLmNvbXBvbmVudHMgPSBbXTtcblxuICAgIC8vIEFkZCB1cGRhdGVkIGNoaWxkcmVuXG4gICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICB0aGlzLmFkZExpc3RCb3hEb21JdGVtKHRoaXMsIGl0ZW0ua2V5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUxpc3RCb3hEb21JdGVtID0gKF86IExpc3RCb3gsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRDb21wb25lbnRGb3JLZXkoa2V5KTtcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBjb21wb25lbnQuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZSgpO1xuICAgICAgQXJyYXlVdGlscy5yZW1vdmUodGhpcy5jb21wb25lbnRzLCBjb21wb25lbnQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGFkZExpc3RCb3hEb21JdGVtID0gKF86IExpc3RCb3gsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRDb21wb25lbnRGb3JLZXkoa2V5KTtcbiAgICBjb25zdCBuZXdJdGVtID0gdGhpcy5nZXRJdGVtRm9yS2V5KGtleSk7XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGNvbXBvbmVudFxuICAgICAgY29tcG9uZW50LnNldFRleHQobmV3SXRlbS5sYWJlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxpc3RCb3hJdGVtQnV0dG9uID0gdGhpcy5idWlsZExpc3RCb3hJdGVtQnV0dG9uKG5ld0l0ZW0pO1xuXG4gICAgICBsaXN0Qm94SXRlbUJ1dHRvbi5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKGxpc3RCb3hJdGVtQnV0dG9uKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChsaXN0Qm94SXRlbUJ1dHRvbik7XG4gICAgICB0aGlzLmxpc3RCb3hFbGVtZW50LmFwcGVuZChsaXN0Qm94SXRlbUJ1dHRvbi5nZXREb21FbGVtZW50KCkpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHJlZnJlc2hTZWxlY3RlZEl0ZW0gPSAoKSA9PiB7XG4gICAgLy8gVGhpcyBnZXRzIGNhbGxlZCB0d2ljZSBiZWNhdXNlIHRoZSBmaXJzdCB0aW1lIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgTGlzdEJveEl0ZW1CdXR0b24uIEFuZCB0aGVcbiAgICAvLyBzZWNvbmQgY2FsbCBjb21lcyBmcm9tIHRoZSBwbGF5ZXIgZXZlbnQgd2hlbiB0aGUgYWN0dWFsIGl0ZW0gaXMgc2VsZWN0ZWQgKFN1YnRpdGxlIC8gQXVkaW9UcmFjayBpbiB0aGlzIGNhc2UpLlxuICAgIC8vIEFzIHRoaXMgaXMgYSBnZW5lcmljIGNvbXBvbmVudCB3ZSBjYW4ndCBwcm9oaWJpdCB0aGlzIGJlaGF2aW91ci4gV2UgbmVlZCB0byB0cmVhdCB0aGlzIGNvbXBvbmVudCBhcyBpdCBhY3RzXG4gICAgLy8gaW5kZXBlbmRlbnQgZnJvbSBQbGF5ZXJFdmVudHMgYW5kIG9uIHRoZSBvdGhlciBoYW5kIHdlIG5lZWQgdG8gcmVhY3QgdG8gUGxheWVyRXZlbnRzIGFzIGl0IGNvdWxkIGJlIHRyaWdnZXJlZFxuICAgIC8vIGZyb20gb3V0c2lkZS5cblxuICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5nZXRDb21wb25lbnRGb3JLZXkoaXRlbS5rZXkpO1xuICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICBTdHJpbmcoY29tcG9uZW50LmtleSkgPT09IFN0cmluZyh0aGlzLnNlbGVjdGVkSXRlbSkgPyBjb21wb25lbnQub24oKSA6IGNvbXBvbmVudC5vZmYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBidWlsZExpc3RCb3hJdGVtQnV0dG9uKGxpc3RJdGVtOiBMaXN0SXRlbSk6IExpc3RCb3hJdGVtQnV0dG9uIHtcbiAgICByZXR1cm4gbmV3IExpc3RCb3hJdGVtQnV0dG9uKHtcbiAgICAgIGtleTogbGlzdEl0ZW0ua2V5LFxuICAgICAgdGV4dDogbGlzdEl0ZW0ubGFiZWwsXG4gICAgICBhcmlhTGFiZWw6IGxpc3RJdGVtLmFyaWFMYWJlbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcG9uZW50Rm9yS2V5KGtleTogc3RyaW5nKTogTGlzdEJveEl0ZW1CdXR0b24ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHMuZmluZCgoYykgPT4ga2V5ID09PSBjLmtleSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlbGVjdGlvbkNoYW5nZSA9IChzZW5kZXI6IExpc3RCb3hJdGVtQnV0dG9uKSA9PiB7XG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZEV2ZW50KHNlbmRlci5rZXkpO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGlzdEJveEl0ZW1CdXR0b25Db25maWcgZXh0ZW5kcyBUb2dnbGVCdXR0b25Db25maWcge1xuICAvKipcbiAgICoga2V5IHRvIGlkZW50aWZ5IHNlbGVjdGVkIGl0ZW0uIFNpbWlsYXIgdG8gdGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiBhbiBzZWxlY3Qgb3B0aW9uLlxuICAgKi9cbiAga2V5OiBzdHJpbmc7XG59XG5cbmNsYXNzIExpc3RCb3hJdGVtQnV0dG9uIGV4dGVuZHMgVG9nZ2xlQnV0dG9uPExpc3RCb3hJdGVtQnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMaXN0Qm94SXRlbUJ1dHRvbkNvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLWxpc3Rib3gtYnV0dG9uJyxcbiAgICAgIG9uQ2xhc3M6ICdzZWxlY3RlZCcsXG4gICAgICBvZmZDbGFzczogJycsXG4gICAgfSBhcyBMaXN0Qm94SXRlbUJ1dHRvbkNvbmZpZywgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgZ2V0IGtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5jb25maWcgYXMgTGlzdEJveEl0ZW1CdXR0b25Db25maWcpLmtleTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudENvbmZpZ30gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHtFdmVudERpc3BhdGNoZXIsIEV2ZW50fSBmcm9tICcuLi9ldmVudGRpc3BhdGNoZXInO1xuaW1wb3J0IHtBcnJheVV0aWxzfSBmcm9tICcuLi9hcnJheXV0aWxzJztcbmltcG9ydCB7IExvY2FsaXphYmxlVGV4dCwgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIG1hcCBvZiBpdGVtcyAoa2V5L3ZhbHVlIC0+IGxhYmVsfSBmb3IgYSB7QGxpbmsgTGlzdFNlbGVjdG9yfSBpbiBhIHtAbGluayBMaXN0U2VsZWN0b3JDb25maWd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBMb2NhbGl6YWJsZVRleHQ7XG4gIHNvcnRlZEluc2VydD86IGJvb2xlYW47XG4gIGFyaWFMYWJlbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGxpc3QgaXRlbXMgYWRkZWQgdGhyb3VnaCB7QGxpbmsgTGlzdFNlbGVjdG9yLmFkZEl0ZW19LlxuICpcbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHN1YmNsYXNzZXMgdGhhdCBwb3B1bGF0ZSB0aGVtc2VsdmVzIGF1dG9tYXRpY2FsbHlcbiAqIHZpYSB0aGUgcGxheWVyIEFQSSwgZS5nLiB7QGxpbmsgU3VidGl0bGVTZWxlY3RCb3h9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtRmlsdGVyIHtcbiAgLyoqXG4gICAqIFRha2VzIGEgbGlzdCBpdGVtIGFuZCBkZWNpZGVzIHdoZXRoZXIgaXQgc2hvdWxkIHBhc3Mgb3IgYmUgZGlzY2FyZGVkLlxuICAgKiBAcGFyYW0ge0xpc3RJdGVtfSBsaXN0SXRlbSB0aGUgaXRlbSB0byBhcHBseSB0aGUgZmlsdGVyIHRvXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIHRvIGxldCB0aGUgaXRlbSBwYXNzIHRocm91Z2ggdGhlIGZpbHRlciwgZmFsc2UgdG8gZGlzY2FyZCB0aGUgaXRlbVxuICAgKi9cbiAgKGxpc3RJdGVtOiBMaXN0SXRlbSk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHJhbnNsYXRvciBmdW5jdGlvbiB0byB0cmFuc2xhdGUgbGFiZWxzIG9mIGxpc3QgaXRlbXMgYWRkZWQgdGhyb3VnaCB7QGxpbmsgTGlzdFNlbGVjdG9yLmFkZEl0ZW19LlxuICpcbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHN1YmNsYXNzZXMgdGhhdCBwb3B1bGF0ZSB0aGVtc2VsdmVzIGF1dG9tYXRpY2FsbHlcbiAqIHZpYSB0aGUgcGxheWVyIEFQSSwgZS5nLiB7QGxpbmsgU3VidGl0bGVTZWxlY3RCb3h9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RJdGVtTGFiZWxUcmFuc2xhdG9yIHtcbiAgLyoqXG4gICAqIFRha2VzIGEgbGlzdCBpdGVtLCBvcHRpb25hbGx5IGNoYW5nZXMgdGhlIGxhYmVsLCBhbmQgcmV0dXJucyB0aGUgbmV3IGxhYmVsLlxuICAgKiBAcGFyYW0ge0xpc3RJdGVtfSBsaXN0SXRlbSB0aGUgaXRlbSB0byB0cmFuc2xhdGVcbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHRyYW5zbGF0ZWQgb3Igb3JpZ2luYWwgbGFiZWxcbiAgICovXG4gIChsaXN0SXRlbTogTGlzdEl0ZW0pOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIExpc3RTZWxlY3Rvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFNlbGVjdG9yQ29uZmlnIGV4dGVuZHMgQ29tcG9uZW50Q29uZmlnIHtcbiAgaXRlbXM/OiBMaXN0SXRlbVtdO1xuICBmaWx0ZXI/OiBMaXN0SXRlbUZpbHRlcjtcbiAgdHJhbnNsYXRvcj86IExpc3RJdGVtTGFiZWxUcmFuc2xhdG9yO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGlzdFNlbGVjdG9yPENvbmZpZyBleHRlbmRzIExpc3RTZWxlY3RvckNvbmZpZz4gZXh0ZW5kcyBDb21wb25lbnQ8TGlzdFNlbGVjdG9yQ29uZmlnPiB7XG5cbiAgcHJvdGVjdGVkIGl0ZW1zOiBMaXN0SXRlbVtdO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRJdGVtOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBsaXN0U2VsZWN0b3JFdmVudHMgPSB7XG4gICAgb25JdGVtQWRkZWQ6IG5ldyBFdmVudERpc3BhdGNoZXI8TGlzdFNlbGVjdG9yPENvbmZpZz4sIHN0cmluZz4oKSxcbiAgICBvbkl0ZW1SZW1vdmVkOiBuZXcgRXZlbnREaXNwYXRjaGVyPExpc3RTZWxlY3RvcjxDb25maWc+LCBzdHJpbmc+KCksXG4gICAgb25JdGVtU2VsZWN0ZWQ6IG5ldyBFdmVudERpc3BhdGNoZXI8TGlzdFNlbGVjdG9yPENvbmZpZz4sIHN0cmluZz4oKSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExpc3RTZWxlY3RvckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIGNzc0NsYXNzOiAndWktbGlzdHNlbGVjdG9yJyxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG5cbiAgICB0aGlzLml0ZW1zID0gdGhpcy5jb25maWcuaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIGdldEl0ZW1JbmRleChrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgZm9yIChsZXQgaW5kZXggaW4gdGhpcy5pdGVtcykge1xuICAgICAgaWYgKGtleSA9PT0gdGhpcy5pdGVtc1tpbmRleF0ua2V5KSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBjdXJyZW50IGl0ZW1zIG9mIHRoaXMgc2VsZWN0b3IuXG4gICAqICogQHJldHVybnMge0xpc3RJdGVtW119XG4gICAqL1xuICBnZXRJdGVtcygpOiBMaXN0SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBpdGVtIGlzIHBhcnQgb2YgdGhpcyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIGtleSB0aGUga2V5IG9mIHRoZSBpdGVtIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIGlzIHBhcnQgb2YgdGhpcyBzZWxlY3RvciwgZWxzZSBmYWxzZVxuICAgKi9cbiAgaGFzSXRlbShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW1JbmRleChrZXkpID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpdGVtIHRvIHRoaXMgc2VsZWN0b3IgYnkgZG9pbmcgYSBzb3J0ZWQgaW5zZXJ0IG9yIGJ5IGFwcGVuZGluZyB0aGUgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGl0ZW1zLlxuICAgKiBJZiBhbiBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgYWxyZWFkeSBleGlzdHMsIGl0IGlzIHJlcGxhY2VkLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgb2YgdGhlIGl0ZW0gdG8gYWRkXG4gICAqIEBwYXJhbSBsYWJlbCB0aGUgKGh1bWFuLXJlYWRhYmxlKSBsYWJlbCBvZiB0aGUgaXRlbSB0byBhZGRcbiAgICogQHBhcmFtIHNvcnRlZEluc2VydCB3aGV0aGVyIHRoZSBpdGVtIHNob3VsZCBiZSBhZGRlZCByZXNwZWN0aW5nIHRoZSBvcmRlciBvZiBrZXlzXG4gICAqIEBwYXJhbSBhcmlhTGFiZWwgY3VzdG9tIGFyaWEgbGFiZWwgZm9yIHRoZSBsaXN0SXRlbVxuICAgKi9cbiAgYWRkSXRlbShrZXk6IHN0cmluZywgbGFiZWw6IExvY2FsaXphYmxlVGV4dCwgc29ydGVkSW5zZXJ0ID0gZmFsc2UsIGFyaWFMYWJlbCA9ICcnKSB7XG4gICAgY29uc3QgbGlzdEl0ZW0gPSB7IGtleToga2V5LCBsYWJlbDogaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKGxhYmVsKSwgLi4uKGFyaWFMYWJlbCAmJiB7IGFyaWFMYWJlbCB9KX07XG5cbiAgICAvLyBBcHBseSBmaWx0ZXIgZnVuY3Rpb25cbiAgICBpZiAodGhpcy5jb25maWcuZmlsdGVyICYmICF0aGlzLmNvbmZpZy5maWx0ZXIobGlzdEl0ZW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgdHJhbnNsYXRvciBmdW5jdGlvblxuICAgIGlmICh0aGlzLmNvbmZpZy50cmFuc2xhdG9yKSB7XG4gICAgICBsaXN0SXRlbS5sYWJlbCA9IHRoaXMuY29uZmlnLnRyYW5zbGF0b3IobGlzdEl0ZW0pO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byByZW1vdmUga2V5IGZpcnN0IHRvIGdldCBvdmVyd3JpdGUgYmVoYXZpb3IgYW5kIGF2b2lkIGR1cGxpY2F0ZSBrZXlzXG4gICAgdGhpcy5yZW1vdmVJdGVtKGtleSk7IC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGFuIEl0ZW1SZW1vdmVkIGFuZCBhbiBJdGVtQWRkZWQgZXZlbnRcblxuICAgIC8vIEFkZCB0aGUgaXRlbSB0byB0aGUgbGlzdFxuICAgIGlmIChzb3J0ZWRJbnNlcnQpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoZW50cnkgPT4gZW50cnkua2V5ID4ga2V5KTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGxpc3RJdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGluZGV4LCAwLCBsaXN0SXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbXMucHVzaChsaXN0SXRlbSk7XG4gICAgfVxuICAgIHRoaXMub25JdGVtQWRkZWRFdmVudChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoaXMgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBvZiB0aGUgaXRlbSB0byByZW1vdmVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgcmVtb3ZhbCB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdGhlIGl0ZW0gaXMgbm90IHBhcnQgb2YgdGhpcyBzZWxlY3RvclxuICAgKi9cbiAgcmVtb3ZlSXRlbShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBpbmRleCA9IHRoaXMuZ2V0SXRlbUluZGV4KGtleSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIEFycmF5VXRpbHMucmVtb3ZlKHRoaXMuaXRlbXMsIHRoaXMuaXRlbXNbaW5kZXhdKTtcbiAgICAgIHRoaXMub25JdGVtUmVtb3ZlZEV2ZW50KGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhbiBpdGVtIGZyb20gdGhlIGl0ZW1zIGluIHRoaXMgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBvZiB0aGUgaXRlbSB0byBzZWxlY3RcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaXMgdGhlIHNlbGVjdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgbm90IHBhcnQgb2YgdGhlIHNlbGVjdG9yXG4gICAqL1xuICBzZWxlY3RJdGVtKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGtleSA9PT0gdGhpcy5zZWxlY3RlZEl0ZW0pIHtcbiAgICAgIC8vIGl0ZW1Db25maWcgaXMgYWxyZWFkeSBzZWxlY3RlZCwgc3VwcHJlc3MgYW55IGZ1cnRoZXIgYWN0aW9uXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLmdldEl0ZW1JbmRleChrZXkpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0ga2V5O1xuICAgICAgdGhpcy5vbkl0ZW1TZWxlY3RlZEV2ZW50KGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUga2V5IG9mIHRoZSBzZWxlY3RlZCBpdGVtLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUga2V5IG9mIHRoZSBzZWxlY3RlZCBpdGVtIG9yIG51bGwgaWYgbm8gaXRlbSBpcyBzZWxlY3RlZFxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRJdGVtKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpdGVtcyBmb3IgdGhlIGdpdmVuIGtleSBvciB1bmRlZmluZWQgaWYgbm8gaXRlbSB3aXRoIHRoZSBnaXZlbiBrZXkgZXhpc3RzLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIHtMaXN0SXRlbX0gdGhlIGl0ZW0gd2l0aCB0aGUgcmVxdWVzdGVkIGtleS4gVW5kZWZpbmVkIGlmIG5vIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4ga2V5IGV4aXN0cy5cbiAgICovXG4gIGdldEl0ZW1Gb3JLZXkoa2V5OiBzdHJpbmcpOiBMaXN0SXRlbSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5rZXkgPT09IGtleSk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25pemUgdGhlIGN1cnJlbnQgaXRlbXMgb2YgdGhpcyBzZWxlY3RvciB3aXRoIHRoZSBnaXZlbiBvbmVzLiBUaGlzIHdpbGwgcmVtb3ZlIGFuZCBhZGQgaXRlbXMgc2VsZWN0aXZlbHkuXG4gICAqIEZvciBlYWNoIHJlbW92ZWQgaXRlbSB0aGUgSXRlbVJlbW92ZWRFdmVudCBhbmQgZm9yIGVhY2ggYWRkZWQgaXRlbSB0aGUgSXRlbUFkZGVkRXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuIEZhdm91clxuICAgKiB0aGlzIG1ldGhvZCBvdmVyIHVzaW5nIGNsZWFySXRlbXMgYW5kIGFkZGluZyBhbGwgaXRlbXMgYWdhaW4gYWZ0ZXJ3YXJkcy5cbiAgICogQHBhcmFtIG5ld0l0ZW1zXG4gICAqL1xuICBzeW5jaHJvbml6ZUl0ZW1zKG5ld0l0ZW1zOiBMaXN0SXRlbVtdKTogdm9pZCB7XG4gICAgbmV3SXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICF0aGlzLmhhc0l0ZW0oaXRlbS5rZXkpKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IHRoaXMuYWRkSXRlbShpdGVtLmtleSwgaXRlbS5sYWJlbCwgaXRlbS5zb3J0ZWRJbnNlcnQsIGl0ZW0uYXJpYUxhYmVsKSk7XG5cbiAgICB0aGlzLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBuZXdJdGVtcy5maWx0ZXIoKGkpID0+IGkua2V5ID09PSBpdGVtLmtleSkubGVuZ3RoID09PSAwKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IHRoaXMucmVtb3ZlSXRlbShpdGVtLmtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIGl0ZW1zIGZyb20gdGhpcyBzZWxlY3Rvci5cbiAgICovXG4gIGNsZWFySXRlbXMoKSB7XG4gICAgLy8gbG9jYWwgY29weSBmb3IgaXRlcmF0aW9uIGFmdGVyIGNsZWFyXG4gICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICAvLyBjbGVhciBpdGVtc1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcblxuICAgIC8vIGNsZWFyIHRoZSBzZWxlY3Rpb24gYXMgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgYWxzbyByZW1vdmVkXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xuXG4gICAgLy8gZmlyZSBldmVudHNcbiAgICBmb3IgKGxldCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICB0aGlzLm9uSXRlbVJlbW92ZWRFdmVudChpdGVtLmtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIHNlbGVjdG9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgaXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaXRlbXMpLmxlbmd0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkl0ZW1BZGRlZEV2ZW50KGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5saXN0U2VsZWN0b3JFdmVudHMub25JdGVtQWRkZWQuZGlzcGF0Y2godGhpcywga2V5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkl0ZW1SZW1vdmVkRXZlbnQoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmxpc3RTZWxlY3RvckV2ZW50cy5vbkl0ZW1SZW1vdmVkLmRpc3BhdGNoKHRoaXMsIGtleSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JdGVtU2VsZWN0ZWRFdmVudChrZXk6IHN0cmluZykge1xuICAgIHRoaXMubGlzdFNlbGVjdG9yRXZlbnRzLm9uSXRlbVNlbGVjdGVkLmRpc3BhdGNoKHRoaXMsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIGFuIGl0ZW0gaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMuXG4gICAqIEByZXR1cm5zIHtFdmVudDxMaXN0U2VsZWN0b3I8Q29uZmlnPiwgc3RyaW5nPn1cbiAgICovXG4gIGdldCBvbkl0ZW1BZGRlZCgpOiBFdmVudDxMaXN0U2VsZWN0b3I8Q29uZmlnPiwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubGlzdFNlbGVjdG9yRXZlbnRzLm9uSXRlbUFkZGVkLmdldEV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIGFuIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGl0ZW1zLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8TGlzdFNlbGVjdG9yPENvbmZpZz4sIHN0cmluZz59XG4gICAqL1xuICBnZXQgb25JdGVtUmVtb3ZlZCgpOiBFdmVudDxMaXN0U2VsZWN0b3I8Q29uZmlnPiwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubGlzdFNlbGVjdG9yRXZlbnRzLm9uSXRlbVJlbW92ZWQuZ2V0RXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0IG9mIGl0ZW1zLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8TGlzdFNlbGVjdG9yPENvbmZpZz4sIHN0cmluZz59XG4gICAqL1xuICBnZXQgb25JdGVtU2VsZWN0ZWQoKTogRXZlbnQ8TGlzdFNlbGVjdG9yPENvbmZpZz4sIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmxpc3RTZWxlY3RvckV2ZW50cy5vbkl0ZW1TZWxlY3RlZC5nZXRFdmVudCgpO1xuICB9XG59IiwiaW1wb3J0IHtMYWJlbENvbmZpZywgTGFiZWx9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbi8qKlxuICogRW51bWVyYXRlcyB0aGUgdHlwZXMgb2YgY29udGVudCB0aGF0IHRoZSB7QGxpbmsgTWV0YWRhdGFMYWJlbH0gY2FuIGRpc3BsYXkuXG4gKi9cbmV4cG9ydCBlbnVtIE1ldGFkYXRhTGFiZWxDb250ZW50IHtcbiAgLyoqXG4gICAqIFRpdGxlIG9mIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIFRpdGxlLFxuICAvKipcbiAgICogRGVzY3JpcHRpb24gZm8gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgRGVzY3JpcHRpb24sXG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHtAbGluayBNZXRhZGF0YUxhYmVsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUxhYmVsQ29uZmlnIGV4dGVuZHMgTGFiZWxDb25maWcge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgY29udGVudCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxhYmVsLlxuICAgKi9cbiAgY29udGVudDogTWV0YWRhdGFMYWJlbENvbnRlbnQ7XG59XG5cbi8qKlxuICogQSBsYWJlbCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHRvIGRpc3BsYXkgY2VydGFpbiBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1ldGFkYXRhTGFiZWwgZXh0ZW5kcyBMYWJlbDxNZXRhZGF0YUxhYmVsQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBNZXRhZGF0YUxhYmVsQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsnbGFiZWwtbWV0YWRhdGEnLCAnbGFiZWwtbWV0YWRhdGEtJyArIE1ldGFkYXRhTGFiZWxDb250ZW50W2NvbmZpZy5jb250ZW50XS50b0xvd2VyQ2FzZSgpXSxcbiAgICB9IGFzIE1ldGFkYXRhTGFiZWxDb25maWcsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBsZXQgdWljb25maWcgPSB1aW1hbmFnZXIuZ2V0Q29uZmlnKCk7XG5cbiAgICBsZXQgaW5pdCA9ICgpID0+IHtcbiAgICAgIHN3aXRjaCAoY29uZmlnLmNvbnRlbnQpIHtcbiAgICAgICAgY2FzZSBNZXRhZGF0YUxhYmVsQ29udGVudC5UaXRsZTpcbiAgICAgICAgICB0aGlzLnNldFRleHQodWljb25maWcubWV0YWRhdGEudGl0bGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE1ldGFkYXRhTGFiZWxDb250ZW50LkRlc2NyaXB0aW9uOlxuICAgICAgICAgIHRoaXMuc2V0VGV4dCh1aWNvbmZpZy5tZXRhZGF0YS5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCB1bmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldFRleHQobnVsbCk7XG4gICAgfTtcblxuICAgIC8vIEluaXQgbGFiZWxcbiAgICBpbml0KCk7XG4gICAgLy8gQ2xlYXIgbGFiZWxzIHdoZW4gc291cmNlIGlzIHVubG9hZGVkXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZVVubG9hZGVkLCB1bmxvYWQpO1xuXG4gICAgdWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKGluaXQpO1xuICB9XG59IiwiaW1wb3J0IHtUb2dnbGVCdXR0b24sIFRvZ2dsZUJ1dHRvbkNvbmZpZ30gZnJvbSAnLi90b2dnbGVidXR0b24nO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgYnV0dG9uIHRoYXQgdG9nZ2xlcyBBcHBsZSBtYWNPUyBwaWN0dXJlLWluLXBpY3R1cmUgbW9kZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBpY3R1cmVJblBpY3R1cmVUb2dnbGVCdXR0b24gZXh0ZW5kcyBUb2dnbGVCdXR0b248VG9nZ2xlQnV0dG9uQ29uZmlnPiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBUb2dnbGVCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXBpcHRvZ2dsZWJ1dHRvbicsXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcigncGljdHVyZUluUGljdHVyZScpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBjb25zdCBpc1BpY3R1cmVJblBpY3R1cmVBdmFpbGFibGUgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gcGxheWVyLmlzVmlld01vZGVBdmFpbGFibGUocGxheWVyLmV4cG9ydHMuVmlld01vZGUuUGljdHVyZUluUGljdHVyZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBpY3R1cmVJblBpY3R1cmVTdGF0ZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBwbGF5ZXIuZ2V0Vmlld01vZGUoKSA9PT0gcGxheWVyLmV4cG9ydHMuVmlld01vZGUuUGljdHVyZUluUGljdHVyZSA/IHRoaXMub24oKSA6IHRoaXMub2ZmKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBpY3R1cmVJblBpY3R1cmVBdmFpbGFiaWxpdHlDaGFuZ2VkSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlzUGljdHVyZUluUGljdHVyZUF2YWlsYWJsZSgpID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlZpZXdNb2RlQ2hhbmdlZCwgcGljdHVyZUluUGljdHVyZVN0YXRlSGFuZGxlcik7XG5cbiAgICAvLyBBdmFpbGFibGUgb25seSBpbiBvdXIgbmF0aXZlIFNES3MgZm9yIG5vd1xuICAgIGlmICgocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQgYXMgYW55KS5WaWV3TW9kZUF2YWlsYWJpbGl0eUNoYW5nZWQpIHtcbiAgICAgIHBsYXllci5vbihcbiAgICAgICAgKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50IGFzIGFueSkuVmlld01vZGVBdmFpbGFiaWxpdHlDaGFuZ2VkLFxuICAgICAgICBwaWN0dXJlSW5QaWN0dXJlQXZhaWxhYmlsaXR5Q2hhbmdlZEhhbmRsZXIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZShwaWN0dXJlSW5QaWN0dXJlQXZhaWxhYmlsaXR5Q2hhbmdlZEhhbmRsZXIpO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoIWlzUGljdHVyZUluUGljdHVyZUF2YWlsYWJsZSgpKSB7XG4gICAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1BJUCB1bmF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0Vmlld01vZGUgPVxuICAgICAgICBwbGF5ZXIuZ2V0Vmlld01vZGUoKSA9PT0gcGxheWVyLmV4cG9ydHMuVmlld01vZGUuUGljdHVyZUluUGljdHVyZVxuICAgICAgICAgID8gcGxheWVyLmV4cG9ydHMuVmlld01vZGUuSW5saW5lXG4gICAgICAgICAgOiBwbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5QaWN0dXJlSW5QaWN0dXJlO1xuXG4gICAgICBwbGF5ZXIuc2V0Vmlld01vZGUodGFyZ2V0Vmlld01vZGUpO1xuICAgIH0pO1xuXG4gICAgLy8gU3RhcnR1cCBpbml0XG4gICAgcGljdHVyZUluUGljdHVyZUF2YWlsYWJpbGl0eUNoYW5nZWRIYW5kbGVyKCk7IC8vIEhpZGUgYnV0dG9uIGlmIFBJUCBub3QgYXZhaWxhYmxlXG4gICAgcGljdHVyZUluUGljdHVyZVN0YXRlSGFuZGxlcigpO1xuICB9XG59XG4iLCJpbXBvcnQge1NlbGVjdEJveH0gZnJvbSAnLi9zZWxlY3Rib3gnO1xuaW1wb3J0IHtMaXN0U2VsZWN0b3JDb25maWd9IGZyb20gJy4vbGlzdHNlbGVjdG9yJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIHNlbGVjdCBib3ggcHJvdmlkaW5nIGEgc2VsZWN0aW9uIG9mIGRpZmZlcmVudCBwbGF5YmFjayBzcGVlZHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGF5YmFja1NwZWVkU2VsZWN0Qm94IGV4dGVuZHMgU2VsZWN0Qm94IHtcbiAgcHJvdGVjdGVkIGRlZmF1bHRQbGF5YmFja1NwZWVkczogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBMaXN0U2VsZWN0b3JDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgdGhpcy5kZWZhdWx0UGxheWJhY2tTcGVlZHMgPSBbMC4yNSwgMC41LCAxLCAxLjUsIDJdO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3NlczogWyd1aS1wbGF5YmFja3NwZWVkc2VsZWN0Ym94J10sXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEl0ZW1zKCk7XG5cbiAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoc2VuZGVyOiBQbGF5YmFja1NwZWVkU2VsZWN0Qm94LCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBwbGF5ZXIuc2V0UGxheWJhY2tTcGVlZChwYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0odmFsdWUpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2V0RGVmYXVsdFZhbHVlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgcGxheWJhY2tTcGVlZCA9IHBsYXllci5nZXRQbGF5YmFja1NwZWVkKCk7XG4gICAgICB0aGlzLnNldFNwZWVkKHBsYXliYWNrU3BlZWQpO1xuICAgIH07XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWJhY2tTcGVlZENoYW5nZWQsIHNldERlZmF1bHRWYWx1ZSk7XG4gICAgdWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKHNldERlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICBzZXRTcGVlZChzcGVlZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdEl0ZW0oU3RyaW5nKHNwZWVkKSkpIHtcbiAgICAgIC8vIGEgcGxheWJhY2sgc3BlZWQgd2FzIHNldCB3aGljaCBpcyBub3QgaW4gdGhlIGxpc3QsIGFkZCBpdCB0byB0aGUgbGlzdCB0byBzaG93IGl0IHRvIHRoZSB1c2VyXG4gICAgICB0aGlzLmNsZWFySXRlbXMoKTtcbiAgICAgIHRoaXMuYWRkRGVmYXVsdEl0ZW1zKFtzcGVlZF0pO1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKFN0cmluZyhzcGVlZCkpO1xuICAgIH1cbiAgfVxuXG4gIGFkZERlZmF1bHRJdGVtcyhjdXN0b21JdGVtczogbnVtYmVyW10gPSBbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNvcnRlZFNwZWVkcyA9IHRoaXMuZGVmYXVsdFBsYXliYWNrU3BlZWRzLmNvbmNhdChjdXN0b21JdGVtcykuc29ydCgpO1xuXG4gICAgc29ydGVkU3BlZWRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudCAhPT0gMSkge1xuICAgICAgICB0aGlzLmFkZEl0ZW0oU3RyaW5nKGVsZW1lbnQpLCBgJHtlbGVtZW50fXhgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkSXRlbShTdHJpbmcoZWxlbWVudCksIGkxOG4uZ2V0TG9jYWxpemVyKCdub3JtYWwnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbGVhckl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XG4gIH1cbn0iLCJpbXBvcnQge0xhYmVsQ29uZmlnLCBMYWJlbH0gZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IExpdmVTdHJlYW1EZXRlY3RvckV2ZW50QXJncyA9IFBsYXllclV0aWxzLkxpdmVTdHJlYW1EZXRlY3RvckV2ZW50QXJncztcbmltcG9ydCB7UGxheWVyVXRpbHN9IGZyb20gJy4uL3BsYXllcnV0aWxzJztcbmltcG9ydCB7U3RyaW5nVXRpbHN9IGZyb20gJy4uL3N0cmluZ3V0aWxzJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG5leHBvcnQgZW51bSBQbGF5YmFja1RpbWVMYWJlbE1vZGUge1xuICAvKipcbiAgICogRGlzcGxheXMgdGhlIGN1cnJlbnQgdGltZVxuICAgKi9cbiAgQ3VycmVudFRpbWUsXG4gIC8qKlxuICAgKiBEaXNwbGF5cyB0aGUgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnRcbiAgICovXG4gIFRvdGFsVGltZSxcbiAgLyoqXG4gICAqIERpc3BsYXlzIHRoZSBjdXJyZW50IHRpbWUgYW5kIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29udGVudFxuICAgKiBGb3JtYXQ6ICR7Y3VycmVudFRpbWV9IC8gJHt0b3RhbFRpbWV9XG4gICAqL1xuICBDdXJyZW50QW5kVG90YWxUaW1lLFxuICAvKipcbiAgICogRGlzcGxheXMgdGhlIHJlbWFpbmluZyB0aW1lIG9mIHRoZSBjb250ZW50XG4gICAqL1xuICBSZW1haW5pbmdUaW1lLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXliYWNrVGltZUxhYmVsQ29uZmlnIGV4dGVuZHMgTGFiZWxDb25maWcge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygd2hpY2ggdGltZSBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBsYWJlbC5cbiAgICogRGVmYXVsdDogUGxheWJhY2tUaW1lTGFiZWxNb2RlLkN1cnJlbnRBbmRUb3RhbFRpbWVcbiAgICovXG4gIHRpbWVMYWJlbE1vZGU/OiBQbGF5YmFja1RpbWVMYWJlbE1vZGU7XG4gIC8qKlxuICAgKiBCb29sZWFuIGlmIHRoZSBsYWJlbCBzaG91bGQgYmUgaGlkZGVuIGluIGxpdmUgcGxheWJhY2tcbiAgICovXG4gIGhpZGVJbkxpdmVQbGF5YmFjaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBsYWJlbCB0aGF0IGRpc3BsYXkgdGhlIGN1cnJlbnQgcGxheWJhY2sgdGltZSBhbmQgdGhlIHRvdGFsIHRpbWUgdGhyb3VnaCB7QGxpbmsgUGxheWJhY2tUaW1lTGFiZWwjc2V0VGltZSBzZXRUaW1lfVxuICogb3IgYW55IHN0cmluZyB0aHJvdWdoIHtAbGluayBQbGF5YmFja1RpbWVMYWJlbCNzZXRUZXh0IHNldFRleHR9LlxuICovXG5leHBvcnQgY2xhc3MgUGxheWJhY2tUaW1lTGFiZWwgZXh0ZW5kcyBMYWJlbDxQbGF5YmFja1RpbWVMYWJlbENvbmZpZz4ge1xuXG4gIHByaXZhdGUgdGltZUZvcm1hdDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGxheWJhY2tUaW1lTGFiZWxDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCA8UGxheWJhY2tUaW1lTGFiZWxDb25maWc+e1xuICAgICAgY3NzQ2xhc3M6ICd1aS1wbGF5YmFja3RpbWVsYWJlbCcsXG4gICAgICB0aW1lTGFiZWxNb2RlOiBQbGF5YmFja1RpbWVMYWJlbE1vZGUuQ3VycmVudEFuZFRvdGFsVGltZSxcbiAgICAgIGhpZGVJbkxpdmVQbGF5YmFjazogZmFsc2UsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIGxldCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGxldCBsaXZlID0gZmFsc2U7XG4gICAgbGV0IGxpdmVDc3NDbGFzcyA9IHRoaXMucHJlZml4Q3NzKCd1aS1wbGF5YmFja3RpbWVsYWJlbC1saXZlJyk7XG4gICAgbGV0IGxpdmVFZGdlQ3NzQ2xhc3MgPSB0aGlzLnByZWZpeENzcygndWktcGxheWJhY2t0aW1lbGFiZWwtbGl2ZS1lZGdlJyk7XG4gICAgbGV0IG1pbldpZHRoID0gMDtcblxuICAgIGxldCBsaXZlQ2xpY2tIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgcGxheWVyLnRpbWVTaGlmdCgwKTtcbiAgICB9O1xuXG4gICAgbGV0IHVwZGF0ZUxpdmVTdGF0ZSA9ICgpID0+IHtcbiAgICAgIC8vIFBsYXllciBpcyBwbGF5aW5nIGEgbGl2ZSBzdHJlYW0gd2hlbiB0aGUgZHVyYXRpb24gaXMgaW5maW5pdGVcbiAgICAgIGxpdmUgPSBwbGF5ZXIuaXNMaXZlKCk7XG5cbiAgICAgIC8vIEF0dGFjaC9kZXRhY2ggbGl2ZSBtYXJrZXIgY2xhc3NcbiAgICAgIGlmIChsaXZlKSB7XG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmFkZENsYXNzKGxpdmVDc3NDbGFzcyk7XG4gICAgICAgIHRoaXMuc2V0VGV4dChpMThuLmdldExvY2FsaXplcignbGl2ZScpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5oaWRlSW5MaXZlUGxheWJhY2spIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKGxpdmVDbGlja0hhbmRsZXIpO1xuICAgICAgICB1cGRhdGVMaXZlVGltZXNoaWZ0U3RhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKGxpdmVDc3NDbGFzcyk7XG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKGxpdmVFZGdlQ3NzQ2xhc3MpO1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgdGhpcy5vbkNsaWNrLnVuc3Vic2NyaWJlKGxpdmVDbGlja0hhbmRsZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgdXBkYXRlTGl2ZVRpbWVzaGlmdFN0YXRlID0gKCkgPT4ge1xuICAgICAgaWYgKCFsaXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHBsYXllciBpcyBvbmx5IGF0IHRoZSBsaXZlIGVkZ2UgaWZmIHRoZSBzdHJlYW0gaXMgbm90IHNoaWZ0ZWQgYW5kIGl0IGlzIGFjdHVhbGx5IHBsYXlpbmcgb3IgcGxheWJhY2sgaGFzXG4gICAgICAvLyBuZXZlciBiZWVuIHN0YXJ0ZWQgKG1lYW5pbmcgaXQgaXNuJ3QgcGF1c2VkKS4gQSBwbGF5ZXIgdGhhdCBpcyBwYXVzZWQgaXMgYWx3YXlzIGJlaGluZCB0aGUgbGl2ZSBlZGdlLlxuICAgICAgLy8gQW4gZXhjZXB0aW9uIGlzIG1hZGUgZm9yIGxpdmUgc3RyZWFtcyB3aXRob3V0IGEgdGltZXNoaWZ0IHdpbmRvdywgYmVjYXVzZSBoZXJlIHdlIFwic3RvcFwiIHBsYXliYWNrIGluc3RlYWRcbiAgICAgIC8vIG9mIHBhdXNpbmcgaXQgKGZyb20gYSBVSSBwZXJzcGVjdGl2ZSksIHNvIHdlIGtlZXAgdGhlIGxpdmUgZWRnZSBpbmRpY2F0b3Igb24gYmVjYXVzZSBhIHBsYXkgd291bGQgYWx3YXlzXG4gICAgICAvLyByZXN1bWUgYXQgdGhlIGxpdmUgZWRnZS5cbiAgICAgIGNvbnN0IGlzVGltZXNoaWZ0ZWQgPSBwbGF5ZXIuZ2V0VGltZVNoaWZ0KCkgPCAwO1xuICAgICAgY29uc3QgaXNUaW1lc2hpZnRBdmFpbGFibGUgPSBwbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCkgPCAwO1xuICAgICAgaWYgKCFpc1RpbWVzaGlmdGVkICYmICghcGxheWVyLmlzUGF1c2VkKCkgfHwgIWlzVGltZXNoaWZ0QXZhaWxhYmxlKSkge1xuICAgICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyhsaXZlRWRnZUNzc0NsYXNzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKGxpdmVFZGdlQ3NzQ2xhc3MpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgbGl2ZVN0cmVhbURldGVjdG9yID0gbmV3IFBsYXllclV0aWxzLkxpdmVTdHJlYW1EZXRlY3RvcihwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgbGl2ZVN0cmVhbURldGVjdG9yLm9uTGl2ZUNoYW5nZWQuc3Vic2NyaWJlKChzZW5kZXIsIGFyZ3M6IExpdmVTdHJlYW1EZXRlY3RvckV2ZW50QXJncykgPT4ge1xuICAgICAgbGl2ZSA9IGFyZ3MubGl2ZTtcbiAgICAgIHVwZGF0ZUxpdmVTdGF0ZSgpO1xuICAgIH0pO1xuICAgIGxpdmVTdHJlYW1EZXRlY3Rvci5kZXRlY3QoKTsgLy8gSW5pdGlhbCBkZXRlY3Rpb25cblxuICAgIGxldCBwbGF5YmFja1RpbWVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgaWYgKCFsaXZlICYmIHBsYXllci5nZXREdXJhdGlvbigpICE9PSBJbmZpbml0eSkge1xuICAgICAgICB0aGlzLnNldFRpbWUoUGxheWVyVXRpbHMuZ2V0Q3VycmVudFRpbWVSZWxhdGl2ZVRvU2Vla2FibGVSYW5nZShwbGF5ZXIpLCBwbGF5ZXIuZ2V0RHVyYXRpb24oKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkICdqdW1waW5nJyBpbiB0aGUgVUkgYnkgdmFyeWluZyBsYWJlbCBzaXplcyBkdWUgdG8gbm9uLW1vbm9zcGFjZWQgZm9udHMsXG4gICAgICAvLyB3ZSBncmFkdWFsbHkgaW5jcmVhc2UgdGhlIG1pbi13aWR0aCB3aXRoIHRoZSBjb250ZW50IHRvIHJlYWNoIGEgc3RhYmxlIHNpemUuXG4gICAgICBsZXQgd2lkdGggPSB0aGlzLmdldERvbUVsZW1lbnQoKS53aWR0aCgpO1xuICAgICAgaWYgKHdpZHRoID4gbWluV2lkdGgpIHtcbiAgICAgICAgbWluV2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuY3NzKHtcbiAgICAgICAgICAnbWluLXdpZHRoJzogbWluV2lkdGggKyAncHgnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlRpbWVDaGFuZ2VkLCBwbGF5YmFja1RpbWVIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU2Vla2VkLCBwbGF5YmFja1RpbWVIYW5kbGVyKTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lU2hpZnQsIHVwZGF0ZUxpdmVUaW1lc2hpZnRTdGF0ZSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlRpbWVTaGlmdGVkLCB1cGRhdGVMaXZlVGltZXNoaWZ0U3RhdGUpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5aW5nLCB1cGRhdGVMaXZlVGltZXNoaWZ0U3RhdGUpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QYXVzZWQsIHVwZGF0ZUxpdmVUaW1lc2hpZnRTdGF0ZSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlN0YWxsU3RhcnRlZCwgdXBkYXRlTGl2ZVRpbWVzaGlmdFN0YXRlKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3RhbGxFbmRlZCwgdXBkYXRlTGl2ZVRpbWVzaGlmdFN0YXRlKTtcblxuICAgIGxldCBpbml0ID0gKCkgPT4ge1xuICAgICAgLy8gUmVzZXQgbWluLXdpZHRoIHdoZW4gYSBuZXcgc291cmNlIGlzIHJlYWR5IChlc3BlY2lhbGx5IGZvciBzd2l0Y2hpbmcgVk9EL0xpdmUgbW9kZXMgd2hlcmUgdGhlIGxhYmVsIGNvbnRlbnRcbiAgICAgIC8vIGNoYW5nZXMpXG4gICAgICBtaW5XaWR0aCA9IDA7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5jc3Moe1xuICAgICAgICAnbWluLXdpZHRoJzogbnVsbCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdGltZSBmb3JtYXQgZGVwZW5kaW5nIG9uIHNvdXJjZSBkdXJhdGlvblxuICAgICAgdGhpcy50aW1lRm9ybWF0ID0gTWF0aC5hYnMocGxheWVyLmlzTGl2ZSgpID8gcGxheWVyLmdldE1heFRpbWVTaGlmdCgpIDogcGxheWVyLmdldER1cmF0aW9uKCkpID49IDM2MDAgP1xuICAgICAgICBTdHJpbmdVdGlscy5GT1JNQVRfSEhNTVNTIDogU3RyaW5nVXRpbHMuRk9STUFUX01NU1M7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aW1lIGFmdGVyIHRoZSBmb3JtYXQgaGFzIGJlZW4gc2V0XG4gICAgICBwbGF5YmFja1RpbWVIYW5kbGVyKCk7XG4gICAgfTtcbiAgICB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUoaW5pdCk7XG5cbiAgICBpbml0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBwbGF5YmFjayB0aW1lIGFuZCB0b3RhbCBkdXJhdGlvbi5cbiAgICogQHBhcmFtIHBsYXliYWNrU2Vjb25kcyB0aGUgY3VycmVudCBwbGF5YmFjayB0aW1lIGluIHNlY29uZHNcbiAgICogQHBhcmFtIGR1cmF0aW9uU2Vjb25kcyB0aGUgdG90YWwgZHVyYXRpb24gaW4gc2Vjb25kc1xuICAgKi9cbiAgc2V0VGltZShwbGF5YmFja1NlY29uZHM6IG51bWJlciwgZHVyYXRpb25TZWNvbmRzOiBudW1iZXIpIHtcbiAgICBsZXQgY3VycmVudFRpbWUgPSBTdHJpbmdVdGlscy5zZWNvbmRzVG9UaW1lKHBsYXliYWNrU2Vjb25kcywgdGhpcy50aW1lRm9ybWF0KTtcbiAgICBsZXQgdG90YWxUaW1lID0gU3RyaW5nVXRpbHMuc2Vjb25kc1RvVGltZShkdXJhdGlvblNlY29uZHMsIHRoaXMudGltZUZvcm1hdCk7XG5cbiAgICBzd2l0Y2ggKCg8UGxheWJhY2tUaW1lTGFiZWxDb25maWc+dGhpcy5jb25maWcpLnRpbWVMYWJlbE1vZGUpIHtcbiAgICAgIGNhc2UgUGxheWJhY2tUaW1lTGFiZWxNb2RlLkN1cnJlbnRUaW1lOlxuICAgICAgICB0aGlzLnNldFRleHQoYCR7Y3VycmVudFRpbWV9YCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQbGF5YmFja1RpbWVMYWJlbE1vZGUuVG90YWxUaW1lOlxuICAgICAgICB0aGlzLnNldFRleHQoYCR7dG90YWxUaW1lfWApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUGxheWJhY2tUaW1lTGFiZWxNb2RlLkN1cnJlbnRBbmRUb3RhbFRpbWU6XG4gICAgICAgIHRoaXMuc2V0VGV4dChgJHtjdXJyZW50VGltZX0gLyAke3RvdGFsVGltZX1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBsYXliYWNrVGltZUxhYmVsTW9kZS5SZW1haW5pbmdUaW1lOlxuICAgICAgICBsZXQgcmVtYWluaW5nVGltZSA9IFN0cmluZ1V0aWxzLnNlY29uZHNUb1RpbWUoZHVyYXRpb25TZWNvbmRzIC0gcGxheWJhY2tTZWNvbmRzLCB0aGlzLnRpbWVGb3JtYXQpO1xuICAgICAgICB0aGlzLnNldFRleHQoYCR7cmVtYWluaW5nVGltZX1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgdGltZSBmb3JtYXRcbiAgICogQHBhcmFtIHRpbWVGb3JtYXQgdGhlIHRpbWUgZm9ybWF0XG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0VGltZUZvcm1hdCh0aW1lRm9ybWF0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVGb3JtYXQgPSB0aW1lRm9ybWF0O1xuICB9XG59XG4iLCJpbXBvcnQge1RvZ2dsZUJ1dHRvbiwgVG9nZ2xlQnV0dG9uQ29uZmlnfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtQbGF5ZXJVdGlsc30gZnJvbSAnLi4vcGxheWVydXRpbHMnO1xuaW1wb3J0IHsgUGxheWVyQVBJLCBXYXJuaW5nRXZlbnQgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IHRvZ2dsZXMgYmV0d2VlbiBwbGF5YmFjayBhbmQgcGF1c2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGF5YmFja1RvZ2dsZUJ1dHRvbiBleHRlbmRzIFRvZ2dsZUJ1dHRvbjxUb2dnbGVCdXR0b25Db25maWc+IHtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTEFTU19TVE9QVE9HR0xFID0gJ3N0b3B0b2dnbGUnO1xuICBwcm90ZWN0ZWQgaXNQbGF5SW5pdGlhdGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogVG9nZ2xlQnV0dG9uQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1wbGF5YmFja3RvZ2dsZWJ1dHRvbicsXG4gICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcigncGxheScpLFxuICAgICAgb25BcmlhTGFiZWw6IGkxOG4uZ2V0TG9jYWxpemVyKCdwYXVzZScpLFxuICAgICAgb2ZmQXJpYUxhYmVsOiBpMThuLmdldExvY2FsaXplcigncGxheScpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcblxuICAgIHRoaXMuaXNQbGF5SW5pdGlhdGVkID0gZmFsc2U7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIsIGhhbmRsZUNsaWNrRXZlbnQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIGxldCBpc1NlZWtpbmcgPSBmYWxzZTtcblxuICAgIC8vIEhhbmRsZXIgdG8gdXBkYXRlIGJ1dHRvbiBzdGF0ZSBiYXNlZCBvbiBwbGF5ZXIgc3RhdGVcbiAgICBsZXQgcGxheWJhY2tTdGF0ZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAvLyBJZiB0aGUgVUkgaXMgY3VycmVudGx5IHNlZWtpbmcsIHBsYXliYWNrIGlzIHRlbXBvcmFyaWx5IHN0b3BwZWQgYnV0IHRoZSBidXR0b25zIHNob3VsZFxuICAgICAgLy8gbm90IHJlZmxlY3QgdGhhdCBhbmQgc3RheSBhcy1pcyAoZS5nIGluZGljYXRlIHBsYXliYWNrIHdoaWxlIHNlZWtpbmcpLlxuICAgICAgaWYgKGlzU2Vla2luZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChwbGF5ZXIuaXNQbGF5aW5nKCkgfHwgdGhpcy5pc1BsYXlJbml0aWF0ZWQpIHtcbiAgICAgICAgdGhpcy5vbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vZmYoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2FsbCBoYW5kbGVyIHVwb24gdGhlc2UgZXZlbnRzXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXksIChlKSA9PiB7XG4gICAgICB0aGlzLmlzUGxheUluaXRpYXRlZCA9IHRydWU7XG4gICAgICBwbGF5YmFja1N0YXRlSGFuZGxlcigpO1xuICAgIH0pO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBhdXNlZCwgKGUpID0+IHtcbiAgICAgIHRoaXMuaXNQbGF5SW5pdGlhdGVkID0gZmFsc2U7XG4gICAgICBwbGF5YmFja1N0YXRlSGFuZGxlcigpO1xuICAgIH0pO1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXlpbmcsIChlKSA9PiB7XG4gICAgICB0aGlzLmlzUGxheUluaXRpYXRlZCA9IGZhbHNlO1xuICAgICAgcGxheWJhY2tTdGF0ZUhhbmRsZXIoKTtcbiAgICB9KTtcbiAgICAvLyBhZnRlciB1bmxvYWRpbmcgKyBsb2FkaW5nIGEgbmV3IHNvdXJjZSwgdGhlIHBsYXllciBtaWdodCBiZSBpbiBhIGRpZmZlcmVudCBwbGF5aW5nIHN0YXRlIChmcm9tIHBsYXlpbmcgaW50byBzdG9wcGVkKVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VMb2FkZWQsIHBsYXliYWNrU3RhdGVIYW5kbGVyKTtcbiAgICB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUocGxheWJhY2tTdGF0ZUhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgcGxheWJhY2tTdGF0ZUhhbmRsZXIpO1xuICAgIC8vIHdoZW4gcGxheWJhY2sgZmluaXNoZXMsIHBsYXllciB0dXJucyB0byBwYXVzZWQgbW9kZVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5YmFja0ZpbmlzaGVkLCBwbGF5YmFja1N0YXRlSGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RTdGFydGVkLCBwbGF5YmFja1N0YXRlSGFuZGxlcik7XG5cbiAgICAvLyBXaGVuIGEgcGxheWJhY2sgYXR0ZW1wdCBpcyByZWplY3RlZCB3aXRoIHdhcm5pbmcgNTAwOCwgd2Ugc3dpdGNoIHRoZSBidXR0b24gc3RhdGUgYmFjayB0byBvZmZcbiAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIGZvciBibG9ja2VkIGF1dG9wbGF5LCBiZWNhdXNlIHRoZXJlIGlzIG5vIFBhdXNlZCBldmVudCBpbiBzdWNoIGNhc2VcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuV2FybmluZywgKGV2ZW50OiBXYXJuaW5nRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5jb2RlID09PSBwbGF5ZXIuZXhwb3J0cy5XYXJuaW5nQ29kZS5QTEFZQkFDS19DT1VMRF9OT1RfQkVfU1RBUlRFRCkge1xuICAgICAgICB0aGlzLmlzUGxheUluaXRpYXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9mZigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdXBkYXRlTGl2ZVN0YXRlID0gKCkgPT4ge1xuICAgICAgY29uc3Qgc2hvd1N0b3BUb2dnbGUgPSBwbGF5ZXIuaXNMaXZlKCkgJiYgIVBsYXllclV0aWxzLmlzVGltZVNoaWZ0QXZhaWxhYmxlKHBsYXllcik7XG5cbiAgICAgIGlmIChzaG93U3RvcFRvZ2dsZSkge1xuICAgICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhQbGF5YmFja1RvZ2dsZUJ1dHRvbi5DTEFTU19TVE9QVE9HR0xFKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhQbGF5YmFja1RvZ2dsZUJ1dHRvbi5DTEFTU19TVE9QVE9HR0xFKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIERldGVjdCBhYnNlbmNlIG9mIHRpbWVzaGlmdGluZyBvbiBsaXZlIHN0cmVhbXMgYW5kIGFkZCB0YWdnaW5nIGNsYXNzIHRvIGNvbnZlcnQgYnV0dG9uIGljb25zIHRvIHBsYXkvc3RvcFxuICAgIGxldCB0aW1lU2hpZnREZXRlY3RvciA9IG5ldyBQbGF5ZXJVdGlscy5UaW1lU2hpZnRBdmFpbGFiaWxpdHlEZXRlY3RvcihwbGF5ZXIpO1xuICAgIGxldCBsaXZlU3RyZWFtRGV0ZWN0b3IgPSBuZXcgUGxheWVyVXRpbHMuTGl2ZVN0cmVhbURldGVjdG9yKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRpbWVTaGlmdERldGVjdG9yLm9uVGltZVNoaWZ0QXZhaWxhYmlsaXR5Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdXBkYXRlTGl2ZVN0YXRlKCkpO1xuICAgIGxpdmVTdHJlYW1EZXRlY3Rvci5vbkxpdmVDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB1cGRhdGVMaXZlU3RhdGUoKSk7XG5cbiAgICB0aW1lU2hpZnREZXRlY3Rvci5kZXRlY3QoKTsgLy8gSW5pdGlhbCBkZXRlY3Rpb25cbiAgICBsaXZlU3RyZWFtRGV0ZWN0b3IuZGV0ZWN0KCk7XG5cbiAgICBpZiAoaGFuZGxlQ2xpY2tFdmVudCkge1xuICAgICAgLy8gQ29udHJvbCBwbGF5ZXIgYnkgYnV0dG9uIGV2ZW50c1xuICAgICAgLy8gV2hlbiBhIGJ1dHRvbiBldmVudCB0cmlnZ2VycyBhIHBsYXllciBBUEkgY2FsbCwgZXZlbnRzIGFyZSBmaXJlZCB3aGljaCBpbiB0dXJuIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXJcbiAgICAgIC8vIGFib3ZlIHRoYXQgdXBkYXRlZCB0aGUgYnV0dG9uIHN0YXRlLlxuICAgICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmIChwbGF5ZXIuaXNQbGF5aW5nKCkgfHwgdGhpcy5pc1BsYXlJbml0aWF0ZWQpIHtcbiAgICAgICAgICBwbGF5ZXIucGF1c2UoJ3VpJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGxheWVyLnBsYXkoJ3VpJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIFVJIHNlZWtpbmcgc3RhdHVzXG4gICAgdWltYW5hZ2VyLm9uU2Vlay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaXNTZWVraW5nID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB1aW1hbmFnZXIub25TZWVrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlzU2Vla2luZyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgLy8gU3RhcnR1cCBpbml0XG4gICAgcGxheWJhY2tTdGF0ZUhhbmRsZXIoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb250YWluZXIsIENvbnRhaW5lckNvbmZpZ30gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHtIdWdlUGxheWJhY2tUb2dnbGVCdXR0b259IGZyb20gJy4vaHVnZXBsYXliYWNrdG9nZ2xlYnV0dG9uJztcblxuLyoqXG4gKiBPdmVybGF5cyB0aGUgcGxheWVyIGFuZCBkaXNwbGF5cyBlcnJvciBtZXNzYWdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsYXliYWNrVG9nZ2xlT3ZlcmxheSBleHRlbmRzIENvbnRhaW5lcjxDb250YWluZXJDb25maWc+IHtcblxuICBwcml2YXRlIHBsYXliYWNrVG9nZ2xlQnV0dG9uOiBIdWdlUGxheWJhY2tUb2dnbGVCdXR0b247XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb250YWluZXJDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLnBsYXliYWNrVG9nZ2xlQnV0dG9uID0gbmV3IEh1Z2VQbGF5YmFja1RvZ2dsZUJ1dHRvbigpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1wbGF5YmFja3RvZ2dsZS1vdmVybGF5JyxcbiAgICAgIGNvbXBvbmVudHM6IFt0aGlzLnBsYXliYWNrVG9nZ2xlQnV0dG9uXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cbn0iLCJpbXBvcnQge0NvbnRhaW5lckNvbmZpZywgQ29udGFpbmVyfSBmcm9tICcuL2NvbnRhaW5lcic7XG5pbXBvcnQge0NvbXBvbmVudCwgQ29tcG9uZW50Q29uZmlnfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQge0RPTX0gZnJvbSAnLi4vZG9tJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1N0cmluZ1V0aWxzfSBmcm9tICcuLi9zdHJpbmd1dGlscyc7XG5pbXBvcnQge0h1Z2VSZXBsYXlCdXR0b259IGZyb20gJy4vaHVnZXJlcGxheWJ1dHRvbic7XG5pbXBvcnQgeyBVSVJlY29tbWVuZGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vdWljb25maWcnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcblxuLyoqXG4gKiBPdmVybGF5cyB0aGUgcGxheWVyIGFuZCBkaXNwbGF5cyByZWNvbW1lbmRlZCB2aWRlb3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNvbW1lbmRhdGlvbk92ZXJsYXkgZXh0ZW5kcyBDb250YWluZXI8Q29udGFpbmVyQ29uZmlnPiB7XG5cbiAgcHJpdmF0ZSByZXBsYXlCdXR0b246IEh1Z2VSZXBsYXlCdXR0b247XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDb250YWluZXJDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLnJlcGxheUJ1dHRvbiA9IG5ldyBIdWdlUmVwbGF5QnV0dG9uKCk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXJlY29tbWVuZGF0aW9uLW92ZXJsYXknLFxuICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgY29tcG9uZW50czogW3RoaXMucmVwbGF5QnV0dG9uXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgbGV0IGNsZWFyUmVjb21tZW5kYXRpb25zID0gKCkgPT4ge1xuICAgICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0Q29tcG9uZW50cygpLnNsaWNlKCkpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFJlY29tbWVuZGF0aW9uSXRlbSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50cygpO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoJ3JlY29tbWVuZGF0aW9ucycpKTtcbiAgICB9O1xuXG4gICAgbGV0IHNldHVwUmVjb21tZW5kYXRpb25zID0gKCkgPT4ge1xuICAgICAgY2xlYXJSZWNvbW1lbmRhdGlvbnMoKTtcblxuICAgICAgY29uc3QgcmVjb21tZW5kYXRpb25zID0gdWltYW5hZ2VyLmdldENvbmZpZygpLnJlY29tbWVuZGF0aW9ucztcblxuICAgICAgaWYgKHJlY29tbWVuZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBpbmRleCA9IDE7XG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgcmVjb21tZW5kYXRpb25zKSB7XG4gICAgICAgICAgdGhpcy5hZGRDb21wb25lbnQobmV3IFJlY29tbWVuZGF0aW9uSXRlbSh7XG4gICAgICAgICAgICBpdGVtQ29uZmlnOiBpdGVtLFxuICAgICAgICAgICAgY3NzQ2xhc3NlczogWydyZWNvbW1lbmRhdGlvbi1pdGVtLScgKyAoaW5kZXgrKyldLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudHMoKTsgLy8gY3JlYXRlIGNvbnRhaW5lciBET00gZWxlbWVudHNcblxuICAgICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyh0aGlzLnByZWZpeENzcygncmVjb21tZW5kYXRpb25zJykpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUoc2V0dXBSZWNvbW1lbmRhdGlvbnMpO1xuICAgIC8vIFJlbW92ZSByZWNvbW1lbmRhdGlvbnMgYW5kIGhpZGUgb3ZlcmxheSB3aGVuIHNvdXJjZSBpcyB1bmxvYWRlZFxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgKCkgPT4ge1xuICAgICAgY2xlYXJSZWNvbW1lbmRhdGlvbnMoKTtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0pO1xuICAgIC8vIERpc3BsYXkgcmVjb21tZW5kYXRpb25zIHdoZW4gcGxheWJhY2sgaGFzIGZpbmlzaGVkXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBsYXliYWNrRmluaXNoZWQsICgpID0+IHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH0pO1xuICAgIC8vIEhpZGUgcmVjb21tZW5kYXRpb25zIHdoZW4gcGxheWJhY2sgc3RhcnRzLCBlLmcuIGEgcmVzdGFydFxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCAoKSA9PiB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEluaXQgb24gc3RhcnR1cFxuICAgIHNldHVwUmVjb21tZW5kYXRpb25zKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIHtAbGluayBSZWNvbW1lbmRhdGlvbkl0ZW19XG4gKi9cbmludGVyZmFjZSBSZWNvbW1lbmRhdGlvbkl0ZW1Db25maWcgZXh0ZW5kcyBDb21wb25lbnRDb25maWcge1xuICBpdGVtQ29uZmlnOiBVSVJlY29tbWVuZGF0aW9uQ29uZmlnO1xufVxuXG4vKipcbiAqIEFuIGl0ZW0gb2YgdGhlIHtAbGluayBSZWNvbW1lbmRhdGlvbk92ZXJsYXl9LiBVc2VkIG9ubHkgaW50ZXJuYWxseSBpbiB7QGxpbmsgUmVjb21tZW5kYXRpb25PdmVybGF5fS5cbiAqL1xuY2xhc3MgUmVjb21tZW5kYXRpb25JdGVtIGV4dGVuZHMgQ29tcG9uZW50PFJlY29tbWVuZGF0aW9uSXRlbUNvbmZpZz4ge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUmVjb21tZW5kYXRpb25JdGVtQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktcmVjb21tZW5kYXRpb24taXRlbScsXG4gICAgICBpdGVtQ29uZmlnOiBudWxsLCAvLyB0aGlzIG11c3QgYmUgcGFzc2VkIGluIGZyb20gb3V0c2lkZVxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b0RvbUVsZW1lbnQoKTogRE9NIHtcbiAgICBsZXQgY29uZmlnID0gdGhpcy5jb25maWcuaXRlbUNvbmZpZztcblxuICAgIGxldCBpdGVtRWxlbWVudCA9IG5ldyBET00oJ2EnLCB7XG4gICAgICAnaWQnOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICdjbGFzcyc6IHRoaXMuZ2V0Q3NzQ2xhc3NlcygpLFxuICAgICAgJ2hyZWYnOiBjb25maWcudXJsLFxuICAgIH0pLmNzcyh7ICdiYWNrZ3JvdW5kLWltYWdlJzogYHVybCgke2NvbmZpZy50aHVtYm5haWx9KWAgfSk7XG5cbiAgICBsZXQgYmdFbGVtZW50ID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ2JhY2tncm91bmQnKSxcbiAgICB9KTtcbiAgICBpdGVtRWxlbWVudC5hcHBlbmQoYmdFbGVtZW50KTtcblxuICAgIGxldCB0aXRsZUVsZW1lbnQgPSBuZXcgRE9NKCdzcGFuJywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ3RpdGxlJyksXG4gICAgfSkuYXBwZW5kKG5ldyBET00oJ3NwYW4nLCB7XG4gICAgICAnY2xhc3MnOiB0aGlzLnByZWZpeENzcygnaW5uZXJ0aXRsZScpLFxuICAgIH0pLmh0bWwoY29uZmlnLnRpdGxlKSk7XG4gICAgaXRlbUVsZW1lbnQuYXBwZW5kKHRpdGxlRWxlbWVudCk7XG5cbiAgICBsZXQgdGltZUVsZW1lbnQgPSBuZXcgRE9NKCdzcGFuJywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ2R1cmF0aW9uJyksXG4gICAgfSkuYXBwZW5kKG5ldyBET00oJ3NwYW4nLCB7XG4gICAgICAnY2xhc3MnOiB0aGlzLnByZWZpeENzcygnaW5uZXJkdXJhdGlvbicpLFxuICAgIH0pLmh0bWwoY29uZmlnLmR1cmF0aW9uID8gU3RyaW5nVXRpbHMuc2Vjb25kc1RvVGltZShjb25maWcuZHVyYXRpb24pIDogJycpKTtcbiAgICBpdGVtRWxlbWVudC5hcHBlbmQodGltZUVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGl0ZW1FbGVtZW50O1xuICB9XG59IiwiaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRDb25maWcgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBET00gfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHsgRXZlbnQsIEV2ZW50RGlzcGF0Y2hlciwgTm9BcmdzIH0gZnJvbSAnLi4vZXZlbnRkaXNwYXRjaGVyJztcbmltcG9ydCB7IFNlZWtCYXJMYWJlbCB9IGZyb20gJy4vc2Vla2JhcmxhYmVsJztcbmltcG9ydCB7IFVJSW5zdGFuY2VNYW5hZ2VyLCBTZWVrUHJldmlld0FyZ3MgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgVGltZW91dCB9IGZyb20gJy4uL3RpbWVvdXQnO1xuaW1wb3J0IHsgUGxheWVyVXRpbHMgfSBmcm9tICcuLi9wbGF5ZXJ1dGlscyc7XG5pbXBvcnQgVGltZVNoaWZ0QXZhaWxhYmlsaXR5Q2hhbmdlZEFyZ3MgPSBQbGF5ZXJVdGlscy5UaW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkQXJncztcbmltcG9ydCBMaXZlU3RyZWFtRGV0ZWN0b3JFdmVudEFyZ3MgPSBQbGF5ZXJVdGlscy5MaXZlU3RyZWFtRGV0ZWN0b3JFdmVudEFyZ3M7XG5pbXBvcnQgeyBUaW1lbGluZU1hcmtlciB9IGZyb20gJy4uL3VpY29uZmlnJztcbmltcG9ydCB7IFBsYXllckFQSSwgUGxheWVyRXZlbnRCYXNlIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IFN0cmluZ1V0aWxzIH0gZnJvbSAnLi4vc3RyaW5ndXRpbHMnO1xuaW1wb3J0IHsgU2Vla0JhclR5cGUsIFNlZWtCYXJDb250cm9sbGVyIH0gZnJvbSAnLi9zZWVrYmFyY29udHJvbGxlcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuaW1wb3J0IHsgQnJvd3NlclV0aWxzIH0gZnJvbSAnLi4vYnJvd3NlcnV0aWxzJztcbmltcG9ydCB7IFRpbWVsaW5lTWFya2Vyc0hhbmRsZXIgfSBmcm9tICcuL3RpbWVsaW5lbWFya2Vyc2hhbmRsZXInO1xuaW1wb3J0IHsgZ2V0TWluQnVmZmVyTGV2ZWwgfSBmcm9tICcuL3NlZWtiYXJidWZmZXJsZXZlbCc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgU2Vla0Jhcn0gY29tcG9uZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlZWtCYXJDb25maWcgZXh0ZW5kcyBDb21wb25lbnRDb25maWcge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGFib3ZlIHRoZSBzZWVrIHBvc2l0aW9uLlxuICAgKi9cbiAgbGFiZWw/OiBTZWVrQmFyTGFiZWw7XG4gIC8qKlxuICAgKiBCYXIgd2lsbCBiZSB2ZXJ0aWNhbCBpbnN0ZWFkIG9mIGhvcml6b250YWwgaWYgc2V0IHRvIHRydWUuXG4gICAqL1xuICB2ZXJ0aWNhbD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGluIHdoaWNoIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBvbiB0aGUgc2VlayBiYXIgd2lsbCBiZSB1cGRhdGVkLiBUaGUgc2hvcnRlciB0aGVcbiAgICogaW50ZXJ2YWwsIHRoZSBzbW9vdGhlciBpdCBsb29rcyBhbmQgdGhlIG1vcmUgcmVzb3VyY2UgaW50ZW5zZSBpdCBpcy4gVGhlIHVwZGF0ZSBpbnRlcnZhbCB3aWxsIGJlIGtlcHQgYXMgc3RlYWR5XG4gICAqIGFzIHBvc3NpYmxlIHRvIGF2b2lkIGppdHRlci5cbiAgICogU2V0IHRvIC0xIHRvIGRpc2FibGUgc21vb3RoIHVwZGF0aW5nIGFuZCB1cGRhdGUgaXQgb24gcGxheWVyIFRpbWVDaGFuZ2VkIGV2ZW50cyBpbnN0ZWFkLlxuICAgKiBEZWZhdWx0OiA1MCAoNTBtcyA9IDIwZnBzKS5cbiAgICovXG4gIHNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVJbnRlcnZhbE1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBzZWVrQmFyIGNvbnRyb2wgaW5jcmVtZW50cyBhbmQgZGVjcmVtZW50c1xuICAgKi9cbiAga2V5U3RlcEluY3JlbWVudHM/OiB7IGxlZnRSaWdodDogbnVtYmVyLCB1cERvd246IG51bWJlciB9O1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBzZWVrQmFyIG1hcmtlciBzbmFwcGluZyByYW5nZSBwZXJjZW50YWdlXG4gICAqL1xuICBzbmFwcGluZ1JhbmdlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGVuYWJsZS9kaXNhYmxlIHNlZWsgcHJldmlld1xuICAgKi9cbiAgZW5hYmxlU2Vla1ByZXZpZXc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEV2ZW50IGFyZ3VtZW50IGludGVyZmFjZSBmb3IgYSBzZWVrIHByZXZpZXcgZXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vla1ByZXZpZXdFdmVudEFyZ3MgZXh0ZW5kcyBTZWVrUHJldmlld0FyZ3Mge1xuICAvKipcbiAgICogVGVsbHMgaWYgdGhlIHNlZWsgcHJldmlldyBldmVudCBjb21lcyBmcm9tIGEgc2NydWJiaW5nLlxuICAgKi9cbiAgc2NydWJiaW5nOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlZWtCYXJNYXJrZXIge1xuICBtYXJrZXI6IFRpbWVsaW5lTWFya2VyO1xuICBwb3NpdGlvbjogbnVtYmVyO1xuICBkdXJhdGlvbj86IG51bWJlcjtcbiAgZWxlbWVudD86IERPTTtcbn1cblxuLyoqXG4gKiBBIHNlZWsgYmFyIHRvIHNlZWsgd2l0aGluIHRoZSBwbGF5ZXIncyBtZWRpYS4gSXQgZGlzcGxheXMgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24sIGFtb3VudCBvZiBidWZmZWQgZGF0YSwgc2Vla1xuICogdGFyZ2V0LCBhbmQga2VlcHMgc3RhdHVzIGFib3V0IGFuIG9uZ29pbmcgc2Vlay5cbiAqXG4gKiBUaGUgc2VlayBiYXIgZGlzcGxheXMgZGlmZmVyZW50ICdiYXJzJzpcbiAqICAtIHRoZSBwbGF5YmFjayBwb3NpdGlvbiwgaS5lLiB0aGUgcG9zaXRpb24gaW4gdGhlIG1lZGlhIGF0IHdoaWNoIHRoZSBwbGF5ZXIgY3VycmVudCBwbGF5YmFjayBwb2ludGVyIGlzIHBvc2l0aW9uZWRcbiAqICAtIHRoZSBidWZmZXIgcG9zaXRpb24sIHdoaWNoIHVzdWFsbHkgaXMgdGhlIHBsYXliYWNrIHBvc2l0aW9uIHBsdXMgdGhlIHRpbWUgc3BhbiB0aGF0IGlzIGFscmVhZHkgYnVmZmVyZWQgYWhlYWRcbiAqICAtIHRoZSBzZWVrIHBvc2l0aW9uLCB1c2VkIHRvIHByZXZpZXcgdG8gd2hlcmUgaW4gdGhlIHRpbWVsaW5lIGEgc2VlayB3aWxsIGp1bXAgdG9cbiAqL1xuZXhwb3J0IGNsYXNzIFNlZWtCYXIgZXh0ZW5kcyBDb21wb25lbnQ8U2Vla0JhckNvbmZpZz4ge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU01PT1RIX1BMQVlCQUNLX1BPU0lUSU9OX1VQREFURV9ESVNBQkxFRCA9IC0xO1xuXG4gIC8qKlxuICAgKiBUaGUgQ1NTIGNsYXNzIHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBlbGVtZW50IHdoaWxlIHRoZSBzZWVrIGJhciBpcyBpbiAnc2Vla2luZycgc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTEFTU19TRUVLSU5HID0gJ3NlZWtpbmcnO1xuXG4gIHByaXZhdGUgc2Vla0JhcjogRE9NO1xuICBwcml2YXRlIHNlZWtCYXJQbGF5YmFja1Bvc2l0aW9uOiBET007XG4gIHByaXZhdGUgc2Vla0JhclBsYXliYWNrUG9zaXRpb25NYXJrZXI6IERPTTtcbiAgcHJpdmF0ZSBzZWVrQmFyQnVmZmVyUG9zaXRpb246IERPTTtcbiAgcHJpdmF0ZSBzZWVrQmFyU2Vla1Bvc2l0aW9uOiBET007XG4gIHByaXZhdGUgc2Vla0JhckJhY2tkcm9wOiBET007XG5cbiAgcHJpdmF0ZSBsYWJlbDogU2Vla0JhckxhYmVsO1xuXG4gIHByaXZhdGUgc2Vla0Jhck1hcmtlcnNDb250YWluZXI6IERPTTtcbiAgcHJpdmF0ZSB0aW1lbGluZU1hcmtlcnNIYW5kbGVyOiBUaW1lbGluZU1hcmtlcnNIYW5kbGVyO1xuXG4gIHByaXZhdGUgcGxheWVyOiBQbGF5ZXJBUEk7XG5cbiAgcHJvdGVjdGVkIHNlZWtCYXJUeXBlOiBTZWVrQmFyVHlwZTtcblxuICBwcm90ZWN0ZWQgaXNVaVNob3duOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBCdWZmZXIgb2YgdGhlIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uLiBUaGUgcG9zaXRpb24gbXVzdCBiZSBidWZmZXJlZCBpbiBjYXNlIHRoZSBlbGVtZW50XG4gICAqIG5lZWRzIHRvIGJlIHJlZnJlc2hlZCB3aXRoIHtAbGluayAjcmVmcmVzaFBsYXliYWNrUG9zaXRpb259LlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgcHJpdmF0ZSBwbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSA9IDA7XG5cbiAgcHJpdmF0ZSBzbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlcjogVGltZW91dDtcbiAgcHJpdmF0ZSBwYXVzZWRUaW1lc2hpZnRVcGRhdGVyOiBUaW1lb3V0O1xuXG4gIHByaXZhdGUgaXNVc2VyU2Vla2luZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc2Vla0JhckV2ZW50cyA9IHtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgc2NydWJiaW5nIHNlZWsgb3BlcmF0aW9uIGlzIHN0YXJ0ZWQuXG4gICAgICovXG4gICAgb25TZWVrOiBuZXcgRXZlbnREaXNwYXRjaGVyPFNlZWtCYXIsIE5vQXJncz4oKSxcbiAgICAvKipcbiAgICAgKiBGaXJlZCBkdXJpbmcgYSBzY3J1YmJpbmcgc2VlayB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzZWVrIHByZXZpZXcgKGkuZS4gdGhlIHZpZGVvIGZyYW1lKSBzaG91bGQgYmUgdXBkYXRlZC5cbiAgICAgKi9cbiAgICBvblNlZWtQcmV2aWV3OiBuZXcgRXZlbnREaXNwYXRjaGVyPFNlZWtCYXIsIFNlZWtQcmV2aWV3RXZlbnRBcmdzPigpLFxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBzY3J1YmJpbmcgc2VlayBoYXMgZmluaXNoZWQgb3Igd2hlbiBhIGRpcmVjdCBzZWVrIGlzIGlzc3VlZC5cbiAgICAgKi9cbiAgICBvblNlZWtlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxTZWVrQmFyLCBudW1iZXI+KCksXG4gIH07XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTZWVrQmFyQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgY29uc3Qga2V5U3RlcEluY3JlbWVudHMgPSB0aGlzLmNvbmZpZy5rZXlTdGVwSW5jcmVtZW50cyB8fCB7XG4gICAgICBsZWZ0UmlnaHQ6IDEsXG4gICAgICB1cERvd246IDUsXG4gICAgfTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktc2Vla2JhcicsXG4gICAgICB2ZXJ0aWNhbDogZmFsc2UsXG4gICAgICBzbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlSW50ZXJ2YWxNczogNTAsXG4gICAgICBrZXlTdGVwSW5jcmVtZW50cyxcbiAgICAgIGFyaWFMYWJlbDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3NlZWtCYXInKSxcbiAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgc25hcHBpbmdSYW5nZTogMSxcbiAgICAgIGVuYWJsZVNlZWtQcmV2aWV3OiB0cnVlLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcblxuICAgIHRoaXMubGFiZWwgPSB0aGlzLmNvbmZpZy5sYWJlbDtcbiAgfVxuXG4gIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuXG4gICAgaWYgKHRoaXMuaGFzTGFiZWwoKSkge1xuICAgICAgdGhpcy5nZXRMYWJlbCgpLmluaXRpYWxpemUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0QXJpYVNsaWRlck1pbk1heChtaW46IHN0cmluZywgbWF4OiBzdHJpbmcpIHtcbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hdHRyKCdhcmlhLXZhbHVlbWluJywgbWluKTtcbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hdHRyKCdhcmlhLXZhbHVlbWF4JywgbWF4KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QXJpYVNsaWRlclZhbHVlcygpIHtcbiAgICBpZiAodGhpcy5zZWVrQmFyVHlwZSA9PT0gU2Vla0JhclR5cGUuTGl2ZSkge1xuICAgICAgY29uc3QgdGltZXNoaWZ0VmFsdWUgPSBNYXRoLmNlaWwodGhpcy5wbGF5ZXIuZ2V0VGltZVNoaWZ0KCkpLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hdHRyKCdhcmlhLXZhbHVlbm93JywgdGltZXNoaWZ0VmFsdWUpO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYXR0cignYXJpYS12YWx1ZXRleHQnLCBgJHtpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NlZWtCYXIudGltZXNoaWZ0JykpfSAke2kxOG4ucGVyZm9ybUxvY2FsaXphdGlvbihpMThuLmdldExvY2FsaXplcignc2Vla0Jhci52YWx1ZScpKX06ICR7dGltZXNoaWZ0VmFsdWV9YCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlZWtCYXJUeXBlID09PSBTZWVrQmFyVHlwZS5Wb2QpIHtcbiAgICAgIGNvbnN0IGFyaWFWYWx1ZVRleHQgPSBgJHtTdHJpbmdVdGlscy5zZWNvbmRzVG9UZXh0KHRoaXMucGxheWVyLmdldEN1cnJlbnRUaW1lKCkpfSAke2kxOG4ucGVyZm9ybUxvY2FsaXphdGlvbihpMThuLmdldExvY2FsaXplcignc2Vla0Jhci5kdXJhdGlvblRleHQnKSl9ICR7U3RyaW5nVXRpbHMuc2Vjb25kc1RvVGV4dCh0aGlzLnBsYXllci5nZXREdXJhdGlvbigpKX1gO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYXR0cignYXJpYS12YWx1ZW5vdycsIE1hdGguZmxvb3IodGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKSkudG9TdHJpbmcoKSk7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hdHRyKCdhcmlhLXZhbHVldGV4dCcsIGFyaWFWYWx1ZVRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIuaXNMaXZlKCkpIHtcbiAgICAgIHJldHVybiAxMDAgLSAoMTAwIC8gdGhpcy5wbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCkgKiB0aGlzLnBsYXllci5nZXRUaW1lU2hpZnQoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDEwMCAvIHRoaXMucGxheWVyLmdldER1cmF0aW9uKCkgKiB0aGlzLmdldFJlbGF0aXZlQ3VycmVudFRpbWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQnVmZmVyTGV2ZWwocGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2U6IG51bWJlcik6IHZvaWQge1xuXG4gICAgbGV0IGJ1ZmZlckxvYWRlZFBlcmNlbnRhZ2VMZXZlbDogbnVtYmVyO1xuICAgIGlmICh0aGlzLnBsYXllci5pc0xpdmUoKSkge1xuICAgICAgLy8gQWx3YXlzIHNob3cgZnVsbCBidWZmZXIgZm9yIGxpdmUgc3RyZWFtc1xuICAgICAgYnVmZmVyTG9hZGVkUGVyY2VudGFnZUxldmVsID0gMTAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXJMb2FkZWRQZXJjZW50YWdlTGV2ZWwgPSBwbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSArIGdldE1pbkJ1ZmZlckxldmVsKHRoaXMucGxheWVyKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEJ1ZmZlclBvc2l0aW9uKGJ1ZmZlckxvYWRlZFBlcmNlbnRhZ2VMZXZlbCk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIsIGNvbmZpZ3VyZVNlZWs6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuXG4gICAgLy8gQXBwbHkgc2NhbGluZyB0cmFuc2Zvcm0gdG8gdGhlIGJhY2tkcm9wIGJhciB0byBoYXZlIGFsbCBiYXJzIHJlbmRlcmVkIHNpbWlsYXJseVxuICAgIC8vICh0aGUgY2FsbCBtdXN0IGJlIHVwIGhlcmUgdG8gYmUgZXhlY3V0ZWQgZm9yIHRoZSB2b2x1bWUgc2xpZGVyIGFzIHdlbGwpXG4gICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLnNlZWtCYXJCYWNrZHJvcCwgMTAwKTtcblxuICAgIC8vIEFkZCBzZWVrYmFyIGNvbnRyb2xzIHRvIHRoZSBzZWVrYmFyXG4gICAgY29uc3Qgc2Vla0JhckNvbnRyb2xsZXIgPSBuZXcgU2Vla0JhckNvbnRyb2xsZXIodGhpcy5jb25maWcua2V5U3RlcEluY3JlbWVudHMsIHBsYXllciwgdWltYW5hZ2VyLmdldENvbmZpZygpLnZvbHVtZUNvbnRyb2xsZXIpO1xuXG4gICAgc2Vla0JhckNvbnRyb2xsZXIuc2V0U2Vla0JhckNvbnRyb2xzKHRoaXMuZ2V0RG9tRWxlbWVudCgpLCAoKSA9PiB0aGlzLnNlZWtCYXJUeXBlKTtcblxuICAgIC8vIFRoZSBjb25maWd1cmVTZWVrIGZsYWcgY2FuIGJlIHVzZWQgYnkgc3ViY2xhc3NlcyB0byBkaXNhYmxlIGNvbmZpZ3VyYXRpb24gYXMgc2VlayBiYXIuIEUuZy4gdGhlIHZvbHVtZVxuICAgIC8vIHNsaWRlciBpcyByZXVzaW5nIHRoaXMgY29tcG9uZW50IGJ1dCBhZGRzIGl0cyBvd24gZnVuY3Rpb25hbGl0eSwgYW5kIGRvZXMgbm90IG5lZWQgdGhlIHNlZWsgZnVuY3Rpb25hbGl0eS5cbiAgICAvLyBUaGlzIGlzIGFjdHVhbGx5IGEgaGFjaywgdGhlIHByb3BlciBzb2x1dGlvbiB3b3VsZCBiZSBmb3IgYm90aCBzZWVrIGJhciBhbmQgdm9sdW1lIHNsaWRlcnMgdG8gZXh0ZW5kXG4gICAgLy8gYSBjb21tb24gYmFzZSBzbGlkZXIgY29tcG9uZW50IGFuZCBpbXBsZW1lbnQgdGhlaXIgZnVuY3Rpb25hbGl0eSB0aGVyZS5cbiAgICBpZiAoIWNvbmZpZ3VyZVNlZWspIHtcbiAgICAgIHRoaXMuc2Vla0JhclR5cGUgPSBTZWVrQmFyVHlwZS5Wb2x1bWU7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB1aW1hbmFnZXIub25Db250cm9sc1Nob3cuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaXNVaVNob3duID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzSGlkZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5pc1VpU2hvd24gPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIGxldCBpc1BsYXlpbmcgPSBmYWxzZTtcbiAgICBsZXQgc2NydWJiaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzUGxheWVyU2Vla2luZyA9IGZhbHNlO1xuXG4gICAgLy8gVXBkYXRlIHBsYXliYWNrIGFuZCBidWZmZXIgcG9zaXRpb25zXG4gICAgbGV0IHBsYXliYWNrUG9zaXRpb25IYW5kbGVyID0gKGV2ZW50OiBQbGF5ZXJFdmVudEJhc2UgPSBudWxsLCBmb3JjZVVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1VzZXJTZWVraW5nKSB7XG4gICAgICAgIC8vIFdlIGNhdWdodCBhIHNlZWsgcHJldmlldyBzZWVrLCBkbyBub3QgdXBkYXRlIHRoZSBzZWVrYmFyXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IHBsYXliYWNrUG9zaXRpb25QZXJjZW50YWdlID0gdGhpcy5nZXRQbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSgpO1xuXG4gICAgICB0aGlzLnVwZGF0ZUJ1ZmZlckxldmVsKHBsYXliYWNrUG9zaXRpb25QZXJjZW50YWdlKTtcblxuICAgICAgLy8gVGhlIHNlZ21lbnQgcmVxdWVzdCBmaW5pc2hlZCBpcyB1c2VkIHRvIGhlbHAgdGhlIHBsYXliYWNrIHBvc2l0aW9uIG1vdmUsIHdoZW4gdGhlIHNtb290aCBwbGF5YmFjayBwb3NpdGlvbiBpcyBub3QgZW5hYmxlZC5cbiAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2hlbiB0aGUgdXNlciBpcyBzY3J1YmJpbmcsIHdlIGFsc28gbW92ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNlZWtiYXIgdG8gZGlzcGxheSBhIHByZXZpZXcgZHVyaW5nIHNjcnViYmluZy5cbiAgICAgIC8vIFdoZW4gdGhlIHVzZXIgaXMgc2NydWJiaW5nIHdlIGRvIG5vdCByZWNvcmQgdGhpcyBhcyBhIHVzZXIgc2VlayBvcGVyYXRpb24sIGFzIHRoZSB1c2VyIGhhcyB5ZXQgdG8gZmluaXNoIHRoZWlyIHNlZWssXG4gICAgICAvLyBidXQgd2Ugc2hvdWxkIG5vdCBtb3ZlIHRoZSBwbGF5YmFjayBwb3NpdGlvbiB0byBub3QgY3JlYXRlIGEganVtcGluZyBiZWhhdmlvdXIuXG4gICAgICBpZiAoc2NydWJiaW5nICYmIGV2ZW50LnR5cGUgPT09IHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNlZ21lbnRSZXF1ZXN0RmluaXNoZWQgJiYgcGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UgIT09IHRoaXMucGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UpIHtcbiAgICAgICAgcGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UgPSB0aGlzLnBsYXliYWNrUG9zaXRpb25QZXJjZW50YWdlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGxheWVyLmlzTGl2ZSgpKSB7XG4gICAgICAgIGlmIChwbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCkgPT09IDApIHtcbiAgICAgICAgICAvLyBUaGlzIGNhc2UgbXVzdCBiZSBleHBsaWNpdGx5IGhhbmRsZWQgdG8gYXZvaWQgZGl2aXNpb24gYnkgemVyb1xuICAgICAgICAgIHRoaXMuc2V0UGxheWJhY2tQb3NpdGlvbigxMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghdGhpcy5pc1NlZWtpbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRQbGF5YmFja1Bvc2l0aW9uKHBsYXliYWNrUG9zaXRpb25QZXJjZW50YWdlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnNldEFyaWFTbGlkZXJNaW5NYXgocGxheWVyLmdldE1heFRpbWVTaGlmdCgpLnRvU3RyaW5nKCksICcwJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVwZGF0ZSBwbGF5YmFjayBwb3NpdGlvbiBvbmx5IGluIHBhdXNlZCBzdGF0ZSBvciBpbiB0aGUgaW5pdGlhbCBzdGFydHVwIHN0YXRlIHdoZXJlIHBsYXllciBpcyBuZWl0aGVyXG4gICAgICAgIC8vIHBhdXNlZCBub3IgcGxheWluZy4gUGxheWJhY2sgdXBkYXRlcyBhcmUgaGFuZGxlZCBpbiB0aGUgVGltZW91dCBiZWxvdy5cbiAgICAgICAgY29uc3QgaXNJbkluaXRpYWxTdGFydHVwU3RhdGUgPSB0aGlzLmNvbmZpZy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlSW50ZXJ2YWxNcyA9PT0gU2Vla0Jhci5TTU9PVEhfUExBWUJBQ0tfUE9TSVRJT05fVVBEQVRFX0RJU0FCTEVEXG4gICAgICAgICAgICB8fCBmb3JjZVVwZGF0ZSB8fCBwbGF5ZXIuaXNQYXVzZWQoKTtcbiAgICAgICAgY29uc3QgaXNOZWl0aGVyUGF1c2VkTm9yUGxheWluZyA9IHBsYXllci5pc1BhdXNlZCgpID09PSBwbGF5ZXIuaXNQbGF5aW5nKCk7XG5cbiAgICAgICAgaWYgKChpc0luSW5pdGlhbFN0YXJ0dXBTdGF0ZSB8fCBpc05laXRoZXJQYXVzZWROb3JQbGF5aW5nKSAmJiAhdGhpcy5pc1NlZWtpbmcoKSkge1xuICAgICAgICAgIHRoaXMuc2V0UGxheWJhY2tQb3NpdGlvbihwbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldEFyaWFTbGlkZXJNaW5NYXgoJzAnLCBwbGF5ZXIuZ2V0RHVyYXRpb24oKS50b1N0cmluZygpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNVaVNob3duKSB7XG4gICAgICAgIHRoaXMuc2V0QXJpYVNsaWRlclZhbHVlcygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgc2Vla2JhciB1cG9uIHRoZXNlIGV2ZW50c1xuICAgIC8vIGluaXQgcGxheWJhY2sgcG9zaXRpb24gd2hlbiB0aGUgcGxheWVyIGlzIHJlYWR5XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlJlYWR5LCBwbGF5YmFja1Bvc2l0aW9uSGFuZGxlcik7XG4gICAgLy8gdXBkYXRlIHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gaXQgY2hhbmdlc1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lQ2hhbmdlZCwgcGxheWJhY2tQb3NpdGlvbkhhbmRsZXIpO1xuICAgIC8vIHVwZGF0ZSBidWZmZXJsZXZlbCB3aGVuIGJ1ZmZlcmluZyBpcyBjb21wbGV0ZVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TdGFsbEVuZGVkLCBwbGF5YmFja1Bvc2l0aW9uSGFuZGxlcik7XG4gICAgLy8gdXBkYXRlIHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gYSB0aW1lc2hpZnQgaGFzIGZpbmlzaGVkXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlRpbWVTaGlmdGVkLCBwbGF5YmFja1Bvc2l0aW9uSGFuZGxlcik7XG4gICAgLy8gdXBkYXRlIGJ1ZmZlcmxldmVsIHdoZW4gYSBzZWdtZW50IGhhcyBiZWVuIGRvd25sb2FkZWRcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU2VnbWVudFJlcXVlc3RGaW5pc2hlZCwgcGxheWJhY2tQb3NpdGlvbkhhbmRsZXIpO1xuXG4gICAgdGhpcy5jb25maWd1cmVMaXZlUGF1c2VkVGltZXNoaWZ0VXBkYXRlcihwbGF5ZXIsIHVpbWFuYWdlciwgcGxheWJhY2tQb3NpdGlvbkhhbmRsZXIpO1xuXG4gICAgLy8gU2VlayBoYW5kbGluZ1xuICAgIGxldCBvblBsYXllclNlZWsgPSAoKSA9PiB7XG4gICAgICBpc1BsYXllclNlZWtpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zZXRTZWVraW5nKHRydWUpO1xuICAgICAgc2NydWJiaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIGxldCBvblBsYXllclNlZWtlZCA9IChldmVudDogUGxheWVyRXZlbnRCYXNlID0gbnVsbCwgZm9yY2VVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSApID0+IHtcbiAgICAgIGlzUGxheWVyU2Vla2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRTZWVraW5nKGZhbHNlKTtcblxuICAgICAgLy8gdXBkYXRlIHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gYSBzZWVrIGhhcyBmaW5pc2hlZFxuICAgICAgcGxheWJhY2tQb3NpdGlvbkhhbmRsZXIoZXZlbnQsIGZvcmNlVXBkYXRlKTtcbiAgICB9O1xuXG4gICAgbGV0IHJlc3RvcmVQbGF5aW5nU3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBDb250aW51ZSBwbGF5YmFjayBhZnRlciBzZWVrIGlmIHBsYXllciB3YXMgcGxheWluZyB3aGVuIHNlZWsgc3RhcnRlZFxuICAgICAgaWYgKGlzUGxheWluZykge1xuICAgICAgICAvLyB1c2UgdGhlIHNhbWUgaXNzdWVyIGhlcmUgYXMgaW4gdGhlIHBhdXNlIG9uIHNlZWtcbiAgICAgICAgcGxheWVyLnBsYXkoJ3VpLXNlZWsnKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNlZWssIG9uUGxheWVyU2Vlayk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNlZWtlZCwgb25QbGF5ZXJTZWVrZWQpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lU2hpZnQsIG9uUGxheWVyU2Vlayk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlRpbWVTaGlmdGVkLCBvblBsYXllclNlZWtlZCk7XG5cbiAgICB0aGlzLm9uU2Vlay5zdWJzY3JpYmUoKHNlbmRlcikgPT4ge1xuICAgICAgdGhpcy5pc1VzZXJTZWVraW5nID0gdHJ1ZTsgLy8gdHJhY2sgc2Vla2luZyBzdGF0dXMgc28gd2UgY2FuIGNhdGNoIGV2ZW50cyBmcm9tIHNlZWsgcHJldmlldyBzZWVrc1xuXG4gICAgICAvLyBOb3RpZnkgVUkgbWFuYWdlciBvZiBzdGFydGVkIHNlZWtcbiAgICAgIHVpbWFuYWdlci5vblNlZWsuZGlzcGF0Y2goc2VuZGVyKTtcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBsYXliYWNrIHN0YXRlIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBzZWVrXG4gICAgICBpZiAoIWlzUGxheWVyU2Vla2luZykge1xuICAgICAgICBpc1BsYXlpbmcgPSBwbGF5ZXIuaXNQbGF5aW5nKCk7XG5cbiAgICAgICAgLy8gUGF1c2UgcGxheWJhY2sgd2hpbGUgc2Vla2luZ1xuICAgICAgICBpZiAoaXNQbGF5aW5nKSB7XG4gICAgICAgICAgLy8gdXNlIGEgZGlmZmVyZW50IGlzc3VlciBoZXJlLCBhcyBwbGF5L3BhdXNlIG9uIHNlZWsgaXMgbm90IFwicmVhbGx5XCIgdHJpZ2dlcmQgYnkgdGhlIHVzZXJcbiAgICAgICAgICBwbGF5ZXIucGF1c2UoJ3VpLXNlZWsnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSk7XG4gICAgdGhpcy5vblNlZWtQcmV2aWV3LnN1YnNjcmliZSgoc2VuZGVyOiBTZWVrQmFyLCBhcmdzOiBTZWVrUHJldmlld0V2ZW50QXJncykgPT4ge1xuICAgICAgLy8gTm90aWZ5IFVJIG1hbmFnZXIgb2Ygc2VlayBwcmV2aWV3XG4gICAgICB1aW1hbmFnZXIub25TZWVrUHJldmlldy5kaXNwYXRjaChzZW5kZXIsIGFyZ3MpO1xuICAgICAgc2NydWJiaW5nID0gYXJncy5zY3J1YmJpbmc7XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgZW5hYmxlU2Vla1ByZXZpZXcgaWYgc2V0IGluIHRoZSB1aW1hbmFnZXIgY29uZmlnXG4gICAgaWYgKHR5cGVvZiB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZW5hYmxlU2Vla1ByZXZpZXcgPT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5jb25maWcuZW5hYmxlU2Vla1ByZXZpZXcgPSB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZW5hYmxlU2Vla1ByZXZpZXc7XG4gICAgfVxuXG4gICAgLy8gUmF0ZS1saW1pdGVkIHNjcnViYmluZyBzZWVrXG4gICAgaWYgKHRoaXMuY29uZmlnLmVuYWJsZVNlZWtQcmV2aWV3KSB7XG4gICAgICB0aGlzLm9uU2Vla1ByZXZpZXcuc3Vic2NyaWJlUmF0ZUxpbWl0ZWQodGhpcy5zZWVrV2hpbGVTY3J1YmJpbmcsIDIwMCk7XG4gICAgfVxuXG4gICAgdGhpcy5vblNlZWtlZC5zdWJzY3JpYmUoKHNlbmRlciwgcGVyY2VudGFnZSkgPT4ge1xuICAgICAgdGhpcy5pc1VzZXJTZWVraW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvIHRoZSBzZWVrXG4gICAgICB0aGlzLnNlZWsocGVyY2VudGFnZSk7XG5cbiAgICAgIC8vIE5vdGlmeSBVSSBtYW5hZ2VyIG9mIGZpbmlzaGVkIHNlZWtcbiAgICAgIHVpbWFuYWdlci5vblNlZWtlZC5kaXNwYXRjaChzZW5kZXIpO1xuXG4gICAgICAvLyBDb250aW51ZSBwbGF5YmFjayBhZnRlciBzZWVrIGlmIHBsYXllciB3YXMgcGxheWluZyB3aGVuIHNlZWsgc3RhcnRlZFxuICAgICAgcmVzdG9yZVBsYXlpbmdTdGF0ZSgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaGFzTGFiZWwoKSkge1xuICAgICAgLy8gQ29uZmlndXJlIGEgc2Vla2JhciBsYWJlbCB0aGF0IGlzIGludGVybmFsIHRvIHRoZSBzZWVrYmFyKVxuICAgICAgdGhpcy5nZXRMYWJlbCgpLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgfVxuXG4gICAgLy8gSGlkZSBzZWVrYmFyIGZvciBsaXZlIHNvdXJjZXMgd2l0aG91dCB0aW1lc2hpZnRcbiAgICBsZXQgaXNMaXZlID0gZmFsc2U7XG4gICAgbGV0IGhhc1RpbWVTaGlmdCA9IGZhbHNlO1xuICAgIGxldCBzd2l0Y2hWaXNpYmlsaXR5ID0gKGlzTGl2ZTogYm9vbGVhbiwgaGFzVGltZVNoaWZ0OiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoaXNMaXZlICYmICFoYXNUaW1lU2hpZnQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH1cbiAgICAgIHBsYXliYWNrUG9zaXRpb25IYW5kbGVyKG51bGwsIHRydWUpO1xuICAgICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICAgIH07XG4gICAgbGV0IGxpdmVTdHJlYW1EZXRlY3RvciA9IG5ldyBQbGF5ZXJVdGlscy5MaXZlU3RyZWFtRGV0ZWN0b3IocGxheWVyLCB1aW1hbmFnZXIpO1xuICAgIGxpdmVTdHJlYW1EZXRlY3Rvci5vbkxpdmVDaGFuZ2VkLnN1YnNjcmliZSgoc2VuZGVyLCBhcmdzOiBMaXZlU3RyZWFtRGV0ZWN0b3JFdmVudEFyZ3MpID0+IHtcbiAgICAgIGlzTGl2ZSA9IGFyZ3MubGl2ZTtcbiAgICAgIGlmIChpc0xpdmUgJiYgdGhpcy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc21vb3RoUGxheWJhY2tQb3NpdGlvblVwZGF0ZXIuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZWVrQmFyVHlwZSA9IFNlZWtCYXJUeXBlLkxpdmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlZWtCYXJUeXBlID0gU2Vla0JhclR5cGUuVm9kO1xuICAgICAgfVxuICAgICAgc3dpdGNoVmlzaWJpbGl0eShpc0xpdmUsIGhhc1RpbWVTaGlmdCk7XG4gICAgfSk7XG4gICAgbGV0IHRpbWVTaGlmdERldGVjdG9yID0gbmV3IFBsYXllclV0aWxzLlRpbWVTaGlmdEF2YWlsYWJpbGl0eURldGVjdG9yKHBsYXllcik7XG4gICAgdGltZVNoaWZ0RGV0ZWN0b3Iub25UaW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkLnN1YnNjcmliZSgoc2VuZGVyLCBhcmdzOiBUaW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkQXJncykgPT4ge1xuICAgICAgaGFzVGltZVNoaWZ0ID0gYXJncy50aW1lU2hpZnRBdmFpbGFibGU7XG4gICAgICBzd2l0Y2hWaXNpYmlsaXR5KGlzTGl2ZSwgaGFzVGltZVNoaWZ0KTtcbiAgICB9KTtcbiAgICAvLyBJbml0aWFsIGRldGVjdGlvblxuICAgIGxpdmVTdHJlYW1EZXRlY3Rvci5kZXRlY3QoKTtcbiAgICB0aW1lU2hpZnREZXRlY3Rvci5kZXRlY3QoKTtcblxuICAgIC8vIFJlZnJlc2ggdGhlIHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gdGhlIHBsYXllciByZXNpemVkIG9yIHRoZSBVSSBpcyBjb25maWd1cmVkLiBUaGUgcGxheWJhY2sgcG9zaXRpb24gbWFya2VyXG4gICAgLy8gaXMgcG9zaXRpb25lZCBhYnNvbHV0ZWx5IGFuZCBtdXN0IHRoZXJlZm9yZSBiZSB1cGRhdGVkIHdoZW4gdGhlIHNpemUgb2YgdGhlIHNlZWtiYXIgY2hhbmdlcy5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWVyUmVzaXplZCwgKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICAgIH0pO1xuICAgIC8vIEFkZGl0aW9uYWxseSwgd2hlbiB0aGlzIGNvZGUgaXMgY2FsbGVkLCB0aGUgc2Vla2JhciBpcyBub3QgcGFydCBvZiB0aGUgVUkgeWV0IGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgaGF2ZSBhIHNpemUsXG4gICAgLy8gcmVzdWx0aW5nIGluIGEgd3JvbmcgaW5pdGlhbCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyLiBSZWZyZXNoaW5nIGl0IG9uY2UgdGhlIFVJIGlzIGNvbmZpZ3VyZWQgc29sdmVkIHRoaXMgaXNzdWUuXG4gICAgdWltYW5hZ2VyLm9uQ29uZmlndXJlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICAgIH0pO1xuICAgIC8vIEl0IGNhbiBhbHNvIGhhcHBlbiB3aGVuIGEgbmV3IHNvdXJjZSBpcyBsb2FkZWRcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlTG9hZGVkLCAoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hQbGF5YmFja1Bvc2l0aW9uKCk7XG4gICAgfSk7XG4gICAgLy8gQWRkIG1hcmtlcnMgd2hlbiBhIHNvdXJjZSBpcyBsb2FkZWQgb3IgdXBkYXRlIHdoZW4gYSBtYXJrZXIgaXMgYWRkZWQgb3IgcmVtb3ZlZFxuICAgIHVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBwbGF5YmFja1Bvc2l0aW9uSGFuZGxlcigpO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0IHRoZSBzbmFwcGluZ1JhbmdlIGlmIHNldCBpbiB0aGUgdWltYW5hZ2VyIGNvbmZpZ1xuICAgIGlmICh0eXBlb2YgdWltYW5hZ2VyLmdldENvbmZpZygpLnNlZWtiYXJTbmFwcGluZ1JhbmdlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5jb25maWcuc25hcHBpbmdSYW5nZSA9IHVpbWFuYWdlci5nZXRDb25maWcoKS5zZWVrYmFyU25hcHBpbmdSYW5nZTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHNlZWtiYXJcbiAgICBwbGF5YmFja1Bvc2l0aW9uSGFuZGxlcigpOyAvLyBTZXQgdGhlIHBsYXliYWNrIHBvc2l0aW9uXG4gICAgdGhpcy5zZXRCdWZmZXJQb3NpdGlvbigwKTtcbiAgICB0aGlzLnNldFNlZWtQb3NpdGlvbigwKTtcbiAgICBpZiAodGhpcy5jb25maWcuc21vb3RoUGxheWJhY2tQb3NpdGlvblVwZGF0ZUludGVydmFsTXMgIT09IFNlZWtCYXIuU01PT1RIX1BMQVlCQUNLX1BPU0lUSU9OX1VQREFURV9ESVNBQkxFRCkge1xuICAgICAgdGhpcy5jb25maWd1cmVTbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlcihwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBtYXJrZXJzXG4gICAgdGhpcy5pbml0aWFsaXplVGltZWxpbmVNYXJrZXJzKHBsYXllciwgdWltYW5hZ2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRpbWVsaW5lTWFya2VycyhwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIGNvbnN0IHRpbWVsaW5lTWFya2VyQ29uZmlnID0ge1xuICAgICAgY3NzUHJlZml4OiB0aGlzLmNvbmZpZy5jc3NQcmVmaXgsXG4gICAgICBzbmFwcGluZ1JhbmdlOiB0aGlzLmNvbmZpZy5zbmFwcGluZ1JhbmdlLFxuICAgIH07XG4gICAgdGhpcy50aW1lbGluZU1hcmtlcnNIYW5kbGVyID0gbmV3IFRpbWVsaW5lTWFya2Vyc0hhbmRsZXIodGltZWxpbmVNYXJrZXJDb25maWcsICgpID0+IHRoaXMuc2Vla0Jhci53aWR0aCgpLCB0aGlzLnNlZWtCYXJNYXJrZXJzQ29udGFpbmVyKTtcbiAgICB0aGlzLnRpbWVsaW5lTWFya2Vyc0hhbmRsZXIuaW5pdGlhbGl6ZShwbGF5ZXIsIHVpbWFuYWdlcik7XG4gIH1cblxuICBwcml2YXRlIHNlZWtXaGlsZVNjcnViYmluZyA9IChzZW5kZXI6IFNlZWtCYXIsIGFyZ3M6IFNlZWtQcmV2aWV3RXZlbnRBcmdzKSA9PiB7XG4gICAgaWYgKGFyZ3Muc2NydWJiaW5nKSB7XG4gICAgICB0aGlzLnNlZWsoYXJncy5wb3NpdGlvbik7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2VlayA9IChwZXJjZW50YWdlOiBudW1iZXIpID0+IHtcbiAgICBpZiAodGhpcy5wbGF5ZXIuaXNMaXZlKCkpIHtcbiAgICAgIGNvbnN0IG1heFRpbWVTaGlmdCA9IHRoaXMucGxheWVyLmdldE1heFRpbWVTaGlmdCgpO1xuICAgICAgdGhpcy5wbGF5ZXIudGltZVNoaWZ0KG1heFRpbWVTaGlmdCAtIChtYXhUaW1lU2hpZnQgKiAocGVyY2VudGFnZSAvIDEwMCkpLCAndWknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2Vla2FibGVSYW5nZVN0YXJ0ID0gUGxheWVyVXRpbHMuZ2V0U2Vla2FibGVSYW5nZVN0YXJ0KHRoaXMucGxheWVyLCAwKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlU2Vla1RhcmdldCA9IHRoaXMucGxheWVyLmdldER1cmF0aW9uKCkgKiAocGVyY2VudGFnZSAvIDEwMCk7XG4gICAgICBjb25zdCBhYnNvbHV0ZVNlZWtUYXJnZXQgPSByZWxhdGl2ZVNlZWtUYXJnZXQgKyBzZWVrYWJsZVJhbmdlU3RhcnQ7XG4gICAgICB0aGlzLnBsYXllci5zZWVrKGFic29sdXRlU2Vla1RhcmdldCwgJ3VpJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgc2Vla2JhciB3aGlsZSBhIGxpdmUgc3RyZWFtIHdpdGggRFZSIHdpbmRvdyBpcyBwYXVzZWQuXG4gICAqIFRoZSBwbGF5YmFjayBwb3NpdGlvbiBzdGF5cyBzdGlsbCBhbmQgdGhlIHBvc2l0aW9uIGluZGljYXRvciB2aXN1YWxseSBtb3ZlcyB0b3dhcmRzIHRoZSBiYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25maWd1cmVMaXZlUGF1c2VkVGltZXNoaWZ0VXBkYXRlcihcbiAgICBwbGF5ZXI6IFBsYXllckFQSSxcbiAgICB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyLFxuICAgIHBsYXliYWNrUG9zaXRpb25IYW5kbGVyOiAoKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICAvLyBSZWd1bGFybHkgdXBkYXRlIHRoZSBwbGF5YmFjayBwb3NpdGlvbiB3aGlsZSB0aGUgdGltZW91dCBpcyBhY3RpdmVcbiAgICB0aGlzLnBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIgPSBuZXcgVGltZW91dCgxMDAwLCBwbGF5YmFja1Bvc2l0aW9uSGFuZGxlciwgdHJ1ZSk7XG5cbiAgICAvLyBTdGFydCB1cGRhdGVyIHdoZW4gYSBsaXZlIHN0cmVhbSB3aXRoIHRpbWVzaGlmdCB3aW5kb3cgaXMgcGF1c2VkXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBhdXNlZCwgKCkgPT4ge1xuICAgICAgaWYgKHBsYXllci5pc0xpdmUoKSAmJiBwbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCkgPCAwKSB7XG4gICAgICAgIHRoaXMucGF1c2VkVGltZXNoaWZ0VXBkYXRlci5zdGFydCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3RvcCB1cGRhdGVyIHdoZW4gcGxheWJhY2sgY29udGludWVzIChubyBtYXR0ZXIgaWYgdGhlIHVwZGF0ZXIgd2FzIHN0YXJ0ZWQgYmVmb3JlKVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCAoKSA9PiB0aGlzLnBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIuY2xlYXIoKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZVNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgLypcbiAgICAgKiBQbGF5YmFjayBwb3NpdGlvbiB1cGRhdGVcbiAgICAgKlxuICAgICAqIFdlIGRvIG5vdCB1cGRhdGUgdGhlIHBvc2l0aW9uIGRpcmVjdGx5IGZyb20gdGhlIFRpbWVDaGFuZ2VkIGV2ZW50LCBiZWNhdXNlIGl0IGFycml2ZXMgdmVyeSBqaXR0ZXJ5IGFuZFxuICAgICAqIHJlc3VsdHMgaW4gYSBqaXR0ZXJ5IHBvc2l0aW9uIGluZGljYXRvciBzaW5jZSB0aGUgQ1NTIHRyYW5zaXRpb24gdGltZSBpcyBzdGF0aWNhbGx5IHNldC5cbiAgICAgKiBUbyB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlLCB3ZSBtYWludGFpbiBhIGxvY2FsIHBsYXliYWNrIHBvc2l0aW9uIHRoYXQgaXMgdXBkYXRlZCBpbiBhIHN0YWJsZSByZWd1bGFyIGludGVydmFsXG4gICAgICogYW5kIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBwbGF5ZXIuXG4gICAgICovXG4gICAgbGV0IGN1cnJlbnRUaW1lU2Vla0JhciA9IDA7XG4gICAgbGV0IGN1cnJlbnRUaW1lUGxheWVyID0gMDtcbiAgICBsZXQgdXBkYXRlSW50ZXJ2YWxNcyA9IDUwO1xuICAgIGxldCBjdXJyZW50VGltZVVwZGF0ZURlbHRhU2VjcyA9IHVwZGF0ZUludGVydmFsTXMgLyAxMDAwO1xuXG4gICAgdGhpcy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlciA9IG5ldyBUaW1lb3V0KHVwZGF0ZUludGVydmFsTXMsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzU2Vla2luZygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFRpbWVTZWVrQmFyICs9IGN1cnJlbnRUaW1lVXBkYXRlRGVsdGFTZWNzO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjdXJyZW50VGltZVBsYXllciA9IHRoaXMuZ2V0UmVsYXRpdmVDdXJyZW50VGltZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoZSBwbGF5ZXIgaGFzIGJlZW4gZGVzdHJveWVkIGFuZCBzdG9wIHVwZGF0aW5nIGlmIHNvXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIHBsYXllci5leHBvcnRzLlBsYXllckFQSU5vdEF2YWlsYWJsZUVycm9yKSB7XG4gICAgICAgICAgdGhpcy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlci5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgdGltZSBjYW5ub3QgYmUgcmVhZCBpdCBtYWtlcyBubyBzZW5zZSB0byBjb250aW51ZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFN5bmMgY3VycmVudFRpbWUgb2Ygc2Vla2JhciB0byBwbGF5ZXJcbiAgICAgIGxldCBjdXJyZW50VGltZURlbHRhID0gY3VycmVudFRpbWVTZWVrQmFyIC0gY3VycmVudFRpbWVQbGF5ZXI7XG4gICAgICAvLyBJZiB0aGUgZGVsdGEgaXMgbGFyZ2VyIHRoYXQgMiBzZWNzLCBkaXJlY3RseSBqdW1wIHRoZSBzZWVrYmFyIHRvIHRoZVxuICAgICAgLy8gcGxheWVyIHRpbWUgaW5zdGVhZCBvZiBzbW9vdGhseSBmYXN0IGZvcndhcmRpbmcvcmV3aW5kaW5nLlxuICAgICAgaWYgKE1hdGguYWJzKGN1cnJlbnRUaW1lRGVsdGEpID4gMikge1xuICAgICAgICBjdXJyZW50VGltZVNlZWtCYXIgPSBjdXJyZW50VGltZVBsYXllcjtcbiAgICAgIH1cbiAgICAgIC8vIElmIGN1cnJlbnRUaW1lRGVsdGEgaXMgbmVnYXRpdmUgYW5kIGJlbG93IHRoZSBhZGp1c3RtZW50IHRocmVzaG9sZCxcbiAgICAgIC8vIHRoZSBwbGF5ZXIgaXMgYWhlYWQgb2YgdGhlIHNlZWtiYXIgYW5kIHdlICdmYXN0IGZvcndhcmQnIHRoZSBzZWVrYmFyXG4gICAgICBlbHNlIGlmIChjdXJyZW50VGltZURlbHRhIDw9IC1jdXJyZW50VGltZVVwZGF0ZURlbHRhU2Vjcykge1xuICAgICAgICBjdXJyZW50VGltZVNlZWtCYXIgKz0gY3VycmVudFRpbWVVcGRhdGVEZWx0YVNlY3M7XG4gICAgICB9XG4gICAgICAvLyBJZiBjdXJyZW50VGltZURlbHRhIGlzIHBvc2l0aXZlIGFuZCBhYm92ZSB0aGUgYWRqdXN0bWVudCB0aHJlc2hvbGQsXG4gICAgICAvLyB0aGUgcGxheWVyIGlzIGJlaGluZCB0aGUgc2Vla2JhciBhbmQgd2UgJ3Jld2luZCcgdGhlIHNlZWtiYXJcbiAgICAgIGVsc2UgaWYgKGN1cnJlbnRUaW1lRGVsdGEgPj0gY3VycmVudFRpbWVVcGRhdGVEZWx0YVNlY3MpIHtcbiAgICAgICAgY3VycmVudFRpbWVTZWVrQmFyIC09IGN1cnJlbnRUaW1lVXBkYXRlRGVsdGFTZWNzO1xuICAgICAgfVxuXG4gICAgICBsZXQgcGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UgPSAxMDAgLyBwbGF5ZXIuZ2V0RHVyYXRpb24oKSAqIGN1cnJlbnRUaW1lU2Vla0JhcjtcbiAgICAgIHRoaXMuc2V0UGxheWJhY2tQb3NpdGlvbihwbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSk7XG4gICAgfSwgdHJ1ZSk7XG5cbiAgICBsZXQgc3RhcnRTbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlciA9ICgpID0+IHtcbiAgICAgIGlmICghcGxheWVyLmlzTGl2ZSgpKSB7XG4gICAgICAgIGN1cnJlbnRUaW1lU2Vla0JhciA9IHRoaXMuZ2V0UmVsYXRpdmVDdXJyZW50VGltZSgpO1xuICAgICAgICB0aGlzLnNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyLnN0YXJ0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCBzdG9wU21vb3RoUGxheWJhY2tQb3NpdGlvblVwZGF0ZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyLmNsZWFyKCk7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCBzdGFydFNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWluZywgc3RhcnRTbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBhdXNlZCwgc3RvcFNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWJhY2tGaW5pc2hlZCwgc3RvcFNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU2Vla2VkLCAoKSA9PiB7XG4gICAgICBjdXJyZW50VGltZVNlZWtCYXIgPSB0aGlzLmdldFJlbGF0aXZlQ3VycmVudFRpbWUoKTtcbiAgICB9KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlVW5sb2FkZWQsIHN0b3BTbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlcik7XG5cbiAgICBpZiAocGxheWVyLmlzUGxheWluZygpKSB7XG4gICAgICBzdGFydFNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWxhdGl2ZUN1cnJlbnRUaW1lKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFBsYXllclV0aWxzLmdldEN1cnJlbnRUaW1lUmVsYXRpdmVUb1NlZWthYmxlUmFuZ2UodGhpcy5wbGF5ZXIpO1xuICB9XG5cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBzdXBlci5yZWxlYXNlKCk7XG5cbiAgICBpZiAodGhpcy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlcikgeyAvLyBvYmplY3QgbXVzdCBub3QgbmVjZXNzYXJpbHkgZXhpc3QsIGUuZy4gaW4gdm9sdW1lIHNsaWRlciBzdWJjbGFzc1xuICAgICAgdGhpcy5zbW9vdGhQbGF5YmFja1Bvc2l0aW9uVXBkYXRlci5jbGVhcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIpIHtcbiAgICAgIHRoaXMucGF1c2VkVGltZXNoaWZ0VXBkYXRlci5jbGVhcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5lbmFibGVTZWVrUHJldmlldykge1xuICAgICAgdGhpcy5vblNlZWtQcmV2aWV3LnVuc3Vic2NyaWJlKHRoaXMuc2Vla1doaWxlU2NydWJiaW5nKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLnZlcnRpY2FsKSB7XG4gICAgICB0aGlzLmNvbmZpZy5jc3NDbGFzc2VzLnB1c2goJ3ZlcnRpY2FsJyk7XG4gICAgfVxuXG4gICAgbGV0IHNlZWtCYXJDb250YWluZXIgPSBuZXcgRE9NKCdkaXYnLCB7XG4gICAgICAnaWQnOiB0aGlzLmNvbmZpZy5pZCxcbiAgICAgICdjbGFzcyc6IHRoaXMuZ2V0Q3NzQ2xhc3NlcygpLFxuICAgICAgJ3JvbGUnOiAnc2xpZGVyJyxcbiAgICAgICdhcmlhLWxhYmVsJzogaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRoaXMuY29uZmlnLmFyaWFMYWJlbCksXG4gICAgICAndGFiaW5kZXgnOiB0aGlzLmNvbmZpZy50YWJJbmRleC50b1N0cmluZygpLFxuICAgIH0pO1xuXG4gICAgbGV0IHNlZWtCYXIgPSBuZXcgRE9NKCdkaXYnLCB7XG4gICAgICAnY2xhc3MnOiB0aGlzLnByZWZpeENzcygnc2Vla2JhcicpLFxuICAgIH0pO1xuICAgIHRoaXMuc2Vla0JhciA9IHNlZWtCYXI7XG5cbiAgICAvLyBJbmRpY2F0b3IgdGhhdCBzaG93cyB0aGUgYnVmZmVyIGZpbGwgbGV2ZWxcbiAgICBsZXQgc2Vla0JhckJ1ZmZlckxldmVsID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ3NlZWtiYXItYnVmZmVybGV2ZWwnKSxcbiAgICB9KTtcbiAgICB0aGlzLnNlZWtCYXJCdWZmZXJQb3NpdGlvbiA9IHNlZWtCYXJCdWZmZXJMZXZlbDtcblxuICAgIC8vIEluZGljYXRvciB0aGF0IHNob3dzIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uXG4gICAgbGV0IHNlZWtCYXJQbGF5YmFja1Bvc2l0aW9uID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ3NlZWtiYXItcGxheWJhY2twb3NpdGlvbicpLFxuICAgIH0pO1xuICAgIHRoaXMuc2Vla0JhclBsYXliYWNrUG9zaXRpb24gPSBzZWVrQmFyUGxheWJhY2tQb3NpdGlvbjtcblxuICAgIC8vIEEgbWFya2VyIG9mIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uLCBlLmcuIGEgZG90IG9yIGxpbmVcbiAgICBsZXQgc2Vla0JhclBsYXliYWNrUG9zaXRpb25NYXJrZXIgPSBuZXcgRE9NKCdkaXYnLCB7XG4gICAgICAnY2xhc3MnOiB0aGlzLnByZWZpeENzcygnc2Vla2Jhci1wbGF5YmFja3Bvc2l0aW9uLW1hcmtlcicpLFxuICAgIH0pO1xuICAgIHRoaXMuc2Vla0JhclBsYXliYWNrUG9zaXRpb25NYXJrZXIgPSBzZWVrQmFyUGxheWJhY2tQb3NpdGlvbk1hcmtlcjtcblxuICAgIC8vIEluZGljYXRvciB0aGF0IHNob3cgd2hlcmUgYSBzZWVrIHdpbGwgZ28gdG9cbiAgICBsZXQgc2Vla0JhclNlZWtQb3NpdGlvbiA9IG5ldyBET00oJ2RpdicsIHtcbiAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCdzZWVrYmFyLXNlZWtwb3NpdGlvbicpLFxuICAgIH0pO1xuICAgIHRoaXMuc2Vla0JhclNlZWtQb3NpdGlvbiA9IHNlZWtCYXJTZWVrUG9zaXRpb247XG5cbiAgICAvLyBJbmRpY2F0b3IgdGhhdCBzaG93cyB0aGUgZnVsbCBzZWVrYmFyXG4gICAgbGV0IHNlZWtCYXJCYWNrZHJvcCA9IG5ldyBET00oJ2RpdicsIHtcbiAgICAgICdjbGFzcyc6IHRoaXMucHJlZml4Q3NzKCdzZWVrYmFyLWJhY2tkcm9wJyksXG4gICAgfSk7XG4gICAgdGhpcy5zZWVrQmFyQmFja2Ryb3AgPSBzZWVrQmFyQmFja2Ryb3A7XG5cbiAgICBsZXQgc2Vla0JhckNoYXB0ZXJNYXJrZXJzQ29udGFpbmVyID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ3NlZWtiYXItbWFya2VycycpLFxuICAgIH0pO1xuICAgIHRoaXMuc2Vla0Jhck1hcmtlcnNDb250YWluZXIgPSBzZWVrQmFyQ2hhcHRlck1hcmtlcnNDb250YWluZXI7XG5cbiAgICBzZWVrQmFyLmFwcGVuZCh0aGlzLnNlZWtCYXJCYWNrZHJvcCwgdGhpcy5zZWVrQmFyQnVmZmVyUG9zaXRpb24sIHRoaXMuc2Vla0JhclNlZWtQb3NpdGlvbixcbiAgICAgIHRoaXMuc2Vla0JhclBsYXliYWNrUG9zaXRpb24sIHRoaXMuc2Vla0Jhck1hcmtlcnNDb250YWluZXIsIHRoaXMuc2Vla0JhclBsYXliYWNrUG9zaXRpb25NYXJrZXIpO1xuXG4gICAgbGV0IHNlZWtpbmcgPSBmYWxzZTtcblxuICAgIC8vIERlZmluZSBoYW5kbGVyIGZ1bmN0aW9ucyBzbyB3ZSBjYW4gYXR0YWNoL3JlbW92ZSB0aGVtIGxhdGVyXG4gICAgbGV0IG1vdXNlVG91Y2hNb3ZlSGFuZGxlciA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpb24gdG8gVlIgaGFuZGxlclxuICAgICAgaWYgKHRoaXMucGxheWVyLnZyICE9IG51bGwpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHRhcmdldFBlcmNlbnRhZ2UgPSAxMDAgKiB0aGlzLmdldE9mZnNldChlKTtcbiAgICAgIHRoaXMuc2V0U2Vla1Bvc2l0aW9uKHRhcmdldFBlcmNlbnRhZ2UpO1xuICAgICAgdGhpcy5zZXRQbGF5YmFja1Bvc2l0aW9uKHRhcmdldFBlcmNlbnRhZ2UpO1xuICAgICAgdGhpcy5vblNlZWtQcmV2aWV3RXZlbnQodGFyZ2V0UGVyY2VudGFnZSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIGxldCBtb3VzZVRvdWNoVXBIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIC8vIFJlbW92ZSBoYW5kbGVycywgc2VlayBvcGVyYXRpb24gaXMgZmluaXNoZWRcbiAgICAgIG5ldyBET00oZG9jdW1lbnQpLm9mZigndG91Y2htb3ZlIG1vdXNlbW92ZScsIG1vdXNlVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICBuZXcgRE9NKGRvY3VtZW50KS5vZmYoJ3RvdWNoZW5kIG1vdXNldXAnLCBtb3VzZVRvdWNoVXBIYW5kbGVyKTtcblxuICAgICAgbGV0IHRhcmdldFBlcmNlbnRhZ2UgPSAxMDAgKiB0aGlzLmdldE9mZnNldChlKTtcbiAgICAgIGxldCBzbmFwcGVkQ2hhcHRlciA9IHRoaXMudGltZWxpbmVNYXJrZXJzSGFuZGxlciAmJiB0aGlzLnRpbWVsaW5lTWFya2Vyc0hhbmRsZXIuZ2V0TWFya2VyQXRQb3NpdGlvbih0YXJnZXRQZXJjZW50YWdlKTtcblxuICAgICAgdGhpcy5zZXRTZWVraW5nKGZhbHNlKTtcbiAgICAgIHNlZWtpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gRmlyZSBzZWVrZWQgZXZlbnRcbiAgICAgIHRoaXMub25TZWVrZWRFdmVudChzbmFwcGVkQ2hhcHRlciA/IHNuYXBwZWRDaGFwdGVyLnBvc2l0aW9uIDogdGFyZ2V0UGVyY2VudGFnZSk7XG4gICAgfTtcblxuICAgIC8vIEEgc2VlayBhbHdheXMgc3RhcnQgd2l0aCBhIHRvdWNoc3RhcnQgb3IgbW91c2Vkb3duIGRpcmVjdGx5IG9uIHRoZSBzZWVrYmFyLlxuICAgIC8vIFRvIHRyYWNrIGEgbW91c2Ugc2VlayBhbHNvIG91dHNpZGUgdGhlIHNlZWtiYXIgKGZvciB0b3VjaCBldmVudHMgdGhpcyB3b3JrcyBhdXRvbWF0aWNhbGx5KSxcbiAgICAvLyBzbyB0aGUgdXNlciBkb2VzIG5vdCBuZWVkIHRvIHRha2UgY2FyZSB0aGF0IHRoZSBtb3VzZSBhbHdheXMgc3RheXMgb24gdGhlIHNlZWtiYXIsIHdlIGF0dGFjaCB0aGUgbW91c2Vtb3ZlXG4gICAgLy8gYW5kIG1vdXNldXAgaGFuZGxlcnMgdG8gdGhlIHdob2xlIGRvY3VtZW50LiBBIHNlZWsgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgbGlmdHMgdGhlIG1vdXNlIGtleS5cbiAgICAvLyBBIHNlZWsgbW91c2UgZ2VzdHVyZSBpcyB0aHVzIGJhc2ljYWxseSBhIGNsaWNrIHdpdGggYSBsb25nIHRpbWUgZnJhbWUgYmV0d2VlbiBkb3duIGFuZCB1cCBldmVudHMuXG4gICAgc2Vla0Jhci5vbigndG91Y2hzdGFydCBtb3VzZWRvd24nLCAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGxldCBpc1RvdWNoRXZlbnQgPSBCcm93c2VyVXRpbHMuaXNUb3VjaFN1cHBvcnRlZCAmJiB0aGlzLmlzVG91Y2hFdmVudChlKTtcblxuICAgICAgLy8gUHJldmVudCBzZWxlY3Rpb24gb2YgRE9NIGVsZW1lbnRzIChhbHNvIHByZXZlbnRzIG1vdXNlZG93biBpZiBjdXJyZW50IGV2ZW50IGlzIHRvdWNoc3RhcnQpXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBBdm9pZCBwcm9wYWdhdGlvbiB0byBWUiBoYW5kbGVyXG4gICAgICBpZiAodGhpcy5wbGF5ZXIudnIgIT0gbnVsbCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFNlZWtpbmcodHJ1ZSk7IC8vIFNldCBzZWVraW5nIGNsYXNzIG9uIERPTSBlbGVtZW50XG4gICAgICBzZWVraW5nID0gdHJ1ZTsgLy8gU2V0IHNlZWsgdHJhY2tpbmcgZmxhZ1xuXG4gICAgICAvLyBGaXJlIHNlZWtlZCBldmVudFxuICAgICAgdGhpcy5vblNlZWtFdmVudCgpO1xuXG4gICAgICAvLyBBZGQgaGFuZGxlciB0byB0cmFjayB0aGUgc2VlayBvcGVyYXRpb24gb3ZlciB0aGUgd2hvbGUgZG9jdW1lbnRcbiAgICAgIG5ldyBET00oZG9jdW1lbnQpLm9uKGlzVG91Y2hFdmVudCA/ICd0b3VjaG1vdmUnIDogJ21vdXNlbW92ZScsIG1vdXNlVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICBuZXcgRE9NKGRvY3VtZW50KS5vbihpc1RvdWNoRXZlbnQgPyAndG91Y2hlbmQnIDogJ21vdXNldXAnLCBtb3VzZVRvdWNoVXBIYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIC8vIERpc3BsYXkgc2VlayB0YXJnZXQgaW5kaWNhdG9yIHdoZW4gbW91c2UgaG92ZXJzIG9yIGZpbmdlciBzbGlkZXMgb3ZlciBzZWVrYmFyXG4gICAgc2Vla0Jhci5vbigndG91Y2htb3ZlIG1vdXNlbW92ZScsIChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoc2Vla2luZykge1xuICAgICAgICBtb3VzZVRvdWNoTW92ZUhhbmRsZXIoZSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBwb3NpdGlvbiA9IDEwMCAqIHRoaXMuZ2V0T2Zmc2V0KGUpO1xuICAgICAgdGhpcy5zZXRTZWVrUG9zaXRpb24ocG9zaXRpb24pO1xuXG4gICAgICB0aGlzLm9uU2Vla1ByZXZpZXdFdmVudChwb3NpdGlvbiwgZmFsc2UpO1xuXG4gICAgICBpZiAodGhpcy5oYXNMYWJlbCgpICYmIHRoaXMuZ2V0TGFiZWwoKS5pc0hpZGRlbigpKSB7XG4gICAgICAgIHRoaXMuZ2V0TGFiZWwoKS5zaG93KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIaWRlIHNlZWsgdGFyZ2V0IGluZGljYXRvciB3aGVuIG1vdXNlIG9yIGZpbmdlciBsZWF2ZXMgc2Vla2JhclxuICAgIHNlZWtCYXIub24oJ3RvdWNoZW5kIG1vdXNlbGVhdmUnLCAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgdGhpcy5zZXRTZWVrUG9zaXRpb24oMCk7XG5cbiAgICAgIGlmICh0aGlzLmhhc0xhYmVsKCkpIHtcbiAgICAgICAgdGhpcy5nZXRMYWJlbCgpLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNlZWtCYXJDb250YWluZXIuYXBwZW5kKHNlZWtCYXIpO1xuXG4gICAgaWYgKHRoaXMubGFiZWwpIHtcbiAgICAgIHNlZWtCYXJDb250YWluZXIuYXBwZW5kKHRoaXMubGFiZWwuZ2V0RG9tRWxlbWVudCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2Vla0JhckNvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBob3Jpem9udGFsIG9mZnNldCBvZiBhIG1vdXNlL3RvdWNoIGV2ZW50IHBvaW50IGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUgc2VlayBiYXIuXG4gICAqIEBwYXJhbSBldmVudFBhZ2VYIHRoZSBwYWdlWCBjb29yZGluYXRlIG9mIGFuIGV2ZW50IHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZyb21cbiAgICogQHJldHVybnMge251bWJlcn0gYSBudW1iZXIgaW4gdGhlIHJhbmdlIG9mIFswLCAxXSwgd2hlcmUgMCBpcyB0aGUgbGVmdCBlZGdlIGFuZCAxIGlzIHRoZSByaWdodCBlZGdlXG4gICAqL1xuICBwcml2YXRlIGdldEhvcml6b250YWxPZmZzZXQoZXZlbnRQYWdlWDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZWxlbWVudE9mZnNldFB4ID0gdGhpcy5zZWVrQmFyLm9mZnNldCgpLmxlZnQ7XG4gICAgbGV0IHdpZHRoUHggPSB0aGlzLnNlZWtCYXIud2lkdGgoKTtcbiAgICBsZXQgb2Zmc2V0UHggPSBldmVudFBhZ2VYIC0gZWxlbWVudE9mZnNldFB4O1xuICAgIGxldCBvZmZzZXQgPSAxIC8gd2lkdGhQeCAqIG9mZnNldFB4O1xuXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVPZmZzZXQob2Zmc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgYSBtb3VzZS90b3VjaCBldmVudCBwb2ludCBmcm9tIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgc2VlayBiYXIuXG4gICAqIEBwYXJhbSBldmVudFBhZ2VZIHRoZSBwYWdlWCBjb29yZGluYXRlIG9mIGFuIGV2ZW50IHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZyb21cbiAgICogQHJldHVybnMge251bWJlcn0gYSBudW1iZXIgaW4gdGhlIHJhbmdlIG9mIFswLCAxXSwgd2hlcmUgMCBpcyB0aGUgYm90dG9tIGVkZ2UgYW5kIDEgaXMgdGhlIHRvcCBlZGdlXG4gICAqL1xuICBwcml2YXRlIGdldFZlcnRpY2FsT2Zmc2V0KGV2ZW50UGFnZVk6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGVsZW1lbnRPZmZzZXRQeCA9IHRoaXMuc2Vla0Jhci5vZmZzZXQoKS50b3A7XG4gICAgbGV0IHdpZHRoUHggPSB0aGlzLnNlZWtCYXIuaGVpZ2h0KCk7XG4gICAgbGV0IG9mZnNldFB4ID0gZXZlbnRQYWdlWSAtIGVsZW1lbnRPZmZzZXRQeDtcbiAgICBsZXQgb2Zmc2V0ID0gMSAvIHdpZHRoUHggKiBvZmZzZXRQeDtcblxuICAgIHJldHVybiAxIC0gdGhpcy5zYW5pdGl6ZU9mZnNldChvZmZzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG1vdXNlIG9yIHRvdWNoIGV2ZW50IG9mZnNldCBmb3IgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiAoaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCkuXG4gICAqIEBwYXJhbSBlIHRoZSBldmVudCB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBmcm9tXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IGEgbnVtYmVyIGluIHRoZSByYW5nZSBvZiBbMCwgMV1cbiAgICogQHNlZSAjZ2V0SG9yaXpvbnRhbE9mZnNldFxuICAgKiBAc2VlICNnZXRWZXJ0aWNhbE9mZnNldFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRPZmZzZXQoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiBudW1iZXIge1xuICAgIGlmIChCcm93c2VyVXRpbHMuaXNUb3VjaFN1cHBvcnRlZCAmJiB0aGlzLmlzVG91Y2hFdmVudChlKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnZlcnRpY2FsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFZlcnRpY2FsT2Zmc2V0KGUudHlwZSA9PT0gJ3RvdWNoZW5kJyA/IGUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVkgOiBlLnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SG9yaXpvbnRhbE9mZnNldChlLnR5cGUgPT09ICd0b3VjaGVuZCcgPyBlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYIDogZS50b3VjaGVzWzBdLnBhZ2VYKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy52ZXJ0aWNhbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRWZXJ0aWNhbE9mZnNldChlLnBhZ2VZKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhvcml6b250YWxPZmZzZXQoZS5wYWdlWCk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdpbnZhbGlkIGV2ZW50Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemVzIHRoZSBtb3VzZSBvZmZzZXQgdG8gdGhlIHJhbmdlIG9mIFswLCAxXS5cbiAgICpcbiAgICogV2hlbiB0cmFja2luZyB0aGUgbW91c2Ugb3V0c2lkZSB0aGUgc2VlayBiYXIsIHRoZSBvZmZzZXQgY2FuIGJlIG91dHNpZGUgdGhlIGRlc2lyZWQgcmFuZ2UgYW5kIHRoaXMgbWV0aG9kXG4gICAqIGxpbWl0cyBpdCB0byB0aGUgZGVzaXJlZCByYW5nZS4gRS5nLiBhIG1vdXNlIGV2ZW50IGxlZnQgb2YgdGhlIGxlZnQgZWRnZSBvZiBhIHNlZWsgYmFyIHlpZWxkcyBhbiBvZmZzZXQgYmVsb3dcbiAgICogemVybywgYnV0IHRvIGRpc3BsYXkgdGhlIHNlZWsgdGFyZ2V0IG9uIHRoZSBzZWVrIGJhciwgd2UgbmVlZCB0byBsaW1pdCBpdCB0byB6ZXJvLlxuICAgKlxuICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gc2FuaXRpemVcbiAgICogQHJldHVybnMge251bWJlcn0gdGhlIHNhbml0aXplZCBvZmZzZXQuXG4gICAqL1xuICBwcml2YXRlIHNhbml0aXplT2Zmc2V0KG9mZnNldDogbnVtYmVyKSB7XG4gICAgLy8gU2luY2Ugd2UgdHJhY2sgbW91c2UgbW92ZXMgb3ZlciB0aGUgd2hvbGUgZG9jdW1lbnQsIHRoZSB0YXJnZXQgY2FuIGJlIG91dHNpZGUgdGhlIHNlZWsgcmFuZ2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gbGltaXQgaXQgdG8gdGhlIFswLCAxXSByYW5nZS5cbiAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA+IDEpIHtcbiAgICAgIG9mZnNldCA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcGxheWJhY2sgcG9zaXRpb24gaW5kaWNhdG9yLlxuICAgKiBAcGFyYW0gcGVyY2VudCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCBhcyByZXR1cm5lZCBieSB0aGUgcGxheWVyXG4gICAqL1xuICBzZXRQbGF5YmFja1Bvc2l0aW9uKHBlcmNlbnQ6IG51bWJlcikge1xuICAgIHRoaXMucGxheWJhY2tQb3NpdGlvblBlcmNlbnRhZ2UgPSBwZXJjZW50O1xuXG4gICAgLy8gU2V0IHBvc2l0aW9uIG9mIHRoZSBiYXJcbiAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuc2Vla0JhclBsYXliYWNrUG9zaXRpb24sIHBlcmNlbnQpO1xuXG4gICAgLy8gU2V0IHBvc2l0aW9uIG9mIHRoZSBtYXJrZXJcbiAgICBsZXQgdG90YWxTaXplID0gKHRoaXMuY29uZmlnLnZlcnRpY2FsID8gKHRoaXMuc2Vla0Jhci5oZWlnaHQoKSAtIHRoaXMuc2Vla0JhclBsYXliYWNrUG9zaXRpb25NYXJrZXIuaGVpZ2h0KCkpIDogdGhpcy5zZWVrQmFyLndpZHRoKCkpO1xuICAgIGxldCBweCA9ICh0b3RhbFNpemUpIC8gMTAwICogcGVyY2VudDtcbiAgICBpZiAodGhpcy5jb25maWcudmVydGljYWwpIHtcbiAgICAgIHB4ID0gdGhpcy5zZWVrQmFyLmhlaWdodCgpIC0gcHggLSB0aGlzLnNlZWtCYXJQbGF5YmFja1Bvc2l0aW9uTWFya2VyLmhlaWdodCgpO1xuICAgIH1cblxuICAgIGxldCBzdHlsZSA9IHRoaXMuY29uZmlnLnZlcnRpY2FsID9cbiAgICAgIC8vIC1tcy10cmFuc2Zvcm0gcmVxdWlyZWQgZm9yIElFOVxuICAgICAgLy8gLXdlYmtpdC10cmFuc2Zvcm0gcmVxdWlyZWQgZm9yIEFuZHJvaWQgNC40IFdlYlZpZXdcbiAgICAgIHtcbiAgICAgICAgJ3RyYW5zZm9ybSc6ICd0cmFuc2xhdGVZKCcgKyBweCArICdweCknLFxuICAgICAgICAnLW1zLXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVZKCcgKyBweCArICdweCknLFxuICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlWSgnICsgcHggKyAncHgpJyxcbiAgICAgIH0gOlxuICAgICAge1xuICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVgoJyArIHB4ICsgJ3B4KScsXG4gICAgICAgICctbXMtdHJhbnNmb3JtJzogJ3RyYW5zbGF0ZVgoJyArIHB4ICsgJ3B4KScsXG4gICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICd0cmFuc2xhdGVYKCcgKyBweCArICdweCknLFxuICAgICAgfTtcbiAgICB0aGlzLnNlZWtCYXJQbGF5YmFja1Bvc2l0aW9uTWFya2VyLmNzcyhzdHlsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaGVzIHRoZSBwbGF5YmFjayBwb3NpdGlvbi4gQ2FuIGJlIHVzZWQgYnkgc3ViY2xhc3NlcyB0byByZWZyZXNoIHRoZSBwb3NpdGlvbiB3aGVuXG4gICAqIHRoZSBzaXplIG9mIHRoZSBjb21wb25lbnQgY2hhbmdlcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpIHtcbiAgICB0aGlzLnNldFBsYXliYWNrUG9zaXRpb24odGhpcy5wbGF5YmFja1Bvc2l0aW9uUGVyY2VudGFnZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcG9zaXRpb24gdW50aWwgd2hpY2ggbWVkaWEgaXMgYnVmZmVyZWQuXG4gICAqIEBwYXJhbSBwZXJjZW50IGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwXG4gICAqL1xuICBzZXRCdWZmZXJQb3NpdGlvbihwZXJjZW50OiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuc2Vla0JhckJ1ZmZlclBvc2l0aW9uLCBwZXJjZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwb3NpdGlvbiB3aGVyZSBhIHNlZWssIGlmIGV4ZWN1dGVkLCB3b3VsZCBqdW1wIHRvLlxuICAgKiBAcGFyYW0gcGVyY2VudCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMFxuICAgKi9cbiAgc2V0U2Vla1Bvc2l0aW9uKHBlcmNlbnQ6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy5zZWVrQmFyU2Vla1Bvc2l0aW9uLCBwZXJjZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGFjdHVhbCBwb3NpdGlvbiAod2lkdGggb3IgaGVpZ2h0KSBvZiBhIERPTSBlbGVtZW50IHRoYXQgcmVwcmVzZW50IGEgYmFyIGluIHRoZSBzZWVrIGJhci5cbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gc2V0IHRoZSBwb3NpdGlvbiBmb3JcbiAgICogQHBhcmFtIHBlcmNlbnQgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDBcbiAgICovXG4gIHByaXZhdGUgc2V0UG9zaXRpb24oZWxlbWVudDogRE9NLCBwZXJjZW50OiBudW1iZXIpIHtcbiAgICBsZXQgc2NhbGUgPSBwZXJjZW50IC8gMTAwO1xuXG4gICAgLy8gV2hlbiB0aGUgc2NhbGUgaXMgZXhhY3RseSAxIG9yIHZlcnkgbmVhciAxIChhbmQgdGhlIGJyb3dzZXIgaW50ZXJuYWxseSByb3VuZHMgaXQgdG8gMSksIGJyb3dzZXJzIHNlZW0gdG8gcmVuZGVyXG4gICAgLy8gdGhlIGVsZW1lbnRzIGRpZmZlcmVudGx5IGFuZCB0aGUgaGVpZ2h0IGdldHMgc2xpZ2h0bHkgb2ZmLCBsZWFkaW5nIHRvIG1pc21hdGNoaW5nIGhlaWdodHMgd2hlbiBlLmcuIHRoZSBidWZmZXJcbiAgICAvLyBsZXZlbCBiYXIgaGFzIGEgd2lkdGggb2YgMSBhbmQgdGhlIHBsYXliYWNrIHBvc2l0aW9uIGJhciBoYXMgYSB3aWR0aCA8IDEuIEEgaml0dGVyaW5nIGJ1ZmZlciBsZXZlbCBhcm91bmQgMVxuICAgIC8vIGxlYWRzIHRvIGFuIGV2ZW4gd29yc2UgZmxpY2tlcmluZyBlZmZlY3QuXG4gICAgLy8gVmFyaW91cyBjaGFuZ2VzIGluIENTUyBzdHlsaW5nIGFuZCBET00gaGllcmFyY2h5IGRpZCBub3Qgc29sdmUgdGhlIGlzc3VlIHNvIHRoZSB3b3JrYXJvdW5kIGlzIHRvIGF2b2lkIGEgc2NhbGVcbiAgICAvLyBvZiBleGFjdGx5IDEuXG4gICAgaWYgKHNjYWxlID49IDAuOTk5OTkgJiYgc2NhbGUgPD0gMS4wMDAwMSkge1xuICAgICAgc2NhbGUgPSAwLjk5OTk5O1xuICAgIH1cblxuICAgIGxldCBzdHlsZSA9IHRoaXMuY29uZmlnLnZlcnRpY2FsID9cbiAgICAgIC8vIC1tcy10cmFuc2Zvcm0gcmVxdWlyZWQgZm9yIElFOVxuICAgICAgLy8gLXdlYmtpdC10cmFuc2Zvcm0gcmVxdWlyZWQgZm9yIEFuZHJvaWQgNC40IFdlYlZpZXdcbiAgICAgIHtcbiAgICAgICAgJ3RyYW5zZm9ybSc6ICdzY2FsZVkoJyArIHNjYWxlICsgJyknLFxuICAgICAgICAnLW1zLXRyYW5zZm9ybSc6ICdzY2FsZVkoJyArIHNjYWxlICsgJyknLFxuICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAnc2NhbGVZKCcgKyBzY2FsZSArICcpJyxcbiAgICAgIH0gOlxuICAgICAge1xuICAgICAgICAndHJhbnNmb3JtJzogJ3NjYWxlWCgnICsgc2NhbGUgKyAnKScsXG4gICAgICAgICctbXMtdHJhbnNmb3JtJzogJ3NjYWxlWCgnICsgc2NhbGUgKyAnKScsXG4gICAgICAgICctd2Via2l0LXRyYW5zZm9ybSc6ICdzY2FsZVgoJyArIHNjYWxlICsgJyknLFxuICAgICAgfTtcbiAgICBlbGVtZW50LmNzcyhzdHlsZSk7XG4gIH1cblxuICAvKipcbiAgICogUHV0cyB0aGUgc2VlayBiYXIgaW50byBvciBvdXQgb2Ygc2Vla2luZyBzdGF0ZSBieSBhZGRpbmcvcmVtb3ZpbmcgYSBjbGFzcyB0byB0aGUgRE9NIGVsZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWRcbiAgICogdG8gYWRqdXN0IHRoZSBzdHlsaW5nIHdoaWxlIHNlZWtpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBzZWVraW5nIHNob3VsZCBiZSB0cnVlIHdoZW4gZW50ZXJpbmcgc2VlayBzdGF0ZSwgZmFsc2Ugd2hlbiBleGl0aW5nIHRoZSBzZWVrIHN0YXRlXG4gICAqL1xuICBzZXRTZWVraW5nKHNlZWtpbmc6IGJvb2xlYW4pIHtcbiAgICBpZiAoc2Vla2luZykge1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoU2Vla0Jhci5DTEFTU19TRUVLSU5HKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKHRoaXMucHJlZml4Q3NzKFNlZWtCYXIuQ0xBU1NfU0VFS0lORykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHNlZWsgYmFyIGlzIGN1cnJlbnRseSBpbiB0aGUgc2VlayBzdGF0ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgaW4gc2VlayBzdGF0ZSwgZWxzZSBmYWxzZVxuICAgKi9cbiAgaXNTZWVraW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldERvbUVsZW1lbnQoKS5oYXNDbGFzcyh0aGlzLnByZWZpeENzcyhTZWVrQmFyLkNMQVNTX1NFRUtJTkcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHNlZWsgYmFyIGhhcyBhIHtAbGluayBTZWVrQmFyTGFiZWx9LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc2VlayBiYXIgaGFzIGEgbGFiZWwsIGVsc2UgZmFsc2VcbiAgICovXG4gIGhhc0xhYmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhYmVsICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFiZWwgb2YgdGhpcyBzZWVrIGJhci5cbiAgICogQHJldHVybnMge1NlZWtCYXJMYWJlbH0gdGhlIGxhYmVsIGlmIHRoaXMgc2VlayBiYXIgaGFzIGEgbGFiZWwsIGVsc2UgbnVsbFxuICAgKi9cbiAgZ2V0TGFiZWwoKTogU2Vla0JhckxhYmVsIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFiZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZWVrRXZlbnQoKSB7XG4gICAgdGhpcy5zZWVrQmFyRXZlbnRzLm9uU2Vlay5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlZWtQcmV2aWV3RXZlbnQocGVyY2VudGFnZTogbnVtYmVyLCBzY3J1YmJpbmc6IGJvb2xlYW4pIHtcbiAgICBsZXQgc25hcHBlZE1hcmtlciA9IHRoaXMudGltZWxpbmVNYXJrZXJzSGFuZGxlciAmJiB0aGlzLnRpbWVsaW5lTWFya2Vyc0hhbmRsZXIuZ2V0TWFya2VyQXRQb3NpdGlvbihwZXJjZW50YWdlKTtcblxuICAgIGxldCBzZWVrUG9zaXRpb25QZXJjZW50YWdlID0gcGVyY2VudGFnZTtcblxuICAgIGlmIChzbmFwcGVkTWFya2VyKSB7XG4gICAgICBpZiAoc25hcHBlZE1hcmtlci5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPCBzbmFwcGVkTWFya2VyLnBvc2l0aW9uKSB7XG4gICAgICAgICAgLy8gU25hcCB0aGUgcG9zaXRpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCBpZiB0aGUgc2VlayBpcyB3aXRoaW4gdGhlIGxlZnQgc25hcCBtYXJnaW5cbiAgICAgICAgICAvLyBXZSBrbm93IHRoYXQgd2UgYXJlIHdpdGhpbiBhIHNuYXAgbWFyZ2luIHdoZW4gd2UgYXJlIG91dHNpZGUgdGhlIG1hcmtlciBpbnRlcnZhbCBidXQgc3RpbGxcbiAgICAgICAgICAvLyBoYXZlIGEgc25hcHBlZE1hcmtlclxuICAgICAgICAgIHNlZWtQb3NpdGlvblBlcmNlbnRhZ2UgPSBzbmFwcGVkTWFya2VyLnBvc2l0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnRhZ2UgPiBzbmFwcGVkTWFya2VyLnBvc2l0aW9uICsgc25hcHBlZE1hcmtlci5kdXJhdGlvbikge1xuICAgICAgICAgIC8vIFNuYXAgdGhlIHBvc2l0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGludGVydmFsIGlmIHRoZSBzZWVrIGlzIHdpdGhpbiB0aGUgcmlnaHQgc25hcCBtYXJnaW5cbiAgICAgICAgICBzZWVrUG9zaXRpb25QZXJjZW50YWdlID0gc25hcHBlZE1hcmtlci5wb3NpdGlvbiArIHNuYXBwZWRNYXJrZXIuZHVyYXRpb247XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFBvc2l0aW9uIG1hcmtlcnMgYWx3YXlzIHNuYXAgdG8gdGhlaXIgbWFya2VyIHBvc2l0aW9uXG4gICAgICAgIHNlZWtQb3NpdGlvblBlcmNlbnRhZ2UgPSBzbmFwcGVkTWFya2VyLnBvc2l0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICB0aGlzLmxhYmVsLmdldERvbUVsZW1lbnQoKS5jc3Moe1xuICAgICAgICAnbGVmdCc6IHNlZWtQb3NpdGlvblBlcmNlbnRhZ2UgKyAnJScsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNlZWtCYXJFdmVudHMub25TZWVrUHJldmlldy5kaXNwYXRjaCh0aGlzLCB7XG4gICAgICBzY3J1YmJpbmc6IHNjcnViYmluZyxcbiAgICAgIHBvc2l0aW9uOiBzZWVrUG9zaXRpb25QZXJjZW50YWdlLFxuICAgICAgbWFya2VyOiBzbmFwcGVkTWFya2VyLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU2Vla2VkRXZlbnQocGVyY2VudGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zZWVrQmFyRXZlbnRzLm9uU2Vla2VkLmRpc3BhdGNoKHRoaXMsIHBlcmNlbnRhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiBhIHNjcnViYmluZyBzZWVrIG9wZXJhdGlvbiBpcyBzdGFydGVkLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8U2Vla0JhciwgTm9BcmdzPn1cbiAgICovXG4gIGdldCBvblNlZWsoKTogRXZlbnQ8U2Vla0JhciwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vla0JhckV2ZW50cy5vblNlZWsuZ2V0RXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIGR1cmluZyBhIHNjcnViYmluZyBzZWVrICh0byBpbmRpY2F0ZSB0aGF0IHRoZSBzZWVrIHByZXZpZXcsIGkuZS4gdGhlIHZpZGVvIGZyYW1lLFxuICAgKiBzaG91bGQgYmUgdXBkYXRlZCksIG9yIGR1cmluZyBhIG5vcm1hbCBzZWVrIHByZXZpZXcgd2hlbiB0aGUgc2VlayBiYXIgaXMgaG92ZXJlZCAoYW5kIHRoZSBzZWVrIHRhcmdldCxcbiAgICogaS5lLiB0aGUgc2VlayBiYXIgbGFiZWwsIHNob3VsZCBiZSB1cGRhdGVkKS5cbiAgICogQHJldHVybnMge0V2ZW50PFNlZWtCYXIsIFNlZWtQcmV2aWV3RXZlbnRBcmdzPn1cbiAgICovXG4gIGdldCBvblNlZWtQcmV2aWV3KCk6IEV2ZW50PFNlZWtCYXIsIFNlZWtQcmV2aWV3RXZlbnRBcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vla0JhckV2ZW50cy5vblNlZWtQcmV2aWV3LmdldEV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIGEgc2NydWJiaW5nIHNlZWsgaGFzIGZpbmlzaGVkIG9yIHdoZW4gYSBkaXJlY3Qgc2VlayBpcyBpc3N1ZWQuXG4gICAqIEByZXR1cm5zIHtFdmVudDxTZWVrQmFyLCBudW1iZXI+fVxuICAgKi9cbiAgZ2V0IG9uU2Vla2VkKCk6IEV2ZW50PFNlZWtCYXIsIG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnNlZWtCYXJFdmVudHMub25TZWVrZWQuZ2V0RXZlbnQoKTtcbiAgfVxuXG5cbiAgcHJvdGVjdGVkIG9uU2hvd0V2ZW50KCk6IHZvaWQge1xuICAgIHN1cGVyLm9uU2hvd0V2ZW50KCk7XG5cbiAgICAvLyBSZWZyZXNoIHRoZSBwb3NpdGlvbiBvZiB0aGUgcGxheWJhY2sgcG9zaXRpb24gd2hlbiB0aGUgc2VlayBiYXIgYmVjb21lcyB2aXNpYmxlLiBUbyBjb3JyZWN0bHkgc2V0IHRoZSBwb3NpdGlvbixcbiAgICAvLyB0aGUgRE9NIGVsZW1lbnQgbXVzdCBiZSBmdWxseSBpbml0aWFsaXplZCBhbiBoYXZlIGl0cyBzaXplIGNhbGN1bGF0ZWQsIGJlY2F1c2UgdGhlIHBvc2l0aW9uIGlzIHNldCBhcyBhbiBhYnNvbHV0ZVxuICAgIC8vIHZhbHVlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgc2l6ZS4gVGhpcyByZXF1aXJlZCBzaXplIGlzIG5vdCBrbm93biB3aGVuIGl0IGlzIGhpZGRlbi5cbiAgICAvLyBGb3Igc3VjaCBjYXNlcywgd2UgcmVmcmVzaCB0aGUgcG9zaXRpb24gaGVyZSBpbiBvblNob3cgYmVjYXVzZSBoZXJlIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgY29tcG9uZW50IGtub3dzXG4gICAgLy8gaXRzIHNpemUgYW5kIGNhbiBzZXQgdGhlIHBvc2l0aW9uIGNvcnJlY3RseS5cbiAgICB0aGlzLnJlZnJlc2hQbGF5YmFja1Bvc2l0aW9uKCk7XG4gIH1cblxuIC8qKlxuICAgKiBDaGVja3MgaWYgVG91Y2hFdmVudCBpcyBzdXBwb3J0ZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIFRvdWNoRXZlbnQgbm90IHVuZGVmaW5lZCwgZWxzZSBmYWxzZVxuICAgKi9cbiAgaXNUb3VjaEV2ZW50KGU6IFVJRXZlbnQpOiBlIGlzIFRvdWNoRXZlbnQge1xuICAgIHJldHVybiB3aW5kb3cuVG91Y2hFdmVudCAmJiBlIGluc3RhbmNlb2YgVG91Y2hFdmVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHtQbGF5ZXJBUEl9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaW5CdWZmZXJMZXZlbChwbGF5ZXI6IFBsYXllckFQSSk6IG51bWJlciB7XG5cbiAgICBjb25zdCBwbGF5ZXJEdXJhdGlvbiA9IHBsYXllci5nZXREdXJhdGlvbigpO1xuXG4gICAgY29uc3QgdmlkZW9CdWZmZXJMZW5ndGggPSBwbGF5ZXIuZ2V0VmlkZW9CdWZmZXJMZW5ndGgoKTtcbiAgICBjb25zdCBhdWRpb0J1ZmZlckxlbmd0aCA9IHBsYXllci5nZXRBdWRpb0J1ZmZlckxlbmd0aCgpO1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgYnVmZmVyIGxlbmd0aCB3aGljaCBpcyB0aGUgc21hbGxlciBsZW5ndGggb2YgdGhlIGF1ZGlvIGFuZCB2aWRlbyBidWZmZXJzLiBJZiBvbmUgb2YgdGhlc2VcbiAgICAvLyBidWZmZXJzIGlzIG5vdCBhdmFpbGFibGUsIHdlIHNldCBpdCdzIHZhbHVlIHRvIE1BWF9WQUxVRSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3RoZXIgcmVhbCB2YWx1ZSBpcyB0YWtlblxuICAgIC8vIGFzIHRoZSBidWZmZXIgbGVuZ3RoLlxuICAgIGxldCBidWZmZXJMZW5ndGggPSBNYXRoLm1pbihcbiAgICAgICAgdmlkZW9CdWZmZXJMZW5ndGggIT0gbnVsbCA/IHZpZGVvQnVmZmVyTGVuZ3RoIDogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgYXVkaW9CdWZmZXJMZW5ndGggIT0gbnVsbCA/IGF1ZGlvQnVmZmVyTGVuZ3RoIDogTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgLy8gSWYgYm90aCBidWZmZXIgbGVuZ3RocyBhcmUgbWlzc2luZywgd2Ugc2V0IHRoZSBidWZmZXIgbGVuZ3RoIHRvIHplcm9cbiAgICBpZiAoYnVmZmVyTGVuZ3RoID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgIGJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIDEwMCAvIHBsYXllckR1cmF0aW9uICogYnVmZmVyTGVuZ3RoO1xufVxuIiwiaW1wb3J0IHsgVUlVdGlscyB9IGZyb20gJy4uL3VpdXRpbHMnO1xuaW1wb3J0IHsgRE9NIH0gZnJvbSAnLi4vZG9tJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBWb2x1bWVDb250cm9sbGVyIH0gZnJvbSAnLi4vdm9sdW1lY29udHJvbGxlcic7XG5cbmV4cG9ydCBlbnVtIFNlZWtCYXJUeXBlIHtcbiAgVm9kLFxuICBMaXZlLFxuICBWb2x1bWUsXG59XG5cbmludGVyZmFjZSBSYW5nZSB7XG4gIG1pbjogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEtleVN0ZXBJbmNyZW1lbnRzQ29uZmlnIHtcbiAgbGVmdFJpZ2h0OiBudW1iZXI7XG4gIHVwRG93bjogbnVtYmVyO1xufVxuXG5jb25zdCBjb2VyY2VWYWx1ZUludG9SYW5nZSA9IChcbiAgdmFsdWU6IG51bWJlcixcbiAgcmFuZ2U6IFJhbmdlLFxuICBjYjogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQsXG4pID0+IHtcbiAgaWYgKHZhbHVlIDwgcmFuZ2UubWluKSB7XG4gICAgY2IocmFuZ2UubWluKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA+IHJhbmdlLm1heCkge1xuICAgIGNiKHJhbmdlLm1heCk7XG4gIH0gZWxzZSB7XG4gICAgY2IodmFsdWUpO1xuICB9XG59O1xuXG5leHBvcnQgY2xhc3MgU2Vla0JhckNvbnRyb2xsZXIge1xuICBwcm90ZWN0ZWQga2V5U3RlcEluY3JlbWVudHM6IEtleVN0ZXBJbmNyZW1lbnRzQ29uZmlnO1xuICBwcm90ZWN0ZWQgcGxheWVyOiBQbGF5ZXJBUEk7XG4gIHByb3RlY3RlZCB2b2x1bWVDb250cm9sbGVyOiBWb2x1bWVDb250cm9sbGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGtleVN0ZXBJbmNyZW1lbnRzOiBLZXlTdGVwSW5jcmVtZW50c0NvbmZpZyxcbiAgICBwbGF5ZXI6IFBsYXllckFQSSxcbiAgICB2b2x1bWVDb250cm9sbGVyOiBWb2x1bWVDb250cm9sbGVyLFxuICApIHtcbiAgICB0aGlzLmtleVN0ZXBJbmNyZW1lbnRzID0ga2V5U3RlcEluY3JlbWVudHM7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy52b2x1bWVDb250cm9sbGVyID0gdm9sdW1lQ29udHJvbGxlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcnJvd0tleUNvbnRyb2xzKFxuICAgIGN1cnJlbnRWYWx1ZTogbnVtYmVyLFxuICAgIHJhbmdlOiBSYW5nZSxcbiAgICB2YWx1ZVVwZGF0ZTogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQsXG4gICkge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IE1hdGguZmxvb3IoY3VycmVudFZhbHVlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiAoKSA9PiBjb2VyY2VWYWx1ZUludG9SYW5nZShjb250cm9sVmFsdWUgLSB0aGlzLmtleVN0ZXBJbmNyZW1lbnRzLmxlZnRSaWdodCwgcmFuZ2UsIHZhbHVlVXBkYXRlKSxcbiAgICAgIHJpZ2h0OiAoKSA9PiBjb2VyY2VWYWx1ZUludG9SYW5nZShjb250cm9sVmFsdWUgKyB0aGlzLmtleVN0ZXBJbmNyZW1lbnRzLmxlZnRSaWdodCwgcmFuZ2UsIHZhbHVlVXBkYXRlKSxcbiAgICAgIHVwOiAoKSA9PiBjb2VyY2VWYWx1ZUludG9SYW5nZShjb250cm9sVmFsdWUgKyB0aGlzLmtleVN0ZXBJbmNyZW1lbnRzLnVwRG93biwgcmFuZ2UsIHZhbHVlVXBkYXRlKSxcbiAgICAgIGRvd246ICgpID0+IGNvZXJjZVZhbHVlSW50b1JhbmdlKGNvbnRyb2xWYWx1ZSAtIHRoaXMua2V5U3RlcEluY3JlbWVudHMudXBEb3duLCByYW5nZSwgdmFsdWVVcGRhdGUpLFxuICAgICAgaG9tZTogKCkgPT4gY29lcmNlVmFsdWVJbnRvUmFuZ2UocmFuZ2UubWluLCByYW5nZSwgdmFsdWVVcGRhdGUpLFxuICAgICAgZW5kOiAoKSA9PiBjb2VyY2VWYWx1ZUludG9SYW5nZShyYW5nZS5tYXgsIHJhbmdlLCB2YWx1ZVVwZGF0ZSksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZWVrQmFyQ29udHJvbHModHlwZTogU2Vla0JhclR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gU2Vla0JhclR5cGUuTGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJyb3dLZXlDb250cm9scyh0aGlzLnBsYXllci5nZXRUaW1lU2hpZnQoKSwgeyBtaW46IHRoaXMucGxheWVyLmdldE1heFRpbWVTaGlmdCgpLCBtYXg6IDAgfSwgdGhpcy5wbGF5ZXIudGltZVNoaWZ0KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFNlZWtCYXJUeXBlLlZvZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJyb3dLZXlDb250cm9scyh0aGlzLnBsYXllci5nZXRDdXJyZW50VGltZSgpLCB7IG1pbjogMCwgbWF4OiB0aGlzLnBsYXllci5nZXREdXJhdGlvbigpIH0sIHRoaXMucGxheWVyLnNlZWspO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gU2Vla0JhclR5cGUuVm9sdW1lICYmIHRoaXMudm9sdW1lQ29udHJvbGxlciAhPSBudWxsKSB7XG4gICAgICBjb25zdCB2b2x1bWVUcmFuc2l0aW9uID0gdGhpcy52b2x1bWVDb250cm9sbGVyLnN0YXJ0VHJhbnNpdGlvbigpO1xuICAgICAgcmV0dXJuIHRoaXMuYXJyb3dLZXlDb250cm9scyh0aGlzLnBsYXllci5nZXRWb2x1bWUoKSwgeyBtaW46IDAsIG1heDogMTAwIH0sIHZvbHVtZVRyYW5zaXRpb24uZmluaXNoLmJpbmQodm9sdW1lVHJhbnNpdGlvbikpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWVrQmFyQ29udHJvbHMoZG9tRWxlbWVudDogRE9NLCB0eXBlOiAoKSA9PiBTZWVrQmFyVHlwZSkge1xuICAgIGRvbUVsZW1lbnQub24oJ2tleWRvd24nLCAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbHMgPSB0aGlzLnNlZWtCYXJDb250cm9scyh0eXBlKCkpO1xuICAgICAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSBVSVV0aWxzLktleUNvZGUuTGVmdEFycm93OiB7XG4gICAgICAgICAgY29udHJvbHMubGVmdCgpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFVJVXRpbHMuS2V5Q29kZS5SaWdodEFycm93OiB7XG4gICAgICAgICAgY29udHJvbHMucmlnaHQoKTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBVSVV0aWxzLktleUNvZGUuVXBBcnJvdzoge1xuICAgICAgICAgIGNvbnRyb2xzLnVwKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVUlVdGlscy5LZXlDb2RlLkRvd25BcnJvdzoge1xuICAgICAgICAgIGNvbnRyb2xzLmRvd24oKTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBVSVV0aWxzLktleUNvZGUuSG9tZToge1xuICAgICAgICAgIGNvbnRyb2xzLmhvbWUoKTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBVSVV0aWxzLktleUNvZGUuRW5kOiB7XG4gICAgICAgICAgY29udHJvbHMuZW5kKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgVUlVdGlscy5LZXlDb2RlLlNwYWNlOiB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIuaXNQbGF5aW5nKCkgPyB0aGlzLnBsYXllci5wYXVzZSgpIDogdGhpcy5wbGF5ZXIucGxheSgpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59IiwiaW1wb3J0IHtDb250YWluZXIsIENvbnRhaW5lckNvbmZpZ30gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHtMYWJlbCwgTGFiZWxDb25maWd9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudENvbmZpZ30gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtTdHJpbmdVdGlsc30gZnJvbSAnLi4vc3RyaW5ndXRpbHMnO1xuaW1wb3J0IHtJbWFnZUxvYWRlcn0gZnJvbSAnLi4vaW1hZ2Vsb2FkZXInO1xuaW1wb3J0IHtDc3NQcm9wZXJ0aWVzfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHsgUGxheWVyQVBJLCBUaHVtYm5haWwgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgU2Vla0JhciwgU2Vla1ByZXZpZXdFdmVudEFyZ3MgfSBmcm9tICcuL3NlZWtiYXInO1xuaW1wb3J0IHsgUGxheWVyVXRpbHMgfSBmcm9tICcuLi9wbGF5ZXJ1dGlscyc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIFNlZWtCYXJMYWJlbH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vla0JhckxhYmVsQ29uZmlnIGV4dGVuZHMgQ29udGFpbmVyQ29uZmlnIHtcbiAgLy8gbm90aGluZyB5ZXRcbn1cblxuLyoqXG4gKiBBIGxhYmVsIGZvciBhIHtAbGluayBTZWVrQmFyfSB0aGF0IGNhbiBkaXNwbGF5IHRoZSBzZWVrIHRhcmdldCB0aW1lLCBhIHRodW1ibmFpbCwgYW5kIHRpdGxlIChlLmcuIGNoYXB0ZXIgdGl0bGUpLlxuICovXG5leHBvcnQgY2xhc3MgU2Vla0JhckxhYmVsIGV4dGVuZHMgQ29udGFpbmVyPFNlZWtCYXJMYWJlbENvbmZpZz4ge1xuXG4gIHByaXZhdGUgdGltZUxhYmVsOiBMYWJlbDxMYWJlbENvbmZpZz47XG4gIHByaXZhdGUgdGl0bGVMYWJlbDogTGFiZWw8TGFiZWxDb25maWc+O1xuICBwcml2YXRlIHRodW1ibmFpbDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz47XG5cbiAgcHJpdmF0ZSB0aHVtYm5haWxJbWFnZUxvYWRlcjogSW1hZ2VMb2FkZXI7XG5cbiAgcHJpdmF0ZSB0aW1lRm9ybWF0OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBhcHBsaWVkTWFya2VyQ3NzQ2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBwbGF5ZXI6IFBsYXllckFQSTtcbiAgcHJpdmF0ZSB1aU1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU2Vla0JhckxhYmVsQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy50aW1lTGFiZWwgPSBuZXcgTGFiZWwoeyBjc3NDbGFzc2VzOiBbJ3NlZWtiYXItbGFiZWwtdGltZSddIH0pO1xuICAgIHRoaXMudGl0bGVMYWJlbCA9IG5ldyBMYWJlbCh7IGNzc0NsYXNzZXM6IFsnc2Vla2Jhci1sYWJlbC10aXRsZSddIH0pO1xuICAgIHRoaXMudGh1bWJuYWlsID0gbmV3IENvbXBvbmVudCh7IGNzc0NsYXNzZXM6IFsnc2Vla2Jhci10aHVtYm5haWwnXSwgcm9sZTogJ2ltZycgfSk7XG4gICAgdGhpcy50aHVtYm5haWxJbWFnZUxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1zZWVrYmFyLWxhYmVsJyxcbiAgICAgIGNvbXBvbmVudHM6IFtuZXcgQ29udGFpbmVyKHtcbiAgICAgICAgY29tcG9uZW50czogW1xuICAgICAgICAgIHRoaXMudGh1bWJuYWlsLFxuICAgICAgICAgIG5ldyBDb250YWluZXIoe1xuICAgICAgICAgICAgY29tcG9uZW50czogW3RoaXMudGl0bGVMYWJlbCwgdGhpcy50aW1lTGFiZWxdLFxuICAgICAgICAgICAgY3NzQ2xhc3M6ICdzZWVrYmFyLWxhYmVsLW1ldGFkYXRhJyxcbiAgICAgICAgICB9KV0sXG4gICAgICAgIGNzc0NsYXNzOiAnc2Vla2Jhci1sYWJlbC1pbm5lcicsXG4gICAgICB9KV0sXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMudWlNYW5hZ2VyID0gdWltYW5hZ2VyO1xuICAgIHVpbWFuYWdlci5vblNlZWtQcmV2aWV3LnN1YnNjcmliZVJhdGVMaW1pdGVkKHRoaXMuaGFuZGxlU2Vla1ByZXZpZXcsIDEwMCk7XG5cbiAgICBsZXQgaW5pdCA9ICgpID0+IHtcbiAgICAgIC8vIFNldCB0aW1lIGZvcm1hdCBkZXBlbmRpbmcgb24gc291cmNlIGR1cmF0aW9uXG4gICAgICB0aGlzLnRpbWVGb3JtYXQgPSBNYXRoLmFicyhwbGF5ZXIuaXNMaXZlKCkgPyBwbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCkgOiBwbGF5ZXIuZ2V0RHVyYXRpb24oKSkgPj0gMzYwMCA/XG4gICAgICAgIFN0cmluZ1V0aWxzLkZPUk1BVF9ISE1NU1MgOiBTdHJpbmdVdGlscy5GT1JNQVRfTU1TUztcbiAgICAgIC8vIFNldCBpbml0aWFsIHN0YXRlIG9mIHRpdGxlIGFuZCB0aHVtYm5haWwgdG8gaGFuZGxlIHNvdXJjZUxvYWRlZCB3aGVuIHN3aXRjaGluZyB0byBhIGxpdmUtc3RyZWFtXG4gICAgICB0aGlzLnNldFRpdGxlVGV4dChudWxsKTtcbiAgICAgIHRoaXMuc2V0VGh1bWJuYWlsKG51bGwpO1xuICAgIH07XG5cbiAgICB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUoaW5pdCk7XG4gICAgaW5pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTZWVrUHJldmlldyA9IChzZW5kZXI6IFNlZWtCYXIsIGFyZ3M6IFNlZWtQcmV2aWV3RXZlbnRBcmdzKSA9PiB7XG4gICAgaWYgKHRoaXMucGxheWVyLmlzTGl2ZSgpKSB7XG4gICAgICBsZXQgbWF4VGltZVNoaWZ0ID0gdGhpcy5wbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCk7XG4gICAgICBsZXQgdGltZVNoaWZ0UHJldmlldyA9IG1heFRpbWVTaGlmdCAtIG1heFRpbWVTaGlmdCAqIChhcmdzLnBvc2l0aW9uIC8gMTAwKTtcblxuICAgICAgdGhpcy5zZXRUaW1lKHRpbWVTaGlmdFByZXZpZXcpO1xuXG4gICAgICAvLyBJbiBjYXNlIG9mIGEgbGl2ZSBzdHJlYW0gdGhlIHBsYXllciBleHBlY3RzIHRoZSB0aW1lIHBhc3NlZCBpbnRvIHRoZSBnZXRUaHVtYm5haWwgYXMgYSB3YWxsQ2xvY2tUaW1lIGFuZCBub3RcbiAgICAgIC8vIGFzIGEgcmVsYXRpdmUgdGltZVNoaWZ0IHZhbHVlLlxuICAgICAgY29uc3QgY29udmVydFRpbWVTaGlmdFByZXZpZXdUb1dhbGxDbG9ja1RpbWUgPSAodGFyZ2V0VGltZVNoaWZ0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGltZVNoaWZ0ID0gdGhpcy5wbGF5ZXIuZ2V0VGltZVNoaWZ0KCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gdGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTtcblxuICAgICAgICBjb25zdCB3YWxsQ2xvY2tUaW1lT2ZMaXZlRWRnZSA9IGN1cnJlbnRUaW1lIC0gY3VycmVudFRpbWVTaGlmdDtcbiAgICAgICAgcmV0dXJuIHdhbGxDbG9ja1RpbWVPZkxpdmVFZGdlICsgdGFyZ2V0VGltZVNoaWZ0O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgd2FsbENsb2NrVGltZSA9IGNvbnZlcnRUaW1lU2hpZnRQcmV2aWV3VG9XYWxsQ2xvY2tUaW1lKHRpbWVTaGlmdFByZXZpZXcpO1xuICAgICAgdGhpcy5zZXRUaHVtYm5haWwodGhpcy5wbGF5ZXIuZ2V0VGh1bWJuYWlsKHdhbGxDbG9ja1RpbWUpKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdGltZSA9IHRoaXMucGxheWVyLmdldER1cmF0aW9uKCkgKiAoYXJncy5wb3NpdGlvbiAvIDEwMCk7XG4gICAgICB0aGlzLnNldFRpbWUodGltZSk7XG5cbiAgICAgIGNvbnN0IHNlZWthYmxlUmFuZ2VTdGFydCA9IFBsYXllclV0aWxzLmdldFNlZWthYmxlUmFuZ2VTdGFydCh0aGlzLnBsYXllciwgMCk7XG4gICAgICBjb25zdCBhYnNvbHV0ZVNlZWtUYXJnZXQgPSB0aW1lICsgc2Vla2FibGVSYW5nZVN0YXJ0O1xuICAgICAgdGhpcy5zZXRUaHVtYm5haWwodGhpcy5wbGF5ZXIuZ2V0VGh1bWJuYWlsKGFic29sdXRlU2Vla1RhcmdldCkpO1xuICAgIH1cblxuICAgIGlmIChhcmdzLm1hcmtlcikge1xuICAgICAgdGhpcy5zZXRUaXRsZVRleHQoYXJncy5tYXJrZXIubWFya2VyLnRpdGxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRUaXRsZVRleHQobnVsbCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIENTUyBjbGFzc2VzIGZyb20gcHJldmlvdXMgbWFya2VyXG4gICAgaWYgKHRoaXMuYXBwbGllZE1hcmtlckNzc0NsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkucmVtb3ZlQ2xhc3ModGhpcy5hcHBsaWVkTWFya2VyQ3NzQ2xhc3Nlcy5qb2luKCcgJykpO1xuICAgICAgdGhpcy5hcHBsaWVkTWFya2VyQ3NzQ2xhc3NlcyA9IFtdO1xuICAgIH1cblxuICAgIC8vIEFkZCBDU1MgY2xhc3NlcyBvZiBjdXJyZW50IG1hcmtlclxuICAgIGlmIChhcmdzLm1hcmtlcikge1xuICAgICAgY29uc3QgY3NzQ2xhc3NlcyA9IChhcmdzLm1hcmtlci5tYXJrZXIuY3NzQ2xhc3NlcyB8fCBbXSkubWFwKGNzc0NsYXNzID0+IHRoaXMucHJlZml4Q3NzKGNzc0NsYXNzKSk7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyhjc3NDbGFzc2VzLmpvaW4oJyAnKSk7XG4gICAgICB0aGlzLmFwcGxpZWRNYXJrZXJDc3NDbGFzc2VzID0gY3NzQ2xhc3NlcztcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgYXJiaXRyYXJ5IHRleHQgb24gdGhlIGxhYmVsLlxuICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byBzaG93IG9uIHRoZSBsYWJlbFxuICAgKi9cbiAgc2V0VGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnRpbWVMYWJlbC5zZXRUZXh0KHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSB0aW1lIHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgbGFiZWwuXG4gICAqIEBwYXJhbSBzZWNvbmRzIHRoZSB0aW1lIGluIHNlY29uZHMgdG8gZGlzcGxheSBvbiB0aGUgbGFiZWxcbiAgICovXG4gIHNldFRpbWUoc2Vjb25kczogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRUZXh0KFN0cmluZ1V0aWxzLnNlY29uZHNUb1RpbWUoc2Vjb25kcywgdGhpcy50aW1lRm9ybWF0KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdGV4dCBvbiB0aGUgdGl0bGUgbGFiZWwuXG4gICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIHNob3cgb24gdGhlIGxhYmVsXG4gICAqL1xuICBzZXRUaXRsZVRleHQodGV4dCA9ICcnKSB7XG4gICAgdGhpcy50aXRsZUxhYmVsLnNldFRleHQodGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBvciByZW1vdmVzIGEgdGh1bWJuYWlsIG9uIHRoZSBsYWJlbC5cbiAgICogQHBhcmFtIHRodW1ibmFpbCB0aGUgdGh1bWJuYWlsIHRvIGRpc3BsYXkgb24gdGhlIGxhYmVsIG9yIG51bGwgdG8gcmVtb3ZlIGEgZGlzcGxheWVkIHRodW1ibmFpbFxuICAgKi9cbiAgc2V0VGh1bWJuYWlsKHRodW1ibmFpbDogVGh1bWJuYWlsID0gbnVsbCkge1xuICAgIGxldCB0aHVtYm5haWxFbGVtZW50ID0gdGhpcy50aHVtYm5haWwuZ2V0RG9tRWxlbWVudCgpO1xuXG4gICAgaWYgKHRodW1ibmFpbCA9PSBudWxsKSB7XG4gICAgICB0aHVtYm5haWxFbGVtZW50LmNzcyh7XG4gICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogbnVsbCxcbiAgICAgICAgJ2Rpc3BsYXknOiBudWxsLFxuICAgICAgICAnd2lkdGgnOiBudWxsLFxuICAgICAgICAnaGVpZ2h0JzogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIFdlIHVzZSB0aGUgdGh1bWJuYWlsIGltYWdlIGxvYWRlciB0byBtYWtlIHN1cmUgdGhlIHRodW1ibmFpbCBpcyBsb2FkZWQgYW5kIGl0J3Mgc2l6ZSBpcyBrbm93biBiZWZvcmUgYmUgY2FuXG4gICAgICAvLyBjYWxjdWxhdGUgdGhlIENTUyBwcm9wZXJ0aWVzIGFuZCBzZXQgdGhlbSBvbiB0aGUgZWxlbWVudC5cbiAgICAgIHRoaXMudGh1bWJuYWlsSW1hZ2VMb2FkZXIubG9hZCh0aHVtYm5haWwudXJsLCAodXJsLCB3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgICAgIC8vIGNhbiBiZSBjaGVja2VkIGxpa2UgdGhhdCBiZWNhdXNlIHgveS93L2ggYXJlIGVpdGhlciBhbGwgcHJlc2VudCBvciBub25lXG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9tZWRpYS1mcmFncy8jbmFtaW5nLXNwYWNlXG4gICAgICAgIGlmICh0aHVtYm5haWwueCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGh1bWJuYWlsRWxlbWVudC5jc3ModGhpcy50aHVtYm5haWxDc3NTcHJpdGUodGh1bWJuYWlsLCB3aWR0aCwgaGVpZ2h0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGh1bWJuYWlsRWxlbWVudC5jc3ModGhpcy50aHVtYm5haWxDc3NTaW5nbGVJbWFnZSh0aHVtYm5haWwsIHdpZHRoLCBoZWlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0aHVtYm5haWxDc3NTcHJpdGUodGh1bWJuYWlsOiBUaHVtYm5haWwsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogQ3NzUHJvcGVydGllcyB7XG4gICAgbGV0IHRodW1ibmFpbENvdW50WCA9IHdpZHRoIC8gdGh1bWJuYWlsLndpZHRoO1xuICAgIGxldCB0aHVtYm5haWxDb3VudFkgPSBoZWlnaHQgLyB0aHVtYm5haWwuaGVpZ2h0O1xuXG4gICAgbGV0IHRodW1ibmFpbEluZGV4WCA9IHRodW1ibmFpbC54IC8gdGh1bWJuYWlsLndpZHRoO1xuICAgIGxldCB0aHVtYm5haWxJbmRleFkgPSB0aHVtYm5haWwueSAvIHRodW1ibmFpbC5oZWlnaHQ7XG5cbiAgICBsZXQgc2l6ZVggPSAxMDAgKiB0aHVtYm5haWxDb3VudFg7XG4gICAgbGV0IHNpemVZID0gMTAwICogdGh1bWJuYWlsQ291bnRZO1xuXG4gICAgbGV0IG9mZnNldFggPSAxMDAgKiB0aHVtYm5haWxJbmRleFg7XG4gICAgbGV0IG9mZnNldFkgPSAxMDAgKiB0aHVtYm5haWxJbmRleFk7XG5cbiAgICBsZXQgYXNwZWN0UmF0aW8gPSAxIC8gdGh1bWJuYWlsLndpZHRoICogdGh1bWJuYWlsLmhlaWdodDtcblxuICAgIC8vIFRoZSB0aHVtYm5haWwgc2l6ZSBpcyBzZXQgYnkgc2V0dGluZyB0aGUgQ1NTICd3aWR0aCcgYW5kICdwYWRkaW5nLWJvdHRvbScgcHJvcGVydGllcy4gJ3BhZGRpbmctYm90dG9tJyBpc1xuICAgIC8vIHVzZWQgYmVjYXVzZSBpdCBpcyByZWxhdGl2ZSB0byB0aGUgd2lkdGggYW5kIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSB0aHVtYm5haWwuXG4gICAgLy8gQSBkZWZhdWx0IHZhbHVlIGZvciB3aWR0aCBpcyBzZXQgaW4gdGhlIHN0eWxlc2hlZXQgYW5kIGNhbiBiZSBvdmVyd3JpdHRlbiBmcm9tIHRoZXJlIG9yIGFueXdoZXJlIGVsc2UuXG4gICAgcmV0dXJuIHtcbiAgICAgICdkaXNwbGF5JzogJ2luaGVyaXQnLFxuICAgICAgJ2JhY2tncm91bmQtaW1hZ2UnOiBgdXJsKCR7dGh1bWJuYWlsLnVybH0pYCxcbiAgICAgICdwYWRkaW5nLWJvdHRvbSc6IGAkezEwMCAqIGFzcGVjdFJhdGlvfSVgLFxuICAgICAgJ2JhY2tncm91bmQtc2l6ZSc6IGAke3NpemVYfSUgJHtzaXplWX0lYCxcbiAgICAgICdiYWNrZ3JvdW5kLXBvc2l0aW9uJzogYC0ke29mZnNldFh9JSAtJHtvZmZzZXRZfSVgLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHRodW1ibmFpbENzc1NpbmdsZUltYWdlKHRodW1ibmFpbDogVGh1bWJuYWlsLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IENzc1Byb3BlcnRpZXMge1xuICAgIGxldCBhc3BlY3RSYXRpbyA9IDEgLyB3aWR0aCAqIGhlaWdodDtcblxuICAgIHJldHVybiB7XG4gICAgICAnZGlzcGxheSc6ICdpbmhlcml0JyxcbiAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogYHVybCgke3RodW1ibmFpbC51cmx9KWAsXG4gICAgICAncGFkZGluZy1ib3R0b20nOiBgJHsxMDAgKiBhc3BlY3RSYXRpb30lYCxcbiAgICAgICdiYWNrZ3JvdW5kLXNpemUnOiBgMTAwJSAxMDAlYCxcbiAgICAgICdiYWNrZ3JvdW5kLXBvc2l0aW9uJzogYDAgMGAsXG4gICAgfTtcbiAgfVxuXG4gIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgc3VwZXIucmVsZWFzZSgpO1xuXG4gICAgdGhpcy51aU1hbmFnZXIub25TZWVrUHJldmlldy51bnN1YnNjcmliZSh0aGlzLmhhbmRsZVNlZWtQcmV2aWV3KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtMaXN0U2VsZWN0b3IsIExpc3RTZWxlY3RvckNvbmZpZ30gZnJvbSAnLi9saXN0c2VsZWN0b3InO1xuaW1wb3J0IHtET019IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQgeyBpMThuLCBMb2NhbGl6YWJsZVRleHQgfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBzaW1wbGUgc2VsZWN0IGJveCBwcm92aWRpbmcgdGhlIHBvc3NpYmlsaXR5IHRvIHNlbGVjdCBhIHNpbmdsZSBpdGVtIG91dCBvZiBhIGxpc3Qgb2YgYXZhaWxhYmxlIGl0ZW1zLlxuICpcbiAqIERPTSBleGFtcGxlOlxuICogPGNvZGU+XG4gKiAgICAgPHNlbGVjdCBjbGFzcz0ndWktc2VsZWN0Ym94Jz5cbiAqICAgICAgICAgPG9wdGlvbiB2YWx1ZT0na2V5Jz5sYWJlbDwvb3B0aW9uPlxuICogICAgICAgICAuLi5cbiAqICAgICA8L3NlbGVjdD5cbiAqIDwvY29kZT5cbiAqL1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0Qm94IGV4dGVuZHMgTGlzdFNlbGVjdG9yPExpc3RTZWxlY3RvckNvbmZpZz4ge1xuXG4gIHByaXZhdGUgc2VsZWN0RWxlbWVudDogRE9NO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogTGlzdFNlbGVjdG9yQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1zZWxlY3Rib3gnLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b0RvbUVsZW1lbnQoKTogRE9NIHtcbiAgICBsZXQgc2VsZWN0RWxlbWVudCA9IG5ldyBET00oJ3NlbGVjdCcsIHtcbiAgICAgICdpZCc6IHRoaXMuY29uZmlnLmlkLFxuICAgICAgJ2NsYXNzJzogdGhpcy5nZXRDc3NDbGFzc2VzKCksXG4gICAgICAnYXJpYS1sYWJlbCc6IGkxOG4ucGVyZm9ybUxvY2FsaXphdGlvbih0aGlzLmNvbmZpZy5hcmlhTGFiZWwpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3RFbGVtZW50ID0gc2VsZWN0RWxlbWVudDtcbiAgICB0aGlzLnVwZGF0ZURvbUl0ZW1zKCk7XG5cbiAgICBzZWxlY3RFbGVtZW50Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBzZWxlY3RFbGVtZW50LnZhbCgpO1xuICAgICAgdGhpcy5vbkl0ZW1TZWxlY3RlZEV2ZW50KHZhbHVlLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VsZWN0RWxlbWVudDtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVEb21JdGVtcyhzZWxlY3RlZFZhbHVlOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgLy8gRGVsZXRlIGFsbCBjaGlsZHJlblxuICAgIHRoaXMuc2VsZWN0RWxlbWVudC5lbXB0eSgpO1xuXG4gICAgLy8gQWRkIHVwZGF0ZWQgY2hpbGRyZW5cbiAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgIGxldCBvcHRpb25FbGVtZW50ID0gbmV3IERPTSgnb3B0aW9uJywge1xuICAgICAgICAndmFsdWUnOiBTdHJpbmcoaXRlbS5rZXkpLFxuICAgICAgfSkuaHRtbChpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24oaXRlbS5sYWJlbCkpO1xuXG4gICAgICBpZiAoaXRlbS5rZXkgPT09IFN0cmluZyhzZWxlY3RlZFZhbHVlKSkgeyAvLyBjb252ZXJ0IHNlbGVjdGVkVmFsdWUgdG8gc3RyaW5nIHRvIGNhdGNoICdudWxsJy9udWxsIGNhc2VcbiAgICAgICAgb3B0aW9uRWxlbWVudC5hdHRyKCdzZWxlY3RlZCcsICdzZWxlY3RlZCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdEVsZW1lbnQuYXBwZW5kKG9wdGlvbkVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbkl0ZW1BZGRlZEV2ZW50KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXBlci5vbkl0ZW1BZGRlZEV2ZW50KHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZURvbUl0ZW1zKHRoaXMuc2VsZWN0ZWRJdGVtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkl0ZW1SZW1vdmVkRXZlbnQodmFsdWU6IHN0cmluZykge1xuICAgIHN1cGVyLm9uSXRlbVJlbW92ZWRFdmVudCh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVEb21JdGVtcyh0aGlzLnNlbGVjdGVkSXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JdGVtU2VsZWN0ZWRFdmVudCh2YWx1ZTogc3RyaW5nLCB1cGRhdGVEb21JdGVtczogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlci5vbkl0ZW1TZWxlY3RlZEV2ZW50KHZhbHVlKTtcbiAgICBpZiAodXBkYXRlRG9tSXRlbXMpIHtcbiAgICAgIHRoaXMudXBkYXRlRG9tSXRlbXModmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udGFpbmVyLCBDb250YWluZXJDb25maWcgfSBmcm9tICcuL2NvbnRhaW5lcic7XG5pbXBvcnQgeyBTZWxlY3RCb3ggfSBmcm9tICcuL3NlbGVjdGJveCc7XG5pbXBvcnQgeyBVSUluc3RhbmNlTWFuYWdlciB9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBUaW1lb3V0IH0gZnJvbSAnLi4vdGltZW91dCc7XG5pbXBvcnQgeyBFdmVudCwgRXZlbnREaXNwYXRjaGVyLCBOb0FyZ3MgfSBmcm9tICcuLi9ldmVudGRpc3BhdGNoZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbFBhZ2UgfSBmcm9tICcuL3NldHRpbmdzcGFuZWxwYWdlJztcbmltcG9ydCB7IFNldHRpbmdzUGFuZWxJdGVtIH0gZnJvbSAnLi9zZXR0aW5nc3BhbmVsaXRlbSc7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRDb25maWcgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIFNldHRpbmdzUGFuZWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzUGFuZWxDb25maWcgZXh0ZW5kcyBDb250YWluZXJDb25maWcge1xuICAvKipcbiAgICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgc2V0dGluZ3MgcGFuZWwgd2lsbCBiZSBoaWRkZW4gd2hlbiB0aGVyZSBpcyBubyB1c2VyIGludGVyYWN0aW9uLlxuICAgKiBTZXQgdG8gLTEgdG8gZGlzYWJsZSBhdXRvbWF0aWMgaGlkaW5nLlxuICAgKiBEZWZhdWx0OiAzIHNlY29uZHMgKDMwMDApXG4gICAqL1xuICBoaWRlRGVsYXk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gc3BlY2lmeSBpZiB0aGVyZSBzaG91bGQgYmUgYW4gYW5pbWF0aW9uIHdoZW4gc3dpdGNoaW5nIFNldHRpbmdzUGFuZWxQYWdlcy5cbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgcGFnZVRyYW5zaXRpb25BbmltYXRpb24/OiBib29sZWFuO1xufVxuXG5lbnVtIE5hdmlnYXRpb25EaXJlY3Rpb24ge1xuICBGb3J3YXJkcyxcbiAgQmFja3dhcmRzLFxufVxuXG4vKipcbiAqIEEgcGFuZWwgY29udGFpbmluZyBhIGxpc3Qgb2Yge0BsaW5rIFNldHRpbmdzUGFuZWxQYWdlIGl0ZW1zfS5cbiAqXG4gKiBUbyBjb25maWd1cmUgcGFnZXMganVzdCBwYXNzIHRoZW0gaW4gdGhlIGNvbXBvbmVudHMgYXJyYXkuXG4gKlxuICogRXhhbXBsZTpcbiAqICBsZXQgc2V0dGluZ3NQYW5lbCA9IG5ldyBTZXR0aW5nc1BhbmVsKHtcbiAqICAgIGhpZGRlbjogdHJ1ZSxcbiAqICB9KTtcbiAqXG4gKiAgbGV0IHNldHRpbmdzUGFuZWxQYWdlID0gbmV3IFNldHRpbmdzUGFuZWxQYWdlKHtcbiAqICAgIGNvbXBvbmVudHM6IFvigKZdXG4gKiAgfSk7XG4gKlxuICogIGxldCBzZWNvbmRTZXR0aW5nc1BhbmVsUGFnZSA9IG5ldyBTZXR0aW5nc1BhbmVsUGFnZSh7XG4gKiAgICBjb21wb25lbnRzOiBb4oCmXVxuICogIH0pO1xuICpcbiAqICBzZXR0aW5nc1BhbmVsLmFkZENvbXBvbmVudChzZXR0aW5nc1BhbmVsUGFnZSk7XG4gKiAgc2V0dGluZ3NQYW5lbC5hZGRDb21wb25lbnQoc2Vjb25kU2V0dGluZ3NQYW5lbFBhZ2UpO1xuICpcbiAqIEZvciBhbiBleGFtcGxlIGhvdyB0byBuYXZpZ2F0ZSBiZXR3ZWVuIHBhZ2VzIEBzZWUgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JCdXR0b25cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzUGFuZWwgZXh0ZW5kcyBDb250YWluZXI8U2V0dGluZ3NQYW5lbENvbmZpZz4ge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENMQVNTX0FDVElWRV9QQUdFID0gJ2FjdGl2ZSc7XG5cbiAgLy8gbmF2aWdhdGlvbiBoYW5kbGluZ1xuICBwcml2YXRlIGFjdGl2ZVBhZ2U6IFNldHRpbmdzUGFuZWxQYWdlO1xuICBwcml2YXRlIG5hdmlnYXRpb25TdGFjazogU2V0dGluZ3NQYW5lbFBhZ2VbXSA9IFtdO1xuXG4gIHByaXZhdGUgc2V0dGluZ3NQYW5lbEV2ZW50cyA9IHtcbiAgICBvblNldHRpbmdzU3RhdGVDaGFuZ2VkOiBuZXcgRXZlbnREaXNwYXRjaGVyPFNldHRpbmdzUGFuZWwsIE5vQXJncz4oKSxcbiAgfTtcblxuICBwcml2YXRlIGhpZGVUaW1lb3V0OiBUaW1lb3V0O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU2V0dGluZ3NQYW5lbENvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXNldHRpbmdzLXBhbmVsJyxcbiAgICAgIGhpZGVEZWxheTogMzAwMCxcbiAgICAgIHBhZ2VUcmFuc2l0aW9uQW5pbWF0aW9uOiB0cnVlLFxuICAgIH0gYXMgU2V0dGluZ3NQYW5lbENvbmZpZywgdGhpcy5jb25maWcpO1xuXG4gICAgdGhpcy5hY3RpdmVQYWdlID0gdGhpcy5nZXRSb290UGFnZSgpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIGxldCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuXG4gICAgdWltYW5hZ2VyLm9uQ29udHJvbHNIaWRlLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGVIb3ZlcmVkU2VsZWN0Qm94ZXMoKSk7XG5cbiAgICBpZiAoY29uZmlnLmhpZGVEZWxheSA+IC0xKSB7XG4gICAgICB0aGlzLmhpZGVUaW1lb3V0ID0gbmV3IFRpbWVvdXQoY29uZmlnLmhpZGVEZWxheSwgKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgdGhpcy5oaWRlSG92ZXJlZFNlbGVjdEJveGVzKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLm9uKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAvLyBPbiBtb3VzZSBlbnRlciBjbGVhciB0aGUgdGltZW91dFxuICAgICAgICB0aGlzLmhpZGVUaW1lb3V0LmNsZWFyKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLm9uKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgICAvLyBPbiBtb3VzZSBsZWF2ZSBhY3RpdmF0ZSB0aGUgdGltZW91dFxuICAgICAgICB0aGlzLmhpZGVUaW1lb3V0LnJlc2V0KCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLm9uKCdmb2N1c2luJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZGVUaW1lb3V0LmNsZWFyKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLm9uKCdmb2N1c291dCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5oaWRlVGltZW91dC5yZXNldCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkhpZGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmIChjb25maWcuaGlkZURlbGF5ID4gLTEpIHtcbiAgICAgICAgLy8gQ2xlYXIgdGltZW91dCB3aGVuIGhpZGRlbiBmcm9tIG91dHNpZGVcbiAgICAgICAgdGhpcy5oaWRlVGltZW91dC5jbGVhcigpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaW5jZSB3ZSBkb24ndCByZXNldCB0aGUgYWN0dWFsIG5hdmlnYXRpb24gaGVyZSB3ZSBuZWVkIHRvIHNpbXVsYXRlIGEgb25JbmFjdGl2ZSBldmVudCBpbiBjYXNlIHNvbWUgcGFuZWxcbiAgICAgIC8vIG5lZWRzIHRvIGRvIHNvbWV0aGluZyB3aGVuIHRoZXkgYmVjb21lIGludmlzaWJsZSAvIGluYWN0aXZlLlxuICAgICAgdGhpcy5hY3RpdmVQYWdlLm9uSW5hY3RpdmVFdmVudCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vblNob3cuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIFJlc2V0IG5hdmlnYXRpb24gd2hlbiB0ZSBwYW5lbCBnZXRzIHZpc2libGUgdG8gYXZvaWQgYSB3ZWlyZCBhbmltYXRpb24gd2hlbiBoaWRpbmdcbiAgICAgIHRoaXMucmVzZXROYXZpZ2F0aW9uKHRydWUpO1xuICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBuYXZpZ2F0ZSB0byB0aGUgcm9vdCBwYWdlIGFnYWluIHdlIG5lZWQgdG8gZmlyZSB0aGUgb25BY3RpdmUgZXZlbnQgd2hlbiB0aGUgc2V0dGluZ3NcbiAgICAgIC8vIHBhbmVsIGdldHMgdmlzaWJsZS5cbiAgICAgIHRoaXMuYWN0aXZlUGFnZS5vbkFjdGl2ZUV2ZW50KCk7XG5cbiAgICAgIGlmIChjb25maWcuaGlkZURlbGF5ID4gLTEpIHtcbiAgICAgICAgLy8gQWN0aXZhdGUgdGltZW91dCB3aGVuIHNob3duXG4gICAgICAgIHRoaXMuaGlkZVRpbWVvdXQuc3RhcnQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHBhc3MgZXZlbnQgZnJvbSByb290IHBhZ2UgdGhyb3VnaFxuICAgIHRoaXMuZ2V0Um9vdFBhZ2UoKS5vblNldHRpbmdzU3RhdGVDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm9uU2V0dGluZ3NTdGF0ZUNoYW5nZWRFdmVudCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVBY3RpdmVQYWdlQ2xhc3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFjdGl2ZSAvIHZpc2libGUgcGFnZVxuICAgKiBAcmV0dXJuIHtTZXR0aW5nc1BhbmVsUGFnZX1cbiAgICovXG4gIGdldEFjdGl2ZVBhZ2UoKTogU2V0dGluZ3NQYW5lbFBhZ2Uge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZVBhZ2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGVcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVQYWdlfSBpbnN0ZWFkXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKi9cbiAgc2V0QWN0aXZlUGFnZUluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldEFjdGl2ZVBhZ2UodGhpcy5nZXRQYWdlcygpW2luZGV4XSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgcGFzc2VkIHBhZ2UgdG8gdGhlIG5hdmlnYXRpb24gc3RhY2sgYW5kIG1ha2VzIGl0IHZpc2libGUuXG4gICAqIFVzZSB7QGxpbmsgcG9wU2V0dGluZ3NQYW5lbFBhZ2V9IHRvIG5hdmlnYXRlIGJhY2t3YXJkcy5cbiAgICpcbiAgICogUmVzdWx0cyBpbiBuby1vcCBpZiB0aGUgdGFyZ2V0IHBhZ2UgaXMgdGhlIGN1cnJlbnQgcGFnZS5cbiAgICogQHBhcmFtcyBwYWdlXG4gICAqL1xuICBzZXRBY3RpdmVQYWdlKHRhcmdldFBhZ2U6IFNldHRpbmdzUGFuZWxQYWdlKTogdm9pZCB7XG4gICAgaWYgKHRhcmdldFBhZ2UgPT09IHRoaXMuZ2V0QWN0aXZlUGFnZSgpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1BhZ2UgaXMgYWxyZWFkeSB0aGUgY3VycmVudCBvbmUgLi4uIHNraXBwaW5nIG5hdmlnYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm5hdmlnYXRlVG9QYWdlKFxuICAgICAgdGFyZ2V0UGFnZSxcbiAgICAgIHRoaXMuZ2V0QWN0aXZlUGFnZSgpLFxuICAgICAgTmF2aWdhdGlvbkRpcmVjdGlvbi5Gb3J3YXJkcyxcbiAgICAgICEodGhpcy5jb25maWcgYXMgU2V0dGluZ3NQYW5lbENvbmZpZykucGFnZVRyYW5zaXRpb25BbmltYXRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIG5hdmlnYXRpb24gc3RhY2sgYnkgbmF2aWdhdGluZyBiYWNrIHRvIHRoZSByb290IHBhZ2UgYW5kIGRpc3BsYXlpbmcgaXQuXG4gICAqL1xuICBwb3BUb1Jvb3RTZXR0aW5nc1BhbmVsUGFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0TmF2aWdhdGlvbigodGhpcy5jb25maWcgYXMgU2V0dGluZ3NQYW5lbENvbmZpZykucGFnZVRyYW5zaXRpb25BbmltYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGN1cnJlbnQgcGFnZSBmcm9tIHRoZSBuYXZpZ2F0aW9uIHN0YWNrIGFuZCBtYWtlcyB0aGUgcHJldmlvdXMgb25lIHZpc2libGUuXG4gICAqIFJlc3VsdHMgaW4gYSBuby1vcCBpZiB3ZSBhcmUgYWxyZWFkeSBvbiB0aGUgcm9vdCBwYWdlLlxuICAgKi9cbiAgcG9wU2V0dGluZ3NQYW5lbFBhZ2UoKSB7XG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKCdBbHJlYWR5IG9uIHRoZSByb290IHBhZ2UgLi4uIHNraXBwaW5nIG5hdmlnYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGFyZ2V0UGFnZSA9IHRoaXMubmF2aWdhdGlvblN0YWNrW3RoaXMubmF2aWdhdGlvblN0YWNrLmxlbmd0aCAtIDJdO1xuICAgIC8vIFRoZSByb290IHBhcnQgaXNuJ3QgcGFydCBvZiB0aGUgbmF2aWdhdGlvbiBzdGFjayBzbyBoYW5kbGUgaXQgZXhwbGljaXRseSBoZXJlXG4gICAgaWYgKCF0YXJnZXRQYWdlKSB7XG4gICAgICB0YXJnZXRQYWdlID0gdGhpcy5nZXRSb290UGFnZSgpO1xuICAgIH1cblxuICAgIHRoaXMubmF2aWdhdGVUb1BhZ2UoXG4gICAgICB0YXJnZXRQYWdlLFxuICAgICAgdGhpcy5hY3RpdmVQYWdlLFxuICAgICAgTmF2aWdhdGlvbkRpcmVjdGlvbi5CYWNrd2FyZHMsXG4gICAgICAhKHRoaXMuY29uZmlnIGFzIFNldHRpbmdzUGFuZWxDb25maWcpLnBhZ2VUcmFuc2l0aW9uQW5pbWF0aW9uLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZXJlIGFyZSBhY3RpdmUgc2V0dGluZ3Mgd2l0aGluIHRoZSByb290IHBhZ2Ugb2YgdGhlIHNldHRpbmdzIHBhbmVsLlxuICAgKiBBbiBhY3RpdmUgc2V0dGluZyBpcyBhIHNldHRpbmcgdGhhdCBpcyB2aXNpYmxlIGFuZCBlbmFibGVkLCB3aGljaCB0aGUgdXNlciBjYW4gaW50ZXJhY3Qgd2l0aC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlcmUgYXJlIGFjdGl2ZSBzZXR0aW5ncywgZmFsc2UgaWYgdGhlIHBhbmVsIGlzIGZ1bmN0aW9uYWxseSBlbXB0eSB0byBhIHVzZXJcbiAgICovXG4gIHJvb3RQYWdlSGFzQWN0aXZlU2V0dGluZ3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdFBhZ2UoKS5oYXNBY3RpdmVTZXR0aW5ncygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbGwgY29uZmlndXJlZCBwYWdlc1xuICAgKiBAcmV0dXJucyB7U2V0dGluZ3NQYW5lbFBhZ2VbXX1cbiAgICovXG4gIGdldFBhZ2VzKCk6IFNldHRpbmdzUGFuZWxQYWdlW10ge1xuICAgIHJldHVybiA8U2V0dGluZ3NQYW5lbFBhZ2VbXT50aGlzLmNvbmZpZy5jb21wb25lbnRzLmZpbHRlcihjb21wb25lbnQgPT4gY29tcG9uZW50IGluc3RhbmNlb2YgU2V0dGluZ3NQYW5lbFBhZ2UpO1xuICB9XG5cbiAgZ2V0IG9uU2V0dGluZ3NTdGF0ZUNoYW5nZWQoKTogRXZlbnQ8U2V0dGluZ3NQYW5lbCwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NQYW5lbEV2ZW50cy5vblNldHRpbmdzU3RhdGVDaGFuZ2VkLmdldEV2ZW50KCk7XG4gIH1cblxuICByZWxlYXNlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlbGVhc2UoKTtcbiAgICBpZiAodGhpcy5oaWRlVGltZW91dCkge1xuICAgICAgdGhpcy5oaWRlVGltZW91dC5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN1cHBvcnQgYWRkaW5nIHNldHRpbmdzUGFuZWxQYWdlcyBhZnRlciBpbml0aWFsaXphdGlvblxuICBhZGRDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPikge1xuICAgIGlmICh0aGlzLmdldFBhZ2VzKCkubGVuZ3RoID09PSAwICYmIGNvbXBvbmVudCBpbnN0YW5jZW9mIFNldHRpbmdzUGFuZWxQYWdlKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBhZ2UgPSBjb21wb25lbnQ7XG4gICAgfVxuICAgIHN1cGVyLmFkZENvbXBvbmVudChjb21wb25lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBY3RpdmVQYWdlQ2xhc3MoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRQYWdlcygpLmZvckVhY2goKHBhZ2U6IFNldHRpbmdzUGFuZWxQYWdlKSA9PiB7XG4gICAgICBpZiAocGFnZSA9PT0gdGhpcy5hY3RpdmVQYWdlKSB7XG4gICAgICAgIHBhZ2UuZ2V0RG9tRWxlbWVudCgpLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKFNldHRpbmdzUGFuZWwuQ0xBU1NfQUNUSVZFX1BBR0UpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhZ2UuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKHRoaXMucHJlZml4Q3NzKFNldHRpbmdzUGFuZWwuQ0xBU1NfQUNUSVZFX1BBR0UpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXROYXZpZ2F0aW9uKHJlc2V0TmF2aWdhdGlvbk9uU2hvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZVBhZ2UgPSB0aGlzLmdldEFjdGl2ZVBhZ2UoKTtcbiAgICBjb25zdCByb290UGFnZSA9IHRoaXMuZ2V0Um9vdFBhZ2UoKTtcbiAgICBpZiAoc291cmNlUGFnZSkge1xuICAgICAgLy8gU2luY2UgdGhlIG9uSW5hY3RpdmVFdmVudCB3YXMgYWxyZWFkeSBmaXJlZCBpbiB0aGUgb25IaWRlIHdlIG5lZWQgdG8gc3VwcHJlc3MgaXQgaGVyZVxuICAgICAgaWYgKCFyZXNldE5hdmlnYXRpb25PblNob3cpIHtcbiAgICAgICAgc291cmNlUGFnZS5vbkluYWN0aXZlRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5uYXZpZ2F0aW9uU3RhY2sgPSBbXTtcbiAgICB0aGlzLmFuaW1hdGVOYXZpZ2F0aW9uKHJvb3RQYWdlLCBzb3VyY2VQYWdlLCByZXNldE5hdmlnYXRpb25PblNob3cpO1xuICAgIHRoaXMuYWN0aXZlUGFnZSA9IHJvb3RQYWdlO1xuICAgIHRoaXMudXBkYXRlQWN0aXZlUGFnZUNsYXNzKCk7XG4gIH1cblxuICBwcml2YXRlIG5hdmlnYXRlVG9QYWdlKFxuICAgIHRhcmdldFBhZ2U6IFNldHRpbmdzUGFuZWxQYWdlLFxuICAgIHNvdXJjZVBhZ2U6IFNldHRpbmdzUGFuZWxQYWdlLFxuICAgIGRpcmVjdGlvbjogTmF2aWdhdGlvbkRpcmVjdGlvbixcbiAgICBza2lwQW5pbWF0aW9uOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVBhZ2UgPSB0YXJnZXRQYWdlO1xuXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gTmF2aWdhdGlvbkRpcmVjdGlvbi5Gb3J3YXJkcykge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uU3RhY2sucHVzaCh0YXJnZXRQYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uU3RhY2sucG9wKCk7XG4gICAgfVxuXG4gICAgdGhpcy5hbmltYXRlTmF2aWdhdGlvbih0YXJnZXRQYWdlLCBzb3VyY2VQYWdlLCBza2lwQW5pbWF0aW9uKTtcblxuICAgIHRoaXMudXBkYXRlQWN0aXZlUGFnZUNsYXNzKCk7XG4gICAgdGFyZ2V0UGFnZS5vbkFjdGl2ZUV2ZW50KCk7XG4gICAgc291cmNlUGFnZS5vbkluYWN0aXZlRXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gdGFyZ2V0UGFnZVxuICAgKiBAcGFyYW0gc291cmNlUGFnZVxuICAgKiBAcGFyYW0gc2tpcEFuaW1hdGlvbiBUaGlzIGlzIGp1c3QgYW4gaW50ZXJuYWwgZmxhZyBpZiB3ZSB3YW50IHRvIGhhdmUgYW4gYW5pbWF0aW9uLiBJdCBpcyBzZXQgdHJ1ZSB3aGVuIHdlIHJlc2V0XG4gICAqIHRoZSBuYXZpZ2F0aW9uIHdpdGhpbiB0aGUgb25TaG93IGNhbGxiYWNrIG9mIHRoZSBzZXR0aW5nc1BhbmVsLiBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qgd2FudCBhbiBhY3R1YWwgYW5pbWF0aW9uIGJ1dFxuICAgKiB0aGUgcmVjYWxjdWxhdGlvbiBvZiB0aGUgZGltZW5zaW9uIG9mIHRoZSBzZXR0aW5nc1BhbmVsLlxuICAgKiBUaGlzIGlzIGluZGVwZW5kZW50IG9mIHRoZSBwYWdlVHJhbnNpdGlvbkFuaW1hdGlvbiBmbGFnLlxuICAgKi9cbiAgcHJpdmF0ZSBhbmltYXRlTmF2aWdhdGlvbih0YXJnZXRQYWdlOiBTZXR0aW5nc1BhbmVsUGFnZSwgc291cmNlUGFnZTogU2V0dGluZ3NQYW5lbFBhZ2UsIHNraXBBbmltYXRpb246IGJvb2xlYW4pIHtcbiAgICBpZiAoISh0aGlzLmNvbmZpZyBhcyBTZXR0aW5nc1BhbmVsQ29uZmlnKS5wYWdlVHJhbnNpdGlvbkFuaW1hdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzUGFuZWxEb21FbGVtZW50ID0gdGhpcy5nZXREb21FbGVtZW50KCk7XG4gICAgY29uc3Qgc2V0dGluZ3NQYW5lbEhUTUxFbGVtZW50ID0gdGhpcy5nZXREb21FbGVtZW50KCkuZ2V0KDApO1xuXG4gICAgLy8gZ2V0IGN1cnJlbnQgZGltZW5zaW9uXG4gICAgY29uc3Qgc2V0dGluZ3NQYW5lbFdpZHRoID0gc2V0dGluZ3NQYW5lbEhUTUxFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgIGNvbnN0IHNldHRpbmdzUGFuZWxIZWlnaHQgPSBzZXR0aW5nc1BhbmVsSFRNTEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuXG4gICAgLy8gY2FsY3VsYXRlIHRhcmdldCBzaXplIG9mIHRoZSBzZXR0aW5ncyBwYW5lbFxuICAgIHNvdXJjZVBhZ2UuZ2V0RG9tRWxlbWVudCgpLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgdGhpcy5nZXREb21FbGVtZW50KCkuY3NzKHsgd2lkdGg6ICcnLCBoZWlnaHQ6ICcnIH0pOyAvLyBsZXQgY3NzIGF1dG8gc2V0dGluZ3Mga2ljayBpbiBhZ2FpblxuXG4gICAgY29uc3QgdGFyZ2V0UGFnZUh0bWxFbGVtZW50ID0gdGFyZ2V0UGFnZS5nZXREb21FbGVtZW50KCkuZ2V0KDApO1xuICAgIC8vIGNsb25lIHRoZSB0YXJnZXRQYWdlIERPTSBlbGVtZW50IHNvIHRoYXQgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgd2lkdGggLyBoZWlnaHQgaG93IHRoZXkgd2lsbCBiZSBhZnRlclxuICAgIC8vIHN3aXRjaGluZyB0aGUgcGFnZS4gV2UgYXJlIHVzaW5nIGEgY2xvbmUgdG8gcHJldmVudCAobW9zdGx5IHN0eWxpbmcpIHNpZGUtZWZmZWN0cyBvbiB0aGUgcmVhbCBET00gZWxlbWVudFxuICAgIGNvbnN0IGNsb25lID0gdGFyZ2V0UGFnZUh0bWxFbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcbiAgICAvLyBhcHBlbmQgdG8gcGFyZW50IHNvIHdlIGdldCB0aGUgJ3JlYWwnIHNpemVcbiAgICBjb25zdCBjb250YWluZXJXcmFwcGVyID0gdGFyZ2V0UGFnZUh0bWxFbGVtZW50LnBhcmVudE5vZGU7XG4gICAgY29udGFpbmVyV3JhcHBlci5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgLy8gc2V0IGNsb25lIHZpc2libGVcbiAgICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIC8vIGNvbGxlY3QgdGFyZ2V0IGRpbWVuc2lvblxuICAgIGNvbnN0IHRhcmdldFNldHRpbmdzUGFuZWxXaWR0aCA9IHNldHRpbmdzUGFuZWxIVE1MRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICBjb25zdCB0YXJnZXRTZXR0aW5nc1BhbmVsSGVpZ2h0ID0gc2V0dGluZ3NQYW5lbEhUTUxFbGVtZW50LnNjcm9sbEhlaWdodDtcblxuICAgIC8vIHJlbW92ZSBjbG9uZSBmcm9tIHRoZSBET01cbiAgICBjbG9uZS5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGNsb25lKTsgLy8gLnJlbW92ZSgpIGlzIG5vdCB3b3JraW5nIGluIElFXG4gICAgc291cmNlUGFnZS5nZXREb21FbGVtZW50KCkuY3NzKCdkaXNwbGF5JywgJycpO1xuXG4gICAgLy8gc2V0IHRoZSB2YWx1ZXMgYmFjayB0byB0aGUgY3VycmVudCBvbmVzIHRoYXQgdGhlIGJyb3dzZXIgYW5pbWF0ZXMgaXQgKGJyb3dzZXJzIGRvbid0IGFuaW1hdGUgJ2F1dG8nIHZhbHVlcylcbiAgICBzZXR0aW5nc1BhbmVsRG9tRWxlbWVudC5jc3Moe1xuICAgICAgd2lkdGg6IHNldHRpbmdzUGFuZWxXaWR0aCArICdweCcsXG4gICAgICBoZWlnaHQ6IHNldHRpbmdzUGFuZWxIZWlnaHQgKyAncHgnLFxuICAgIH0pO1xuXG4gICAgaWYgKCFza2lwQW5pbWF0aW9uKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGZvcmNlIHRoZSBicm93c2VyIHRvIHJlZmxvdyBiZXR3ZWVuIHNldHRpbmcgdGhlIHdpZHRoIGFuZCBoZWlnaHQgdGhhdCB3ZSBhY3R1YWxseSBnZXQgYSBhbmltYXRpb25cbiAgICAgIHRoaXMuZm9yY2VCcm93c2VyUmVmbG93KCk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHRoZSB2YWx1ZXMgdG8gdGhlIHRhcmdldCBkaW1lbnNpb25cbiAgICBzZXR0aW5nc1BhbmVsRG9tRWxlbWVudC5jc3Moe1xuICAgICAgd2lkdGg6IHRhcmdldFNldHRpbmdzUGFuZWxXaWR0aCArICdweCcsXG4gICAgICBoZWlnaHQ6IHRhcmdldFNldHRpbmdzUGFuZWxIZWlnaHQgKyAncHgnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JjZUJyb3dzZXJSZWZsb3coKTogdm9pZCB7XG4gICAgLy8gRm9yY2UgdGhlIGJyb3dzZXIgdG8gcmVmbG93IHRoZSBsYXlvdXRcbiAgICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9wYXVsaXJpc2gvNWQ1MmZiMDgxYjM1NzBjODFlM2FcbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5nZXQoMCkub2Zmc2V0TGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYWNrIGZvciBJRSArIEZpcmVmb3hcbiAgICogd2hlbiB0aGUgc2V0dGluZ3MgcGFuZWwgZmFkZXMgb3V0IHdoaWxlIGFuIGl0ZW0gb2YgYSBzZWxlY3QgYm94IGlzIHN0aWxsIGhvdmVyZWQsIHRoZSBzZWxlY3QgYm94IHdpbGwgbm90IGZhZGUgb3V0XG4gICAqIHdoaWxlIHRoZSBzZXR0aW5ncyBwYW5lbCBkb2VzLiBUaGlzIHdvdWxkIGxlYXZlIGEgZmxvYXRpbmcgc2VsZWN0IGJveCwgd2hpY2ggaXMganVzdCB3ZWlyZFxuICAgKi9cbiAgcHJpdmF0ZSBoaWRlSG92ZXJlZFNlbGVjdEJveGVzKCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0Q29tcHV0ZWRJdGVtcygpLmZvckVhY2goKGl0ZW06IFNldHRpbmdzUGFuZWxJdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5pc0FjdGl2ZSgpICYmIChpdGVtIGFzIGFueSkuc2V0dGluZyBpbnN0YW5jZW9mIFNlbGVjdEJveCkge1xuICAgICAgICBjb25zdCBzZWxlY3RCb3ggPSAoaXRlbSBhcyBhbnkpLnNldHRpbmcgYXMgU2VsZWN0Qm94O1xuICAgICAgICBjb25zdCBvbGREaXNwbGF5ID0gc2VsZWN0Qm94LmdldERvbUVsZW1lbnQoKS5jc3MoJ2Rpc3BsYXknKTtcbiAgICAgICAgaWYgKG9sZERpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICAgIC8vIGlmIG9sZERpc3BsYXkgaXMgYWxyZWFkeSAnbm9uZScsIG5vIG5lZWQgdG8gc2V0IHRvICdub25lJyBhZ2Fpbi4gSXQgY291bGQgbGVhZCB0byByYWNlIGNvbmRpdGlvblxuICAgICAgICAgIC8vIHdoZXJlaW4gdGhlIGRpc3BsYXkgaXMgaXJyZXZlcnNpYmx5IHNldCB0byAnbm9uZScgd2hlbiBicm93c2VyIHRhYi93aW5kb3cgaXMgbm90IGFjdGl2ZSBiZWNhdXNlXG4gICAgICAgICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGlzIGVpdGhlciBkZWxheWVkIG9yIHBhdXNlZCBpbiBzb21lIGJyb3dzZXJzIGluIGluYWN0aXZlIHN0YXRlXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRpbmcgdGhlIGRpc3BsYXkgdG8gbm9uZSBtYXJrcyB0aGUgc2VsZWN0LWJveCBhcyBpbmFjdGl2ZSwgc28gaXQgd2lsbCBiZSBoaWRkZW4gd2l0aCB0aGUgcmVzdFxuICAgICAgICAvLyB3ZSBqdXN0IGhhdmUgdG8gbWFrZSBzdXJlIHRvIHJlc2V0IHRoaXMgYXMgc29vbiBhcyBwb3NzaWJsZVxuICAgICAgICBzZWxlY3RCb3guZ2V0RG9tRWxlbWVudCgpLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIGlmICh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHNlbGVjdEJveC5nZXREb21FbGVtZW50KCkuY3NzKCdkaXNwbGF5Jywgb2xkRGlzcGxheSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSUU5IGhhcyBubyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsIHNldCB0aGUgdmFsdWUgZGlyZWN0bHkuIEl0IGhhcyBubyBvcHRpbWl6YXRpb24gYWJvdXQgaWdub3JpbmcgRE9NLWNoYW5nZXNcbiAgICAgICAgICAvLyBiZXR3ZWVuIGFuaW1hdGlvbkZyYW1lc1xuICAgICAgICAgIHNlbGVjdEJveC5nZXREb21FbGVtZW50KCkuY3NzKCdkaXNwbGF5Jywgb2xkRGlzcGxheSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGNvbGxlY3QgYWxsIGl0ZW1zIGZyb20gYWxsIHBhZ2VzIChzZWUgaGlkZUhvdmVyZWRTZWxlY3RCb3hlcylcbiAgcHJpdmF0ZSBnZXRDb21wdXRlZEl0ZW1zKCk6IFNldHRpbmdzUGFuZWxJdGVtW10ge1xuICAgIGNvbnN0IGFsbEl0ZW1zOiBTZXR0aW5nc1BhbmVsSXRlbVtdID0gW107XG4gICAgZm9yIChsZXQgcGFnZSBvZiB0aGlzLmdldFBhZ2VzKCkpIHtcbiAgICAgIGFsbEl0ZW1zLnB1c2goLi4ucGFnZS5nZXRJdGVtcygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbEl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSb290UGFnZSgpOiBTZXR0aW5nc1BhbmVsUGFnZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZXMoKVswXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNldHRpbmdzU3RhdGVDaGFuZ2VkRXZlbnQoKSB7XG4gICAgdGhpcy5zZXR0aW5nc1BhbmVsRXZlbnRzLm9uU2V0dGluZ3NTdGF0ZUNoYW5nZWQuZGlzcGF0Y2godGhpcyk7XG4gIH1cbn1cbiIsImltcG9ydCB7Q29udGFpbmVyLCBDb250YWluZXJDb25maWd9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7Q29tcG9uZW50LCBDb21wb25lbnRDb25maWd9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7RXZlbnQsIEV2ZW50RGlzcGF0Y2hlciwgTm9BcmdzfSBmcm9tICcuLi9ldmVudGRpc3BhdGNoZXInO1xuaW1wb3J0IHsgTGFiZWwsIExhYmVsQ29uZmlnIH0gZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtTZWxlY3RCb3h9IGZyb20gJy4vc2VsZWN0Ym94JztcbmltcG9ydCB7TGlzdEJveH0gZnJvbSAnLi9saXN0Ym94JztcbmltcG9ydCB7VmlkZW9RdWFsaXR5U2VsZWN0Qm94fSBmcm9tICcuL3ZpZGVvcXVhbGl0eXNlbGVjdGJveCc7XG5pbXBvcnQge0F1ZGlvUXVhbGl0eVNlbGVjdEJveH0gZnJvbSAnLi9hdWRpb3F1YWxpdHlzZWxlY3Rib3gnO1xuaW1wb3J0IHtQbGF5YmFja1NwZWVkU2VsZWN0Qm94fSBmcm9tICcuL3BsYXliYWNrc3BlZWRzZWxlY3Rib3gnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IExvY2FsaXphYmxlVGV4dCB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBbiBpdGVtIGZvciBhIHtAbGluayBTZXR0aW5nc1BhbmVsUGFnZX0sXG4gKiBDb250YWluaW5nIGFuIG9wdGlvbmFsIHtAbGluayBMYWJlbH0gYW5kIGEgY29tcG9uZW50IHRoYXQgY29uZmlndXJlcyBhIHNldHRpbmcuXG4gKiBJZiB0aGUgY29tcG9uZW50cyBpcyBhIHtAbGluayBTZWxlY3RCb3h9IGl0IHdpbGwgaGFuZGxlIHRoZSBsb2dpYyBvZiBkaXNwbGF5aW5nIGl0IG9yIG5vdFxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NQYW5lbEl0ZW0gZXh0ZW5kcyBDb250YWluZXI8Q29udGFpbmVyQ29uZmlnPiB7XG5cbiAgcHJpdmF0ZSBsYWJlbDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz47XG4gIHByaXZhdGUgc2V0dGluZzogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz47XG5cbiAgcHJpdmF0ZSBzZXR0aW5nc1BhbmVsSXRlbUV2ZW50cyA9IHtcbiAgICBvbkFjdGl2ZUNoYW5nZWQ6IG5ldyBFdmVudERpc3BhdGNoZXI8U2V0dGluZ3NQYW5lbEl0ZW0sIE5vQXJncz4oKSxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihsYWJlbDogTG9jYWxpemFibGVUZXh0IHwgQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4sIHNldHRpbmc6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+LCBjb25maWc6IENvbnRhaW5lckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuc2V0dGluZyA9IHNldHRpbmc7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXNldHRpbmdzLXBhbmVsLWl0ZW0nLFxuICAgICAgcm9sZTogJ21lbnVpdGVtJyxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG5cbiAgICBpZiAobGFiZWwgIT09IG51bGwpIHtcbiAgICAgIGlmIChsYWJlbCBpbnN0YW5jZW9mIENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxhYmVsID0gbmV3IExhYmVsKHsgdGV4dDogbGFiZWwsIGZvcjogdGhpcy5zZXR0aW5nLmdldENvbmZpZygpLmlkIH0gYXMgTGFiZWxDb25maWcpO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5sYWJlbCk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDb21wb25lbnQodGhpcy5zZXR0aW5nKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNldHRpbmcgaW5zdGFuY2VvZiBTZWxlY3RCb3ggfHwgdGhpcy5zZXR0aW5nIGluc3RhbmNlb2YgTGlzdEJveCkge1xuICAgICAgbGV0IGhhbmRsZUNvbmZpZ0l0ZW1DaGFuZ2VkID0gKCkgPT4ge1xuICAgICAgICBpZiAoISh0aGlzLnNldHRpbmcgaW5zdGFuY2VvZiBTZWxlY3RCb3gpICYmICEodGhpcy5zZXR0aW5nIGluc3RhbmNlb2YgTGlzdEJveCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgbXVzdCBiZSBhdmFpbGFibGUgZm9yIHRoZSBzZXR0aW5nIHRvIGJlIGRpc3BsYXllZFxuICAgICAgICAvLyBCeSBkZWZhdWx0LCBhdCBsZWFzdCB0d28gaXRlbXMgbXVzdCBiZSBhdmFpbGFibGUsIGVsc2UgYSBzZWxlY3Rpb24gaXMgbm90IHBvc3NpYmxlXG4gICAgICAgIGxldCBtaW5JdGVtc1RvRGlzcGxheSA9IDI7XG4gICAgICAgIC8vIEF1ZGlvL3ZpZGVvIHF1YWxpdHkgc2VsZWN0IGJveGVzIGNvbnRhaW4gYW4gYWRkaXRpb25hbCAnYXV0bycgbW9kZSwgd2hpY2ggaW4gY29tYmluYXRpb24gd2l0aCBhIHNpbmdsZVxuICAgICAgICAvLyBhdmFpbGFibGUgcXVhbGl0eSBhbHNvIGRvZXMgbm90IG1ha2Ugc2Vuc2VcbiAgICAgICAgaWYgKCh0aGlzLnNldHRpbmcgaW5zdGFuY2VvZiBWaWRlb1F1YWxpdHlTZWxlY3RCb3ggJiYgdGhpcy5zZXR0aW5nLmhhc0F1dG9JdGVtKCkpXG4gICAgICAgICAgfHwgdGhpcy5zZXR0aW5nIGluc3RhbmNlb2YgQXVkaW9RdWFsaXR5U2VsZWN0Qm94KSB7XG4gICAgICAgICAgbWluSXRlbXNUb0Rpc3BsYXkgPSAzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5pdGVtQ291bnQoKSA8IG1pbkl0ZW1zVG9EaXNwbGF5KSB7XG4gICAgICAgICAgLy8gSGlkZSB0aGUgc2V0dGluZyBpZiBubyBtZWFuaW5nZnVsIGNob2ljZSBpcyBhdmFpbGFibGVcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNldHRpbmcgaW5zdGFuY2VvZiBQbGF5YmFja1NwZWVkU2VsZWN0Qm94XG4gICAgICAgICAgJiYgIXVpbWFuYWdlci5nZXRDb25maWcoKS5wbGF5YmFja1NwZWVkU2VsZWN0aW9uRW5hYmxlZCkge1xuICAgICAgICAgIC8vIEhpZGUgdGhlIFBsYXliYWNrU3BlZWRTZWxlY3RCb3ggaWYgZGlzYWJsZWQgaW4gY29uZmlnXG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWaXNpYmlsaXR5IG1pZ2h0IGhhdmUgY2hhbmdlZCBhbmQgdGhlcmVmb3JlIHRoZSBhY3RpdmUgc3RhdGUgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNvIHdlIGZpcmUgdGhlIGV2ZW50XG4gICAgICAgIC8vIFRPRE8gZmlyZSBvbmx5IHdoZW4gc3RhdGUgaGFzIHJlYWxseSBjaGFuZ2VkIChlLmcuIGNoZWNrIGlmIHZpc2liaWxpdHkgaGFzIHJlYWxseSBjaGFuZ2VkKVxuICAgICAgICB0aGlzLm9uQWN0aXZlQ2hhbmdlZEV2ZW50KCk7XG5cbiAgICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYXR0cignYXJpYS1oYXNwb3B1cCcsICd0cnVlJyk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNldHRpbmcub25JdGVtQWRkZWQuc3Vic2NyaWJlKGhhbmRsZUNvbmZpZ0l0ZW1DaGFuZ2VkKTtcbiAgICAgIHRoaXMuc2V0dGluZy5vbkl0ZW1SZW1vdmVkLnN1YnNjcmliZShoYW5kbGVDb25maWdJdGVtQ2hhbmdlZCk7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgaGlkZGVuIHN0YXRlXG4gICAgICBoYW5kbGVDb25maWdJdGVtQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhpcyBzZXR0aW5ncyBwYW5lbCBpdGVtIGlzIGFjdGl2ZSwgaS5lLiB2aXNpYmxlIGFuZCBlbmFibGVkIGFuZCBhIHVzZXIgY2FuIGludGVyYWN0IHdpdGggaXQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBwYW5lbCBpcyBhY3RpdmUsIGVsc2UgZmFsc2VcbiAgICovXG4gIGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzU2hvd24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkFjdGl2ZUNoYW5nZWRFdmVudCgpIHtcbiAgICB0aGlzLnNldHRpbmdzUGFuZWxJdGVtRXZlbnRzLm9uQWN0aXZlQ2hhbmdlZC5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlICdhY3RpdmUnIHN0YXRlIG9mIHRoaXMgaXRlbSBjaGFuZ2VzLlxuICAgKiBAc2VlICNpc0FjdGl2ZVxuICAgKiBAcmV0dXJucyB7RXZlbnQ8U2V0dGluZ3NQYW5lbEl0ZW0sIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25BY3RpdmVDaGFuZ2VkKCk6IEV2ZW50PFNldHRpbmdzUGFuZWxJdGVtLCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1BhbmVsSXRlbUV2ZW50cy5vbkFjdGl2ZUNoYW5nZWQuZ2V0RXZlbnQoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb250YWluZXIsIENvbnRhaW5lckNvbmZpZ30gZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHtTZXR0aW5nc1BhbmVsSXRlbX0gZnJvbSAnLi9zZXR0aW5nc3BhbmVsaXRlbSc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtFdmVudCwgRXZlbnREaXNwYXRjaGVyLCBOb0FyZ3N9IGZyb20gJy4uL2V2ZW50ZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgQnJvd3NlclV0aWxzIH0gZnJvbSAnLi4vYnJvd3NlcnV0aWxzJztcblxuLyoqXG4gKiBBIHBhbmVsIGNvbnRhaW5pbmcgYSBsaXN0IG9mIHtAbGluayBTZXR0aW5nc1BhbmVsSXRlbSBpdGVtc30gdGhhdCByZXByZXNlbnQgbGFiZWxsZWQgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1BhbmVsUGFnZSBleHRlbmRzIENvbnRhaW5lcjxDb250YWluZXJDb25maWc+IHtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTEFTU19MQVNUID0gJ2xhc3QnO1xuXG4gIHByaXZhdGUgc2V0dGluZ3NQYW5lbFBhZ2VFdmVudHMgPSB7XG4gICAgb25TZXR0aW5nc1N0YXRlQ2hhbmdlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxTZXR0aW5nc1BhbmVsUGFnZSwgTm9BcmdzPigpLFxuICAgIG9uQWN0aXZlOiBuZXcgRXZlbnREaXNwYXRjaGVyPFNldHRpbmdzUGFuZWxQYWdlLCBOb0FyZ3M+KCksXG4gICAgb25JbmFjdGl2ZTogbmV3IEV2ZW50RGlzcGF0Y2hlcjxTZXR0aW5nc1BhbmVsUGFnZSwgTm9BcmdzPigpLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29udGFpbmVyQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZzxDb250YWluZXJDb25maWc+KGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1zZXR0aW5ncy1wYW5lbC1wYWdlJyxcbiAgICAgIHJvbGU6ICdtZW51JyxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgLy8gRmlyZSBldmVudCB3aGVuIHRoZSBzdGF0ZSBvZiBhIHNldHRpbmdzLWl0ZW0gaGFzIGNoYW5nZWRcbiAgICBsZXQgc2V0dGluZ3NTdGF0ZUNoYW5nZWRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vblNldHRpbmdzU3RhdGVDaGFuZ2VkRXZlbnQoKTtcblxuICAgICAgLy8gQXR0YWNoIG1hcmtlciBjbGFzcyB0byBsYXN0IHZpc2libGUgaXRlbVxuICAgICAgbGV0IGxhc3RTaG93bkl0ZW0gPSBudWxsO1xuICAgICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0SXRlbXMoKSkge1xuICAgICAgICBjb21wb25lbnQuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKHRoaXMucHJlZml4Q3NzKFNldHRpbmdzUGFuZWxQYWdlLkNMQVNTX0xBU1QpKTtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5pc1Nob3duKCkpIHtcbiAgICAgICAgICBsYXN0U2hvd25JdGVtID0gY29tcG9uZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobGFzdFNob3duSXRlbSkge1xuICAgICAgICBsYXN0U2hvd25JdGVtLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhTZXR0aW5nc1BhbmVsUGFnZS5DTEFTU19MQVNUKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGxldCBjb21wb25lbnQgb2YgdGhpcy5nZXRJdGVtcygpKSB7XG4gICAgICBjb21wb25lbnQub25BY3RpdmVDaGFuZ2VkLnN1YnNjcmliZShzZXR0aW5nc1N0YXRlQ2hhbmdlZEhhbmRsZXIpO1xuICAgIH1cbiAgfVxuXG4gIGhhc0FjdGl2ZVNldHRpbmdzKCk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiB0aGlzLmdldEl0ZW1zKCkpIHtcbiAgICAgIGlmIChjb21wb25lbnQuaXNBY3RpdmUoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRJdGVtcygpOiBTZXR0aW5nc1BhbmVsSXRlbVtdIHtcbiAgICByZXR1cm4gPFNldHRpbmdzUGFuZWxJdGVtW10+dGhpcy5jb25maWcuY29tcG9uZW50cy5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudCBpbnN0YW5jZW9mIFNldHRpbmdzUGFuZWxJdGVtKTtcbiAgfVxuXG4gIG9uU2V0dGluZ3NTdGF0ZUNoYW5nZWRFdmVudCgpIHtcbiAgICB0aGlzLnNldHRpbmdzUGFuZWxQYWdlRXZlbnRzLm9uU2V0dGluZ3NTdGF0ZUNoYW5nZWQuZGlzcGF0Y2godGhpcyk7XG4gIH1cblxuICBnZXQgb25TZXR0aW5nc1N0YXRlQ2hhbmdlZCgpOiBFdmVudDxTZXR0aW5nc1BhbmVsUGFnZSwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NQYW5lbFBhZ2VFdmVudHMub25TZXR0aW5nc1N0YXRlQ2hhbmdlZC5nZXRFdmVudCgpO1xuICB9XG5cbiAgb25BY3RpdmVFdmVudCgpIHtcbiAgICBjb25zdCBhY3RpdmVJdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaXNBY3RpdmUoKSk7XG5cbiAgICB0aGlzLnNldHRpbmdzUGFuZWxQYWdlRXZlbnRzLm9uQWN0aXZlLmRpc3BhdGNoKHRoaXMpO1xuICAgIC8vIERpc2FibGUgZm9jdXMgZm9yIGlPUyBhbmQgaVBhZE9TIDEzLiBUaGV5IG9wZW4gc2VsZWN0IGJveGVzIGF1dG9tYXRpY2FsbHkgb24gZm9jdXMgYW5kIHdlIHdhbnQgdG8gYXZvaWQgdGhhdC5cbiAgICBpZiAoYWN0aXZlSXRlbXMubGVuZ3RoID4gMCAmJiAhQnJvd3NlclV0aWxzLmlzSU9TICYmICEoQnJvd3NlclV0aWxzLmlzTWFjSW50ZWwgJiYgQnJvd3NlclV0aWxzLmlzVG91Y2hTdXBwb3J0ZWQpKSB7XG4gICAgICBhY3RpdmVJdGVtc1swXS5nZXREb21FbGVtZW50KCkuZm9jdXNUb0ZpcnN0SW5wdXQoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgb25BY3RpdmUoKTogRXZlbnQ8U2V0dGluZ3NQYW5lbFBhZ2UsIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzUGFuZWxQYWdlRXZlbnRzLm9uQWN0aXZlLmdldEV2ZW50KCk7XG4gIH1cblxuICBvbkluYWN0aXZlRXZlbnQoKSB7XG4gICAgdGhpcy5zZXR0aW5nc1BhbmVsUGFnZUV2ZW50cy5vbkluYWN0aXZlLmRpc3BhdGNoKHRoaXMpO1xuICB9XG5cbiAgZ2V0IG9uSW5hY3RpdmUoKTogRXZlbnQ8U2V0dGluZ3NQYW5lbFBhZ2UsIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzUGFuZWxQYWdlRXZlbnRzLm9uSW5hY3RpdmUuZ2V0RXZlbnQoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7U2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JCdXR0b24sIFNldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQ29uZmlnfSBmcm9tICcuL3NldHRpbmdzcGFuZWxwYWdlbmF2aWdhdG9yYnV0dG9uJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1BhbmVsUGFnZUJhY2tCdXR0b24gZXh0ZW5kcyBTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckJ1dHRvbiB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckNvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXNldHRpbmdzcGFuZWxwYWdlYmFja2J1dHRvbicsXG4gICAgICB0ZXh0OiAnYmFjaycsXG4gICAgfSBhcyBTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckNvbmZpZywgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMub25DbGljay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5wb3BQYWdlKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7QnV0dG9uLCBCdXR0b25Db25maWd9IGZyb20gJy4vYnV0dG9uJztcbmltcG9ydCB7U2V0dGluZ3NQYW5lbH0gZnJvbSAnLi9zZXR0aW5nc3BhbmVsJztcbmltcG9ydCB7U2V0dGluZ3NQYW5lbFBhZ2V9IGZyb20gJy4vc2V0dGluZ3NwYW5lbHBhZ2UnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IFVJSW5zdGFuY2VNYW5hZ2VyIH0gZnJvbSAnLi4vdWltYW5hZ2VyJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgYSB7QGxpbmsgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JCdXR0b259XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JDb25maWcgZXh0ZW5kcyBCdXR0b25Db25maWcge1xuICAvKipcbiAgICogQ29udGFpbmVyIGBTZXR0aW5nc1BhbmVsYCB3aGVyZSB0aGUgbmF2aWdhdGlvbiB0YWtlcyBwbGFjZVxuICAgKi9cbiAgY29udGFpbmVyOiBTZXR0aW5nc1BhbmVsO1xuICAvKipcbiAgICogUGFnZSB3aGVyZSB0aGUgYnV0dG9uIHNob3VsZCBuYXZpZ2F0ZSB0b1xuICAgKiBJZiBlbXB0eSBpdCB3aWxsIG5hdmlnYXRlIHRvIHRoZSByb290IHBhZ2UgKG5vdCBpbnRlbmRlZCB0byB1c2UgYXMgbmF2aWdhdGUgYmFjayBiZWhhdmlvcilcbiAgICovXG4gIHRhcmdldFBhZ2U/OiBTZXR0aW5nc1BhbmVsUGFnZTtcblxuICAvKipcbiAgICogV0NBRzIwIHN0YW5kYXJkOiBFc3RhYmxpc2hlcyByZWxhdGlvbnNoaXBzIGJldHdlZW4gb2JqZWN0cyBhbmQgdGhlaXIgbGFiZWwocylcbiAgICovXG4gIGFyaWFMYWJlbGxlZEJ5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENhbiBiZSB1c2VkIHRvIG5hdmlnYXRlIGJldHdlZW4gU2V0dGluZ3NQYW5lbFBhZ2VzXG4gKlxuICogRXhhbXBsZTpcbiAqICBsZXQgc2V0dGluZ1BhbmVsTmF2aWdhdGlvbkJ1dHRvbiA9IG5ldyBTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckJ1dHRvbih7XG4gKiAgICBjb250YWluZXI6IHNldHRpbmdzUGFuZWwsXG4gKiAgICB0YXJnZXRQYWdlOiBzZXR0aW5nc1BhbmVsUGFnZSxcbiAqICB9KTtcbiAqXG4gKiAgc2V0dGluZ3NQYW5lbFBhZ2UuYWRkQ29tcG9uZW50KHNldHRpbmdQYW5lbE5hdmlnYXRpb25CdXR0b24pO1xuICpcbiAqIERvbid0IGZvcmdldCB0byBhZGQgdGhlIHNldHRpbmdQYW5lbE5hdmlnYXRpb25CdXR0b24gdG8gdGhlIHNldHRpbmdzUGFuZWxQYWdlLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JCdXR0b24gZXh0ZW5kcyBCdXR0b248U2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JDb25maWc+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IFNldHRpbmdzUGFuZWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0UGFnZT86IFNldHRpbmdzUGFuZWxQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHt9IGFzIFNldHRpbmdzUGFuZWxQYWdlTmF2aWdhdG9yQ29uZmlnLCB0aGlzLmNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9ICh0aGlzLmNvbmZpZyBhcyBTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckNvbmZpZykuY29udGFpbmVyO1xuICAgIHRoaXMudGFyZ2V0UGFnZSA9ICh0aGlzLmNvbmZpZyBhcyBTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckNvbmZpZykudGFyZ2V0UGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBuYXZpZ2F0ZSBvbmUgbGV2ZWwgYmFja1xuICAgKi9cbiAgcG9wUGFnZSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5wb3BTZXR0aW5nc1BhbmVsUGFnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIG5hdmlnYXRlIHRvIHRoZSB0YXJnZXQgcGFnZVxuICAgKi9cbiAgcHVzaFRhcmdldFBhZ2UoKSB7XG4gICAgdGhpcy5jb250YWluZXIuc2V0QWN0aXZlUGFnZSh0aGlzLnRhcmdldFBhZ2UpO1xuICB9XG59XG4iLCJpbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckJ1dHRvbiwgU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JDb25maWd9IGZyb20gJy4vc2V0dGluZ3NwYW5lbHBhZ2VuYXZpZ2F0b3JidXR0b24nO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1BhbmVsUGFnZU9wZW5CdXR0b24gZXh0ZW5kcyBTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckJ1dHRvbiB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU2V0dGluZ3NQYW5lbFBhZ2VOYXZpZ2F0b3JDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1zZXR0aW5nc3BhbmVscGFnZW9wZW5idXR0b24nLFxuICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ29wZW4nKSxcbiAgICAgIHJvbGU6ICdtZW51aXRlbScsXG4gICAgfSBhcyBTZXR0aW5nc1BhbmVsUGFnZU5hdmlnYXRvckNvbmZpZywgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmF0dHIoJ2FyaWEtaGFzcG9wdXAnLCAndHJ1ZScpO1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmF0dHIoJ2FyaWEtb3ducycsIHRoaXMuY29uZmlnLnRhcmdldFBhZ2UuZ2V0Q29uZmlnKCkuaWQpO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnB1c2hUYXJnZXRQYWdlKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7VG9nZ2xlQnV0dG9uLCBUb2dnbGVCdXR0b25Db25maWd9IGZyb20gJy4vdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7U2V0dGluZ3NQYW5lbH0gZnJvbSAnLi9zZXR0aW5nc3BhbmVsJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge0NvbXBvbmVudCwgQ29tcG9uZW50Q29uZmlnfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQge0FycmF5VXRpbHN9IGZyb20gJy4uL2FycmF5dXRpbHMnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgU2V0dGluZ3NUb2dnbGVCdXR0b259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzVG9nZ2xlQnV0dG9uQ29uZmlnIGV4dGVuZHMgVG9nZ2xlQnV0dG9uQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBwYW5lbCB3aG9zZSB2aXNpYmlsaXR5IHRoZSBidXR0b24gc2hvdWxkIHRvZ2dsZS5cbiAgICovXG4gIHNldHRpbmdzUGFuZWw6IFNldHRpbmdzUGFuZWw7XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgaWYgdGhlIGJ1dHRvbiBzaG91bGQgYmUgYXV0b21hdGljYWxseSBoaWRkZW4gd2hlbiB0aGUgc2V0dGluZ3MgcGFuZWwgZG9lcyBub3QgY29udGFpbiBhbnkgYWN0aXZlIHNldHRpbmdzLlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBhdXRvSGlkZVdoZW5Ob0FjdGl2ZVNldHRpbmdzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IHRvZ2dsZXMgdmlzaWJpbGl0eSBvZiBhIHNldHRpbmdzIHBhbmVsLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NUb2dnbGVCdXR0b24gZXh0ZW5kcyBUb2dnbGVCdXR0b248U2V0dGluZ3NUb2dnbGVCdXR0b25Db25maWc+IHtcblxuICBwcml2YXRlIHZpc2libGVTZXR0aW5nc1BhbmVsczogU2V0dGluZ3NQYW5lbFtdID0gW107XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTZXR0aW5nc1RvZ2dsZUJ1dHRvbkNvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICBpZiAoIWNvbmZpZy5zZXR0aW5nc1BhbmVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIFNldHRpbmdzUGFuZWwgaXMgbWlzc2luZycpO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktc2V0dGluZ3N0b2dnbGVidXR0b24nLFxuICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzJyksXG4gICAgICBzZXR0aW5nc1BhbmVsOiBudWxsLFxuICAgICAgYXV0b0hpZGVXaGVuTm9BY3RpdmVTZXR0aW5nczogdHJ1ZSxcbiAgICAgIHJvbGU6ICdwb3AtdXAgYnV0dG9uJyxcbiAgICB9LCA8U2V0dGluZ3NUb2dnbGVCdXR0b25Db25maWc+dGhpcy5jb25maWcpO1xuXG4gICAgLyoqXG4gICAgICogV0NBRzIwIHN0YW5kYXJkIGRlZmluZXMgd2hpY2ggcG9wdXAgbWVudSAoZWxlbWVudCBpZCkgaXMgb3duZWQgYnkgdGhlIGJ1dHRvblxuICAgICAqL1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmF0dHIoJ2FyaWEtb3ducycsIGNvbmZpZy5zZXR0aW5nc1BhbmVsLmdldEFjdGl2ZVBhZ2UoKS5nZXRDb25maWcoKS5pZCk7XG5cbiAgICAvKipcbiAgICAgKiBXQ0FHMjAgc3RhbmRhcmQgZGVmaW5lcyB0aGF0IGEgYnV0dG9uIGhhcyBhIHBvcHVwIG1lbnUgYm91bmQgdG8gaXRcbiAgICAgKi9cbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hdHRyKCdhcmlhLWhhc3BvcHVwJywgJ3RydWUnKTtcblxuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIGxldCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGxldCBzZXR0aW5nc1BhbmVsID0gY29uZmlnLnNldHRpbmdzUGFuZWw7XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIG9ubHkgaGlkZSBvdGhlciBgU2V0dGluZ3NQYW5lbGBzIGlmIGEgbmV3IG9uZSB3aWxsIGJlIG9wZW5lZFxuICAgICAgaWYgKCFzZXR0aW5nc1BhbmVsLmlzU2hvd24oKSkge1xuICAgICAgICAvLyBIaWRlIGFsbCBvcGVuIFNldHRpbmdzUGFuZWxzIGJlZm9yZSBvcGVuaW5nIHRoaXMgYnV0dG9uJ3MgcGFuZWxcbiAgICAgICAgLy8gKFdlIG5lZWQgdG8gaXRlcmF0ZSBhIGNvcHkgYmVjYXVzZSBoaWRpbmcgdGhlbSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbSB0aGUgYXJyYXlcbiAgICAgICAgLy8gZHVlIHRvIHRoZSBzdWJzY3JpYmVPbmNlIGFib3ZlKVxuICAgICAgICB0aGlzLnZpc2libGVTZXR0aW5nc1BhbmVscy5zbGljZSgpLmZvckVhY2goc2V0dGluZ3NQYW5lbCA9PiBzZXR0aW5nc1BhbmVsLmhpZGUoKSk7XG4gICAgICB9XG4gICAgICBzZXR0aW5nc1BhbmVsLnRvZ2dsZUhpZGRlbigpO1xuICAgIH0pO1xuICAgIHNldHRpbmdzUGFuZWwub25TaG93LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBTZXQgdG9nZ2xlIHN0YXR1cyB0byBvbiB3aGVuIHRoZSBzZXR0aW5ncyBwYW5lbCBzaG93c1xuICAgICAgdGhpcy5vbigpO1xuICAgIH0pO1xuICAgIHNldHRpbmdzUGFuZWwub25IaWRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBTZXQgdG9nZ2xlIHN0YXR1cyB0byBvZmYgd2hlbiB0aGUgc2V0dGluZ3MgcGFuZWwgaGlkZXNcbiAgICAgIHRoaXMub2ZmKCk7XG4gICAgfSk7XG5cbiAgICAvLyBFbnN1cmUgdGhhdCBvbmx5IG9uZSBgU2V0dGluZ1BhbmVsYCBpcyB2aXNpYmxlIGF0IG9uY2VcbiAgICAvLyBLZWVwIHRyYWNrIG9mIHNob3duIFNldHRpbmdzUGFuZWxzXG4gICAgdWltYW5hZ2VyLm9uQ29tcG9uZW50U2hvdy5zdWJzY3JpYmUoKHNlbmRlcjogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4pID0+IHtcbiAgICAgIGlmIChzZW5kZXIgaW5zdGFuY2VvZiBTZXR0aW5nc1BhbmVsKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZVNldHRpbmdzUGFuZWxzLnB1c2goc2VuZGVyKTtcbiAgICAgICAgc2VuZGVyLm9uSGlkZS5zdWJzY3JpYmVPbmNlKCgpID0+IEFycmF5VXRpbHMucmVtb3ZlKHRoaXMudmlzaWJsZVNldHRpbmdzUGFuZWxzLCBzZW5kZXIpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBhdXRvbWF0aWMgaGlkaW5nIG9mIHRoZSBidXR0b24gaWYgdGhlcmUgYXJlIG5vIHNldHRpbmdzIGZvciB0aGUgdXNlciB0byBpbnRlcmFjdCB3aXRoXG4gICAgaWYgKGNvbmZpZy5hdXRvSGlkZVdoZW5Ob0FjdGl2ZVNldHRpbmdzKSB7XG4gICAgICAvLyBTZXR1cCBoYW5kbGVyIHRvIHNob3cvaGlkZSBidXR0b24gd2hlbiB0aGUgc2V0dGluZ3MgY2hhbmdlXG4gICAgICBsZXQgc2V0dGluZ3NQYW5lbEl0ZW1zQ2hhbmdlZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0aW5nc1BhbmVsLnJvb3RQYWdlSGFzQWN0aXZlU2V0dGluZ3MoKSkge1xuICAgICAgICAgIGlmICh0aGlzLmlzSGlkZGVuKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8vIFdpcmUgdGhlIGhhbmRsZXIgdG8gdGhlIGV2ZW50XG4gICAgICBzZXR0aW5nc1BhbmVsLm9uU2V0dGluZ3NTdGF0ZUNoYW5nZWQuc3Vic2NyaWJlKHNldHRpbmdzUGFuZWxJdGVtc0NoYW5nZWRIYW5kbGVyKTtcbiAgICAgIC8vIENhbGwgaGFuZGxlciBmb3IgZmlyc3QgaW5pdCBhdCBzdGFydHVwXG4gICAgICBzZXR0aW5nc1BhbmVsSXRlbXNDaGFuZ2VkSGFuZGxlcigpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudENvbmZpZ30gZnJvbSAnLi9jb21wb25lbnQnO1xuXG4vKipcbiAqIEEgZHVtbXkgY29tcG9uZW50IHRoYXQganVzdCByZXNlcnZlcyBzb21lIHNwYWNlIGFuZCBkb2VzIG5vdGhpbmcgZWxzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwYWNlciBleHRlbmRzIENvbXBvbmVudDxDb21wb25lbnRDb25maWc+IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbXBvbmVudENvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktc3BhY2VyJyxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuXG4gIHByb3RlY3RlZCBvblNob3dFdmVudCgpOiB2b2lkIHtcbiAgICAvLyBkaXNhYmxlIGV2ZW50IGZpcmluZyBieSBvdmVyd3JpdGluZyBhbmQgbm90IGNhbGxpbmcgc3VwZXJcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkhpZGVFdmVudCgpOiB2b2lkIHtcbiAgICAvLyBkaXNhYmxlIGV2ZW50IGZpcmluZyBieSBvdmVyd3JpdGluZyBhbmQgbm90IGNhbGxpbmcgc3VwZXJcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkhvdmVyQ2hhbmdlZEV2ZW50KGhvdmVyZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBkaXNhYmxlIGV2ZW50IGZpcmluZyBieSBvdmVyd3JpdGluZyBhbmQgbm90IGNhbGxpbmcgc3VwZXJcbiAgfVxufSIsImltcG9ydCB7TGlzdEJveH0gZnJvbSAnLi9saXN0Ym94JztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1N1YnRpdGxlU3dpdGNoSGFuZGxlcn0gZnJvbSAnLi4vc3VidGl0bGV1dGlscyc7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuXG4vKipcbiAqIEEgZWxlbWVudCB0aGF0IGlzIHNpbWlsYXIgdG8gYSBzZWxlY3QgYm94IHdoZXJlIHRoZSB1c2VyIGNhbiBzZWxlY3QgYSBzdWJ0aXRsZVxuICovXG5leHBvcnQgY2xhc3MgU3VidGl0bGVMaXN0Qm94IGV4dGVuZHMgTGlzdEJveCB7XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIG5ldyBTdWJ0aXRsZVN3aXRjaEhhbmRsZXIocGxheWVyLCB0aGlzLCB1aW1hbmFnZXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb250YWluZXIsIENvbnRhaW5lckNvbmZpZyB9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7IFVJSW5zdGFuY2VNYW5hZ2VyIH0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IExhYmVsLCBMYWJlbENvbmZpZyB9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50Q29uZmlnLCBDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBDb250cm9sQmFyIH0gZnJvbSAnLi9jb250cm9sYmFyJztcbmltcG9ydCB7IEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL2V2ZW50ZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBET00sIFNpemUgfSBmcm9tICcuLi9kb20nO1xuaW1wb3J0IHsgUGxheWVyQVBJLCBTdWJ0aXRsZUN1ZUV2ZW50IH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5pbXBvcnQgeyBWdHRVdGlscyB9IGZyb20gJy4uL3Z0dHV0aWxzJztcbmltcG9ydCB7IFZUVFByb3BlcnRpZXMgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXIvdHlwZXMvc3VidGl0bGVzL3Z0dC9BUEknO1xuXG4vKipcbiAqIE92ZXJsYXlzIHRoZSBwbGF5ZXIgdG8gZGlzcGxheSBzdWJ0aXRsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWJ0aXRsZU92ZXJsYXkgZXh0ZW5kcyBDb250YWluZXI8Q29udGFpbmVyQ29uZmlnPiB7XG5cbiAgcHJpdmF0ZSBzdWJ0aXRsZU1hbmFnZXI6IEFjdGl2ZVN1YnRpdGxlTWFuYWdlcjtcbiAgcHJpdmF0ZSBwcmV2aWV3U3VidGl0bGVBY3RpdmU6IGJvb2xlYW47XG4gIHByaXZhdGUgcHJldmlld1N1YnRpdGxlOiBTdWJ0aXRsZUxhYmVsO1xuXG4gIHByaXZhdGUgcHJlcHJvY2Vzc0xhYmVsRXZlbnRDYWxsYmFjayA9IG5ldyBFdmVudERpc3BhdGNoZXI8U3VidGl0bGVDdWVFdmVudCwgU3VidGl0bGVMYWJlbD4oKTtcbiAgcHJpdmF0ZSBzdWJ0aXRsZUNvbnRhaW5lck1hbmFnZXI6IFN1YnRpdGxlUmVnaW9uQ29udGFpbmVyTWFuYWdlcjtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDTEFTU19DT05UUk9MQkFSX1ZJU0lCTEUgPSAnY29udHJvbGJhci12aXNpYmxlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0xBU1NfQ0VBXzYwOCA9ICdjZWE2MDgnO1xuXG4gIC8vIFRoZSBudW1iZXIgb2Ygcm93cyBpbiBhIGNlYTYwOCBncmlkXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENFQTYwOF9OVU1fUk9XUyA9IDE1O1xuICAvLyBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSBjZWE2MDggZ3JpZFxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDRUE2MDhfTlVNX0NPTFVNTlMgPSAzMjtcbiAgLy8gVGhlIG9mZnNldCBpbiBwZXJjZW50IGZvciBvbmUgcm93ICh3aGljaCBpcyBhbHNvIHRoZSBoZWlnaHQgb2YgYSByb3cpXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENFQTYwOF9ST1dfT0ZGU0VUID0gMTAwIC8gU3VidGl0bGVPdmVybGF5LkNFQTYwOF9OVU1fUk9XUztcbiAgLy8gVGhlIG9mZnNldCBpbiBwZXJjZW50IGZvciBvbmUgY29sdW1uICh3aGljaCBpcyBhbHNvIHRoZSB3aWR0aCBvZiBhIGNvbHVtbilcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0VBNjA4X0NPTFVNTl9PRkZTRVQgPSAxMDAgLyBTdWJ0aXRsZU92ZXJsYXkuQ0VBNjA4X05VTV9DT0xVTU5TO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29udGFpbmVyQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5wcmV2aWV3U3VidGl0bGVBY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLnByZXZpZXdTdWJ0aXRsZSA9IG5ldyBTdWJ0aXRsZUxhYmVsKHsgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3N1YnRpdGxlLmV4YW1wbGUnKSB9KTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktc3VidGl0bGUtb3ZlcmxheScsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIGxldCBzdWJ0aXRsZU1hbmFnZXIgPSBuZXcgQWN0aXZlU3VidGl0bGVNYW5hZ2VyKCk7XG4gICAgdGhpcy5zdWJ0aXRsZU1hbmFnZXIgPSBzdWJ0aXRsZU1hbmFnZXI7XG5cbiAgICB0aGlzLnN1YnRpdGxlQ29udGFpbmVyTWFuYWdlciA9IG5ldyBTdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lck1hbmFnZXIodGhpcyk7XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQ3VlRW50ZXIsIChldmVudDogU3VidGl0bGVDdWVFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdlbmVyYXRlTGFiZWwoZXZlbnQpO1xuICAgICAgc3VidGl0bGVNYW5hZ2VyLmN1ZUVudGVyKGV2ZW50LCBsYWJlbCk7XG5cbiAgICAgIHRoaXMucHJlcHJvY2Vzc0xhYmVsRXZlbnRDYWxsYmFjay5kaXNwYXRjaChldmVudCwgbGFiZWwpO1xuXG4gICAgICBpZiAodGhpcy5wcmV2aWV3U3VidGl0bGVBY3RpdmUpIHtcbiAgICAgICAgdGhpcy5zdWJ0aXRsZUNvbnRhaW5lck1hbmFnZXIucmVtb3ZlTGFiZWwodGhpcy5wcmV2aWV3U3VidGl0bGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNob3coKTtcblxuICAgICAgdGhpcy5zdWJ0aXRsZUNvbnRhaW5lck1hbmFnZXIuYWRkTGFiZWwobGFiZWwsIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnNpemUoKSk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudHMoKTtcbiAgICB9KTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5DdWVVcGRhdGUsIChldmVudDogU3VidGl0bGVDdWVFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdlbmVyYXRlTGFiZWwoZXZlbnQpO1xuICAgICAgY29uc3QgbGFiZWxUb1JlcGxhY2UgPSBzdWJ0aXRsZU1hbmFnZXIuY3VlVXBkYXRlKGV2ZW50LCBsYWJlbCk7XG5cbiAgICAgIHRoaXMucHJlcHJvY2Vzc0xhYmVsRXZlbnRDYWxsYmFjay5kaXNwYXRjaChldmVudCwgbGFiZWwpO1xuXG4gICAgICBpZiAobGFiZWxUb1JlcGxhY2UpIHtcbiAgICAgICAgdGhpcy5zdWJ0aXRsZUNvbnRhaW5lck1hbmFnZXIucmVwbGFjZUxhYmVsKGxhYmVsVG9SZXBsYWNlLCBsYWJlbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQ3VlRXhpdCwgKGV2ZW50OiBTdWJ0aXRsZUN1ZUV2ZW50KSA9PiB7XG4gICAgICBsZXQgbGFiZWxUb1JlbW92ZSA9IHN1YnRpdGxlTWFuYWdlci5jdWVFeGl0KGV2ZW50KTtcblxuICAgICAgaWYgKGxhYmVsVG9SZW1vdmUpIHtcbiAgICAgICAgdGhpcy5zdWJ0aXRsZUNvbnRhaW5lck1hbmFnZXIucmVtb3ZlTGFiZWwobGFiZWxUb1JlbW92ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50cygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXN1YnRpdGxlTWFuYWdlci5oYXNDdWVzKSB7XG4gICAgICAgIGlmICghdGhpcy5wcmV2aWV3U3VidGl0bGVBY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN1YnRpdGxlQ29udGFpbmVyTWFuYWdlci5hZGRMYWJlbCh0aGlzLnByZXZpZXdTdWJ0aXRsZSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCBzdWJ0aXRsZUNsZWFySGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgdGhpcy5zdWJ0aXRsZUNvbnRhaW5lck1hbmFnZXIuY2xlYXIoKTtcbiAgICAgIHN1YnRpdGxlTWFuYWdlci5jbGVhcigpO1xuICAgICAgdGhpcy5yZW1vdmVDb21wb25lbnRzKCk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudHMoKTtcbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkF1ZGlvQ2hhbmdlZCwgc3VidGl0bGVDbGVhckhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TdWJ0aXRsZUVuYWJsZWQsIHN1YnRpdGxlQ2xlYXJIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3VidGl0bGVEaXNhYmxlZCwgc3VidGl0bGVDbGVhckhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TZWVrLCBzdWJ0aXRsZUNsZWFySGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlRpbWVTaGlmdCwgc3VidGl0bGVDbGVhckhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5YmFja0ZpbmlzaGVkLCBzdWJ0aXRsZUNsZWFySGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZVVubG9hZGVkLCBzdWJ0aXRsZUNsZWFySGFuZGxlcik7XG5cbiAgICB1aW1hbmFnZXIub25Db21wb25lbnRTaG93LnN1YnNjcmliZSgoY29tcG9uZW50OiBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPikgPT4ge1xuICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbnRyb2xCYXIpIHtcbiAgICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoU3VidGl0bGVPdmVybGF5LkNMQVNTX0NPTlRST0xCQVJfVklTSUJMRSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVpbWFuYWdlci5vbkNvbXBvbmVudEhpZGUuc3Vic2NyaWJlKChjb21wb25lbnQ6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+KSA9PiB7XG4gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgQ29udHJvbEJhcikge1xuICAgICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhTdWJ0aXRsZU92ZXJsYXkuQ0xBU1NfQ09OVFJPTEJBUl9WSVNJQkxFKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyZUNlYTYwOENhcHRpb25zKHBsYXllciwgdWltYW5hZ2VyKTtcbiAgICAvLyBJbml0XG4gICAgc3VidGl0bGVDbGVhckhhbmRsZXIoKTtcbiAgfVxuXG4gIGdlbmVyYXRlTGFiZWwoZXZlbnQ6IFN1YnRpdGxlQ3VlRXZlbnQpOiBTdWJ0aXRsZUxhYmVsIHtcbiAgICAvLyBTYW5pdGl6ZSBjdWUgZGF0YSAobXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgY3VlIElEIGlzIGdlbmVyYXRlZCBpbiBzdWJ0aXRsZU1hbmFnZXIuY3VlRW50ZXIgLyB1cGRhdGUpXG4gICAgaWYgKGV2ZW50LnBvc2l0aW9uKSB7XG4gICAgICAvLyBTb21ldGltZXMgdGhlIHBvc2l0aW9ucyBhcmUgdW5kZWZpbmVkLCB3ZSBhc3N1bWUgdGhlbSB0byBiZSB6ZXJvXG4gICAgICBldmVudC5wb3NpdGlvbi5yb3cgPSBldmVudC5wb3NpdGlvbi5yb3cgfHwgMDtcbiAgICAgIGV2ZW50LnBvc2l0aW9uLmNvbHVtbiA9IGV2ZW50LnBvc2l0aW9uLmNvbHVtbiB8fCAwO1xuICAgIH1cblxuICAgIGNvbnN0IGxhYmVsID0gbmV3IFN1YnRpdGxlTGFiZWwoe1xuICAgICAgLy8gUHJlZmVyIHRoZSBIVE1MIHN1YnRpdGxlIHRleHQgaWYgc2V0LCBlbHNlIHRyeSBnZW5lcmF0aW5nIGEgaW1hZ2UgdGFnIGFzIHN0cmluZyBmcm9tIHRoZSBpbWFnZSBhdHRyaWJ1dGUsXG4gICAgICAvLyBlbHNlIHVzZSB0aGUgcGxhaW4gdGV4dFxuICAgICAgdGV4dDogZXZlbnQuaHRtbCB8fCBBY3RpdmVTdWJ0aXRsZU1hbmFnZXIuZ2VuZXJhdGVJbWFnZVRhZ1RleHQoZXZlbnQuaW1hZ2UpIHx8IGV2ZW50LnRleHQsXG4gICAgICB2dHQ6IGV2ZW50LnZ0dCxcbiAgICAgIHJlZ2lvbjogZXZlbnQucmVnaW9uLFxuICAgICAgcmVnaW9uU3R5bGU6IGV2ZW50LnJlZ2lvblN0eWxlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgY29uZmlndXJlQ2VhNjA4Q2FwdGlvbnMocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICAvLyBUaGUgY2FsY3VsYXRlZCBmb250IHNpemVcbiAgICBsZXQgZm9udFNpemUgPSAwO1xuICAgIC8vIFRoZSByZXF1aXJlZCBsZXR0ZXIgc3BhY2luZyBzcHJlYWQgdGhlIHRleHQgY2hhcmFjdGVycyBldmVubHkgYWNyb3NzIHRoZSBncmlkXG4gICAgbGV0IGZvbnRMZXR0ZXJTcGFjaW5nID0gMDtcbiAgICAvLyBGbGFnIHRlbGxpbmcgaWYgYSBmb250IHNpemUgY2FsY3VsYXRpb24gaXMgcmVxdWlyZWQgb2YgaWYgdGhlIGN1cnJlbnQgdmFsdWVzIGFyZSB2YWxpZFxuICAgIGxldCBmb250U2l6ZUNhbGN1bGF0aW9uUmVxdWlyZWQgPSB0cnVlO1xuICAgIC8vIEZsYWcgdGVsbGluZyBpZiB0aGUgQ0VBLTYwOCBtb2RlIGlzIGVuYWJsZWRcbiAgICBsZXQgZW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgdXBkYXRlQ0VBNjA4Rm9udFNpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkdW1teUxhYmVsID0gbmV3IFN1YnRpdGxlTGFiZWwoeyB0ZXh0OiAnWCcgfSk7XG4gICAgICBkdW1teUxhYmVsLmdldERvbUVsZW1lbnQoKS5jc3Moe1xuICAgICAgICAvLyBCeSB1c2luZyBhIGxhcmdlIGZvbnQgc2l6ZSB3ZSBkbyBub3QgbmVlZCB0byB1c2UgbXVsdGlwbGUgbGV0dGVycyBhbmQgY2FuIGdldCBzdGlsbCBhblxuICAgICAgICAvLyBhY2N1cmF0ZSBtZWFzdXJlbWVudCBldmVuIHRob3VnaCB0aGUgcmV0dXJuZWQgc2l6ZSBpcyBhbiBpbnRlZ2VyIHZhbHVlXG4gICAgICAgICdmb250LXNpemUnOiAnMjAwcHgnLFxuICAgICAgICAnbGluZS1oZWlnaHQnOiAnMjAwcHgnLFxuICAgICAgICAndmlzaWJpbGl0eSc6ICdoaWRkZW4nLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFkZENvbXBvbmVudChkdW1teUxhYmVsKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcG9uZW50cygpO1xuICAgICAgdGhpcy5zaG93KCk7XG5cbiAgICAgIGNvbnN0IGR1bW15TGFiZWxDaGFyV2lkdGggPSBkdW1teUxhYmVsLmdldERvbUVsZW1lbnQoKS53aWR0aCgpO1xuICAgICAgY29uc3QgZHVtbXlMYWJlbENoYXJIZWlnaHQgPSBkdW1teUxhYmVsLmdldERvbUVsZW1lbnQoKS5oZWlnaHQoKTtcbiAgICAgIGNvbnN0IGZvbnRTaXplUmF0aW8gPSBkdW1teUxhYmVsQ2hhcldpZHRoIC8gZHVtbXlMYWJlbENoYXJIZWlnaHQ7XG5cbiAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KGR1bW15TGFiZWwpO1xuICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRzKCk7XG4gICAgICBpZiAoIXRoaXMuc3VidGl0bGVNYW5hZ2VyLmhhc0N1ZXMpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIHN1YnRyYWN0IDFweCBoZXJlIHRvIGF2b2lkIGxpbmUgYnJlYWtzIGF0IHRoZSByaWdodCBib3JkZXIgb2YgdGhlIHN1YnRpdGxlIG92ZXJsYXkgdGhhdCBjYW4gaGFwcGVuXG4gICAgICAvLyB3aGVuIHRleHRzIGNvbnRhaW4gd2hpdGVzcGFjZXMuIEl0J3MgcHJvYmFibHkgc29tZSBraW5kIG9mIHBpeGVsIHJvdW5kaW5nIGlzc3VlIGluIHRoZSBicm93c2VyJ3NcbiAgICAgIC8vIGxheW91dGluZywgYnV0IHRoZSBhY3R1YWwgcmVhc29uIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLiBBaW1pbmcgZm9yIGEgdGFyZ2V0IHdpZHRoIC0gMXB4IHdvdWxkIHdvcmsgaW5cbiAgICAgIC8vIG1vc3QgYnJvd3NlcnMsIGJ1dCBTYWZhcmkgaGFzIGEgXCJxdWFudGl6ZWRcIiBmb250IHNpemUgcmVuZGVyaW5nIHdpdGggaHVnZSBzdGVwcyBpbiBiZXR3ZWVuIHNvIHdlIG5lZWRcbiAgICAgIC8vIHRvIHN1YnRyYWN0IHNvbWUgbW9yZSBwaXhlbHMgdG8gYXZvaWQgbGluZSBicmVha3MgdGhlcmUgYXMgd2VsbC5cbiAgICAgIGNvbnN0IHN1YnRpdGxlT3ZlcmxheVdpZHRoID0gdGhpcy5nZXREb21FbGVtZW50KCkud2lkdGgoKSAtIDEwO1xuICAgICAgY29uc3Qgc3VidGl0bGVPdmVybGF5SGVpZ2h0ID0gdGhpcy5nZXREb21FbGVtZW50KCkuaGVpZ2h0KCk7XG5cbiAgICAgIC8vIFRoZSBzaXplIHJhdGlvIG9mIHRoZSBsZXR0ZXIgZ3JpZFxuICAgICAgY29uc3QgZm9udEdyaWRTaXplUmF0aW8gPSAoZHVtbXlMYWJlbENoYXJXaWR0aCAqIFN1YnRpdGxlT3ZlcmxheS5DRUE2MDhfTlVNX0NPTFVNTlMpIC9cbiAgICAgICAgKGR1bW15TGFiZWxDaGFySGVpZ2h0ICogU3VidGl0bGVPdmVybGF5LkNFQTYwOF9OVU1fUk9XUyk7XG4gICAgICAvLyBUaGUgc2l6ZSByYXRpbyBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlIGZvciB0aGUgZ3JpZFxuICAgICAgY29uc3Qgc3VidGl0bGVPdmVybGF5U2l6ZVJhdGlvID0gc3VidGl0bGVPdmVybGF5V2lkdGggLyBzdWJ0aXRsZU92ZXJsYXlIZWlnaHQ7XG5cbiAgICAgIGlmIChzdWJ0aXRsZU92ZXJsYXlTaXplUmF0aW8gPiBmb250R3JpZFNpemVSYXRpbykge1xuICAgICAgICAvLyBXaGVuIHRoZSBhdmFpbGFibGUgc3BhY2UgaXMgd2lkZXIgdGhhbiB0aGUgdGV4dCBncmlkLCB0aGUgZm9udCBzaXplIGlzIHNpbXBseVxuICAgICAgICAvLyBkZXRlcm1pbmVkIGJ5IHRoZSBoZWlnaHQgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZS5cbiAgICAgICAgZm9udFNpemUgPSBzdWJ0aXRsZU92ZXJsYXlIZWlnaHQgLyBTdWJ0aXRsZU92ZXJsYXkuQ0VBNjA4X05VTV9ST1dTO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYWRkaXRpb25hbCBsZXR0ZXIgc3BhY2luZyByZXF1aXJlZCB0byBldmVubHkgc3ByZWFkIHRoZSB0ZXh0IGFjcm9zcyB0aGUgZ3JpZCdzIHdpZHRoXG4gICAgICAgIGNvbnN0IGdyaWRTbG90V2lkdGggPSBzdWJ0aXRsZU92ZXJsYXlXaWR0aCAvIFN1YnRpdGxlT3ZlcmxheS5DRUE2MDhfTlVNX0NPTFVNTlM7XG4gICAgICAgIGNvbnN0IGZvbnRDaGFyV2lkdGggPSBmb250U2l6ZSAqIGZvbnRTaXplUmF0aW87XG4gICAgICAgIGZvbnRMZXR0ZXJTcGFjaW5nID0gZ3JpZFNsb3RXaWR0aCAtIGZvbnRDaGFyV2lkdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXaGVuIHRoZSBhdmFpbGFibGUgc3BhY2UgaXMgbm90IHdpZGUgZW5vdWdoLCB0ZXh0cyB3b3VsZCB2ZXJ0aWNhbGx5IG92ZXJsYXAgaWYgd2UgdGFrZVxuICAgICAgICAvLyB0aGUgaGVpZ2h0IGFzIGEgYmFzZSBmb3IgdGhlIGZvbnQgc2l6ZSwgc28gd2UgbmVlZCB0byBsaW1pdCB0aGUgaGVpZ2h0LiBXZSBkbyB0aGF0XG4gICAgICAgIC8vIGJ5IGRldGVybWluaW5nIHRoZSBmb250IHNpemUgYnkgdGhlIHdpZHRoIG9mIHRoZSBhdmFpbGFibGUgc3BhY2UuXG4gICAgICAgIGZvbnRTaXplID0gc3VidGl0bGVPdmVybGF5V2lkdGggLyBTdWJ0aXRsZU92ZXJsYXkuQ0VBNjA4X05VTV9DT0xVTU5TIC8gZm9udFNpemVSYXRpbztcbiAgICAgICAgZm9udExldHRlclNwYWNpbmcgPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgZm9udC1zaXplIG9mIGFsbCBhY3RpdmUgc3VidGl0bGUgbGFiZWxzXG4gICAgICBmb3IgKGxldCBsYWJlbCBvZiB0aGlzLmdldENvbXBvbmVudHMoKSkge1xuICAgICAgICBpZiAobGFiZWwgaW5zdGFuY2VvZiBTdWJ0aXRsZUxhYmVsKSB7XG4gICAgICAgICAgbGFiZWwuZ2V0RG9tRWxlbWVudCgpLmNzcyh7XG4gICAgICAgICAgICAnZm9udC1zaXplJzogYCR7Zm9udFNpemV9cHhgLFxuICAgICAgICAgICAgJ2xldHRlci1zcGFjaW5nJzogYCR7Zm9udExldHRlclNwYWNpbmd9cHhgLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5ZXJSZXNpemVkLCAoKSA9PiB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB1cGRhdGVDRUE2MDhGb250U2l6ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9udFNpemVDYWxjdWxhdGlvblJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucHJlcHJvY2Vzc0xhYmVsRXZlbnRDYWxsYmFjay5zdWJzY3JpYmUoKGV2ZW50OiBTdWJ0aXRsZUN1ZUV2ZW50LCBsYWJlbDogU3VidGl0bGVMYWJlbCkgPT4ge1xuICAgICAgY29uc3QgaXNDRUE2MDggPSBldmVudC5wb3NpdGlvbiAhPSBudWxsO1xuICAgICAgaWYgKCFpc0NFQTYwOCkge1xuICAgICAgICAvLyBTa2lwIGFsbCBub24tQ0VBNjA4IGN1ZXNcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgICAgZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKFN1YnRpdGxlT3ZlcmxheS5DTEFTU19DRUFfNjA4KSk7XG5cbiAgICAgICAgLy8gV2UgY29uZGl0aW9uYWxseSB1cGRhdGUgdGhlIGZvbnQgc2l6ZSBieSB0aGlzIGZsYWcgaGVyZSB0byBhdm9pZCB1cGRhdGluZyBldmVyeSB0aW1lIGEgc3VidGl0bGVcbiAgICAgICAgLy8gaXMgYWRkZWQgaW50byBhbiBlbXB0eSBvdmVybGF5LiBCZWNhdXNlIHdlIHJlc2V0IHRoZSBvdmVybGF5IHdoZW4gYWxsIHN1YnRpdGxlcyBhcmUgZ29uZSwgdGhpc1xuICAgICAgICAvLyB3b3VsZCB0cmlnZ2VyIGFuIHVubmVjZXNzYXJ5IHVwZGF0ZSBldmVyeSB0aW1lLCBidXQgaXQncyBvbmx5IHJlcXVpcmVkIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucyxcbiAgICAgICAgLy8gZS5nLiBhZnRlciB0aGUgcGxheWVyIHNpemUgaGFzIGNoYW5nZWQuXG4gICAgICAgIGlmIChmb250U2l6ZUNhbGN1bGF0aW9uUmVxdWlyZWQpIHtcbiAgICAgICAgICB1cGRhdGVDRUE2MDhGb250U2l6ZSgpO1xuICAgICAgICAgIGZvbnRTaXplQ2FsY3VsYXRpb25SZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhYmVsLmdldERvbUVsZW1lbnQoKS5jc3Moe1xuICAgICAgICAnbGVmdCc6IGAke2V2ZW50LnBvc2l0aW9uLmNvbHVtbiAqIFN1YnRpdGxlT3ZlcmxheS5DRUE2MDhfQ09MVU1OX09GRlNFVH0lYCxcbiAgICAgICAgJ3RvcCc6IGAke2V2ZW50LnBvc2l0aW9uLnJvdyAqIFN1YnRpdGxlT3ZlcmxheS5DRUE2MDhfUk9XX09GRlNFVH0lYCxcbiAgICAgICAgJ2ZvbnQtc2l6ZSc6IGAke2ZvbnRTaXplfXB4YCxcbiAgICAgICAgJ2xldHRlci1zcGFjaW5nJzogYCR7Zm9udExldHRlclNwYWNpbmd9cHhgLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNldCA9ICgpID0+IHtcbiAgICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKHRoaXMucHJlZml4Q3NzKFN1YnRpdGxlT3ZlcmxheS5DTEFTU19DRUFfNjA4KSk7XG4gICAgICBlbmFibGVkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5DdWVFeGl0LCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc3VidGl0bGVNYW5hZ2VyLmhhc0N1ZXMpIHtcbiAgICAgICAgLy8gRGlzYWJsZSBDRUEtNjA4IG1vZGUgd2hlbiBhbGwgc3VidGl0bGVzIGFyZSBnb25lICh0byBhbGxvdyBjb3JyZWN0IGZvcm1hdHRpbmcgYW5kXG4gICAgICAgIC8vIGRpc3BsYXkgb2Ygb3RoZXIgdHlwZXMgb2Ygc3VidGl0bGVzLCBlLmcuIHRoZSBmb3JtYXR0aW5nIHByZXZpZXcgc3VidGl0bGUpXG4gICAgICAgIHJlc2V0KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlVW5sb2FkZWQsIHJlc2V0KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3VidGl0bGVFbmFibGVkLCByZXNldCk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlN1YnRpdGxlRGlzYWJsZWQsIHJlc2V0KTtcbiAgfVxuXG4gIGVuYWJsZVByZXZpZXdTdWJ0aXRsZUxhYmVsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdWJ0aXRsZU1hbmFnZXIuaGFzQ3Vlcykge1xuICAgICAgdGhpcy5wcmV2aWV3U3VidGl0bGVBY3RpdmUgPSB0cnVlO1xuICAgICAgdGhpcy5zdWJ0aXRsZUNvbnRhaW5lck1hbmFnZXIuYWRkTGFiZWwodGhpcy5wcmV2aWV3U3VidGl0bGUpO1xuICAgICAgdGhpcy51cGRhdGVDb21wb25lbnRzKCk7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVQcmV2aWV3U3VidGl0bGVMYWJlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcmV2aWV3U3VidGl0bGVBY3RpdmUpIHtcbiAgICAgIHRoaXMucHJldmlld1N1YnRpdGxlQWN0aXZlID0gZmFsc2U7XG4gICAgICB0aGlzLnN1YnRpdGxlQ29udGFpbmVyTWFuYWdlci5yZW1vdmVMYWJlbCh0aGlzLnByZXZpZXdTdWJ0aXRsZSk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudHMoKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIEFjdGl2ZVN1YnRpdGxlQ3VlIHtcbiAgZXZlbnQ6IFN1YnRpdGxlQ3VlRXZlbnQ7XG4gIGxhYmVsOiBTdWJ0aXRsZUxhYmVsO1xufVxuXG5pbnRlcmZhY2UgQWN0aXZlU3VidGl0bGVDdWVNYXAge1xuICBbaWQ6IHN0cmluZ106IEFjdGl2ZVN1YnRpdGxlQ3VlW107XG59XG5cbmludGVyZmFjZSBTdWJ0aXRsZUxhYmVsQ29uZmlnIGV4dGVuZHMgTGFiZWxDb25maWcge1xuICB2dHQ/OiBWVFRQcm9wZXJ0aWVzO1xuICByZWdpb24/OiBzdHJpbmc7XG4gIHJlZ2lvblN0eWxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3VidGl0bGVMYWJlbCBleHRlbmRzIExhYmVsPFN1YnRpdGxlTGFiZWxDb25maWc+IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFN1YnRpdGxlTGFiZWxDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXN1YnRpdGxlLWxhYmVsJyxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBnZXQgdnR0KCk6IFZUVFByb3BlcnRpZXMge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy52dHQ7XG4gIH1cblxuICBnZXQgcmVnaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlZ2lvbjtcbiAgfVxuXG4gIGdldCByZWdpb25TdHlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZWdpb25TdHlsZTtcbiAgfVxufVxuXG5jbGFzcyBBY3RpdmVTdWJ0aXRsZU1hbmFnZXIge1xuXG4gIHByaXZhdGUgYWN0aXZlU3VidGl0bGVDdWVNYXA6IEFjdGl2ZVN1YnRpdGxlQ3VlTWFwO1xuICBwcml2YXRlIGFjdGl2ZVN1YnRpdGxlQ3VlQ291bnQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmFjdGl2ZVN1YnRpdGxlQ3VlTWFwID0ge307XG4gICAgdGhpcy5hY3RpdmVTdWJ0aXRsZUN1ZUNvdW50ID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGEgdW5pcXVlIElEIGZvciBhIHN1YnRpdGxlIGN1ZSwgd2hpY2ggaXMgbmVlZGVkIHRvIGFzc29jaWF0ZSBhbiBDdWVFbnRlciB3aXRoIGl0cyBDdWVFeGl0XG4gICAqIGV2ZW50IHNvIHdlIGNhbiByZW1vdmUgdGhlIGNvcnJlY3Qgc3VidGl0bGUgaW4gQ3VlRXhpdCB3aGVuIG11bHRpcGxlIHN1YnRpdGxlcyBhcmUgYWN0aXZlIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAqIFRoZSBzdGFydCB0aW1lIHBsdXMgdGhlIHRleHQgc2hvdWxkIG1ha2UgYSB1bmlxdWUgaWRlbnRpZmllciwgYW5kIGluIHRoZSBvbmx5IGNhc2Ugd2hlcmUgYSBjb2xsaXNpb25cbiAgICogY2FuIGhhcHBlbiwgdHdvIHNpbWlsYXIgdGV4dHMgd2lsbCBiZSBkaXNwbGF5ZWQgYXQgYSBzaW1pbGFyIHRpbWUgYW5kIGEgc2ltaWxhciBwb3NpdGlvbiAob3Igd2l0aG91dCBwb3NpdGlvbikuXG4gICAqIFRoZSBzdGFydCB0aW1lIHNob3VsZCBhbHdheXMgYmUga25vd24sIGJlY2F1c2UgaXQgaXMgcmVxdWlyZWQgdG8gc2NoZWR1bGUgdGhlIEN1ZUVudGVyIGV2ZW50LiBUaGUgZW5kIHRpbWVcbiAgICogbXVzdCBub3QgbmVjZXNzYXJpbHkgYmUga25vd24gYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgdXNlZCBmb3IgdGhlIElELlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2FsY3VsYXRlSWQoZXZlbnQ6IFN1YnRpdGxlQ3VlRXZlbnQpOiBzdHJpbmcge1xuICAgIGxldCBpZCA9IGV2ZW50LnN0YXJ0ICsgJy0nICsgZXZlbnQudGV4dDtcblxuICAgIGlmIChldmVudC5wb3NpdGlvbikge1xuICAgICAgaWQgKz0gJy0nICsgZXZlbnQucG9zaXRpb24ucm93ICsgJy0nICsgZXZlbnQucG9zaXRpb24uY29sdW1uO1xuICAgIH1cblxuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGN1ZUVudGVyKGV2ZW50OiBTdWJ0aXRsZUN1ZUV2ZW50LCBsYWJlbDogU3VidGl0bGVMYWJlbCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQ3VlVG9NYXAoZXZlbnQsIGxhYmVsKTtcbiAgfVxuXG4gIGN1ZVVwZGF0ZShldmVudDogU3VidGl0bGVDdWVFdmVudCwgbGFiZWw6IFN1YnRpdGxlTGFiZWwpOiBTdWJ0aXRsZUxhYmVsIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsYWJlbFRvUmVwbGFjZSA9IHRoaXMucG9wQ3VlRnJvbU1hcChldmVudCk7XG5cbiAgICBpZiAobGFiZWxUb1JlcGxhY2UpIHtcbiAgICAgIHRoaXMuYWRkQ3VlVG9NYXAoZXZlbnQsIGxhYmVsKTtcbiAgICAgIHJldHVybiBsYWJlbFRvUmVwbGFjZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDdWVUb01hcChldmVudDogU3VidGl0bGVDdWVFdmVudCwgbGFiZWw6IFN1YnRpdGxlTGFiZWwpOiB2b2lkIHtcbiAgICBsZXQgaWQgPSBBY3RpdmVTdWJ0aXRsZU1hbmFnZXIuY2FsY3VsYXRlSWQoZXZlbnQpO1xuXG4gICAgLy8gQ3JlYXRlIGFycmF5IGZvciBpZCBpZiBpdCBkb2VzIG5vdCBleGlzdFxuICAgIHRoaXMuYWN0aXZlU3VidGl0bGVDdWVNYXBbaWRdID0gdGhpcy5hY3RpdmVTdWJ0aXRsZUN1ZU1hcFtpZF0gfHwgW107XG5cbiAgICAvLyBBZGQgY3VlXG4gICAgdGhpcy5hY3RpdmVTdWJ0aXRsZUN1ZU1hcFtpZF0ucHVzaCh7IGV2ZW50LCBsYWJlbCB9KTtcbiAgICB0aGlzLmFjdGl2ZVN1YnRpdGxlQ3VlQ291bnQrKztcbiAgfVxuXG4gIHByaXZhdGUgcG9wQ3VlRnJvbU1hcChldmVudDogU3VidGl0bGVDdWVFdmVudCk6IFN1YnRpdGxlTGFiZWwgfCB1bmRlZmluZWQge1xuICAgIGxldCBpZCA9IEFjdGl2ZVN1YnRpdGxlTWFuYWdlci5jYWxjdWxhdGVJZChldmVudCk7XG4gICAgbGV0IGFjdGl2ZVN1YnRpdGxlQ3VlcyA9IHRoaXMuYWN0aXZlU3VidGl0bGVDdWVNYXBbaWRdO1xuXG4gICAgaWYgKGFjdGl2ZVN1YnRpdGxlQ3VlcyAmJiBhY3RpdmVTdWJ0aXRsZUN1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gUmVtb3ZlIGN1ZVxuICAgICAgLyogV2UgYXBwbHkgdGhlIEZJRk8gYXBwcm9hY2ggaGVyZSBhbmQgcmVtb3ZlIHRoZSBvbGRlc3QgY3VlIGZyb20gdGhlIGFzc29jaWF0ZWQgaWQuIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGN1ZXNcbiAgICAgICAqIHdpdGggdGhlIHNhbWUgaWQsIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoaWNoIG9uZSBvZiB0aGUgY3VlcyBpcyB0byBiZSBkZWxldGVkLCBzbyB3ZSBqdXN0IGhvcGUgdGhhdCBGSUZPXG4gICAgICAgKiB3b3JrcyBmaW5lLiBUaGVvcmV0aWNhbGx5IGl0IGNhbiBoYXBwZW4gdGhhdCB0d28gY3VlcyB3aXRoIGNvbGxpZGluZyBpZHMgYXJlIHJlbW92ZWQgYXQgZGlmZmVyZW50IHRpbWVzLCBpblxuICAgICAgICogdGhlIHdyb25nIG9yZGVyLiBUaGlzIHJhcmUgY2FzZSBoYXMgeWV0IHRvIGJlIG9ic2VydmVkLiBJZiBpdCBldmVyIGdldHMgYW4gaXNzdWUsIHdlIGNhbiB0YWtlIHRoZSB1bnN0YWJsZVxuICAgICAgICogY3VlIGVuZCB0aW1lICh3aGljaCBjYW4gY2hhbmdlIGJldHdlZW4gQ3VlRW50ZXIgYW5kIEN1ZUV4aXQgSU4gQ3VlVXBkYXRlKSBhbmQgdXNlIGl0IGFzIGFuXG4gICAgICAgKiBhZGRpdGlvbmFsIGhpbnQgdG8gdHJ5IGFuZCByZW1vdmUgdGhlIGNvcnJlY3Qgb25lIG9mIHRoZSBjb2xsaWRpbmcgY3Vlcy5cbiAgICAgICAqL1xuICAgICAgbGV0IGFjdGl2ZVN1YnRpdGxlQ3VlID0gYWN0aXZlU3VidGl0bGVDdWVzLnNoaWZ0KCk7XG4gICAgICB0aGlzLmFjdGl2ZVN1YnRpdGxlQ3VlQ291bnQtLTtcblxuICAgICAgcmV0dXJuIGFjdGl2ZVN1YnRpdGxlQ3VlLmxhYmVsO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZW5lcmF0ZUltYWdlVGFnVGV4dChpbWFnZURhdGE6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFpbWFnZURhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbWdUYWcgPSBuZXcgRE9NKCdpbWcnLCB7XG4gICAgICBzcmM6IGltYWdlRGF0YSxcbiAgICB9KTtcbiAgICBpbWdUYWcuY3NzKCd3aWR0aCcsICcxMDAlJyk7XG4gICAgcmV0dXJuIGltZ1RhZy5nZXQoMCkub3V0ZXJIVE1MOyAvLyByZXR1cm4gdGhlIGh0bWwgYXMgc3RyaW5nXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIGFuIGFscmVhZHkgYWRkZWQgY3VlLlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHJldHVybiB7U3VidGl0bGVMYWJlbH1cbiAgICovXG4gIGdldEN1ZXMoZXZlbnQ6IFN1YnRpdGxlQ3VlRXZlbnQpOiBTdWJ0aXRsZUxhYmVsW10gfCB1bmRlZmluZWQge1xuICAgIGxldCBpZCA9IEFjdGl2ZVN1YnRpdGxlTWFuYWdlci5jYWxjdWxhdGVJZChldmVudCk7XG4gICAgbGV0IGFjdGl2ZVN1YnRpdGxlQ3VlcyA9IHRoaXMuYWN0aXZlU3VidGl0bGVDdWVNYXBbaWRdO1xuICAgIGlmIChhY3RpdmVTdWJ0aXRsZUN1ZXMgJiYgYWN0aXZlU3VidGl0bGVDdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBhY3RpdmVTdWJ0aXRsZUN1ZXMubWFwKChjdWUpID0+IGN1ZS5sYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHN1YnRpdGxlIGN1ZSBmcm9tIHRoZSBtYW5hZ2VyIGFuZCByZXR1cm5zIHRoZSBsYWJlbCB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIHN1YnRpdGxlIG92ZXJsYXksXG4gICAqIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBsYWJlbCBleGlzdGluZyAoZS5nLiBiZWNhdXNlIGFsbCBsYWJlbHMgaGF2ZSBiZWVuIHtAbGluayAjY2xlYXIgY2xlYXJlZH0uXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcmV0dXJuIHtTdWJ0aXRsZUxhYmVsfG51bGx9XG4gICAqL1xuICBjdWVFeGl0KGV2ZW50OiBTdWJ0aXRsZUN1ZUV2ZW50KTogU3VidGl0bGVMYWJlbCB7XG4gICAgcmV0dXJuIHRoaXMucG9wQ3VlRnJvbU1hcChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBzdWJ0aXRsZSBjdWVzLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgY3VlQ291bnQoKTogbnVtYmVyIHtcbiAgICAvLyBXZSBleHBsaWNpdGx5IGNvdW50IHRoZSBjdWVzIHRvIHNhdmUgYW4gQXJyYXkucmVkdWNlIG9uIGV2ZXJ5IGN1ZUNvdW50IGNhbGwgKHdoaWNoIGNhbiBoYXBwZW4gZnJlcXVlbnRseSlcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVTdWJ0aXRsZUN1ZUNvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYWN0aXZlIHN1YnRpdGxlIGN1ZXMsIGVsc2UgZmFsc2UuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaGFzQ3VlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdWVDb3VudCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgc3VidGl0bGUgY3VlcyBmcm9tIHRoZSBtYW5hZ2VyLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVTdWJ0aXRsZUN1ZU1hcCA9IHt9O1xuICAgIHRoaXMuYWN0aXZlU3VidGl0bGVDdWVDb3VudCA9IDA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1YnRpdGxlUmVnaW9uQ29udGFpbmVyTWFuYWdlciB7XG4gIHByaXZhdGUgc3VidGl0bGVSZWdpb25Db250YWluZXJzOiB7IFtyZWdpb25OYW1lOiBzdHJpbmddOiBTdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lciB9ID0ge307XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzdWJ0aXRsZU92ZXJsYXkgUmVmZXJlbmNlIHRvIHRoZSBzdWJ0aXRsZSBvdmVybGF5IGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIHRoZSBjb250YWluZXJzLlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdWJ0aXRsZU92ZXJsYXk6IFN1YnRpdGxlT3ZlcmxheSkge1xuICAgIHRoaXMuc3VidGl0bGVPdmVybGF5ID0gc3VidGl0bGVPdmVybGF5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWdpb24obGFiZWw6IFN1YnRpdGxlTGFiZWwpOiB7IHJlZ2lvbkNvbnRhaW5lcklkOiBzdHJpbmcsIHJlZ2lvbk5hbWU6IHN0cmluZyB9IHtcbiAgICBpZiAobGFiZWwudnR0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWdpb25Db250YWluZXJJZDogbGFiZWwudnR0LnJlZ2lvbiAmJiBsYWJlbC52dHQucmVnaW9uLmlkID8gbGFiZWwudnR0LnJlZ2lvbi5pZCA6ICd2dHQnLFxuICAgICAgICByZWdpb25OYW1lOiAndnR0JyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2lvbkNvbnRhaW5lcklkOiBsYWJlbC5yZWdpb24gfHwgJ2RlZmF1bHQnLFxuICAgICAgcmVnaW9uTmFtZTogbGFiZWwucmVnaW9uIHx8ICdkZWZhdWx0JyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHdyYXBzIGEgc3VidGl0bGUgbGFiZWwgaW50byBhIGNvbnRhaW5lciBkaXYgYmFzZWQgb24gdGhlIHN1YnRpdGxlIHJlZ2lvbi5cbiAgICogSWYgdGhlIHN1YnRpdGxlIGhhcyBwb3NpdGlvbmluZyBpbmZvcm1hdGlvbiBpdCBpcyBhZGRlZCB0byB0aGUgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIHN1YnRpdGxlIGxhYmVsIHRvIHdyYXBcbiAgICovXG4gIGFkZExhYmVsKGxhYmVsOiBTdWJ0aXRsZUxhYmVsLCBvdmVybGF5U2l6ZT86IFNpemUpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlZ2lvbkNvbnRhaW5lcklkLCByZWdpb25OYW1lIH0gPSB0aGlzLmdldFJlZ2lvbihsYWJlbCk7XG4gICAgY29uc3QgY3NzQ2xhc3NlcyA9IFtgc3VidGl0bGUtcG9zaXRpb24tJHtyZWdpb25OYW1lfWBdO1xuXG4gICAgaWYgKGxhYmVsLnZ0dCAmJiBsYWJlbC52dHQucmVnaW9uKSB7XG4gICAgICBjc3NDbGFzc2VzLnB1c2goYHZ0dC1yZWdpb24tJHtsYWJlbC52dHQucmVnaW9uLmlkfWApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lcnNbcmVnaW9uQ29udGFpbmVySWRdKSB7XG4gICAgICBjb25zdCByZWdpb25Db250YWluZXIgPSBuZXcgU3VidGl0bGVSZWdpb25Db250YWluZXIoe1xuICAgICAgICBjc3NDbGFzc2VzLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzW3JlZ2lvbkNvbnRhaW5lcklkXSA9IHJlZ2lvbkNvbnRhaW5lcjtcblxuICAgICAgaWYgKGxhYmVsLnJlZ2lvblN0eWxlKSB7XG4gICAgICAgIHJlZ2lvbkNvbnRhaW5lci5nZXREb21FbGVtZW50KCkuYXR0cignc3R5bGUnLCBsYWJlbC5yZWdpb25TdHlsZSk7XG4gICAgICB9IGVsc2UgaWYgKGxhYmVsLnZ0dCAmJiAhbGFiZWwudnR0LnJlZ2lvbikge1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgdGhlcmUgaXMgbm8gcmVnaW9uIHByZXNlbnQgdG8gd3JhcCB0aGUgQ3VlIEJveCwgdGhlIEN1ZSBib3ggYmVjb21lcyB0aGVcbiAgICAgICAgICogcmVnaW9uIGl0c2VsZi4gVGhlcmVmb3JlIHRoZSBwb3NpdGlvbmluZyB2YWx1ZXMgaGF2ZSB0byBjb21lIGZyb20gdGhlIGJveC5cbiAgICAgICAgICovXG4gICAgICAgIHJlZ2lvbkNvbnRhaW5lci5nZXREb21FbGVtZW50KCkuY3NzKCdwb3NpdGlvbicsICdzdGF0aWMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdldERvbUVsZW1lbnQgbmVlZHMgdG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UgdG8gZW5zdXJlIHRoZSBjb21wb25lbnQgZXhpc3RzXG4gICAgICAgIHJlZ2lvbkNvbnRhaW5lci5nZXREb21FbGVtZW50KCk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgcmVnaW9uQ29udGFpbmVySWQgaW4gdGhpcy5zdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lcnMpIHtcbiAgICAgICAgdGhpcy5zdWJ0aXRsZU92ZXJsYXkuYWRkQ29tcG9uZW50KHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzW3JlZ2lvbkNvbnRhaW5lcklkXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lcnNbcmVnaW9uQ29udGFpbmVySWRdLmFkZExhYmVsKGxhYmVsLCBvdmVybGF5U2l6ZSk7XG4gIH1cblxuICByZXBsYWNlTGFiZWwocHJldmlvdXNMYWJlbDogU3VidGl0bGVMYWJlbCwgbmV3TGFiZWw6IFN1YnRpdGxlTGFiZWwpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlZ2lvbkNvbnRhaW5lcklkIH0gPSB0aGlzLmdldFJlZ2lvbihwcmV2aW91c0xhYmVsKTtcblxuICAgIHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzW3JlZ2lvbkNvbnRhaW5lcklkXS5yZW1vdmVMYWJlbChwcmV2aW91c0xhYmVsKTtcbiAgICB0aGlzLnN1YnRpdGxlUmVnaW9uQ29udGFpbmVyc1tyZWdpb25Db250YWluZXJJZF0uYWRkTGFiZWwobmV3TGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBzdWJ0aXRsZSBsYWJlbCBmcm9tIGEgY29udGFpbmVyLlxuICAgKi9cbiAgcmVtb3ZlTGFiZWwobGFiZWw6IFN1YnRpdGxlTGFiZWwpOiB2b2lkIHtcbiAgICBsZXQgcmVnaW9uQ29udGFpbmVySWQ7XG5cbiAgICBpZiAobGFiZWwudnR0KSB7XG4gICAgICByZWdpb25Db250YWluZXJJZCA9IGxhYmVsLnZ0dC5yZWdpb24gJiYgbGFiZWwudnR0LnJlZ2lvbi5pZCA/IGxhYmVsLnZ0dC5yZWdpb24uaWQgOiAndnR0JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVnaW9uQ29udGFpbmVySWQgPSBsYWJlbC5yZWdpb24gfHwgJ2RlZmF1bHQnO1xuICAgIH1cblxuICAgIHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzW3JlZ2lvbkNvbnRhaW5lcklkXS5yZW1vdmVMYWJlbChsYWJlbCk7XG5cbiAgICAvLyBSZW1vdmUgY29udGFpbmVyIGlmIG5vIG1vcmUgbGFiZWxzIGFyZSBkaXNwbGF5ZWRcbiAgICBpZiAodGhpcy5zdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lcnNbcmVnaW9uQ29udGFpbmVySWRdLmlzRW1wdHkoKSkge1xuICAgICAgdGhpcy5zdWJ0aXRsZU92ZXJsYXkucmVtb3ZlQ29tcG9uZW50KHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzW3JlZ2lvbkNvbnRhaW5lcklkXSk7XG4gICAgICBkZWxldGUgdGhpcy5zdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lcnNbcmVnaW9uQ29udGFpbmVySWRdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBzdWJ0aXRsZSBjb250YWluZXJzLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZWdpb25OYW1lIGluIHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzKSB7XG4gICAgICB0aGlzLnN1YnRpdGxlT3ZlcmxheS5yZW1vdmVDb21wb25lbnQodGhpcy5zdWJ0aXRsZVJlZ2lvbkNvbnRhaW5lcnNbcmVnaW9uTmFtZV0pO1xuICAgIH1cblxuICAgIHRoaXMuc3VidGl0bGVSZWdpb25Db250YWluZXJzID0ge307XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1YnRpdGxlUmVnaW9uQ29udGFpbmVyIGV4dGVuZHMgQ29udGFpbmVyPENvbnRhaW5lckNvbmZpZz4ge1xuICBwcml2YXRlIGxhYmVsQ291bnQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29udGFpbmVyQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICdzdWJ0aXRsZS1yZWdpb24tY29udGFpbmVyJyxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBhZGRMYWJlbChsYWJlbFRvQWRkOiBTdWJ0aXRsZUxhYmVsLCBvdmVybGF5U2l6ZT86IFNpemUpIHtcbiAgICB0aGlzLmxhYmVsQ291bnQrKztcblxuICAgIGlmIChsYWJlbFRvQWRkLnZ0dCkge1xuICAgICAgaWYgKGxhYmVsVG9BZGQudnR0LnJlZ2lvbiAmJiBvdmVybGF5U2l6ZSkge1xuICAgICAgICBWdHRVdGlscy5zZXRWdHRSZWdpb25TdHlsZXModGhpcywgbGFiZWxUb0FkZC52dHQucmVnaW9uLCBvdmVybGF5U2l6ZSk7XG4gICAgICB9XG5cbiAgICAgIFZ0dFV0aWxzLnNldFZ0dEN1ZUJveFN0eWxlcyhsYWJlbFRvQWRkLCBvdmVybGF5U2l6ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDb21wb25lbnQobGFiZWxUb0FkZCk7XG4gICAgdGhpcy51cGRhdGVDb21wb25lbnRzKCk7XG4gIH1cblxuICByZW1vdmVMYWJlbChsYWJlbFRvUmVtb3ZlOiBTdWJ0aXRsZUxhYmVsKTogdm9pZCB7XG4gICAgdGhpcy5sYWJlbENvdW50LS07XG4gICAgdGhpcy5yZW1vdmVDb21wb25lbnQobGFiZWxUb1JlbW92ZSk7XG4gICAgdGhpcy51cGRhdGVDb21wb25lbnRzKCk7XG4gIH1cblxuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbENvdW50ID09PSAwO1xuICB9XG59XG4iLCJpbXBvcnQge1NlbGVjdEJveH0gZnJvbSAnLi9zZWxlY3Rib3gnO1xuaW1wb3J0IHtMaXN0U2VsZWN0b3JDb25maWd9IGZyb20gJy4vbGlzdHNlbGVjdG9yJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge1N1YnRpdGxlU3dpdGNoSGFuZGxlcn0gZnJvbSAnLi4vc3VidGl0bGV1dGlscyc7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIHNlbGVjdCBib3ggcHJvdmlkaW5nIGEgc2VsZWN0aW9uIGJldHdlZW4gYXZhaWxhYmxlIHN1YnRpdGxlIGFuZCBjYXB0aW9uIHRyYWNrcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1YnRpdGxlU2VsZWN0Qm94IGV4dGVuZHMgU2VsZWN0Qm94IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExpc3RTZWxlY3RvckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc3VidGl0bGVzZWxlY3Rib3gnXSxcbiAgICAgIGFyaWFMYWJlbDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3N1YnRpdGxlLnNlbGVjdCcpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBuZXcgU3VidGl0bGVTd2l0Y2hIYW5kbGVyKHBsYXllciwgdGhpcywgdWltYW5hZ2VyKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94LCBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcgfSBmcm9tICcuL3N1YnRpdGxlc2V0dGluZ3NlbGVjdGJveCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi8uLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBvZiBkaWZmZXJlbnQgYmFja2dyb3VuZCBjb2xvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kQ29sb3JTZWxlY3RCb3ggZXh0ZW5kcyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc3VidGl0bGVzZXR0aW5nc2JhY2tncm91bmRjb2xvcnNlbGVjdGJveCddLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLmFkZEl0ZW0obnVsbCwgaTE4bi5nZXRMb2NhbGl6ZXIoJ2RlZmF1bHQnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCd3aGl0ZScsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMud2hpdGUnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdibGFjaycsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMuYmxhY2snKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdyZWQnLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLnJlZCcpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2dyZWVuJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5ncmVlbicpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2JsdWUnLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLmJsdWUnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdjeWFuJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5jeWFuJykpO1xuICAgIHRoaXMuYWRkSXRlbSgneWVsbG93JywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy55ZWxsb3cnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdtYWdlbnRhJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5tYWdlbnRhJykpO1xuXG4gICAgbGV0IHNldENvbG9yQW5kT3BhY2l0eSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kQ29sb3IuaXNTZXQoKSAmJiB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kT3BhY2l0eS5pc1NldCgpKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlT3ZlcmxheUNsYXNzKFxuICAgICAgICAgICdiZ2NvbG9yLScgKyB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kQ29sb3IudmFsdWUgKyB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kT3BhY2l0eS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvZ2dsZU92ZXJsYXlDbGFzcyhudWxsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUoKHNlbmRlciwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRDb2xvci52YWx1ZSA9IGtleTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRDb2xvci5vbkNoYW5nZWQuc3Vic2NyaWJlKChzZW5kZXIsIHByb3BlcnR5KSA9PiB7XG4gICAgICAvLyBDb2xvciBhbmQgb3BhY2l0eSBnbyB0b2dldGhlciwgc28gd2UgbmVlZCB0by4uLlxuICAgICAgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kQ29sb3IuaXNTZXQoKSkge1xuICAgICAgICAvLyAuLi4gY2xlYXIgdGhlIG9wYWNpdHkgd2hlbiB0aGUgY29sb3IgaXMgbm90IHNldFxuICAgICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kT3BhY2l0eS5jbGVhcigpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZE9wYWNpdHkuaXNTZXQoKSkge1xuICAgICAgICAvLyAuLi4gc2V0IGFuIG9wYWNpdHkgd2hlbiB0aGUgY29sb3IgaXMgc2V0XG4gICAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRPcGFjaXR5LnZhbHVlID0gJzEwMCc7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0ocHJvcGVydHkudmFsdWUpO1xuICAgICAgc2V0Q29sb3JBbmRPcGFjaXR5KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kT3BhY2l0eS5vbkNoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHNldENvbG9yQW5kT3BhY2l0eSgpO1xuICAgIH0pO1xuXG4gICAgLy8gTG9hZCBpbml0aWFsIHZhbHVlXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRDb2xvci5pc1NldCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZENvbG9yLnZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCwgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnIH0gZnJvbSAnLi9zdWJ0aXRsZXNldHRpbmdzZWxlY3Rib3gnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgc2VsZWN0IGJveCBwcm92aWRpbmcgYSBzZWxlY3Rpb24gb2YgZGlmZmVyZW50IGJhY2tncm91bmQgb3BhY2l0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhY2tncm91bmRPcGFjaXR5U2VsZWN0Qm94IGV4dGVuZHMgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveENvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzc2VzOiBbJ3VpLXN1YnRpdGxlc2V0dGluZ3NiYWNrZ3JvdW5kb3BhY2l0eXNlbGVjdGJveCddLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLmFkZEl0ZW0obnVsbCwgaTE4bi5nZXRMb2NhbGl6ZXIoJ2RlZmF1bHQnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCcxMDAnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDEwMCB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCc3NScsIGkxOG4uZ2V0TG9jYWxpemVyKCdwZXJjZW50JywgeyB2YWx1ZTogNzUgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnNTAnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDUwIH0pKTtcbiAgICB0aGlzLmFkZEl0ZW0oJzI1JywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAyNSB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCcwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAwIH0pKTtcblxuICAgIHRoaXMub25JdGVtU2VsZWN0ZWQuc3Vic2NyaWJlKChzZW5kZXIsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kT3BhY2l0eS52YWx1ZSA9IGtleTtcblxuICAgICAgLy8gQ29sb3IgYW5kIG9wYWNpdHkgZ28gdG9nZXRoZXIsIHNvIHdlIG5lZWQgdG8uLi5cbiAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZE9wYWNpdHkuaXNTZXQoKSkge1xuICAgICAgICAvLyAuLi4gY2xlYXIgdGhlIGNvbG9yIHdoZW4gdGhlIG9wYWNpdHkgaXMgbm90IHNldFxuICAgICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kQ29sb3IuY2xlYXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRDb2xvci5pc1NldCgpKSB7XG4gICAgICAgIC8vIC4uLiBzZXQgYSBjb2xvciB3aGVuIHRoZSBvcGFjaXR5IGlzIHNldFxuICAgICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5iYWNrZ3JvdW5kQ29sb3IudmFsdWUgPSAnYmxhY2snO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHNlbGVjdGVkIGl0ZW0gd2hlbiB2YWx1ZSBpcyBzZXQgZnJvbSBzb21ld2hlcmUgZWxzZVxuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRPcGFjaXR5Lm9uQ2hhbmdlZC5zdWJzY3JpYmUoKHNlbmRlciwgcHJvcGVydHkpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbShwcm9wZXJ0eS52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBMb2FkIGluaXRpYWwgdmFsdWVcbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuYmFja2dyb3VuZE9wYWNpdHkuaXNTZXQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmJhY2tncm91bmRPcGFjaXR5LnZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCwgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnIH0gZnJvbSAnLi9zdWJ0aXRsZXNldHRpbmdzZWxlY3Rib3gnO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgc2VsZWN0IGJveCBwcm92aWRpbmcgYSBzZWxlY3Rpb24gb2YgZGlmZmVyZW50IGNoYXJhY3RlciBlZGdlLlxuICovXG5leHBvcnQgY2xhc3MgQ2hhcmFjdGVyRWRnZVNlbGVjdEJveCBleHRlbmRzIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3NlczogWyd1aS1zdWJ0aXRsZXNldHRpbmdzY2hhcmFjdGVyZWRnZXNlbGVjdGJveCddLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLmFkZEl0ZW0obnVsbCwgaTE4bi5nZXRMb2NhbGl6ZXIoJ2RlZmF1bHQnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdyYWlzZWQnLCBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UucmFpc2VkJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnZGVwcmVzc2VkJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5jaGFyYWN0ZXJFZGdlLmRlcHJlc3NlZCcpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ3VuaWZvcm0nLCBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UudW5pZm9ybScpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2Ryb3BzaGFkb3dlZCcsIGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuY2hhcmFjdGVyRWRnZS5kcm9wc2hhZG93ZWQnKSk7XG5cbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5jaGFyYWN0ZXJFZGdlLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKHNlbmRlciwgcHJvcGVydHkpID0+IHtcbiAgICAgIGlmIChwcm9wZXJ0eS5pc1NldCgpKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlT3ZlcmxheUNsYXNzKCdjaGFyYWN0ZXJlZGdlLScgKyBwcm9wZXJ0eS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvZ2dsZU92ZXJsYXlDbGFzcyhudWxsKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VsZWN0IHRoZSBpdGVtIGluIGNhc2UgdGhlIHByb3BlcnR5IHdhcyBzZXQgZnJvbSBvdXRzaWRlXG4gICAgICB0aGlzLnNlbGVjdEl0ZW0ocHJvcGVydHkudmFsdWUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUoKHNlbmRlciwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmNoYXJhY3RlckVkZ2UudmFsdWUgPSBrZXk7XG4gICAgfSk7XG5cbiAgICAvLyBMb2FkIGluaXRpYWwgdmFsdWVcbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuY2hhcmFjdGVyRWRnZS5pc1NldCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZXR0aW5nc01hbmFnZXIuY2hhcmFjdGVyRWRnZS52YWx1ZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gsIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveENvbmZpZyB9IGZyb20gJy4vc3VidGl0bGVzZXR0aW5nc2VsZWN0Ym94JztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uLy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uLy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIHNlbGVjdCBib3ggcHJvdmlkaW5nIGEgc2VsZWN0aW9uIG9mIGRpZmZlcmVudCBmb250IGNvbG9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEZvbnRDb2xvclNlbGVjdEJveCBleHRlbmRzIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3NlczogWyd1aS1zdWJ0aXRsZXNldHRpbmdzZm9udGNvbG9yc2VsZWN0Ym94J10sXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMuYWRkSXRlbShudWxsLCBpMThuLmdldExvY2FsaXplcignZGVmYXVsdCcpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ3doaXRlJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy53aGl0ZScpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2JsYWNrJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5ibGFjaycpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ3JlZCcsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMucmVkJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnZ3JlZW4nLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLmdyZWVuJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnYmx1ZScsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMuYmx1ZScpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2N5YW4nLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLmN5YW4nKSk7XG4gICAgdGhpcy5hZGRJdGVtKCd5ZWxsb3cnLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLnllbGxvdycpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ21hZ2VudGEnLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLm1hZ2VudGEnKSk7XG5cbiAgICBsZXQgc2V0Q29sb3JBbmRPcGFjaXR5ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRDb2xvci5pc1NldCgpICYmIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRPcGFjaXR5LmlzU2V0KCkpIHtcbiAgICAgICAgdGhpcy50b2dnbGVPdmVybGF5Q2xhc3MoXG4gICAgICAgICAgJ2ZvbnRjb2xvci0nICsgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udENvbG9yLnZhbHVlICsgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udE9wYWNpdHkudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2dnbGVPdmVybGF5Q2xhc3MobnVsbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMub25JdGVtU2VsZWN0ZWQuc3Vic2NyaWJlKChzZW5kZXIsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5mb250Q29sb3IudmFsdWUgPSBrZXk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5mb250Q29sb3Iub25DaGFuZ2VkLnN1YnNjcmliZSgoc2VuZGVyLCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgLy8gQ29sb3IgYW5kIG9wYWNpdHkgZ28gdG9nZXRoZXIsIHNvIHdlIG5lZWQgdG8uLi5cbiAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udENvbG9yLmlzU2V0KCkpIHtcbiAgICAgICAgLy8gLi4uIGNsZWFyIHRoZSBvcGFjaXR5IHdoZW4gdGhlIGNvbG9yIGlzIG5vdCBzZXRcbiAgICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udE9wYWNpdHkuY2xlYXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRPcGFjaXR5LmlzU2V0KCkpIHtcbiAgICAgICAgLy8gLi4uIHNldCBhbiBvcGFjaXR5IHdoZW4gdGhlIGNvbG9yIGlzIHNldFxuICAgICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5mb250T3BhY2l0eS52YWx1ZSA9ICcxMDAnO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RJdGVtKHByb3BlcnR5LnZhbHVlKTtcbiAgICAgIHNldENvbG9yQW5kT3BhY2l0eSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udE9wYWNpdHkub25DaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBzZXRDb2xvckFuZE9wYWNpdHkoKTtcbiAgICB9KTtcblxuICAgIC8vIExvYWQgaW5pdGlhbCB2YWx1ZVxuICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5mb250Q29sb3IuaXNTZXQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRDb2xvci52YWx1ZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gsIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveENvbmZpZyB9IGZyb20gJy4vc3VidGl0bGVzZXR0aW5nc2VsZWN0Ym94JztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uLy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uLy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBBIHNlbGVjdCBib3ggcHJvdmlkaW5nIGEgc2VsZWN0aW9uIG9mIGRpZmZlcmVudCBmb250IGZhbWlseS5cbiAqL1xuZXhwb3J0IGNsYXNzIEZvbnRGYW1pbHlTZWxlY3RCb3ggZXh0ZW5kcyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3gge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktc3VidGl0bGVzZXR0aW5nc2ZvbnRmYW1pbHlzZWxlY3Rib3gnXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgdGhpcy5hZGRJdGVtKG51bGwsIGkxOG4uZ2V0TG9jYWxpemVyKCdkZWZhdWx0JykpO1xuICAgIHRoaXMuYWRkSXRlbSgnbW9ub3NwYWNlZHNlcmlmJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5tb25vc3BhY2Vkc2VyaWYnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdwcm9wb3J0aW9uYWxzZXJpZicsIGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkucHJvcG9ydGlvbmFsc2VyaWYnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdtb25vc3BhY2Vkc2Fuc3NlcmlmJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5tb25vc3BhY2Vkc2Fuc3NlcmlmJykpO1xuICAgIHRoaXMuYWRkSXRlbSgncHJvcG9ydGlvbmFsc2Fuc3NlcmlmJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5wcm9wb3J0aW9uYWxzZXJpZicpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ2Nhc3VhbCcsIGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkuY2FzdWFsJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnY3Vyc2l2ZScsIGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkuY3Vyc2l2ZScpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ3NtYWxsY2FwaXRhbCcsIGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkuc21hbGxjYXBpdGFsJykpO1xuXG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udEZhbWlseS5vbkNoYW5nZWQuc3Vic2NyaWJlKChzZW5kZXIsIHByb3BlcnR5KSA9PiB7XG4gICAgICBpZiAocHJvcGVydHkuaXNTZXQoKSkge1xuICAgICAgICB0aGlzLnRvZ2dsZU92ZXJsYXlDbGFzcygnZm9udGZhbWlseS0nICsgcHJvcGVydHkudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2dnbGVPdmVybGF5Q2xhc3MobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlbGVjdCB0aGUgaXRlbSBpbiBjYXNlIHRoZSBwcm9wZXJ0eSB3YXMgc2V0IGZyb20gb3V0c2lkZVxuICAgICAgdGhpcy5zZWxlY3RJdGVtKHByb3BlcnR5LnZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMub25JdGVtU2VsZWN0ZWQuc3Vic2NyaWJlKChzZW5kZXIsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5mb250RmFtaWx5LnZhbHVlID0ga2V5O1xuICAgIH0pO1xuXG4gICAgLy8gTG9hZCBpbml0aWFsIHZhbHVlXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRGYW1pbHkuaXNTZXQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRGYW1pbHkudmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94LCBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcgfSBmcm9tICcuL3N1YnRpdGxlc2V0dGluZ3NlbGVjdGJveCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi8uLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBvZiBkaWZmZXJlbnQgZm9udCBjb2xvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBGb250T3BhY2l0eVNlbGVjdEJveCBleHRlbmRzIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3NlczogWyd1aS1zdWJ0aXRsZXNldHRpbmdzZm9udG9wYWNpdHlzZWxlY3Rib3gnXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgdGhpcy5hZGRJdGVtKG51bGwsIGkxOG4uZ2V0TG9jYWxpemVyKCdkZWZhdWx0JykpO1xuICAgIHRoaXMuYWRkSXRlbSgnMTAwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAxMDAgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnNzUnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDc1IH0pKTtcbiAgICB0aGlzLmFkZEl0ZW0oJzUwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiA1MCB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCcyNScsIGkxOG4uZ2V0TG9jYWxpemVyKCdwZXJjZW50JywgeyB2YWx1ZTogMjUgfSkpO1xuXG4gICAgdGhpcy5vbkl0ZW1TZWxlY3RlZC5zdWJzY3JpYmUoKHNlbmRlciwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRPcGFjaXR5LnZhbHVlID0ga2V5O1xuXG4gICAgICAvLyBDb2xvciBhbmQgb3BhY2l0eSBnbyB0b2dldGhlciwgc28gd2UgbmVlZCB0by4uLlxuICAgICAgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci5mb250T3BhY2l0eS5pc1NldCgpKSB7XG4gICAgICAgIC8vIC4uLiBjbGVhciB0aGUgY29sb3Igd2hlbiB0aGUgb3BhY2l0eSBpcyBub3Qgc2V0XG4gICAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRDb2xvci5jbGVhcigpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udENvbG9yLmlzU2V0KCkpIHtcbiAgICAgICAgLy8gLi4uIHNldCBhIGNvbG9yIHdoZW4gdGhlIG9wYWNpdHkgaXMgc2V0XG4gICAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRDb2xvci52YWx1ZSA9ICd3aGl0ZSc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgaXRlbSB3aGVuIHZhbHVlIGlzIHNldCBmcm9tIHNvbWV3aGVyZSBlbHNlXG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udE9wYWNpdHkub25DaGFuZ2VkLnN1YnNjcmliZSgoc2VuZGVyLCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHByb3BlcnR5LnZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIExvYWQgaW5pdGlhbCB2YWx1ZVxuICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5mb250T3BhY2l0eS5pc1NldCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udE9wYWNpdHkudmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94LCBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcgfSBmcm9tICcuL3N1YnRpdGxlc2V0dGluZ3NlbGVjdGJveCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi8uLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBvZiBkaWZmZXJlbnQgZm9udCBjb2xvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBGb250U2l6ZVNlbGVjdEJveCBleHRlbmRzIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3NlczogWyd1aS1zdWJ0aXRsZXNldHRpbmdzZm9udHNpemVzZWxlY3Rib3gnXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgdGhpcy5hZGRJdGVtKG51bGwsIGkxOG4uZ2V0TG9jYWxpemVyKCdkZWZhdWx0JykpO1xuICAgIHRoaXMuYWRkSXRlbSgnNTAnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDUwIH0pKTtcbiAgICB0aGlzLmFkZEl0ZW0oJzc1JywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiA3NSB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCcxMDAnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDEwMCB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCcxNTAnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDE1MCB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCcyMDAnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDIwMCB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCczMDAnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDMwMCB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCc0MDAnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDQwMCB9KSk7XG5cbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlci5mb250U2l6ZS5vbkNoYW5nZWQuc3Vic2NyaWJlKChzZW5kZXIsIHByb3BlcnR5KSA9PiB7XG4gICAgICBpZiAocHJvcGVydHkuaXNTZXQoKSkge1xuICAgICAgICB0aGlzLnRvZ2dsZU92ZXJsYXlDbGFzcygnZm9udHNpemUtJyArIHByb3BlcnR5LnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9nZ2xlT3ZlcmxheUNsYXNzKG51bGwpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZWxlY3QgdGhlIGl0ZW0gaW4gY2FzZSB0aGUgcHJvcGVydHkgd2FzIHNldCBmcm9tIG91dHNpZGVcbiAgICAgIHRoaXMuc2VsZWN0SXRlbShwcm9wZXJ0eS52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoc2VuZGVyLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udFNpemUudmFsdWUgPSBrZXk7XG4gICAgfSk7XG5cbiAgICAvLyBMb2FkIGluaXRpYWwgdmFsdWVcbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuZm9udFNpemUuaXNTZXQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmZvbnRTaXplLnZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7U3VidGl0bGVPdmVybGF5fSBmcm9tICcuLi9zdWJ0aXRsZW92ZXJsYXknO1xuaW1wb3J0IHtMaXN0U2VsZWN0b3JDb25maWd9IGZyb20gJy4uL2xpc3RzZWxlY3Rvcic7XG5pbXBvcnQge1NlbGVjdEJveH0gZnJvbSAnLi4vc2VsZWN0Ym94JztcbmltcG9ydCB7U3VidGl0bGVTZXR0aW5nc01hbmFnZXJ9IGZyb20gJy4vc3VidGl0bGVzZXR0aW5nc21hbmFnZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveENvbmZpZyBleHRlbmRzIExpc3RTZWxlY3RvckNvbmZpZyB7XG4gIG92ZXJsYXk6IFN1YnRpdGxlT3ZlcmxheTtcbiAgc2V0dGluZ3NNYW5hZ2VyOiBTdWJ0aXRsZVNldHRpbmdzTWFuYWdlcjtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgc3VidGl0bGVzIHNldHRpbmdzIHNlbGVjdCBib3hcbiAqKi9cbmV4cG9ydCBjbGFzcyBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3ggZXh0ZW5kcyBTZWxlY3RCb3gge1xuXG4gIHByb3RlY3RlZCBzZXR0aW5nc01hbmFnZXI6IFN1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyO1xuICBwcm90ZWN0ZWQgb3ZlcmxheTogU3VidGl0bGVPdmVybGF5O1xuICBwcml2YXRlIGN1cnJlbnRDc3NDbGFzczogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94Q29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gY29uZmlnLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLm92ZXJsYXkgPSBjb25maWcub3ZlcmxheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcHJldmlvdXNseSBzZXQgY2xhc3MgYW5kIGFkZHMgdGhlIHBhc3NlZCBpbiBjbGFzcy5cbiAgICogQHBhcmFtIGNzc0NsYXNzIFRoZSBuZXcgY2xhc3MgdG8gcmVwbGFjZSB0aGUgcHJldmlvdXMgY2xhc3Mgd2l0aCBvciBudWxsIHRvIGp1c3QgcmVtb3ZlIHRoZSBwcmV2aW91cyBjbGFzc1xuICAgKi9cbiAgcHJvdGVjdGVkIHRvZ2dsZU92ZXJsYXlDbGFzcyhjc3NDbGFzczogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIHByZXZpb3VzIGNsYXNzIGlmIGV4aXN0aW5nXG4gICAgaWYgKHRoaXMuY3VycmVudENzc0NsYXNzKSB7XG4gICAgICB0aGlzLm92ZXJsYXkuZ2V0RG9tRWxlbWVudCgpLnJlbW92ZUNsYXNzKHRoaXMuY3VycmVudENzc0NsYXNzKTtcbiAgICAgIHRoaXMuY3VycmVudENzc0NsYXNzID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBZGQgbmV3IGNsYXNzIGlmIHNwZWNpZmllZC4gSWYgdGhlIG5ldyBjbGFzcyBpcyBudWxsLCB3ZSBkb24ndCBhZGQgYW55dGhpbmcuXG4gICAgaWYgKGNzc0NsYXNzKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDc3NDbGFzcyA9IHRoaXMucHJlZml4Q3NzKGNzc0NsYXNzKTtcbiAgICAgIHRoaXMub3ZlcmxheS5nZXREb21FbGVtZW50KCkuYWRkQ2xhc3ModGhpcy5jdXJyZW50Q3NzQ2xhc3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtMYWJlbENvbmZpZ30gZnJvbSAnLi4vbGFiZWwnO1xuaW1wb3J0IHtDb250YWluZXIsIENvbnRhaW5lckNvbmZpZ30gZnJvbSAnLi4vY29udGFpbmVyJztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi8uLi9kb20nO1xuaW1wb3J0IHtTZXR0aW5nc1BhbmVsUGFnZU9wZW5CdXR0b259IGZyb20gJy4uL3NldHRpbmdzcGFuZWxwYWdlb3BlbmJ1dHRvbic7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVRleHQsIGkxOG4gfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VidGl0bGVTZXR0aW5nc0xhYmVsQ29uZmlnIGV4dGVuZHMgTGFiZWxDb25maWcge1xuICBvcGVuZXI6IFNldHRpbmdzUGFuZWxQYWdlT3BlbkJ1dHRvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFN1YnRpdGxlU2V0dGluZ3NMYWJlbCBleHRlbmRzIENvbnRhaW5lcjxDb250YWluZXJDb25maWc+IHtcblxuICBwcml2YXRlIG9wZW5lcjogU2V0dGluZ3NQYW5lbFBhZ2VPcGVuQnV0dG9uO1xuXG4gIHByaXZhdGUgdGV4dDogTG9jYWxpemFibGVUZXh0O1xuXG4gIHByaXZhdGUgZm9yOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdWJ0aXRsZVNldHRpbmdzTGFiZWxDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5vcGVuZXIgPSBjb25maWcub3BlbmVyO1xuICAgIHRoaXMudGV4dCA9IGNvbmZpZy50ZXh0O1xuICAgIHRoaXMuZm9yID0gY29uZmlnLmZvcjtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyg8Q29udGFpbmVyQ29uZmlnPmNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS1sYWJlbCcsXG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIHRoaXMub3BlbmVyLFxuICAgICAgXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9Eb21FbGVtZW50KCk6IERPTSB7XG4gICAgbGV0IGxhYmVsRWxlbWVudCA9IG5ldyBET00oJ2xhYmVsJywge1xuICAgICAgJ2lkJzogdGhpcy5jb25maWcuaWQsXG4gICAgICAnY2xhc3MnOiB0aGlzLmdldENzc0NsYXNzZXMoKSxcbiAgICAgICdmb3InOiB0aGlzLmZvcixcbiAgICB9KS5hcHBlbmQoXG4gICAgICBuZXcgRE9NKCdzcGFuJywge30pLmh0bWwoaTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKHRoaXMudGV4dCkpLFxuICAgICAgdGhpcy5vcGVuZXIuZ2V0RG9tRWxlbWVudCgpLFxuICAgICk7XG5cbiAgICByZXR1cm4gbGFiZWxFbGVtZW50O1xuICB9XG59XG4iLCJpbXBvcnQge1N0b3JhZ2VVdGlsc30gZnJvbSAnLi4vLi4vc3RvcmFnZXV0aWxzJztcbmltcG9ydCB7Q29tcG9uZW50LCBDb21wb25lbnRDb25maWd9IGZyb20gJy4uL2NvbXBvbmVudCc7XG5pbXBvcnQge0V2ZW50RGlzcGF0Y2hlciwgRXZlbnR9IGZyb20gJy4uLy4uL2V2ZW50ZGlzcGF0Y2hlcic7XG5cbmludGVyZmFjZSBTdWJ0aXRsZVNldHRpbmdzIHtcbiAgZm9udENvbG9yPzogc3RyaW5nO1xuICBmb250T3BhY2l0eT86IHN0cmluZztcbiAgZm9udEZhbWlseT86IHN0cmluZztcbiAgZm9udFNpemU/OiBzdHJpbmc7XG4gIGNoYXJhY3RlckVkZ2U/OiBzdHJpbmc7XG4gIGJhY2tncm91bmRDb2xvcj86IHN0cmluZztcbiAgYmFja2dyb3VuZE9wYWNpdHk/OiBzdHJpbmc7XG4gIHdpbmRvd0NvbG9yPzogc3RyaW5nO1xuICB3aW5kb3dPcGFjaXR5Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUHJvcGVydGllcyB7XG4gIFtuYW1lOiBzdHJpbmddOiBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGNsYXNzIFN1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyIHtcblxuICBwcml2YXRlIHVzZXJTZXR0aW5nczogU3VidGl0bGVTZXR0aW5ncztcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VLZXk6IHN0cmluZztcblxuICBwcml2YXRlIF9wcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzID0ge1xuICAgIGZvbnRDb2xvcjogbmV3IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+KHRoaXMpLFxuICAgIGZvbnRPcGFjaXR5OiBuZXcgU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4odGhpcyksXG4gICAgZm9udEZhbWlseTogbmV3IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+KHRoaXMpLFxuICAgIGZvbnRTaXplOiBuZXcgU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4odGhpcyksXG4gICAgY2hhcmFjdGVyRWRnZTogbmV3IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+KHRoaXMpLFxuICAgIGJhY2tncm91bmRDb2xvcjogbmV3IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+KHRoaXMpLFxuICAgIGJhY2tncm91bmRPcGFjaXR5OiBuZXcgU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4odGhpcyksXG4gICAgd2luZG93Q29sb3I6IG5ldyBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPih0aGlzKSxcbiAgICB3aW5kb3dPcGFjaXR5OiBuZXcgU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4odGhpcyksXG4gIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy51c2VyU2V0dGluZ3MgPSB7fTtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZUtleSA9IER1bW15Q29tcG9uZW50Lmluc3RhbmNlKCkucHJlZml4Q3NzKCdzdWJ0aXRsZXNldHRpbmdzJyk7XG5cbiAgICBmb3IgKGxldCBwcm9wZXJ0eU5hbWUgaW4gdGhpcy5fcHJvcGVydGllcykge1xuICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKHNlbmRlciwgcHJvcGVydHkpID0+IHtcbiAgICAgICAgaWYgKHByb3BlcnR5LmlzU2V0KCkpIHtcbiAgICAgICAgICAoPGFueT50aGlzLnVzZXJTZXR0aW5ncylbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5LnZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgcHJvcGVydHkgZnJvbSB0aGUgc2V0dGluZ3Mgb2JqZWN0IGlmIHVuc2V0IHRvIGF2b2lkIHNlcmlhbGl6YXRpb24gb2YgbnVsbCB2YWx1ZXNcbiAgICAgICAgICBkZWxldGUgKDxhbnk+dGhpcy51c2VyU2V0dGluZ3MpW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTYXZlIHRoZSBzZXR0aW5ncyBvYmplY3Qgd2hlbiBhIHByb3BlcnR5IGhhcyBjaGFuZ2VkXG4gICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2FkKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgcHJvcGVydHlOYW1lIGluIHRoaXMuX3Byb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuX3Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXS5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9udENvbG9yKCk6IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcy5mb250Q29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvbnRPcGFjaXR5KCk6IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcy5mb250T3BhY2l0eTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9udEZhbWlseSgpOiBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXMuZm9udEZhbWlseTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9udFNpemUoKTogU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzLmZvbnRTaXplO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGFyYWN0ZXJFZGdlKCk6IFN1YnRpdGxlU2V0dGluZ3NQcm9wZXJ0eTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcGVydGllcy5jaGFyYWN0ZXJFZGdlO1xuICB9XG5cbiAgcHVibGljIGdldCBiYWNrZ3JvdW5kQ29sb3IoKTogU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzLmJhY2tncm91bmRDb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmFja2dyb3VuZE9wYWNpdHkoKTogU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzLmJhY2tncm91bmRPcGFjaXR5O1xuICB9XG5cbiAgcHVibGljIGdldCB3aW5kb3dDb2xvcigpOiBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXMud2luZG93Q29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdpbmRvd09wYWNpdHkoKTogU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0aWVzLndpbmRvd09wYWNpdHk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIHNldHRpbmdzIHRvIGxvY2FsIHN0b3JhZ2UuXG4gICAqL1xuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcbiAgICBTdG9yYWdlVXRpbHMuc2V0T2JqZWN0KHRoaXMubG9jYWxTdG9yYWdlS2V5LCB0aGlzLnVzZXJTZXR0aW5ncyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIHNldHRpbmdzIGZyb20gbG9jYWwgc3RvcmFnZVxuICAgKi9cbiAgcHVibGljIGxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy51c2VyU2V0dGluZ3MgPSBTdG9yYWdlVXRpbHMuZ2V0T2JqZWN0PFN1YnRpdGxlU2V0dGluZ3M+KHRoaXMubG9jYWxTdG9yYWdlS2V5KSB8fCB7fTtcblxuICAgIC8vIEFwcGx5IHRoZSBsb2FkZWQgc2V0dGluZ3NcbiAgICBmb3IgKGxldCBwcm9wZXJ0eSBpbiB0aGlzLnVzZXJTZXR0aW5ncykge1xuICAgICAgdGhpcy5fcHJvcGVydGllc1twcm9wZXJ0eV0udmFsdWUgPSAoPGFueT50aGlzLnVzZXJTZXR0aW5ncylbcHJvcGVydHldO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgZHVtbXkgY29tcG9uZW50IHdob3NlIHNvbGUgcHVycG9zZSBpcyB0byBleHBvc2UgdGhlIHtAbGluayAjcHJlZml4Q3NzfSBtZXRob2QgdG8gdGhlXG4gKiB7QGxpbmsgU3VidGl0bGVTZXR0aW5nc01hbmFnZXJ9LlxuICovXG5jbGFzcyBEdW1teUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudDxDb21wb25lbnRDb25maWc+IHtcblxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IER1bW15Q29tcG9uZW50O1xuXG4gIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2UoKTogRHVtbXlDb21wb25lbnQge1xuICAgIGlmICghRHVtbXlDb21wb25lbnQuX2luc3RhbmNlKSB7XG4gICAgICBEdW1teUNvbXBvbmVudC5faW5zdGFuY2UgPSBuZXcgRHVtbXlDb21wb25lbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gRHVtbXlDb21wb25lbnQuX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHByZWZpeENzcyhjc3NDbGFzc09ySWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cGVyLnByZWZpeENzcyhjc3NDbGFzc09ySWQpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8VD4ge1xuXG4gIHByaXZhdGUgX21hbmFnZXI6IFN1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyO1xuICBwcml2YXRlIF9vbkNoYW5nZWQ6IEV2ZW50RGlzcGF0Y2hlcjxTdWJ0aXRsZVNldHRpbmdzTWFuYWdlciwgU3VidGl0bGVTZXR0aW5nc1Byb3BlcnR5PFQ+PjtcbiAgcHJpdmF0ZSBfdmFsdWU6IFQ7XG5cbiAgY29uc3RydWN0b3IobWFuYWdlcjogU3VidGl0bGVTZXR0aW5nc01hbmFnZXIpIHtcbiAgICB0aGlzLl9tYW5hZ2VyID0gbWFuYWdlcjtcbiAgICB0aGlzLl9vbkNoYW5nZWQgPSBuZXcgRXZlbnREaXNwYXRjaGVyPFN1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyLCBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8VD4+KCk7XG4gIH1cblxuICBwdWJsaWMgaXNTZXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICE9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgIHRoaXMub25DaGFuZ2VkRXZlbnQobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IFQge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IFQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgICB2YWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9uQ2hhbmdlZEV2ZW50KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNoYW5nZWRFdmVudCh2YWx1ZTogVCkge1xuICAgIHRoaXMuX29uQ2hhbmdlZC5kaXNwYXRjaCh0aGlzLl9tYW5hZ2VyLCB0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb25DaGFuZ2VkKCk6IEV2ZW50PFN1YnRpdGxlU2V0dGluZ3NNYW5hZ2VyLCBTdWJ0aXRsZVNldHRpbmdzUHJvcGVydHk8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5fb25DaGFuZ2VkLmdldEV2ZW50KCk7XG4gIH1cbn0iLCJpbXBvcnQge1NldHRpbmdzUGFuZWxQYWdlfSBmcm9tICcuLi9zZXR0aW5nc3BhbmVscGFnZSc7XG5pbXBvcnQge1NldHRpbmdzUGFuZWx9IGZyb20gJy4uL3NldHRpbmdzcGFuZWwnO1xuaW1wb3J0IHtTdWJ0aXRsZU92ZXJsYXl9IGZyb20gJy4uL3N1YnRpdGxlb3ZlcmxheSc7XG5pbXBvcnQge0NvbnRhaW5lckNvbmZpZ30gZnJvbSAnLi4vY29udGFpbmVyJztcbmltcG9ydCB7U3VidGl0bGVTZXR0aW5nc01hbmFnZXJ9IGZyb20gJy4vc3VidGl0bGVzZXR0aW5nc21hbmFnZXInO1xuaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudENvbmZpZ30gZnJvbSAnLi4vY29tcG9uZW50JztcbmltcG9ydCB7Rm9udFNpemVTZWxlY3RCb3h9IGZyb20gJy4vZm9udHNpemVzZWxlY3Rib3gnO1xuaW1wb3J0IHtGb250RmFtaWx5U2VsZWN0Qm94fSBmcm9tICcuL2ZvbnRmYW1pbHlzZWxlY3Rib3gnO1xuaW1wb3J0IHtGb250Q29sb3JTZWxlY3RCb3h9IGZyb20gJy4vZm9udGNvbG9yc2VsZWN0Ym94JztcbmltcG9ydCB7Rm9udE9wYWNpdHlTZWxlY3RCb3h9IGZyb20gJy4vZm9udG9wYWNpdHlzZWxlY3Rib3gnO1xuaW1wb3J0IHtDaGFyYWN0ZXJFZGdlU2VsZWN0Qm94fSBmcm9tICcuL2NoYXJhY3RlcmVkZ2VzZWxlY3Rib3gnO1xuaW1wb3J0IHtCYWNrZ3JvdW5kQ29sb3JTZWxlY3RCb3h9IGZyb20gJy4vYmFja2dyb3VuZGNvbG9yc2VsZWN0Ym94JztcbmltcG9ydCB7QmFja2dyb3VuZE9wYWNpdHlTZWxlY3RCb3h9IGZyb20gJy4vYmFja2dyb3VuZG9wYWNpdHlzZWxlY3Rib3gnO1xuaW1wb3J0IHtXaW5kb3dDb2xvclNlbGVjdEJveH0gZnJvbSAnLi93aW5kb3djb2xvcnNlbGVjdGJveCc7XG5pbXBvcnQge1dpbmRvd09wYWNpdHlTZWxlY3RCb3h9IGZyb20gJy4vd2luZG93b3BhY2l0eXNlbGVjdGJveCc7XG5pbXBvcnQge1N1YnRpdGxlU2V0dGluZ3NSZXNldEJ1dHRvbn0gZnJvbSAnLi9zdWJ0aXRsZXNldHRpbmdzcmVzZXRidXR0b24nO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7U2V0dGluZ3NQYW5lbFBhZ2VCYWNrQnV0dG9ufSBmcm9tICcuLi9zZXR0aW5nc3BhbmVscGFnZWJhY2tidXR0b24nO1xuaW1wb3J0IHtTZXR0aW5nc1BhbmVsSXRlbX0gZnJvbSAnLi4vc2V0dGluZ3NwYW5lbGl0ZW0nO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VidGl0bGVTZXR0aW5nc1BhbmVsUGFnZUNvbmZpZyBleHRlbmRzIENvbnRhaW5lckNvbmZpZyB7XG4gIHNldHRpbmdzUGFuZWw6IFNldHRpbmdzUGFuZWw7XG4gIG92ZXJsYXk6IFN1YnRpdGxlT3ZlcmxheTtcbn1cblxuZXhwb3J0IGNsYXNzIFN1YnRpdGxlU2V0dGluZ3NQYW5lbFBhZ2UgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsUGFnZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvdmVybGF5OiBTdWJ0aXRsZU92ZXJsYXk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NQYW5lbDogU2V0dGluZ3NQYW5lbDtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFN1YnRpdGxlU2V0dGluZ3NQYW5lbFBhZ2VDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5vdmVybGF5ID0gY29uZmlnLm92ZXJsYXk7XG4gICAgdGhpcy5zZXR0aW5nc1BhbmVsID0gY29uZmlnLnNldHRpbmdzUGFuZWw7XG5cbiAgICBsZXQgbWFuYWdlciA9IG5ldyBTdWJ0aXRsZVNldHRpbmdzTWFuYWdlcigpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY29tcG9uZW50czogPENvbXBvbmVudDxDb21wb25lbnRDb25maWc+W10+W1xuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LnNpemUnKSwgbmV3IEZvbnRTaXplU2VsZWN0Qm94KHtcbiAgICAgICAgICBvdmVybGF5OiB0aGlzLm92ZXJsYXksIHNldHRpbmdzTWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseScpLCBuZXcgRm9udEZhbWlseVNlbGVjdEJveCh7XG4gICAgICAgICAgb3ZlcmxheTogdGhpcy5vdmVybGF5LCBzZXR0aW5nc01hbmFnZXI6IG1hbmFnZXIsXG4gICAgICAgIH0pKSxcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5jb2xvcicpLCBuZXcgRm9udENvbG9yU2VsZWN0Qm94KHtcbiAgICAgICAgICBvdmVybGF5OiB0aGlzLm92ZXJsYXksIHNldHRpbmdzTWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250Lm9wYWNpdHknKSwgbmV3IEZvbnRPcGFjaXR5U2VsZWN0Qm94KHtcbiAgICAgICAgICBvdmVybGF5OiB0aGlzLm92ZXJsYXksIHNldHRpbmdzTWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5jaGFyYWN0ZXJFZGdlJyksIG5ldyBDaGFyYWN0ZXJFZGdlU2VsZWN0Qm94KHtcbiAgICAgICAgICBvdmVybGF5OiB0aGlzLm92ZXJsYXksIHNldHRpbmdzTWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcy5iYWNrZ3JvdW5kLmNvbG9yJyksIG5ldyBCYWNrZ3JvdW5kQ29sb3JTZWxlY3RCb3goe1xuICAgICAgICAgIG92ZXJsYXk6IHRoaXMub3ZlcmxheSwgc2V0dGluZ3NNYW5hZ2VyOiBtYW5hZ2VyLFxuICAgICAgICB9KSksXG4gICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbShpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLmJhY2tncm91bmQub3BhY2l0eScpLCBuZXcgQmFja2dyb3VuZE9wYWNpdHlTZWxlY3RCb3goe1xuICAgICAgICAgIG92ZXJsYXk6IHRoaXMub3ZlcmxheSwgc2V0dGluZ3NNYW5hZ2VyOiBtYW5hZ2VyLFxuICAgICAgICB9KSksXG4gICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbShpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLndpbmRvdy5jb2xvcicpLCBuZXcgV2luZG93Q29sb3JTZWxlY3RCb3goe1xuICAgICAgICAgIG92ZXJsYXk6IHRoaXMub3ZlcmxheSwgc2V0dGluZ3NNYW5hZ2VyOiBtYW5hZ2VyLFxuICAgICAgICB9KSksXG4gICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbShpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzLndpbmRvdy5vcGFjaXR5JyksIG5ldyBXaW5kb3dPcGFjaXR5U2VsZWN0Qm94KHtcbiAgICAgICAgICBvdmVybGF5OiB0aGlzLm92ZXJsYXksIHNldHRpbmdzTWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgfSkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0obmV3IFNldHRpbmdzUGFuZWxQYWdlQmFja0J1dHRvbih7XG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLnNldHRpbmdzUGFuZWwsXG4gICAgICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ2JhY2snKSxcbiAgICAgICAgfSksIG5ldyBTdWJ0aXRsZVNldHRpbmdzUmVzZXRCdXR0b24oe1xuICAgICAgICAgIHNldHRpbmdzTWFuYWdlcjogbWFuYWdlcixcbiAgICAgICAgfSksIHtcbiAgICAgICAgICByb2xlOiAnbWVudWJhcicsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgdGhpcy5vbkFjdGl2ZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5vdmVybGF5LmVuYWJsZVByZXZpZXdTdWJ0aXRsZUxhYmVsKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uSW5hY3RpdmUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMub3ZlcmxheS5yZW1vdmVQcmV2aWV3U3VidGl0bGVMYWJlbCgpO1xuICAgIH0pO1xuICB9XG59IiwiaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7U3VidGl0bGVTZXR0aW5nc01hbmFnZXJ9IGZyb20gJy4vc3VidGl0bGVzZXR0aW5nc21hbmFnZXInO1xuaW1wb3J0IHtCdXR0b24sIEJ1dHRvbkNvbmZpZ30gZnJvbSAnLi4vYnV0dG9uJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1YnRpdGxlU2V0dGluZ3NSZXNldEJ1dHRvbkNvbmZpZyBleHRlbmRzIEJ1dHRvbkNvbmZpZyB7XG4gIHNldHRpbmdzTWFuYWdlcjogU3VidGl0bGVTZXR0aW5nc01hbmFnZXI7XG59XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCByZXNldHMgYWxsIHN1YnRpdGxlIHNldHRpbmdzIHRvIHRoZWlyIGRlZmF1bHRzLlxuICovXG5leHBvcnQgY2xhc3MgU3VidGl0bGVTZXR0aW5nc1Jlc2V0QnV0dG9uIGV4dGVuZHMgQnV0dG9uPEJ1dHRvbkNvbmZpZz4ge1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogU3VidGl0bGVTZXR0aW5nc1Jlc2V0QnV0dG9uQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktc3VidGl0bGVzZXR0aW5nc3Jlc2V0YnV0dG9uJyxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdyZXNldCcpLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLm9uQ2xpY2suc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICg8U3VidGl0bGVTZXR0aW5nc1Jlc2V0QnV0dG9uQ29uZmlnPnRoaXMuY29uZmlnKS5zZXR0aW5nc01hbmFnZXIucmVzZXQoKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94LCBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcgfSBmcm9tICcuL3N1YnRpdGxlc2V0dGluZ3NlbGVjdGJveCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi8uLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBvZiBkaWZmZXJlbnQgYmFja2dyb3VuZCBjb2xvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXaW5kb3dDb2xvclNlbGVjdEJveCBleHRlbmRzIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3NlczogWyd1aS1zdWJ0aXRsZXNldHRpbmdzd2luZG93Y29sb3JzZWxlY3Rib3gnXSxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBjb25maWd1cmUocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBzdXBlci5jb25maWd1cmUocGxheWVyLCB1aW1hbmFnZXIpO1xuXG4gICAgdGhpcy5hZGRJdGVtKG51bGwsIGkxOG4uZ2V0TG9jYWxpemVyKCdkZWZhdWx0JykpO1xuICAgIHRoaXMuYWRkSXRlbSgnd2hpdGUnLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLndoaXRlJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnYmxhY2snLCBpMThuLmdldExvY2FsaXplcignY29sb3JzLmJsYWNrJykpO1xuICAgIHRoaXMuYWRkSXRlbSgncmVkJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5yZWQnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdncmVlbicsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMuZ3JlZW4nKSk7XG4gICAgdGhpcy5hZGRJdGVtKCdibHVlJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2NvbG9ycy5ibHVlJykpO1xuICAgIHRoaXMuYWRkSXRlbSgnY3lhbicsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMuY3lhbicpKTtcbiAgICB0aGlzLmFkZEl0ZW0oJ3llbGxvdycsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMueWVsbG93JykpO1xuICAgIHRoaXMuYWRkSXRlbSgnbWFnZW50YScsIGkxOG4uZ2V0TG9jYWxpemVyKCdjb2xvcnMubWFnZW50YScpKTtcblxuXG5cbiAgICBsZXQgc2V0Q29sb3JBbmRPcGFjaXR5ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd0NvbG9yLmlzU2V0KCkgJiYgdGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93T3BhY2l0eS5pc1NldCgpKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlT3ZlcmxheUNsYXNzKFxuICAgICAgICAgICd3aW5kb3djb2xvci0nICsgdGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93Q29sb3IudmFsdWUgKyB0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dPcGFjaXR5LnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9nZ2xlT3ZlcmxheUNsYXNzKG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoc2VuZGVyLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93Q29sb3IudmFsdWUgPSBrZXk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dDb2xvci5vbkNoYW5nZWQuc3Vic2NyaWJlKChzZW5kZXIsIHByb3BlcnR5KSA9PiB7XG4gICAgICAvLyBDb2xvciBhbmQgb3BhY2l0eSBnbyB0b2dldGhlciwgc28gd2UgbmVlZCB0by4uLlxuICAgICAgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dDb2xvci5pc1NldCgpKSB7XG4gICAgICAgIC8vIC4uLiBjbGVhciB0aGUgb3BhY2l0eSB3aGVuIHRoZSBjb2xvciBpcyBub3Qgc2V0XG4gICAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd09wYWNpdHkuY2xlYXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd09wYWNpdHkuaXNTZXQoKSkge1xuICAgICAgICAvLyAuLi4gc2V0IGFuIG9wYWNpdHkgd2hlbiB0aGUgY29sb3IgaXMgc2V0XG4gICAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd09wYWNpdHkudmFsdWUgPSAnMTAwJztcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0SXRlbShwcm9wZXJ0eS52YWx1ZSk7XG4gICAgICBzZXRDb2xvckFuZE9wYWNpdHkoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd09wYWNpdHkub25DaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBzZXRDb2xvckFuZE9wYWNpdHkoKTtcbiAgICB9KTtcblxuICAgIC8vIExvYWQgaW5pdGlhbCB2YWx1ZVxuICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dDb2xvci5pc1NldCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93Q29sb3IudmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94LCBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcgfSBmcm9tICcuL3N1YnRpdGxlc2V0dGluZ3NlbGVjdGJveCc7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi8uLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi8uLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBvZiBkaWZmZXJlbnQgYmFja2dyb3VuZCBvcGFjaXR5LlxuICovXG5leHBvcnQgY2xhc3MgV2luZG93T3BhY2l0eVNlbGVjdEJveCBleHRlbmRzIFN1YnRpdGxlU2V0dGluZ1NlbGVjdEJveCB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTdWJ0aXRsZVNldHRpbmdTZWxlY3RCb3hDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3NlczogWyd1aS1zdWJ0aXRsZXNldHRpbmdzd2luZG93b3BhY2l0eXNlbGVjdGJveCddLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICB0aGlzLmFkZEl0ZW0obnVsbCwgaTE4bi5nZXRMb2NhbGl6ZXIoJ2RlZmF1bHQnKSk7XG4gICAgdGhpcy5hZGRJdGVtKCcxMDAnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDEwMCB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCc3NScsIGkxOG4uZ2V0TG9jYWxpemVyKCdwZXJjZW50JywgeyB2YWx1ZTogNzUgfSkpO1xuICAgIHRoaXMuYWRkSXRlbSgnNTAnLCBpMThuLmdldExvY2FsaXplcigncGVyY2VudCcsIHsgdmFsdWU6IDUwIH0pKTtcbiAgICB0aGlzLmFkZEl0ZW0oJzI1JywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAyNSB9KSk7XG4gICAgdGhpcy5hZGRJdGVtKCcwJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ3BlcmNlbnQnLCB7IHZhbHVlOiAwIH0pKTtcblxuICAgIHRoaXMub25JdGVtU2VsZWN0ZWQuc3Vic2NyaWJlKChzZW5kZXIsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dPcGFjaXR5LnZhbHVlID0ga2V5O1xuXG4gICAgICAvLyBDb2xvciBhbmQgb3BhY2l0eSBnbyB0b2dldGhlciwgc28gd2UgbmVlZCB0by4uLlxuICAgICAgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dPcGFjaXR5LmlzU2V0KCkpIHtcbiAgICAgICAgLy8gLi4uIGNsZWFyIHRoZSBjb2xvciB3aGVuIHRoZSBvcGFjaXR5IGlzIG5vdCBzZXRcbiAgICAgICAgdGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93Q29sb3IuY2xlYXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd0NvbG9yLmlzU2V0KCkpIHtcbiAgICAgICAgLy8gLi4uIHNldCBhIGNvbG9yIHdoZW4gdGhlIG9wYWNpdHkgaXMgc2V0XG4gICAgICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLndpbmRvd0NvbG9yLnZhbHVlID0gJ2JsYWNrJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCBpdGVtIHdoZW4gdmFsdWUgaXMgc2V0IGZyb20gc29tZXdoZXJlIGVsc2VcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlci53aW5kb3dPcGFjaXR5Lm9uQ2hhbmdlZC5zdWJzY3JpYmUoKHNlbmRlciwgcHJvcGVydHkpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0SXRlbShwcm9wZXJ0eS52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBMb2FkIGluaXRpYWwgdmFsdWVcbiAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93T3BhY2l0eS5pc1NldCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdEl0ZW0odGhpcy5zZXR0aW5nc01hbmFnZXIud2luZG93T3BhY2l0eS52YWx1ZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgRE9NIH0gZnJvbSAnLi4vZG9tJztcbmltcG9ydCB7IENvbXBvbmVudENvbmZpZyB9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7IFRpbWVsaW5lTWFya2VyIH0gZnJvbSAnLi4vdWljb25maWcnO1xuaW1wb3J0IHsgU2Vla0Jhck1hcmtlciB9IGZyb20gJy4vc2Vla2Jhcic7XG5pbXBvcnQgeyBQbGF5ZXJVdGlscyB9IGZyb20gJy4uL3BsYXllcnV0aWxzJztcbmltcG9ydCB7IFRpbWVvdXQgfSBmcm9tICcuLi90aW1lb3V0JztcblxuZXhwb3J0IGludGVyZmFjZSBNYXJrZXJzQ29uZmlnIGV4dGVuZHMgQ29tcG9uZW50Q29uZmlnIHtcbiAgLyoqXG4gICAqIFVzZWQgZm9yIHNlZWtCYXIgbWFya2VyIHNuYXBwaW5nIHJhbmdlIHBlcmNlbnRhZ2VcbiAgICovXG4gIHNuYXBwaW5nUmFuZ2U/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBUaW1lbGluZU1hcmtlcnNIYW5kbGVyIHtcbiAgcHJpdmF0ZSBtYXJrZXJzQ29udGFpbmVyOiBET007XG4gIHByaXZhdGUgdGltZWxpbmVNYXJrZXJzOiBTZWVrQmFyTWFya2VyW107XG4gIHByaXZhdGUgcGxheWVyOiBQbGF5ZXJBUEk7XG4gIHByaXZhdGUgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcjtcbiAgcHJpdmF0ZSBwYXVzZWRUaW1lc2hpZnRVcGRhdGVyOiBUaW1lb3V0O1xuICBwcml2YXRlIGdldFNlZWtCYXJXaWR0aDogKCkgPT4gbnVtYmVyO1xuICBwcm90ZWN0ZWQgY29uZmlnOiBNYXJrZXJzQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogTWFya2Vyc0NvbmZpZywgZ2V0U2Vla0JhcldpZHRoOiAoKSA9PiBudW1iZXIsIG1hcmtlcnNDb250YWluZXI6IERPTSkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuZ2V0U2Vla0JhcldpZHRoID0gZ2V0U2Vla0JhcldpZHRoO1xuICAgIHRoaXMubWFya2Vyc0NvbnRhaW5lciA9IG1hcmtlcnNDb250YWluZXI7XG4gICAgdGhpcy50aW1lbGluZU1hcmtlcnMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKSB7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy51aW1hbmFnZXIgPSB1aW1hbmFnZXI7XG4gICAgdGhpcy5jb25maWd1cmVNYXJrZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZU1hcmtlcnMoKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIG1hcmtlcnMgd2hlbiB1bmxvYWRlZFxuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlVW5sb2FkZWQsICgpID0+IHRoaXMuY2xlYXJNYXJrZXJzKCkpO1xuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRCcmVha1N0YXJ0ZWQsICgpID0+IHRoaXMuY2xlYXJNYXJrZXJzKCkpO1xuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuQWRCcmVha0ZpbmlzaGVkLCAoKSA9PiB0aGlzLnVwZGF0ZU1hcmtlcnMoKSk7XG4gICAgLy8gVXBkYXRlIG1hcmtlcnMgd2hlbiB0aGUgc2l6ZSBvZiB0aGUgc2Vla2JhciBjaGFuZ2VzXG4gICAgdGhpcy5wbGF5ZXIub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5ZXJSZXNpemVkLCAoKSA9PiB0aGlzLnVwZGF0ZU1hcmtlcnNET00oKSk7XG5cbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZUxvYWRlZCwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGxheWVyLmlzTGl2ZSgpKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBtYXJrZXIgcG9zaXRpb24gYXMgdGltZXNoaWZ0IHJhbmdlIGNoYW5nZXNcbiAgICAgICAgdGhpcy5wbGF5ZXIub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lQ2hhbmdlZCwgKCkgPT4gdGhpcy51cGRhdGVNYXJrZXJzKCkpO1xuICAgICAgICAvLyBVcGRhdGUgbWFya2VyIHBvc3Rpb24gd2hlbiBwYXVzZWQgYXMgdGltZXNoaWZ0IHJhbmdlIGNoYW5nZXNcbiAgICAgICAgdGhpcy5jb25maWd1cmVMaXZlUGF1c2VkVGltZXNoaWZ0VXBkYXRlcigoKSA9PiB0aGlzLnVwZGF0ZU1hcmtlcnMoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy51aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVNYXJrZXJzKCkpO1xuICAgIHRoaXMudWltYW5hZ2VyLm9uUmVsZWFzZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy51aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC51bnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZU1hcmtlcnMoKSkpO1xuXG4gICAgLy8gSW5pdCBtYXJrZXJzIGF0IHN0YXJ0dXBcbiAgICB0aGlzLnVwZGF0ZU1hcmtlcnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXJrZXJBdFBvc2l0aW9uKHBlcmNlbnRhZ2U6IG51bWJlcik6IFNlZWtCYXJNYXJrZXIgfCBudWxsIHtcbiAgICBjb25zdCBzbmFwcGluZ1JhbmdlID0gdGhpcy5jb25maWcuc25hcHBpbmdSYW5nZTtcblxuICAgIGNvbnN0IG1hdGNoaW5nTWFya2VyID0gdGhpcy50aW1lbGluZU1hcmtlcnMuZmluZChtYXJrZXIgPT4ge1xuICAgICAgY29uc3QgaGFzRHVyYXRpb24gPSBtYXJrZXIuZHVyYXRpb24gPiAwO1xuICAgICAgLy8gSGFuZGxlIGludGVydmFsIG1hcmtlcnNcbiAgICAgIGNvbnN0IGludGVydmFsTWFya2VyTWF0Y2ggPVxuICAgICAgICBoYXNEdXJhdGlvbiAmJlxuICAgICAgICBwZXJjZW50YWdlID49IG1hcmtlci5wb3NpdGlvbiAtIHNuYXBwaW5nUmFuZ2UgJiZcbiAgICAgICAgcGVyY2VudGFnZSA8PSBtYXJrZXIucG9zaXRpb24gKyBtYXJrZXIuZHVyYXRpb24gKyBzbmFwcGluZ1JhbmdlO1xuXG4gICAgICAvLyBIYW5kbGUgcG9zaXRpb24gbWFya2Vyc1xuICAgICAgY29uc3QgcG9zaXRpb25NYXJrZXJNYXRjaCA9XG4gICAgICAgIHBlcmNlbnRhZ2UgPj0gbWFya2VyLnBvc2l0aW9uIC0gc25hcHBpbmdSYW5nZSAmJlxuICAgICAgICBwZXJjZW50YWdlIDw9IG1hcmtlci5wb3NpdGlvbiArIHNuYXBwaW5nUmFuZ2U7XG5cbiAgICAgIHJldHVybiBpbnRlcnZhbE1hcmtlck1hdGNoIHx8IHBvc2l0aW9uTWFya2VyTWF0Y2g7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0Y2hpbmdNYXJrZXIgfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJNYXJrZXJzKCk6IHZvaWQge1xuICAgIHRoaXMudGltZWxpbmVNYXJrZXJzID0gW107XG4gICAgdGhpcy5tYXJrZXJzQ29udGFpbmVyLmVtcHR5KCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU1hcmtlckZyb21Db25maWcobWFya2VyOiBUaW1lbGluZU1hcmtlcik6IHZvaWQge1xuICAgIHRoaXMudWltYW5hZ2VyLmdldENvbmZpZygpLm1ldGFkYXRhLm1hcmtlcnMgPSB0aGlzLnVpbWFuYWdlci5nZXRDb25maWcoKS5tZXRhZGF0YS5tYXJrZXJzLmZpbHRlcihfbWFya2VyID0+IG1hcmtlciAhPT0gX21hcmtlcik7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlclJlbW92ZWRNYXJrZXJzKCk6IHZvaWQge1xuICAgIHRoaXMudGltZWxpbmVNYXJrZXJzID0gdGhpcy50aW1lbGluZU1hcmtlcnMuZmlsdGVyKHNlZWtiYXJNYXJrZXIgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdNYXJrZXIgPSB0aGlzLnVpbWFuYWdlci5nZXRDb25maWcoKS5tZXRhZGF0YS5tYXJrZXJzLmZpbmQoX21hcmtlciA9PiBzZWVrYmFyTWFya2VyLm1hcmtlciA9PT0gX21hcmtlcik7XG4gICAgICBpZiAoIW1hdGNoaW5nTWFya2VyKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTWFya2VyRnJvbURPTShzZWVrYmFyTWFya2VyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaGluZ01hcmtlcjtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWFya2VyRnJvbURPTShtYXJrZXI6IFNlZWtCYXJNYXJrZXIpOiB2b2lkIHtcbiAgICBpZiAobWFya2VyLmVsZW1lbnQpIHtcbiAgICAgIG1hcmtlci5lbGVtZW50LnJlbW92ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWFya2VycygpOiB2b2lkIHtcbiAgICBpZiAoIXNob3VsZFByb2Nlc3NNYXJrZXJzKHRoaXMucGxheWVyLCB0aGlzLnVpbWFuYWdlcikpIHtcbiAgICAgIHRoaXMuY2xlYXJNYXJrZXJzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJSZW1vdmVkTWFya2VycygpO1xuXG4gICAgdGhpcy51aW1hbmFnZXIuZ2V0Q29uZmlnKCkubWV0YWRhdGEubWFya2Vycy5mb3JFYWNoKG1hcmtlciA9PiB7XG4gICAgICBjb25zdCB7IG1hcmtlclBvc2l0aW9uLCBtYXJrZXJEdXJhdGlvbiB9ID0gZ2V0TWFya2VyUG9zaXRpb25zKHRoaXMucGxheWVyLCBtYXJrZXIpO1xuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlTWFya2VyKG1hcmtlclBvc2l0aW9uLCBtYXJrZXJEdXJhdGlvbikpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVNYXJrZXJGcm9tQ29uZmlnKG1hcmtlcik7XG4gICAgICB9IGVsc2UgaWYgKG1hcmtlclBvc2l0aW9uIDw9IDEwMCkge1xuICAgICAgICBjb25zdCBtYXRjaGluZ01hcmtlciA9IHRoaXMudGltZWxpbmVNYXJrZXJzLmZpbmQoc2Vla2Jhck1hcmtlciA9PiBzZWVrYmFyTWFya2VyLm1hcmtlciA9PT0gbWFya2VyKTtcblxuICAgICAgICBpZiAobWF0Y2hpbmdNYXJrZXIpIHtcbiAgICAgICAgICBtYXRjaGluZ01hcmtlci5wb3NpdGlvbiA9IG1hcmtlclBvc2l0aW9uO1xuICAgICAgICAgIG1hdGNoaW5nTWFya2VyLmR1cmF0aW9uID0gbWFya2VyRHVyYXRpb247XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZU1hcmtlckRPTShtYXRjaGluZ01hcmtlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmV3TWFya2VyOiBTZWVrQmFyTWFya2VyID0geyBtYXJrZXIsIHBvc2l0aW9uOiBtYXJrZXJQb3NpdGlvbiwgZHVyYXRpb246IG1hcmtlckR1cmF0aW9uIH07XG4gICAgICAgICAgdGhpcy50aW1lbGluZU1hcmtlcnMucHVzaChuZXdNYXJrZXIpO1xuXG4gICAgICAgICAgdGhpcy5jcmVhdGVNYXJrZXJET00obmV3TWFya2VyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXJrZXJDc3NQcm9wZXJ0aWVzKG1hcmtlcjogU2Vla0Jhck1hcmtlcik6IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHNlZWtCYXJXaWR0aFB4ID0gdGhpcy5nZXRTZWVrQmFyV2lkdGgoKTtcblxuICAgIGNvbnN0IHBvc2l0aW9uSW5QeCA9IChzZWVrQmFyV2lkdGhQeCAvIDEwMCkgKiAobWFya2VyLnBvc2l0aW9uIDwgMCA/IDAgOiBtYXJrZXIucG9zaXRpb24pO1xuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXM6IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAndHJhbnNmb3JtJzogYHRyYW5zbGF0ZVgoJHtwb3NpdGlvbkluUHh9cHgpYCxcbiAgICB9O1xuXG4gICAgaWYgKG1hcmtlci5kdXJhdGlvbiA+IDApIHtcbiAgICAgIGNvbnN0IG1hcmtlcldpZHRoUHggPSBNYXRoLnJvdW5kKHNlZWtCYXJXaWR0aFB4IC8gMTAwICogbWFya2VyLmR1cmF0aW9uKTtcbiAgICAgIGNzc1Byb3BlcnRpZXNbJ3dpZHRoJ10gPSBgJHttYXJrZXJXaWR0aFB4fXB4YDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3NzUHJvcGVydGllcztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWFya2VyRE9NKG1hcmtlcjogU2Vla0Jhck1hcmtlcik6IHZvaWQge1xuICAgIG1hcmtlci5lbGVtZW50LmNzcyh0aGlzLmdldE1hcmtlckNzc1Byb3BlcnRpZXMobWFya2VyKSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1hcmtlckRPTShtYXJrZXI6IFNlZWtCYXJNYXJrZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtYXJrZXJDbGFzc2VzID0gWydzZWVrYmFyLW1hcmtlciddLmNvbmNhdChtYXJrZXIubWFya2VyLmNzc0NsYXNzZXMgfHwgW10pXG4gICAgICAubWFwKGNzc0NsYXNzID0+IHRoaXMucHJlZml4Q3NzKGNzc0NsYXNzKSk7XG5cbiAgICBjb25zdCBtYXJrZXJFbGVtZW50ID0gbmV3IERPTSgnZGl2Jywge1xuICAgICAgJ2NsYXNzJzogbWFya2VyQ2xhc3Nlcy5qb2luKCcgJyksXG4gICAgICAnZGF0YS1tYXJrZXItdGltZSc6IFN0cmluZyhtYXJrZXIubWFya2VyLnRpbWUpLFxuICAgICAgJ2RhdGEtbWFya2VyLXRpdGxlJzogU3RyaW5nKG1hcmtlci5tYXJrZXIudGl0bGUpLFxuICAgIH0pLmNzcyh0aGlzLmdldE1hcmtlckNzc1Byb3BlcnRpZXMobWFya2VyKSk7XG5cbiAgICBpZiAobWFya2VyLm1hcmtlci5pbWFnZVVybCkge1xuICAgICAgY29uc3QgcmVtb3ZlSW1hZ2UgPSAoKSA9PiB7XG4gICAgICAgIGltYWdlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IG5ldyBET00oJ2ltZycsIHtcbiAgICAgICAgJ2NsYXNzJzogdGhpcy5wcmVmaXhDc3MoJ3NlZWtiYXItbWFya2VyLWltYWdlJyksXG4gICAgICAgICdzcmMnOiBtYXJrZXIubWFya2VyLmltYWdlVXJsLFxuICAgICAgfSkub24oJ2Vycm9yJywgcmVtb3ZlSW1hZ2UpO1xuXG4gICAgICBtYXJrZXJFbGVtZW50LmFwcGVuZChpbWFnZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIG1hcmtlci5lbGVtZW50ID0gbWFya2VyRWxlbWVudDtcbiAgICB0aGlzLm1hcmtlcnNDb250YWluZXIuYXBwZW5kKG1hcmtlckVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNYXJrZXJzRE9NKCk6IHZvaWQge1xuICAgIHRoaXMudGltZWxpbmVNYXJrZXJzLmZvckVhY2gobWFya2VyID0+IHtcbiAgICAgIGlmIChtYXJrZXIuZWxlbWVudCkge1xuICAgICAgICB0aGlzLnVwZGF0ZU1hcmtlckRPTShtYXJrZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jcmVhdGVNYXJrZXJET00obWFya2VyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlTGl2ZVBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIoXG4gICAgaGFuZGxlcjogKCkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgLy8gUmVndWxhcmx5IHVwZGF0ZSB0aGUgbWFya2VyIHBvc2l0aW9uIHdoaWxlIHRoZSB0aW1lb3V0IGlzIGFjdGl2ZVxuICAgIHRoaXMucGF1c2VkVGltZXNoaWZ0VXBkYXRlciA9IG5ldyBUaW1lb3V0KDEwMDAsIGhhbmRsZXIsIHRydWUpO1xuXG4gICAgdGhpcy5wbGF5ZXIub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QYXVzZWQsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBsYXllci5pc0xpdmUoKSAmJiB0aGlzLnBsYXllci5nZXRNYXhUaW1lU2hpZnQoKSA8IDApIHtcbiAgICAgICAgdGhpcy5wYXVzZWRUaW1lc2hpZnRVcGRhdGVyLnN0YXJ0KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTdG9wIHVwZGF0ZXIgd2hlbiBwbGF5YmFjayBjb250aW51ZXMgKG5vIG1hdHRlciBpZiB0aGUgdXBkYXRlciB3YXMgc3RhcnRlZCBiZWZvcmUpXG4gICAgdGhpcy5wbGF5ZXIub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCAoKSA9PiB0aGlzLnBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIuY2xlYXIoKSk7XG4gICAgdGhpcy5wbGF5ZXIub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5EZXN0cm95LCAoKSA9PiB0aGlzLnBhdXNlZFRpbWVzaGlmdFVwZGF0ZXIuY2xlYXIoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJlZml4Q3NzKGNzc0NsYXNzT3JJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuY3NzUHJlZml4ICsgJy0nICsgY3NzQ2xhc3NPcklkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1hcmtlclBvc2l0aW9ucyhwbGF5ZXI6IFBsYXllckFQSSwgbWFya2VyOiBUaW1lbGluZU1hcmtlcikge1xuICBjb25zdCBkdXJhdGlvbiA9IGdldER1cmF0aW9uKHBsYXllcik7XG5cbiAgY29uc3QgbWFya2VyUG9zaXRpb24gPSAxMDAgLyBkdXJhdGlvbiAqIGdldE1hcmtlclRpbWUobWFya2VyLCBwbGF5ZXIsIGR1cmF0aW9uKTsgLy8gY29udmVydCBhYnNvbHV0ZSB0aW1lIHRvIHBlcmNlbnRhZ2VcbiAgbGV0IG1hcmtlckR1cmF0aW9uID0gMTAwIC8gZHVyYXRpb24gKiBtYXJrZXIuZHVyYXRpb247XG5cbiAgaWYgKG1hcmtlclBvc2l0aW9uIDwgMCAmJiAhaXNOYU4obWFya2VyRHVyYXRpb24pKSB7XG4gICAgLy8gU2hyaW5rIG1hcmtlciBkdXJhdGlvbiBmb3Igb24gbGl2ZSBzdHJlYW1zIGFzIHRoZXkgcmVhY2ggZW5kXG4gICAgbWFya2VyRHVyYXRpb24gPSBtYXJrZXJEdXJhdGlvbiArIG1hcmtlclBvc2l0aW9uO1xuICB9XG5cbiAgaWYgKDEwMCAtIG1hcmtlclBvc2l0aW9uIDwgbWFya2VyRHVyYXRpb24pIHtcbiAgICAvLyBTaHJpbmsgbWFya2VyIGlmIGl0IG92ZXJmbG93cyB0aW1lbGluZVxuICAgIG1hcmtlckR1cmF0aW9uID0gMTAwIC0gbWFya2VyUG9zaXRpb247XG4gIH1cblxuICByZXR1cm4geyBtYXJrZXJEdXJhdGlvbiwgbWFya2VyUG9zaXRpb24gfTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFya2VyVGltZShtYXJrZXI6IFRpbWVsaW5lTWFya2VyLCBwbGF5ZXI6IFBsYXllckFQSSwgZHVyYXRpb246IG51bWJlcik6IG51bWJlciB7XG4gIGlmICghcGxheWVyLmlzTGl2ZSgpKSB7XG4gICAgcmV0dXJuIG1hcmtlci50aW1lO1xuICB9XG5cbiAgcmV0dXJuIGR1cmF0aW9uIC0gKFBsYXllclV0aWxzLmdldFNlZWthYmxlUmFuZ2VSZXNwZWN0aW5nTGl2ZShwbGF5ZXIpLmVuZCAtIG1hcmtlci50aW1lKTtcbn1cblxuZnVuY3Rpb24gZ2V0RHVyYXRpb24ocGxheWVyOiBQbGF5ZXJBUEkpOiBudW1iZXIge1xuICBpZiAoIXBsYXllci5pc0xpdmUoKSkge1xuICAgIHJldHVybiBwbGF5ZXIuZ2V0RHVyYXRpb24oKTtcbiAgfVxuICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IFBsYXllclV0aWxzLmdldFNlZWthYmxlUmFuZ2VSZXNwZWN0aW5nTGl2ZShwbGF5ZXIpO1xuXG4gIHJldHVybiBlbmQgLSBzdGFydDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlTWFya2VyKG1hcmtlclBvc2l0aW9uOiBudW1iZXIsIG1hcmtlckR1cmF0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChtYXJrZXJEdXJhdGlvbiA8IDAgfHwgaXNOYU4obWFya2VyRHVyYXRpb24pKSAmJiBtYXJrZXJQb3NpdGlvbiA8IDA7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByb2Nlc3NNYXJrZXJzKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogYm9vbGVhbiB7XG4gIC8vIERvbid0IGdlbmVyYXRlIHRpbWVsaW5lIG1hcmtlcnMgaWYgd2UgZG9uJ3QgeWV0IGhhdmUgYSBkdXJhdGlvblxuICAvLyBUaGUgZHVyYXRpb24gY2hlY2sgaXMgZm9yIGJ1Z2d5IHBsYXRmb3JtcyB3aGVyZSB0aGUgZHVyYXRpb24gaXMgbm90IGF2YWlsYWJsZSBpbnN0YW50bHkgKENocm9tZSBvbiBBbmRyb2lkIDQuMylcbiAgY29uc3QgdmFsaWRUb1Byb2Nlc3MgPSBwbGF5ZXIuZ2V0RHVyYXRpb24oKSAhPT0gSW5maW5pdHkgfHwgcGxheWVyLmlzTGl2ZSgpO1xuICBjb25zdCBoYXNNYXJrZXJzID0gdWltYW5hZ2VyLmdldENvbmZpZygpLm1ldGFkYXRhLm1hcmtlcnMubGVuZ3RoID4gMDtcblxuICByZXR1cm4gdmFsaWRUb1Byb2Nlc3MgJiYgaGFzTWFya2Vycztcbn1cbiIsImltcG9ydCB7Q29udGFpbmVyLCBDb250YWluZXJDb25maWd9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7VUlJbnN0YW5jZU1hbmFnZXJ9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQge01ldGFkYXRhTGFiZWwsIE1ldGFkYXRhTGFiZWxDb250ZW50fSBmcm9tICcuL21ldGFkYXRhbGFiZWwnO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgYSB7QGxpbmsgVGl0bGVCYXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpdGxlQmFyQ29uZmlnIGV4dGVuZHMgQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBpZiB0aGUgdGl0bGUgYmFyIHNob3VsZCBzdGF5IGhpZGRlbiB3aGVuIG5vIG1ldGFkYXRhIGxhYmVsIGNvbnRhaW5zIGFueSB0ZXh0LiBEb2VzIG5vdCBtYWtlIGEgbG90XG4gICAqIG9mIHNlbnNlIGlmIHRoZSB0aXRsZSBiYXIgY29udGFpbnMgb3RoZXIgY29tcG9uZW50cyB0aGFuIGp1c3QgTWV0YWRhdGFMYWJlbHMgKGxpa2UgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbikuXG4gICAqIERlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICBrZWVwSGlkZGVuV2l0aG91dE1ldGFkYXRhPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEaXNwbGF5cyBhIHRpdGxlIGJhciBjb250YWluaW5nIGEgbGFiZWwgd2l0aCB0aGUgdGl0bGUgb2YgdGhlIHZpZGVvLlxuICovXG5leHBvcnQgY2xhc3MgVGl0bGVCYXIgZXh0ZW5kcyBDb250YWluZXI8VGl0bGVCYXJDb25maWc+IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFRpdGxlQmFyQ29uZmlnID0ge30pIHtcbiAgICBzdXBlcihjb25maWcpO1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywge1xuICAgICAgY3NzQ2xhc3M6ICd1aS10aXRsZWJhcicsXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG5ldyBNZXRhZGF0YUxhYmVsKHsgY29udGVudDogTWV0YWRhdGFMYWJlbENvbnRlbnQuVGl0bGUgfSksXG4gICAgICAgIG5ldyBNZXRhZGF0YUxhYmVsKHsgY29udGVudDogTWV0YWRhdGFMYWJlbENvbnRlbnQuRGVzY3JpcHRpb24gfSksXG4gICAgICBdLFxuICAgICAga2VlcEhpZGRlbldpdGhvdXRNZXRhZGF0YTogZmFsc2UsXG4gICAgfSwgPFRpdGxlQmFyQ29uZmlnPnRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBsZXQgc2hvdWxkQmVTaG93biA9ICF0aGlzLmlzSGlkZGVuKCk7XG4gICAgbGV0IGhhc01ldGFkYXRhVGV4dCA9IHRydWU7IC8vIEZsYWcgdG8gdHJhY2sgaWYgYW55IG1ldGFkYXRhIGxhYmVsIGNvbnRhaW5zIHRleHRcblxuICAgIGxldCBjaGVja01ldGFkYXRhVGV4dEFuZFVwZGF0ZVZpc2liaWxpdHkgPSAoKSA9PiB7XG4gICAgICBoYXNNZXRhZGF0YVRleHQgPSBmYWxzZTtcblxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIG1ldGFkYXRhIGxhYmVscyBhbmQgY2hlY2sgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZW0gY29udGFpbnMgdGV4dFxuICAgICAgZm9yIChsZXQgY29tcG9uZW50IG9mIHRoaXMuZ2V0Q29tcG9uZW50cygpKSB7XG4gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNZXRhZGF0YUxhYmVsKSB7XG4gICAgICAgICAgaWYgKCFjb21wb25lbnQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICBoYXNNZXRhZGF0YVRleHQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzU2hvd24oKSkge1xuICAgICAgICAvLyBIaWRlIGEgdmlzaWJsZSB0aXRsZWJhciBpZiBpdCBkb2VzIG5vdCBjb250YWluIGFueSB0ZXh0IGFuZCB0aGUgaGlkZGVuIGZsYWcgaXMgc2V0XG4gICAgICAgIGlmIChjb25maWcua2VlcEhpZGRlbldpdGhvdXRNZXRhZGF0YSAmJiAhaGFzTWV0YWRhdGFUZXh0KSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2hvdWxkQmVTaG93bikge1xuICAgICAgICAvLyBTaG93IGEgaGlkZGVuIHRpdGxlYmFyIGlmIGl0IHNob3VsZCBhY3R1YWxseSBiZSBzaG93blxuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIHRvIHRleHQgY2hhbmdlIGV2ZW50cyB0byB1cGRhdGUgdGhlIGhhc01ldGFkYXRhVGV4dCBmbGFnIHdoZW4gdGhlIG1ldGFkYXRhIGR5bmFtaWNhbGx5IGNoYW5nZXNcbiAgICBmb3IgKGxldCBjb21wb25lbnQgb2YgdGhpcy5nZXRDb21wb25lbnRzKCkpIHtcbiAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNZXRhZGF0YUxhYmVsKSB7XG4gICAgICAgIGNvbXBvbmVudC5vblRleHRDaGFuZ2VkLnN1YnNjcmliZShjaGVja01ldGFkYXRhVGV4dEFuZFVwZGF0ZVZpc2liaWxpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzU2hvdy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgc2hvdWxkQmVTaG93biA9IHRydWU7XG4gICAgICBpZiAoIShjb25maWcua2VlcEhpZGRlbldpdGhvdXRNZXRhZGF0YSAmJiAhaGFzTWV0YWRhdGFUZXh0KSkge1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1aW1hbmFnZXIub25Db250cm9sc0hpZGUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHNob3VsZEJlU2hvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gaW5pdFxuICAgIGNoZWNrTWV0YWRhdGFUZXh0QW5kVXBkYXRlVmlzaWJpbGl0eSgpO1xuICB9XG59IiwiaW1wb3J0IHtCdXR0b24sIEJ1dHRvbkNvbmZpZ30gZnJvbSAnLi9idXR0b24nO1xuaW1wb3J0IHtOb0FyZ3MsIEV2ZW50RGlzcGF0Y2hlciwgRXZlbnR9IGZyb20gJy4uL2V2ZW50ZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBVSUluc3RhbmNlTWFuYWdlciB9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgTG9jYWxpemFibGVUZXh0IH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciBhIHRvZ2dsZSBidXR0b24gY29tcG9uZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvZ2dsZUJ1dHRvbkNvbmZpZyBleHRlbmRzIEJ1dHRvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgQ1NTIGNsYXNzIHRoYXQgbWFya3MgdGhlIG9uLXN0YXRlIG9mIHRoZSBidXR0b24uXG4gICAqL1xuICBvbkNsYXNzPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIENTUyBjbGFzcyB0aGF0IG1hcmtzIHRoZSBvZmYtc3RhdGUgb2YgdGhlIGJ1dHRvbi5cbiAgICovXG4gIG9mZkNsYXNzPzogc3RyaW5nO1xuICAvKipcbiAgICogV0NBRzIwIHN0YW5kYXJkIGZvciBkZWZpbmluZyBpbmZvIGFib3V0IHRoZSBjb21wb25lbnQgKHVzdWFsbHkgdGhlIG5hbWUpXG4gICAqXG4gICAqIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgb25BcmlhTGFiZWxgIGFuZCBgb2ZmQXJpYUxhYmVsYCBmb3IgdG9nZ2xlIGJ1dHRvbnNcbiAgICogYXMgdGhlIGNvbXBvbmVudCBjYW4gdGhlbiB1cGRhdGUgdGhlbSBhcyB0aGUgYnV0dG9uIGlzIHVzZWQuXG4gICAqXG4gICAqIElmIGJvdGggYGFyaWFMYWJlbGAgYW5kIGBvbkFyaWFMYWJlbGAgYXJlIHNldCwgYG9uQXJpYUxhYmVsYCBpcyB1c2VkLlxuICAgKi9cbiAgYXJpYUxhYmVsPzogTG9jYWxpemFibGVUZXh0O1xuICAvKipcbiAgICogVGhlIGFyaWEgbGFiZWwgdGhhdCBtYXJrcyB0aGUgb24tc3RhdGUgb2YgdGhlIGJ1dHRvbi5cbiAgICovXG4gIG9uQXJpYUxhYmVsPzogTG9jYWxpemFibGVUZXh0O1xuICAvKipcbiAgICogVGhlIGFyaWEgbGFiZWwgdGhhdCBtYXJrcyB0aGUgb2ZmLXN0YXRlIG9mIHRoZSBidXR0b24uXG4gICAqL1xuICBvZmZBcmlhTGFiZWw/OiBMb2NhbGl6YWJsZVRleHQ7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBhcyBzdHJpbmcgb3IgYXMgbG9jYWxpemUgY2FsbGJhY2sgb24gdGhlIGJ1dHRvbi5cbiAgICovXG4gIHRleHQ/OiBMb2NhbGl6YWJsZVRleHQ7XG59XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCBjYW4gYmUgdG9nZ2xlZCBiZXR3ZWVuICdvbicgYW5kICdvZmYnIHN0YXRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRvZ2dsZUJ1dHRvbjxDb25maWcgZXh0ZW5kcyBUb2dnbGVCdXR0b25Db25maWc+IGV4dGVuZHMgQnV0dG9uPENvbmZpZz4ge1xuXG4gIHByaXZhdGUgb25TdGF0ZTogYm9vbGVhbjtcblxuICBwcml2YXRlIHRvZ2dsZUJ1dHRvbkV2ZW50cyA9IHtcbiAgICBvblRvZ2dsZTogbmV3IEV2ZW50RGlzcGF0Y2hlcjxUb2dnbGVCdXR0b248Q29uZmlnPiwgTm9BcmdzPigpLFxuICAgIG9uVG9nZ2xlT246IG5ldyBFdmVudERpc3BhdGNoZXI8VG9nZ2xlQnV0dG9uPENvbmZpZz4sIE5vQXJncz4oKSxcbiAgICBvblRvZ2dsZU9mZjogbmV3IEV2ZW50RGlzcGF0Y2hlcjxUb2dnbGVCdXR0b248Q29uZmlnPiwgTm9BcmdzPigpLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIGNvbnN0IGRlZmF1bHRDb25maWc6IFRvZ2dsZUJ1dHRvbkNvbmZpZyA9IHtcbiAgICAgIGNzc0NsYXNzOiAndWktdG9nZ2xlYnV0dG9uJyxcbiAgICAgIG9uQ2xhc3M6ICdvbicsXG4gICAgICBvZmZDbGFzczogJ29mZicsXG4gICAgfTtcblxuICAgIGlmIChjb25maWcub25BcmlhTGFiZWwpIHtcbiAgICAgIGNvbmZpZy5hcmlhTGFiZWwgPSBjb25maWcub25BcmlhTGFiZWw7XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywgZGVmYXVsdENvbmZpZyBhcyBDb25maWcsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhjb25maWcub2ZmQ2xhc3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBidXR0b24gdG8gdGhlICdvbicgc3RhdGUuXG4gICAqL1xuICBvbigpIHtcbiAgICBpZiAodGhpcy5pc09mZigpKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuXG4gICAgICB0aGlzLm9uU3RhdGUgPSB0cnVlO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoY29uZmlnLm9mZkNsYXNzKSk7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhjb25maWcub25DbGFzcykpO1xuXG4gICAgICB0aGlzLm9uVG9nZ2xlRXZlbnQoKTtcbiAgICAgIHRoaXMub25Ub2dnbGVPbkV2ZW50KCk7XG5cbiAgICAgIHRoaXMuc2V0QXJpYUF0dHIoJ3ByZXNzZWQnLCAndHJ1ZScpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcub25BcmlhTGFiZWwpIHtcbiAgICAgICAgdGhpcy5zZXRBcmlhTGFiZWwodGhpcy5jb25maWcub25BcmlhTGFiZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBidXR0b24gdG8gdGhlICdvZmYnIHN0YXRlLlxuICAgKi9cbiAgb2ZmKCkge1xuICAgIGlmICh0aGlzLmlzT24oKSkge1xuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgICAgdGhpcy5vblN0YXRlID0gZmFsc2U7XG4gICAgICB0aGlzLmdldERvbUVsZW1lbnQoKS5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhjb25maWcub25DbGFzcykpO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoY29uZmlnLm9mZkNsYXNzKSk7XG5cbiAgICAgIHRoaXMub25Ub2dnbGVFdmVudCgpO1xuICAgICAgdGhpcy5vblRvZ2dsZU9mZkV2ZW50KCk7XG5cbiAgICAgIHRoaXMuc2V0QXJpYUF0dHIoJ3ByZXNzZWQnLCAnZmFsc2UnKTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLm9mZkFyaWFMYWJlbCkge1xuICAgICAgICB0aGlzLnNldEFyaWFMYWJlbCh0aGlzLmNvbmZpZy5vZmZBcmlhTGFiZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgdGhlIGJ1dHRvbiAnb24nIGlmIGl0IGlzICdvZmYnLCBvciAnb2ZmJyBpZiBpdCBpcyAnb24nLlxuICAgKi9cbiAgdG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLmlzT24oKSkge1xuICAgICAgdGhpcy5vZmYoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHRvZ2dsZSBidXR0b24gaXMgaW4gdGhlICdvbicgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGJ1dHRvbiBpcyAnb24nLCBmYWxzZSBpZiAnb2ZmJ1xuICAgKi9cbiAgaXNPbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vblN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdG9nZ2xlIGJ1dHRvbiBpcyBpbiB0aGUgJ29mZicgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGJ1dHRvbiBpcyAnb2ZmJywgZmFsc2UgaWYgJ29uJ1xuICAgKi9cbiAgaXNPZmYoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzT24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNsaWNrRXZlbnQoKSB7XG4gICAgc3VwZXIub25DbGlja0V2ZW50KCk7XG5cbiAgICAvLyBGaXJlIHRoZSB0b2dnbGUgZXZlbnQgdG9nZXRoZXIgd2l0aCB0aGUgY2xpY2sgZXZlbnRcbiAgICAvLyAodGhleSBhcmUgdGVjaG5pY2FsbHkgdGhlIHNhbWUsIG9ubHkgdGhlIHNlbWFudGljcyBhcmUgZGlmZmVyZW50KVxuICAgIHRoaXMub25Ub2dnbGVFdmVudCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlRXZlbnQoKSB7XG4gICAgdGhpcy50b2dnbGVCdXR0b25FdmVudHMub25Ub2dnbGUuZGlzcGF0Y2godGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Ub2dnbGVPbkV2ZW50KCkge1xuICAgIHRoaXMudG9nZ2xlQnV0dG9uRXZlbnRzLm9uVG9nZ2xlT24uZGlzcGF0Y2godGhpcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Ub2dnbGVPZmZFdmVudCgpIHtcbiAgICB0aGlzLnRvZ2dsZUJ1dHRvbkV2ZW50cy5vblRvZ2dsZU9mZi5kaXNwYXRjaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIGJ1dHRvbiBpcyB0b2dnbGVkLlxuICAgKiBAcmV0dXJucyB7RXZlbnQ8VG9nZ2xlQnV0dG9uPENvbmZpZz4sIE5vQXJncz59XG4gICAqL1xuICBnZXQgb25Ub2dnbGUoKTogRXZlbnQ8VG9nZ2xlQnV0dG9uPENvbmZpZz4sIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZUJ1dHRvbkV2ZW50cy5vblRvZ2dsZS5nZXRFdmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHRvZ2dsZWQgJ29uJy5cbiAgICogQHJldHVybnMge0V2ZW50PFRvZ2dsZUJ1dHRvbjxDb25maWc+LCBOb0FyZ3M+fVxuICAgKi9cbiAgZ2V0IG9uVG9nZ2xlT24oKTogRXZlbnQ8VG9nZ2xlQnV0dG9uPENvbmZpZz4sIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZUJ1dHRvbkV2ZW50cy5vblRvZ2dsZU9uLmdldEV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZXZlbnQgdGhhdCBpcyBmaXJlZCB3aGVuIHRoZSBidXR0b24gaXMgdG9nZ2xlZCAnb2ZmJy5cbiAgICogQHJldHVybnMge0V2ZW50PFRvZ2dsZUJ1dHRvbjxDb25maWc+LCBOb0FyZ3M+fVxuICAgKi9cbiAgZ2V0IG9uVG9nZ2xlT2ZmKCk6IEV2ZW50PFRvZ2dsZUJ1dHRvbjxDb25maWc+LCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGVCdXR0b25FdmVudHMub25Ub2dnbGVPZmYuZ2V0RXZlbnQoKTtcbiAgfVxufSIsImltcG9ydCB7Q29tcG9uZW50LCBDb21wb25lbnRDb25maWd9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7RE9NfSBmcm9tICcuLi9kb20nO1xuXG4vKipcbiAqIEFuaW1hdGVkIGFuYWxvZyBUViBzdGF0aWMgbm9pc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBUdk5vaXNlQ2FudmFzIGV4dGVuZHMgQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4ge1xuXG4gIHByaXZhdGUgY2FudmFzOiBET007XG5cbiAgcHJpdmF0ZSBjYW52YXNFbGVtZW50OiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHJpdmF0ZSBjYW52YXNDb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByaXZhdGUgY2FudmFzV2lkdGggPSAxNjA7XG4gIHByaXZhdGUgY2FudmFzSGVpZ2h0ID0gOTA7XG4gIHByaXZhdGUgaW50ZXJmZXJlbmNlSGVpZ2h0ID0gNTA7XG4gIHByaXZhdGUgbGFzdEZyYW1lVXBkYXRlOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIGZyYW1lSW50ZXJ2YWw6IG51bWJlciA9IDYwO1xuICBwcml2YXRlIHVzZUFuaW1hdGlvbkZyYW1lOiBib29sZWFuID0gISF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuICBwcml2YXRlIG5vaXNlQW5pbWF0aW9uV2luZG93UG9zOiBudW1iZXI7XG4gIHByaXZhdGUgZnJhbWVVcGRhdGVIYW5kbGVySWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbXBvbmVudENvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktdHZub2lzZWNhbnZhcycsXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvRG9tRWxlbWVudCgpOiBET00ge1xuICAgIHJldHVybiB0aGlzLmNhbnZhcyA9IG5ldyBET00oJ2NhbnZhcycsIHsgJ2NsYXNzJzogdGhpcy5nZXRDc3NDbGFzc2VzKCkgfSk7XG4gIH1cblxuICBzdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbnZhc0VsZW1lbnQgPSA8SFRNTENhbnZhc0VsZW1lbnQ+dGhpcy5jYW52YXMuZ2V0KDApO1xuICAgIHRoaXMuY2FudmFzQ29udGV4dCA9IHRoaXMuY2FudmFzRWxlbWVudC5nZXRDb250ZXh0KCcyZCcpO1xuICAgIHRoaXMubm9pc2VBbmltYXRpb25XaW5kb3dQb3MgPSAtdGhpcy5jYW52YXNIZWlnaHQ7XG4gICAgdGhpcy5sYXN0RnJhbWVVcGRhdGUgPSAwO1xuXG4gICAgdGhpcy5jYW52YXNFbGVtZW50LndpZHRoID0gdGhpcy5jYW52YXNXaWR0aDtcbiAgICB0aGlzLmNhbnZhc0VsZW1lbnQuaGVpZ2h0ID0gdGhpcy5jYW52YXNIZWlnaHQ7XG5cbiAgICB0aGlzLnJlbmRlckZyYW1lKCk7XG4gIH1cblxuICBzdG9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVzZUFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lVXBkYXRlSGFuZGxlcklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZnJhbWVVcGRhdGVIYW5kbGVySWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRnJhbWUoKTogdm9pZCB7XG4gICAgLy8gVGhpcyBjb2RlIGhhcyBiZWVuIGNvcGllZCBmcm9tIHRoZSBwbGF5ZXIgY29udHJvbHMuanMgYW5kIHNpbXBsaWZpZWRcblxuICAgIGlmICh0aGlzLmxhc3RGcmFtZVVwZGF0ZSArIHRoaXMuZnJhbWVJbnRlcnZhbCA+IG5ldyBEYXRlKCkuZ2V0VGltZSgpKSB7XG4gICAgICAvLyBJdCdzIHRvbyBlYXJseSB0byByZW5kZXIgdGhlIG5leHQgZnJhbWVcbiAgICAgIHRoaXMuc2NoZWR1bGVOZXh0UmVuZGVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRQaXhlbE9mZnNldDtcbiAgICBsZXQgY2FudmFzV2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoO1xuICAgIGxldCBjYW52YXNIZWlnaHQgPSB0aGlzLmNhbnZhc0hlaWdodDtcblxuICAgIC8vIENyZWF0ZSB0ZXh0dXJlXG4gICAgbGV0IG5vaXNlSW1hZ2UgPSB0aGlzLmNhbnZhc0NvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKGNhbnZhc1dpZHRoLCBjYW52YXNIZWlnaHQpO1xuXG4gICAgLy8gRmlsbCB0ZXh0dXJlIHdpdGggbm9pc2VcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGNhbnZhc0hlaWdodDsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNhbnZhc1dpZHRoOyB4KyspIHtcbiAgICAgICAgY3VycmVudFBpeGVsT2Zmc2V0ID0gKGNhbnZhc1dpZHRoICogeSAqIDQpICsgeCAqIDQ7XG4gICAgICAgIG5vaXNlSW1hZ2UuZGF0YVtjdXJyZW50UGl4ZWxPZmZzZXRdID0gTWF0aC5yYW5kb20oKSAqIDI1NTtcbiAgICAgICAgaWYgKHkgPCB0aGlzLm5vaXNlQW5pbWF0aW9uV2luZG93UG9zIHx8IHkgPiB0aGlzLm5vaXNlQW5pbWF0aW9uV2luZG93UG9zICsgdGhpcy5pbnRlcmZlcmVuY2VIZWlnaHQpIHtcbiAgICAgICAgICBub2lzZUltYWdlLmRhdGFbY3VycmVudFBpeGVsT2Zmc2V0XSAqPSAwLjg1O1xuICAgICAgICB9XG4gICAgICAgIG5vaXNlSW1hZ2UuZGF0YVtjdXJyZW50UGl4ZWxPZmZzZXQgKyAxXSA9IG5vaXNlSW1hZ2UuZGF0YVtjdXJyZW50UGl4ZWxPZmZzZXRdO1xuICAgICAgICBub2lzZUltYWdlLmRhdGFbY3VycmVudFBpeGVsT2Zmc2V0ICsgMl0gPSBub2lzZUltYWdlLmRhdGFbY3VycmVudFBpeGVsT2Zmc2V0XTtcbiAgICAgICAgbm9pc2VJbWFnZS5kYXRhW2N1cnJlbnRQaXhlbE9mZnNldCArIDNdID0gNTA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHV0IHRleHR1cmUgb250byBjYW52YXNcbiAgICB0aGlzLmNhbnZhc0NvbnRleHQucHV0SW1hZ2VEYXRhKG5vaXNlSW1hZ2UsIDAsIDApO1xuXG4gICAgdGhpcy5sYXN0RnJhbWVVcGRhdGUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB0aGlzLm5vaXNlQW5pbWF0aW9uV2luZG93UG9zICs9IDc7XG4gICAgaWYgKHRoaXMubm9pc2VBbmltYXRpb25XaW5kb3dQb3MgPiBjYW52YXNIZWlnaHQpIHtcbiAgICAgIHRoaXMubm9pc2VBbmltYXRpb25XaW5kb3dQb3MgPSAtY2FudmFzSGVpZ2h0O1xuICAgIH1cblxuICAgIHRoaXMuc2NoZWR1bGVOZXh0UmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlTmV4dFJlbmRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy51c2VBbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy5mcmFtZVVwZGF0ZUhhbmRsZXJJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXJGcmFtZS5iaW5kKHRoaXMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mcmFtZVVwZGF0ZUhhbmRsZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmVuZGVyRnJhbWUuYmluZCh0aGlzKSwgdGhpcy5mcmFtZUludGVydmFsKTtcbiAgICB9XG4gIH1cbn0iLCJpbXBvcnQge0NvbnRhaW5lckNvbmZpZywgQ29udGFpbmVyfSBmcm9tICcuL2NvbnRhaW5lcic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHtET019IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQge1RpbWVvdXR9IGZyb20gJy4uL3RpbWVvdXQnO1xuaW1wb3J0IHtQbGF5ZXJVdGlsc30gZnJvbSAnLi4vcGxheWVydXRpbHMnO1xuaW1wb3J0IHsgQ2FuY2VsRXZlbnRBcmdzLCBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuLi9ldmVudGRpc3BhdGNoZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJLCBQbGF5ZXJSZXNpemVkRXZlbnQgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgYSB7QGxpbmsgVUlDb250YWluZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVJQ29udGFpbmVyQ29uZmlnIGV4dGVuZHMgQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIGNvbnRyb2wgYmFyIHdpbGwgYmUgaGlkZGVuIHdoZW4gdGhlcmUgaXMgbm8gdXNlciBpbnRlcmFjdGlvbi5cbiAgICogU2V0IHRvIC0xIGZvciB0aGUgVUkgdG8gYmUgYWx3YXlzIHNob3duLlxuICAgKiBEZWZhdWx0OiA1IHNlY29uZHMgKDUwMDApXG4gICAqL1xuICBoaWRlRGVsYXk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBwbGF5ZXIgc3RhdGVzIGluIHdoaWNoIHRoZSBVSSB3aWxsIG5vdCBiZSBoaWRkZW4sIG5vIG1hdHRlciB3aGF0IHRoZSB7QGxpbmsgaGlkZURlbGF5fSBpcy5cbiAgICovXG4gIGhpZGVQbGF5ZXJTdGF0ZUV4Y2VwdGlvbnM/OiBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZVtdO1xuICAvKipcbiAgICogVGhlIEhUTUwgZWxlbWVudCBvbiB3aGljaCB1c2VyIGludGVyYWN0aW9uIGV2ZW50cyAoZS5nLiBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzKSB3aWxsIGJlIHRyYWNrZWQgdG8gZGV0ZWN0XG4gICAqIGludGVyYWN0aW9uIHdpdGggdGhlIFVJLiBUaGVzZSBiYXNpY2FsbHkgdHJpZ2dlciBzaG93aW5nIGFuZCBoaWRpbmcgb2YgdGhlIFVJLlxuICAgKiBEZWZhdWx0OiB0aGUgVUkgY29udGFpbmVyIGl0c2VsZlxuICAgKi9cbiAgdXNlckludGVyYWN0aW9uRXZlbnRTb3VyY2U/OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBjb250YWluZXIgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIFVJLiBUaGUgVUlDb250YWluZXIgaXMgcGFzc2VkIHRvIHRoZSB7QGxpbmsgVUlNYW5hZ2VyfSB0byBidWlsZCBhbmRcbiAqIHNldHVwIHRoZSBVSS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVJQ29udGFpbmVyIGV4dGVuZHMgQ29udGFpbmVyPFVJQ29udGFpbmVyQ29uZmlnPiB7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1RBVEVfUFJFRklYID0gJ3BsYXllci1zdGF0ZS0nO1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZVTExTQ1JFRU4gPSAnZnVsbHNjcmVlbic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEJVRkZFUklORyA9ICdidWZmZXJpbmcnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSRU1PVEVfQ09OVFJPTCA9ICdyZW1vdGUtY29udHJvbCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENPTlRST0xTX1NIT1dOID0gJ2NvbnRyb2xzLXNob3duJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09OVFJPTFNfSElEREVOID0gJ2NvbnRyb2xzLWhpZGRlbic7XG5cbiAgcHJpdmF0ZSB1aUhpZGVUaW1lb3V0OiBUaW1lb3V0O1xuICBwcml2YXRlIHBsYXllclN0YXRlQ2hhbmdlOiBFdmVudERpc3BhdGNoZXI8VUlDb250YWluZXIsIFBsYXllclV0aWxzLlBsYXllclN0YXRlPjtcblxuICBwcml2YXRlIHVzZXJJbnRlcmFjdGlvbkV2ZW50U291cmNlOiBET007XG4gIHByaXZhdGUgdXNlckludGVyYWN0aW9uRXZlbnRzOiB7IG5hbWU6IHN0cmluZywgaGFuZGxlcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCB9W107XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBVSUNvbnRhaW5lckNvbmZpZykge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCA8VUlDb250YWluZXJDb25maWc+e1xuICAgICAgY3NzQ2xhc3M6ICd1aS11aWNvbnRhaW5lcicsXG4gICAgICByb2xlOiAncmVnaW9uJyxcbiAgICAgIGFyaWFMYWJlbDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3BsYXllcicpLFxuICAgICAgaGlkZURlbGF5OiA1MDAwLFxuICAgIH0sIHRoaXMuY29uZmlnKTtcblxuICAgIHRoaXMucGxheWVyU3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnREaXNwYXRjaGVyPFVJQ29udGFpbmVyLCBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZT4oKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG5cbiAgICBpZiAoY29uZmlnLnVzZXJJbnRlcmFjdGlvbkV2ZW50U291cmNlKSB7XG4gICAgICB0aGlzLnVzZXJJbnRlcmFjdGlvbkV2ZW50U291cmNlID0gbmV3IERPTShjb25maWcudXNlckludGVyYWN0aW9uRXZlbnRTb3VyY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVzZXJJbnRlcmFjdGlvbkV2ZW50U291cmNlID0gdGhpcy5nZXREb21FbGVtZW50KCk7XG4gICAgfVxuXG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIHRoaXMuY29uZmlndXJlVUlTaG93SGlkZShwbGF5ZXIsIHVpbWFuYWdlcik7XG4gICAgdGhpcy5jb25maWd1cmVQbGF5ZXJTdGF0ZXMocGxheWVyLCB1aW1hbmFnZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmVVSVNob3dIaWRlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgbGV0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG5cbiAgICBpZiAoY29uZmlnLmhpZGVEZWxheSA9PT0gLTEpIHtcbiAgICAgIHVpbWFuYWdlci5vbkNvbmZpZ3VyZWQuc3Vic2NyaWJlKCgpID0+IHVpbWFuYWdlci5vbkNvbnRyb2xzU2hvdy5kaXNwYXRjaCh0aGlzKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGlzVWlTaG93biA9IGZhbHNlO1xuICAgIGxldCBpc1NlZWtpbmcgPSBmYWxzZTtcbiAgICBsZXQgaXNGaXJzdFRvdWNoID0gdHJ1ZTtcbiAgICBsZXQgcGxheWVyU3RhdGU6IFBsYXllclV0aWxzLlBsYXllclN0YXRlO1xuXG4gICAgY29uc3QgaGlkaW5nUHJldmVudGVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgcmV0dXJuIGNvbmZpZy5oaWRlUGxheWVyU3RhdGVFeGNlcHRpb25zICYmIGNvbmZpZy5oaWRlUGxheWVyU3RhdGVFeGNlcHRpb25zLmluZGV4T2YocGxheWVyU3RhdGUpID4gLTE7XG4gICAgfTtcblxuICAgIGxldCBzaG93VWkgPSAoKSA9PiB7XG4gICAgICBpZiAoIWlzVWlTaG93bikge1xuICAgICAgICAvLyBMZXQgc3Vic2NyaWJlcnMga25vdyB0aGF0IHRoZXkgc2hvdWxkIHJldmVhbCB0aGVtc2VsdmVzXG4gICAgICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzU2hvdy5kaXNwYXRjaCh0aGlzKTtcbiAgICAgICAgaXNVaVNob3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IHRyaWdnZXIgdGltZW91dCB3aGlsZSBzZWVraW5nIChpdCB3aWxsIGJlIHRyaWdnZXJlZCBvbmNlIHRoZSBzZWVrIGlzIGZpbmlzaGVkKSBvciBjYXN0aW5nXG4gICAgICBpZiAoIWlzU2Vla2luZyAmJiAhcGxheWVyLmlzQ2FzdGluZygpICYmICFoaWRpbmdQcmV2ZW50ZWQoKSkge1xuICAgICAgICB0aGlzLnVpSGlkZVRpbWVvdXQuc3RhcnQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IGhpZGVVaSA9ICgpID0+IHtcbiAgICAgIC8vIEhpZGUgdGhlIFVJIG9ubHkgaWYgaXQgaXMgc2hvd24sIGFuZCBpZiBub3QgY2FzdGluZ1xuICAgICAgaWYgKGlzVWlTaG93biAmJiAhcGxheWVyLmlzQ2FzdGluZygpKSB7XG4gICAgICAgIC8vIElzc3VlIGEgcHJldmlldyBldmVudCB0byBjaGVjayBpZiB3ZSBhcmUgZ29vZCB0byBoaWRlIHRoZSBjb250cm9sc1xuICAgICAgICBsZXQgcHJldmlld0hpZGVFdmVudEFyZ3MgPSA8Q2FuY2VsRXZlbnRBcmdzPnt9O1xuICAgICAgICB1aW1hbmFnZXIub25QcmV2aWV3Q29udHJvbHNIaWRlLmRpc3BhdGNoKHRoaXMsIHByZXZpZXdIaWRlRXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoIXByZXZpZXdIaWRlRXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgIC8vIElmIHRoZSBwcmV2aWV3IHdhc24ndCBjYW5jZWxlZCwgbGV0IHN1YnNjcmliZXJzIGtub3cgdGhhdCB0aGV5IHNob3VsZCBub3cgaGlkZSB0aGVtc2VsdmVzXG4gICAgICAgICAgdWltYW5hZ2VyLm9uQ29udHJvbHNIaWRlLmRpc3BhdGNoKHRoaXMpO1xuICAgICAgICAgIGlzVWlTaG93biA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIHRoZSBoaWRlIHByZXZpZXcgd2FzIGNhbmNlbGVkLCBjb250aW51ZSB0byBzaG93IFVJXG4gICAgICAgICAgc2hvd1VpKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVGltZW91dCB0byBkZWZlciBVSSBoaWRpbmcgYnkgdGhlIGNvbmZpZ3VyZWQgZGVsYXkgdGltZVxuICAgIHRoaXMudWlIaWRlVGltZW91dCA9IG5ldyBUaW1lb3V0KGNvbmZpZy5oaWRlRGVsYXksIGhpZGVVaSk7XG5cbiAgICB0aGlzLnVzZXJJbnRlcmFjdGlvbkV2ZW50cyA9IFt7XG4gICAgICAvLyBPbiB0b3VjaCBkaXNwbGF5cywgdGhlIGZpcnN0IHRvdWNoIHJldmVhbHMgdGhlIFVJXG4gICAgICBuYW1lOiAndG91Y2hlbmQnLFxuICAgICAgaGFuZGxlcjogKGUpID0+IHtcbiAgICAgICAgaWYgKCFpc1VpU2hvd24pIHtcbiAgICAgICAgICAvLyBPbmx5IGlmIHRoZSBVSSBpcyBoaWRkZW4sIHdlIHByZXZlbnQgb3RoZXIgYWN0aW9ucyAoZXhjZXB0IGZvciB0aGUgZmlyc3QgdG91Y2gpIGFuZCByZXZlYWwgdGhlIFVJXG4gICAgICAgICAgLy8gaW5zdGVhZC4gVGhlIGZpcnN0IHRvdWNoIGlzIG5vdCBwcmV2ZW50ZWQgdG8gbGV0IG90aGVyIGxpc3RlbmVycyByZWNlaXZlIHRoZSBldmVudCBhbmQgdHJpZ2dlciBhblxuICAgICAgICAgIC8vIGluaXRpYWwgYWN0aW9uLCBlLmcuIHRoZSBodWdlIHBsYXliYWNrIGJ1dHRvbiBjYW4gZGlyZWN0bHkgc3RhcnQgcGxheWJhY2sgaW5zdGVhZCBvZiByZXF1aXJpbmcgYSBkb3VibGVcbiAgICAgICAgICAvLyB0YXAgd2hpY2ggMS4gcmV2ZWFscyB0aGUgVUkgYW5kIDIuIHN0YXJ0cyBwbGF5YmFjay5cbiAgICAgICAgICBpZiAoaXNGaXJzdFRvdWNoICYmICFwbGF5ZXIuaXNQbGF5aW5nKCkpIHtcbiAgICAgICAgICAgIGlzRmlyc3RUb3VjaCA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNob3dVaSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sIHtcbiAgICAgIC8vIFdoZW4gdGhlIG1vdXNlIGVudGVycywgd2Ugc2hvdyB0aGUgVUlcbiAgICAgIG5hbWU6ICdtb3VzZWVudGVyJyxcbiAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgc2hvd1VpKCk7XG4gICAgICB9LFxuICAgIH0sIHtcbiAgICAgIC8vIFdoZW4gdGhlIG1vdXNlIG1vdmVzIHdpdGhpbiwgd2Ugc2hvdyB0aGUgVUlcbiAgICAgIG5hbWU6ICdtb3VzZW1vdmUnLFxuICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICBzaG93VWkoKTtcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgbmFtZTogJ2ZvY3VzaW4nLFxuICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICBzaG93VWkoKTtcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgbmFtZTogJ2tleWRvd24nLFxuICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICBzaG93VWkoKTtcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgLy8gV2hlbiB0aGUgbW91c2UgbGVhdmVzLCB3ZSBjYW4gcHJlcGFyZSB0byBoaWRlIHRoZSBVSSwgZXhjZXB0IGEgc2VlayBpcyBnb2luZyBvblxuICAgICAgbmFtZTogJ21vdXNlbGVhdmUnLFxuICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAvLyBXaGVuIGEgc2VlayBpcyBnb2luZyBvbiwgdGhlIHNlZWsgc2NydWIgcG9pbnRlciBtYXkgZXhpdCB0aGUgVUkgYXJlYSB3aGlsZSBzdGlsbCBzZWVraW5nLCBhbmQgd2UgZG8gbm90XG4gICAgICAgIC8vIGhpZGUgdGhlIFVJIGluIHN1Y2ggY2FzZXNcbiAgICAgICAgaWYgKCFpc1NlZWtpbmcgJiYgIWhpZGluZ1ByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgdGhpcy51aUhpZGVUaW1lb3V0LnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfV07XG5cbiAgICB0aGlzLnVzZXJJbnRlcmFjdGlvbkV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4gdGhpcy51c2VySW50ZXJhY3Rpb25FdmVudFNvdXJjZS5vbihldmVudC5uYW1lLCBldmVudC5oYW5kbGVyKSk7XG5cbiAgICB1aW1hbmFnZXIub25TZWVrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnVpSGlkZVRpbWVvdXQuY2xlYXIoKTsgLy8gRG9uJ3QgaGlkZSBVSSB3aGlsZSBhIHNlZWsgaXMgaW4gcHJvZ3Jlc3NcbiAgICAgIGlzU2Vla2luZyA9IHRydWU7XG4gICAgfSk7XG4gICAgdWltYW5hZ2VyLm9uU2Vla2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpc1NlZWtpbmcgPSBmYWxzZTtcbiAgICAgIGlmICghaGlkaW5nUHJldmVudGVkKCkpIHtcbiAgICAgICAgdGhpcy51aUhpZGVUaW1lb3V0LnN0YXJ0KCk7IC8vIFJlLWVuYWJsZSBVSSBoaWRlIHRpbWVvdXQgYWZ0ZXIgYSBzZWVrXG4gICAgICB9XG4gICAgfSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RTdGFydGVkLCAoKSA9PiB7XG4gICAgICBzaG93VWkoKTsgLy8gU2hvdyBVSSB3aGVuIGEgQ2FzdCBzZXNzaW9uIGhhcyBzdGFydGVkIChVSSB3aWxsIHRoZW4gc3RheSBwZXJtYW5lbnRseSBvbiBkdXJpbmcgdGhlIHNlc3Npb24pXG4gICAgfSk7XG4gICAgdGhpcy5wbGF5ZXJTdGF0ZUNoYW5nZS5zdWJzY3JpYmUoKF8sIHN0YXRlKSA9PiB7XG4gICAgICBwbGF5ZXJTdGF0ZSA9IHN0YXRlO1xuICAgICAgaWYgKGhpZGluZ1ByZXZlbnRlZCgpKSB7XG4gICAgICAgIC8vIEVudGVyaW5nIGEgcGxheWVyIHN0YXRlIHRoYXQgcHJldmVudHMgaGlkaW5nIGFuZCBmb3JjZXMgdGhlIGNvbnRyb2xzIHRvIGJlIHNob3duXG4gICAgICAgIHRoaXMudWlIaWRlVGltZW91dC5jbGVhcigpO1xuICAgICAgICBzaG93VWkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEVudGVyaW5nIGEgcGxheWVyIHN0YXRlIHRoYXQgYWxsb3dzIGhpZGluZ1xuICAgICAgICB0aGlzLnVpSGlkZVRpbWVvdXQuc3RhcnQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlUGxheWVyU3RhdGVzKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgbGV0IGNvbnRhaW5lciA9IHRoaXMuZ2V0RG9tRWxlbWVudCgpO1xuXG4gICAgLy8gQ29udmVydCBwbGF5ZXIgc3RhdGVzIGludG8gQ1NTIGNsYXNzIG5hbWVzXG4gICAgbGV0IHN0YXRlQ2xhc3NOYW1lcyA9IDxhbnk+W107XG4gICAgZm9yIChsZXQgc3RhdGUgaW4gUGxheWVyVXRpbHMuUGxheWVyU3RhdGUpIHtcbiAgICAgIGlmIChpc05hTihOdW1iZXIoc3RhdGUpKSkge1xuICAgICAgICBsZXQgZW51bU5hbWUgPSBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZVs8YW55PlBsYXllclV0aWxzLlBsYXllclN0YXRlW3N0YXRlXV07XG4gICAgICAgIHN0YXRlQ2xhc3NOYW1lc1tQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZVtzdGF0ZV1dID1cbiAgICAgICAgICB0aGlzLnByZWZpeENzcyhVSUNvbnRhaW5lci5TVEFURV9QUkVGSVggKyBlbnVtTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVtb3ZlU3RhdGVzID0gKCkgPT4ge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKHN0YXRlQ2xhc3NOYW1lc1tQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5JZGxlXSk7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3Moc3RhdGVDbGFzc05hbWVzW1BsYXllclV0aWxzLlBsYXllclN0YXRlLlByZXBhcmVkXSk7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3Moc3RhdGVDbGFzc05hbWVzW1BsYXllclV0aWxzLlBsYXllclN0YXRlLlBsYXlpbmddKTtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcyhzdGF0ZUNsYXNzTmFtZXNbUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUGF1c2VkXSk7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3Moc3RhdGVDbGFzc05hbWVzW1BsYXllclV0aWxzLlBsYXllclN0YXRlLkZpbmlzaGVkXSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZVN0YXRlID0gKHN0YXRlOiBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZSkgPT4ge1xuICAgICAgcmVtb3ZlU3RhdGVzKCk7XG4gICAgICBjb250YWluZXIuYWRkQ2xhc3Moc3RhdGVDbGFzc05hbWVzW3N0YXRlXSk7XG4gICAgICB0aGlzLnBsYXllclN0YXRlQ2hhbmdlLmRpc3BhdGNoKHRoaXMsIHN0YXRlKTtcbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZUxvYWRlZCwgKCkgPT4ge1xuICAgICAgdXBkYXRlU3RhdGUoUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUHJlcGFyZWQpO1xuICAgIH0pO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5LCAoKSA9PiB7XG4gICAgICB1cGRhdGVTdGF0ZShQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5QbGF5aW5nKTtcbiAgICB9KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWluZywgKCkgPT4ge1xuICAgICAgdXBkYXRlU3RhdGUoUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUGxheWluZyk7XG4gICAgfSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBhdXNlZCwgKCkgPT4ge1xuICAgICAgdXBkYXRlU3RhdGUoUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUGF1c2VkKTtcbiAgICB9KTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWJhY2tGaW5pc2hlZCwgKCkgPT4ge1xuICAgICAgdXBkYXRlU3RhdGUoUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuRmluaXNoZWQpO1xuICAgIH0pO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgKCkgPT4ge1xuICAgICAgdXBkYXRlU3RhdGUoUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuSWRsZSk7XG4gICAgfSk7XG4gICAgdWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHVwZGF0ZVN0YXRlKFBsYXllclV0aWxzLmdldFN0YXRlKHBsYXllcikpO1xuICAgIH0pO1xuXG4gICAgLy8gRnVsbHNjcmVlbiBtYXJrZXIgY2xhc3NcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVmlld01vZGVDaGFuZ2VkLCAoKSA9PiB7XG4gICAgICBpZiAocGxheWVyLmdldFZpZXdNb2RlKCkgPT09IHBsYXllci5leHBvcnRzLlZpZXdNb2RlLkZ1bGxzY3JlZW4pIHtcbiAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKFVJQ29udGFpbmVyLkZVTExTQ1JFRU4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhVSUNvbnRhaW5lci5GVUxMU0NSRUVOKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gSW5pdCBmdWxsc2NyZWVuIHN0YXRlXG4gICAgaWYgKHBsYXllci5nZXRWaWV3TW9kZSgpID09PSBwbGF5ZXIuZXhwb3J0cy5WaWV3TW9kZS5GdWxsc2NyZWVuKSB7XG4gICAgICBjb250YWluZXIuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoVUlDb250YWluZXIuRlVMTFNDUkVFTikpO1xuICAgIH1cblxuICAgIC8vIEJ1ZmZlcmluZyBtYXJrZXIgY2xhc3NcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3RhbGxTdGFydGVkLCAoKSA9PiB7XG4gICAgICBjb250YWluZXIuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoVUlDb250YWluZXIuQlVGRkVSSU5HKSk7XG4gICAgfSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlN0YWxsRW5kZWQsICgpID0+IHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcyhVSUNvbnRhaW5lci5CVUZGRVJJTkcpKTtcbiAgICB9KTtcbiAgICAvLyBJbml0IGJ1ZmZlcmluZyBzdGF0ZVxuICAgIGlmIChwbGF5ZXIuaXNTdGFsbGVkKCkpIHtcbiAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhVSUNvbnRhaW5lci5CVUZGRVJJTkcpKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdGVDb250cm9sIG1hcmtlciBjbGFzc1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5DYXN0U3RhcnRlZCwgKCkgPT4ge1xuICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKFVJQ29udGFpbmVyLlJFTU9URV9DT05UUk9MKSk7XG4gICAgfSk7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkNhc3RTdG9wcGVkLCAoKSA9PiB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoVUlDb250YWluZXIuUkVNT1RFX0NPTlRST0wpKTtcbiAgICB9KTtcbiAgICAvLyBJbml0IFJlbW90ZUNvbnRyb2wgc3RhdGVcbiAgICBpZiAocGxheWVyLmlzQ2FzdGluZygpKSB7XG4gICAgICBjb250YWluZXIuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoVUlDb250YWluZXIuUkVNT1RFX0NPTlRST0wpKTtcbiAgICB9XG5cbiAgICAvLyBDb250cm9scyB2aXNpYmlsaXR5IG1hcmtlciBjbGFzc1xuICAgIHVpbWFuYWdlci5vbkNvbnRyb2xzU2hvdy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKHRoaXMucHJlZml4Q3NzKFVJQ29udGFpbmVyLkNPTlRST0xTX0hJRERFTikpO1xuICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKFVJQ29udGFpbmVyLkNPTlRST0xTX1NIT1dOKSk7XG4gICAgfSk7XG4gICAgdWltYW5hZ2VyLm9uQ29udHJvbHNIaWRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoVUlDb250YWluZXIuQ09OVFJPTFNfU0hPV04pKTtcbiAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLnByZWZpeENzcyhVSUNvbnRhaW5lci5DT05UUk9MU19ISURERU4pKTtcbiAgICB9KTtcblxuICAgIC8vIExheW91dCBzaXplIGNsYXNzZXNcbiAgICBsZXQgdXBkYXRlTGF5b3V0U2l6ZUNsYXNzZXMgPSAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcygnbGF5b3V0LW1heC13aWR0aC00MDAnKSk7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5wcmVmaXhDc3MoJ2xheW91dC1tYXgtd2lkdGgtNjAwJykpO1xuICAgICAgY29udGFpbmVyLnJlbW92ZUNsYXNzKHRoaXMucHJlZml4Q3NzKCdsYXlvdXQtbWF4LXdpZHRoLTgwMCcpKTtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLnByZWZpeENzcygnbGF5b3V0LW1heC13aWR0aC0xMjAwJykpO1xuXG4gICAgICBpZiAod2lkdGggPD0gNDAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLnByZWZpeENzcygnbGF5b3V0LW1heC13aWR0aC00MDAnKSk7XG4gICAgICB9IGVsc2UgaWYgKHdpZHRoIDw9IDYwMCkge1xuICAgICAgICBjb250YWluZXIuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoJ2xheW91dC1tYXgtd2lkdGgtNjAwJykpO1xuICAgICAgfSBlbHNlIGlmICh3aWR0aCA8PSA4MDApIHtcbiAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKCdsYXlvdXQtbWF4LXdpZHRoLTgwMCcpKTtcbiAgICAgIH0gZWxzZSBpZiAod2lkdGggPD0gMTIwMCkge1xuICAgICAgICBjb250YWluZXIuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoJ2xheW91dC1tYXgtd2lkdGgtMTIwMCcpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QbGF5ZXJSZXNpemVkLCAoZTogUGxheWVyUmVzaXplZEV2ZW50KSA9PiB7XG4gICAgICAvLyBDb252ZXJ0IHN0cmluZ3MgKHdpdGggXCJweFwiIHN1ZmZpeCkgdG8gaW50c1xuICAgICAgbGV0IHdpZHRoID0gTWF0aC5yb3VuZChOdW1iZXIoZS53aWR0aC5zdWJzdHJpbmcoMCwgZS53aWR0aC5sZW5ndGggLSAyKSkpO1xuICAgICAgbGV0IGhlaWdodCA9IE1hdGgucm91bmQoTnVtYmVyKGUuaGVpZ2h0LnN1YnN0cmluZygwLCBlLmhlaWdodC5sZW5ndGggLSAyKSkpO1xuXG4gICAgICB1cGRhdGVMYXlvdXRTaXplQ2xhc3Nlcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9KTtcbiAgICAvLyBJbml0IGxheW91dCBzdGF0ZVxuICAgIHVwZGF0ZUxheW91dFNpemVDbGFzc2VzKG5ldyBET00ocGxheWVyLmdldENvbnRhaW5lcigpKS53aWR0aCgpLCBuZXcgRE9NKHBsYXllci5nZXRDb250YWluZXIoKSkuaGVpZ2h0KCkpO1xuICB9XG5cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAvLyBFeHBsaWNpdGx5IHVuc3Vic2NyaWJlIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnQgaGFuZGxlcnMgYmVjYXVzZSB0aGV5IGNvdWxkIGJlIGF0dGFjaGVkIHRvIGFuIGV4dGVybmFsIGVsZW1lbnRcbiAgICAvLyB0aGF0IGlzbid0IG93bmVkIGJ5IHRoZSBVSSBhbmQgdGhlcmVmb3JlIG5vdCByZW1vdmVkIG9uIHJlbGVhc2UuXG4gICAgaWYgKHRoaXMudXNlckludGVyYWN0aW9uRXZlbnRzKSB7XG4gICAgICB0aGlzLnVzZXJJbnRlcmFjdGlvbkV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4gdGhpcy51c2VySW50ZXJhY3Rpb25FdmVudFNvdXJjZS5vZmYoZXZlbnQubmFtZSwgZXZlbnQuaGFuZGxlcikpO1xuICAgIH1cblxuICAgIHN1cGVyLnJlbGVhc2UoKTtcblxuICAgIGlmICh0aGlzLnVpSGlkZVRpbWVvdXQpIHtcbiAgICAgIHRoaXMudWlIaWRlVGltZW91dC5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB0b0RvbUVsZW1lbnQoKTogRE9NIHtcbiAgICBsZXQgY29udGFpbmVyID0gc3VwZXIudG9Eb21FbGVtZW50KCk7XG5cbiAgICAvLyBEZXRlY3QgZmxleGJveCBzdXBwb3J0IChub3Qgc3VwcG9ydGVkIGluIElFOSlcbiAgICBpZiAoZG9jdW1lbnQgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKS5zdHlsZS5mbGV4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29udGFpbmVyLmFkZENsYXNzKHRoaXMucHJlZml4Q3NzKCdmbGV4Ym94JykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuYWRkQ2xhc3ModGhpcy5wcmVmaXhDc3MoJ25vLWZsZXhib3gnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxufVxuIiwiaW1wb3J0IHtTZWxlY3RCb3h9IGZyb20gJy4vc2VsZWN0Ym94JztcbmltcG9ydCB7TGlzdFNlbGVjdG9yQ29uZmlnfSBmcm9tICcuL2xpc3RzZWxlY3Rvcic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBzZWxlY3QgYm94IHByb3ZpZGluZyBhIHNlbGVjdGlvbiBiZXR3ZWVuICdhdXRvJyBhbmQgdGhlIGF2YWlsYWJsZSB2aWRlbyBxdWFsaXRpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWaWRlb1F1YWxpdHlTZWxlY3RCb3ggZXh0ZW5kcyBTZWxlY3RCb3gge1xuXG4gIHByaXZhdGUgaGFzQXV0bzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExpc3RTZWxlY3RvckNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzZXM6IFsndWktdmlkZW9xdWFsaXR5c2VsZWN0Ym94J10sXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIGxldCBzZWxlY3RDdXJyZW50VmlkZW9RdWFsaXR5ID0gKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKHBsYXllci5nZXRWaWRlb1F1YWxpdHkoKS5pZCk7XG4gICAgfTtcblxuICAgIGxldCB1cGRhdGVWaWRlb1F1YWxpdGllcyA9ICgpID0+IHtcbiAgICAgIGxldCB2aWRlb1F1YWxpdGllcyA9IHBsYXllci5nZXRBdmFpbGFibGVWaWRlb1F1YWxpdGllcygpO1xuXG4gICAgICB0aGlzLmNsZWFySXRlbXMoKTtcblxuICAgICAgLy8gUHJvZ3Jlc3NpdmUgc3RyZWFtcyBkbyBub3Qgc3VwcG9ydCBhdXRvbWF0aWMgcXVhbGl0eSBzZWxlY3Rpb25cbiAgICAgIHRoaXMuaGFzQXV0byA9IHBsYXllci5nZXRTdHJlYW1UeXBlKCkgIT09ICdwcm9ncmVzc2l2ZSc7XG5cbiAgICAgIGlmICh0aGlzLmhhc0F1dG8pIHtcbiAgICAgICAgLy8gQWRkIGVudHJ5IGZvciBhdXRvbWF0aWMgcXVhbGl0eSBzd2l0Y2hpbmcgKGRlZmF1bHQgc2V0dGluZylcbiAgICAgICAgdGhpcy5hZGRJdGVtKCdhdXRvJywgaTE4bi5nZXRMb2NhbGl6ZXIoJ2F1dG8nKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB2aWRlbyBxdWFsaXRpZXNcbiAgICAgIGZvciAobGV0IHZpZGVvUXVhbGl0eSBvZiB2aWRlb1F1YWxpdGllcykge1xuICAgICAgICB0aGlzLmFkZEl0ZW0odmlkZW9RdWFsaXR5LmlkLCB2aWRlb1F1YWxpdHkubGFiZWwpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZWxlY3QgaW5pdGlhbCBxdWFsaXR5XG4gICAgICBzZWxlY3RDdXJyZW50VmlkZW9RdWFsaXR5KCk7XG4gICAgfTtcblxuICAgIHRoaXMub25JdGVtU2VsZWN0ZWQuc3Vic2NyaWJlKChzZW5kZXI6IFZpZGVvUXVhbGl0eVNlbGVjdEJveCwgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgcGxheWVyLnNldFZpZGVvUXVhbGl0eSh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgcXVhbGl0aWVzIHdoZW4gc291cmNlIGdvZXMgYXdheVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgdXBkYXRlVmlkZW9RdWFsaXRpZXMpO1xuICAgIC8vIFVwZGF0ZSBxdWFsaXRpZXMgd2hlbiB0aGUgcGVyaW9kIHdpdGhpbiBhIHNvdXJjZSBjaGFuZ2VzXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlBlcmlvZFN3aXRjaGVkLCB1cGRhdGVWaWRlb1F1YWxpdGllcyk7XG4gICAgLy8gVXBkYXRlIHF1YWxpdHkgc2VsZWN0aW9uIHdoZW4gcXVhbGl0eSBpcyBjaGFuZ2VkIChmcm9tIG91dHNpZGUpXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlZpZGVvUXVhbGl0eUNoYW5nZWQsIHNlbGVjdEN1cnJlbnRWaWRlb1F1YWxpdHkpO1xuXG4gICAgaWYgKChwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudCBhcyBhbnkpLlZpZGVvUXVhbGl0eUFkZGVkKSB7XG4gICAgICAvLyBVcGRhdGUgcXVhbGl0aWVzIHdoZW4gdGhlaXIgYXZhaWxhYmlsaXR5IGNoYW5nZWRcbiAgICAgIC8vIFRPRE86IHJlbW92ZSBhbnkgY2FzdCBhZnRlciBuZXh0IHBsYXllciByZWxlYXNlXG4gICAgICBwbGF5ZXIub24oKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50IGFzIGFueSkuVmlkZW9RdWFsaXR5QWRkZWQsIHVwZGF0ZVZpZGVvUXVhbGl0aWVzKTtcbiAgICAgIHBsYXllci5vbigocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQgYXMgYW55KS5WaWRlb1F1YWxpdHlSZW1vdmVkLCB1cGRhdGVWaWRlb1F1YWxpdGllcyk7XG4gICAgfVxuXG4gICAgdWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKHVwZGF0ZVZpZGVvUXVhbGl0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdCBib3ggY29udGFpbnMgYW4gJ2F1dG8nIGl0ZW0gZm9yIGF1dG9tYXRpYyBxdWFsaXR5IHNlbGVjdGlvbiBtb2RlLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzQXV0b0l0ZW0oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQXV0bztcbiAgfVxufSIsImltcG9ydCB7Q29udGFpbmVyLCBDb250YWluZXJDb25maWd9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7Vm9sdW1lU2xpZGVyfSBmcm9tICcuL3ZvbHVtZXNsaWRlcic7XG5pbXBvcnQge1ZvbHVtZVRvZ2dsZUJ1dHRvbn0gZnJvbSAnLi92b2x1bWV0b2dnbGVidXR0b24nO1xuaW1wb3J0IHtVSUluc3RhbmNlTWFuYWdlcn0gZnJvbSAnLi4vdWltYW5hZ2VyJztcbmltcG9ydCB7VGltZW91dH0gZnJvbSAnLi4vdGltZW91dCc7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciBhIHtAbGluayBWb2x1bWVDb250cm9sQnV0dG9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWb2x1bWVDb250cm9sQnV0dG9uQ29uZmlnIGV4dGVuZHMgQ29udGFpbmVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBkZWxheSBhZnRlciB3aGljaCB0aGUgdm9sdW1lIHNsaWRlciB3aWxsIGJlIGhpZGRlbiB3aGVuIHRoZXJlIGlzIG5vIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAqIENhcmUgbXVzdCBiZSB0YWtlbiB0aGF0IHRoZSBkZWxheSBpcyBsb25nIGVub3VnaCBzbyB1c2VycyBjYW4gcmVhY2ggdGhlIHNsaWRlciBmcm9tIHRoZSB0b2dnbGUgYnV0dG9uLCBlLmcuIGJ5XG4gICAqIG1vdXNlIG1vdmVtZW50LiBJZiB0aGUgZGVsYXkgaXMgdG9vIHNob3J0LCB0aGUgc2xpZGVycyBkaXNhcHBlYXJzIGJlZm9yZSB0aGUgbW91c2UgcG9pbnRlciBoYXMgcmVhY2hlZCBpdCBhbmRcbiAgICogdGhlIHVzZXIgaXMgbm90IGFibGUgdG8gdXNlIGl0LlxuICAgKiBEZWZhdWx0OiA1MDBtc1xuICAgKi9cbiAgaGlkZURlbGF5PzogbnVtYmVyO1xuICAvKipcbiAgICogU3BlY2lmaWVzIGlmIHRoZSB2b2x1bWUgc2xpZGVyIHNob3VsZCBiZSB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseSBhbGlnbmVkLlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICB2ZXJ0aWNhbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBjb21wb3NpdGUgdm9sdW1lIGNvbnRyb2wgdGhhdCBjb25zaXN0cyBvZiBhbmQgaW50ZXJuYWxseSBtYW5hZ2VzIGEgdm9sdW1lIGNvbnRyb2wgYnV0dG9uIHRoYXQgY2FuIGJlIHVzZWRcbiAqIGZvciBtdXRpbmcsIGFuZCBhIChkZXBlbmRpbmcgb24gdGhlIENTUyBzdHlsZSwgZS5nLiBzbGlkZS1vdXQpIHZvbHVtZSBjb250cm9sIGJhci5cbiAqL1xuZXhwb3J0IGNsYXNzIFZvbHVtZUNvbnRyb2xCdXR0b24gZXh0ZW5kcyBDb250YWluZXI8Vm9sdW1lQ29udHJvbEJ1dHRvbkNvbmZpZz4ge1xuXG4gIHByaXZhdGUgdm9sdW1lVG9nZ2xlQnV0dG9uOiBWb2x1bWVUb2dnbGVCdXR0b247XG4gIHByaXZhdGUgdm9sdW1lU2xpZGVyOiBWb2x1bWVTbGlkZXI7XG5cbiAgcHJpdmF0ZSB2b2x1bWVTbGlkZXJIaWRlVGltZW91dDogVGltZW91dDtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFZvbHVtZUNvbnRyb2xCdXR0b25Db25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLnZvbHVtZVRvZ2dsZUJ1dHRvbiA9IG5ldyBWb2x1bWVUb2dnbGVCdXR0b24oKTtcbiAgICB0aGlzLnZvbHVtZVNsaWRlciA9IG5ldyBWb2x1bWVTbGlkZXIoe1xuICAgICAgdmVydGljYWw6IGNvbmZpZy52ZXJ0aWNhbCAhPSBudWxsID8gY29uZmlnLnZlcnRpY2FsIDogdHJ1ZSxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktdm9sdW1lY29udHJvbGJ1dHRvbicsXG4gICAgICBjb21wb25lbnRzOiBbdGhpcy52b2x1bWVUb2dnbGVCdXR0b24sIHRoaXMudm9sdW1lU2xpZGVyXSxcbiAgICAgIGhpZGVEZWxheTogNTAwLFxuICAgIH0sIDxWb2x1bWVDb250cm9sQnV0dG9uQ29uZmlnPnRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShwbGF5ZXI6IFBsYXllckFQSSwgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcik6IHZvaWQge1xuICAgIHN1cGVyLmNvbmZpZ3VyZShwbGF5ZXIsIHVpbWFuYWdlcik7XG5cbiAgICBsZXQgdm9sdW1lVG9nZ2xlQnV0dG9uID0gdGhpcy5nZXRWb2x1bWVUb2dnbGVCdXR0b24oKTtcbiAgICBsZXQgdm9sdW1lU2xpZGVyID0gdGhpcy5nZXRWb2x1bWVTbGlkZXIoKTtcblxuICAgIHRoaXMudm9sdW1lU2xpZGVySGlkZVRpbWVvdXQgPSBuZXcgVGltZW91dCh0aGlzLmdldENvbmZpZygpLmhpZGVEZWxheSwgKCkgPT4ge1xuICAgICAgdm9sdW1lU2xpZGVyLmhpZGUoKTtcbiAgICB9KTtcblxuICAgIC8qXG4gICAgICogVm9sdW1lIFNsaWRlciB2aXNpYmlsaXR5IGhhbmRsaW5nXG4gICAgICpcbiAgICAgKiBUaGUgdm9sdW1lIHNsaWRlciBzaGFsbCBiZSB2aXNpYmxlIHdoaWxlIHRoZSB1c2VyIGhvdmVycyB0aGUgbXV0ZSB0b2dnbGUgYnV0dG9uLCB3aGlsZSB0aGUgdXNlciBob3ZlcnMgdGhlXG4gICAgICogdm9sdW1lIHNsaWRlciwgYW5kIHdoaWxlIHRoZSB1c2VyIHNsaWRlcyB0aGUgdm9sdW1lIHNsaWRlci4gSWYgbm9uZSBvZiB0aGVzZSBzaXR1YXRpb25zIGFyZSB0cnVlLCB0aGUgc2xpZGVyXG4gICAgICogc2hhbGwgZGlzYXBwZWFyLlxuICAgICAqL1xuICAgIGxldCB2b2x1bWVTbGlkZXJIb3ZlcmVkID0gZmFsc2U7XG4gICAgdm9sdW1lVG9nZ2xlQnV0dG9uLmdldERvbUVsZW1lbnQoKS5vbignbW91c2VlbnRlcicsICgpID0+IHtcbiAgICAgIC8vIFNob3cgdm9sdW1lIHNsaWRlciB3aGVuIG1vdXNlIGVudGVycyB0aGUgYnV0dG9uIGFyZWFcbiAgICAgIGlmICh2b2x1bWVTbGlkZXIuaXNIaWRkZW4oKSkge1xuICAgICAgICB2b2x1bWVTbGlkZXIuc2hvdygpO1xuICAgICAgfVxuICAgICAgLy8gQXZvaWQgaGlkaW5nIG9mIHRoZSBzbGlkZXIgd2hlbiBidXR0b24gaXMgaG92ZXJlZFxuICAgICAgdGhpcy52b2x1bWVTbGlkZXJIaWRlVGltZW91dC5jbGVhcigpO1xuICAgIH0pO1xuICAgIHZvbHVtZVRvZ2dsZUJ1dHRvbi5nZXREb21FbGVtZW50KCkub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAvLyBIaWRlIHNsaWRlciBkZWxheWVkIHdoZW4gYnV0dG9uIGlzIGxlZnRcbiAgICAgIHRoaXMudm9sdW1lU2xpZGVySGlkZVRpbWVvdXQucmVzZXQoKTtcbiAgICB9KTtcbiAgICB2b2x1bWVTbGlkZXIuZ2V0RG9tRWxlbWVudCgpLm9uKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgLy8gV2hlbiB0aGUgc2xpZGVyIGlzIGVudGVyZWQsIGNhbmNlbCB0aGUgaGlkZSB0aW1lb3V0IGFjdGl2YXRlZCBieSBsZWF2aW5nIHRoZSBidXR0b25cbiAgICAgIHRoaXMudm9sdW1lU2xpZGVySGlkZVRpbWVvdXQuY2xlYXIoKTtcbiAgICAgIHZvbHVtZVNsaWRlckhvdmVyZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHZvbHVtZVNsaWRlci5nZXREb21FbGVtZW50KCkub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAvLyBXaGVuIG1vdXNlIGxlYXZlcyB0aGUgc2xpZGVyLCBvbmx5IGhpZGUgaXQgaWYgdGhlcmUgaXMgbm8gc2xpZGUgb3BlcmF0aW9uIGluIHByb2dyZXNzXG4gICAgICBpZiAodm9sdW1lU2xpZGVyLmlzU2Vla2luZygpKSB7XG4gICAgICAgIHRoaXMudm9sdW1lU2xpZGVySGlkZVRpbWVvdXQuY2xlYXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudm9sdW1lU2xpZGVySGlkZVRpbWVvdXQucmVzZXQoKTtcbiAgICAgIH1cbiAgICAgIHZvbHVtZVNsaWRlckhvdmVyZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgICB2b2x1bWVTbGlkZXIub25TZWVrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIFdoZW4gYSBzbGlkZSBvcGVyYXRpb24gaXMgZG9uZSBhbmQgdGhlIHNsaWRlciBub3QgaG92ZXJlZCAobW91c2Ugb3V0c2lkZSBzbGlkZXIpLCBoaWRlIHNsaWRlciBkZWxheWVkXG4gICAgICBpZiAoIXZvbHVtZVNsaWRlckhvdmVyZWQpIHtcbiAgICAgICAgdGhpcy52b2x1bWVTbGlkZXJIaWRlVGltZW91dC5yZXNldCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBzdXBlci5yZWxlYXNlKCk7XG4gICAgdGhpcy52b2x1bWVTbGlkZXJIaWRlVGltZW91dC5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaW50ZXJuYWxseSBtYW5hZ2VkIHZvbHVtZSB0b2dnbGUgYnV0dG9uLlxuICAgKiBAcmV0dXJucyB7Vm9sdW1lVG9nZ2xlQnV0dG9ufVxuICAgKi9cbiAgZ2V0Vm9sdW1lVG9nZ2xlQnV0dG9uKCk6IFZvbHVtZVRvZ2dsZUJ1dHRvbiB7XG4gICAgcmV0dXJuIHRoaXMudm9sdW1lVG9nZ2xlQnV0dG9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaW50ZXJuYWxseSBtYW5hZ2VkIHZvbHVtZSBzaWxkZXIuXG4gICAqIEByZXR1cm5zIHtWb2x1bWVTbGlkZXJ9XG4gICAqL1xuICBnZXRWb2x1bWVTbGlkZXIoKTogVm9sdW1lU2xpZGVyIHtcbiAgICByZXR1cm4gdGhpcy52b2x1bWVTbGlkZXI7XG4gIH1cbn0iLCJpbXBvcnQgeyBTZWVrQmFyLCBTZWVrQmFyQ29uZmlnLCBTZWVrUHJldmlld0V2ZW50QXJncyB9IGZyb20gJy4vc2Vla2Jhcic7XG5pbXBvcnQgeyBVSUluc3RhbmNlTWFuYWdlciB9IGZyb20gJy4uL3VpbWFuYWdlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgVm9sdW1lVHJhbnNpdGlvbiB9IGZyb20gJy4uL3ZvbHVtZWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIHtAbGluayBWb2x1bWVTbGlkZXJ9IGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWb2x1bWVTbGlkZXJDb25maWcgZXh0ZW5kcyBTZWVrQmFyQ29uZmlnIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBpZiB0aGUgdm9sdW1lIHNsaWRlciBzaG91bGQgYmUgYXV0b21hdGljYWxseSBoaWRkZW4gd2hlbiB2b2x1bWUgY29udHJvbCBpcyBwcm9oaWJpdGVkIGJ5IHRoZVxuICAgKiBicm93c2VyIG9yIHBsYXRmb3JtLiBUaGlzIGN1cnJlbnRseSBvbmx5IGFwcGxpZXMgdG8gaU9TLlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBoaWRlSWZWb2x1bWVDb250cm9sUHJvaGliaXRlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBzaW1wbGUgdm9sdW1lIHNsaWRlciBjb21wb25lbnQgdG8gYWRqdXN0IHRoZSBwbGF5ZXIncyB2b2x1bWUgc2V0dGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFZvbHVtZVNsaWRlciBleHRlbmRzIFNlZWtCYXIge1xuICBwcml2YXRlIHZvbHVtZVRyYW5zaXRpb246IFZvbHVtZVRyYW5zaXRpb247XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBWb2x1bWVTbGlkZXJDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCA8Vm9sdW1lU2xpZGVyQ29uZmlnPntcbiAgICAgIGNzc0NsYXNzOiAndWktdm9sdW1lc2xpZGVyJyxcbiAgICAgIGhpZGVJZlZvbHVtZUNvbnRyb2xQcm9oaWJpdGVkOiB0cnVlLFxuICAgICAgYXJpYUxhYmVsOiBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3MuYXVkaW8udm9sdW1lJyksXG4gICAgICB0YWJJbmRleDogMCxcbiAgICB9LCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIHNldFZvbHVtZUFyaWFTbGlkZXJWYWx1ZXModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCBNYXRoLmNlaWwodmFsdWUpLnRvU3RyaW5nKCkpO1xuICAgIHRoaXMuZ2V0RG9tRWxlbWVudCgpLmF0dHIoJ2FyaWEtdmFsdWV0ZXh0JywgYCR7aTE4bi5wZXJmb3JtTG9jYWxpemF0aW9uKGkxOG4uZ2V0TG9jYWxpemVyKCdzZWVrQmFyLnZhbHVlJykpfTogJHtNYXRoLmNlaWwodmFsdWUpfWApO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyLCBmYWxzZSk7XG5cbiAgICB0aGlzLnNldEFyaWFTbGlkZXJNaW5NYXgoJzAnLCAnMTAwJyk7XG5cbiAgICBsZXQgY29uZmlnID0gPFZvbHVtZVNsaWRlckNvbmZpZz50aGlzLmdldENvbmZpZygpO1xuXG4gICAgY29uc3Qgdm9sdW1lQ29udHJvbGxlciA9IHVpbWFuYWdlci5nZXRDb25maWcoKS52b2x1bWVDb250cm9sbGVyO1xuXG4gICAgaWYgKGNvbmZpZy5oaWRlSWZWb2x1bWVDb250cm9sUHJvaGliaXRlZCAmJiAhdGhpcy5kZXRlY3RWb2x1bWVDb250cm9sQXZhaWxhYmlsaXR5KCkpIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuXG4gICAgICAvLyBXZSBjYW4ganVzdCByZXR1cm4gZnJvbSBoZXJlLCBiZWNhdXNlIHRoZSB1c2VyIHdpbGwgbmV2ZXIgaW50ZXJhY3Qgd2l0aCB0aGUgY29udHJvbCBhbmQgYW55IGNvbmZpZ3VyZWRcbiAgICAgIC8vIGZ1bmN0aW9uYWxpdHkgd291bGQgb25seSBlYXQgcmVzb3VyY2VzIGZvciBubyByZWFzb24uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdm9sdW1lQ29udHJvbGxlci5vbkNoYW5nZWQuc3Vic2NyaWJlKChfLCBhcmdzKSA9PiB7XG4gICAgICBpZiAoYXJncy5tdXRlZCkge1xuICAgICAgICB0aGlzLnNldFZvbHVtZUFyaWFTbGlkZXJWYWx1ZXMoMCk7XG4gICAgICAgIHRoaXMuc2V0UGxheWJhY2tQb3NpdGlvbigwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0UGxheWJhY2tQb3NpdGlvbihhcmdzLnZvbHVtZSk7XG4gICAgICAgIHRoaXMuc2V0Vm9sdW1lQXJpYVNsaWRlclZhbHVlcyhhcmdzLnZvbHVtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uU2Vlay5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy52b2x1bWVUcmFuc2l0aW9uID0gdm9sdW1lQ29udHJvbGxlci5zdGFydFRyYW5zaXRpb24oKTtcbiAgICB9KTtcblxuICAgIHRoaXMub25TZWVrUHJldmlldy5zdWJzY3JpYmVSYXRlTGltaXRlZCh0aGlzLnVwZGF0ZVZvbHVtZVdoaWxlU2NydWJiaW5nLCA1MCk7XG4gICAgdGhpcy5vblNlZWtlZC5zdWJzY3JpYmUoKHNlbmRlciwgcGVyY2VudGFnZSkgPT4ge1xuICAgICAgaWYgKHRoaXMudm9sdW1lVHJhbnNpdGlvbikge1xuICAgICAgICB0aGlzLnZvbHVtZVRyYW5zaXRpb24uZmluaXNoKHBlcmNlbnRhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgc2xpZGVyIG1hcmtlciB3aGVuIHRoZSBwbGF5ZXIgcmVzaXplZCwgYSBzb3VyY2UgaXMgbG9hZGVkLFxuICAgIC8vIG9yIHRoZSBVSSBpcyBjb25maWd1cmVkLiBDaGVjayB0aGUgc2Vla2JhciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWVyUmVzaXplZCwgKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICAgIH0pO1xuICAgIHVpbWFuYWdlci5vbkNvbmZpZ3VyZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucmVmcmVzaFBsYXliYWNrUG9zaXRpb24oKTtcbiAgICB9KTtcblxuICAgIHVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hQbGF5YmFja1Bvc2l0aW9uKCk7XG4gICAgfSk7XG5cbiAgICB1aW1hbmFnZXIub25Db21wb25lbnRTaG93LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hQbGF5YmFja1Bvc2l0aW9uKCk7XG4gICAgfSk7XG4gICAgdWltYW5hZ2VyLm9uQ29tcG9uZW50SGlkZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoUGxheWJhY2tQb3NpdGlvbigpO1xuICAgIH0pO1xuXG4gICAgLy8gSW5pdCB2b2x1bWUgYmFyXG4gICAgdm9sdW1lQ29udHJvbGxlci5vbkNoYW5nZWRFdmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWb2x1bWVXaGlsZVNjcnViYmluZyA9IChzZW5kZXI6IFZvbHVtZVNsaWRlciwgYXJnczogU2Vla1ByZXZpZXdFdmVudEFyZ3MpID0+IHtcbiAgICBpZiAoYXJncy5zY3J1YmJpbmcgJiYgdGhpcy52b2x1bWVUcmFuc2l0aW9uKSB7XG4gICAgICB0aGlzLnZvbHVtZVRyYW5zaXRpb24udXBkYXRlKGFyZ3MucG9zaXRpb24pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGRldGVjdFZvbHVtZUNvbnRyb2xBdmFpbGFiaWxpdHkoKTogYm9vbGVhbiB7XG4gICAgLypcbiAgICAgKiBcIk9uIGlPUyBkZXZpY2VzLCB0aGUgYXVkaW8gbGV2ZWwgaXMgYWx3YXlzIHVuZGVyIHRoZSB1c2Vy4oCZcyBwaHlzaWNhbCBjb250cm9sLiBUaGUgdm9sdW1lIHByb3BlcnR5IGlzIG5vdFxuICAgICAqIHNldHRhYmxlIGluIEphdmFTY3JpcHQuIFJlYWRpbmcgdGhlIHZvbHVtZSBwcm9wZXJ0eSBhbHdheXMgcmV0dXJucyAxLlwiXG4gICAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvY29udGVudC9kb2N1bWVudGF0aW9uL0F1ZGlvVmlkZW8vQ29uY2VwdHVhbC9Vc2luZ19IVE1MNV9BdWRpb19WaWRlby9EZXZpY2UtU3BlY2lmaWNDb25zaWRlcmF0aW9ucy9EZXZpY2UtU3BlY2lmaWNDb25zaWRlcmF0aW9ucy5odG1sXG4gICAgICovXG4gICAgLy8gYXMgbXV0ZWQgYXV0b3BsYXkgZ2V0cyBwYXVzZWQgYXMgc29vbiBhcyB3ZSB1bm11dGUgaXQsIHdlIG1heSBub3QgdG91Y2ggdGhlIHZvbHVtZSBvZiB0aGUgYWN0dWFsIHBsYXllciBzbyB3ZVxuICAgIC8vIHByb2JlIGEgZHVtbXkgYXVkaW8gZWxlbWVudFxuICAgIGNvbnN0IGR1bW15VmlkZW9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAvLyB0cnkgc2V0dGluZyB0aGUgdm9sdW1lIHRvIDAuNyBhbmQgaWYgaXQncyBzdGlsbCAxIHdlIGFyZSBvbiBhIHZvbHVtZSBjb250cm9sIHJlc3RyaWN0ZWQgZGV2aWNlXG4gICAgZHVtbXlWaWRlb0VsZW1lbnQudm9sdW1lID0gMC43O1xuICAgIHJldHVybiBkdW1teVZpZGVvRWxlbWVudC52b2x1bWUgIT09IDE7XG4gIH1cblxuICByZWxlYXNlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlbGVhc2UoKTtcblxuICAgIHRoaXMub25TZWVrUHJldmlldy51bnN1YnNjcmliZSh0aGlzLnVwZGF0ZVZvbHVtZVdoaWxlU2NydWJiaW5nKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtUb2dnbGVCdXR0b24sIFRvZ2dsZUJ1dHRvbkNvbmZpZ30gZnJvbSAnLi90b2dnbGVidXR0b24nO1xuaW1wb3J0IHsgVUlJbnN0YW5jZU1hbmFnZXIgfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCB0b2dnbGVzIGF1ZGlvIG11dGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFZvbHVtZVRvZ2dsZUJ1dHRvbiBleHRlbmRzIFRvZ2dsZUJ1dHRvbjxUb2dnbGVCdXR0b25Db25maWc+IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFRvZ2dsZUJ1dHRvbkNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIGNvbnN0IGRlZmF1bHRDb25maWc6IFRvZ2dsZUJ1dHRvbkNvbmZpZyA9IHtcbiAgICAgIGNzc0NsYXNzOiAndWktdm9sdW1ldG9nZ2xlYnV0dG9uJyxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5hdWRpby5tdXRlJyksXG4gICAgICBvbkNsYXNzOiAnbXV0ZWQnLFxuICAgICAgb2ZmQ2xhc3M6ICd1bm11dGVkJyxcbiAgICAgIGFyaWFMYWJlbDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLmF1ZGlvLm11dGUnKSxcbiAgICB9O1xuXG4gICAgdGhpcy5jb25maWcgPSB0aGlzLm1lcmdlQ29uZmlnKGNvbmZpZywgZGVmYXVsdENvbmZpZywgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIGNvbnN0IHZvbHVtZUNvbnRyb2xsZXIgPSB1aW1hbmFnZXIuZ2V0Q29uZmlnKCkudm9sdW1lQ29udHJvbGxlcjtcblxuICAgIHZvbHVtZUNvbnRyb2xsZXIub25DaGFuZ2VkLnN1YnNjcmliZSgoXywgYXJncykgPT4ge1xuICAgICAgaWYgKGFyZ3MubXV0ZWQpIHtcbiAgICAgICAgdGhpcy5vbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vZmYoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgdm9sdW1lTGV2ZWxUZW5zID0gTWF0aC5jZWlsKGFyZ3Mudm9sdW1lIC8gMTApO1xuICAgICAgdGhpcy5nZXREb21FbGVtZW50KCkuZGF0YSh0aGlzLnByZWZpeENzcygndm9sdW1lLWxldmVsLXRlbnMnKSwgU3RyaW5nKHZvbHVtZUxldmVsVGVucykpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB2b2x1bWVDb250cm9sbGVyLnRvZ2dsZU11dGVkKCk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGFydHVwIGluaXRcbiAgICB2b2x1bWVDb250cm9sbGVyLm9uQ2hhbmdlZEV2ZW50KCk7XG4gIH1cbn0iLCJpbXBvcnQge1RvZ2dsZUJ1dHRvbiwgVG9nZ2xlQnV0dG9uQ29uZmlnfSBmcm9tICcuL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1VJSW5zdGFuY2VNYW5hZ2VyfSBmcm9tICcuLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJLCBQbGF5ZXJFdmVudEJhc2UsIFdhcm5pbmdFdmVudCB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG4vKipcbiAqIEEgYnV0dG9uIHRoYXQgdG9nZ2xlcyB0aGUgdmlkZW8gdmlldyBiZXR3ZWVuIG5vcm1hbC9tb25vIGFuZCBWUi9zdGVyZW8uXG4gKi9cbmV4cG9ydCBjbGFzcyBWUlRvZ2dsZUJ1dHRvbiBleHRlbmRzIFRvZ2dsZUJ1dHRvbjxUb2dnbGVCdXR0b25Db25maWc+IHtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFRvZ2dsZUJ1dHRvbkNvbmZpZyA9IHt9KSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5tZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgIGNzc0NsYXNzOiAndWktdnJ0b2dnbGVidXR0b24nLFxuICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3ZyJyksXG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKHBsYXllcjogUGxheWVyQVBJLCB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyKTogdm9pZCB7XG4gICAgc3VwZXIuY29uZmlndXJlKHBsYXllciwgdWltYW5hZ2VyKTtcblxuICAgIGxldCBpc1ZSQ29uZmlndXJlZCA9ICgpID0+IHtcbiAgICAgIC8vIFZSIGF2YWlsYWJpbGl0eSBjYW5ub3QgYmUgY2hlY2tlZCB0aHJvdWdoIGdldFZSU3RhdHVzKCkgYmVjYXVzZSBpdCBpcyBhc3luY2hyb25vdXNseSBwb3B1bGF0ZWQgYW5kIG5vdFxuICAgICAgLy8gYXZhaWxhYmxlIGF0IFVJIGluaXRpYWxpemF0aW9uLiBBcyBhbiBhbHRlcm5hdGl2ZSwgd2UgY2hlY2sgdGhlIFZSIHNldHRpbmdzIGluIHRoZSBjb25maWcuXG4gICAgICAvLyBUT0RPIHVzZSBnZXRWUlN0YXR1cygpIHRocm91Z2ggaXNWUlN0ZXJlb0F2YWlsYWJsZSgpIG9uY2UgdGhlIHBsYXllciBoYXMgYmVlbiByZXdyaXR0ZW4gYW5kIHRoZSBzdGF0dXMgaXNcbiAgICAgIC8vIGF2YWlsYWJsZSBpbiBSZWFkeVxuICAgICAgY29uc3Qgc291cmNlID0gcGxheWVyLmdldFNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHNvdXJjZSAmJiBCb29sZWFuKHNvdXJjZS52cik7XG4gICAgfTtcblxuICAgIGxldCBpc1ZSU3RlcmVvQXZhaWxhYmxlID0gKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gcGxheWVyLmdldFNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHBsYXllci52ciAmJiBCb29sZWFuKHNvdXJjZS52cik7XG4gICAgfTtcblxuICAgIGxldCB2clN0YXRlSGFuZGxlciA9IChldjogUGxheWVyRXZlbnRCYXNlKSA9PiB7XG4gICAgICBpZiAoZXYudHlwZSA9PT0gcGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuV2FybmluZ1xuICAgICAgICAmJiAoZXYgYXMgV2FybmluZ0V2ZW50KS5jb2RlICE9PSBwbGF5ZXIuZXhwb3J0cy5XYXJuaW5nQ29kZS5WUl9SRU5ERVJJTkdfRVJST1IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNWUkNvbmZpZ3VyZWQoKSAmJiBpc1ZSU3RlcmVvQXZhaWxhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5zaG93KCk7IC8vIHNob3cgYnV0dG9uIGluIGNhc2UgaXQgaXMgaGlkZGVuXG5cbiAgICAgICAgaWYgKHBsYXllci52ciAmJiBwbGF5ZXIudnIuZ2V0U3RlcmVvKCkpIHtcbiAgICAgICAgICB0aGlzLm9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vZmYoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7IC8vIGhpZGUgYnV0dG9uIGlmIG5vIHN0ZXJlbyBtb2RlIGF2YWlsYWJsZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgdnJCdXR0b25WaXNpYmlsaXR5SGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlmIChpc1ZSQ29uZmlndXJlZCgpKSB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5WUlN0ZXJlb0NoYW5nZWQsIHZyU3RhdGVIYW5kbGVyKTtcbiAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuV2FybmluZywgdnJTdGF0ZUhhbmRsZXIpO1xuICAgIC8vIEhpZGUgYnV0dG9uIHdoZW4gVlIgc291cmNlIGdvZXMgYXdheVxuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgdnJCdXR0b25WaXNpYmlsaXR5SGFuZGxlcik7XG4gICAgdWltYW5hZ2VyLmdldENvbmZpZygpLmV2ZW50cy5vblVwZGF0ZWQuc3Vic2NyaWJlKHZyQnV0dG9uVmlzaWJpbGl0eUhhbmRsZXIpO1xuXG4gICAgdGhpcy5vbkNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoIWlzVlJTdGVyZW9BdmFpbGFibGUoKSkge1xuICAgICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBWUiBjb250ZW50Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwbGF5ZXIudnIgJiYgcGxheWVyLnZyLmdldFN0ZXJlbygpKSB7XG4gICAgICAgICAgcGxheWVyLnZyLnNldFN0ZXJlbyhmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGxheWVyLnZyLnNldFN0ZXJlbyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU2V0IHN0YXJ0dXAgdmlzaWJpbGl0eVxuICAgIHZyQnV0dG9uVmlzaWJpbGl0eUhhbmRsZXIoKTtcbiAgfVxufSIsImltcG9ydCB7Q2xpY2tPdmVybGF5LCBDbGlja092ZXJsYXlDb25maWd9IGZyb20gJy4vY2xpY2tvdmVybGF5JztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuLi9sb2NhbGl6YXRpb24vaTE4bic7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIGEge0BsaW5rIENsaWNrT3ZlcmxheX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0ZXJtYXJrQ29uZmlnIGV4dGVuZHMgQ2xpY2tPdmVybGF5Q29uZmlnIHtcbiAgLy8gbm90aGluZyB5ZXRcbn1cblxuLyoqXG4gKiBBIHdhdGVybWFyayBvdmVybGF5IHdpdGggYSBjbGlja2FibGUgbG9nby5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhdGVybWFyayBleHRlbmRzIENsaWNrT3ZlcmxheSB7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBXYXRlcm1hcmtDb25maWcgPSB7fSkge1xuICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMubWVyZ2VDb25maWcoY29uZmlnLCB7XG4gICAgICBjc3NDbGFzczogJ3VpLXdhdGVybWFyaycsXG4gICAgICB1cmw6ICdodHRwOi8vYml0bW92aW4uY29tJyxcbiAgICAgIHJvbGU6ICdsaW5rJyxcbiAgICAgIHRleHQ6ICdsb2dvJyxcbiAgICAgIGFyaWFMYWJlbDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3dhdGVybWFya0xpbmsnKSxcbiAgICB9LCA8V2F0ZXJtYXJrQ29uZmlnPnRoaXMuY29uZmlnKTtcbiAgfVxufSIsImltcG9ydCB7VlJUb2dnbGVCdXR0b259IGZyb20gJy4vY29tcG9uZW50cy92cnRvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge1NldHRpbmdzVG9nZ2xlQnV0dG9ufSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3N0b2dnbGVidXR0b24nO1xuaW1wb3J0IHtWb2x1bWVTbGlkZXJ9IGZyb20gJy4vY29tcG9uZW50cy92b2x1bWVzbGlkZXInO1xuaW1wb3J0IHtQbGF5YmFja1RpbWVMYWJlbCwgUGxheWJhY2tUaW1lTGFiZWxNb2RlfSBmcm9tICcuL2NvbXBvbmVudHMvcGxheWJhY2t0aW1lbGFiZWwnO1xuaW1wb3J0IHtBaXJQbGF5VG9nZ2xlQnV0dG9ufSBmcm9tICcuL2NvbXBvbmVudHMvYWlycGxheXRvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge0Vycm9yTWVzc2FnZU92ZXJsYXl9IGZyb20gJy4vY29tcG9uZW50cy9lcnJvcm1lc3NhZ2VvdmVybGF5JztcbmltcG9ydCB7Q29udHJvbEJhcn0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnRyb2xiYXInO1xuaW1wb3J0IHtDYXN0VG9nZ2xlQnV0dG9ufSBmcm9tICcuL2NvbXBvbmVudHMvY2FzdHRvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge0Z1bGxzY3JlZW5Ub2dnbGVCdXR0b259IGZyb20gJy4vY29tcG9uZW50cy9mdWxsc2NyZWVudG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7UmVjb21tZW5kYXRpb25PdmVybGF5fSBmcm9tICcuL2NvbXBvbmVudHMvcmVjb21tZW5kYXRpb25vdmVybGF5JztcbmltcG9ydCB7UGxheWJhY2tTcGVlZFNlbGVjdEJveH0gZnJvbSAnLi9jb21wb25lbnRzL3BsYXliYWNrc3BlZWRzZWxlY3Rib3gnO1xuaW1wb3J0IHtBdWRpb1F1YWxpdHlTZWxlY3RCb3h9IGZyb20gJy4vY29tcG9uZW50cy9hdWRpb3F1YWxpdHlzZWxlY3Rib3gnO1xuaW1wb3J0IHtDYXN0U3RhdHVzT3ZlcmxheX0gZnJvbSAnLi9jb21wb25lbnRzL2Nhc3RzdGF0dXNvdmVybGF5JztcbmltcG9ydCB7VUlDb250YWluZXJ9IGZyb20gJy4vY29tcG9uZW50cy91aWNvbnRhaW5lcic7XG5pbXBvcnQge1dhdGVybWFya30gZnJvbSAnLi9jb21wb25lbnRzL3dhdGVybWFyayc7XG5pbXBvcnQge1N1YnRpdGxlT3ZlcmxheX0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlb3ZlcmxheSc7XG5pbXBvcnQge1NldHRpbmdzUGFuZWx9IGZyb20gJy4vY29tcG9uZW50cy9zZXR0aW5nc3BhbmVsJztcbmltcG9ydCB7U2Vla0JhckxhYmVsfSBmcm9tICcuL2NvbXBvbmVudHMvc2Vla2JhcmxhYmVsJztcbmltcG9ydCB7UGxheWJhY2tUb2dnbGVPdmVybGF5fSBmcm9tICcuL2NvbXBvbmVudHMvcGxheWJhY2t0b2dnbGVvdmVybGF5JztcbmltcG9ydCB7UGljdHVyZUluUGljdHVyZVRvZ2dsZUJ1dHRvbn0gZnJvbSAnLi9jb21wb25lbnRzL3BpY3R1cmVpbnBpY3R1cmV0b2dnbGVidXR0b24nO1xuaW1wb3J0IHtTcGFjZXJ9IGZyb20gJy4vY29tcG9uZW50cy9zcGFjZXInO1xuaW1wb3J0IHtDb250YWluZXJ9IGZyb20gJy4vY29tcG9uZW50cy9jb250YWluZXInO1xuaW1wb3J0IHtWb2x1bWVUb2dnbGVCdXR0b259IGZyb20gJy4vY29tcG9uZW50cy92b2x1bWV0b2dnbGVidXR0b24nO1xuaW1wb3J0IHtQbGF5YmFja1RvZ2dsZUJ1dHRvbn0gZnJvbSAnLi9jb21wb25lbnRzL3BsYXliYWNrdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7U2Vla0Jhcn0gZnJvbSAnLi9jb21wb25lbnRzL3NlZWtiYXInO1xuaW1wb3J0IHtWaWRlb1F1YWxpdHlTZWxlY3RCb3h9IGZyb20gJy4vY29tcG9uZW50cy92aWRlb3F1YWxpdHlzZWxlY3Rib3gnO1xuaW1wb3J0IHtVSUNvbmRpdGlvbkNvbnRleHQsIFVJTWFuYWdlcn0gZnJvbSAnLi91aW1hbmFnZXInO1xuaW1wb3J0IHtUaXRsZUJhcn0gZnJvbSAnLi9jb21wb25lbnRzL3RpdGxlYmFyJztcbmltcG9ydCB7QnVmZmVyaW5nT3ZlcmxheX0gZnJvbSAnLi9jb21wb25lbnRzL2J1ZmZlcmluZ292ZXJsYXknO1xuaW1wb3J0IHtTdWJ0aXRsZUxpc3RCb3h9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZWxpc3Rib3gnO1xuaW1wb3J0IHtBdWRpb1RyYWNrTGlzdEJveH0gZnJvbSAnLi9jb21wb25lbnRzL2F1ZGlvdHJhY2tsaXN0Ym94JztcbmltcG9ydCB7U2V0dGluZ3NQYW5lbEl0ZW19IGZyb20gJy4vY29tcG9uZW50cy9zZXR0aW5nc3BhbmVsaXRlbSc7XG5pbXBvcnQge1NldHRpbmdzUGFuZWxQYWdlfSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbHBhZ2UnO1xuaW1wb3J0IHsgVUlGYWN0b3J5IH0gZnJvbSAnLi91aWZhY3RvcnknO1xuaW1wb3J0IHsgVUlDb25maWcgfSBmcm9tICcuL3VpY29uZmlnJztcbmltcG9ydCB7IFBsYXllckFQSSB9IGZyb20gJ2JpdG1vdmluLXBsYXllcic7XG5cbmV4cG9ydCBuYW1lc3BhY2UgRGVtb0ZhY3Rvcnkge1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9XaXRoU2VwYXJhdGVBdWRpb1N1YnRpdGxlc0J1dHRvbnMocGxheWVyOiBQbGF5ZXJBUEksIGNvbmZpZzogVUlDb25maWcgPSB7fSk6IFVJTWFuYWdlciB7XG4gICAgLy8gc2hvdyBzbWFsbFNjcmVlbiBVSSBvbmx5IG9uIG1vYmlsZS9oYW5kaGVsZCBkZXZpY2VzXG4gICAgbGV0IHNtYWxsU2NyZWVuU3dpdGNoV2lkdGggPSA2MDA7XG5cbiAgICByZXR1cm4gbmV3IFVJTWFuYWdlcihwbGF5ZXIsIFt7XG4gICAgICB1aTogVUlGYWN0b3J5Lm1vZGVyblNtYWxsU2NyZWVuQWRzVUkoKSxcbiAgICAgIGNvbmRpdGlvbjogKGNvbnRleHQ6IFVJQ29uZGl0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICByZXR1cm4gY29udGV4dC5pc01vYmlsZSAmJiBjb250ZXh0LmRvY3VtZW50V2lkdGggPCBzbWFsbFNjcmVlblN3aXRjaFdpZHRoXG4gICAgICAgICAgJiYgY29udGV4dC5pc0FkICYmIGNvbnRleHQuYWRSZXF1aXJlc1VpO1xuICAgICAgfSxcbiAgICB9LCB7XG4gICAgICB1aTogVUlGYWN0b3J5Lm1vZGVybkFkc1VJKCksXG4gICAgICBjb25kaXRpb246IChjb250ZXh0OiBVSUNvbmRpdGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuaXNBZCAmJiBjb250ZXh0LmFkUmVxdWlyZXNVaTtcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgdWk6IFVJRmFjdG9yeS5tb2Rlcm5TbWFsbFNjcmVlblVJKCksXG4gICAgICBjb25kaXRpb246IChjb250ZXh0OiBVSUNvbmRpdGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuaXNNb2JpbGUgJiYgY29udGV4dC5kb2N1bWVudFdpZHRoIDwgc21hbGxTY3JlZW5Td2l0Y2hXaWR0aDtcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgdWk6IG1vZGVyblVJV2l0aFNlcGFyYXRlQXVkaW9TdWJ0aXRsZXNCdXR0b25zKCksXG4gICAgfV0sIGNvbmZpZyk7XG4gIH1cblxuICBmdW5jdGlvbiBtb2Rlcm5VSVdpdGhTZXBhcmF0ZUF1ZGlvU3VidGl0bGVzQnV0dG9ucygpIHtcbiAgICBsZXQgc3VidGl0bGVPdmVybGF5ID0gbmV3IFN1YnRpdGxlT3ZlcmxheSgpO1xuXG4gICAgbGV0IHNldHRpbmdzUGFuZWwgPSBuZXcgU2V0dGluZ3NQYW5lbCh7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsUGFnZSh7XG4gICAgICAgICAgY29tcG9uZW50czogW1xuICAgICAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKCdWaWRlbyBRdWFsaXR5JywgbmV3IFZpZGVvUXVhbGl0eVNlbGVjdEJveCgpKSxcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbSgnU3BlZWQnLCBuZXcgUGxheWJhY2tTcGVlZFNlbGVjdEJveCgpKSxcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbSgnQXVkaW8gUXVhbGl0eScsIG5ldyBBdWRpb1F1YWxpdHlTZWxlY3RCb3goKSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgICAgaGlkZGVuOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgbGV0IHN1YnRpdGxlTGlzdEJveCA9IG5ldyBTdWJ0aXRsZUxpc3RCb3goKTtcbiAgICBsZXQgc3VidGl0bGVTZXR0aW5nc1BhbmVsID0gbmV3IFNldHRpbmdzUGFuZWwoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbFBhZ2Uoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbShudWxsLCBzdWJ0aXRsZUxpc3RCb3gpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGxldCBhdWRpb1RyYWNrTGlzdEJveCA9IG5ldyBBdWRpb1RyYWNrTGlzdEJveCgpO1xuICAgIGxldCBhdWRpb1RyYWNrU2V0dGluZ3NQYW5lbCA9IG5ldyBTZXR0aW5nc1BhbmVsKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgbmV3IFNldHRpbmdzUGFuZWxQYWdlKHtcbiAgICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0obnVsbCwgYXVkaW9UcmFja0xpc3RCb3gpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGxldCBjb250cm9sQmFyID0gbmV3IENvbnRyb2xCYXIoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBhdWRpb1RyYWNrU2V0dGluZ3NQYW5lbCxcbiAgICAgICAgc3VidGl0bGVTZXR0aW5nc1BhbmVsLFxuICAgICAgICBzZXR0aW5nc1BhbmVsLFxuICAgICAgICBuZXcgQ29udGFpbmVyKHtcbiAgICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUGxheWJhY2tUaW1lTGFiZWwoeyB0aW1lTGFiZWxNb2RlOiBQbGF5YmFja1RpbWVMYWJlbE1vZGUuQ3VycmVudFRpbWUsIGhpZGVJbkxpdmVQbGF5YmFjazogdHJ1ZSB9KSxcbiAgICAgICAgICAgIG5ldyBTZWVrQmFyKHsgbGFiZWw6IG5ldyBTZWVrQmFyTGFiZWwoKSB9KSxcbiAgICAgICAgICAgIG5ldyBQbGF5YmFja1RpbWVMYWJlbCh7IHRpbWVMYWJlbE1vZGU6IFBsYXliYWNrVGltZUxhYmVsTW9kZS5Ub3RhbFRpbWUsIGNzc0NsYXNzZXM6IFsndGV4dC1yaWdodCddIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY3NzQ2xhc3NlczogWydjb250cm9sYmFyLXRvcCddLFxuICAgICAgICB9KSxcbiAgICAgICAgbmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgY29tcG9uZW50czogW1xuICAgICAgICAgICAgbmV3IFBsYXliYWNrVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgVm9sdW1lVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgVm9sdW1lU2xpZGVyKCksXG4gICAgICAgICAgICBuZXcgU3BhY2VyKCksXG4gICAgICAgICAgICBuZXcgUGljdHVyZUluUGljdHVyZVRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IEFpclBsYXlUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgIG5ldyBDYXN0VG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgVlJUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nc1RvZ2dsZUJ1dHRvbih7XG4gICAgICAgICAgICAgIHNldHRpbmdzUGFuZWw6IGF1ZGlvVHJhY2tTZXR0aW5nc1BhbmVsLFxuICAgICAgICAgICAgICBjc3NDbGFzczogJ3VpLWF1ZGlvdHJhY2tzZXR0aW5nc3RvZ2dsZWJ1dHRvbicsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nc1RvZ2dsZUJ1dHRvbih7XG4gICAgICAgICAgICAgIHNldHRpbmdzUGFuZWw6IHN1YnRpdGxlU2V0dGluZ3NQYW5lbCxcbiAgICAgICAgICAgICAgY3NzQ2xhc3M6ICd1aS1zdWJ0aXRsZXNldHRpbmdzdG9nZ2xlYnV0dG9uJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IFNldHRpbmdzVG9nZ2xlQnV0dG9uKHsgc2V0dGluZ3NQYW5lbDogc2V0dGluZ3NQYW5lbCB9KSxcbiAgICAgICAgICAgIG5ldyBGdWxsc2NyZWVuVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBjc3NDbGFzc2VzOiBbJ2NvbnRyb2xiYXItYm90dG9tJ10sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgVUlDb250YWluZXIoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBzdWJ0aXRsZU92ZXJsYXksXG4gICAgICAgIG5ldyBCdWZmZXJpbmdPdmVybGF5KCksXG4gICAgICAgIG5ldyBQbGF5YmFja1RvZ2dsZU92ZXJsYXkoKSxcbiAgICAgICAgbmV3IENhc3RTdGF0dXNPdmVybGF5KCksXG4gICAgICAgIGNvbnRyb2xCYXIsXG4gICAgICAgIG5ldyBUaXRsZUJhcigpLFxuICAgICAgICBuZXcgUmVjb21tZW5kYXRpb25PdmVybGF5KCksXG4gICAgICAgIG5ldyBXYXRlcm1hcmsoKSxcbiAgICAgICAgbmV3IEVycm9yTWVzc2FnZU92ZXJsYXkoKSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn0iLCJleHBvcnQgaW50ZXJmYWNlIE9mZnNldCB7XG4gIGxlZnQ6IG51bWJlcjtcbiAgdG9wOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2l6ZSB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENzc1Byb3BlcnRpZXMge1xuICBbcHJvcGVydHlOYW1lOiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbi8qKlxuICogU2ltcGxlIERPTSBtYW5pcHVsYXRpb24gYW5kIERPTSBlbGVtZW50IGV2ZW50IGhhbmRsaW5nIG1vZGVsZWQgYWZ0ZXIgalF1ZXJ5IChhcyByZXBsYWNlbWVudCBmb3IgalF1ZXJ5KS5cbiAqXG4gKiBMaWtlIGpRdWVyeSwgRE9NIG9wZXJhdGVzIG9uIHNpbmdsZSBlbGVtZW50cyBhbmQgbGlzdHMgb2YgZWxlbWVudHMuIEZvciBleGFtcGxlOiBjcmVhdGluZyBhbiBlbGVtZW50IHJldHVybnMgYSBET01cbiAqIGluc3RhbmNlIHdpdGggYSBzaW5nbGUgZWxlbWVudCwgc2VsZWN0aW5nIGVsZW1lbnRzIHJldHVybnMgYSBET00gaW5zdGFuY2Ugd2l0aCB6ZXJvLCBvbmUsIG9yIG1hbnkgZWxlbWVudHMuIFNpbWlsYXJcbiAqIHRvIGpRdWVyeSwgc2V0dGVycyB1c3VhbGx5IGFmZmVjdCBhbGwgZWxlbWVudHMsIHdoaWxlIGdldHRlcnMgb3BlcmF0ZSBvbiBvbmx5IHRoZSBmaXJzdCBlbGVtZW50LlxuICogQWxzbyBzaW1pbGFyIHRvIGpRdWVyeSwgbW9zdCBtZXRob2RzIChleGNlcHQgZ2V0dGVycykgcmV0dXJuIHRoZSBET00gaW5zdGFuY2UgZmFjaWxpdGF0aW5nIGVhc3kgY2hhaW5pbmcgb2YgbWV0aG9kXG4gKiBjYWxscy5cbiAqXG4gKiBCdWlsdCB3aXRoIHRoZSBoZWxwIG9mOiBodHRwOi8veW91bWlnaHRub3RuZWVkanF1ZXJ5LmNvbS9cbiAqL1xuZXhwb3J0IGNsYXNzIERPTSB7XG5cbiAgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgdGhlIGluc3RhbmNlIHdyYXBzLiBUYWtlIGNhcmUgdGhhdCBub3QgYWxsIG1ldGhvZHMgY2FuIG9wZXJhdGUgb24gdGhlIHdob2xlIGxpc3QsXG4gICAqIGdldHRlcnMgdXN1YWxseSBqdXN0IHdvcmsgb24gdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAqL1xuICBwcml2YXRlIGVsZW1lbnRzOiBIVE1MRWxlbWVudFtdO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgRE9NIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB0YWdOYW1lIHRoZSB0YWcgbmFtZSBvZiB0aGUgRE9NIGVsZW1lbnRcbiAgICogQHBhcmFtIGF0dHJpYnV0ZXMgYSBsaXN0IG9mIGF0dHJpYnV0ZXMgb2YgdGhlIGVsZW1lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHRhZ05hbWU6IHN0cmluZywgYXR0cmlidXRlczoge1tuYW1lOiBzdHJpbmddOiBzdHJpbmd9KTtcbiAgLyoqXG4gICAqIFNlbGVjdHMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIERPTSB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gbWF0Y2ggRE9NIGVsZW1lbnRzIHdpdGhcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNlbGVjdG9yOiBzdHJpbmcpO1xuICAvKipcbiAgICogV3JhcHMgYSBwbGFpbiBIVE1MRWxlbWVudCB3aXRoIGEgRE9NIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgSFRNTEVsZW1lbnQgdG8gd3JhcCB3aXRoIERPTVxuICAgKi9cbiAgY29uc3RydWN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQpO1xuICAvKipcbiAgICogV3JhcHMgYSBsaXN0IG9mIHBsYWluIEhUTUxFbGVtZW50cyB3aXRoIGEgRE9NIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gZWxlbWVudHMgdGhlIEhUTUxFbGVtZW50cyB0byB3cmFwIHdpdGggRE9NXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbGVtZW50czogSFRNTEVsZW1lbnRbXSk7XG4gIC8qKlxuICAgKiBXcmFwcyB0aGUgZG9jdW1lbnQgd2l0aCBhIERPTSBpbnN0YW5jZS4gVXNlZnVsIHRvIGF0dGFjaCBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIGRvY3VtZW50LlxuICAgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRvIHdyYXBcbiAgICovXG4gIGNvbnN0cnVjdG9yKGRvY3VtZW50OiBEb2N1bWVudCk7XG4gIGNvbnN0cnVjdG9yKHNvbWV0aGluZzogc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBIVE1MRWxlbWVudFtdIHwgRG9jdW1lbnQsIGF0dHJpYnV0ZXM/OiB7W25hbWU6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7IC8vIFNldCB0aGUgZ2xvYmFsIGRvY3VtZW50IHRvIHRoZSBsb2NhbCBkb2N1bWVudCBmaWVsZFxuXG4gICAgaWYgKHNvbWV0aGluZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBpZiAoc29tZXRoaW5nLmxlbmd0aCA+IDAgJiYgc29tZXRoaW5nWzBdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gc29tZXRoaW5nO1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHNvbWV0aGluZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBsZXQgZWxlbWVudCA9IHNvbWV0aGluZztcbiAgICAgIHRoaXMuZWxlbWVudHMgPSBbZWxlbWVudF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHNvbWV0aGluZyBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICAvLyBXaGVuIGEgZG9jdW1lbnQgaXMgcGFzc2VkIGluLCB3ZSBkbyBub3QgZG8gYW55dGhpbmcgd2l0aCBpdCwgYnV0IGJ5IHNldHRpbmcgdGhpcy5lbGVtZW50cyB0byBudWxsXG4gICAgICAvLyB3ZSBnaXZlIHRoZSBldmVudCBoYW5kbGluZyBtZXRob2QgYSBtZWFucyB0byBkZXRlY3QgaWYgdGhlIGV2ZW50cyBzaG91bGQgYmUgcmVnaXN0ZXJlZCBvbiB0aGUgZG9jdW1lbnRcbiAgICAgIC8vIGluc3RlYWQgb2YgZWxlbWVudHMuXG4gICAgICB0aGlzLmVsZW1lbnRzID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXR0cmlidXRlcykge1xuICAgICAgbGV0IHRhZ05hbWUgPSBzb21ldGhpbmc7XG4gICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG5cbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBsZXQgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVsZW1lbnRzID0gW2VsZW1lbnRdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxldCBzZWxlY3RvciA9IHNvbWV0aGluZztcbiAgICAgIHRoaXMuZWxlbWVudHMgPSB0aGlzLmZpbmRDaGlsZEVsZW1lbnRzKHNlbGVjdG9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgdGhpcyBET00gaW5zdGFuY2UgY3VycmVudGx5IGhvbGRzLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzXG4gICAqL1xuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHMgPyB0aGlzLmVsZW1lbnRzLmxlbmd0aCA6IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgSFRNTCBlbGVtZW50cyB0aGF0IHRoaXMgRE9NIGluc3RhbmNlIGN1cnJlbnRseSBob2xkcy5cbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50W119IHRoZSByYXcgSFRNTCBlbGVtZW50c1xuICAgKi9cbiAgZ2V0KCk6IEhUTUxFbGVtZW50W107XG4gIC8qKlxuICAgKiBHZXRzIGFuIEhUTUwgZWxlbWVudCBmcm9tIHRoZSBsaXN0IGVsZW1lbnRzIHRoYXQgdGhpcyBET00gaW5zdGFuY2UgY3VycmVudGx5IGhvbGRzLlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHplcm8tYmFzZWQgaW5kZXggaW50byB0aGUgZWxlbWVudCBsaXN0LiBDYW4gYmUgbmVnYXRpdmUgdG8gcmV0dXJuIGFuIGVsZW1lbnQgZnJvbSB0aGUgZW5kLFxuICAgKiAgICBlLmcuIC0xIHJldHVybnMgdGhlIGxhc3QgZWxlbWVudC5cbiAgICovXG4gIGdldChpbmRleDogbnVtYmVyKTogSFRNTEVsZW1lbnQ7XG4gIGdldChpbmRleD86IG51bWJlcik6IEhUTUxFbGVtZW50IHwgSFRNTEVsZW1lbnRbXSB7XG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuZWxlbWVudHMgfHwgaW5kZXggPj0gdGhpcy5lbGVtZW50cy5sZW5ndGggfHwgaW5kZXggPCAtdGhpcy5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzW3RoaXMuZWxlbWVudHMubGVuZ3RoIC0gaW5kZXhdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50c1tpbmRleF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc2hvcnRjdXQgbWV0aG9kIGZvciBpdGVyYXRpbmcgYWxsIGVsZW1lbnRzLiBTaG9ydHMgdGhpcy5lbGVtZW50cy5mb3JFYWNoKC4uLikgdG8gdGhpcy5mb3JFYWNoKC4uLikuXG4gICAqIEBwYXJhbSBoYW5kbGVyIHRoZSBoYW5kbGVyIHRvIGV4ZWN1dGUgYW4gb3BlcmF0aW9uIG9uIGFuIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgZm9yRWFjaChoYW5kbGVyOiAoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBoYW5kbGVyKGVsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQ2hpbGRFbGVtZW50c09mRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCB8IERvY3VtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgbGV0IGNoaWxkRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuXG4gICAgLy8gQ29udmVydCBOb2RlTGlzdCB0byBBcnJheVxuICAgIC8vIGh0dHBzOi8vdG9kZG1vdHRvLmNvbS9hLWNvbXByZWhlbnNpdmUtZGl2ZS1pbnRvLW5vZGVsaXN0cy1hcnJheXMtY29udmVydGluZy1ub2RlbGlzdHMtYW5kLXVuZGVyc3RhbmRpbmctdGhlLWRvbS9cbiAgICByZXR1cm4gW10uc2xpY2UuY2FsbChjaGlsZEVsZW1lbnRzKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZENoaWxkRWxlbWVudHMoc2VsZWN0b3I6IHN0cmluZyk6IEhUTUxFbGVtZW50W10ge1xuICAgIGxldCBhbGxDaGlsZEVsZW1lbnRzID0gPEhUTUxFbGVtZW50W10+W107XG5cbiAgICBpZiAodGhpcy5lbGVtZW50cykge1xuICAgICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGFsbENoaWxkRWxlbWVudHMgPSBhbGxDaGlsZEVsZW1lbnRzLmNvbmNhdCh0aGlzLmZpbmRDaGlsZEVsZW1lbnRzT2ZFbGVtZW50KGVsZW1lbnQsIHNlbGVjdG9yKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kQ2hpbGRFbGVtZW50c09mRWxlbWVudChkb2N1bWVudCwgc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIHJldHVybiBhbGxDaGlsZEVsZW1lbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBjaGlsZCBlbGVtZW50cyBvZiBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHN1cHBsaWVkIHNlbGVjdG9yLlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIG1hdGNoIHdpdGggY2hpbGQgZWxlbWVudHNcbiAgICogQHJldHVybnMge0RPTX0gYSBuZXcgRE9NIGluc3RhbmNlIHJlcHJlc2VudGluZyBhbGwgbWF0Y2hlZCBjaGlsZHJlblxuICAgKi9cbiAgZmluZChzZWxlY3Rvcjogc3RyaW5nKTogRE9NIHtcbiAgICBsZXQgYWxsQ2hpbGRFbGVtZW50cyA9IHRoaXMuZmluZENoaWxkRWxlbWVudHMoc2VsZWN0b3IpO1xuICAgIHJldHVybiBuZXcgRE9NKGFsbENoaWxkRWxlbWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzZXMgdG8gdGhlIGZpcnN0IGlucHV0IGVsZW1lbnRcbiAgICovXG4gIGZvY3VzVG9GaXJzdElucHV0KCkge1xuICAgIGNvbnN0IGlucHV0RWxlbWVudHMgPSB0aGlzLmZpbmRDaGlsZEVsZW1lbnRzKCdidXR0b24sIFtocmVmXSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIFt0YWJpbmRleF06bm90KFt0YWJpbmRleD1cIi0xXCJdKScpO1xuXG4gICAgaWYgKGlucHV0RWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgaW5wdXRFbGVtZW50c1swXS5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VzIHRvIHRoZSBmaXJzdCBpbnB1dCBlbGVtZW50XG4gICAqL1xuICBzY3JvbGxUbyh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIHRoaXMuZWxlbWVudHNbMF0uc2Nyb2xsVG8oeCwgeSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZyBvZiB0aGUgaW5uZXIgSFRNTCBjb250ZW50IG9mIHRoZSBmaXJzdCBlbGVtZW50LlxuICAgKi9cbiAgaHRtbCgpOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbm5lciBIVE1MIGNvbnRlbnQgb2YgYWxsIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gY29udGVudCBhIHN0cmluZyBvZiBwbGFpbiB0ZXh0IG9yIEhUTUwgbWFya3VwXG4gICAqL1xuICBodG1sKGNvbnRlbnQ6IHN0cmluZyk6IERPTTtcbiAgaHRtbChjb250ZW50Pzogc3RyaW5nKTogc3RyaW5nIHwgRE9NIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnNldEh0bWwoY29udGVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0SHRtbCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0SHRtbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50c1swXS5pbm5lckhUTUw7XG4gIH1cblxuICBwcml2YXRlIHNldEh0bWwoY29udGVudDogc3RyaW5nKTogRE9NIHtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGNvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgLy8gU2V0IHRvIGVtcHR5IHN0cmluZyB0byBhdm9pZCBpbm5lckhUTUwgZ2V0dGluZyBzZXQgdG8gJ3VuZGVmaW5lZCcgKGFsbCBicm93c2Vycykgb3IgJ251bGwnIChJRTkpXG4gICAgICBjb250ZW50ID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGlubmVyIEhUTUwgb2YgYWxsIGVsZW1lbnRzIChkZWxldGVzIGFsbCBjaGlsZHJlbikuXG4gICAqIEByZXR1cm5zIHtET019XG4gICAqL1xuICBlbXB0eSgpOiBET00ge1xuICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmaXJzdCBmb3JtIGVsZW1lbnQsIGUuZy4gdGhlIHNlbGVjdGVkIHZhbHVlIG9mIGEgc2VsZWN0IGJveCBvciB0aGUgdGV4dCBpZiBhblxuICAgKiBpbnB1dCBmaWVsZC5cbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHZhbHVlIG9mIGEgZm9ybSBlbGVtZW50XG4gICAqL1xuICB2YWwoKTogc3RyaW5nIHtcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuZWxlbWVudHNbMF07XG5cbiAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyBUT0RPIGFkZCBzdXBwb3J0IGZvciBtaXNzaW5nIGZvcm0gZWxlbWVudHNcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdmFsKCkgbm90IHN1cHBvcnRlZCBmb3IgJHt0eXBlb2YgZWxlbWVudH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIG9uIHRoZSBmaXJzdCBlbGVtZW50LlxuICAgKiBAcGFyYW0gYXR0cmlidXRlXG4gICAqL1xuICBhdHRyKGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIFNldHMgYW4gYXR0cmlidXRlIG9uIGFsbCBlbGVtZW50cy5cbiAgICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZVxuICAgKi9cbiAgYXR0cihhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IERPTTtcbiAgYXR0cihhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHwgRE9NIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldEF0dHIoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cihhdHRyaWJ1dGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBhdHRyaWJ1dGVcbiAgICovXG4gIHJlbW92ZUF0dHIoYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEF0dHIoYXR0cmlidXRlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QXR0cihhdHRyaWJ1dGU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IERPTSB7XG4gICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGRhdGEgZWxlbWVudCBvbiB0aGUgZmlyc3QgZWxlbWVudC5cbiAgICogQHBhcmFtIGRhdGFBdHRyaWJ1dGUgdGhlIG5hbWUgb2YgdGhlIGRhdGEgYXR0cmlidXRlIHdpdGhvdXQgdGhlICdkYXRhLScgcHJlZml4XG4gICAqL1xuICBkYXRhKGRhdGFBdHRyaWJ1dGU6IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiBTZXRzIGEgZGF0YSBhdHRyaWJ1dGUgb24gYWxsIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gZGF0YUF0dHJpYnV0ZSB0aGUgbmFtZSBvZiB0aGUgZGF0YSBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgJ2RhdGEtJyBwcmVmaXhcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBhdHRyaWJ1dGVcbiAgICovXG4gIGRhdGEoZGF0YUF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogRE9NO1xuICBkYXRhKGRhdGFBdHRyaWJ1dGU6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHwgRE9NIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldERhdGEoZGF0YUF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldERhdGEoZGF0YUF0dHJpYnV0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhKGRhdGFBdHRyaWJ1dGU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzWzBdLmdldEF0dHJpYnV0ZSgnZGF0YS0nICsgZGF0YUF0dHJpYnV0ZSk7XG4gIH1cblxuICBwcml2YXRlIHNldERhdGEoZGF0YUF0dHJpYnV0ZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogRE9NIHtcbiAgICB0aGlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLScgKyBkYXRhQXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBvbmUgb3IgbW9yZSBET00gZWxlbWVudHMgYXMgY2hpbGRyZW4gdG8gYWxsIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gY2hpbGRFbGVtZW50cyB0aGUgY2hyaWxkIGVsZW1lbnRzIHRvIGFwcGVuZFxuICAgKiBAcmV0dXJucyB7RE9NfVxuICAgKi9cbiAgYXBwZW5kKC4uLmNoaWxkRWxlbWVudHM6IERPTVtdKTogRE9NIHtcbiAgICB0aGlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGNoaWxkRWxlbWVudHMuZm9yRWFjaCgoY2hpbGRFbGVtZW50KSA9PiB7XG4gICAgICAgIGNoaWxkRWxlbWVudC5lbGVtZW50cy5mb3JFYWNoKChfLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGVtZW50LmVsZW1lbnRzW2luZGV4XSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGUgRE9NLlxuICAgKi9cbiAgcmVtb3ZlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgbGV0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBkb2N1bWVudCdzIHRvcCBsZWZ0IGNvcm5lci5cbiAgICogQHJldHVybnMge09mZnNldH1cbiAgICovXG4gIG9mZnNldCgpOiBPZmZzZXQge1xuICAgIGxldCBlbGVtZW50ID0gdGhpcy5lbGVtZW50c1swXTtcbiAgICBsZXQgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBodG1sUmVjdCA9IGRvY3VtZW50LmJvZHkucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIC8vIFZpcnR1YWwgdmlld3BvcnQgc2Nyb2xsIGhhbmRsaW5nIChlLmcuIHBpbmNoIHpvb21lZCB2aWV3cG9ydHMgaW4gbW9iaWxlIGJyb3dzZXJzIG9yIGRlc2t0b3AgQ2hyb21lL0VkZ2UpXG4gICAgLy8gJ25vcm1hbCcgem9vbXMgYW5kIHZpcnR1YWwgdmlld3BvcnQgem9vbXMgKGFrYSBsYXlvdXQgdmlld3BvcnQpIHJlc3VsdCBpbiBkaWZmZXJlbnRcbiAgICAvLyBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHJlc3VsdHM6XG4gICAgLy8gIC0gd2l0aCBub3JtYWwgc2Nyb2xscywgdGhlIGNsaWVudFJlY3QgZGVjcmVhc2VzIHdpdGggYW4gaW5jcmVhc2UgaW4gc2Nyb2xsKFRvcHxMZWZ0KS9wYWdlKFh8WSlPZmZzZXRcbiAgICAvLyAgLSB3aXRoIHBpbmNoIHpvb20gc2Nyb2xscywgdGhlIGNsaWVudFJlY3Qgc3RheXMgdGhlIHNhbWUgd2hpbGUgc2Nyb2xsL3BhZ2VPZmZzZXQgY2hhbmdlc1xuICAgIC8vIFRoaXMgbWVhbnMsIHRoYXQgdGhlIGNvbWJpbmF0aW9uIG9mIGNsaWVudFJlY3QgKyBzY3JvbGwvcGFnZU9mZnNldCBkb2VzIG5vdCB3b3JrIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0XG4gICAgLy8gZnJvbSB0aGUgZG9jdW1lbnQncyB1cHBlciBsZWZ0IG9yaWdpbiB3aGVuIHBpbmNoIHpvb20gaXMgdXNlZC5cbiAgICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlLCB3ZSBkbyBub3QgdXNlIHNjcm9sbC9wYWdlT2Zmc2V0IGJ1dCBnZXQgdGhlIGNsaWVudFJlY3Qgb2YgdGhlIGh0bWwgZWxlbWVudCBhbmRcbiAgICAvLyBzdWJ0cmFjdCBpdCBmcm9tIHRoZSBlbGVtZW50J3MgcmVjdCwgd2hpY2ggYWx3YXlzIHJlc3VsdHMgaW4gdGhlIG9mZnNldCBmcm9tIHRoZSBkb2N1bWVudCBvcmlnaW4uXG4gICAgLy8gTk9URTogdGhlIGN1cnJlbnQgd2F5IG9mIG9mZnNldCBjYWxjdWxhdGlvbiB3YXMgaW1wbGVtZW50ZWQgc3BlY2lmaWNhbGx5IHRvIHRyYWNrIGV2ZW50IHBvc2l0aW9ucyBvbiB0aGVcbiAgICAvLyBzZWVrIGJhciwgYW5kIGl0IG1pZ2h0IGJyZWFrIGNvbXBhdGliaWxpdHkgd2l0aCBqUXVlcnkncyBvZmZzZXQoKSBtZXRob2QuIElmIHRoaXMgZXZlciB0dXJucyBvdXQgdG8gYmUgYVxuICAgIC8vIHByb2JsZW0sIHRoaXMgbWV0aG9kIHNob3VsZCBiZSByZXZlcnRlZCB0byB0aGUgb2xkIHZlcnNpb24gYW5kIHRoZSBvZmZzZXQgY2FsY3VsYXRpb24gbW92ZWQgdG8gdGhlIHNlZWsgYmFyLlxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcDogZWxlbWVudFJlY3QudG9wIC0gaHRtbFJlY3QudG9wLFxuICAgICAgbGVmdDogZWxlbWVudFJlY3QubGVmdCAtIGh0bWxSZWN0LmxlZnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgZWxlbWVudC5cbiAgICogQHJldHVybnMge251bWJlcn0gdGhlIHdpZHRoIG9mIHRoZSBmaXJzdCBlbGVtZW50XG4gICAqL1xuICB3aWR0aCgpOiBudW1iZXIge1xuICAgIC8vIFRPRE8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgc2FtZSBhcyBqUXVlcnkncyB3aWR0aCgpIChwcm9iYWJseSBub3QpXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbMF0ub2Zmc2V0V2lkdGg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSBmaXJzdCBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSB0aGUgaGVpZ2h0IG9mIHRoZSBmaXJzdCBlbGVtZW50XG4gICAqL1xuICBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICAvLyBUT0RPIGNoZWNrIGlmIHRoaXMgaXMgdGhlIHNhbWUgYXMgalF1ZXJ5J3MgaGVpZ2h0KCkgKHByb2JhYmx5IG5vdClcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50c1swXS5vZmZzZXRIZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgZWxlbWVudC5cbiAgICogQHJldHVybiB7U2l6ZX0gdGhlIHNpemUgb2YgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICovXG4gIHNpemUoKTogU2l6ZSB7XG4gICAgcmV0dXJuIHsgd2lkdGg6IHRoaXMud2lkdGgoKSwgaGVpZ2h0OiB0aGlzLmhlaWdodCgpIH07XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgYW4gZXZlbnQgaGFuZGxlciB0byBvbmUgb3IgbW9yZSBldmVudHMgb24gYWxsIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIHRoZSBldmVudCBuYW1lIChvciBtdWx0aXBsZSBuYW1lcyBzZXBhcmF0ZWQgYnkgc3BhY2UpIHRvIGxpc3RlbiB0b1xuICAgKiBAcGFyYW0gZXZlbnRIYW5kbGVyIHRoZSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgZmlyZXNcbiAgICogQHJldHVybnMge0RPTX1cbiAgICovXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBldmVudEhhbmRsZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QpOiBET00ge1xuICAgIGxldCBldmVudHMgPSBldmVudE5hbWUuc3BsaXQoJyAnKTtcblxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZWxlbWVudHMgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGV2ZW50SGFuZGxlcik7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBldmVudEhhbmRsZXIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgaGFuZGxlciBmcm9tIG9uZSBvciBtb3JlIGV2ZW50cyBvbiBhbGwgZWxlbWVudHMuXG4gICAqIEBwYXJhbSBldmVudE5hbWUgdGhlIGV2ZW50IG5hbWUgKG9yIG11bHRpcGxlIG5hbWVzIHNlcGFyYXRlZCBieSBzcGFjZSkgdG8gcmVtb3ZlIHRoZSBoYW5kbGVyIGZyb21cbiAgICogQHBhcmFtIGV2ZW50SGFuZGxlciB0aGUgZXZlbnQgaGFuZGxlciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0RPTX1cbiAgICovXG4gIG9mZihldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0KTogRE9NIHtcbiAgICBsZXQgZXZlbnRzID0gZXZlbnROYW1lLnNwbGl0KCcgJyk7XG5cbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBldmVudEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgZXZlbnRIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgY2xhc3MoZXMpIHRvIGFsbCBlbGVtZW50cy5cbiAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3MoZXMpIHRvIGFkZCwgbXVsdGlwbGUgY2xhc3NlcyBzZXBhcmF0ZWQgYnkgc3BhY2VcbiAgICogQHJldHVybnMge0RPTX1cbiAgICovXG4gIGFkZENsYXNzKGNsYXNzTmFtZTogc3RyaW5nKTogRE9NIHtcbiAgICB0aGlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3NOYW1lLnNwbGl0KCcgJylcbiAgICAgICAgICAuZmlsdGVyKGNsYXNzTmFtZSA9PiBjbGFzc05hbWUubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgaWYgKGNsYXNzTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5jbGFzc05hbWVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9ICcgJyArIGNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZWQgdGhlIHNwZWNpZmllZCBjbGFzcyhlcykgZnJvbSBhbGwgZWxlbWVudHMuXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGNsYXNzKGVzKSB0byByZW1vdmUsIG11bHRpcGxlIGNsYXNzZXMgc2VwYXJhdGVkIGJ5IHNwYWNlXG4gICAqIEByZXR1cm5zIHtET019XG4gICAqL1xuICByZW1vdmVDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IERPTSB7XG4gICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzTmFtZS5zcGxpdCgnICcpXG4gICAgICAgICAgLmZpbHRlcihjbGFzc05hbWUgPT4gY2xhc3NOYW1lLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIGlmIChjbGFzc05hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3NOYW1lcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoXG4gICAgICAgICAgbmV3IFJlZ0V4cCgnKF58XFxcXGIpJyArIGNsYXNzTmFtZS5zcGxpdCgnICcpLmpvaW4oJ3wnKSArICcoXFxcXGJ8JCknLCAnZ2knKSwgJyAnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIGhhcyB0aGUgc3BlY2lmaWVkIGNsYXNzLlxuICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBjbGFzcyBuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIG9uZSBvZiB0aGUgZWxlbWVudHMgaGFzIHRoZSBjbGFzcyBhdHRhY2hlZCwgZWxzZSBpZiBubyBlbGVtZW50IGhhcyBpdCBhdHRhY2hlZFxuICAgKi9cbiAgaGFzQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgaGFzQ2xhc3MgPSBmYWxzZTtcblxuICAgIHRoaXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIGluc2lkZSBhIGhhbmRsZXIsIHdlIGNhbid0IGp1c3QgJ3JldHVybiB0cnVlJy4gSW5zdGVhZCwgd2Ugc2F2ZSBpdCB0byBhIHZhcmlhYmxlXG4gICAgICAgICAgLy8gYW5kIHJldHVybiBpdCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiBib2R5LlxuICAgICAgICAgIGhhc0NsYXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChuZXcgUmVnRXhwKCcoXnwgKScgKyBjbGFzc05hbWUgKyAnKCB8JCknLCAnZ2knKS50ZXN0KGVsZW1lbnQuY2xhc3NOYW1lKSkge1xuICAgICAgICAgIC8vIFNlZSBjb21tZW50IGFib3ZlXG4gICAgICAgICAgaGFzQ2xhc3MgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGFzQ2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBDU1MgcHJvcGVydHkgb2YgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2ZcbiAgICovXG4gIGNzcyhwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIENTUyBwcm9wZXJ0eSBvbiBhbGwgZWxlbWVudHMuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eSB0byBzZXQgdGhlIHZhbHVlIGZvclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGdpdmVuIENTUyBwcm9wZXJ0eVxuICAgKi9cbiAgY3NzKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogRE9NO1xuICAvKipcbiAgICogU2V0cyBhIGNvbGxlY3Rpb24gb2YgQ1NTIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcyBvbiBhbGwgZWxlbWVudHMuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlQ29sbGVjdGlvbiBhbiBvYmplY3QgY29udGFpbmluZyBwYWlycyBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgdGhlaXIgdmFsdWVzXG4gICAqL1xuICBjc3MocHJvcGVydHlWYWx1ZUNvbGxlY3Rpb246IENzc1Byb3BlcnRpZXMpOiBET007XG4gIGNzcyhwcm9wZXJ0eU5hbWVPckNvbGxlY3Rpb246IHN0cmluZyB8IENzc1Byb3BlcnRpZXMsIHZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IERPTSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0eU5hbWVPckNvbGxlY3Rpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lT3JDb2xsZWN0aW9uO1xuXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRDc3MocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3NzKHByb3BlcnR5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbGV0IHByb3BlcnR5VmFsdWVDb2xsZWN0aW9uID0gcHJvcGVydHlOYW1lT3JDb2xsZWN0aW9uO1xuICAgICAgcmV0dXJuIHRoaXMuc2V0Q3NzQ29sbGVjdGlvbihwcm9wZXJ0eVZhbHVlQ29sbGVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDc3MocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnRzWzBdKVs8YW55PnByb3BlcnR5TmFtZV07XG4gIH1cblxuICBwcml2YXRlIHNldENzcyhwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IERPTSB7XG4gICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAvLyA8YW55PiBjYXN0IHRvIHJlc29sdmUgVFM3MDE1OiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNjYyNzExNC8zNzAyNTJcbiAgICAgIGVsZW1lbnQuc3R5bGVbPGFueT5wcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIHNldENzc0NvbGxlY3Rpb24ocnVsZVZhbHVlQ29sbGVjdGlvbjoge1tydWxlTmFtZTogc3RyaW5nXTogc3RyaW5nfSk6IERPTSB7XG4gICAgdGhpcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDQ5MDU3My8zNzAyNTJcbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgcnVsZVZhbHVlQ29sbGVjdGlvbik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiaW1wb3J0IHtFcnJvck1lc3NhZ2VNYXAsIEVycm9yTWVzc2FnZVRyYW5zbGF0b3J9IGZyb20gJy4vY29tcG9uZW50cy9lcnJvcm1lc3NhZ2VvdmVybGF5JztcbmltcG9ydCB7IEVycm9yRXZlbnQgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgTW9iaWxlVjNQbGF5ZXJFcnJvckV2ZW50LCBNb2JpbGVWM1NvdXJjZUVycm9yRXZlbnQgfSBmcm9tICcuL21vYmlsZXYzcGxheWVyYXBpJztcblxuZXhwb3J0IG5hbWVzcGFjZSBFcnJvclV0aWxzIHtcblxuICBleHBvcnQgY29uc3QgZGVmYXVsdEVycm9yTWVzc2FnZXM6IEVycm9yTWVzc2FnZU1hcCA9IHtcbiAgICAxMDAwOiAnRXJyb3IgaXMgdW5rbm93bicsXG4gICAgMTAwMTogJ1RoZSBwbGF5ZXIgQVBJIGlzIG5vdCBhdmFpbGFibGUgYWZ0ZXIgYSBjYWxsIHRvIFBsYXllckFQSS5kZXN0cm95LicsXG4gICAgMTEwMDogJ0dlbmVyYWwgc2V0dXAgZXJyb3InLFxuICAgIDExMDE6ICdUaGVyZSB3YXMgYW4gZXJyb3Igd2hlbiBpbnNlcnRpbmcgdGhlIEhUTUwgdmlkZW8gZWxlbWVudCcsXG4gICAgMTEwMjogJ05vIGNvbmZpZ3VyYXRpb24gd2FzIHByb3ZpZGVkJyxcbiAgICAxMTAzOiAnVGhlIGxpY2Vuc2UgaXMgbm90IHZhbGlkJyxcbiAgICAxMTA0OiAnVGhlIHRoZSBkb21haW4tbG9ja2VkIHBsYXllciBpcyBub3QgYXV0aG9yaXplZCB0byBwbGF5YmFjayBvbiB0aGlzIGRvbWFpbicsXG4gICAgMTEwNTogJ1RoZSBkb21haW4gaXMgbm90IGFsbG93bGlzdGVkJyxcbiAgICAxMTA2OiAnVGhlIGxpY2Vuc2Ugc2VydmVyIFVSTCBpcyBpbnZhbGlkJyxcbiAgICAxMTA3OiAnVGhlIGltcHJlc3Npb24gc2VydmVyIFVSTCBpcyBpbnZhbGlkJyxcbiAgICAxMTA4OiAnQ291bGQgbm90IGluaXRpYWxpemUgYSByZW5kZXJpbmcgZW5naW5lJyxcbiAgICAxMTA5OiAnVGhlIHVzZWQgZmxhc2ggdmVyc2lvbiBkb2VzIG5vdCBzdXBwb3J0IHBsYXliYWNrJyxcbiAgICAxMTEwOiAnTmF0aXZlIEZsYXNoIGlzIG5vdCBhdXRob3JpemVkIGJ5IGEgdmFsaWQgQWRvYmUgdG9rZW4nLFxuICAgIDExMTE6ICdGbGFzaCBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IHJlc291cmNlcycsXG4gICAgMTExMjogJ0ZsYXNoIGNvbnRhaW5lciBBUEkgbm90IGF2YWlsYWJsZScsXG4gICAgMTExMzogJ1Byb3RvY29sIG5vdCBzdXBwb3J0ZWQuIFRoaXMgc2l0ZSBoYXMgYmVlbiBsb2FkZWQgdXNpbmcgXCJmaWxlXCIgcHJvdG9jb2wsIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoaXMgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIGxvYWQgdGhlIHBhZ2UgdXNpbmcgYSB3ZWIgc2VydmVyICh1c2luZyBodHRwIG9yIGh0dHBzKScsXG4gICAgMTIwMDogJ0dlbmVyYWwgc291cmNlIGVycm9yJyxcbiAgICAxMjAxOiAnTm8gdmFsaWQgc291cmNlIHdhcyBwcm92aWRlZCcsXG4gICAgMTIwMjogJ1RoZSBkb3dubG9hZGVkIG1hbmlmZXN0IGlzIGludmFsaWQnLFxuICAgIDEyMDM6ICdUaGVyZSB3YXMgbm8gdGVjaG5vbG9neSBkZXRlY3RlZCB0byBwbGF5YmFjayB0aGUgcHJvdmlkZWQgc291cmNlJyxcbiAgICAxMjA0OiAnVGhlIHN0cmVhbSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQnLFxuICAgIDEyMDU6ICdUaGUgZm9yY2VkIHRlY2hub2xvZ3kgaXMgbm90IHN1cHBvcnRlZCcsXG4gICAgMTIwNjogJ05vIHN0cmVhbSBmb3VuZCBmb3Igc3VwcG9ydGVkIHRlY2hub2xvZ2llcy4nLFxuICAgIDEyMDc6ICdUaGUgZG93bmxvYWRlZCBzZWdtZW50IGlzIGVtcHR5JyxcbiAgICAxMjA4OiAnVGhlIG1hbmlmZXN0IGNvdWxkIG5vdCBiZSBsb2FkZWQnLFxuICAgIDEyMDk6ICdQcm9ncmVzc2l2ZSBzdHJlYW0gdHlwZSBub3Qgc3VwcG9ydGVkIG9yIHRoZSBzdHJlYW0gaGFzIGFuIGVycm9yJyxcbiAgICAxMjEwOiAnSExTIHN0cmVhbSBoYXMgYW4gZXJyb3InLFxuICAgIDEyMTE6ICdUaGUgZW5jcnlwdGlvbiBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCcsXG4gICAgMTMwMDogJ0dlbmVyYWwgcGxheWJhY2sgZXJyb3InLFxuICAgIDEzMDE6ICdWaWRlbyBkZWNvZGVyIG9yIGRlbXV4ZXIgaGFkIGFuIGVycm9yIHdpdGggdGhlIGNvbnRlbnQnLFxuICAgIDEzMDI6ICdHZW5lcmFsIGVycm9yIGlmIEZsYXNoIHJlbmRlcmVyIGhhcyBhbiBlcnJvcicsXG4gICAgMTMwMzogJ0ZsYXNoIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgcmVzb3VyY2VzJyxcbiAgICAxMzA0OiAnVGhlIHRyYW5zbXV4ZXIgY291bGQgbm90IGJlIGluaXRpYWxpemVkJyxcbiAgICAxNDAwOiAnTmV0d29yayBlcnJvciB3aGlsZSBkb3dubG9hZGluZycsXG4gICAgMTQwMTogJ1RoZSBtYW5pZmVzdCBkb3dubG9hZCB0aW1lZCBvdXQnLFxuICAgIDE0MDI6ICdUaGUgc2VnbWVudCBkb3dubG9hZCB0aW1lZCBvdXQnLFxuICAgIDE0MDM6ICdUaGUgcHJvZ3Jlc3NpdmUgc3RyZWFtIGRvd25sb2FkIHRpbWVkIG91dCcsXG4gICAgMTQwNDogJ1RoZSBDZXJ0aWZpY2F0ZSBjb3VsZCBub3QgYmUgbG9hZGVkJyxcbiAgICAyMDAwOiAnR2VuZXJhbCBEUk0gZXJyb3InLFxuICAgIDIwMDE6ICdSZXF1aXJlZCBEUk0gY29uZmlndXJhdGlvbiBpcyBtaXNzaW5nJyxcbiAgICAyMDAyOiAnVGhlIGxpY2Vuc2luZyBzZXJ2ZXIgVVJMIGlzIG1pc3NpbmcnLFxuICAgIDIwMDM6ICdMaWNlbnNlIHJlcXVlc3QgZmFpbGVkJyxcbiAgICAyMDA0OiAnS2V5IG9yIEtleUlkIGlzIG1pc3NpbmcnLFxuICAgIDIwMDU6ICdLZXkgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkJyxcbiAgICAyMDA2OiAnVW5hYmxlIHRvIGluc3RhbnRpYXRlIGEga2V5IHN5c3RlbSBzdXBwb3J0aW5nIHRoZSByZXF1aXJlZCBjb21iaW5hdGlvbnMnLFxuICAgIDIwMDc6ICdVbmFibGUgdG8gY3JlYXRlIG9yIGluaXRpYWxpemUga2V5IHNlc3Npb24nLFxuICAgIDIwMDg6ICdUaGUgTWVkaWFLZXkgb2JqZWN0IGNvdWxkIG5vdCBiZSBjcmVhdGVkL2luaXRpYWxpemVkJyxcbiAgICAyMDA5OiAnS2V5IGVycm9yJyxcbiAgICAyMDEwOiAnVGhlIGtleSBzeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCcsXG4gICAgMjAxMTogJ1RoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQnLFxuICAgIDIwMTI6ICdJbnZhbGlkIGhlYWRlciBrZXkvdmFsdWUgcGFpciBmb3IgUGxheVJlYWR5IGxpY2Vuc2UgcmVxdWVzdCcsXG4gICAgMjAxMzogJ0NvbnRlbnQgY2Fubm90IGJlIHBsYXllZCBiYWNrIGJlY2F1c2UgdGhlIG91dHB1dCBpcyByZXN0cmljdGVkIG9uIHRoaXMgbWFjaGluZScsXG4gICAgMjAxNDogJ0RSTSBlcnJvciBmb3IgdGhlIEZsYXNoIHJlbmRlcmVyJyxcbiAgICAyMTAwOiAnR2VuZXJhbCBWUiBlcnJvcicsXG4gICAgMjEwMTogJ1BsYXllciB0ZWNobm9sb2d5IG5vdCBjb21wYXRpYmxlIHdpdGggVlIgcGxheWJhY2snLFxuICAgIDMwMDA6ICdHZW5lcmFsIG1vZHVsZSBlcnJvcicsXG4gICAgMzAwMTogJ1RoZSBkZWZpbml0aW9uIG9mIHRoZSBtb2R1bGUgaXMgaW52YWxpZCAoZS5nLiBpbmNvbXBsZXRlKS4nLFxuICAgIDMwMDI6ICdUaGUgbW9kdWxlIGRlZmluaXRpb24gc3BlY2lmaWVzIGRlcGVuZGVuY2llcyBidXQgdGhlIG1vZHVsZSBpcyBub3QgcHJvdmlkZWQgdmlhIGEgZnVuY3Rpb24gZm9yIGRlZmVycmVkIGxvYWRpbmcuJyxcbiAgICAzMDAzOiAnQSBtb2R1bGUgY2Fubm90IGJlIGxvYWRlZCBiZWNhdXNlIGl0IGhhcyBub3QgYmVlbiBhZGRlZCB0byB0aGUgcGxheWVyIGNvcmUuJyxcbiAgICAzMDA0OiAnQSBtb2R1bGUgY2Fubm90IGJlIGxvYWRlZCBiZWNhdXNlIG9uZSBvciBtb3JlIGRlcGVuZGVuY2llcyBhcmUgbWlzc2luZy4nLFxuICAgIDMxMDA6ICdBbiBBZHZlcnRpc2luZyBtb2R1bGUgZXJyb3IgaGFzIG9jY3VycmVkLiBSZWZlciB0byB0aGUgYXR0YWNoZWQgQWR2ZXJ0aXNpbmdFcnJvci4nLFxuICB9O1xuXG4gIGV4cG9ydCBjb25zdCBkZWZhdWx0TW9iaWxlVjNFcnJvck1lc3NhZ2VUcmFuc2xhdG9yID0gKGVycm9yOiBNb2JpbGVWM1BsYXllckVycm9yRXZlbnQgfCBNb2JpbGVWM1NvdXJjZUVycm9yRXZlbnQpID0+IHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZTtcbiAgfTtcblxuICBleHBvcnQgY29uc3QgZGVmYXVsdFdlYkVycm9yTWVzc2FnZVRyYW5zbGF0b3I6IEVycm9yTWVzc2FnZVRyYW5zbGF0b3IgPSAoZXJyb3I6IEVycm9yRXZlbnQpID0+IHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBFcnJvclV0aWxzLmRlZmF1bHRFcnJvck1lc3NhZ2VzW2Vycm9yLmNvZGVdO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgLy8gVXNlIHRoZSBlcnJvciBtZXNzYWdlIHRleHQgaWYgdGhlcmUgaXMgb25lXG4gICAgICByZXR1cm4gYCR7ZXJyb3JNZXNzYWdlfVxcbigke2Vycm9yLm5hbWV9KWA7IC8vIGRlZmF1bHQgZXJyb3IgbWVzc2FnZSBzdHlsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjayB0byBlcnJvciBjb2RlL25hbWUgaWYgbm8gbWVzc2FnZSBpcyBkZWZpbmVkXG4gICAgICByZXR1cm4gYCR7ZXJyb3IuY29kZX0gJHtlcnJvci5uYW1lfWA7XG4gICAgfVxuICB9O1xufVxuIiwiaW1wb3J0IHtBcnJheVV0aWxzfSBmcm9tICcuL2FycmF5dXRpbHMnO1xuaW1wb3J0IHsgVGltZW91dCB9IGZyb20gJy4vdGltZW91dCc7XG4vKipcbiAqIEZ1bmN0aW9uIGludGVyZmFjZSBmb3IgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSB7QGxpbmsgRXZlbnREaXNwYXRjaGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmVudExpc3RlbmVyPFNlbmRlciwgQXJncz4ge1xuICAoc2VuZGVyOiBTZW5kZXIsIGFyZ3M6IEFyZ3MpOiB2b2lkO1xufVxuXG4vKipcbiAqIEVtcHR5IHR5cGUgZm9yIGNyZWF0aW5nIHtAbGluayBFdmVudERpc3BhdGNoZXIgZXZlbnQgZGlzcGF0Y2hlcnN9IHRoYXQgZG8gbm90IGNhcnJ5IGFueSBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm9BcmdzIHtcbn1cblxuLyoqXG4gKiBFdmVudCBhcmdzIGZvciBhbiBldmVudCB0aGF0IGNhbiBiZSBjYW5jZWxlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxFdmVudEFyZ3MgZXh0ZW5kcyBOb0FyZ3Mge1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgZmxhZyB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgY2FuY2VsZWQuXG4gICAqL1xuICBjYW5jZWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFB1YmxpYyBpbnRlcmZhY2UgdGhhdCByZXByZXNlbnRzIGFuIGV2ZW50LiBDYW4gYmUgdXNlZCB0byBzdWJzY3JpYmUgdG8gYW5kIHVuc3Vic2NyaWJlIGZyb20gZXZlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50PFNlbmRlciwgQXJncz4ge1xuICAvKipcbiAgICogU3Vic2NyaWJlcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGlzIGV2ZW50IGRpc3BhdGNoZXIuXG4gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqL1xuICBzdWJzY3JpYmUobGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI8U2VuZGVyLCBBcmdzPik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBldmVudCBkaXNwYXRjaGVyIHRoYXQgaXMgb25seSBjYWxsZWQgb25jZS5cbiAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICovXG4gIHN1YnNjcmliZU9uY2UobGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI8U2VuZGVyLCBBcmdzPik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBldmVudCBkaXNwYXRjaGVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgYXQgYSBsaW1pdGVkIHJhdGUgd2l0aCBhIG1pbmltdW1cbiAgICogaW50ZXJ2YWwgb2YgdGhlIHNwZWNpZmllZCBtaWxsaXNlY29uZHMuXG4gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSByYXRlTXMgdGhlIHJhdGUgaW4gbWlsbGlzZWNvbmRzIHRvIHdoaWNoIGNhbGxpbmcgb2YgdGhlIGxpc3RlbmVycyBzaG91bGQgYmUgbGltaXRlZFxuICAgKi9cbiAgc3Vic2NyaWJlUmF0ZUxpbWl0ZWQobGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI8U2VuZGVyLCBBcmdzPiwgcmF0ZU1zOiBudW1iZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgYSBzdWJzY3JpYmVkIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBkaXNwYXRjaGVyLlxuICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgbGlzdGVuZXIgd2FzIHN1Y2Nlc3NmdWxseSB1bnN1YnNjcmliZWQsIGZhbHNlIGlmIGl0IGlzbid0IHN1YnNjcmliZWQgb24gdGhpc1xuICAgKiAgIGRpc3BhdGNoZXJcbiAgICovXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyOiBFdmVudExpc3RlbmVyPFNlbmRlciwgQXJncz4pOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEV2ZW50IGRpc3BhdGNoZXIgdG8gc3Vic2NyaWJlIGFuZCB0cmlnZ2VyIGV2ZW50cy4gRWFjaCBldmVudCBzaG91bGQgaGF2ZSBpdHMgb3duIGRpc3BhdGNoZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudERpc3BhdGNoZXI8U2VuZGVyLCBBcmdzPiBpbXBsZW1lbnRzIEV2ZW50PFNlbmRlciwgQXJncz4ge1xuXG4gIHByaXZhdGUgbGlzdGVuZXJzOiBFdmVudExpc3RlbmVyV3JhcHBlcjxTZW5kZXIsIEFyZ3M+W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGluaGVyaXREb2N9XG4gICAqL1xuICBzdWJzY3JpYmUobGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI8U2VuZGVyLCBBcmdzPikge1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobmV3IEV2ZW50TGlzdGVuZXJXcmFwcGVyKGxpc3RlbmVyKSk7XG4gIH1cblxuICAvKipcbiAgICoge0Bpbmhlcml0RG9jfVxuICAgKi9cbiAgc3Vic2NyaWJlT25jZShsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+KSB7XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaChuZXcgRXZlbnRMaXN0ZW5lcldyYXBwZXIobGlzdGVuZXIsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGluaGVyaXREb2N9XG4gICAqL1xuICBzdWJzY3JpYmVSYXRlTGltaXRlZChsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+LCByYXRlTXM6IG51bWJlcikge1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2gobmV3IFJhdGVMaW1pdGVkRXZlbnRMaXN0ZW5lcldyYXBwZXIobGlzdGVuZXIsIHJhdGVNcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAaW5oZXJpdERvY31cbiAgICovXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyOiBFdmVudExpc3RlbmVyPFNlbmRlciwgQXJncz4pOiBib29sZWFuIHtcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggbGlzdGVuZXJzLCBjb21wYXJlIHdpdGggcGFyYW1ldGVyLCBhbmQgcmVtb3ZlIGlmIGZvdW5kXG4gICAgLy8gTk9URTogSW4gY2FzZSB3ZSBldmVyIHJlbW92ZSBhbGwgbWF0Y2hpbmcgbGlzdGVuZXJzIGluc3RlYWQgb2YganVzdCB0aGUgZmlyc3QsIHdlIG5lZWQgdG8gcmV2ZXJzZS1pdGVyYXRlIGhlcmVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgc3Vic2NyaWJlZExpc3RlbmVyID0gdGhpcy5saXN0ZW5lcnNbaV07XG4gICAgICBpZiAoc3Vic2NyaWJlZExpc3RlbmVyLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBzdWJzY3JpYmVkTGlzdGVuZXIuY2xlYXIoKTtcbiAgICAgICAgQXJyYXlVdGlscy5yZW1vdmUodGhpcy5saXN0ZW5lcnMsIHN1YnNjcmliZWRMaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMgZnJvbSB0aGlzIGRpc3BhdGNoZXIuXG4gICAqL1xuICB1bnN1YnNjcmliZUFsbCgpOiB2b2lkIHtcbiAgICAvLyBJbiBjYXNlIG9mIFJhdGVMaW1pdGVkRXZlbnRMaXN0ZW5lcldyYXBwZXIgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdGltZW91dCBjYWxsYmFjayB3b24ndCBiZSBjYWxsZWRcbiAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIuY2xlYXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gZXZlbnQgdG8gYWxsIHN1YnNjcmliZWQgbGlzdGVuZXJzLlxuICAgKiBAcGFyYW0gc2VuZGVyIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50XG4gICAqIEBwYXJhbSBhcmdzIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBldmVudFxuICAgKi9cbiAgZGlzcGF0Y2goc2VuZGVyOiBTZW5kZXIsIGFyZ3M6IEFyZ3MgPSBudWxsKSB7XG4gICAgbGV0IGxpc3RlbmVyc1RvUmVtb3ZlID0gW107XG5cbiAgICAvLyBDYWxsIGV2ZXJ5IGxpc3RlbmVyXG4gICAgLy8gV2UgaXRlcmF0ZSBvdmVyIGEgY29weSBvZiB0aGUgYXJyYXkgb2YgbGlzdGVuZXJzIHRvIGF2b2lkIHRoZSBjYXNlIHdoZXJlIGV2ZW50cyBhcmUgbm90IGZpcmVkIG9uIGxpc3RlbmVycyB3aGVuXG4gICAgLy8gbGlzdGVuZXJzIGFyZSB1bnN1YnNjcmliZWQgZnJvbSB3aXRoaW4gdGhlIGV2ZW50IGhhbmRsZXJzIGR1cmluZyBhIGRpc3BhdGNoIChiZWNhdXNlIHRoZSBpbmRpY2VzIGNoYW5nZSBhbmRcbiAgICAvLyBsaXN0ZW5lcnMgYXJlIHNoaWZ0ZWQgd2l0aGluIHRoZSBhcnJheSkuXG4gICAgLy8gVGhpcyBtZWFucyB0aGF0IGxpc3RlbmVyIHgrMSB3aWxsIHN0aWxsIGJlIGNhbGxlZCBpZiB1bnN1YnNjcmliZWQgZnJvbSB3aXRoaW4gdGhlIGhhbmRsZXIgb2YgbGlzdGVuZXIgeCwgYXMgd2VsbFxuICAgIC8vIGFzIGxpc3RlbmVyIHkrMSB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiBzdWJzY3JpYmVkIGZyb20gd2l0aGluIHRoZSBoYW5kbGVyIG9mIGxpc3RlbmVyIHkuXG4gICAgLy8gQXJyYXkuc2xpY2UoMCkgaXMgdGhlIGZhc3Rlc3QgYXJyYXkgY29weSBtZXRob2QgYWNjb3JkaW5nIHRvOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjE1MTQyNTQvMzcwMjUyXG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuc2xpY2UoMCk7XG4gICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lci5maXJlKHNlbmRlciwgYXJncyk7XG5cbiAgICAgIGlmIChsaXN0ZW5lci5pc09uY2UoKSkge1xuICAgICAgICBsaXN0ZW5lcnNUb1JlbW92ZS5wdXNoKGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgb25lLXRpbWUgbGlzdGVuZXJcbiAgICBmb3IgKGxldCBsaXN0ZW5lclRvUmVtb3ZlIG9mIGxpc3RlbmVyc1RvUmVtb3ZlKSB7XG4gICAgICBBcnJheVV0aWxzLnJlbW92ZSh0aGlzLmxpc3RlbmVycywgbGlzdGVuZXJUb1JlbW92ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV2ZW50IHRoYXQgdGhpcyBkaXNwYXRjaGVyIG1hbmFnZXMgYW5kIG9uIHdoaWNoIGxpc3RlbmVycyBjYW4gc3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSBldmVudCBoYW5kbGVycy5cbiAgICogQHJldHVybnMge0V2ZW50fVxuICAgKi9cbiAgZ2V0RXZlbnQoKTogRXZlbnQ8U2VuZGVyLCBBcmdzPiB7XG4gICAgLy8gRm9yIG5vdywganVzdCBjYXN0IHRoZSBldmVudCBkaXNwYXRjaGVyIHRvIHRoZSBldmVudCBpbnRlcmZhY2UuIEF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSB3aGVuIHRoZVxuICAgIC8vIGNvZGViYXNlIGdyb3dzLCBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIHNwbGl0IHRoZSBkaXNwYXRjaGVyIGludG8gc2VwYXJhdGUgZGlzcGF0Y2hlciBhbmQgZXZlbnQgY2xhc3Nlcy5cbiAgICByZXR1cm4gPEV2ZW50PFNlbmRlciwgQXJncz4+dGhpcztcbiAgfVxufVxuXG4vKipcbiAqIEEgYmFzaWMgZXZlbnQgbGlzdGVuZXIgd3JhcHBlciB0byBtYW5hZ2UgbGlzdGVuZXJzIHdpdGhpbiB0aGUge0BsaW5rIEV2ZW50RGlzcGF0Y2hlcn0uIFRoaXMgaXMgYSAncHJpdmF0ZScgY2xhc3NcbiAqIGZvciBpbnRlcm5hbCBkaXNwYXRjaGVyIHVzZSBhbmQgaXQgaXMgdGhlcmVmb3JlIG5vdCBleHBvcnRlZC5cbiAqL1xuY2xhc3MgRXZlbnRMaXN0ZW5lcldyYXBwZXI8U2VuZGVyLCBBcmdzPiB7XG5cbiAgcHJpdmF0ZSBldmVudExpc3RlbmVyOiBFdmVudExpc3RlbmVyPFNlbmRlciwgQXJncz47XG4gIHByaXZhdGUgb25jZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+LCBvbmNlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICB0aGlzLm9uY2UgPSBvbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHdyYXBwZWQgZXZlbnQgbGlzdGVuZXIuXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyPFNlbmRlciwgQXJncz59XG4gICAqL1xuICBnZXQgbGlzdGVuZXIoKTogRXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudExpc3RlbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHRoZSB3cmFwcGVkIGV2ZW50IGxpc3RlbmVyIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHNlbmRlclxuICAgKiBAcGFyYW0gYXJnc1xuICAgKi9cbiAgZmlyZShzZW5kZXI6IFNlbmRlciwgYXJnczogQXJncykge1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcihzZW5kZXIsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGlzIGxpc3RlbmVyIGlzIHNjaGVkdWxlZCB0byBiZSBjYWxsZWQgb25seSBvbmNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gb25jZSBpZiB0cnVlXG4gICAqL1xuICBpc09uY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub25jZTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICB9XG59XG5cbmludGVyZmFjZSBFdmVudEF0dHJpYnV0ZXM8U2VuZGVyLCBBcmdzPiB7XG4gIHNlbmRlcjogU2VuZGVyO1xuICBhcmdzOiBBcmdzO1xufVxuXG4vKipcbiAqIEV4dGVuZHMgdGhlIGJhc2ljIHtAbGluayBFdmVudExpc3RlbmVyV3JhcHBlcn0gd2l0aCByYXRlLWxpbWl0aW5nIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmNsYXNzIFJhdGVMaW1pdGVkRXZlbnRMaXN0ZW5lcldyYXBwZXI8U2VuZGVyLCBBcmdzPiBleHRlbmRzIEV2ZW50TGlzdGVuZXJXcmFwcGVyPFNlbmRlciwgQXJncz4ge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZU1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZUxpbWl0aW5nRXZlbnRMaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+O1xuXG4gIC8vIHNhdmUgbGFzdCBzZWVuIGV2ZW50IGF0dHJpYnV0ZXNcbiAgcHJpdmF0ZSBsYXN0U2VlbkV2ZW50OiBFdmVudEF0dHJpYnV0ZXM8U2VuZGVyLCBBcmdzPjtcblxuICBwcml2YXRlIHJhdGVMaW1pdFRpbW91dDogVGltZW91dDtcblxuICBjb25zdHJ1Y3RvcihsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcjxTZW5kZXIsIEFyZ3M+LCByYXRlTXM6IG51bWJlcikge1xuICAgIHN1cGVyKGxpc3RlbmVyKTsgLy8gc2V0cyB0aGUgZXZlbnQgbGlzdGVuZXIgc2lua1xuXG4gICAgdGhpcy5yYXRlTXMgPSByYXRlTXM7XG5cbiAgICAvLyBzdGFydGluZyBsaW1pdGluZyB0aGUgZXZlbnRzIHRvIHRoZSBnaXZlbiB2YWx1ZVxuICAgIGNvbnN0IHN0YXJ0UmF0ZUxpbWl0aW5nID0gKCkgPT4ge1xuICAgICAgdGhpcy5yYXRlTGltaXRUaW1vdXQuc3RhcnQoKTtcbiAgICB9O1xuXG4gICAgLy8gdGltb3V0IGZvciBsaW1pdGluZyB0aGUgZXZlbnRzXG4gICAgdGhpcy5yYXRlTGltaXRUaW1vdXQgPSBuZXcgVGltZW91dCh0aGlzLnJhdGVNcywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubGFzdFNlZW5FdmVudCkge1xuICAgICAgICB0aGlzLmZpcmVTdXBlcih0aGlzLmxhc3RTZWVuRXZlbnQuc2VuZGVyLCB0aGlzLmxhc3RTZWVuRXZlbnQuYXJncyk7XG4gICAgICAgIHN0YXJ0UmF0ZUxpbWl0aW5nKCk7IC8vIHN0YXJ0IHJhdGVMaW1pdGluZyBhZ2FpbiB0byBrZWVwIHJhdGUgbGltaXQgYWN0aXZlIGV2ZW4gYWZ0ZXIgZmlyaW5nIHRoZSBsYXN0IHNlZW4gZXZlbnRcbiAgICAgICAgdGhpcy5sYXN0U2VlbkV2ZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEluIGNhc2UgdGhlIGV2ZW50cyBzdG9wcGluZyBkdXJpbmcgdGhlIHJhdGVMaW1pdGluZyB3ZSBuZWVkIHRvIHRyYWNrIHRoZSBsYXN0IHNlZW4gb25lIGFuZCBkZWxlZ2F0ZSBhZnRlciB0aGVcbiAgICAvLyByYXRlIGxpbWl0aW5nIGlzIGZpbmlzaGVkLiBUaGlzIHByZXZlbnRzIG1pc3NpbmcgdGhlIGxhc3QgdXBkYXRlIGR1ZSB0byB0aGUgcmF0ZSBsaW1pdC5cbiAgICB0aGlzLnJhdGVMaW1pdGluZ0V2ZW50TGlzdGVuZXIgPSAoc2VuZGVyOiBTZW5kZXIsIGFyZ3M6IEFyZ3MpID0+IHtcbiAgICAgIC8vIG9ubHkgZmlyZSBldmVudHMgaWYgdGhlIHJhdGVMaW1pdGluZyBpcyBub3QgcnVubmluZ1xuICAgICAgaWYgKHRoaXMuc2hvdWxkRmlyZUV2ZW50KCkpIHtcbiAgICAgICAgdGhpcy5maXJlU3VwZXIoc2VuZGVyLCBhcmdzKTtcbiAgICAgICAgc3RhcnRSYXRlTGltaXRpbmcoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxhc3RTZWVuRXZlbnQgPSB7XG4gICAgICAgIHNlbmRlcjogc2VuZGVyLFxuICAgICAgICBhcmdzOiBhcmdzLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRGaXJlRXZlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnJhdGVMaW1pdFRpbW91dC5pc0FjdGl2ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXJlU3VwZXIoc2VuZGVyOiBTZW5kZXIsIGFyZ3M6IEFyZ3MpIHtcbiAgICAvLyBGaXJlIHRoZSBhY3R1YWwgZXh0ZXJuYWwgZXZlbnQgbGlzdGVuZXJcbiAgICBzdXBlci5maXJlKHNlbmRlciwgYXJncyk7XG4gIH1cblxuICBmaXJlKHNlbmRlcjogU2VuZGVyLCBhcmdzOiBBcmdzKSB7XG4gICAgLy8gRmlyZSB0aGUgaW50ZXJuYWwgcmF0ZS1saW1pdGluZyBsaXN0ZW5lciBpbnN0ZWFkIG9mIHRoZSBleHRlcm5hbCBldmVudCBsaXN0ZW5lclxuICAgIHRoaXMucmF0ZUxpbWl0aW5nRXZlbnRMaXN0ZW5lcihzZW5kZXIsIGFyZ3MpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgc3VwZXIuY2xlYXIoKTtcbiAgICB0aGlzLnJhdGVMaW1pdFRpbW91dC5jbGVhcigpO1xuICB9XG59XG4iLCJjb25zdCBGb2N1c1Zpc2libGVDc3NDbGFzc05hbWUgPSAne3tQUkVGSVh9fS1mb2N1cy12aXNpYmxlJztcblxuZXhwb3J0IGNsYXNzIEZvY3VzVmlzaWJpbGl0eVRyYWNrZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlck1hcDogeyBbZXZlbnROYW1lOiBzdHJpbmddOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0IH07XG4gIHByaXZhdGUgbGFzdEludGVyYWN0aW9uV2FzS2V5Ym9hcmQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYml0bW92aW5VaVByZWZpeDogc3RyaW5nKSB7XG4gICAgdGhpcy5ldmVudEhhbmRsZXJNYXAgPSB7XG4gICAgICBtb3VzZWRvd246IHRoaXMub25Nb3VzZU9yUG9pbnRlck9yVG91Y2gsXG4gICAgICBwb2ludGVyZG93bjogdGhpcy5vbk1vdXNlT3JQb2ludGVyT3JUb3VjaCxcbiAgICAgIHRvdWNoc3RhcnQ6IHRoaXMub25Nb3VzZU9yUG9pbnRlck9yVG91Y2gsXG4gICAgICBrZXlkb3duOiB0aGlzLm9uS2V5RG93bixcbiAgICAgIGZvY3VzOiB0aGlzLm9uRm9jdXMsXG4gICAgICBibHVyOiB0aGlzLm9uQmx1cixcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbktleURvd24gPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGlmIChlLm1ldGFLZXkgfHwgZS5hbHRLZXkgfHwgZS5jdHJsS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0SW50ZXJhY3Rpb25XYXNLZXlib2FyZCA9IHRydWU7XG4gIH07XG5cbiAgcHJpdmF0ZSBvbk1vdXNlT3JQb2ludGVyT3JUb3VjaCA9ICgpID0+ICh0aGlzLmxhc3RJbnRlcmFjdGlvbldhc0tleWJvYXJkID0gZmFsc2UpO1xuXG4gIHByaXZhdGUgb25Gb2N1cyA9ICh7IHRhcmdldDogZWxlbWVudCB9OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5sYXN0SW50ZXJhY3Rpb25XYXNLZXlib2FyZCAmJlxuICAgICAgaXNIdG1sRWxlbWVudChlbGVtZW50KSAmJlxuICAgICAgaXNCaXRtb3ZpblVpKGVsZW1lbnQsIHRoaXMuYml0bW92aW5VaVByZWZpeCkgJiZcbiAgICAgICFlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhGb2N1c1Zpc2libGVDc3NDbGFzc05hbWUpXG4gICAgKSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRm9jdXNWaXNpYmxlQ3NzQ2xhc3NOYW1lKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBvbkJsdXIgPSAoeyB0YXJnZXQ6IGVsZW1lbnQgfTogRm9jdXNFdmVudCkgPT4ge1xuICAgIGlmIChpc0h0bWxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRm9jdXNWaXNpYmxlQ3NzQ2xhc3NOYW1lKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZWdpc3RlckV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5ldmVudEhhbmRsZXJNYXApIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIHRoaXMuZXZlbnRIYW5kbGVyTWFwW2V2ZW50XSwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLmV2ZW50SGFuZGxlck1hcCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgdGhpcy5ldmVudEhhbmRsZXJNYXBbZXZlbnRdLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJFdmVudExpc3RlbmVycygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQml0bW92aW5VaShlbGVtZW50OiBFbGVtZW50LCBiaXRtb3ZpblVpUHJlZml4OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVsZW1lbnQuaWQuaW5kZXhPZihiaXRtb3ZpblVpUHJlZml4KSA9PT0gMDtcbn1cblxuZnVuY3Rpb24gaXNIdG1sRWxlbWVudChlbGVtZW50OiB1bmtub3duKTogZWxlbWVudCBpcyBIVE1MRWxlbWVudCAmIHsgY2xhc3NMaXN0OiBET01Ub2tlbkxpc3QgfSB7XG4gIHJldHVybiAoXG4gICAgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0IGluc3RhbmNlb2YgRE9NVG9rZW5MaXN0XG4gICk7XG59XG4iLCJleHBvcnQgbmFtZXNwYWNlIEd1aWQge1xuXG4gIGxldCBndWlkID0gMTtcblxuICBleHBvcnQgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICByZXR1cm4gZ3VpZCsrO1xuICB9XG59XG4iLCJpbXBvcnQge0RPTX0gZnJvbSAnLi9kb20nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlTG9hZGVkQ2FsbGJhY2sge1xuICAodXJsOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIEltYWdlTG9hZGVyU3RhdGUge1xuICB1cmw6IHN0cmluZztcbiAgaW1hZ2U6IERPTTtcbiAgbG9hZGVkQ2FsbGJhY2s6IEltYWdlTG9hZGVkQ2FsbGJhY2s7XG4gIGxvYWRlZDogYm9vbGVhbjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKlxuICogVHJhY2tzIHRoZSBsb2FkaW5nIHN0YXRlIG9mIGltYWdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlTG9hZGVyIHtcblxuICBwcml2YXRlIHN0YXRlOiB7IFt1cmw6IHN0cmluZ106IEltYWdlTG9hZGVyU3RhdGU7IH0gPSB7fTtcblxuICAvKipcbiAgICogTG9hZHMgYW4gaW1hZ2UgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIG9uY2UgdGhlIGltYWdlIGlzIGxvYWRlZC4gSWYgdGhlIGltYWdlIGlzIGFscmVhZHkgbG9hZGVkLCB0aGUgY2FsbGJhY2tcbiAgICogaXMgY2FsbGVkIGltbWVkaWF0ZWx5LCBlbHNlIGl0IGlzIGNhbGxlZCBvbmNlIGxvYWRpbmcgaGFzIGZpbmlzaGVkLiBDYWxsaW5nIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzIGZvciB0aGVcbiAgICogc2FtZSBpbWFnZSB3aGlsZSBpdCBpcyBsb2FkaW5nIGNhbGxzIG9ubHkgbGV0IGNhbGxiYWNrIHBhc3NlZCBpbnRvIHRoZSBsYXN0IGNhbGwuXG4gICAqIEBwYXJhbSB1cmwgVGhlIHVybCB0byB0aGUgaW1hZ2UgdG8gbG9hZFxuICAgKiBAcGFyYW0gbG9hZGVkQ2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGltYWdlIGlzIGxvYWRlZFxuICAgKi9cbiAgbG9hZCh1cmw6IHN0cmluZywgbG9hZGVkQ2FsbGJhY2s6IEltYWdlTG9hZGVkQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhdGVbdXJsXSkge1xuICAgICAgLy8gV2hlbiB0aGUgaW1hZ2Ugd2FzIG5ldmVyIGF0dGVtcHRlZCB0byBiZSBsb2FkZWQgYmVmb3JlLCB3ZSBjcmVhdGUgYSBzdGF0ZSBhbmQgc3RvcmUgaXQgaW4gdGhlIHN0YXRlIG1hcFxuICAgICAgLy8gZm9yIGxhdGVyIHVzZSB3aGVuIHRoZSBzYW1lIGltYWdlIGlzIHJlcXVlc3RlZCB0byBiZSBsb2FkZWQgYWdhaW4uXG4gICAgICBsZXQgc3RhdGU6IEltYWdlTG9hZGVyU3RhdGUgPSB7XG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBpbWFnZTogbmV3IERPTSgnaW1nJywge30pLFxuICAgICAgICBsb2FkZWRDYWxsYmFjazogbG9hZGVkQ2FsbGJhY2ssXG4gICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICB9O1xuICAgICAgdGhpcy5zdGF0ZVt1cmxdID0gc3RhdGU7XG5cbiAgICAgIC8vIExpc3RlbiB0byB0aGUgbG9hZCBldmVudCwgdXBkYXRlIHRoZSBzdGF0ZSBhbmQgY2FsbCB0aGUgY2FsbGJhY2sgb25jZSB0aGUgaW1hZ2UgaXMgbG9hZGVkXG4gICAgICBzdGF0ZS5pbWFnZS5vbignbG9hZCcsIChlKSA9PiB7XG4gICAgICAgIHN0YXRlLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHN0YXRlLndpZHRoID0gKDxIVE1MSW1hZ2VFbGVtZW50PnN0YXRlLmltYWdlLmdldCgwKSkud2lkdGg7XG4gICAgICAgIHN0YXRlLmhlaWdodCA9ICg8SFRNTEltYWdlRWxlbWVudD5zdGF0ZS5pbWFnZS5nZXQoMCkpLmhlaWdodDtcblxuICAgICAgICB0aGlzLmNhbGxMb2FkZWRDYWxsYmFjayhzdGF0ZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IHRoZSBpbWFnZSBVUkwgdG8gc3RhcnQgdGhlIGxvYWRpbmdcbiAgICAgIHN0YXRlLmltYWdlLmF0dHIoJ3NyYycsIHN0YXRlLnVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBzdGF0ZSBmb3IgdGhlIHJlcXVlc3RlZCBpbWFnZSwgc28gaXQgaXMgZWl0aGVyIGFscmVhZHkgbG9hZGVkIG9yIGN1cnJlbnRseSBsb2FkaW5nXG4gICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlW3VybF07XG5cbiAgICAgIC8vIFdlIG92ZXJ3cml0ZSB0aGUgY2FsbGJhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb25seSB0aGUgY2FsbGJhY2sgb2YgdGhlIGxhdGVzdCBjYWxsIGdldHMgZXhlY3V0ZWQuXG4gICAgICAvLyBFYXJsaWVyIGNhbGxiYWNrcyBiZWNvbWUgaW52YWxpZCBvbmNlIGEgbmV3IGxvYWQgY2FsbCBhcnJpdmVzLCBhbmQgdGhleSBhcmUgbm90IGNhbGxlZCBhcyBsb25nIGFzIHRoZSBpbWFnZVxuICAgICAgLy8gaXMgbm90IGxvYWRlZC5cbiAgICAgIHN0YXRlLmxvYWRlZENhbGxiYWNrID0gbG9hZGVkQ2FsbGJhY2s7XG5cbiAgICAgIC8vIFdoZW4gdGhlIGltYWdlIGlzIGFscmVhZHkgbG9hZGVkLCB3ZSBkaXJlY3RseSBleGVjdXRlIHRoZSBjYWxsYmFjayBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBsb2FkIGV2ZW50XG4gICAgICBpZiAoc3RhdGUubG9hZGVkKSB7XG4gICAgICAgIHRoaXMuY2FsbExvYWRlZENhbGxiYWNrKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhbGxMb2FkZWRDYWxsYmFjayhzdGF0ZTogSW1hZ2VMb2FkZXJTdGF0ZSk6IHZvaWQge1xuICAgIHN0YXRlLmxvYWRlZENhbGxiYWNrKHN0YXRlLnVybCwgc3RhdGUud2lkdGgsIHN0YXRlLmhlaWdodCk7XG4gIH1cbn1cbiIsImltcG9ydCB2b2NhYnVsYXJ5RGUgZnJvbSAnLi9sYW5ndWFnZXMvZGUuanNvbic7XG5pbXBvcnQgdm9jYWJ1bGFyeUVuIGZyb20gJy4vbGFuZ3VhZ2VzL2VuLmpzb24nO1xuaW1wb3J0IHsgTG9jYWxpemF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vdWltYW5hZ2VyLmpzJztcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRWb2NhYnVsYXJpZXM6IFZvY2FidWxhcmllcyA9IHtcbiAgJ2VuJzogdm9jYWJ1bGFyeUVuLFxuICAnZGUnOiB2b2NhYnVsYXJ5RGUsXG59O1xuXG5jb25zdCBkZWZhdWx0TG9jYWxpemF0aW9uQ29uZmlnOiBMb2NhbGl6YXRpb25Db25maWcgPSB7XG4gIGxhbmd1YWdlOiAnZW4nLFxuICB2b2NhYnVsYXJpZXM6IGRlZmF1bHRWb2NhYnVsYXJpZXMsXG59O1xuXG50eXBlIExvY2FsaXplciA9ICgpID0+IHN0cmluZztcbmV4cG9ydCB0eXBlIExvY2FsaXphYmxlVGV4dCA9IHN0cmluZyB8IExvY2FsaXplcjtcblxuaW50ZXJmYWNlIFZvY2FidWxhcnkge1xuICAnc2V0dGluZ3MudmlkZW8ucXVhbGl0eSc6IHN0cmluZztcbiAgJ3NldHRpbmdzLmF1ZGlvLnF1YWxpdHknOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5hdWRpby50cmFjayc6IHN0cmluZztcbiAgJ3NldHRpbmdzLmF1ZGlvLm11dGUnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5hdWRpby52b2x1bWUnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5jb2xvcic6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250Lm9wYWNpdHknOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuYmFja2dyb3VuZC5jb2xvcic6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5iYWNrZ3JvdW5kLm9wYWNpdHknOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5zaXplJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuY2hhcmFjdGVyRWRnZS5yYWlzZWQnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuY2hhcmFjdGVyRWRnZS5kZXByZXNzZWQnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuY2hhcmFjdGVyRWRnZS51bmlmb3JtJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UuZHJvcHNoYWRvd2VkJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5Jzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5Lm1vbm9zcGFjZWRzZXJpZic6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5wcm9wb3J0aW9uYWxzZXJpZic6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5tb25vc3BhY2Vkc2Fuc3NlcmlmJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5LnByb3BvcnRpb25hbHNhbnNzZXJpZic6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5jYXN1YWwnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkuY3Vyc2l2ZSc6IHN0cmluZztcbiAgJ3NldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5zbWFsbGNhcGl0YWwnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy5zdWJ0aXRsZXMud2luZG93LmNvbG9yJzogc3RyaW5nO1xuICAnc2V0dGluZ3Muc3VidGl0bGVzLndpbmRvdy5vcGFjaXR5Jzogc3RyaW5nO1xuICAncGxheSc6IHN0cmluZztcbiAgJ3NldHRpbmdzLnRpbWUuaG91cnMnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy50aW1lLm1pbnV0ZXMnOiBzdHJpbmc7XG4gICdzZXR0aW5ncy50aW1lLnNlY29uZHMnOiBzdHJpbmc7XG4gICdjb2xvcnMud2hpdGUnOiBzdHJpbmc7XG4gICdjb2xvcnMuYmxhY2snOiBzdHJpbmc7XG4gICdjb2xvcnMucmVkJzogc3RyaW5nO1xuICAnY29sb3JzLmdyZWVuJzogc3RyaW5nO1xuICAnY29sb3JzLmJsdWUnOiBzdHJpbmc7XG4gICdjb2xvcnMuY3lhbic6IHN0cmluZztcbiAgJ2NvbG9ycy55ZWxsb3cnOiBzdHJpbmc7XG4gICdjb2xvcnMubWFnZW50YSc6IHN0cmluZztcbiAgJ3BlcmNlbnQnOiBzdHJpbmc7XG4gICdzZXR0aW5ncyc6IHN0cmluZztcbiAgJ2Fkcy5yZW1haW5pbmdUaW1lJzogc3RyaW5nO1xuICAncGljdHVyZUluUGljdHVyZSc6IHN0cmluZztcbiAgJ2FwcGxlQWlycGxheSc6IHN0cmluZztcbiAgJ2dvb2dsZUNhc3QnOiBzdHJpbmc7XG4gICd2cic6IHN0cmluZztcbiAgJ29mZic6IHN0cmluZztcbiAgJ2F1dG8nOiBzdHJpbmc7XG4gICdiYWNrJzogc3RyaW5nO1xuICAncmVzZXQnOiBzdHJpbmc7XG4gICdyZXBsYXknOiBzdHJpbmc7XG4gICdub3JtYWwnOiBzdHJpbmc7XG4gICdkZWZhdWx0Jzogc3RyaW5nO1xuICAnb3Blbic6IHN0cmluZztcbiAgJ2Nsb3NlJzogc3RyaW5nO1xuICAnZnVsbHNjcmVlbic6IHN0cmluZztcbiAgJ3NwZWVkJzogc3RyaW5nO1xuICAncGxheVBhdXNlJzogc3RyaW5nO1xuICAnbGl2ZSc6IHN0cmluZztcbiAgJ3N1YnRpdGxlLmV4YW1wbGUnOiBzdHJpbmc7XG4gICdzdWJ0aXRsZS5zZWxlY3QnOiBzdHJpbmc7XG4gICdwbGF5aW5nT24nOiBzdHJpbmc7XG4gICdjb25uZWN0aW5nVG8nOiBzdHJpbmc7XG4gICd3YXRlcm1hcmtMaW5rJzogc3RyaW5nO1xuICAnY29udHJvbEJhcic6IHN0cmluZztcbiAgJ3BsYXllcic6IHN0cmluZztcbiAgJ3NlZWtCYXInOiBzdHJpbmc7XG4gICdzZWVrQmFyLnZhbHVlJzogc3RyaW5nO1xuICAnc2Vla0Jhci50aW1lc2hpZnQnOiBzdHJpbmc7XG4gICdzZWVrQmFyLmR1cmF0aW9uVGV4dCc6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ3VzdG9tVm9jYWJ1bGFyeTxWPiA9IFYgJiBQYXJ0aWFsPFZvY2FidWxhcnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFZvY2FidWxhcmllcyB7XG4gIFtrZXk6IHN0cmluZ106IEN1c3RvbVZvY2FidWxhcnk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG59XG5cbmNsYXNzIEkxOG4ge1xuICBwcml2YXRlIGxhbmd1YWdlOiBzdHJpbmc7XG4gIHByaXZhdGUgdm9jYWJ1bGFyeTogQ3VzdG9tVm9jYWJ1bGFyeTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExvY2FsaXphdGlvbkNvbmZpZykge1xuICAgIHRoaXMuc2V0Q29uZmlnKGNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZzogTG9jYWxpemF0aW9uQ29uZmlnKSB7XG4gICAgY29uc3QgbWVyZ2VkQ29uZmlnID0geyAuLi5kZWZhdWx0TG9jYWxpemF0aW9uQ29uZmlnLCAuLi5jb25maWcgfTtcbiAgICBjb25zdCBkZXRlY3RCcm93c2VyTGFuZ3VhZ2UgPSBtZXJnZWRDb25maWcubGFuZ3VhZ2UgPT09ICdhdXRvJztcbiAgICBjb25zdCB2b2NhYnVsYXJpZXMgPSB0aGlzLm1lcmdlVm9jYWJ1bGFyaWVzV2l0aERlZmF1bHRWb2NhYnVsYXJpZXMobWVyZ2VkQ29uZmlnLnZvY2FidWxhcmllcyk7XG4gICAgdGhpcy5pbml0aWFsaXplTGFuZ3VhZ2UobWVyZ2VkQ29uZmlnLmxhbmd1YWdlLCBkZXRlY3RCcm93c2VyTGFuZ3VhZ2UsIHZvY2FidWxhcmllcyk7XG4gICAgdGhpcy5pbml0aWFsaXplVm9jYWJ1bGFyeSh2b2NhYnVsYXJpZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY29udGFpbnNMYW5ndWFnZSh2b2NhYnVsYXJpZXM6IFZvY2FidWxhcmllcywgbGFuZ3VhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB2b2NhYnVsYXJpZXMuaGFzT3duUHJvcGVydHkobGFuZ3VhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZVZvY2FidWxhcmllc1dpdGhEZWZhdWx0Vm9jYWJ1bGFyaWVzKHZvY2FidWxhcmllczogVm9jYWJ1bGFyaWVzID0ge30pIHtcbiAgICBjb25zdCByYXdWb2NhYnVsYXJpZXM6IFZvY2FidWxhcmllcyA9IHsgLi4uZGVmYXVsdFZvY2FidWxhcmllcywgLi4udm9jYWJ1bGFyaWVzIH07XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJhd1ZvY2FidWxhcmllcykucmVkdWNlKChtZXJnZWRWb2NhYnVsYXJpZXMsIGxhbmd1YWdlKSA9PiB7XG4gICAgICBsZXQgdm9jYWJ1bGFyeSA9IHJhd1ZvY2FidWxhcmllc1tsYW5ndWFnZV07XG4gICAgICBpZiAoSTE4bi5jb250YWluc0xhbmd1YWdlKGRlZmF1bHRWb2NhYnVsYXJpZXMsIGxhbmd1YWdlKSAmJiBJMThuLmNvbnRhaW5zTGFuZ3VhZ2Uodm9jYWJ1bGFyaWVzLCBsYW5ndWFnZSkpIHtcbiAgICAgICAgdm9jYWJ1bGFyeSA9IHsgLi4uZGVmYXVsdFZvY2FidWxhcmllc1tsYW5ndWFnZV0sIC4uLnZvY2FidWxhcmllc1tsYW5ndWFnZV0gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLm1lcmdlZFZvY2FidWxhcmllcywgW2xhbmd1YWdlXTogdm9jYWJ1bGFyeSB9O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUxhbmd1YWdlKFxuICAgIGxhbmd1YWdlOiBzdHJpbmcsXG4gICAgYnJvd3Nlckxhbmd1YWdlRGV0ZWN0aW9uRW5hYmxlZDogYm9vbGVhbixcbiAgICB2b2NhYnVsYXJpZXM6IFZvY2FidWxhcmllcyxcbiAgKSB7XG4gICAgaWYgKGJyb3dzZXJMYW5ndWFnZURldGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHVzZXJMYW5ndWFnZSA9IHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2U7XG5cbiAgICAgIGlmIChJMThuLmNvbnRhaW5zTGFuZ3VhZ2Uodm9jYWJ1bGFyaWVzLCB1c2VyTGFuZ3VhZ2UpKSB7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSB1c2VyTGFuZ3VhZ2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNob3J0ZW5lZFVzZXJMYW5ndWFnZSA9IHVzZXJMYW5ndWFnZS5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChJMThuLmNvbnRhaW5zTGFuZ3VhZ2Uodm9jYWJ1bGFyaWVzLCBzaG9ydGVuZWRVc2VyTGFuZ3VhZ2UpKSB7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBzaG9ydGVuZWRVc2VyTGFuZ3VhZ2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVWb2NhYnVsYXJ5KHZvY2FidWxhcmllczogVm9jYWJ1bGFyaWVzKSB7XG4gICAgdGhpcy52b2NhYnVsYXJ5ID0gWydlbicsIHRoaXMubGFuZ3VhZ2VdXG4gICAgICAucmVkdWNlKCh2b2NhYiwgbGFuZykgPT4gKHsgLi4udm9jYWIsIC4uLih2b2NhYnVsYXJpZXNbbGFuZ10gfHwge30pIH0pLCB7fSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VWYXJpYWJsZVdpdGhQbGFjZWhvbGRlcklmRXhpc3RzKHRleHQ6IHN0cmluZywgY29uZmlnOiBhbnkpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gdGV4dC5tYXRjaChuZXcgUmVnRXhwKCd7W2EtekEtWjAtOV0rfScsICdnJykpO1xuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZXNcbiAgICAgIC5tYXAoKG06IHN0cmluZykgPT4gKHsgbWF0Y2g6IG0sIGtleTogbS5zbGljZSgxLCAtMSkgfSkpXG4gICAgICAucmVkdWNlKChzdHIsIHsga2V5LCBtYXRjaCB9KSA9PiBjb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSA/IHN0ci5yZXBsYWNlKG1hdGNoLCBjb25maWdba2V5XSkgOiBzdHIsIHRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldExvY2FsaXplcjxWIGV4dGVuZHMgQ3VzdG9tVm9jYWJ1bGFyeTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IEN1c3RvbVZvY2FidWxhcnk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4+KFxuICAgIGtleToga2V5b2YgVixcbiAgICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+LFxuICApOiBMb2NhbGl6ZXIge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoa2V5ID09IG51bGwpIHsgLy8gYmVjYXVzZSBzb21ldGltZXMgd2UgY2FsbCB0b0RvbUVsZW1lbnQoKSB3aXRob3V0IGNvbmZpZ3VyaW5nIHRoZSBjb21wb25lbnQgb3Igc2V0dGluZyB0ZXh0Li4uXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBsZXQgdm9jYWJ1bGFyeVN0cmluZyA9IHRoaXMudm9jYWJ1bGFyeVtrZXkgYXMgc3RyaW5nXTtcblxuICAgICAgaWYgKHZvY2FidWxhcnlTdHJpbmcgPT0gbnVsbCkge1xuICAgICAgICB2b2NhYnVsYXJ5U3RyaW5nID0ga2V5IGFzIHN0cmluZztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgIHZvY2FidWxhcnlTdHJpbmcgPSB0aGlzLnJlcGxhY2VWYXJpYWJsZVdpdGhQbGFjZWhvbGRlcklmRXhpc3RzKHZvY2FidWxhcnlTdHJpbmcsIGNvbmZpZyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2b2NhYnVsYXJ5U3RyaW5nO1xuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcGVyZm9ybUxvY2FsaXphdGlvbih0ZXh0OiBMb2NhbGl6YWJsZVRleHQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRleHQgPT09ICdmdW5jdGlvbicgPyB0ZXh0KCkgOiB0ZXh0O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBpMThuID0gbmV3IEkxOG4oZGVmYXVsdExvY2FsaXphdGlvbkNvbmZpZyk7XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwic2V0dGluZ3MudmlkZW8ucXVhbGl0eVwiOiBcIlZpZGVvcXVhbGl0w6R0XCIsXG4gIFwic2V0dGluZ3MuYXVkaW8ucXVhbGl0eVwiOiBcIkF1ZGlvcXVhbGl0w6R0XCIsXG4gIFwic2V0dGluZ3MuYXVkaW8udHJhY2tcIjogXCJBdWRpb3NwdXJcIixcbiAgXCJzcGVlZFwiOiBcIkdlc2Nod2luZGlna2VpdFwiLFxuICBcInBsYXlcIjogXCJBYnNwaWVsZW5cIixcbiAgXCJwYXVzZVwiOiBcIlBhdXNlXCIsXG4gIFwicGxheVBhdXNlXCI6IFwiQWJzcGllbGVuL1BhdXNlXCIsXG4gIFwib3BlblwiOiBcIsO2ZmZuZW5cIixcbiAgXCJjbG9zZVwiOiBcIlNjaGxpZcOfZW5cIixcbiAgXCJzZXR0aW5ncy5hdWRpby5tdXRlXCI6IFwiU3R1bW1zY2hhbHR1bmdcIixcbiAgXCJzZXR0aW5ncy5hdWRpby52b2x1bWVcIjogXCJMYXV0c3TDpHJrZVwiLFxuICBcInBpY3R1cmVJblBpY3R1cmVcIjogXCJCaWxkIGltIEJpbGRcIixcbiAgXCJhcHBsZUFpcnBsYXlcIjogXCJBcHBsZSBBaXJQbGF5XCIsXG4gIFwiZ29vZ2xlQ2FzdFwiOiBcIkdvb2dsZSBDYXN0XCIsXG4gIFwidnJcIjogXCJWUlwiLFxuICBcInNldHRpbmdzXCI6IFwiRWluc3RlbGx1bmdlblwiLFxuICBcImZ1bGxzY3JlZW5cIjogXCJWb2xsYmlsZFwiLFxuICBcIm9mZlwiOiBcImF1c1wiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlc1wiOiBcIlVudGVydGl0ZWxcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5zaXplXCI6IFwiR3LDtsOfZVwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseVwiOiBcIlNjaHJpZnRhcnRcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5jb2xvclwiOiBcIkZhcmJlXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmZvbnQub3BhY2l0eVwiOiBcIkRlY2trcmFmdFwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5jaGFyYWN0ZXJFZGdlXCI6IFwiUsOkbmRlclwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5iYWNrZ3JvdW5kLmNvbG9yXCI6IFwiSGludGVyZ3J1bmRmYXJiZVwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5iYWNrZ3JvdW5kLm9wYWNpdHlcIjogXCJIaW50ZXJncnVuZGRlY2trcmFmdFwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy53aW5kb3cuY29sb3JcIjogXCJIaW50ZXJncnVuZGZhcmJlXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLndpbmRvdy5vcGFjaXR5XCI6IFwiSGludGVyZ3J1bmRkZWNra3JhZnRcIixcbiAgXCJzZXR0aW5ncy50aW1lLmhvdXJzXCI6IFwiU3R1bmRlblwiLFxuICBcInNldHRpbmdzLnRpbWUubWludXRlc1wiOiBcIk1pbnV0ZW5cIixcbiAgXCJzZXR0aW5ncy50aW1lLnNlY29uZHNcIjogXCJTZWt1bmRlblwiLFxuICBcImJhY2tcIjogXCJadXLDvGNrXCIsXG4gIFwicmVzZXRcIjogXCJadXLDvGNrc2V0emVuXCIsXG4gIFwicmVwbGF5XCI6IFwiV2llZGVyaG9sZW5cIixcbiAgXCJhZHMucmVtYWluaW5nVGltZVwiOiBcIkRpZXNlIEFuemVpZ2UgZW5kZXQgaW4ge3JlbWFpbmluZ1RpbWV9IFNla3VuZGVuXCIsXG4gIFwiZGVmYXVsdFwiOiBcInN0YW5kYXJkXCIsXG4gIFwiY29sb3JzLndoaXRlXCI6IFwid2Vpw59cIixcbiAgXCJjb2xvcnMuYmxhY2tcIjogXCJzY2h3YXJ6XCIsXG4gIFwiY29sb3JzLnJlZFwiOiBcInJvdFwiLFxuICBcImNvbG9ycy5ncmVlblwiOiBcImdyw7xuXCIsXG4gIFwiY29sb3JzLmJsdWVcIjogXCJibGF1XCIsXG4gIFwiY29sb3JzLnllbGxvd1wiOiBcImdlbGJcIixcbiAgXCJzdWJ0aXRsZS5leGFtcGxlXCI6IFwiQmVpc3BpZWwgVW50ZXJ0aXRlbFwiLFxuICBcInN1YnRpdGxlLnNlbGVjdFwiOiBcIlVudGVydGl0ZWwgYXVzd8OkaGxlblwiLFxuICBcInBsYXlpbmdPblwiOiBcIlNwaWVsdCBhdWYgPHN0cm9uZz57Y2FzdERldmljZU5hbWV9PC9zdHJvbmc+XCIsXG4gIFwiY29ubmVjdGluZ1RvXCI6IFwiVmVyYmluZHVuZyBtaXQgPHN0cm9uZz57Y2FzdERldmljZU5hbWV9PC9zdHJvbmc+IHdpcmQgaGVyZ2VzdGVsbHQuLi5cIixcbiAgXCJ3YXRlcm1hcmtMaW5rXCI6IFwiTGluayB6dW0gSG9tZXBhZ2VcIixcbiAgXCJjb250cm9sQmFyXCI6IFwiVmlkZW9wbGF5ZXIgS29udHJvbGxlblwiLFxuICBcInBsYXllclwiOiBcIlZpZGVvIHBsYXllclwiLFxuICBcInNlZWtCYXJcIjogXCJWaWRlby1UaW1lbGluZVwiLFxuICBcInNlZWtCYXIudmFsdWVcIjogXCJXZXJ0XCIsXG4gIFwic2Vla0Jhci50aW1lc2hpZnRcIjogXCJUaW1lc2hpZnRcIixcbiAgXCJzZWVrQmFyLmR1cmF0aW9uVGV4dFwiOiBcImF1c1wiXG59XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwic2V0dGluZ3MudmlkZW8ucXVhbGl0eVwiOiBcIlZpZGVvIFF1YWxpdHlcIixcbiAgXCJzZXR0aW5ncy5hdWRpby5xdWFsaXR5XCI6IFwiQXVkaW8gUXVhbGl0eVwiLFxuICBcInNldHRpbmdzLmF1ZGlvLnRyYWNrXCI6IFwiQXVkaW8gVHJhY2tcIixcbiAgXCJzZXR0aW5ncy5hdWRpby5tdXRlXCIgOiBcIk11dGVcIixcbiAgXCJzZXR0aW5ncy5hdWRpby52b2x1bWVcIiA6IFwiVm9sdW1lXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLndpbmRvdy5jb2xvclwiIDogXCJXaW5kb3cgY29sb3JcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMud2luZG93Lm9wYWNpdHlcIiA6IFwiV2luZG93IG9wYWNpdHlcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXNcIiA6IFwiU3VidGl0bGVzXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuY29sb3JcIiA6IFwiRm9udCBjb2xvclwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250Lm9wYWNpdHlcIiA6IFwiRm9udCBvcGFjaXR5XCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmJhY2tncm91bmQuY29sb3JcIiA6IFwiQmFja2dyb3VuZCBjb2xvclwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5iYWNrZ3JvdW5kLm9wYWNpdHlcIjogXCJCYWNrZ3JvdW5kIG9wYWNpdHlcIixcbiAgXCJjb2xvcnMud2hpdGVcIjogXCJ3aGl0ZVwiLFxuICBcImNvbG9ycy5ibGFja1wiOiBcImJsYWNrXCIsXG4gIFwiY29sb3JzLnJlZFwiOiBcInJlZFwiLFxuICBcImNvbG9ycy5ncmVlblwiOiBcImdyZWVuXCIsXG4gIFwiY29sb3JzLmJsdWVcIjogXCJibHVlXCIsXG4gIFwiY29sb3JzLmN5YW5cIjogXCJjeWFuXCIsXG4gIFwiY29sb3JzLnllbGxvd1wiOiBcInllbGxvd1wiLFxuICBcImNvbG9ycy5tYWdlbnRhXCI6IFwibWFnZW50YVwiLFxuICBcInBlcmNlbnRcIjogXCJ7dmFsdWV9JVwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250LnNpemVcIjogXCJGb250IHNpemVcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuY2hhcmFjdGVyRWRnZVwiOiBcIkNoYXJhY3RlciBlZGdlXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UucmFpc2VkXCI6IFwicmFpc2VkXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UuZGVwcmVzc2VkXCI6IFwiZGVwcmVzc2VkXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmNoYXJhY3RlckVkZ2UudW5pZm9ybVwiOiBcInVuaWZvcm1cIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuY2hhcmFjdGVyRWRnZS5kcm9wc2hhZG93ZWRcIjogXCJkcm9wIHNoYWRvd2VkXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5XCI6IFwiRm9udCBmYW1pbHlcIixcbiAgXCJzZXR0aW5ncy5zdWJ0aXRsZXMuZm9udC5mYW1pbHkubW9ub3NwYWNlZHNlcmlmXCI6IFwibW9ub3NwYWNlZCBzZXJpZlwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5wcm9wb3J0aW9uYWxzZXJpZlwiOiBcInByb3BvcnRpb25hbCBzZXJpZlwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5tb25vc3BhY2Vkc2Fuc3NlcmlmXCI6IFwibW9ub3NwYWNlZCBzYW5zIHNlcmlmXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5LnByb3BvcnRpb25hbHNhbnNzZXJpZlwiOiBcInByb3BvcnRpb25hbCBzYW5zIHNlcmlmXCIsXG4gIFwic2V0dGluZ3Muc3VidGl0bGVzLmZvbnQuZmFtaWx5LmNhc3VhbFwiOiBcImNhc3VhbFwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5jdXJzaXZlXCI6IFwiY3Vyc2l2ZVwiLFxuICBcInNldHRpbmdzLnN1YnRpdGxlcy5mb250LmZhbWlseS5zbWFsbGNhcGl0YWxcIjogXCJzbWFsbCBjYXBpdGFsXCIsXG4gIFwic2V0dGluZ3MudGltZS5ob3Vyc1wiOiBcIkhvdXJzXCIsXG4gIFwic2V0dGluZ3MudGltZS5taW51dGVzXCI6IFwiTWludXRlc1wiLFxuICBcInNldHRpbmdzLnRpbWUuc2Vjb25kc1wiOiBcIlNlY29uZHNcIixcbiAgXCJhZHMucmVtYWluaW5nVGltZVwiOiBcIlRoaXMgYWQgd2lsbCBlbmQgaW4ge3JlbWFpbmluZ1RpbWV9IHNlY29uZHMuXCIsXG4gIFwic2V0dGluZ3NcIjogXCJTZXR0aW5nc1wiLFxuICBcImZ1bGxzY3JlZW5cIiA6IFwiRnVsbHNjcmVlblwiLFxuICBcInNwZWVkXCI6IFwiU3BlZWRcIixcbiAgXCJwbGF5UGF1c2VcIiA6IFwiUGxheS9QYXVzZVwiLFxuICBcInBsYXlcIjogXCJQbGF5XCIsXG4gIFwicGF1c2VcIjogXCJQYXVzZVwiLFxuICBcIm9wZW5cIjogXCJvcGVuXCIsXG4gIFwiY2xvc2VcIjogXCJDbG9zZVwiLFxuICBcInBpY3R1cmVJblBpY3R1cmVcIjogXCJQaWN0dXJlLWluLVBpY3R1cmVcIixcbiAgXCJhcHBsZUFpcnBsYXlcIiA6IFwiQXBwbGUgQWlyUGxheVwiLFxuICBcImdvb2dsZUNhc3RcIjogXCJHb29nbGUgQ2FzdFwiLFxuICBcInZyXCIgOiBcIlZSXCIsXG4gIFwib2ZmXCI6IFwib2ZmXCIsXG4gIFwiYXV0b1wiOiBcImF1dG9cIixcbiAgXCJiYWNrXCIgOiBcIkJhY2tcIixcbiAgXCJyZXNldFwiOiBcIlJlc2V0XCIsXG4gIFwicmVwbGF5XCI6IFwiUmVwbGF5XCIsXG4gIFwibm9ybWFsXCI6IFwibm9ybWFsXCIsXG4gIFwiZGVmYXVsdFwiOiBcImRlZmF1bHRcIixcbiAgXCJsaXZlXCI6IFwiTGl2ZVwiLFxuICBcInN1YnRpdGxlLmV4YW1wbGVcIjogXCJleGFtcGxlIHN1YnRpdGxlXCIsXG4gIFwic3VidGl0bGUuc2VsZWN0XCI6IFwiU2VsZWN0IHN1YnRpdGxlXCIsXG4gIFwicGxheWluZ09uXCI6IFwiUGxheWluZyBvbiA8c3Ryb25nPntjYXN0RGV2aWNlTmFtZX08L3N0cm9uZz5cIixcbiAgXCJjb25uZWN0aW5nVG9cIjogXCJDb25uZWN0aW5nIHRvIDxzdHJvbmc+e2Nhc3REZXZpY2VOYW1lfTwvc3Ryb25nPi4uLlwiLFxuICBcIndhdGVybWFya0xpbmtcIjogXCJMaW5rIHRvIEhvbWVwYWdlXCIsXG4gIFwiY29udHJvbEJhclwiOiBcIlZpZGVvIHBsYXllciBjb250cm9sc1wiLFxuICBcInBsYXllclwiOiBcIlZpZGVvIHBsYXllclwiLFxuICBcInNlZWtCYXJcIjogXCJWaWRlbyB0aW1lbGluZVwiLFxuICBcInNlZWtCYXIudmFsdWVcIjogXCJWYWx1ZVwiLFxuICBcInNlZWtCYXIudGltZXNoaWZ0XCI6IFwiVGltZXNoaWZ0XCIsXG4gIFwic2Vla0Jhci5kdXJhdGlvblRleHRcIjogXCJvdXQgb2ZcIlxufVxuIiwiZXhwb3J0IGNvbnN0IHZlcnNpb246IHN0cmluZyA9ICd7e1ZFUlNJT059fSc7XG4vLyBNYW5hZ2VtZW50XG5leHBvcnQgeyBVSU1hbmFnZXIsIFVJSW5zdGFuY2VNYW5hZ2VyIH0gZnJvbSAnLi91aW1hbmFnZXInO1xuLy8gRmFjdG9yaWVzXG5leHBvcnQgeyBVSUZhY3RvcnkgfSBmcm9tICcuL3VpZmFjdG9yeSc7XG5leHBvcnQgeyBEZW1vRmFjdG9yeSB9IGZyb20gJy4vZGVtb2ZhY3RvcnknO1xuLy8gVXRpbHNcbmV4cG9ydCB7IEFycmF5VXRpbHMgfSBmcm9tICcuL2FycmF5dXRpbHMnO1xuZXhwb3J0IHsgU3RyaW5nVXRpbHMgfSBmcm9tICcuL3N0cmluZ3V0aWxzJztcbmV4cG9ydCB7IFBsYXllclV0aWxzIH0gZnJvbSAnLi9wbGF5ZXJ1dGlscyc7XG5leHBvcnQgeyBVSVV0aWxzIH0gZnJvbSAnLi91aXV0aWxzJztcbmV4cG9ydCB7IEJyb3dzZXJVdGlscyB9IGZyb20gJy4vYnJvd3NlcnV0aWxzJztcbmV4cG9ydCB7IFN0b3JhZ2VVdGlscyB9IGZyb20gJy4vc3RvcmFnZXV0aWxzJztcbmV4cG9ydCB7IEVycm9yVXRpbHMgfSBmcm9tICcuL2Vycm9ydXRpbHMnO1xuLy8gQ29tcG9uZW50c1xuZXhwb3J0IHsgQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2J1dHRvbic7XG5leHBvcnQgeyBDb250cm9sQmFyIH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnRyb2xiYXInO1xuZXhwb3J0IHsgRnVsbHNjcmVlblRvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9mdWxsc2NyZWVudG9nZ2xlYnV0dG9uJztcbmV4cG9ydCB7IEh1Z2VQbGF5YmFja1RvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9odWdlcGxheWJhY2t0b2dnbGVidXR0b24nO1xuZXhwb3J0IHsgUGxheWJhY2tUaW1lTGFiZWwsIFBsYXliYWNrVGltZUxhYmVsTW9kZSB9IGZyb20gJy4vY29tcG9uZW50cy9wbGF5YmFja3RpbWVsYWJlbCc7XG5leHBvcnQgeyBQbGF5YmFja1RvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9wbGF5YmFja3RvZ2dsZWJ1dHRvbic7XG5leHBvcnQgeyBTZWVrQmFyIH0gZnJvbSAnLi9jb21wb25lbnRzL3NlZWtiYXInO1xuZXhwb3J0IHsgU2VsZWN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL3NlbGVjdGJveCc7XG5leHBvcnQgeyBJdGVtU2VsZWN0aW9uTGlzdCB9IGZyb20gJy4vY29tcG9uZW50cy9pdGVtc2VsZWN0aW9ubGlzdCc7XG5leHBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzcGFuZWwnO1xuZXhwb3J0IHsgU2V0dGluZ3NUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3N0b2dnbGVidXR0b24nO1xuZXhwb3J0IHsgVG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3RvZ2dsZWJ1dHRvbic7XG5leHBvcnQgeyBWaWRlb1F1YWxpdHlTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvdmlkZW9xdWFsaXR5c2VsZWN0Ym94JztcbmV4cG9ydCB7IFZvbHVtZVRvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy92b2x1bWV0b2dnbGVidXR0b24nO1xuZXhwb3J0IHsgVlJUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvdnJ0b2dnbGVidXR0b24nO1xuZXhwb3J0IHsgV2F0ZXJtYXJrIH0gZnJvbSAnLi9jb21wb25lbnRzL3dhdGVybWFyayc7XG5leHBvcnQgeyBVSUNvbnRhaW5lciB9IGZyb20gJy4vY29tcG9uZW50cy91aWNvbnRhaW5lcic7XG5leHBvcnQgeyBDb250YWluZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvY29udGFpbmVyJztcbmV4cG9ydCB7IExhYmVsIH0gZnJvbSAnLi9jb21wb25lbnRzL2xhYmVsJztcbmV4cG9ydCB7IEF1ZGlvUXVhbGl0eVNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9hdWRpb3F1YWxpdHlzZWxlY3Rib3gnO1xuZXhwb3J0IHsgQXVkaW9UcmFja1NlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9hdWRpb3RyYWNrc2VsZWN0Ym94JztcbmV4cG9ydCB7IENhc3RTdGF0dXNPdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL2Nhc3RzdGF0dXNvdmVybGF5JztcbmV4cG9ydCB7IENhc3RUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvY2FzdHRvZ2dsZWJ1dHRvbic7XG5leHBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50JztcbmV4cG9ydCB7IEVycm9yTWVzc2FnZU92ZXJsYXkgfSBmcm9tICcuL2NvbXBvbmVudHMvZXJyb3JtZXNzYWdlb3ZlcmxheSc7XG5leHBvcnQgeyBSZWNvbW1lbmRhdGlvbk92ZXJsYXkgfSBmcm9tICcuL2NvbXBvbmVudHMvcmVjb21tZW5kYXRpb25vdmVybGF5JztcbmV4cG9ydCB7IFNlZWtCYXJMYWJlbCB9IGZyb20gJy4vY29tcG9uZW50cy9zZWVrYmFybGFiZWwnO1xuZXhwb3J0IHsgU3VidGl0bGVPdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlb3ZlcmxheSc7XG5leHBvcnQgeyBTdWJ0aXRsZVNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNlbGVjdGJveCc7XG5leHBvcnQgeyBUaXRsZUJhciB9IGZyb20gJy4vY29tcG9uZW50cy90aXRsZWJhcic7XG5leHBvcnQgeyBWb2x1bWVDb250cm9sQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3ZvbHVtZWNvbnRyb2xidXR0b24nO1xuZXhwb3J0IHsgQ2xpY2tPdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL2NsaWNrb3ZlcmxheSc7XG5leHBvcnQgeyBBZFNraXBCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvYWRza2lwYnV0dG9uJztcbmV4cG9ydCB7IEFkTWVzc2FnZUxhYmVsIH0gZnJvbSAnLi9jb21wb25lbnRzL2FkbWVzc2FnZWxhYmVsJztcbmV4cG9ydCB7IEFkQ2xpY2tPdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL2FkY2xpY2tvdmVybGF5JztcbmV4cG9ydCB7IFBsYXliYWNrU3BlZWRTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvcGxheWJhY2tzcGVlZHNlbGVjdGJveCc7XG5leHBvcnQgeyBIdWdlUmVwbGF5QnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2h1Z2VyZXBsYXlidXR0b24nO1xuZXhwb3J0IHsgQnVmZmVyaW5nT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9idWZmZXJpbmdvdmVybGF5JztcbmV4cG9ydCB7IENhc3RVSUNvbnRhaW5lciB9IGZyb20gJy4vY29tcG9uZW50cy9jYXN0dWljb250YWluZXInO1xuZXhwb3J0IHsgUGxheWJhY2tUb2dnbGVPdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL3BsYXliYWNrdG9nZ2xlb3ZlcmxheSc7XG5leHBvcnQgeyBDbG9zZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9jbG9zZWJ1dHRvbic7XG5leHBvcnQgeyBNZXRhZGF0YUxhYmVsLCBNZXRhZGF0YUxhYmVsQ29udGVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tZXRhZGF0YWxhYmVsJztcbmV4cG9ydCB7IEFpclBsYXlUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvYWlycGxheXRvZ2dsZWJ1dHRvbic7XG5leHBvcnQgeyBWb2x1bWVTbGlkZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvdm9sdW1lc2xpZGVyJztcbmV4cG9ydCB7IFBpY3R1cmVJblBpY3R1cmVUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvcGljdHVyZWlucGljdHVyZXRvZ2dsZWJ1dHRvbic7XG5leHBvcnQgeyBTcGFjZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvc3BhY2VyJztcbmV4cG9ydCB7IEJhY2tncm91bmRDb2xvclNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2JhY2tncm91bmRjb2xvcnNlbGVjdGJveCc7XG5leHBvcnQgeyBCYWNrZ3JvdW5kT3BhY2l0eVNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2JhY2tncm91bmRvcGFjaXR5c2VsZWN0Ym94JztcbmV4cG9ydCB7IENoYXJhY3RlckVkZ2VTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy9jaGFyYWN0ZXJlZGdlc2VsZWN0Ym94JztcbmV4cG9ydCB7IEZvbnRDb2xvclNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2ZvbnRjb2xvcnNlbGVjdGJveCc7XG5leHBvcnQgeyBGb250RmFtaWx5U2VsZWN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3MvZm9udGZhbWlseXNlbGVjdGJveCc7XG5leHBvcnQgeyBGb250T3BhY2l0eVNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL2ZvbnRvcGFjaXR5c2VsZWN0Ym94JztcbmV4cG9ydCB7IEZvbnRTaXplU2VsZWN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3MvZm9udHNpemVzZWxlY3Rib3gnO1xuZXhwb3J0IHsgU3VidGl0bGVTZXR0aW5nU2VsZWN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3Mvc3VidGl0bGVzZXR0aW5nc2VsZWN0Ym94JztcbmV4cG9ydCB7IFN1YnRpdGxlU2V0dGluZ3NMYWJlbCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NsYWJlbCc7XG5leHBvcnQgeyBXaW5kb3dDb2xvclNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3dpbmRvd2NvbG9yc2VsZWN0Ym94JztcbmV4cG9ydCB7IFdpbmRvd09wYWNpdHlTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVzZXR0aW5ncy93aW5kb3dvcGFjaXR5c2VsZWN0Ym94JztcbmV4cG9ydCB7IFN1YnRpdGxlU2V0dGluZ3NSZXNldEJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NyZXNldGJ1dHRvbic7XG5leHBvcnQgeyBMaXN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL2xpc3Rib3gnO1xuZXhwb3J0IHsgU3VidGl0bGVMaXN0Qm94IH0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlbGlzdGJveCc7XG5leHBvcnQgeyBBdWRpb1RyYWNrTGlzdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9hdWRpb3RyYWNrbGlzdGJveCc7XG5leHBvcnQgeyBTZXR0aW5nc1BhbmVsUGFnZSB9IGZyb20gJy4vY29tcG9uZW50cy9zZXR0aW5nc3BhbmVscGFnZSc7XG5leHBvcnQgeyBTZXR0aW5nc1BhbmVsUGFnZUJhY2tCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbHBhZ2ViYWNrYnV0dG9uJztcbmV4cG9ydCB7IFNldHRpbmdzUGFuZWxQYWdlT3BlbkJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9zZXR0aW5nc3BhbmVscGFnZW9wZW5idXR0b24nO1xuZXhwb3J0IHsgU3VidGl0bGVTZXR0aW5nc1BhbmVsUGFnZSB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NwYW5lbHBhZ2UnO1xuZXhwb3J0IHsgU2V0dGluZ3NQYW5lbEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbGl0ZW0nO1xuXG4vLyBPYmplY3QuYXNzaWduIHBvbHlmaWxsIGZvciBFUzUvSUU5XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgT2JqZWN0LmFzc2lnbiA9IGZ1bmN0aW9uKHRhcmdldDogYW55KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGxldCBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn0iLCJpbXBvcnQgeyBQbGF5ZXJBUEksIFBsYXllckV2ZW50LCBQbGF5ZXJFdmVudEJhc2UsIFBsYXllckV2ZW50Q2FsbGJhY2sgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgV3JhcHBlZFBsYXllciB9IGZyb20gJy4vdWltYW5hZ2VyJztcblxuZXhwb3J0IGVudW0gTW9iaWxlVjNQbGF5ZXJFdmVudCB7XG4gIFNvdXJjZUVycm9yID0gJ3NvdXJjZWVycm9yJyxcbiAgUGxheWVyRXJyb3IgPSAncGxheWVyZXJyb3InLFxuICBQbGF5bGlzdFRyYW5zaXRpb24gPSAncGxheWxpc3R0cmFuc2l0aW9uJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2JpbGVWM1BsYXllckVycm9yRXZlbnQgZXh0ZW5kcyBQbGF5ZXJFdmVudEJhc2Uge1xuICBjb2RlOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2JpbGVWM1NvdXJjZUVycm9yRXZlbnQgZXh0ZW5kcyBQbGF5ZXJFdmVudEJhc2Uge1xuICBjb2RlOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTW9iaWxlVjNQbGF5ZXJFdmVudFR5cGUgPSBQbGF5ZXJFdmVudCB8IE1vYmlsZVYzUGxheWVyRXZlbnQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlVjNQbGF5ZXJBUEkgZXh0ZW5kcyBQbGF5ZXJBUEkge1xuICBvbihldmVudFR5cGU6IE1vYmlsZVYzUGxheWVyRXZlbnRUeXBlLCBjYWxsYmFjazogUGxheWVyRXZlbnRDYWxsYmFjayk6IHZvaWQ7XG4gIGV4cG9ydHM6IFBsYXllckFQSVsnZXhwb3J0cyddICYgeyBQbGF5ZXJFdmVudDogTW9iaWxlVjNQbGF5ZXJFdmVudFR5cGUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9iaWxlVjNQbGF5ZXJBUEkocGxheWVyOiBXcmFwcGVkUGxheWVyIHwgUGxheWVyQVBJIHwgTW9iaWxlVjNQbGF5ZXJBUEkpOiBwbGF5ZXIgaXMgTW9iaWxlVjNQbGF5ZXJBUEkge1xuICBmb3IgKGNvbnN0IGtleSBpbiBNb2JpbGVWM1BsYXllckV2ZW50KSB7XG4gICAgaWYgKE1vYmlsZVYzUGxheWVyRXZlbnQuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhcGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHtFdmVudCwgRXZlbnREaXNwYXRjaGVyLCBOb0FyZ3N9IGZyb20gJy4vZXZlbnRkaXNwYXRjaGVyJztcbmltcG9ydCB7QnJvd3NlclV0aWxzfSBmcm9tICcuL2Jyb3dzZXJ1dGlscyc7XG5pbXBvcnQgeyBVSUluc3RhbmNlTWFuYWdlciB9IGZyb20gJy4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFBsYXllckFQSSwgVGltZVJhbmdlIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcblxuZXhwb3J0IG5hbWVzcGFjZSBQbGF5ZXJVdGlscyB7XG5cbiAgZXhwb3J0IGVudW0gUGxheWVyU3RhdGUge1xuICAgIElkbGUsXG4gICAgUHJlcGFyZWQsXG4gICAgUGxheWluZyxcbiAgICBQYXVzZWQsXG4gICAgRmluaXNoZWQsXG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaXNUaW1lU2hpZnRBdmFpbGFibGUocGxheWVyOiBQbGF5ZXJBUEkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGxheWVyLmlzTGl2ZSgpICYmIHBsYXllci5nZXRNYXhUaW1lU2hpZnQoKSAhPT0gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0ZShwbGF5ZXI6IFBsYXllckFQSSk6IFBsYXllclN0YXRlIHtcbiAgICBpZiAocGxheWVyLmhhc0VuZGVkKCkpIHtcbiAgICAgIHJldHVybiBQbGF5ZXJTdGF0ZS5GaW5pc2hlZDtcbiAgICB9IGVsc2UgaWYgKHBsYXllci5pc1BsYXlpbmcoKSkge1xuICAgICAgcmV0dXJuIFBsYXllclN0YXRlLlBsYXlpbmc7XG4gICAgfSBlbHNlIGlmIChwbGF5ZXIuaXNQYXVzZWQoKSkge1xuICAgICAgcmV0dXJuIFBsYXllclN0YXRlLlBhdXNlZDtcbiAgICB9IGVsc2UgaWYgKHBsYXllci5nZXRTb3VyY2UoKSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gUGxheWVyU3RhdGUuUHJlcGFyZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQbGF5ZXJTdGF0ZS5JZGxlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50VGltZSAtIHNlZWthYmxlUmFuZ2Uuc3RhcnQuIFRoaXMgZW5zdXJlcyBhIHVzZXItZnJpZW5kbHkgY3VycmVudFRpbWUgYWZ0ZXIgYSBsaXZlIHN0cmVhbVxuICAgKiB0cmFuc2l0aW9uZWQgdG8gVm9ELlxuICAgKiBAcGFyYW0gcGxheWVyXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWVSZWxhdGl2ZVRvU2Vla2FibGVSYW5nZShwbGF5ZXI6IFBsYXllckFQSSk6IG51bWJlciB7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBwbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTtcbiAgICBpZiAocGxheWVyLmlzTGl2ZSgpKSB7XG4gICAgICByZXR1cm4gY3VycmVudFRpbWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Vla2FibGVSYW5nZVN0YXJ0ID0gUGxheWVyVXRpbHMuZ2V0U2Vla2FibGVSYW5nZVN0YXJ0KHBsYXllciwgMCk7XG4gICAgcmV0dXJuIGN1cnJlbnRUaW1lIC0gc2Vla2FibGVSYW5nZVN0YXJ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0IHZhbHVlIG9mIHRoZSBzZWVrYWJsZSByYW5nZSBvciB0aGUgZGVmYXVsdFZhbHVlIGlmIG5vIHNlZWthYmxlUmFuZ2UgaXMgcHJlc2VudC5cbiAgICogRm9yIG5vdyB0aGlzIGhhcHBlbnMgb25seSBpbiBjb21iaW5hdGlvbiB3aXRoIE1vYmlsZSBTREtzLlxuICAgKlxuICAgKiBUT0RPOiByZW1vdmUgdGhpcyBmdW5jdGlvbiBpbiBuZXh0IG1ham9yIHJlbGVhc2VcbiAgICpcbiAgICogQHBhcmFtIHBsYXllclxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0U2Vla2FibGVSYW5nZVN0YXJ0KHBsYXllcjogUGxheWVyQVBJLCBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDApIHtcbiAgICByZXR1cm4gcGxheWVyLmdldFNlZWthYmxlUmFuZ2UoKSAmJiBwbGF5ZXIuZ2V0U2Vla2FibGVSYW5nZSgpLnN0YXJ0IHx8IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHBsYXllciBzZWVrYWJsZSB0aW1lIHJhbmdlIGZvciBsaXZlLlxuICAgKiBBcyB0aGUgcGxheWVyIHJldHVybnMgYHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH1gIGZvciBsaXZlIHN0cmVhbXMgd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGBzZWVrYWJsZVJhbmdlYCBiYXNlZCBvbiBgbWF4VGltZXNoaWZ0YC5cbiAgICpcbiAgICogQHBhcmFtIHBsYXllclxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWthYmxlUmFuZ2VSZXNwZWN0aW5nTGl2ZShwbGF5ZXI6IFBsYXllckFQSSk6IFRpbWVSYW5nZSB7XG4gICAgaWYgKCFwbGF5ZXIuaXNMaXZlKCkpIHtcbiAgICAgIHJldHVybiBwbGF5ZXIuZ2V0U2Vla2FibGVSYW5nZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRUaW1lc2hpZnQgPSAtcGxheWVyLmdldFRpbWVTaGlmdCgpO1xuICAgIGNvbnN0IG1heFRpbWVzaGlmdCA9IC1wbGF5ZXIuZ2V0TWF4VGltZVNoaWZ0KCk7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBwbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTtcblxuICAgIGNvbnN0IGVuZCA9IGN1cnJlbnRUaW1lICsgKGN1cnJlbnRUaW1lc2hpZnQpO1xuICAgIGNvbnN0IHN0YXJ0ID0gY3VycmVudFRpbWUgLSAobWF4VGltZXNoaWZ0IC0gY3VycmVudFRpbWVzaGlmdCk7XG5cbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIFRpbWVTaGlmdEF2YWlsYWJpbGl0eUNoYW5nZWRBcmdzIGV4dGVuZHMgTm9BcmdzIHtcbiAgICB0aW1lU2hpZnRBdmFpbGFibGU6IGJvb2xlYW47XG4gIH1cblxuICBleHBvcnQgY2xhc3MgVGltZVNoaWZ0QXZhaWxhYmlsaXR5RGV0ZWN0b3Ige1xuXG4gICAgcHJpdmF0ZSBwbGF5ZXI6IFBsYXllckFQSTtcbiAgICBwcml2YXRlIHRpbWVTaGlmdEF2YWlsYWJsZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIHRpbWVTaGlmdEF2YWlsYWJpbGl0eUNoYW5nZWRFdmVudCA9IG5ldyBFdmVudERpc3BhdGNoZXI8UGxheWVyQVBJLCBUaW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkQXJncz4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyQVBJKSB7XG4gICAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICAgIHRoaXMudGltZVNoaWZ0QXZhaWxhYmxlID0gdW5kZWZpbmVkO1xuXG4gICAgICBsZXQgdGltZVNoaWZ0RGV0ZWN0b3IgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGV0ZWN0KCk7XG4gICAgICB9O1xuICAgICAgLy8gVHJ5IHRvIGRldGVjdCB0aW1lc2hpZnQgYXZhaWxhYmlsaXR5IHdoZW4gc291cmNlIGlzIGxvYWRlZCwgd2hpY2ggd29ya3MgZm9yIERBU0ggc3RyZWFtc1xuICAgICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZUxvYWRlZCwgdGltZVNoaWZ0RGV0ZWN0b3IpO1xuICAgICAgLy8gV2l0aCBITFMvTmF0aXZlUGxheWVyIHN0cmVhbXMsIGdldE1heFRpbWVTaGlmdCBjYW4gYmUgMCBiZWZvcmUgdGhlIGJ1ZmZlciBmaWxscywgc28gd2UgbmVlZCB0byBhZGRpdGlvbmFsbHlcbiAgICAgIC8vIGNoZWNrIHRpbWVzaGlmdCBhdmFpbGFiaWxpdHkgaW4gVGltZUNoYW5nZWRcbiAgICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5UaW1lQ2hhbmdlZCwgdGltZVNoaWZ0RGV0ZWN0b3IpO1xuICAgIH1cblxuICAgIGRldGVjdCgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnBsYXllci5pc0xpdmUoKSkge1xuICAgICAgICBsZXQgdGltZVNoaWZ0QXZhaWxhYmxlTm93ID0gUGxheWVyVXRpbHMuaXNUaW1lU2hpZnRBdmFpbGFibGUodGhpcy5wbGF5ZXIpO1xuXG4gICAgICAgIC8vIFdoZW4gdGhlIGF2YWlsYWJpbGl0eSBjaGFuZ2VzLCB3ZSBmaXJlIHRoZSBldmVudFxuICAgICAgICBpZiAodGltZVNoaWZ0QXZhaWxhYmxlTm93ICE9PSB0aGlzLnRpbWVTaGlmdEF2YWlsYWJsZSkge1xuICAgICAgICAgIHRoaXMudGltZVNoaWZ0QXZhaWxhYmlsaXR5Q2hhbmdlZEV2ZW50LmRpc3BhdGNoKHRoaXMucGxheWVyLCB7IHRpbWVTaGlmdEF2YWlsYWJsZTogdGltZVNoaWZ0QXZhaWxhYmxlTm93IH0pO1xuICAgICAgICAgIHRoaXMudGltZVNoaWZ0QXZhaWxhYmxlID0gdGltZVNoaWZ0QXZhaWxhYmxlTm93O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IG9uVGltZVNoaWZ0QXZhaWxhYmlsaXR5Q2hhbmdlZCgpOiBFdmVudDxQbGF5ZXJBUEksIFRpbWVTaGlmdEF2YWlsYWJpbGl0eUNoYW5nZWRBcmdzPiB7XG4gICAgICByZXR1cm4gdGhpcy50aW1lU2hpZnRBdmFpbGFiaWxpdHlDaGFuZ2VkRXZlbnQuZ2V0RXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIExpdmVTdHJlYW1EZXRlY3RvckV2ZW50QXJncyBleHRlbmRzIE5vQXJncyB7XG4gICAgbGl2ZTogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIGNoYW5nZXMgb2YgdGhlIHN0cmVhbSB0eXBlLCBpLmUuIGNoYW5nZXMgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcGxheWVyI2lzTGl2ZSBtZXRob2QuXG4gICAqIE5vcm1hbGx5LCBhIHN0cmVhbSBjYW5ub3QgY2hhbmdlIGl0cyB0eXBlIGR1cmluZyBwbGF5YmFjaywgaXQncyBlaXRoZXIgVk9EIG9yIGxpdmUuIER1ZSB0byBidWdzIG9uIHNvbWVcbiAgICogcGxhdGZvcm1zIG9yIGJyb3dzZXJzLCBpdCBjYW4gc3RpbGwgY2hhbmdlLiBJdCBpcyB0aGVyZWZvcmUgdW5yZWxpYWJsZSB0byBqdXN0IGNoZWNrICNpc0xpdmUgYW5kIHRoaXMgZGV0ZWN0b3JcbiAgICogc2hvdWxkIGJlIHVzZWQgYXMgYSB3b3JrYXJvdW5kIGluc3RlYWQuXG4gICAqXG4gICAqIEFkZGl0aW9uYWxseSBzdGFydGluZyB3aXRoIHBsYXllciB2OC4xOS4wIHdlIGhhdmUgdGhlIHVzZS1jYXNlIHRoYXQgYSBsaXZlIHN0cmVhbSBjaGFuZ2VzIGludG8gYSB2b2QuXG4gICAqIFRoZSBEdXJhdGlvbkNoYW5nZWQgZXZlbnQgaW5kaWNhdGVzIHRoaXMgc3dpdGNoLlxuICAgKlxuICAgKiBLbm93biBjYXNlczpcbiAgICpcbiAgICogLSBITFMgVk9EIG9uIEFuZHJvaWQgNC4zXG4gICAqIFZpZGVvIGR1cmF0aW9uIGlzIGluaXRpYWxseSAnSW5maW5pdHknIGFuZCBvbmx5IGdldHMgYXZhaWxhYmxlIGFmdGVyIHBsYXliYWNrIHN0YXJ0cywgc28gc3RyZWFtcyBhcmUgd3JvbmdseVxuICAgKiByZXBvcnRlZCBhcyAnbGl2ZScgYmVmb3JlIHBsYXliYWNrICh0aGUgbGl2ZS1jaGVjayBpbiB0aGUgcGxheWVyIGNoZWNrcyBmb3IgaW5maW5pdGUgZHVyYXRpb24pLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSBVSSB2My45LjAgaW4gY29tYmluYXRpb24gd2l0aCBwbGF5ZXIgdjguMTkuMCB1c2UgUGxheWVyRXZlbnQuRHVyYXRpb25DaGFuZ2VkIGluc3RlYWRcbiAgICpcbiAgICogVE9ETzogcmVtb3ZlIHRoaXMgY2xhc3MgaW4gbmV4dCBtYWpvciByZWxlYXNlXG4gICAqL1xuICBleHBvcnQgY2xhc3MgTGl2ZVN0cmVhbURldGVjdG9yIHtcblxuICAgIHByaXZhdGUgcGxheWVyOiBQbGF5ZXJBUEk7XG4gICAgcHJpdmF0ZSBsaXZlOiBib29sZWFuO1xuICAgIHByaXZhdGUgbGl2ZUNoYW5nZWRFdmVudCA9IG5ldyBFdmVudERpc3BhdGNoZXI8UGxheWVyQVBJLCBMaXZlU3RyZWFtRGV0ZWN0b3JFdmVudEFyZ3M+KCk7XG4gICAgcHJpdmF0ZSB1aW1hbmFnZXI6IFVJSW5zdGFuY2VNYW5hZ2VyO1xuXG4gICAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXJBUEksIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpIHtcbiAgICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgICAgdGhpcy51aW1hbmFnZXIgPSB1aW1hbmFnZXI7XG4gICAgICB0aGlzLmxpdmUgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGxldCBsaXZlRGV0ZWN0b3IgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGV0ZWN0KCk7XG4gICAgICB9O1xuICAgICAgdGhpcy51aW1hbmFnZXIuZ2V0Q29uZmlnKCkuZXZlbnRzLm9uVXBkYXRlZC5zdWJzY3JpYmUobGl2ZURldGVjdG9yKTtcbiAgICAgIC8vIFJlLWV2YWx1YXRlIHdoZW4gcGxheWJhY2sgc3RhcnRzXG4gICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheSwgbGl2ZURldGVjdG9yKTtcblxuICAgICAgLy8gSExTIGxpdmUgZGV0ZWN0aW9uIHdvcmthcm91bmQgZm9yIEFuZHJvaWQ6XG4gICAgICAvLyBBbHNvIHJlLWV2YWx1YXRlIGR1cmluZyBwbGF5YmFjaywgYmVjYXVzZSB0aGF0IGlzIHdoZW4gdGhlIGxpdmUgZmxhZyBtaWdodCBjaGFuZ2UuXG4gICAgICAvLyAoRG9pbmcgaXQgb25seSBpbiBBbmRyb2lkIENocm9tZSBzYXZlcyB1bm5lY2Vzc2FyeSBvdmVyaGVhZCBvbiBvdGhlciBwbGF0Zm9ybXMpXG4gICAgICBpZiAoQnJvd3NlclV0aWxzLmlzQW5kcm9pZCAmJiBCcm93c2VyVXRpbHMuaXNDaHJvbWUpIHtcbiAgICAgICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlRpbWVDaGFuZ2VkLCBsaXZlRGV0ZWN0b3IpO1xuICAgICAgfVxuXG4gICAgICAvLyBEdXJhdGlvbkNoYW5nZWQgZXZlbnQgd2FzIGludHJvZHVjZWQgd2l0aCBwbGF5ZXIgdjguMTkuMFxuICAgICAgaWYgKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkR1cmF0aW9uQ2hhbmdlZCkge1xuICAgICAgICBwbGF5ZXIub24ocGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuRHVyYXRpb25DaGFuZ2VkLCBsaXZlRGV0ZWN0b3IpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZCB2aWRlbydzIGlzTGl2ZSgpIG1pZ2h0IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBhY3R1YWwgdmlkZW8ncyBpc0xpdmUoKS5cbiAgICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZEJyZWFrU3RhcnRlZCwgbGl2ZURldGVjdG9yKTtcbiAgICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZEJyZWFrRmluaXNoZWQsIGxpdmVEZXRlY3Rvcik7XG4gICAgfVxuXG4gICAgZGV0ZWN0KCk6IHZvaWQge1xuICAgICAgbGV0IGxpdmVOb3cgPSB0aGlzLnBsYXllci5pc0xpdmUoKTtcblxuICAgICAgLy8gQ29tcGFyZSBjdXJyZW50IHRvIHByZXZpb3VzIGxpdmUgc3RhdGUgZmxhZyBhbmQgZmlyZSBldmVudCB3aGVuIGl0IGNoYW5nZXMuIFNpbmNlIHdlIGluaXRpYWxpemUgdGhlIGZsYWdcbiAgICAgIC8vIHdpdGggdW5kZWZpbmVkLCB0aGVyZSBpcyBhbHdheXMgYXQgbGVhc3QgYW4gaW5pdGlhbCBldmVudCBmaXJlZCB0aGF0IHRlbGxzIGxpc3RlbmVycyB0aGUgbGl2ZSBzdGF0ZS5cbiAgICAgIGlmIChsaXZlTm93ICE9PSB0aGlzLmxpdmUpIHtcbiAgICAgICAgdGhpcy5saXZlQ2hhbmdlZEV2ZW50LmRpc3BhdGNoKHRoaXMucGxheWVyLCB7IGxpdmU6IGxpdmVOb3cgfSk7XG4gICAgICAgIHRoaXMubGl2ZSA9IGxpdmVOb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IG9uTGl2ZUNoYW5nZWQoKTogRXZlbnQ8UGxheWVyQVBJLCBMaXZlU3RyZWFtRGV0ZWN0b3JFdmVudEFyZ3M+IHtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVDaGFuZ2VkRXZlbnQuZ2V0RXZlbnQoKTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBuYW1lc3BhY2UgU3RvcmFnZVV0aWxzIHtcbiAgbGV0IGhhc0xvY2FsU3RvcmFnZUNhY2hlOiBib29sZWFuO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBoYXNMb2NhbFN0b3JhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKGhhc0xvY2FsU3RvcmFnZUNhY2hlKSB7XG4gICAgICByZXR1cm4gaGFzTG9jYWxTdG9yYWdlQ2FjaGU7XG4gICAgfVxuXG4gICAgLy8gaGFzTG9jYWxTdG9yYWdlIGlzIHVzZWQgdG8gc2FmZWx5IGVuc3VyZSB3ZSBjYW4gdXNlIGxvY2FsU3RvcmFnZVxuICAgIC8vIHRha2VuIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYl9TdG9yYWdlX0FQSS9Vc2luZ190aGVfV2ViX1N0b3JhZ2VfQVBJI0ZlYXR1cmUtZGV0ZWN0aW5nX2xvY2FsU3RvcmFnZVxuICAgIGxldCBzdG9yYWdlOiBhbnkgPSB7IGxlbmd0aDogMCB9O1xuICAgIHRyeSB7XG4gICAgICBzdG9yYWdlID0gd2luZG93Wydsb2NhbFN0b3JhZ2UnXTtcbiAgICAgIGxldCB4ID0gJ19fc3RvcmFnZV90ZXN0X18nO1xuICAgICAgc3RvcmFnZS5zZXRJdGVtKHgsIHgpO1xuICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKHgpO1xuICAgICAgaGFzTG9jYWxTdG9yYWdlQ2FjaGUgPSB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgaGFzTG9jYWxTdG9yYWdlQ2FjaGUgPSBlIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmIChcbiAgICAgICAgICAvLyBldmVyeXRoaW5nIGV4Y2VwdCBGaXJlZm94XG4gICAgICAgIGUuY29kZSA9PT0gMjIgfHxcbiAgICAgICAgLy8gRmlyZWZveFxuICAgICAgICBlLmNvZGUgPT09IDEwMTQgfHxcbiAgICAgICAgLy8gdGVzdCBuYW1lIGZpZWxkIHRvbywgYmVjYXVzZSBjb2RlIG1pZ2h0IG5vdCBiZSBwcmVzZW50XG4gICAgICAgIC8vIGV2ZXJ5dGhpbmcgZXhjZXB0IEZpcmVmb3hcbiAgICAgICAgZS5uYW1lID09PSAnUXVvdGFFeGNlZWRlZEVycm9yJyB8fFxuICAgICAgICAvLyBGaXJlZm94XG4gICAgICAgIGUubmFtZSA9PT0gJ05TX0VSUk9SX0RPTV9RVU9UQV9SRUFDSEVEJykgJiZcbiAgICAgICAgLy8gYWNrbm93bGVkZ2UgUXVvdGFFeGNlZWRlZEVycm9yIG9ubHkgaWYgdGhlcmUncyBzb21ldGhpbmcgYWxyZWFkeSBzdG9yZWRcbiAgICAgICAgc3RvcmFnZS5sZW5ndGggIT09IDA7XG4gICAgfVxuICAgIHJldHVybiBoYXNMb2NhbFN0b3JhZ2VDYWNoZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZXMgYSBzdHJpbmcgaXRlbSBpbnRvIGxvY2FsU3RvcmFnZS5cbiAgICogQHBhcmFtIGtleSB0aGUgaXRlbSdzIGtleVxuICAgKiBAcGFyYW0gZGF0YSB0aGUgaXRlbSdzIGRhdGFcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBzZXRJdGVtKGtleTogc3RyaW5nLCBkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoU3RvcmFnZVV0aWxzLmhhc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBpdGVtJ3Mgc3RyaW5nIHZhbHVlIGZyb20gdGhlIGxvY2FsU3RvcmFnZS5cbiAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxvb2sgdXAgaXRzIGFzc29jaWF0ZWQgdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nIHwgbnVsbH0gUmV0dXJucyB0aGUgc3RyaW5nIGlmIGZvdW5kLCBudWxsIGlmIHRoZXJlIGlzIG5vIGRhdGEgc3RvcmVkIGZvciB0aGUga2V5XG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0SXRlbShrZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChTdG9yYWdlVXRpbHMuaGFzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlcyBhbiBvYmplY3QgaW50byBsb2NhbFN0b3JhZ2UuIFRoZSBvYmplY3Qgd2lsbCBiZSBzZXJpYWxpemVkIHRvIEpTT04uIFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHN1cHBvcnRlZFxuICAgKiBpbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCB0eXBlczpcbiAgICogIC0gQ29sb3JVdGlscy5Db2xvclxuICAgKlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gc3RvcmUgdGhlIGRhdGEgdG9cbiAgICogQHBhcmFtIGRhdGEgdGhlIG9iamVjdCB0byBzdG9yZVxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHNldE9iamVjdDxUPihrZXk6IHN0cmluZywgZGF0YTogVCk6IHZvaWQge1xuICAgIGlmIChTdG9yYWdlVXRpbHMuaGFzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIGxldCBqc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICBzZXRJdGVtKGtleSwganNvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gb2JqZWN0IGZvciB0aGUgZ2l2ZW4ga2V5IGZyb20gbG9jYWxTdG9yYWdlLiBUaGUgb2JqZWN0IHdpbGwgYmUgZGVzZXJpYWxpemVkIGZyb20gSlNPTi4gQmVzaWRlIHRoZVxuICAgKiBkZWZhdWx0IHR5cGVzLCB0aGUgZm9sbG93aW5nIHR5cGVzIGFyZSBzdXBwb3J0ZWQ6XG4gICAqICAtIENvbG9yVXRpbHMuQ29sb3JcbiAgICpcbiAgICogQHBhcmFtIGtleSB0aGUga2V5IHRvIGxvb2sgdXAgaXRzIGFzc29jaWF0ZWQgb2JqZWN0XG4gICAqIEByZXR1cm4ge2FueX0gUmV0dXJucyB0aGUgb2JqZWN0IGlmIGZvdW5kLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldE9iamVjdDxUPihrZXk6IHN0cmluZyk6IFQge1xuICAgIGlmIChTdG9yYWdlVXRpbHMuaGFzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIGxldCBqc29uID0gZ2V0SXRlbShrZXkpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGxldCBvYmplY3QgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICByZXR1cm4gPFQ+b2JqZWN0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUGxheWVyQVBJIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuL2xvY2FsaXphdGlvbi9pMThuJztcblxuZXhwb3J0IG5hbWVzcGFjZSBTdHJpbmdVdGlscyB7XG5cbiAgZXhwb3J0IGxldCBGT1JNQVRfSEhNTVNTOiBzdHJpbmcgPSAnaGg6bW06c3MnO1xuICBleHBvcnQgbGV0IEZPUk1BVF9NTVNTOiBzdHJpbmcgPSAnbW06c3MnO1xuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGEgbnVtYmVyIG9mIHNlY29uZHMgaW50byBhIHRpbWUgc3RyaW5nIHdpdGggdGhlIHBhdHRlcm4gaGg6bW06c3MuXG4gICAqXG4gICAqIEBwYXJhbSB0b3RhbFNlY29uZHMgdGhlIHRvdGFsIG51bWJlciBvZiBzZWNvbmRzIHRvIGZvcm1hdCB0byBzdHJpbmdcbiAgICogQHBhcmFtIGZvcm1hdCB0aGUgdGltZSBmb3JtYXQgdG8gb3V0cHV0IChkZWZhdWx0OiBoaDptbTpzcylcbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIGZvcm1hdHRlZCB0aW1lIHN0cmluZ1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHNlY29uZHNUb1RpbWUodG90YWxTZWNvbmRzOiBudW1iZXIsIGZvcm1hdDogc3RyaW5nID0gRk9STUFUX0hITU1TUyk6IHN0cmluZyB7XG4gICAgbGV0IGlzTmVnYXRpdmUgPSB0b3RhbFNlY29uZHMgPCAwO1xuXG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIC8vIElmIHRoZSB0aW1lIGlzIG5lZ2F0aXZlLCB3ZSBtYWtlIGl0IHBvc2l0aXZlIGZvciB0aGUgY2FsY3VsYXRpb24gYmVsb3dcbiAgICAgIC8vIChlbHNlIHdlJ2QgZ2V0IGFsbCBuZWdhdGl2ZSBudW1iZXJzKSBhbmQgcmVhdHRhY2ggdGhlIG5lZ2F0aXZlIHNpZ24gbGF0ZXIuXG4gICAgICB0b3RhbFNlY29uZHMgPSAtdG90YWxTZWNvbmRzO1xuICAgIH1cblxuICAgIC8vIFNwbGl0IGludG8gc2VwYXJhdGUgdGltZSBwYXJ0c1xuICAgIGxldCBob3VycyA9IE1hdGguZmxvb3IodG90YWxTZWNvbmRzIC8gMzYwMCk7XG4gICAgbGV0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDYwKSAtIGhvdXJzICogNjA7XG4gICAgbGV0IHNlY29uZHMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcykgJSA2MDtcblxuICAgIHJldHVybiAoaXNOZWdhdGl2ZSA/ICctJyA6ICcnKSArIGZvcm1hdFxuICAgICAgICAucmVwbGFjZSgnaGgnLCBsZWZ0UGFkV2l0aFplcm9zKGhvdXJzLCAyKSlcbiAgICAgICAgLnJlcGxhY2UoJ21tJywgbGVmdFBhZFdpdGhaZXJvcyhtaW51dGVzLCAyKSlcbiAgICAgICAgLnJlcGxhY2UoJ3NzJywgbGVmdFBhZFdpdGhaZXJvcyhzZWNvbmRzLCAyKSk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gc2Vjb25kc1RvVGV4dCh0b3RhbFNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaXNOZWdhdGl2ZSA9IHRvdGFsU2Vjb25kcyA8IDA7XG5cbiAgICBpZiAoaXNOZWdhdGl2ZSkge1xuICAgICAgLy8gSWYgdGhlIHRpbWUgaXMgbmVnYXRpdmUsIHdlIG1ha2UgaXQgcG9zaXRpdmUgZm9yIHRoZSBjYWxjdWxhdGlvbiBiZWxvd1xuICAgICAgLy8gKGVsc2Ugd2UnZCBnZXQgYWxsIG5lZ2F0aXZlIG51bWJlcnMpIGFuZCByZWF0dGFjaCB0aGUgbmVnYXRpdmUgc2lnbiBsYXRlci5cbiAgICAgIHRvdGFsU2Vjb25kcyA9IC10b3RhbFNlY29uZHM7XG4gICAgfVxuXG4gICAgLy8gU3BsaXQgaW50byBzZXBhcmF0ZSB0aW1lIHBhcnRzXG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDM2MDApO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIDYwKSAtIGhvdXJzICogNjA7XG4gICAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IodG90YWxTZWNvbmRzKSAlIDYwO1xuXG4gICAgcmV0dXJuIChpc05lZ2F0aXZlID8gJy0nIDogJycpICtcbiAgICAoaG91cnMgIT09IDAgPyBgJHtsZWZ0UGFkV2l0aFplcm9zKGhvdXJzLCAyKX0gJHtpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnRpbWUuaG91cnMnKSl9IGAgOiAnJykgK1xuICAgIChtaW51dGVzICE9PSAwID8gYCR7bGVmdFBhZFdpdGhaZXJvcyhtaW51dGVzLCAyKX0gJHtpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnRpbWUubWludXRlcycpKX0gYCA6ICcnKSArXG4gICAgYCR7bGVmdFBhZFdpdGhaZXJvcyhzZWNvbmRzLCAyKX0gJHtpMThuLnBlcmZvcm1Mb2NhbGl6YXRpb24oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnRpbWUuc2Vjb25kcycpKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgbnVtYmVyIHRvIGEgc3RyaW5nIGFuZCBsZWZ0LXBhZHMgaXQgd2l0aCB6ZXJvcyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cbiAgICogRXhhbXBsZTogbGVmdFBhZFdpdGhaZXJvcygxMjMsIDUpID0+ICcwMDEyMydcbiAgICpcbiAgICogQHBhcmFtIG51bSB0aGUgbnVtYmVyIHRvIGNvbnZlcnQgdG8gc3RyaW5nIGFuZCBwYWQgd2l0aCB6ZXJvc1xuICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBkZXNpcmVkIGxlbmd0aCBvZiB0aGUgcGFkZGVkIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcGFkZGVkIG51bWJlciBhcyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIGxlZnRQYWRXaXRoWmVyb3MobnVtOiBudW1iZXIgfCBzdHJpbmcsIGxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBsZXQgdGV4dCA9IG51bSArICcnO1xuICAgIGxldCBwYWRkaW5nID0gJzAwMDAwMDAwMDAnLnN1YnN0cigwLCBsZW5ndGggLSB0ZXh0Lmxlbmd0aCk7XG4gICAgcmV0dXJuIHBhZGRpbmcgKyB0ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbGxzIG91dCBwbGFjZWhvbGRlcnMgaW4gYW4gYWQgbWVzc2FnZS5cbiAgICpcbiAgICogSGFzIHRoZSBwbGFjZWhvbGRlcnMgJ3tyZW1haW5pbmdUaW1lW2Zvcm1hdFN0cmluZ119JywgJ3twbGF5ZWRUaW1lW2Zvcm1hdFN0cmluZ119JyBhbmRcbiAgICogJ3thZER1cmF0aW9uW2Zvcm1hdFN0cmluZ119Jywgd2hpY2ggYXJlIHJlcGxhY2VkIGJ5IHRoZSByZW1haW5pbmcgdGltZSB1bnRpbCB0aGUgYWQgY2FuIGJlIHNraXBwZWQsIHRoZSBjdXJyZW50XG4gICAqIHRpbWUgb3IgdGhlIGFkIGR1cmF0aW9uLiBUaGUgZm9ybWF0IHN0cmluZyBpcyBvcHRpb25hbC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHBsYWNlaG9sZGVyIGlzIHJlcGxhY2VkIGJ5IHRoZSB0aW1lXG4gICAqIGluIHNlY29uZHMuIElmIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAgICogLSAlZCAtIEluc2VydHMgdGhlIHRpbWUgYXMgYW4gaW50ZWdlci5cbiAgICogLSAlME5kIC0gSW5zZXJ0cyB0aGUgdGltZSBhcyBhbiBpbnRlZ2VyIHdpdGggbGVhZGluZyB6ZXJvZXMsIGlmIHRoZSBsZW5ndGggb2YgdGhlIHRpbWUgc3RyaW5nIGlzIHNtYWxsZXIgdGhhbiBOLlxuICAgKiAtICVmIC0gSW5zZXJ0cyB0aGUgdGltZSBhcyBhIGZsb2F0LlxuICAgKiAtICUwTmYgLSBJbnNlcnRzIHRoZSB0aW1lIGFzIGEgZmxvYXQgd2l0aCBsZWFkaW5nIHplcm9lcy5cbiAgICogLSAlLk1mIC0gSW5zZXJ0cyB0aGUgdGltZSBhcyBhIGZsb2F0IHdpdGggTSBkZWNpbWFsIHBsYWNlcy4gQ2FuIGJlIGNvbWJpbmVkIHdpdGggJTBOZiwgZS5nLiAlMDQuMmYgKHRoZSB0aW1lXG4gICAqIDEwLjEyMyB3b3VsZCBiZSBwcmludGVkIGFzIDAwMTAuMTIpLlxuICAgKiAtICVoaDptbTpzc1xuICAgKiAtICVtbTpzc1xuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogLSB7IHRleHQ6ICdBZDoge3JlbWFpbmluZ1RpbWUlbW06c3N9IHNlY3MnIH1cbiAgICogQW4gaW5wdXQgdmFsdWUgb2YgMTAwIHdvdWxkIGJlIGRpc3BsYXllZCBhczogJ0FkOiAwMTo0MCBzZWNzJ1xuICAgKiAtIHsgdGV4dDogJ0FkOiB7cmVtYWluaW5nVGltZSVmfSBzZWNzJyB9XG4gICAqIEFuIGlucHV0IHZhbHVlIG9mIDEwMCB3b3VsZCBiZSBkaXNwbGF5ZWQgYXM6ICdBZDogMTAwLjAgc2VjcydcbiAgICpcbiAgICogQHBhcmFtIGFkTWVzc2FnZSBhbiBhZCBtZXNzYWdlIHdpdGggb3B0aW9uYWwgcGxhY2Vob2xkZXJzIHRvIGZpbGxcbiAgICogQHBhcmFtIHNraXBPZmZzZXQgaWYgc3BlY2lmaWVkLCB7cmVtYWluaW5nVGltZX0gd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgcmVtYWluaW5nIHRpbWUgdW50aWwgdGhlIGFkIGNhbiBiZSBza2lwcGVkXG4gICAqIEBwYXJhbSBwbGF5ZXIgdGhlIHBsYXllciB0byBnZXQgdGhlIHRpbWUgZGF0YSBmcm9tXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBhZCBtZXNzYWdlIHdpdGggZmlsbGVkIHBsYWNlaG9sZGVyc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VBZE1lc3NhZ2VQbGFjZWhvbGRlcnMoYWRNZXNzYWdlOiBzdHJpbmcsIHNraXBPZmZzZXQ6IG51bWJlciwgcGxheWVyOiBQbGF5ZXJBUEkpIHtcbiAgICBsZXQgYWRNZXNzYWdlUGxhY2Vob2xkZXJSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAnXFxcXHsocmVtYWluaW5nVGltZXxwbGF5ZWRUaW1lfGFkRHVyYXRpb24pKH18JSgoMFsxLTldXFxcXGQqKFxcXFwuXFxcXGQrKGR8Zil8ZHxmKXxcXFxcLlxcXFxkK2Z8ZHxmKXxoaDptbTpzc3xtbTpzcyl9KScsXG4gICAgICAnZycsXG4gICAgKTtcblxuICAgIHJldHVybiBhZE1lc3NhZ2UucmVwbGFjZShhZE1lc3NhZ2VQbGFjZWhvbGRlclJlZ2V4LCAoZm9ybWF0U3RyaW5nKSA9PiB7XG4gICAgICBsZXQgdGltZSA9IDA7XG4gICAgICBpZiAoZm9ybWF0U3RyaW5nLmluZGV4T2YoJ3JlbWFpbmluZ1RpbWUnKSA+IC0xKSB7XG4gICAgICAgIGlmIChza2lwT2Zmc2V0KSB7XG4gICAgICAgICAgdGltZSA9IE1hdGguY2VpbChza2lwT2Zmc2V0IC0gcGxheWVyLmdldEN1cnJlbnRUaW1lKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRpbWUgPSBwbGF5ZXIuZ2V0RHVyYXRpb24oKSAtIHBsYXllci5nZXRDdXJyZW50VGltZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZvcm1hdFN0cmluZy5pbmRleE9mKCdwbGF5ZWRUaW1lJykgPiAtMSkge1xuICAgICAgICB0aW1lID0gcGxheWVyLmdldEN1cnJlbnRUaW1lKCk7XG4gICAgICB9IGVsc2UgaWYgKGZvcm1hdFN0cmluZy5pbmRleE9mKCdhZER1cmF0aW9uJykgPiAtMSkge1xuICAgICAgICB0aW1lID0gcGxheWVyLmdldER1cmF0aW9uKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm9ybWF0TnVtYmVyKE1hdGgucm91bmQodGltZSksIGZvcm1hdFN0cmluZyk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXROdW1iZXIodGltZTogbnVtYmVyLCBmb3JtYXQ6IHN0cmluZykge1xuICAgIGxldCBmb3JtYXRTdHJpbmdWYWxpZGF0aW9uUmVnZXggPSAvJSgoMFsxLTldXFxkKihcXC5cXGQrKGR8Zil8ZHxmKXxcXC5cXGQrZnxkfGYpfGhoOm1tOnNzfG1tOnNzKS87XG4gICAgbGV0IGxlYWRpbmdaZXJvZXNSZWdleCA9IC8oJTBbMS05XVxcZCopKD89KFxcLlxcZCtmfGZ8ZCkpLztcbiAgICBsZXQgZGVjaW1hbFBsYWNlc1JlZ2V4ID0gL1xcLlxcZCooPz1mKS87XG5cbiAgICBpZiAoIWZvcm1hdFN0cmluZ1ZhbGlkYXRpb25SZWdleC50ZXN0KGZvcm1hdCkpIHtcbiAgICAgIC8vIElmIHRoZSBmb3JtYXQgaXMgaW52YWxpZCwgd2Ugc2V0IGEgZGVmYXVsdCBmYWxsYmFjayBmb3JtYXRcbiAgICAgIGZvcm1hdCA9ICclZCc7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvc1xuICAgIGxldCBsZWFkaW5nWmVyb2VzID0gMDtcbiAgICBsZXQgbGVhZGluZ1plcm9lc01hdGNoZXMgPSBmb3JtYXQubWF0Y2gobGVhZGluZ1plcm9lc1JlZ2V4KTtcbiAgICBpZiAobGVhZGluZ1plcm9lc01hdGNoZXMpIHtcbiAgICAgIGxlYWRpbmdaZXJvZXMgPSBwYXJzZUludChsZWFkaW5nWmVyb2VzTWF0Y2hlc1swXS5zdWJzdHJpbmcoMikpO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXG4gICAgbGV0IG51bURlY2ltYWxQbGFjZXMgPSBudWxsO1xuICAgIGxldCBkZWNpbWFsUGxhY2VzTWF0Y2hlcyA9IGZvcm1hdC5tYXRjaChkZWNpbWFsUGxhY2VzUmVnZXgpO1xuICAgIGlmIChkZWNpbWFsUGxhY2VzTWF0Y2hlcyAmJiAhaXNOYU4ocGFyc2VJbnQoZGVjaW1hbFBsYWNlc01hdGNoZXNbMF0uc3Vic3RyaW5nKDEpKSkpIHtcbiAgICAgIG51bURlY2ltYWxQbGFjZXMgPSBwYXJzZUludChkZWNpbWFsUGxhY2VzTWF0Y2hlc1swXS5zdWJzdHJpbmcoMSkpO1xuICAgICAgaWYgKG51bURlY2ltYWxQbGFjZXMgPiAyMCkge1xuICAgICAgICBudW1EZWNpbWFsUGxhY2VzID0gMjA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmxvYXQgZm9ybWF0XG4gICAgaWYgKGZvcm1hdC5pbmRleE9mKCdmJykgPiAtMSkge1xuICAgICAgbGV0IHRpbWVTdHJpbmcgPSAnJztcblxuICAgICAgaWYgKG51bURlY2ltYWxQbGFjZXMgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQXBwbHkgZml4ZWQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXG4gICAgICAgIHRpbWVTdHJpbmcgPSB0aW1lLnRvRml4ZWQobnVtRGVjaW1hbFBsYWNlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lU3RyaW5nID0gJycgKyB0aW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBsZWFkaW5nIHplcm9zXG4gICAgICBpZiAodGltZVN0cmluZy5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gbGVmdFBhZFdpdGhaZXJvcyh0aW1lU3RyaW5nLCB0aW1lU3RyaW5nLmxlbmd0aCArIChsZWFkaW5nWmVyb2VzIC0gdGltZVN0cmluZy5pbmRleE9mKCcuJykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsZWZ0UGFkV2l0aFplcm9zKHRpbWVTdHJpbmcsIGxlYWRpbmdaZXJvZXMpO1xuICAgICAgfVxuXG4gICAgfVxuICAgIC8vIFRpbWUgZm9ybWF0XG4gICAgZWxzZSBpZiAoZm9ybWF0LmluZGV4T2YoJzonKSA+IC0xKSB7XG4gICAgICBsZXQgdG90YWxTZWNvbmRzID0gTWF0aC5jZWlsKHRpbWUpO1xuXG4gICAgICAvLyBoaDptbTpzcyBmb3JtYXRcbiAgICAgIGlmIChmb3JtYXQuaW5kZXhPZignaGgnKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiBzZWNvbmRzVG9UaW1lKHRvdGFsU2Vjb25kcyk7XG4gICAgICB9XG4gICAgICAvLyBtbTpzcyBmb3JtYXRcbiAgICAgIGVsc2Uge1xuICAgICAgICBsZXQgbWludXRlcyA9IE1hdGguZmxvb3IodG90YWxTZWNvbmRzIC8gNjApO1xuICAgICAgICBsZXQgc2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xuXG4gICAgICAgIHJldHVybiBsZWZ0UGFkV2l0aFplcm9zKG1pbnV0ZXMsIDIpICsgJzonICsgbGVmdFBhZFdpdGhaZXJvcyhzZWNvbmRzLCAyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW50ZWdlciBmb3JtYXRcbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBsZWZ0UGFkV2l0aFplcm9zKE1hdGguY2VpbCh0aW1lKSwgbGVhZGluZ1plcm9lcyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBMaXN0SXRlbSwgTGlzdFNlbGVjdG9yLCBMaXN0U2VsZWN0b3JDb25maWcgfSBmcm9tICcuL2NvbXBvbmVudHMvbGlzdHNlbGVjdG9yJztcbmltcG9ydCB7IFVJSW5zdGFuY2VNYW5hZ2VyIH0gZnJvbSAnLi91aW1hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyQVBJLCBTdWJ0aXRsZUV2ZW50LCBTdWJ0aXRsZVRyYWNrIH0gZnJvbSAnYml0bW92aW4tcGxheWVyJztcbmltcG9ydCB7IGkxOG4gfSBmcm9tICcuL2xvY2FsaXphdGlvbi9pMThuJztcblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGFsbCBzdWJ0aXRsZSByZWxhdGVkIGV2ZW50c1xuICpcbiAqIFRoaXMgY2xhc3MgbGlzdGVucyB0byBwbGF5ZXIgZXZlbnRzIGFzIHdlbGwgYXMgdGhlIGBMaXN0U2VsZWN0b3JgIGV2ZW50IGlmIHNlbGVjdGlvbiBjaGFuZ2VkXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWJ0aXRsZVN3aXRjaEhhbmRsZXIge1xuXG4gIHByaXZhdGUgc3RhdGljIFNVQlRJVExFU19PRkZfS0VZOiBzdHJpbmcgPSAnbnVsbCc7XG5cbiAgcHJpdmF0ZSBwbGF5ZXI6IFBsYXllckFQSTtcbiAgcHJpdmF0ZSBsaXN0RWxlbWVudDogTGlzdFNlbGVjdG9yPExpc3RTZWxlY3RvckNvbmZpZz47XG4gIHByaXZhdGUgdWltYW5hZ2VyOiBVSUluc3RhbmNlTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllckFQSSwgZWxlbWVudDogTGlzdFNlbGVjdG9yPExpc3RTZWxlY3RvckNvbmZpZz4sIHVpbWFuYWdlcjogVUlJbnN0YW5jZU1hbmFnZXIpIHtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLmxpc3RFbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLnVpbWFuYWdlciA9IHVpbWFuYWdlcjtcblxuICAgIHRoaXMuYmluZFNlbGVjdGlvbkV2ZW50KCk7XG4gICAgdGhpcy5iaW5kUGxheWVyRXZlbnRzKCk7XG4gICAgdGhpcy5yZWZyZXNoU3VidGl0bGVzKCk7XG4gIH1cblxuICBwcml2YXRlIGJpbmRTZWxlY3Rpb25FdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RFbGVtZW50Lm9uSXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoXywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgY29uY3VycmVudCBzdWJ0aXRsZSBzZWxlY3Rpb25zXG4gICAgICBpZiAodmFsdWUgPT09IFN1YnRpdGxlU3dpdGNoSGFuZGxlci5TVUJUSVRMRVNfT0ZGX0tFWSkge1xuICAgICAgICBjb25zdCBjdXJyZW50U3VidGl0bGUgPSB0aGlzLnBsYXllci5zdWJ0aXRsZXMubGlzdCgpLmZpbHRlcigoc3VidGl0bGUpID0+IHN1YnRpdGxlLmVuYWJsZWQpLnBvcCgpO1xuICAgICAgICBpZiAoY3VycmVudFN1YnRpdGxlKSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIuc3VidGl0bGVzLmRpc2FibGUoY3VycmVudFN1YnRpdGxlLmlkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIuc3VidGl0bGVzLmVuYWJsZSh2YWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJpbmRQbGF5ZXJFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5wbGF5ZXIub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5TdWJ0aXRsZUFkZGVkLCB0aGlzLmFkZFN1YnRpdGxlKTtcbiAgICB0aGlzLnBsYXllci5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlN1YnRpdGxlRW5hYmxlZCwgdGhpcy5zZWxlY3RDdXJyZW50U3VidGl0bGUpO1xuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3VidGl0bGVEaXNhYmxlZCwgdGhpcy5zZWxlY3RDdXJyZW50U3VidGl0bGUpO1xuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU3VidGl0bGVSZW1vdmVkLCB0aGlzLnJlbW92ZVN1YnRpdGxlKTtcbiAgICAvLyBVcGRhdGUgc3VidGl0bGVzIHdoZW4gc291cmNlIGdvZXMgYXdheVxuICAgIHRoaXMucGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlVW5sb2FkZWQsIHRoaXMuY2xlYXJTdWJ0aXRsZXMpO1xuICAgIC8vIFVwZGF0ZSBzdWJ0aXRsZXMgd2hlbiB0aGUgcGVyaW9kIHdpdGhpbiBhIHNvdXJjZSBjaGFuZ2VzXG4gICAgdGhpcy5wbGF5ZXIub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5QZXJpb2RTd2l0Y2hlZCwgdGhpcy5yZWZyZXNoU3VidGl0bGVzKTtcbiAgICB0aGlzLnVpbWFuYWdlci5nZXRDb25maWcoKS5ldmVudHMub25VcGRhdGVkLnN1YnNjcmliZSh0aGlzLnJlZnJlc2hTdWJ0aXRsZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTdWJ0aXRsZSA9IChldmVudDogU3VidGl0bGVFdmVudCkgPT4ge1xuICAgIGNvbnN0IHN1YnRpdGxlID0gZXZlbnQuc3VidGl0bGU7XG4gICAgaWYgKCF0aGlzLmxpc3RFbGVtZW50Lmhhc0l0ZW0oc3VidGl0bGUuaWQpKSB7XG4gICAgICB0aGlzLmxpc3RFbGVtZW50LmFkZEl0ZW0oc3VidGl0bGUuaWQsIHN1YnRpdGxlLmxhYmVsKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZW1vdmVTdWJ0aXRsZSA9IChldmVudDogU3VidGl0bGVFdmVudCkgPT4ge1xuICAgIGNvbnN0IHN1YnRpdGxlID0gZXZlbnQuc3VidGl0bGU7XG4gICAgaWYgKHRoaXMubGlzdEVsZW1lbnQuaGFzSXRlbShzdWJ0aXRsZS5pZCkpIHtcbiAgICAgIHRoaXMubGlzdEVsZW1lbnQucmVtb3ZlSXRlbShzdWJ0aXRsZS5pZCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2VsZWN0Q3VycmVudFN1YnRpdGxlID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5wbGF5ZXIuc3VidGl0bGVzKSB7XG4gICAgICAvLyBTdWJ0aXRsZXMgQVBJIG5vdCBhdmFpbGFibGUgKHlldClcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudFN1YnRpdGxlID0gdGhpcy5wbGF5ZXIuc3VidGl0bGVzLmxpc3QoKS5maWx0ZXIoKHN1YnRpdGxlKSA9PiBzdWJ0aXRsZS5lbmFibGVkKS5wb3AoKTtcbiAgICB0aGlzLmxpc3RFbGVtZW50LnNlbGVjdEl0ZW0oY3VycmVudFN1YnRpdGxlID8gY3VycmVudFN1YnRpdGxlLmlkIDogU3VidGl0bGVTd2l0Y2hIYW5kbGVyLlNVQlRJVExFU19PRkZfS0VZKTtcbiAgfTtcblxuICBwcml2YXRlIGNsZWFyU3VidGl0bGVzID0gKCkgPT4ge1xuICAgIHRoaXMubGlzdEVsZW1lbnQuY2xlYXJJdGVtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoU3VidGl0bGVzID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5wbGF5ZXIuc3VidGl0bGVzKSB7XG4gICAgICAvLyBTdWJ0aXRsZXMgQVBJIG5vdCBhdmFpbGFibGUgKHlldClcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvZmZMaXN0SXRlbTogTGlzdEl0ZW0gPSB7XG4gICAgICBrZXk6IFN1YnRpdGxlU3dpdGNoSGFuZGxlci5TVUJUSVRMRVNfT0ZGX0tFWSxcbiAgICAgIGxhYmVsOiBpMThuLmdldExvY2FsaXplcignb2ZmJyksXG4gICAgfTtcblxuICAgIGNvbnN0IHN1YnRpdGxlcyA9IHRoaXMucGxheWVyLnN1YnRpdGxlcy5saXN0KCk7XG4gICAgY29uc3Qgc3VidGl0bGVUb0xpc3RJdGVtID0gKHN1YnRpdGxlOiBTdWJ0aXRsZVRyYWNrKTogTGlzdEl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIHsga2V5OiBzdWJ0aXRsZS5pZCwgbGFiZWw6IHN1YnRpdGxlLmxhYmVsIH07XG4gICAgfTtcblxuICAgIHRoaXMubGlzdEVsZW1lbnQuc3luY2hyb25pemVJdGVtcyhbXG4gICAgICBvZmZMaXN0SXRlbSwgLi4uc3VidGl0bGVzLm1hcChzdWJ0aXRsZVRvTGlzdEl0ZW0pLFxuICAgIF0pO1xuICAgIHRoaXMuc2VsZWN0Q3VycmVudFN1YnRpdGxlKCk7XG4gIH07XG59XG4iLCIvLyBUT0RPIGNoYW5nZSB0byBpbnRlcm5hbCAobm90IGV4cG9ydGVkKSBjbGFzcywgaG93IHRvIHVzZSBpbiBvdGhlciBmaWxlcz9cbi8qKlxuICogRXhlY3V0ZXMgYSBjYWxsYmFjayBhZnRlciBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSwgb3B0aW9uYWxseSByZXBlYXRlZGx5IHVudGlsIHN0b3BwZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lb3V0IHtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlbGF5OiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVwZWF0OiBib29sZWFuO1xuICAvLyBUaGVyZSdzIHR3byBzZXRUaW1lb3V0IGRlY2xhcmF0aW9ucywgb25lIG9uIFdpbmRvdyB3aGljaCByZXR1cm5zIHR5cGUgXCJudW1iZXJcIiBhbmQgb25lIGluIE5vZGVKUyB3aGljaCByZXR1cm5zXG4gIC8vIHR5cGUgXCJUaW1lclwiLiBGb3IgdW5rbm93biByZWFzb25zIGJ1aWxkcyBvbiBKZW5raW5zIGZhaWwgZHVlIHRvIGEgdHlwZSBtaXNtYXRjaCB3aGVuIHdlIHVzZSB0eXBlIFwibnVtYmVyXCIgaGVyZSxcbiAgLy8gYWx0aG91Z2ggaXQgd29ya3Mgb24gb3RoZXIgcGxhdGZvcm1zIChlLmcuIFdpbmRvd3MsIENvZGVzaGlwKS5cbiAgLy8gVG8gd29yayBhcm91bmQgdGhlIGlzc3VlIHdlIHVzZSB0eXBlIFwiYW55XCIuIFRoZSB0eXBlIGRvZXMgbm90IG1hdHRlciBhbnl3YXkgYmVjYXVzZSB3ZSdyZSBub3Qgd29ya2luZyB3aXRoXG4gIC8vIHRoaXMgdmFsdWUgZXhjZXB0IHByb3ZpZGluZyBpdCB0byBjbGVhclRpbWVvdXQuXG4gIHByaXZhdGUgdGltZW91dE9ySW50ZXJ2YWxJZDogYW55O1xuICBwcml2YXRlIGFjdGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB0aW1lb3V0IGNhbGxiYWNrIGhhbmRsZXIuXG4gICAqIEBwYXJhbSBkZWxheSB0aGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICogQHBhcmFtIGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBleGVjdXRlIGFmdGVyIHRoZSBkZWxheSB0aW1lXG4gICAqIEBwYXJhbSByZXBlYXQgaWYgdHJ1ZSwgY2FsbCB0aGUgY2FsbGJhY2sgcmVwZWF0ZWRseSBpbiBkZWxheSBpbnRlcnZhbHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKGRlbGF5OiBudW1iZXIsIGNhbGxiYWNrOiAoKSA9PiB2b2lkLCByZXBlYXQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheTtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5yZXBlYXQgPSByZXBlYXQ7XG4gICAgdGhpcy50aW1lb3V0T3JJbnRlcnZhbElkID0gMDtcbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgdGltZW91dCBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIHdoZW4gdGhlIHRpbWVvdXQgZGVsYXkgaGFzIHBhc3NlZC5cbiAgICogQHJldHVybnMge1RpbWVvdXR9IHRoZSBjdXJyZW50IHRpbWVvdXQgKHNvIHRoZSBzdGFydCBjYWxsIGNhbiBiZSBjaGFpbmVkIHRvIHRoZSBjb25zdHJ1Y3RvcilcbiAgICovXG4gIHN0YXJ0KCk6IHRoaXMge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHRpbWVvdXQuIFRoZSBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgY2xlYXIgaXMgY2FsbGVkIGR1cmluZyB0aGUgdGltZW91dC5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJJbnRlcm5hbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgcGFzc2VkIHRpbWVvdXQgZGVsYXkgdG8gemVyby4gQ2FuIGJlIHVzZWQgdG8gZGVmZXIgdGhlIGNhbGxpbmcgb2YgdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckludGVybmFsKCk7XG5cbiAgICBpZiAodGhpcy5yZXBlYXQpIHtcbiAgICAgIHRoaXMudGltZW91dE9ySW50ZXJ2YWxJZCA9IHNldEludGVydmFsKHRoaXMuY2FsbGJhY2ssIHRoaXMuZGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVvdXRPckludGVydmFsSWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxsYmFjaygpO1xuICAgICAgfSwgdGhpcy5kZWxheSk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJJbnRlcm5hbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXBlYXQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lb3V0T3JJbnRlcnZhbElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dE9ySW50ZXJ2YWxJZCk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gIH1cbn0iLCJpbXBvcnQgeyBTdWJ0aXRsZU92ZXJsYXkgfSBmcm9tICcuL2NvbXBvbmVudHMvc3VidGl0bGVvdmVybGF5JztcbmltcG9ydCB7IFNldHRpbmdzUGFuZWxQYWdlIH0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzcGFuZWxwYWdlJztcbmltcG9ydCB7IFNldHRpbmdzUGFuZWxJdGVtIH0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzcGFuZWxpdGVtJztcbmltcG9ydCB7IFZpZGVvUXVhbGl0eVNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy92aWRlb3F1YWxpdHlzZWxlY3Rib3gnO1xuaW1wb3J0IHsgUGxheWJhY2tTcGVlZFNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9wbGF5YmFja3NwZWVkc2VsZWN0Ym94JztcbmltcG9ydCB7IEF1ZGlvVHJhY2tTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvYXVkaW90cmFja3NlbGVjdGJveCc7XG5pbXBvcnQgeyBBdWRpb1F1YWxpdHlTZWxlY3RCb3ggfSBmcm9tICcuL2NvbXBvbmVudHMvYXVkaW9xdWFsaXR5c2VsZWN0Ym94JztcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbCc7XG5pbXBvcnQgeyBTdWJ0aXRsZVNldHRpbmdzUGFuZWxQYWdlIH0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlc2V0dGluZ3Mvc3VidGl0bGVzZXR0aW5nc3BhbmVscGFnZSc7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsUGFnZU9wZW5CdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvc2V0dGluZ3NwYW5lbHBhZ2VvcGVuYnV0dG9uJztcbmltcG9ydCB7IFN1YnRpdGxlU2V0dGluZ3NMYWJlbCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNldHRpbmdzL3N1YnRpdGxlc2V0dGluZ3NsYWJlbCc7XG5pbXBvcnQgeyBTdWJ0aXRsZVNlbGVjdEJveCB9IGZyb20gJy4vY29tcG9uZW50cy9zdWJ0aXRsZXNlbGVjdGJveCc7XG5pbXBvcnQgeyBDb250cm9sQmFyIH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnRyb2xiYXInO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnRhaW5lcic7XG5pbXBvcnQgeyBQbGF5YmFja1RpbWVMYWJlbCwgUGxheWJhY2tUaW1lTGFiZWxNb2RlIH0gZnJvbSAnLi9jb21wb25lbnRzL3BsYXliYWNrdGltZWxhYmVsJztcbmltcG9ydCB7IFNlZWtCYXIgfSBmcm9tICcuL2NvbXBvbmVudHMvc2Vla2Jhcic7XG5pbXBvcnQgeyBTZWVrQmFyTGFiZWwgfSBmcm9tICcuL2NvbXBvbmVudHMvc2Vla2JhcmxhYmVsJztcbmltcG9ydCB7IFBsYXliYWNrVG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3BsYXliYWNrdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7IFZvbHVtZVRvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy92b2x1bWV0b2dnbGVidXR0b24nO1xuaW1wb3J0IHsgVm9sdW1lU2xpZGVyIH0gZnJvbSAnLi9jb21wb25lbnRzL3ZvbHVtZXNsaWRlcic7XG5pbXBvcnQgeyBTcGFjZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvc3BhY2VyJztcbmltcG9ydCB7IFBpY3R1cmVJblBpY3R1cmVUb2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvcGljdHVyZWlucGljdHVyZXRvZ2dsZWJ1dHRvbic7XG5pbXBvcnQgeyBBaXJQbGF5VG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2FpcnBsYXl0b2dnbGVidXR0b24nO1xuaW1wb3J0IHsgQ2FzdFRvZ2dsZUJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9jYXN0dG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7IFZSVG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3ZydG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7IFNldHRpbmdzVG9nZ2xlQnV0dG9uIH0gZnJvbSAnLi9jb21wb25lbnRzL3NldHRpbmdzdG9nZ2xlYnV0dG9uJztcbmltcG9ydCB7IEZ1bGxzY3JlZW5Ub2dnbGVCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvZnVsbHNjcmVlbnRvZ2dsZWJ1dHRvbic7XG5pbXBvcnQgeyBVSUNvbnRhaW5lciB9IGZyb20gJy4vY29tcG9uZW50cy91aWNvbnRhaW5lcic7XG5pbXBvcnQgeyBCdWZmZXJpbmdPdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL2J1ZmZlcmluZ292ZXJsYXknO1xuaW1wb3J0IHsgUGxheWJhY2tUb2dnbGVPdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL3BsYXliYWNrdG9nZ2xlb3ZlcmxheSc7XG5pbXBvcnQgeyBDYXN0U3RhdHVzT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9jYXN0c3RhdHVzb3ZlcmxheSc7XG5pbXBvcnQgeyBUaXRsZUJhciB9IGZyb20gJy4vY29tcG9uZW50cy90aXRsZWJhcic7XG5pbXBvcnQgeyBSZWNvbW1lbmRhdGlvbk92ZXJsYXkgfSBmcm9tICcuL2NvbXBvbmVudHMvcmVjb21tZW5kYXRpb25vdmVybGF5JztcbmltcG9ydCB7IFdhdGVybWFyayB9IGZyb20gJy4vY29tcG9uZW50cy93YXRlcm1hcmsnO1xuaW1wb3J0IHsgRXJyb3JNZXNzYWdlT3ZlcmxheSB9IGZyb20gJy4vY29tcG9uZW50cy9lcnJvcm1lc3NhZ2VvdmVybGF5JztcbmltcG9ydCB7IEFkQ2xpY2tPdmVybGF5IH0gZnJvbSAnLi9jb21wb25lbnRzL2FkY2xpY2tvdmVybGF5JztcbmltcG9ydCB7IEFkTWVzc2FnZUxhYmVsIH0gZnJvbSAnLi9jb21wb25lbnRzL2FkbWVzc2FnZWxhYmVsJztcbmltcG9ydCB7IEFkU2tpcEJ1dHRvbiB9IGZyb20gJy4vY29tcG9uZW50cy9hZHNraXBidXR0b24nO1xuaW1wb3J0IHsgQ2xvc2VCdXR0b24gfSBmcm9tICcuL2NvbXBvbmVudHMvY2xvc2VidXR0b24nO1xuaW1wb3J0IHsgTWV0YWRhdGFMYWJlbCwgTWV0YWRhdGFMYWJlbENvbnRlbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbWV0YWRhdGFsYWJlbCc7XG5pbXBvcnQgeyBQbGF5ZXJVdGlscyB9IGZyb20gJy4vcGxheWVydXRpbHMnO1xuaW1wb3J0IHsgTGFiZWwgfSBmcm9tICcuL2NvbXBvbmVudHMvbGFiZWwnO1xuaW1wb3J0IHsgQ2FzdFVJQ29udGFpbmVyIH0gZnJvbSAnLi9jb21wb25lbnRzL2Nhc3R1aWNvbnRhaW5lcic7XG5pbXBvcnQgeyBVSUNvbmRpdGlvbkNvbnRleHQsIFVJTWFuYWdlciB9IGZyb20gJy4vdWltYW5hZ2VyJztcbmltcG9ydCB7IFVJQ29uZmlnIH0gZnJvbSAnLi91aWNvbmZpZyc7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4vbG9jYWxpemF0aW9uL2kxOG4nO1xuXG5leHBvcnQgbmFtZXNwYWNlIFVJRmFjdG9yeSB7XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGVmYXVsdFVJKHBsYXllcjogUGxheWVyQVBJLCBjb25maWc6IFVJQ29uZmlnID0ge30pOiBVSU1hbmFnZXIge1xuICAgIHJldHVybiBVSUZhY3RvcnkuYnVpbGRNb2Rlcm5VSShwbGF5ZXIsIGNvbmZpZyk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gYnVpbGREZWZhdWx0U21hbGxTY3JlZW5VSShwbGF5ZXI6IFBsYXllckFQSSwgY29uZmlnOiBVSUNvbmZpZyA9IHt9KTogVUlNYW5hZ2VyIHtcbiAgICByZXR1cm4gVUlGYWN0b3J5LmJ1aWxkTW9kZXJuU21hbGxTY3JlZW5VSShwbGF5ZXIsIGNvbmZpZyk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gYnVpbGREZWZhdWx0Q2FzdFJlY2VpdmVyVUkocGxheWVyOiBQbGF5ZXJBUEksIGNvbmZpZzogVUlDb25maWcgPSB7fSk6IFVJTWFuYWdlciB7XG4gICAgcmV0dXJuIFVJRmFjdG9yeS5idWlsZE1vZGVybkNhc3RSZWNlaXZlclVJKHBsYXllciwgY29uZmlnKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtb2Rlcm5VSSgpIHtcbiAgICBsZXQgc3VidGl0bGVPdmVybGF5ID0gbmV3IFN1YnRpdGxlT3ZlcmxheSgpO1xuXG4gICAgbGV0IG1haW5TZXR0aW5nc1BhbmVsUGFnZSA9IG5ldyBTZXR0aW5nc1BhbmVsUGFnZSh7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbShpMThuLmdldExvY2FsaXplcignc2V0dGluZ3MudmlkZW8ucXVhbGl0eScpLCBuZXcgVmlkZW9RdWFsaXR5U2VsZWN0Qm94KCkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NwZWVkJyksIG5ldyBQbGF5YmFja1NwZWVkU2VsZWN0Qm94KCkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLmF1ZGlvLnRyYWNrJyksIG5ldyBBdWRpb1RyYWNrU2VsZWN0Qm94KCkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLmF1ZGlvLnF1YWxpdHknKSwgbmV3IEF1ZGlvUXVhbGl0eVNlbGVjdEJveCgpKSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBsZXQgc2V0dGluZ3NQYW5lbCA9IG5ldyBTZXR0aW5nc1BhbmVsKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgbWFpblNldHRpbmdzUGFuZWxQYWdlLFxuICAgICAgXSxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGxldCBzdWJ0aXRsZVNldHRpbmdzUGFuZWxQYWdlID0gbmV3IFN1YnRpdGxlU2V0dGluZ3NQYW5lbFBhZ2Uoe1xuICAgICAgc2V0dGluZ3NQYW5lbDogc2V0dGluZ3NQYW5lbCxcbiAgICAgIG92ZXJsYXk6IHN1YnRpdGxlT3ZlcmxheSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN1YnRpdGxlU2VsZWN0Qm94ID0gbmV3IFN1YnRpdGxlU2VsZWN0Qm94KCk7XG5cbiAgICBsZXQgc3VidGl0bGVTZXR0aW5nc09wZW5CdXR0b24gPSBuZXcgU2V0dGluZ3NQYW5lbFBhZ2VPcGVuQnV0dG9uKHtcbiAgICAgIHRhcmdldFBhZ2U6IHN1YnRpdGxlU2V0dGluZ3NQYW5lbFBhZ2UsXG4gICAgICBjb250YWluZXI6IHNldHRpbmdzUGFuZWwsXG4gICAgICBhcmlhTGFiZWw6IGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMnKSxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdvcGVuJyksXG4gICAgfSk7XG5cbiAgICBtYWluU2V0dGluZ3NQYW5lbFBhZ2UuYWRkQ29tcG9uZW50KFxuICAgICAgbmV3IFNldHRpbmdzUGFuZWxJdGVtKFxuICAgICAgICBuZXcgU3VidGl0bGVTZXR0aW5nc0xhYmVsKHtcbiAgICAgICAgICB0ZXh0OiBpMThuLmdldExvY2FsaXplcignc2V0dGluZ3Muc3VidGl0bGVzJyksXG4gICAgICAgICAgb3BlbmVyOiBzdWJ0aXRsZVNldHRpbmdzT3BlbkJ1dHRvbixcbiAgICAgICAgfSksXG4gICAgICAgIHN1YnRpdGxlU2VsZWN0Qm94LFxuICAgICAgICB7XG4gICAgICAgICAgcm9sZTogJ21lbnViYXInLFxuICAgICAgICB9LFxuICAgICAgKSk7XG5cbiAgICBzZXR0aW5nc1BhbmVsLmFkZENvbXBvbmVudChzdWJ0aXRsZVNldHRpbmdzUGFuZWxQYWdlKTtcblxuICAgIGxldCBjb250cm9sQmFyID0gbmV3IENvbnRyb2xCYXIoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBzZXR0aW5nc1BhbmVsLFxuICAgICAgICBuZXcgQ29udGFpbmVyKHtcbiAgICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUGxheWJhY2tUaW1lTGFiZWwoeyB0aW1lTGFiZWxNb2RlOiBQbGF5YmFja1RpbWVMYWJlbE1vZGUuQ3VycmVudFRpbWUsIGhpZGVJbkxpdmVQbGF5YmFjazogdHJ1ZSB9KSxcbiAgICAgICAgICAgIG5ldyBTZWVrQmFyKHsgbGFiZWw6IG5ldyBTZWVrQmFyTGFiZWwoKSB9KSxcbiAgICAgICAgICAgIG5ldyBQbGF5YmFja1RpbWVMYWJlbCh7IHRpbWVMYWJlbE1vZGU6IFBsYXliYWNrVGltZUxhYmVsTW9kZS5Ub3RhbFRpbWUsIGNzc0NsYXNzZXM6IFsndGV4dC1yaWdodCddIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY3NzQ2xhc3NlczogWydjb250cm9sYmFyLXRvcCddLFxuICAgICAgICB9KSxcbiAgICAgICAgbmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgY29tcG9uZW50czogW1xuICAgICAgICAgICAgbmV3IFBsYXliYWNrVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgVm9sdW1lVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgVm9sdW1lU2xpZGVyKCksXG4gICAgICAgICAgICBuZXcgU3BhY2VyKCksXG4gICAgICAgICAgICBuZXcgUGljdHVyZUluUGljdHVyZVRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IEFpclBsYXlUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgIG5ldyBDYXN0VG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgVlJUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nc1RvZ2dsZUJ1dHRvbih7IHNldHRpbmdzUGFuZWw6IHNldHRpbmdzUGFuZWwgfSksXG4gICAgICAgICAgICBuZXcgRnVsbHNjcmVlblRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY3NzQ2xhc3NlczogWydjb250cm9sYmFyLWJvdHRvbSddLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFVJQ29udGFpbmVyKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgc3VidGl0bGVPdmVybGF5LFxuICAgICAgICBuZXcgQnVmZmVyaW5nT3ZlcmxheSgpLFxuICAgICAgICBuZXcgUGxheWJhY2tUb2dnbGVPdmVybGF5KCksXG4gICAgICAgIG5ldyBDYXN0U3RhdHVzT3ZlcmxheSgpLFxuICAgICAgICBjb250cm9sQmFyLFxuICAgICAgICBuZXcgVGl0bGVCYXIoKSxcbiAgICAgICAgbmV3IFJlY29tbWVuZGF0aW9uT3ZlcmxheSgpLFxuICAgICAgICBuZXcgV2F0ZXJtYXJrKCksXG4gICAgICAgIG5ldyBFcnJvck1lc3NhZ2VPdmVybGF5KCksXG4gICAgICBdLFxuICAgICAgaGlkZURlbGF5OiAyMDAwLFxuICAgICAgaGlkZVBsYXllclN0YXRlRXhjZXB0aW9uczogW1xuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5QcmVwYXJlZCxcbiAgICAgICAgUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUGF1c2VkLFxuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5GaW5pc2hlZCxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbW9kZXJuQWRzVUkoKSB7XG4gICAgcmV0dXJuIG5ldyBVSUNvbnRhaW5lcih7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG5ldyBCdWZmZXJpbmdPdmVybGF5KCksXG4gICAgICAgIG5ldyBBZENsaWNrT3ZlcmxheSgpLFxuICAgICAgICBuZXcgUGxheWJhY2tUb2dnbGVPdmVybGF5KCksXG4gICAgICAgIG5ldyBDb250YWluZXIoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIG5ldyBBZE1lc3NhZ2VMYWJlbCh7IHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdhZHMucmVtYWluaW5nVGltZScpfSksXG4gICAgICAgICAgICBuZXcgQWRTa2lwQnV0dG9uKCksXG4gICAgICAgICAgXSxcbiAgICAgICAgICBjc3NDbGFzczogJ3VpLWFkcy1zdGF0dXMnLFxuICAgICAgICB9KSxcbiAgICAgICAgbmV3IENvbnRyb2xCYXIoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIG5ldyBDb250YWluZXIoe1xuICAgICAgICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAgICAgICAgbmV3IFBsYXliYWNrVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICAgICAgbmV3IFZvbHVtZVRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgICAgIG5ldyBWb2x1bWVTbGlkZXIoKSxcbiAgICAgICAgICAgICAgICBuZXcgU3BhY2VyKCksXG4gICAgICAgICAgICAgICAgbmV3IEZ1bGxzY3JlZW5Ub2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgY3NzQ2xhc3NlczogWydjb250cm9sYmFyLWJvdHRvbSddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgICAgY3NzQ2xhc3NlczogWyd1aS1za2luLWFkcyddLFxuICAgICAgaGlkZURlbGF5OiAyMDAwLFxuICAgICAgaGlkZVBsYXllclN0YXRlRXhjZXB0aW9uczogW1xuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5QcmVwYXJlZCxcbiAgICAgICAgUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUGF1c2VkLFxuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5GaW5pc2hlZCxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbW9kZXJuU21hbGxTY3JlZW5VSSgpIHtcbiAgICBsZXQgc3VidGl0bGVPdmVybGF5ID0gbmV3IFN1YnRpdGxlT3ZlcmxheSgpO1xuXG4gICAgbGV0IG1haW5TZXR0aW5nc1BhbmVsUGFnZSA9IG5ldyBTZXR0aW5nc1BhbmVsUGFnZSh7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbShpMThuLmdldExvY2FsaXplcignc2V0dGluZ3MudmlkZW8ucXVhbGl0eScpLCBuZXcgVmlkZW9RdWFsaXR5U2VsZWN0Qm94KCkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NwZWVkJyksIG5ldyBQbGF5YmFja1NwZWVkU2VsZWN0Qm94KCkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLmF1ZGlvLnRyYWNrJyksIG5ldyBBdWRpb1RyYWNrU2VsZWN0Qm94KCkpLFxuICAgICAgICBuZXcgU2V0dGluZ3NQYW5lbEl0ZW0oaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLmF1ZGlvLnF1YWxpdHknKSwgbmV3IEF1ZGlvUXVhbGl0eVNlbGVjdEJveCgpKSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBsZXQgc2V0dGluZ3NQYW5lbCA9IG5ldyBTZXR0aW5nc1BhbmVsKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgbWFpblNldHRpbmdzUGFuZWxQYWdlLFxuICAgICAgXSxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgIHBhZ2VUcmFuc2l0aW9uQW5pbWF0aW9uOiBmYWxzZSxcbiAgICAgIGhpZGVEZWxheTogLTEsXG4gICAgfSk7XG5cbiAgICBsZXQgc3VidGl0bGVTZXR0aW5nc1BhbmVsUGFnZSA9IG5ldyBTdWJ0aXRsZVNldHRpbmdzUGFuZWxQYWdlKHtcbiAgICAgIHNldHRpbmdzUGFuZWw6IHNldHRpbmdzUGFuZWwsXG4gICAgICBvdmVybGF5OiBzdWJ0aXRsZU92ZXJsYXksXG4gICAgfSk7XG5cbiAgICBsZXQgc3VidGl0bGVTZXR0aW5nc09wZW5CdXR0b24gPSBuZXcgU2V0dGluZ3NQYW5lbFBhZ2VPcGVuQnV0dG9uKHtcbiAgICAgIHRhcmdldFBhZ2U6IHN1YnRpdGxlU2V0dGluZ3NQYW5lbFBhZ2UsXG4gICAgICBjb250YWluZXI6IHNldHRpbmdzUGFuZWwsXG4gICAgICBhcmlhTGFiZWw6IGkxOG4uZ2V0TG9jYWxpemVyKCdzZXR0aW5ncy5zdWJ0aXRsZXMnKSxcbiAgICAgIHRleHQ6IGkxOG4uZ2V0TG9jYWxpemVyKCdvcGVuJyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdWJ0aXRsZVNlbGVjdEJveCA9IG5ldyBTdWJ0aXRsZVNlbGVjdEJveCgpO1xuXG4gICAgbWFpblNldHRpbmdzUGFuZWxQYWdlLmFkZENvbXBvbmVudChcbiAgICAgIG5ldyBTZXR0aW5nc1BhbmVsSXRlbShcbiAgICAgICAgbmV3IFN1YnRpdGxlU2V0dGluZ3NMYWJlbCh7XG4gICAgICAgICAgdGV4dDogaTE4bi5nZXRMb2NhbGl6ZXIoJ3NldHRpbmdzLnN1YnRpdGxlcycpLFxuICAgICAgICAgIG9wZW5lcjogc3VidGl0bGVTZXR0aW5nc09wZW5CdXR0b24sXG4gICAgICAgIH0pLFxuICAgICAgICBzdWJ0aXRsZVNlbGVjdEJveCxcbiAgICAgICAge1xuICAgICAgICAgIHJvbGU6ICdtZW51YmFyJyxcbiAgICAgICAgfSxcbiAgICAgICkpO1xuXG4gICAgc2V0dGluZ3NQYW5lbC5hZGRDb21wb25lbnQoc3VidGl0bGVTZXR0aW5nc1BhbmVsUGFnZSk7XG5cbiAgICBzZXR0aW5nc1BhbmVsLmFkZENvbXBvbmVudChuZXcgQ2xvc2VCdXR0b24oeyB0YXJnZXQ6IHNldHRpbmdzUGFuZWwgfSkpO1xuICAgIHN1YnRpdGxlU2V0dGluZ3NQYW5lbFBhZ2UuYWRkQ29tcG9uZW50KG5ldyBDbG9zZUJ1dHRvbih7IHRhcmdldDogc2V0dGluZ3NQYW5lbCB9KSk7XG5cbiAgICBsZXQgY29udHJvbEJhciA9IG5ldyBDb250cm9sQmFyKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgbmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgY29tcG9uZW50czogW1xuICAgICAgICAgICAgbmV3IFBsYXliYWNrVGltZUxhYmVsKHsgdGltZUxhYmVsTW9kZTogUGxheWJhY2tUaW1lTGFiZWxNb2RlLkN1cnJlbnRUaW1lLCBoaWRlSW5MaXZlUGxheWJhY2s6IHRydWUgfSksXG4gICAgICAgICAgICBuZXcgU2Vla0Jhcih7IGxhYmVsOiBuZXcgU2Vla0JhckxhYmVsKCkgfSksXG4gICAgICAgICAgICBuZXcgUGxheWJhY2tUaW1lTGFiZWwoeyB0aW1lTGFiZWxNb2RlOiBQbGF5YmFja1RpbWVMYWJlbE1vZGUuVG90YWxUaW1lLCBjc3NDbGFzc2VzOiBbJ3RleHQtcmlnaHQnXSB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGNzc0NsYXNzZXM6IFsnY29udHJvbGJhci10b3AnXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBVSUNvbnRhaW5lcih7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIHN1YnRpdGxlT3ZlcmxheSxcbiAgICAgICAgbmV3IEJ1ZmZlcmluZ092ZXJsYXkoKSxcbiAgICAgICAgbmV3IENhc3RTdGF0dXNPdmVybGF5KCksXG4gICAgICAgIG5ldyBQbGF5YmFja1RvZ2dsZU92ZXJsYXkoKSxcbiAgICAgICAgbmV3IFJlY29tbWVuZGF0aW9uT3ZlcmxheSgpLFxuICAgICAgICBjb250cm9sQmFyLFxuICAgICAgICBuZXcgVGl0bGVCYXIoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIG5ldyBNZXRhZGF0YUxhYmVsKHsgY29udGVudDogTWV0YWRhdGFMYWJlbENvbnRlbnQuVGl0bGUgfSksXG4gICAgICAgICAgICBuZXcgQ2FzdFRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IFZSVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgICBuZXcgUGljdHVyZUluUGljdHVyZVRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgICAgbmV3IEFpclBsYXlUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgIG5ldyBWb2x1bWVUb2dnbGVCdXR0b24oKSxcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nc1RvZ2dsZUJ1dHRvbih7IHNldHRpbmdzUGFuZWw6IHNldHRpbmdzUGFuZWwgfSksXG4gICAgICAgICAgICBuZXcgRnVsbHNjcmVlblRvZ2dsZUJ1dHRvbigpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgICBzZXR0aW5nc1BhbmVsLFxuICAgICAgICBuZXcgV2F0ZXJtYXJrKCksXG4gICAgICAgIG5ldyBFcnJvck1lc3NhZ2VPdmVybGF5KCksXG4gICAgICBdLFxuICAgICAgY3NzQ2xhc3NlczogWyd1aS1za2luLXNtYWxsc2NyZWVuJ10sXG4gICAgICBoaWRlRGVsYXk6IDIwMDAsXG4gICAgICBoaWRlUGxheWVyU3RhdGVFeGNlcHRpb25zOiBbXG4gICAgICAgIFBsYXllclV0aWxzLlBsYXllclN0YXRlLlByZXBhcmVkLFxuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5QYXVzZWQsXG4gICAgICAgIFBsYXllclV0aWxzLlBsYXllclN0YXRlLkZpbmlzaGVkLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtb2Rlcm5TbWFsbFNjcmVlbkFkc1VJKCkge1xuICAgIHJldHVybiBuZXcgVUlDb250YWluZXIoe1xuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICBuZXcgQnVmZmVyaW5nT3ZlcmxheSgpLFxuICAgICAgICBuZXcgQWRDbGlja092ZXJsYXkoKSxcbiAgICAgICAgbmV3IFBsYXliYWNrVG9nZ2xlT3ZlcmxheSgpLFxuICAgICAgICBuZXcgVGl0bGVCYXIoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIC8vIGR1bW15IGxhYmVsIHdpdGggbm8gY29udGVudCB0byBtb3ZlIGJ1dHRvbnMgdG8gdGhlIHJpZ2h0XG4gICAgICAgICAgICBuZXcgTGFiZWwoeyBjc3NDbGFzczogJ2xhYmVsLW1ldGFkYXRhLXRpdGxlJyB9KSxcbiAgICAgICAgICAgIG5ldyBGdWxsc2NyZWVuVG9nZ2xlQnV0dG9uKCksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBDb250YWluZXIoe1xuICAgICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICAgIG5ldyBBZE1lc3NhZ2VMYWJlbCh7IHRleHQ6ICdBZDoge3JlbWFpbmluZ1RpbWV9IHNlY3MnIH0pLFxuICAgICAgICAgICAgbmV3IEFkU2tpcEJ1dHRvbigpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY3NzQ2xhc3M6ICd1aS1hZHMtc3RhdHVzJyxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgICAgY3NzQ2xhc3NlczogWyd1aS1za2luLWFkcycsICd1aS1za2luLXNtYWxsc2NyZWVuJ10sXG4gICAgICBoaWRlRGVsYXk6IDIwMDAsXG4gICAgICBoaWRlUGxheWVyU3RhdGVFeGNlcHRpb25zOiBbXG4gICAgICAgIFBsYXllclV0aWxzLlBsYXllclN0YXRlLlByZXBhcmVkLFxuICAgICAgICBQbGF5ZXJVdGlscy5QbGF5ZXJTdGF0ZS5QYXVzZWQsXG4gICAgICAgIFBsYXllclV0aWxzLlBsYXllclN0YXRlLkZpbmlzaGVkLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBtb2Rlcm5DYXN0UmVjZWl2ZXJVSSgpIHtcbiAgICBsZXQgY29udHJvbEJhciA9IG5ldyBDb250cm9sQmFyKHtcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgbmV3IENvbnRhaW5lcih7XG4gICAgICAgICAgY29tcG9uZW50czogW1xuICAgICAgICAgICAgbmV3IFBsYXliYWNrVGltZUxhYmVsKHsgdGltZUxhYmVsTW9kZTogUGxheWJhY2tUaW1lTGFiZWxNb2RlLkN1cnJlbnRUaW1lLCBoaWRlSW5MaXZlUGxheWJhY2s6IHRydWUgfSksXG4gICAgICAgICAgICBuZXcgU2Vla0Jhcih7IHNtb290aFBsYXliYWNrUG9zaXRpb25VcGRhdGVJbnRlcnZhbE1zOiAtMSB9KSxcbiAgICAgICAgICAgIG5ldyBQbGF5YmFja1RpbWVMYWJlbCh7IHRpbWVMYWJlbE1vZGU6IFBsYXliYWNrVGltZUxhYmVsTW9kZS5Ub3RhbFRpbWUsIGNzc0NsYXNzZXM6IFsndGV4dC1yaWdodCddIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgY3NzQ2xhc3NlczogWydjb250cm9sYmFyLXRvcCddLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IENhc3RVSUNvbnRhaW5lcih7XG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIG5ldyBTdWJ0aXRsZU92ZXJsYXkoKSxcbiAgICAgICAgbmV3IEJ1ZmZlcmluZ092ZXJsYXkoKSxcbiAgICAgICAgbmV3IFBsYXliYWNrVG9nZ2xlT3ZlcmxheSgpLFxuICAgICAgICBuZXcgV2F0ZXJtYXJrKCksXG4gICAgICAgIGNvbnRyb2xCYXIsXG4gICAgICAgIG5ldyBUaXRsZUJhcih7IGtlZXBIaWRkZW5XaXRob3V0TWV0YWRhdGE6IHRydWUgfSksXG4gICAgICAgIG5ldyBFcnJvck1lc3NhZ2VPdmVybGF5KCksXG4gICAgICBdLFxuICAgICAgY3NzQ2xhc3NlczogWyd1aS1za2luLWNhc3QtcmVjZWl2ZXInXSxcbiAgICAgIGhpZGVEZWxheTogMjAwMCxcbiAgICAgIGhpZGVQbGF5ZXJTdGF0ZUV4Y2VwdGlvbnM6IFtcbiAgICAgICAgUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuUHJlcGFyZWQsXG4gICAgICAgIFBsYXllclV0aWxzLlBsYXllclN0YXRlLlBhdXNlZCxcbiAgICAgICAgUGxheWVyVXRpbHMuUGxheWVyU3RhdGUuRmluaXNoZWQsXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTW9kZXJuVUkocGxheWVyOiBQbGF5ZXJBUEksIGNvbmZpZzogVUlDb25maWcgPSB7fSk6IFVJTWFuYWdlciB7XG4gICAgLy8gc2hvdyBzbWFsbFNjcmVlbiBVSSBvbmx5IG9uIG1vYmlsZS9oYW5kaGVsZCBkZXZpY2VzXG4gICAgbGV0IHNtYWxsU2NyZWVuU3dpdGNoV2lkdGggPSA2MDA7XG5cbiAgICByZXR1cm4gbmV3IFVJTWFuYWdlcihwbGF5ZXIsIFt7XG4gICAgICB1aTogbW9kZXJuU21hbGxTY3JlZW5BZHNVSSgpLFxuICAgICAgY29uZGl0aW9uOiAoY29udGV4dDogVUlDb25kaXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmlzTW9iaWxlICYmIGNvbnRleHQuZG9jdW1lbnRXaWR0aCA8IHNtYWxsU2NyZWVuU3dpdGNoV2lkdGggJiYgY29udGV4dC5pc0FkXG4gICAgICAgICAgJiYgY29udGV4dC5hZFJlcXVpcmVzVWk7XG4gICAgICB9LFxuICAgIH0sIHtcbiAgICAgIHVpOiBtb2Rlcm5BZHNVSSgpLFxuICAgICAgY29uZGl0aW9uOiAoY29udGV4dDogVUlDb25kaXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmlzQWQgJiYgY29udGV4dC5hZFJlcXVpcmVzVWk7XG4gICAgICB9LFxuICAgIH0sIHtcbiAgICAgIHVpOiBtb2Rlcm5TbWFsbFNjcmVlblVJKCksXG4gICAgICBjb25kaXRpb246IChjb250ZXh0OiBVSUNvbmRpdGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgcmV0dXJuICFjb250ZXh0LmlzQWQgJiYgIWNvbnRleHQuYWRSZXF1aXJlc1VpICYmIGNvbnRleHQuaXNNb2JpbGVcbiAgICAgICAgICAmJiBjb250ZXh0LmRvY3VtZW50V2lkdGggPCBzbWFsbFNjcmVlblN3aXRjaFdpZHRoO1xuICAgICAgfSxcbiAgICB9LCB7XG4gICAgICB1aTogbW9kZXJuVUkoKSxcbiAgICAgIGNvbmRpdGlvbjogKGNvbnRleHQ6IFVJQ29uZGl0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICByZXR1cm4gIWNvbnRleHQuaXNBZCAmJiAhY29udGV4dC5hZFJlcXVpcmVzVWk7XG4gICAgICB9LFxuICAgIH1dLCBjb25maWcpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTW9kZXJuU21hbGxTY3JlZW5VSShwbGF5ZXI6IFBsYXllckFQSSwgY29uZmlnOiBVSUNvbmZpZyA9IHt9KTogVUlNYW5hZ2VyIHtcbiAgICByZXR1cm4gbmV3IFVJTWFuYWdlcihwbGF5ZXIsIFt7XG4gICAgICB1aTogbW9kZXJuU21hbGxTY3JlZW5BZHNVSSgpLFxuICAgICAgY29uZGl0aW9uOiAoY29udGV4dDogVUlDb25kaXRpb25Db250ZXh0KSA9PiB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmlzQWQgJiYgY29udGV4dC5hZFJlcXVpcmVzVWk7XG4gICAgICB9LFxuICAgIH0sIHtcbiAgICAgIHVpOiBtb2Rlcm5TbWFsbFNjcmVlblVJKCksXG4gICAgICBjb25kaXRpb246IChjb250ZXh0OiBVSUNvbmRpdGlvbkNvbnRleHQpID0+IHtcbiAgICAgICAgcmV0dXJuICFjb250ZXh0LmlzQWQgJiYgIWNvbnRleHQuYWRSZXF1aXJlc1VpO1xuICAgICAgfSxcbiAgICB9XSwgY29uZmlnKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBidWlsZE1vZGVybkNhc3RSZWNlaXZlclVJKHBsYXllcjogUGxheWVyQVBJLCBjb25maWc6IFVJQ29uZmlnID0ge30pOiBVSU1hbmFnZXIge1xuICAgIHJldHVybiBuZXcgVUlNYW5hZ2VyKHBsYXllciwgbW9kZXJuQ2FzdFJlY2VpdmVyVUkoKSwgY29uZmlnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtVSUNvbnRhaW5lcn0gZnJvbSAnLi9jb21wb25lbnRzL3VpY29udGFpbmVyJztcbmltcG9ydCB7RE9NfSBmcm9tICcuL2RvbSc7XG5pbXBvcnQge0NvbXBvbmVudCwgQ29tcG9uZW50Q29uZmlnfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50JztcbmltcG9ydCB7Q29udGFpbmVyfSBmcm9tICcuL2NvbXBvbmVudHMvY29udGFpbmVyJztcbmltcG9ydCB7IFNlZWtCYXIsIFNlZWtCYXJNYXJrZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvc2Vla2Jhcic7XG5pbXBvcnQge05vQXJncywgRXZlbnREaXNwYXRjaGVyLCBDYW5jZWxFdmVudEFyZ3N9IGZyb20gJy4vZXZlbnRkaXNwYXRjaGVyJztcbmltcG9ydCB7VUlVdGlsc30gZnJvbSAnLi91aXV0aWxzJztcbmltcG9ydCB7QXJyYXlVdGlsc30gZnJvbSAnLi9hcnJheXV0aWxzJztcbmltcG9ydCB7QnJvd3NlclV0aWxzfSBmcm9tICcuL2Jyb3dzZXJ1dGlscyc7XG5pbXBvcnQgeyBUaW1lbGluZU1hcmtlciwgVUlDb25maWcgfSBmcm9tICcuL3VpY29uZmlnJztcbmltcG9ydCB7IFBsYXllckFQSSwgUGxheWVyRXZlbnRDYWxsYmFjaywgUGxheWVyRXZlbnRCYXNlLCBQbGF5ZXJFdmVudCwgQWRFdmVudCwgTGluZWFyQWQgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuaW1wb3J0IHsgVm9sdW1lQ29udHJvbGxlciB9IGZyb20gJy4vdm9sdW1lY29udHJvbGxlcic7XG5pbXBvcnQgeyBpMThuLCBDdXN0b21Wb2NhYnVsYXJ5LCBWb2NhYnVsYXJpZXMgfSBmcm9tICcuL2xvY2FsaXphdGlvbi9pMThuJztcbmltcG9ydCB7IEZvY3VzVmlzaWJpbGl0eVRyYWNrZXIgfSBmcm9tICcuL2ZvY3VzdmlzaWJpbGl0eXRyYWNrZXInO1xuaW1wb3J0IHsgaXNNb2JpbGVWM1BsYXllckFQSSwgTW9iaWxlVjNQbGF5ZXJBUEksIE1vYmlsZVYzUGxheWVyRXZlbnQgfSBmcm9tICcuL21vYmlsZXYzcGxheWVyYXBpJztcblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbGl6YXRpb25Db25maWcge1xuICAvKipcbiAgICogU2V0cyB0aGUgZGVzaXJlZCBsYW5ndWFnZSwgYW5kIGZhbGxzIGJhY2sgdG8gJ2VuJyBpZiB0aGVyZSBpcyBubyB2b2NhYnVsYXJ5IGZvciB0aGUgZGVzaXJlZCBsYW5ndWFnZS4gU2V0dGluZyBpdFxuICAgKiB0byBcImF1dG9cIiB3aWxsIGVuYWJsZSBsYW5ndWFnZSBkZXRlY3Rpb24gZnJvbSB0aGUgYnJvd3NlcidzIGxvY2FsZS5cbiAgICovXG4gIGxhbmd1YWdlPzogJ2F1dG8nIHwgJ2VuJyB8ICdkZScgfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIG1hcCBvZiBgbGFuZ3VhZ2VgIHRvIHtAbGluayBDdXN0b21Wb2NhYnVsYXJ5fSBkZWZpbml0aW9ucy4gQ2FuIGJlIHVzZWQgdG8gb3ZlcndyaXRlIGRlZmF1bHQgdHJhbnNsYXRpb25zIGFuZCBhZGRcbiAgICogY3VzdG9tIHN0cmluZ3Mgb3IgYWRkaXRpb25hbCBsYW5ndWFnZXMuXG4gICAqL1xuICB2b2NhYnVsYXJpZXM/OiBWb2NhYnVsYXJpZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxVSUNvbmZpZyBleHRlbmRzIFVJQ29uZmlnIHtcbiAgZXZlbnRzOiB7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBoYXMgYmVlbiB1cGRhdGVkL2NoYW5nZWQuXG4gICAgICovXG4gICAgb25VcGRhdGVkOiBFdmVudERpc3BhdGNoZXI8VUlNYW5hZ2VyLCB2b2lkPjtcbiAgfTtcbiAgdm9sdW1lQ29udHJvbGxlcjogVm9sdW1lQ29udHJvbGxlcjtcbn1cblxuLyoqXG4gKiBUaGUgY29udGV4dCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGEge0BsaW5rIFVJQ29uZGl0aW9uUmVzb2x2ZXJ9IHRvIGRldGVybWluZSBpZiBpdCdzIGNvbmRpdGlvbnMgZnVsZmlsIHRoZSBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVJQ29uZGl0aW9uQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUZWxscyBpZiB0aGUgcGxheWVyIGlzIGxvYWRpbmcgb3IgcGxheWluZyBhbiBhZC5cbiAgICovXG4gIGlzQWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUZWxscyBpZiB0aGUgY3VycmVudCBhZCByZXF1aXJlcyBhbiBleHRlcm5hbCBVSSwgaWYge0BsaW5rICNpc0FkfSBpcyB0cnVlLlxuICAgKi9cbiAgYWRSZXF1aXJlc1VpOiBib29sZWFuO1xuICAvKipcbiAgICogVGVsbHMgaWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaW4gZnVsbHNjcmVlbiBtb2RlLlxuICAgKi9cbiAgaXNGdWxsc2NyZWVuOiBib29sZWFuO1xuICAvKipcbiAgICogVGVsbHMgaWYgdGhlIFVJIGlzIHJ1bm5pbmcgaW4gYSBtb2JpbGUgYnJvd3Nlci5cbiAgICovXG4gIGlzTW9iaWxlOiBib29sZWFuO1xuICAvKipcbiAgICogVGVsbHMgaWYgdGhlIHBsYXllciBpcyBpbiBwbGF5aW5nIG9yIHBhdXNlZCBzdGF0ZS5cbiAgICovXG4gIGlzUGxheWluZzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiB0aGUgcGxheWVyL1VJIGVsZW1lbnQuXG4gICAqL1xuICB3aWR0aDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSBkb2N1bWVudCB3aGVyZSB0aGUgcGxheWVyL1VJIGlzIGVtYmVkZGVkIGluLlxuICAgKi9cbiAgZG9jdW1lbnRXaWR0aDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBjb25kaXRpb25zIG9mIGl0cyBhc3NvY2lhdGVkIFVJIGluIGEge0BsaW5rIFVJVmFyaWFudH0gdXBvbiBhIHtAbGluayBVSUNvbmRpdGlvbkNvbnRleHR9IGFuZCBkZWNpZGVzXG4gKiBpZiB0aGUgVUkgc2hvdWxkIGJlIGRpc3BsYXllZC4gSWYgaXQgcmV0dXJucyB0cnVlLCB0aGUgVUkgaXMgYSBjYW5kaWRhdGUgZm9yIGRpc3BsYXk7IGlmIGl0IHJldHVybnMgZmFsc2UsIGl0IHdpbGxcbiAqIG5vdCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGdpdmVuIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVUlDb25kaXRpb25SZXNvbHZlciB7XG4gIChjb250ZXh0OiBVSUNvbmRpdGlvbkNvbnRleHQpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFzc29jaWF0ZXMgYSBVSSBpbnN0YW5jZSB3aXRoIGFuIG9wdGlvbmFsIHtAbGluayBVSUNvbmRpdGlvblJlc29sdmVyfSB0aGF0IGRldGVybWluZXMgaWYgdGhlIFVJIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVUlWYXJpYW50IHtcbiAgdWk6IFVJQ29udGFpbmVyO1xuICBjb25kaXRpb24/OiBVSUNvbmRpdGlvblJlc29sdmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVUlNYW5hZ2VyIHtcblxuICBwcml2YXRlIHBsYXllcjogUGxheWVyQVBJO1xuICBwcml2YXRlIHVpQ29udGFpbmVyRWxlbWVudDogRE9NO1xuICBwcml2YXRlIHVpVmFyaWFudHM6IFVJVmFyaWFudFtdO1xuICBwcml2YXRlIHVpSW5zdGFuY2VNYW5hZ2VyczogSW50ZXJuYWxVSUluc3RhbmNlTWFuYWdlcltdO1xuICBwcml2YXRlIGN1cnJlbnRVaTogSW50ZXJuYWxVSUluc3RhbmNlTWFuYWdlcjtcbiAgcHJpdmF0ZSBjb25maWc6IEludGVybmFsVUlDb25maWc7IC8vIENvbmp1bmN0aW9uIG9mIHByb3ZpZGVkIHVpQ29uZmlnIGFuZCBzb3VyY2VDb25maWcgZnJvbSB0aGUgcGxheWVyXG4gIHByaXZhdGUgbWFuYWdlclBsYXllcldyYXBwZXI6IFBsYXllcldyYXBwZXI7XG4gIHByaXZhdGUgZm9jdXNWaXNpYmlsaXR5VHJhY2tlcjogRm9jdXNWaXNpYmlsaXR5VHJhY2tlcjtcblxuICBwcml2YXRlIGV2ZW50cyA9IHtcbiAgICBvblVpVmFyaWFudFJlc29sdmU6IG5ldyBFdmVudERpc3BhdGNoZXI8VUlNYW5hZ2VyLCBVSUNvbmRpdGlvbkNvbnRleHQ+KCksXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBVSSBtYW5hZ2VyIHdpdGggYSBzaW5nbGUgVUkgdmFyaWFudCB0aGF0IHdpbGwgYmUgcGVybWFuZW50bHkgc2hvd24uXG4gICAqIEBwYXJhbSBwbGF5ZXIgdGhlIGFzc29jaWF0ZWQgcGxheWVyIG9mIHRoaXMgVUlcbiAgICogQHBhcmFtIHVpIHRoZSBVSSB0byBhZGQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gdWljb25maWcgb3B0aW9uYWwgVUkgY29uZmlndXJhdGlvblxuICAgKi9cbiAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXJBUEksIHVpOiBVSUNvbnRhaW5lciwgdWljb25maWc/OiBVSUNvbmZpZyk7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVUkgbWFuYWdlciB3aXRoIGEgbGlzdCBvZiBVSSB2YXJpYW50cyB0aGF0IHdpbGwgYmUgZHluYW1pY2FsbHkgc2VsZWN0ZWQgYW5kIHN3aXRjaGVkIGFjY29yZGluZyB0b1xuICAgKiB0aGUgY29udGV4dCBvZiB0aGUgVUkuXG4gICAqXG4gICAqIEV2ZXJ5IHRpbWUgdGhlIFVJIGNvbnRleHQgY2hhbmdlcywgdGhlIGNvbmRpdGlvbnMgb2YgdGhlIFVJIHZhcmlhbnRzIHdpbGwgYmUgc2VxdWVudGlhbGx5IHJlc29sdmVkIGFuZCB0aGUgZmlyc3RcbiAgICogVUksIHdob3NlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZSwgd2lsbCBiZSBzZWxlY3RlZCBhbmQgZGlzcGxheWVkLiBUaGUgbGFzdCB2YXJpYW50IGluIHRoZSBsaXN0IG1pZ2h0IG9taXQgdGhlXG4gICAqIGNvbmRpdGlvbiByZXNvbHZlciBhbmQgd2lsbCBiZSBzZWxlY3RlZCBhcyBkZWZhdWx0L2ZhbGxiYWNrIFVJIHdoZW4gYWxsIG90aGVyIGNvbmRpdGlvbnMgZmFpbC4gSWYgdGhlcmUgaXMgbm9cbiAgICogZmFsbGJhY2sgVUkgYW5kIGFsbCBjb25kaXRpb25zIGZhaWwsIG5vIFVJIHdpbGwgYmUgZGlzcGxheWVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGxheWVyIHRoZSBhc3NvY2lhdGVkIHBsYXllciBvZiB0aGlzIFVJXG4gICAqIEBwYXJhbSB1aVZhcmlhbnRzIGEgbGlzdCBvZiBVSSB2YXJpYW50cyB0aGF0IHdpbGwgYmUgZHluYW1pY2FsbHkgc3dpdGNoZWRcbiAgICogQHBhcmFtIHVpY29uZmlnIG9wdGlvbmFsIFVJIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyQVBJLCB1aVZhcmlhbnRzOiBVSVZhcmlhbnRbXSwgdWljb25maWc/OiBVSUNvbmZpZyk7XG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyQVBJLCBwbGF5ZXJVaU9yVWlWYXJpYW50czogVUlDb250YWluZXIgfCBVSVZhcmlhbnRbXSwgdWljb25maWc6IFVJQ29uZmlnID0ge30pIHtcbiAgICBpZiAocGxheWVyVWlPclVpVmFyaWFudHMgaW5zdGFuY2VvZiBVSUNvbnRhaW5lcikge1xuICAgICAgLy8gU2luZ2xlLVVJIGNvbnN0cnVjdG9yIGhhcyBiZWVuIGNhbGxlZCwgdHJhbnNmb3JtIGFyZ3VtZW50cyB0byBVSVZhcmlhbnRbXSBzaWduYXR1cmVcbiAgICAgIGxldCBwbGF5ZXJVaSA9IDxVSUNvbnRhaW5lcj5wbGF5ZXJVaU9yVWlWYXJpYW50cztcbiAgICAgIGxldCB1aVZhcmlhbnRzID0gW107XG5cbiAgICAgIC8vIEFkZCB0aGUgZGVmYXVsdCBwbGF5ZXIgVUlcbiAgICAgIHVpVmFyaWFudHMucHVzaCh7IHVpOiBwbGF5ZXJVaSB9KTtcblxuICAgICAgdGhpcy51aVZhcmlhbnRzID0gdWlWYXJpYW50cztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIChVSVZhcmlhbnRbXSkgaGFzIGJlZW4gY2FsbGVkXG4gICAgICB0aGlzLnVpVmFyaWFudHMgPSA8VUlWYXJpYW50W10+cGxheWVyVWlPclVpVmFyaWFudHM7XG4gICAgfVxuXG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy5tYW5hZ2VyUGxheWVyV3JhcHBlciA9IG5ldyBQbGF5ZXJXcmFwcGVyKHBsYXllcik7XG5cbiAgICAvLyBlbnN1cmUgdGhhdCBhdCBsZWFzdCB0aGUgbWV0YWRhdGEgb2JqZWN0IGRvZXMgZXhpc3QgaW4gdGhlIHVpY29uZmlnXG4gICAgdWljb25maWcubWV0YWRhdGEgPSB1aWNvbmZpZy5tZXRhZGF0YSA/IHVpY29uZmlnLm1ldGFkYXRhIDoge307XG5cbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHBsYXliYWNrU3BlZWRTZWxlY3Rpb25FbmFibGVkOiB0cnVlLCAvLyBTd2l0Y2ggb24gc3BlZWQgc2VsZWN0b3IgYnkgZGVmYXVsdFxuICAgICAgYXV0b1VpVmFyaWFudFJlc29sdmU6IHRydWUsIC8vIFN3aXRjaCBvbiBhdXRvIFVJIHJlc29sdmluZyBieSBkZWZhdWx0XG4gICAgICBkaXNhYmxlQXV0b0hpZGVXaGVuSG92ZXJlZDogZmFsc2UsIC8vIERpc2FibGUgYXV0byBoaWRlIHdoZW4gVUkgaXMgaG92ZXJlZFxuICAgICAgZW5hYmxlU2Vla1ByZXZpZXc6IHRydWUsXG4gICAgICAuLi51aWNvbmZpZyxcbiAgICAgIGV2ZW50czoge1xuICAgICAgICBvblVwZGF0ZWQ6IG5ldyBFdmVudERpc3BhdGNoZXI8VUlNYW5hZ2VyLCB2b2lkPigpLFxuICAgICAgfSxcbiAgICAgIHZvbHVtZUNvbnRyb2xsZXI6IG5ldyBWb2x1bWVDb250cm9sbGVyKHRoaXMubWFuYWdlclBsYXllcldyYXBwZXIuZ2V0UGxheWVyKCkpLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHYXRoZXJzIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIHRoZSBVSSBjb25maWcgYW5kIHBsYXllciBzb3VyY2UgY29uZmlnIGFuZCBjcmVhdGVzIGEgbWVyZ2VkIFVJIGNvbmZpZ1xuICAgICAqIHRoYXQgaXMgdXNlZCB0aHJvdWdob3V0IHRoZSBVSSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVDb25maWcgPSAoKSA9PiB7XG4gICAgICBjb25zdCBwbGF5ZXJTb3VyY2VDb25maWcgPSBwbGF5ZXIuZ2V0U291cmNlKCkgfHwge307XG4gICAgICB0aGlzLmNvbmZpZy5tZXRhZGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodWljb25maWcubWV0YWRhdGEgfHwge30pKTtcblxuICAgICAgLy8gRXh0cmFjdCB0aGUgVUktcmVsYXRlZCBjb25maWcgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2UgY29uZmlnXG4gICAgICBjb25zdCBwbGF5ZXJTb3VyY2VVaUNvbmZpZzogVUlDb25maWcgPSB7XG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgLy8gVE9ETyBtb3ZlIG1ldGFkYXRhIGludG8gc291cmNlLm1ldGFkYXRhIG5hbWVzcGFjZSBpbiBwbGF5ZXIgdjhcbiAgICAgICAgICB0aXRsZTogcGxheWVyU291cmNlQ29uZmlnLnRpdGxlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwbGF5ZXJTb3VyY2VDb25maWcuZGVzY3JpcHRpb24sXG4gICAgICAgICAgbWFya2VyczogKHBsYXllclNvdXJjZUNvbmZpZyBhcyBhbnkpLm1hcmtlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIHJlY29tbWVuZGF0aW9uczogKHBsYXllclNvdXJjZUNvbmZpZyBhcyBhbnkpLnJlY29tbWVuZGF0aW9ucyxcbiAgICAgIH07XG5cbiAgICAgIC8vIFBsYXllciBzb3VyY2UgY29uZmlnIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgVUkgY29uZmlnLCBiZWNhdXNlIHRoZSBjb25maWcgaW4gdGhlIHNvdXJjZSBpcyBhdHRhY2hlZFxuICAgICAgLy8gdG8gYSBzb3VyY2Ugd2hpY2ggY2hhbmdlcyB3aXRoIGV2ZXJ5IHBsYXllci5sb2FkLCB3aGVyZWFzIHRoZSBVSSBjb25maWcgc3RheXMgdGhlIHNhbWUgZm9yIHRoZSB3aG9sZVxuICAgICAgLy8gbGlmZXRpbWUgb2YgdGhlIHBsYXllciBpbnN0YW5jZS5cbiAgICAgIHRoaXMuY29uZmlnLm1ldGFkYXRhLnRpdGxlID0gcGxheWVyU291cmNlVWlDb25maWcubWV0YWRhdGEudGl0bGUgfHwgdWljb25maWcubWV0YWRhdGEudGl0bGU7XG4gICAgICB0aGlzLmNvbmZpZy5tZXRhZGF0YS5kZXNjcmlwdGlvbiA9IHBsYXllclNvdXJjZVVpQ29uZmlnLm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8IHVpY29uZmlnLm1ldGFkYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgdGhpcy5jb25maWcubWV0YWRhdGEubWFya2VycyA9IHBsYXllclNvdXJjZVVpQ29uZmlnLm1ldGFkYXRhLm1hcmtlcnMgfHwgdWljb25maWcubWV0YWRhdGEubWFya2VycyB8fCBbXTtcbiAgICAgIHRoaXMuY29uZmlnLnJlY29tbWVuZGF0aW9ucyA9IHBsYXllclNvdXJjZVVpQ29uZmlnLnJlY29tbWVuZGF0aW9ucyB8fCB1aWNvbmZpZy5yZWNvbW1lbmRhdGlvbnMgfHwgW107XG4gICAgfTtcblxuICAgIHVwZGF0ZUNvbmZpZygpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgY29uZmlndXJhdGlvbiB3aGVuIGEgbmV3IHNvdXJjZSBpcyBsb2FkZWQgYW5kIGRpc3BhdGNoIG9uVXBkYXRlZFxuICAgIGNvbnN0IHVwZGF0ZVNvdXJjZSA9ICgpID0+IHtcbiAgICAgIHVwZGF0ZUNvbmZpZygpO1xuICAgICAgdGhpcy5jb25maWcuZXZlbnRzLm9uVXBkYXRlZC5kaXNwYXRjaCh0aGlzKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgd3JhcHBlZFBsYXllciA9IHRoaXMubWFuYWdlclBsYXllcldyYXBwZXIuZ2V0UGxheWVyKCk7XG5cbiAgICB3cmFwcGVkUGxheWVyLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlTG9hZGVkLCB1cGRhdGVTb3VyY2UpO1xuXG4gICAgLy8gVGhlIFBsYXlsaXN0VHJhbnNpdGlvbiBldmVudCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBNb2JpbGUgdjMgZm9yIG5vdy5cbiAgICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBuZXcgc291cmNlIGJlY29tZXMgYWN0aXZlIGluIHRoZSBwbGF5ZXIuXG4gICAgaWYgKGlzTW9iaWxlVjNQbGF5ZXJBUEkod3JhcHBlZFBsYXllcikpIHtcbiAgICAgIHdyYXBwZWRQbGF5ZXIub24oTW9iaWxlVjNQbGF5ZXJFdmVudC5QbGF5bGlzdFRyYW5zaXRpb24sIHVwZGF0ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKHVpY29uZmlnLmNvbnRhaW5lcikge1xuICAgICAgLy8gVW5mb3J0dW5hdGVseSBcInVpQ29udGFpbmVyRWxlbWVudCA9IG5ldyBET00oY29uZmlnLmNvbnRhaW5lcilcIiB3aWxsIG5vdCBhY2NlcHQgdGhlIGNvbnRhaW5lciB3aXRoXG4gICAgICAvLyBzdHJpbmd8SFRNTEVsZW1lbnQgdHlwZSBkaXJlY3RseSwgYWx0aG91Z2ggaXQgYWNjZXB0cyBib3RoIHR5cGVzLCBzbyB3ZSBuZWVkIHRvIHNwaXQgdGhlc2UgdHdvIGNhc2VzIHVwIGhlcmUuXG4gICAgICAvLyBUT0RPIGNoZWNrIGluIHVwY29taW5nIFRTIHZlcnNpb25zIGlmIHRoZSBjb250YWluZXIgY2FuIGJlIHBhc3NlZCBpbiBkaXJlY3RseSwgb3IgZml4IHRoZSBjb25zdHJ1Y3RvclxuICAgICAgdGhpcy51aUNvbnRhaW5lckVsZW1lbnQgPSB1aWNvbmZpZy5jb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/XG4gICAgICAgIG5ldyBET00odWljb25maWcuY29udGFpbmVyKSA6IG5ldyBET00odWljb25maWcuY29udGFpbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51aUNvbnRhaW5lckVsZW1lbnQgPSBuZXcgRE9NKHBsYXllci5nZXRDb250YWluZXIoKSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIFVJIGluc3RhbmNlIG1hbmFnZXJzIGZvciB0aGUgVUkgdmFyaWFudHNcbiAgICAvLyBUaGUgaW5zdGFuY2UgbWFuYWdlcnMgbWFwIHRvIHRoZSBjb3JyZXNwb25kaW5nIFVJIHZhcmlhbnRzIGJ5IHRoZWlyIGFycmF5IGluZGV4XG4gICAgdGhpcy51aUluc3RhbmNlTWFuYWdlcnMgPSBbXTtcbiAgICBsZXQgdWlWYXJpYW50c1dpdGhvdXRDb25kaXRpb24gPSBbXTtcbiAgICBmb3IgKGxldCB1aVZhcmlhbnQgb2YgdGhpcy51aVZhcmlhbnRzKSB7XG4gICAgICBpZiAodWlWYXJpYW50LmNvbmRpdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIC8vIENvbGxlY3QgdmFyaWFudHMgd2l0aG91dCBjb25kaXRpb25zIGZvciBlcnJvciBjaGVja2luZ1xuICAgICAgICB1aVZhcmlhbnRzV2l0aG91dENvbmRpdGlvbi5wdXNoKHVpVmFyaWFudCk7XG4gICAgICB9XG4gICAgICAvLyBDcmVhdGUgdGhlIGluc3RhbmNlIG1hbmFnZXIgZm9yIGEgVUkgdmFyaWFudFxuICAgICAgdGhpcy51aUluc3RhbmNlTWFuYWdlcnMucHVzaChuZXcgSW50ZXJuYWxVSUluc3RhbmNlTWFuYWdlcihwbGF5ZXIsIHVpVmFyaWFudC51aSwgdGhpcy5jb25maWcpKTtcbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgVUkgdmFyaWFudCB3aXRob3V0IGEgY29uZGl0aW9uXG4gICAgLy8gSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIG11bHRpcGxlIHZhcmlhbnRzIHdpdGhvdXQgY29uZGl0aW9uLCBiZWNhdXNlIG9ubHkgdGhlIGZpcnN0IG9uZSBpbiB0aGUgbGlzdFxuICAgIC8vICh0aGUgb25lIHdpdGggdGhlIGxvd2VzdCBpbmRleCkgd2lsbCBldmVyIGJlIHNlbGVjdGVkLlxuICAgIGlmICh1aVZhcmlhbnRzV2l0aG91dENvbmRpdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBFcnJvcignVG9vIG1hbnkgVUlzIHdpdGhvdXQgYSBjb25kaXRpb246IFlvdSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGRlZmF1bHQgVUknKTtcbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGRlZmF1bHQgVUkgdmFyaWFudCwgaWYgZGVmaW5lZCwgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAobGFzdCBpbmRleClcbiAgICAvLyBJZiBpdCBjb21lcyBlYXJsaWVyLCB0aGUgdmFyaWFudHMgd2l0aCBjb25kaXRpb25zIHRoYXQgY29tZSBhZnRlcndhcmRzIHdpbGwgbmV2ZXIgYmUgc2VsZWN0ZWQgYmVjYXVzZSB0aGVcbiAgICAvLyBkZWZhdWx0IHZhcmlhbnQgd2l0aG91dCBhIGNvbmRpdGlvbiBhbHdheXMgZXZhbHVhdGVzIHRvICd0cnVlJ1xuICAgIGlmICh1aVZhcmlhbnRzV2l0aG91dENvbmRpdGlvbi5sZW5ndGggPiAwXG4gICAgICAmJiB1aVZhcmlhbnRzV2l0aG91dENvbmRpdGlvblswXSAhPT0gdGhpcy51aVZhcmlhbnRzW3RoaXMudWlWYXJpYW50cy5sZW5ndGggLSAxXSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgVUkgdmFyaWFudCBvcmRlcjogdGhlIGRlZmF1bHQgVUkgKHdpdGhvdXQgY29uZGl0aW9uKSBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QnKTtcbiAgICB9XG5cbiAgICBsZXQgYWRTdGFydGVkRXZlbnQ6IEFkRXZlbnQgPSBudWxsOyAvLyBrZWVwIHRoZSBldmVudCBzdG9yZWQgaGVyZSBkdXJpbmcgYWQgcGxheWJhY2tcblxuICAgIC8vIER5bmFtaWNhbGx5IHNlbGVjdCBhIFVJIHZhcmlhbnQgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IFVJIGNvbmRpdGlvbi5cbiAgICBsZXQgcmVzb2x2ZVVpVmFyaWFudCA9IChldmVudDogUGxheWVyRXZlbnRCYXNlKSA9PiB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgQWRTdGFydGVkIGV2ZW50IGRhdGEgaXMgcGVyc2lzdGVkIHRocm91Z2ggYWQgcGxheWJhY2sgaW4gY2FzZSBvdGhlciBldmVudHMgaGFwcGVuXG4gICAgICAvLyBpbiB0aGUgbWVhbnRpbWUsIGUuZy4gcGxheWVyIHJlc2l6ZS4gV2UgbmVlZCB0byBzdG9yZSB0aGlzIGRhdGEgYmVjYXVzZSB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8gZmluZCBvdXRcbiAgICAgIC8vIGFkIGRldGFpbHMgd2hpbGUgYW4gYWQgaXMgcGxheWluZyAoaW4gdjguMCBhdCBsZWFzdDsgZnJvbSB2OC4xIHRoZXJlIHdpbGwgYmUgYWRzLmdldEFjdGl2ZUFkKCkpLlxuICAgICAgLy8gRXhpc3RpbmcgZXZlbnQgZGF0YSBzaWduYWxzIHRoYXQgYW4gYWQgaXMgY3VycmVudGx5IGFjdGl2ZSAoaW5zdGVhZCBvZiBhZHMuaXNMaW5lYXJBZEFjdGl2ZSgpKS5cbiAgICAgIGlmIChldmVudCAhPSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgIC8vIFRoZSBhZHMgVUkgaXMgc2hvd24gdXBvbiB0aGUgZmlyc3QgQWRTdGFydGVkIGV2ZW50LiBTdWJzZXF1ZW50IEFkU3RhcnRlZCBldmVudHMgd2l0aGluIGFuIGFkIGJyZWFrXG4gICAgICAgICAgLy8gd2lsbCBub3QgY2hhbmdlIHRoZSBjb25kaXRpb24gY29udGV4dCBhbmQgdGh1cyBub3QgbGVhZCB0byB1bmRlc2lyZWQgVUkgdmFyaWFudCByZXNvbHZpbmcuXG4gICAgICAgICAgLy8gVGhlIGFkcyBVSSBpcyBzaG93biB1cG9uIEFkU3RhcnRlZCBpbnN0ZWFkIG9mIEFkQnJlYWtTdGFydGVkIGJlY2F1c2UgdGhlcmUgY2FuIGJlIGEgbG9hZGluZyBkZWxheVxuICAgICAgICAgIC8vIGJldHdlZW4gdGhlc2UgdHdvIGV2ZW50cyBpbiB0aGUgcGxheWVyLCBhbmQgdGhlIEFkQnJlYWtTdGFydGVkIGV2ZW50IGRvZXMgbm90IGNhcnJ5IGFueSBtZXRhZGF0YSB0b1xuICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGFkcyBVSSwgc28gaXQgd291bGQgYmUgcmVuZGVyZWQgaW4gYW4gdW5pbml0aWFsaXplZCBzdGF0ZSBmb3IgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLlxuICAgICAgICAgIC8vIFRPRE8gc2hvdyBhZHMgVUkgdXBvbiBBZEJyZWFrU3RhcnRlZCBhbmQgZGlzcGxheSBsb2FkaW5nIG92ZXJsYXkgYmV0d2VlbiBBZEJyZWFrU3RhcnRlZCBhbmQgZmlyc3QgQWRTdGFydGVkXG4gICAgICAgICAgLy8gVE9ETyBkaXNwbGF5IGxvYWRpbmcgb3ZlcmxheSBiZXR3ZWVuIEFkRmluaXNoZWQgYW5kIG5leHQgQWRTdGFydGVkXG4gICAgICAgICAgY2FzZSBwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZFN0YXJ0ZWQ6XG4gICAgICAgICAgICBhZFN0YXJ0ZWRFdmVudCA9IGV2ZW50IGFzIEFkRXZlbnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAvLyBUaGUgYWRzIFVJIGlzIGhpZGRlbiBvbmx5IHdoZW4gdGhlIGFkIGJyZWFrIGlzIGZpbmlzaGVkLCBpLmUuIG5vdCBvbiBBZEZpbmlzaGVkIGV2ZW50cy4gVGhpcyB3YXkgd2Uga2VlcFxuICAgICAgICAgIC8vIHRoZSBhZHMgVUkgdmFyaWFudCBhY3RpdmUgdGhyb3VnaG91dCBhbiBhZCBicmVhaywgYXMgcmVhY3RpbmcgdG8gQWRGaW5pc2hlZCB3b3VsZCBsZWFkIHRvIHVuZGVzaXJlZCBVSVxuICAgICAgICAgIC8vIHZhcmlhbnQgc3dpdGNoaW5nIGJldHdlZW4gdHdvIGFkcyBpbiBhbiBhZCBicmVhaywgZS5nLiBhZHMgVUkgLT4gQWRGaW5pc2hlZCAtPiBjb250ZW50IFVJIC0+XG4gICAgICAgICAgLy8gQWRTdGFydGVkIC0+IGFkcyBVSS5cbiAgICAgICAgICBjYXNlIHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFkQnJlYWtGaW5pc2hlZDpcbiAgICAgICAgICAgIGFkU3RhcnRlZEV2ZW50ID0gbnVsbDtcbiAgICAgICAgICAgIC8vIFdoZW4gc3dpdGNoaW5nIHRvIGEgdmFyaWFudCBmb3IgdGhlIGZpcnN0IHRpbWUsIGEgY29uZmlnLmV2ZW50cy5vblVwZGF0ZWQgZXZlbnQgaXMgZmlyZWQgdG8gdHJpZ2dlciBhIFVJXG4gICAgICAgICAgICAvLyB1cGRhdGUgb2YgdGhlIG5ldyB2YXJpYW50LCBiZWNhdXNlIG1vc3QgY29tcG9uZW50cyBzdWJzY3JpYmUgdG8gdGhpcyBldmVudCB0byB1cGRhdGUgdGhlbXNlbHZlcy4gV2hlblxuICAgICAgICAgICAgLy8gc3dpdGNoaW5nIHRvIHRoZSBhZHMgVUkgb24gdGhlIGZpcnN0IEFkU3RhcnRlZCwgYWxsIFVJIHZhcmlhbnRzIHVwZGF0ZSB0aGVtc2VsdmVzIHdpdGggdGhlIGFkIGRhdGEsIHNvXG4gICAgICAgICAgICAvLyB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIHRoZSBcIm5vcm1hbFwiIFVJIGl0IHdpbGwgY2FycnkgcHJvcGVydGllcyBvZiB0aGUgYWQgaW5zdGVhZCBvZiB0aGUgbWFpbiBjb250ZW50LlxuICAgICAgICAgICAgLy8gV2UgdGh1cyBmaXJlIHRoaXMgZXZlbnQgaGVyZSB0byBmb3JjZSBhbiBVSSB1cGRhdGUgd2l0aCB0aGUgcHJvcGVydGllcyBvZiB0aGUgbWFpbiBjb250ZW50LiBUaGlzIGlzXG4gICAgICAgICAgICAvLyBiYXNpY2FsbHkgYSBoYWNrIGJlY2F1c2UgdGhlIGNvbmZpZy5ldmVudHMub25VcGRhdGVkIGV2ZW50IGlzIGFidXNlZCBpbiBtYW55IHBsYWNlcyBhbmQgbm90IGp1c3QgdXNlZFxuICAgICAgICAgICAgLy8gZm9yIGNvbmZpZyB1cGRhdGVzIChlLmcuIGFkZGluZyBhIG1hcmtlciB0byB0aGUgc2Vla2JhcikuXG4gICAgICAgICAgICAvLyBUT0RPIGludHJvZHVjZSBhbiBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIHBsYXliYWNrIGNvbnRlbnQgaXMgdXBkYXRlZCwgYSBzd2l0Y2ggdG8vZnJvbSBhZHNcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmV2ZW50cy5vblVwZGF0ZWQuZGlzcGF0Y2godGhpcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAvLyBXaGVuIGEgbmV3IHNvdXJjZSBpcyBsb2FkZWQgZHVyaW5nIGFkIHBsYXliYWNrLCB0aGVyZSB3aWxsIGJlIG5vIEFkKEJyZWFrKUZpbmlzaGVkIGV2ZW50XG4gICAgICAgICAgY2FzZSBwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VMb2FkZWQ6XG4gICAgICAgICAgY2FzZSBwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZDpcbiAgICAgICAgICAgIGFkU3RhcnRlZEV2ZW50ID0gbnVsbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERldGVjdCBpZiBhbiBhZCBoYXMgc3RhcnRlZFxuICAgICAgbGV0IGlzQWQgPSBhZFN0YXJ0ZWRFdmVudCAhPSBudWxsO1xuICAgICAgbGV0IGFkUmVxdWlyZXNVaSA9IGZhbHNlO1xuICAgICAgaWYgKGlzQWQpIHtcbiAgICAgICAgbGV0IGFkID0gYWRTdGFydGVkRXZlbnQuYWQ7XG4gICAgICAgIC8vIGZvciBub3cgb25seSBsaW5lYXIgYWRzIGNhbiByZXF1ZXN0IGEgVUlcbiAgICAgICAgaWYgKGFkLmlzTGluZWFyKSB7XG4gICAgICAgICAgbGV0IGxpbmVhckFkID0gYWQgYXMgTGluZWFyQWQ7XG4gICAgICAgICAgYWRSZXF1aXJlc1VpID0gbGluZWFyQWQudWlDb25maWcgJiYgbGluZWFyQWQudWlDb25maWcucmVxdWVzdHNVaSB8fCBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWRSZXF1aXJlc1VpKSB7XG4gICAgICAgIC8vIHdlIGRpc3BhdGNoIG9uVXBkYXRlZCBldmVudCBiZWNhdXNlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBhZEJyZWFrcyBmb3Igc2FtZSBwb3NpdGlvblxuICAgICAgICAvLyBgUGxheWAgYW5kIGBQbGF5aW5nYCBldmVudHMgd2lsbCBub3QgYmUgZGlzcGF0Y2hlZCB3aGljaCB3aWxsIGNhdXNlIGBQbGF5YmFja0J1dHRvbmAgc3RhdGVcbiAgICAgICAgLy8gdG8gYmUgb3V0IG9mIHN5bmNcbiAgICAgICAgdGhpcy5jb25maWcuZXZlbnRzLm9uVXBkYXRlZC5kaXNwYXRjaCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNvbHZlVWlWYXJpYW50KHtcbiAgICAgICAgaXNBZDogaXNBZCxcbiAgICAgICAgYWRSZXF1aXJlc1VpOiBhZFJlcXVpcmVzVWksXG4gICAgICB9LCAoY29udGV4dCkgPT4ge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGFkIFVJLCB3ZSBuZWVkIHRvIHJlbGF5IHRoZSBzYXZlZCBPTl9BRF9TVEFSVEVEIGV2ZW50IGRhdGEgc28gYWQgY29tcG9uZW50cyBjYW4gY29uZmlndXJlXG4gICAgICAgIC8vIHRoZW1zZWx2ZXMgZm9yIHRoZSBjdXJyZW50IGFkLlxuICAgICAgICBpZiAoY29udGV4dC5pc0FkKSB7XG4gICAgICAgICAgLyogUmVsYXkgdGhlIE9OX0FEX1NUQVJURUQgZXZlbnQgdG8gdGhlIGFkcyBVSVxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQmVjYXVzZSB0aGUgYWRzIFVJIGlzIGluaXRpYWxpemVkIGluIHRoZSBPTl9BRF9TVEFSVEVEIGhhbmRsZXIsIGkuZS4gd2hlbiB0aGUgT05fQURfU1RBUlRFRCBldmVudCBoYXNcbiAgICAgICAgICAgKiBhbHJlYWR5IGJlZW4gZmlyZWQsIGNvbXBvbmVudHMgaW4gdGhlIGFkcyBVSSB0aGF0IGxpc3RlbiBmb3IgdGhlIE9OX0FEX1NUQVJURUQgZXZlbnQgbmV2ZXIgcmVjZWl2ZSBpdC5cbiAgICAgICAgICAgKiBTaW5jZSB0aGlzIGNhbiBicmVhayBmdW5jdGlvbmFsaXR5IG9mIGNvbXBvbmVudHMgdGhhdCByZWx5IG9uIHRoaXMgZXZlbnQsIHdlIHJlbGF5IHRoZSBldmVudCB0byB0aGVcbiAgICAgICAgICAgKiBhZHMgVUkgY29tcG9uZW50cyB3aXRoIHRoZSBmb2xsb3dpbmcgY2FsbC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICB0aGlzLmN1cnJlbnRVaS5nZXRXcmFwcGVkUGxheWVyKCkuZmlyZUV2ZW50SW5VSSh0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFkU3RhcnRlZCwgYWRTdGFydGVkRXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIHRvIHRoZSBmb2xsb3dpbmcgZXZlbnRzIHRvIHRyaWdnZXIgVUkgdmFyaWFudCByZXNvbHV0aW9uXG4gICAgaWYgKHRoaXMuY29uZmlnLmF1dG9VaVZhcmlhbnRSZXNvbHZlKSB7XG4gICAgICB0aGlzLm1hbmFnZXJQbGF5ZXJXcmFwcGVyLmdldFBsYXllcigpLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuU291cmNlTG9hZGVkLCByZXNvbHZlVWlWYXJpYW50KTtcbiAgICAgIHRoaXMubWFuYWdlclBsYXllcldyYXBwZXIuZ2V0UGxheWVyKCkub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5Tb3VyY2VVbmxvYWRlZCwgcmVzb2x2ZVVpVmFyaWFudCk7XG4gICAgICB0aGlzLm1hbmFnZXJQbGF5ZXJXcmFwcGVyLmdldFBsYXllcigpLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheSwgcmVzb2x2ZVVpVmFyaWFudCk7XG4gICAgICB0aGlzLm1hbmFnZXJQbGF5ZXJXcmFwcGVyLmdldFBsYXllcigpLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGF1c2VkLCByZXNvbHZlVWlWYXJpYW50KTtcbiAgICAgIHRoaXMubWFuYWdlclBsYXllcldyYXBwZXIuZ2V0UGxheWVyKCkub24odGhpcy5wbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5BZFN0YXJ0ZWQsIHJlc29sdmVVaVZhcmlhbnQpO1xuICAgICAgdGhpcy5tYW5hZ2VyUGxheWVyV3JhcHBlci5nZXRQbGF5ZXIoKS5vbih0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LkFkQnJlYWtGaW5pc2hlZCwgcmVzb2x2ZVVpVmFyaWFudCk7XG4gICAgICB0aGlzLm1hbmFnZXJQbGF5ZXJXcmFwcGVyLmdldFBsYXllcigpLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuUGxheWVyUmVzaXplZCwgcmVzb2x2ZVVpVmFyaWFudCk7XG4gICAgICB0aGlzLm1hbmFnZXJQbGF5ZXJXcmFwcGVyLmdldFBsYXllcigpLm9uKHRoaXMucGxheWVyLmV4cG9ydHMuUGxheWVyRXZlbnQuVmlld01vZGVDaGFuZ2VkLCByZXNvbHZlVWlWYXJpYW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzVmlzaWJpbGl0eVRyYWNrZXIgPSBuZXcgRm9jdXNWaXNpYmlsaXR5VHJhY2tlcigne3tQUkVGSVh9fScpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgVUlcbiAgICByZXNvbHZlVWlWYXJpYW50KG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9zZXMgaTE4bi5nZXRMb2NhbGl6ZXIoKSBmdW5jdGlvblxuICAgKiBAcmV0dXJucyB7STE4bkFwaS5nZXRMb2NhbGl6ZXIoKX1cbiAgICovXG4gIHN0YXRpYyBsb2NhbGl6ZTxWIGV4dGVuZHMgQ3VzdG9tVm9jYWJ1bGFyeTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj4oa2V5OiBrZXlvZiBWKSB7XG4gICAgcmV0dXJuIGkxOG4uZ2V0TG9jYWxpemVyKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBjb25maWd1cmF0aW9uIHRvIHN1cHBvcnQgQ3VzdG9tIFVJIGxhbmd1YWdlc1xuICAgKiBkZWZhdWx0IGxhbmd1YWdlOiAnZW4nXG4gICAqL1xuICBzdGF0aWMgc2V0TG9jYWxpemF0aW9uQ29uZmlnKGxvY2FsaXphdGlvbkNvbmZpZzogTG9jYWxpemF0aW9uQ29uZmlnKSB7XG4gICAgaTE4bi5zZXRDb25maWcobG9jYWxpemF0aW9uQ29uZmlnKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBVSUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgVUkgdmFyaWFudHMgYXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIG9mIHtAbGluayBVSU1hbmFnZXJ9LlxuICAgKiBAcmV0dXJucyB7VUlWYXJpYW50W119IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBVSSB2YXJpYW50c1xuICAgKi9cbiAgZ2V0VWlWYXJpYW50cygpOiBVSVZhcmlhbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMudWlWYXJpYW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2hlcyB0byBhIFVJIHZhcmlhbnQgZnJvbSB0aGUgbGlzdCByZXR1cm5lZCBieSB7QGxpbmsgZ2V0VWlWYXJpYW50c30uXG4gICAqIEBwYXJhbSB7VUlWYXJpYW50fSB1aVZhcmlhbnQgdGhlIFVJIHZhcmlhbnQgdG8gc3dpdGNoIHRvXG4gICAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gb25TaG93IGEgY2FsbGJhY2sgdGhhdCBpcyBleGVjdXRlZCBqdXN0IGJlZm9yZSB0aGUgbmV3IFVJIHZhcmlhbnQgaXMgc2hvd25cbiAgICovXG4gIHN3aXRjaFRvVWlWYXJpYW50KHVpVmFyaWFudDogVUlWYXJpYW50LCBvblNob3c/OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgbGV0IHVpVmFyaWFudEluZGV4ID0gdGhpcy51aVZhcmlhbnRzLmluZGV4T2YodWlWYXJpYW50KTtcblxuICAgIGNvbnN0IG5leHRVaTogSW50ZXJuYWxVSUluc3RhbmNlTWFuYWdlciA9IHRoaXMudWlJbnN0YW5jZU1hbmFnZXJzW3VpVmFyaWFudEluZGV4XTtcbiAgICBsZXQgdWlWYXJpYW50Q2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBVSSB2YXJpYW50IGlzIGNoYW5naW5nXG4gICAgaWYgKG5leHRVaSAhPT0gdGhpcy5jdXJyZW50VWkpIHtcbiAgICAgIHVpVmFyaWFudENoYW5nZWQgPSB0cnVlO1xuICAgICAgLy8gY29uc29sZS5sb2coJ3N3aXRjaGVkIGZyb20gJywgdGhpcy5jdXJyZW50VWkgPyB0aGlzLmN1cnJlbnRVaS5nZXRVSSgpIDogJ25vbmUnLFxuICAgICAgLy8gICAnIHRvICcsIG5leHRVaSA/IG5leHRVaS5nZXRVSSgpIDogJ25vbmUnKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGlmIHRoZSBVSSB2YXJpYW50IGlzIGNoYW5naW5nLCB3ZSBuZWVkIHRvIGRvIHNvbWUgc3R1ZmYuIEVsc2Ugd2UganVzdCBsZWF2ZSBldmVyeXRoaW5nIGFzLWlzLlxuICAgIGlmICh1aVZhcmlhbnRDaGFuZ2VkKSB7XG4gICAgICAvLyBIaWRlIHRoZSBjdXJyZW50bHkgYWN0aXZlIFVJIHZhcmlhbnRcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRVaSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRVaS5nZXRVSSgpLmhpZGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXNzaWduIHRoZSBuZXcgVUkgdmFyaWFudCBhcyBjdXJyZW50IFVJXG4gICAgICB0aGlzLmN1cnJlbnRVaSA9IG5leHRVaTtcblxuICAgICAgLy8gV2hlbiB3ZSBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgVUkgaW5zdGFuY2UsIHRoZXJlJ3Mgc29tZSBhZGRpdGlvbmFsIHN0dWZmIHRvIG1hbmFnZS4gSWYgd2UgZG8gbm90IHN3aXRjaFxuICAgICAgLy8gdG8gYW4gaW5zdGFuY2UsIHdlJ3JlIGRvbmUgaGVyZS5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRVaSAhPSBudWxsKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgVUkgdG8gdGhlIERPTSAoYW5kIGNvbmZpZ3VyZSBpdCkgdGhlIGZpcnN0IHRpbWUgaXQgaXMgc2VsZWN0ZWRcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRVaS5pc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICAgIHRoaXMuYWRkVWkodGhpcy5jdXJyZW50VWkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9uU2hvdykge1xuICAgICAgICAgIG9uU2hvdygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VWkuZ2V0VUkoKS5zaG93KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgVUkgdmFyaWFudCBzd2l0Y2ggYXMgdHJpZ2dlcmVkIGJ5IGV2ZW50cyB3aGVuIGF1dG9tYXRpYyBzd2l0Y2hpbmcgaXMgZW5hYmxlZC4gSXQgYWxsb3dzIHRvIG92ZXJ3cml0ZVxuICAgKiBwcm9wZXJ0aWVzIG9mIHRoZSB7QGxpbmsgVUlDb25kaXRpb25Db250ZXh0fS5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPFVJQ29uZGl0aW9uQ29udGV4dD59IGNvbnRleHQgYW4gb3B0aW9uYWwgc2V0IG9mIHByb3BlcnRpZXMgdGhhdCBvdmVyd3JpdGUgcHJvcGVydGllcyBvZiB0aGVcbiAgICogICBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgY29udGV4dFxuICAgKiBAcGFyYW0geyhjb250ZXh0OiBVSUNvbmRpdGlvbkNvbnRleHQpID0+IHZvaWR9IG9uU2hvdyBhIGNhbGxiYWNrIHRoYXQgaXMgZXhlY3V0ZWQganVzdCBiZWZvcmUgdGhlIG5ldyBVSSB2YXJpYW50XG4gICAqICAgaXMgc2hvd24gKGlmIGEgc3dpdGNoIGlzIGhhcHBlbmluZylcbiAgICovXG4gIHJlc29sdmVVaVZhcmlhbnQoY29udGV4dDogUGFydGlhbDxVSUNvbmRpdGlvbkNvbnRleHQ+ID0ge30sIG9uU2hvdz86IChjb250ZXh0OiBVSUNvbmRpdGlvbkNvbnRleHQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAvLyBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgY29udGV4dCBmb3Igd2hpY2ggdGhlIFVJIHZhcmlhbnQgd2lsbCBiZSByZXNvbHZlZFxuICAgIGNvbnN0IGRlZmF1bHRDb250ZXh0OiBVSUNvbmRpdGlvbkNvbnRleHQgPSB7XG4gICAgICBpc0FkOiBmYWxzZSxcbiAgICAgIGFkUmVxdWlyZXNVaTogZmFsc2UsXG4gICAgICBpc0Z1bGxzY3JlZW46IHRoaXMucGxheWVyLmdldFZpZXdNb2RlKCkgPT09IHRoaXMucGxheWVyLmV4cG9ydHMuVmlld01vZGUuRnVsbHNjcmVlbixcbiAgICAgIGlzTW9iaWxlOiBCcm93c2VyVXRpbHMuaXNNb2JpbGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMucGxheWVyLmlzUGxheWluZygpLFxuICAgICAgd2lkdGg6IHRoaXMudWlDb250YWluZXJFbGVtZW50LndpZHRoKCksXG4gICAgICBkb2N1bWVudFdpZHRoOiBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLFxuICAgIH07XG5cbiAgICAvLyBPdmVyd3JpdGUgcHJvcGVydGllcyBvZiB0aGUgZGVmYXVsdCBjb250ZXh0IHdpdGggcGFzc2VkIGluIGNvbnRleHQgcHJvcGVydGllc1xuICAgIGNvbnN0IHN3aXRjaGluZ0NvbnRleHQgPSB7IC4uLmRlZmF1bHRDb250ZXh0LCAuLi5jb250ZXh0IH07XG5cbiAgICAvLyBGaXJlIHRoZSBldmVudCBhbmQgYWxsb3cgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZXh0IGJlZm9yZSBpdCBpcyB1c2VkIHRvIHJlc29sdmUgdGhlIFVJIHZhcmlhbnRcbiAgICB0aGlzLmV2ZW50cy5vblVpVmFyaWFudFJlc29sdmUuZGlzcGF0Y2godGhpcywgc3dpdGNoaW5nQ29udGV4dCk7XG5cbiAgICBsZXQgbmV4dFVpVmFyaWFudDogVUlWYXJpYW50ID0gbnVsbDtcblxuICAgIC8vIFNlbGVjdCBuZXcgVUkgdmFyaWFudFxuICAgIC8vIElmIG5vIHZhcmlhbnQgY29uZGl0aW9uIGlzIGZ1bGZpbGxlZCwgd2Ugc3dpdGNoIHRvICpubyogVUlcbiAgICBmb3IgKGxldCB1aVZhcmlhbnQgb2YgdGhpcy51aVZhcmlhbnRzKSB7XG4gICAgICBpZiAodWlWYXJpYW50LmNvbmRpdGlvbiA9PSBudWxsIHx8IHVpVmFyaWFudC5jb25kaXRpb24oc3dpdGNoaW5nQ29udGV4dCkgPT09IHRydWUpIHtcbiAgICAgICAgbmV4dFVpVmFyaWFudCA9IHVpVmFyaWFudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zd2l0Y2hUb1VpVmFyaWFudChuZXh0VWlWYXJpYW50LCAoKSA9PiB7XG4gICAgICBpZiAob25TaG93KSB7XG4gICAgICAgIG9uU2hvdyhzd2l0Y2hpbmdDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVWkodWk6IEludGVybmFsVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICBsZXQgZG9tID0gdWkuZ2V0VUkoKS5nZXREb21FbGVtZW50KCk7XG4gICAgbGV0IHBsYXllciA9IHVpLmdldFdyYXBwZWRQbGF5ZXIoKTtcblxuICAgIHVpLmNvbmZpZ3VyZUNvbnRyb2xzKCk7XG4gICAgLyogQXBwZW5kIHRoZSBVSSBET00gYWZ0ZXIgY29uZmlndXJhdGlvbiB0byBhdm9pZCBDU1MgdHJhbnNpdGlvbnMgYXQgaW5pdGlhbGl6YXRpb25cbiAgICAgKiBFeGFtcGxlOiBDb21wb25lbnRzIGFyZSBoaWRkZW4gZHVyaW5nIGNvbmZpZ3VyYXRpb24gYW5kIHRoZXNlIGhpZGVzIG1heSB0cmlnZ2VyIENTUyB0cmFuc2l0aW9ucyB0aGF0IGFyZVxuICAgICAqIHVuZGVzaXJhYmxlIGF0IHRoaXMgdGltZS4gKi9cbiAgICB0aGlzLnVpQ29udGFpbmVyRWxlbWVudC5hcHBlbmQoZG9tKTtcblxuICAgIC8vIFdoZW4gdGhlIFVJIGlzIGxvYWRlZCBhZnRlciBhIHNvdXJjZSB3YXMgbG9hZGVkLCB3ZSBuZWVkIHRvIHRlbGwgdGhlIGNvbXBvbmVudHMgdG8gaW5pdGlhbGl6ZSB0aGVtc2VsdmVzXG4gICAgaWYgKHBsYXllci5nZXRTb3VyY2UoKSkge1xuICAgICAgdGhpcy5jb25maWcuZXZlbnRzLm9uVXBkYXRlZC5kaXNwYXRjaCh0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBGaXJlIG9uQ29uZmlndXJlZCBhZnRlciBVSSBET00gZWxlbWVudHMgYXJlIHN1Y2Nlc3NmdWxseSBhZGRlZC4gV2hlbiBmaXJlZCBpbW1lZGlhdGVseSwgdGhlIERPTSBlbGVtZW50c1xuICAgIC8vIG1pZ2h0IG5vdCBiZSBmdWxseSBjb25maWd1cmVkIGFuZCBlLmcuIGRvIG5vdCBoYXZlIGEgc2l6ZS5cbiAgICAvLyBodHRwczovL3N3aXplYy5jb20vYmxvZy9ob3ctdG8tcHJvcGVybHktd2FpdC1mb3ItZG9tLWVsZW1lbnRzLXRvLXNob3ctdXAtaW4tbW9kZXJuLWJyb3dzZXJzL3N3aXplYy82NjYzXG4gICAgaWYgKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHVpLm9uQ29uZmlndXJlZC5kaXNwYXRjaCh1aS5nZXRVSSgpKTsgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElFOSBmYWxsYmFja1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHVpLm9uQ29uZmlndXJlZC5kaXNwYXRjaCh1aS5nZXRVSSgpKTsgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWxlYXNlVWkodWk6IEludGVybmFsVUlJbnN0YW5jZU1hbmFnZXIpOiB2b2lkIHtcbiAgICB1aS5yZWxlYXNlQ29udHJvbHMoKTtcbiAgICB1aS5nZXRVSSgpLmdldERvbUVsZW1lbnQoKS5yZW1vdmUoKTtcbiAgICB1aS5jbGVhckV2ZW50SGFuZGxlcnMoKTtcbiAgfVxuXG4gIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgdWlJbnN0YW5jZU1hbmFnZXIgb2YgdGhpcy51aUluc3RhbmNlTWFuYWdlcnMpIHtcbiAgICAgIHRoaXMucmVsZWFzZVVpKHVpSW5zdGFuY2VNYW5hZ2VyKTtcbiAgICB9XG4gICAgdGhpcy5tYW5hZ2VyUGxheWVyV3JhcHBlci5jbGVhckV2ZW50SGFuZGxlcnMoKTtcbiAgICB0aGlzLmZvY3VzVmlzaWJpbGl0eVRyYWNrZXIucmVsZWFzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGp1c3QgYmVmb3JlIFVJIHZhcmlhbnRzIGFyZSBhYm91dCB0byBiZSByZXNvbHZlZCBhbmQgdGhlIFVJIHZhcmlhbnQgaXMgcG9zc2libHkgc3dpdGNoZWQuIEl0IGlzIGZpcmVkIHdoZW5cbiAgICogdGhlIHN3aXRjaCBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBhdXRvbWF0aWMgc3dpdGNoIGFuZCB3aGVuIGNhbGxpbmcge0BsaW5rIHJlc29sdmVVaVZhcmlhbnR9LlxuICAgKiBDYW4gYmUgdXNlZCB0byBtb2RpZnkgdGhlIHtAbGluayBVSUNvbmRpdGlvbkNvbnRleHR9IGJlZm9yZSByZXNvbHZpbmcgaXMgZG9uZS5cbiAgICogQHJldHVybnMge0V2ZW50RGlzcGF0Y2hlcjxVSU1hbmFnZXIsIFVJQ29uZGl0aW9uQ29udGV4dD59XG4gICAqL1xuICBnZXQgb25VaVZhcmlhbnRSZXNvbHZlKCk6IEV2ZW50RGlzcGF0Y2hlcjxVSU1hbmFnZXIsIFVJQ29uZGl0aW9uQ29udGV4dD4ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5vblVpVmFyaWFudFJlc29sdmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgYWRkZWQgbWFya2VycyBpbiB1bmRlZmluZWQgb3JkZXIuXG4gICAqL1xuICBnZXRUaW1lbGluZU1hcmtlcnMoKTogVGltZWxpbmVNYXJrZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm1ldGFkYXRhLm1hcmtlcnM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG1hcmtlciB0byB0aGUgdGltZWxpbmUuIERvZXMgbm90IGNoZWNrIGZvciBkdXBsaWNhdGVzL292ZXJsYXBzIGF0IHRoZSBgdGltZWAuXG4gICAqL1xuICBhZGRUaW1lbGluZU1hcmtlcih0aW1lbGluZU1hcmtlcjogVGltZWxpbmVNYXJrZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tYXJrZXJzLnB1c2godGltZWxpbmVNYXJrZXIpO1xuICAgIHRoaXMuY29uZmlnLmV2ZW50cy5vblVwZGF0ZWQuZGlzcGF0Y2godGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIG1hcmtlciBmcm9tIHRoZSB0aW1lbGluZSAoYnkgcmVmZXJlbmNlKSBhbmQgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1hcmtlciBoYXNcbiAgICogYmVlbiBwYXJ0IG9mIHRoZSB0aW1lbGluZSBhbmQgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIG9yIGBmYWxzZWAgaWYgdGhlIG1hcmtlciBjb3VsZCBub3RcbiAgICogYmUgZm91bmQgYW5kIHRodXMgbm90IHJlbW92ZWQuXG4gICAqL1xuICByZW1vdmVUaW1lbGluZU1hcmtlcih0aW1lbGluZU1hcmtlcjogVGltZWxpbmVNYXJrZXIpOiBib29sZWFuIHtcbiAgICBpZiAoQXJyYXlVdGlscy5yZW1vdmUodGhpcy5jb25maWcubWV0YWRhdGEubWFya2VycywgdGltZWxpbmVNYXJrZXIpID09PSB0aW1lbGluZU1hcmtlcikge1xuICAgICAgdGhpcy5jb25maWcuZXZlbnRzLm9uVXBkYXRlZC5kaXNwYXRjaCh0aGlzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlZWtQcmV2aWV3QXJncyBleHRlbmRzIE5vQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgdGltZWxpbmUgcG9zaXRpb24gaW4gcGVyY2VudCB3aGVyZSB0aGUgZXZlbnQgb3JpZ2luYXRlcyBmcm9tLlxuICAgKi9cbiAgcG9zaXRpb246IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0aW1lbGluZSBtYXJrZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBpZiBleGlzdGluZy5cbiAgICovXG4gIG1hcmtlcj86IFNlZWtCYXJNYXJrZXI7XG59XG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIGZ1bmN0aW9uYWxpdHkgdG8gbWFuYWdlIGEgVUkgaW5zdGFuY2UuIFVzZWQgYnkgdGhlIHtAbGluayBVSU1hbmFnZXJ9IHRvIG1hbmFnZSBtdWx0aXBsZSBVSSBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSUluc3RhbmNlTWFuYWdlciB7XG4gIHByaXZhdGUgcGxheWVyV3JhcHBlcjogUGxheWVyV3JhcHBlcjtcbiAgcHJpdmF0ZSB1aTogVUlDb250YWluZXI7XG4gIHByaXZhdGUgY29uZmlnOiBJbnRlcm5hbFVJQ29uZmlnO1xuXG4gIHByaXZhdGUgZXZlbnRzID0ge1xuICAgIG9uQ29uZmlndXJlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxVSUNvbnRhaW5lciwgTm9BcmdzPigpLFxuICAgIG9uU2VlazogbmV3IEV2ZW50RGlzcGF0Y2hlcjxTZWVrQmFyLCBOb0FyZ3M+KCksXG4gICAgb25TZWVrUHJldmlldzogbmV3IEV2ZW50RGlzcGF0Y2hlcjxTZWVrQmFyLCBTZWVrUHJldmlld0FyZ3M+KCksXG4gICAgb25TZWVrZWQ6IG5ldyBFdmVudERpc3BhdGNoZXI8U2Vla0JhciwgTm9BcmdzPigpLFxuICAgIG9uQ29tcG9uZW50U2hvdzogbmV3IEV2ZW50RGlzcGF0Y2hlcjxDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiwgTm9BcmdzPigpLFxuICAgIG9uQ29tcG9uZW50SGlkZTogbmV3IEV2ZW50RGlzcGF0Y2hlcjxDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiwgTm9BcmdzPigpLFxuICAgIG9uQ29udHJvbHNTaG93OiBuZXcgRXZlbnREaXNwYXRjaGVyPFVJQ29udGFpbmVyLCBOb0FyZ3M+KCksXG4gICAgb25QcmV2aWV3Q29udHJvbHNIaWRlOiBuZXcgRXZlbnREaXNwYXRjaGVyPFVJQ29udGFpbmVyLCBDYW5jZWxFdmVudEFyZ3M+KCksXG4gICAgb25Db250cm9sc0hpZGU6IG5ldyBFdmVudERpc3BhdGNoZXI8VUlDb250YWluZXIsIE5vQXJncz4oKSxcbiAgICBvblJlbGVhc2U6IG5ldyBFdmVudERpc3BhdGNoZXI8VUlDb250YWluZXIsIE5vQXJncz4oKSxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllckFQSSwgdWk6IFVJQ29udGFpbmVyLCBjb25maWc6IEludGVybmFsVUlDb25maWcpIHtcbiAgICB0aGlzLnBsYXllcldyYXBwZXIgPSBuZXcgUGxheWVyV3JhcHBlcihwbGF5ZXIpO1xuICAgIHRoaXMudWkgPSB1aTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuXG4gIGdldENvbmZpZygpOiBJbnRlcm5hbFVJQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICBnZXRVSSgpOiBVSUNvbnRhaW5lciB7XG4gICAgcmV0dXJuIHRoaXMudWk7XG4gIH1cblxuICBnZXRQbGF5ZXIoKTogUGxheWVyQVBJIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXJXcmFwcGVyLmdldFBsYXllcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIFVJIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgYW5kIGFkZGVkIHRvIHRoZSBET00uXG4gICAqIEByZXR1cm5zIHtFdmVudERpc3BhdGNoZXJ9XG4gICAqL1xuICBnZXQgb25Db25maWd1cmVkKCk6IEV2ZW50RGlzcGF0Y2hlcjxVSUNvbnRhaW5lciwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLm9uQ29uZmlndXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGEgc2VlayBzdGFydHMuXG4gICAqIEByZXR1cm5zIHtFdmVudERpc3BhdGNoZXJ9XG4gICAqL1xuICBnZXQgb25TZWVrKCk6IEV2ZW50RGlzcGF0Y2hlcjxTZWVrQmFyLCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMub25TZWVrO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIHNlZWsgdGltZWxpbmUgaXMgc2NydWJiZWQuXG4gICAqIEByZXR1cm5zIHtFdmVudERpc3BhdGNoZXJ9XG4gICAqL1xuICBnZXQgb25TZWVrUHJldmlldygpOiBFdmVudERpc3BhdGNoZXI8U2Vla0JhciwgU2Vla1ByZXZpZXdBcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLm9uU2Vla1ByZXZpZXc7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBhIHNlZWsgaXMgZmluaXNoZWQuXG4gICAqIEByZXR1cm5zIHtFdmVudERpc3BhdGNoZXJ9XG4gICAqL1xuICBnZXQgb25TZWVrZWQoKTogRXZlbnREaXNwYXRjaGVyPFNlZWtCYXIsIE5vQXJncz4ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5vblNlZWtlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGEgY29tcG9uZW50IGlzIHNob3dpbmcuXG4gICAqIEByZXR1cm5zIHtFdmVudERpc3BhdGNoZXJ9XG4gICAqL1xuICBnZXQgb25Db21wb25lbnRTaG93KCk6IEV2ZW50RGlzcGF0Y2hlcjxDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLm9uQ29tcG9uZW50U2hvdztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGEgY29tcG9uZW50IGlzIGhpZGluZy5cbiAgICogQHJldHVybnMge0V2ZW50RGlzcGF0Y2hlcn1cbiAgICovXG4gIGdldCBvbkNvbXBvbmVudEhpZGUoKTogRXZlbnREaXNwYXRjaGVyPENvbXBvbmVudDxDb21wb25lbnRDb25maWc+LCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMub25Db21wb25lbnRIaWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIFVJIGNvbnRyb2xzIGFyZSBzaG93aW5nLlxuICAgKiBAcmV0dXJucyB7RXZlbnREaXNwYXRjaGVyfVxuICAgKi9cbiAgZ2V0IG9uQ29udHJvbHNTaG93KCk6IEV2ZW50RGlzcGF0Y2hlcjxVSUNvbnRhaW5lciwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLm9uQ29udHJvbHNTaG93O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGJlZm9yZSB0aGUgVUkgY29udHJvbHMgYXJlIGhpZGluZyB0byBjaGVjayBpZiB0aGV5IGFyZSBhbGxvd2VkIHRvIGhpZGUuXG4gICAqIEByZXR1cm5zIHtFdmVudERpc3BhdGNoZXJ9XG4gICAqL1xuICBnZXQgb25QcmV2aWV3Q29udHJvbHNIaWRlKCk6IEV2ZW50RGlzcGF0Y2hlcjxVSUNvbnRhaW5lciwgQ2FuY2VsRXZlbnRBcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLm9uUHJldmlld0NvbnRyb2xzSGlkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBVSSBjb250cm9scyBhcmUgaGlkaW5nLlxuICAgKiBAcmV0dXJucyB7RXZlbnREaXNwYXRjaGVyfVxuICAgKi9cbiAgZ2V0IG9uQ29udHJvbHNIaWRlKCk6IEV2ZW50RGlzcGF0Y2hlcjxVSUNvbnRhaW5lciwgTm9BcmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLm9uQ29udHJvbHNIaWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIFVJIGNvbnRyb2xzIGFyZSByZWxlYXNlZC5cbiAgICogQHJldHVybnMge0V2ZW50RGlzcGF0Y2hlcn1cbiAgICovXG4gIGdldCBvblJlbGVhc2UoKTogRXZlbnREaXNwYXRjaGVyPFVJQ29udGFpbmVyLCBOb0FyZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5ldmVudHMub25SZWxlYXNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICB0aGlzLnBsYXllcldyYXBwZXIuY2xlYXJFdmVudEhhbmRsZXJzKCk7XG5cbiAgICBsZXQgZXZlbnRzID0gPGFueT50aGlzLmV2ZW50czsgLy8gYXZvaWQgVFM3MDE3XG4gICAgZm9yIChsZXQgZXZlbnQgaW4gZXZlbnRzKSB7XG4gICAgICBsZXQgZGlzcGF0Y2hlciA9IDxFdmVudERpc3BhdGNoZXI8T2JqZWN0LCBPYmplY3Q+PmV2ZW50c1tldmVudF07XG4gICAgICBkaXNwYXRjaGVyLnVuc3Vic2NyaWJlQWxsKCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRXh0ZW5kcyB0aGUge0BsaW5rIFVJSW5zdGFuY2VNYW5hZ2VyfSBmb3IgaW50ZXJuYWwgdXNlIGluIHRoZSB7QGxpbmsgVUlNYW5hZ2VyfSBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIGZ1bmN0aW9uYWxpdHlcbiAqIHRoYXQgY29tcG9uZW50cyByZWNlaXZpbmcgYSByZWZlcmVuY2UgdG8gdGhlIHtAbGluayBVSUluc3RhbmNlTWFuYWdlcn0gc2hvdWxkIG5vdCBoYXZlIGFjY2VzcyB0by5cbiAqL1xuY2xhc3MgSW50ZXJuYWxVSUluc3RhbmNlTWFuYWdlciBleHRlbmRzIFVJSW5zdGFuY2VNYW5hZ2VyIHtcblxuICBwcml2YXRlIGNvbmZpZ3VyZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVsZWFzZWQ6IGJvb2xlYW47XG5cbiAgZ2V0V3JhcHBlZFBsYXllcigpOiBXcmFwcGVkUGxheWVyIHtcbiAgICAvLyBUT0RPIGZpbmQgYSBub24taGFja3kgd2F5IHRvIHByb3ZpZGUgdGhlIFdyYXBwZWRQbGF5ZXIgdG8gdGhlIFVJTWFuYWdlciB3aXRob3V0IGV4cG9ydGluZyBpdFxuICAgIC8vIGdldFBsYXllcigpIGFjdHVhbGx5IHJldHVybnMgdGhlIFdyYXBwZWRQbGF5ZXIgYnV0IGl0cyByZXR1cm4gdHlwZSBpcyBzZXQgdG8gUGxheWVyIHNvIHRoZSBXcmFwcGVkUGxheWVyIGRvZXNcbiAgICAvLyBub3QgbmVlZCB0byBiZSBleHBvcnRlZFxuICAgIHJldHVybiA8V3JhcHBlZFBsYXllcj50aGlzLmdldFBsYXllcigpO1xuICB9XG5cbiAgY29uZmlndXJlQ29udHJvbHMoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWd1cmVDb250cm9sc1RyZWUodGhpcy5nZXRVSSgpKTtcbiAgICB0aGlzLmNvbmZpZ3VyZWQgPSB0cnVlO1xuICB9XG5cbiAgaXNDb25maWd1cmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyZWQ7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZUNvbnRyb2xzVHJlZShjb21wb25lbnQ6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+KSB7XG4gICAgbGV0IGNvbmZpZ3VyZWRDb21wb25lbnRzOiBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPltdID0gW107XG5cbiAgICBVSVV0aWxzLnRyYXZlcnNlVHJlZShjb21wb25lbnQsIChjb21wb25lbnQpID0+IHtcbiAgICAgIC8vIEZpcnN0LCBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgY29uZmlndXJlZCBhIGNvbXBvbmVudCwgYW5kIHRocm93IGFuIGVycm9yIGlmIHdlIGRpZC4gTXVsdGlwbGUgY29uZmlndXJhdGlvblxuICAgICAgLy8gb2YgdGhlIHNhbWUgY29tcG9uZW50IGxlYWRzIHRvIHVuZXhwZWN0ZWQgVUkgYmVoYXZpb3IuIEFsc28sIGEgY29tcG9uZW50IHRoYXQgaXMgaW4gdGhlIFVJIHRyZWUgbXVsdGlwbGVcbiAgICAgIC8vIHRpbWVzIGhpbnRzIGF0IGEgd3JvbmcgVUkgc3RydWN0dXJlLlxuICAgICAgLy8gV2UgY291bGQganVzdCBza2lwIGNvbmZpZ3VyYXRpb24gaW4gc3VjaCBhIGNhc2UgYW5kIG5vdCB0aHJvdyBhbiBleGNlcHRpb24sIGJ1dCBlbmZvcmNpbmcgYSBjbGVhbiBVSSB0cmVlXG4gICAgICAvLyBzZWVtcyBsaWtlIHRoZSBiZXR0ZXIgY2hvaWNlLlxuICAgICAgZm9yIChsZXQgY29uZmlndXJlZENvbXBvbmVudCBvZiBjb25maWd1cmVkQ29tcG9uZW50cykge1xuICAgICAgICBpZiAoY29uZmlndXJlZENvbXBvbmVudCA9PT0gY29tcG9uZW50KSB7XG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGNvbXBvbmVudCB0byB0aGUgY29uc29sZSB0byBzaW1wbGlmeSBpZGVudGlmaWNhdGlvbiBvZiB0aGUgY3VscHJpdFxuICAgICAgICAgIC8vIChlLmcuIGJ5IGluc3BlY3RpbmcgdGhlIGNvbmZpZylcbiAgICAgICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2lyY3VsYXIgcmVmZXJlbmNlIGluIFVJIHRyZWUnLCBjb21wb25lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZGl0aW9uYWxseSB0aHJvdyBhbiBlcnJvciwgYmVjYXVzZSB0aGlzIGNhc2UgbXVzdCBub3QgaGFwcGVuIGFuZCBsZWFkcyB0byB1bmV4cGVjdGVkIFVJIGJlaGF2aW9yLlxuICAgICAgICAgIHRocm93IEVycm9yKCdDaXJjdWxhciByZWZlcmVuY2UgaW4gVUkgdHJlZTogJyArIGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb21wb25lbnQuaW5pdGlhbGl6ZSgpO1xuICAgICAgY29tcG9uZW50LmNvbmZpZ3VyZSh0aGlzLmdldFBsYXllcigpLCB0aGlzKTtcbiAgICAgIGNvbmZpZ3VyZWRDb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbGVhc2VDb250cm9scygpOiB2b2lkIHtcbiAgICAvLyBEbyBub3QgY2FsbCByZWxlYXNlIG1ldGhvZHMgaWYgdGhlIGNvbXBvbmVudHMgaGF2ZSBuZXZlciBiZWVuIGNvbmZpZ3VyZWQ7IHRoaXMgY2FuIHJlc3VsdCBpbiBleGNlcHRpb25zXG4gICAgaWYgKHRoaXMuY29uZmlndXJlZCkge1xuICAgICAgdGhpcy5vblJlbGVhc2UuZGlzcGF0Y2godGhpcy5nZXRVSSgpKTtcbiAgICAgIHRoaXMucmVsZWFzZUNvbnRyb2xzVHJlZSh0aGlzLmdldFVJKCkpO1xuICAgICAgdGhpcy5jb25maWd1cmVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVsZWFzZWQgPSB0cnVlO1xuICB9XG5cbiAgaXNSZWxlYXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWxlYXNlZDtcbiAgfVxuXG4gIHByaXZhdGUgcmVsZWFzZUNvbnRyb2xzVHJlZShjb21wb25lbnQ6IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+KSB7XG4gICAgY29tcG9uZW50LnJlbGVhc2UoKTtcblxuICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBDb250YWluZXIpIHtcbiAgICAgIGZvciAobGV0IGNoaWxkQ29tcG9uZW50IG9mIGNvbXBvbmVudC5nZXRDb21wb25lbnRzKCkpIHtcbiAgICAgICAgdGhpcy5yZWxlYXNlQ29udHJvbHNUcmVlKGNoaWxkQ29tcG9uZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbGVhckV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XG4gICAgc3VwZXIuY2xlYXJFdmVudEhhbmRsZXJzKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBpbnRlcmZhY2Ugb2YgdGhlIHtAbGluayBQbGF5ZXJ9IGZvciB1c2UgaW4gdGhlIFVJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdyYXBwZWRQbGF5ZXIgZXh0ZW5kcyBQbGF5ZXJBUEkge1xuICAvKipcbiAgICogRmlyZXMgYW4gZXZlbnQgb24gdGhlIHBsYXllciB0aGF0IHRhcmdldHMgYWxsIGhhbmRsZXJzIGluIHRoZSBVSSBidXQgbmV2ZXIgZW50ZXJzIHRoZSByZWFsIHBsYXllci5cbiAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0byBmaXJlXG4gICAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gc2VuZCB3aXRoIHRoZSBldmVudFxuICAgKi9cbiAgZmlyZUV2ZW50SW5VSShldmVudDogUGxheWVyRXZlbnQsIGRhdGE6IHt9KTogdm9pZDtcbn1cblxuLyoqXG4gKiBXcmFwcyB0aGUgcGxheWVyIHRvIHRyYWNrIGV2ZW50IGhhbmRsZXJzIGFuZCBwcm92aWRlIGEgc2ltcGxlIG1ldGhvZCB0byByZW1vdmUgYWxsIHJlZ2lzdGVyZWQgZXZlbnRcbiAqIGhhbmRsZXJzIGZyb20gdGhlIHBsYXllci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsYXllcldyYXBwZXIge1xuXG4gIHByaXZhdGUgcGxheWVyOiBQbGF5ZXJBUEk7XG4gIHByaXZhdGUgd3JhcHBlcjogV3JhcHBlZFBsYXllcjtcblxuICBwcml2YXRlIGV2ZW50SGFuZGxlcnM6IHsgW2V2ZW50VHlwZTogc3RyaW5nXTogUGxheWVyRXZlbnRDYWxsYmFja1tdOyB9ID0ge307XG5cbiAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXJBUEkpIHtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgIC8vIENvbGxlY3QgYWxsIG1lbWJlcnMgb2YgdGhlIHBsYXllciAocHVibGljIEFQSSBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBwbGF5ZXIpXG4gICAgY29uc3Qgb2JqZWN0UHJvdG9Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT2JqZWN0LmdldFByb3RvdHlwZU9mKHt9KSk7XG4gICAgY29uc3QgbmFtZXNUb0lnbm9yZSA9IFsnY29uc3RydWN0b3InLCAuLi5vYmplY3RQcm90b1Byb3BlcnR5TmFtZXNdO1xuICAgIGNvbnN0IG1lbWJlcnMgPSBnZXRBbGxQcm9wZXJ0eU5hbWVzKHBsYXllcikuZmlsdGVyKG5hbWUgPT4gbmFtZXNUb0lnbm9yZS5pbmRleE9mKG5hbWUpID09PSAtMSk7XG4gICAgLy8gU3BsaXQgdGhlIG1lbWJlcnMgaW50byBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzXG4gICAgbGV0IG1ldGhvZHMgPSA8YW55W10+W107XG4gICAgbGV0IHByb3BlcnRpZXMgPSA8YW55W10+W107XG5cbiAgICBmb3IgKGxldCBtZW1iZXIgb2YgbWVtYmVycykge1xuICAgICAgaWYgKHR5cGVvZiAoPGFueT5wbGF5ZXIpW21lbWJlcl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbWV0aG9kcy5wdXNoKG1lbWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wZXJ0aWVzLnB1c2gobWVtYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgd3JhcHBlciBvYmplY3RcbiAgICBsZXQgd3JhcHBlciA9IDxhbnk+e307XG5cbiAgICAvLyBBZGQgZnVuY3Rpb24gd3JhcHBlcnMgZm9yIGFsbCBBUEkgbWV0aG9kcyB0aGF0IGRvIG5vdGhpbmcgYnV0IGNhbGxpbmcgdGhlIGJhc2UgbWV0aG9kIG9uIHRoZSBwbGF5ZXJcbiAgICBmb3IgKGxldCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgICAgd3JhcHBlclttZXRob2RdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWxsZWQgJyArIG1lbWJlcik7IC8vIHRyYWNrIG1ldGhvZCBjYWxscyBvbiB0aGUgcGxheWVyXG4gICAgICAgIHJldHVybiAoPGFueT5wbGF5ZXIpW21ldGhvZF0uYXBwbHkocGxheWVyLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgYWxsIHB1YmxpYyBwcm9wZXJ0aWVzIG9mIHRoZSBwbGF5ZXIgdG8gdGhlIHdyYXBwZXJcbiAgICBmb3IgKGxldCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBHZXQgYW4gZXZlbnR1YWxseSBleGlzdGluZyBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBwbGFpbiBwcm9wZXJ0aWVzIGFuZCBwcm9wZXJ0aWVzIHdpdGhcbiAgICAgIC8vIGdldHRlcnMvc2V0dGVycy5cbiAgICAgIGNvbnN0IHByb3BlcnR5RGVzY3JpcHRvciA9ICgodGFyZ2V0OiBQbGF5ZXJBUEkpID0+IHtcbiAgICAgICAgd2hpbGUgKHRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSk7XG4gICAgICAgICAgaWYgKHByb3BlcnR5RGVzY3JpcHRvcikge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIFByb3BlcnR5RGVzY3JpcHRvciBleGlzdHMgb24gYSBjaGlsZCBwcm90b3R5cGUgaW4gY2FzZSB3ZSBoYXZlIGFuIGluaGVyaXRhbmNlIG9mIHRoZSBwbGF5ZXJcbiAgICAgICAgICB0YXJnZXQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSkocGxheWVyKTtcblxuICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IGhhcyBnZXR0ZXJzL3NldHRlcnMsIHdyYXAgdGhlbSBhY2NvcmRpbmdseS4uLlxuICAgICAgaWYgKHByb3BlcnR5RGVzY3JpcHRvciAmJiAocHJvcGVydHlEZXNjcmlwdG9yLmdldCB8fCBwcm9wZXJ0eURlc2NyaXB0b3Iuc2V0KSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcHBlciwgcHJvcGVydHksIHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHByb3BlcnR5RGVzY3JpcHRvci5nZXQuY2FsbChwbGF5ZXIpLFxuICAgICAgICAgIHNldDogKHZhbHVlOiBhbnkpID0+IHByb3BlcnR5RGVzY3JpcHRvci5zZXQuY2FsbChwbGF5ZXIsIHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyAuLi4gZWxzZSBqdXN0IHRyYW5zZmVyIHRoZSBwcm9wZXJ0eSB0byB0aGUgd3JhcHBlclxuICAgICAgZWxzZSB7XG4gICAgICAgIHdyYXBwZXJbcHJvcGVydHldID0gKDxhbnk+cGxheWVyKVtwcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXhwbGljaXRseSBhZGQgYSB3cmFwcGVyIG1ldGhvZCBmb3IgJ29uJyB0aGF0IGFkZHMgYWRkZWQgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIGV2ZW50IGxpc3RcbiAgICB3cmFwcGVyLm9uID0gKGV2ZW50VHlwZTogUGxheWVyRXZlbnQsIGNhbGxiYWNrOiBQbGF5ZXJFdmVudENhbGxiYWNrKSA9PiB7XG4gICAgICBwbGF5ZXIub24oZXZlbnRUeXBlLCBjYWxsYmFjayk7XG5cbiAgICAgIGlmICghdGhpcy5ldmVudEhhbmRsZXJzW2V2ZW50VHlwZV0pIHtcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzW2V2ZW50VHlwZV0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5ldmVudEhhbmRsZXJzW2V2ZW50VHlwZV0ucHVzaChjYWxsYmFjayk7XG5cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH07XG5cbiAgICAvLyBFeHBsaWNpdGx5IGFkZCBhIHdyYXBwZXIgbWV0aG9kIGZvciAnb2ZmJyB0aGF0IHJlbW92ZXMgcmVtb3ZlZCBldmVudCBoYW5kbGVycyBmcm9tIHRoZSBldmVudCBsaXN0XG4gICAgd3JhcHBlci5vZmYgPSAoZXZlbnRUeXBlOiBQbGF5ZXJFdmVudCwgY2FsbGJhY2s6IFBsYXllckV2ZW50Q2FsbGJhY2spID0+IHtcbiAgICAgIHBsYXllci5vZmYoZXZlbnRUeXBlLCBjYWxsYmFjayk7XG5cbiAgICAgIGlmICh0aGlzLmV2ZW50SGFuZGxlcnNbZXZlbnRUeXBlXSkge1xuICAgICAgICBBcnJheVV0aWxzLnJlbW92ZSh0aGlzLmV2ZW50SGFuZGxlcnNbZXZlbnRUeXBlXSwgY2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9O1xuXG4gICAgd3JhcHBlci5maXJlRXZlbnRJblVJID0gKGV2ZW50OiBQbGF5ZXJFdmVudCwgZGF0YToge30pID0+IHtcbiAgICAgIGlmICh0aGlzLmV2ZW50SGFuZGxlcnNbZXZlbnRdKSB7IC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBoYW5kbGVycyBmb3IgdGhpcyBldmVudCByZWdpc3RlcmVkXG4gICAgICAgIC8vIEV4dGVuZCB0aGUgZGF0YSBvYmplY3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyB0byBjb252ZXJ0IGl0IHRvIGEge0BsaW5rIFBsYXllckV2ZW50QmFzZX0gb2JqZWN0LlxuICAgICAgICBsZXQgcGxheWVyRXZlbnREYXRhID0gPFBsYXllckV2ZW50QmFzZT5PYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIHR5cGU6IGV2ZW50LFxuICAgICAgICAgIC8vIEFkZCBhIG1hcmtlciBwcm9wZXJ0eSBzbyB0aGUgVUkgY2FuIGRldGVjdCBVSS1pbnRlcm5hbCBwbGF5ZXIgZXZlbnRzXG4gICAgICAgICAgdWlTb3VyY2VkOiB0cnVlLFxuICAgICAgICB9LCBkYXRhKTtcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrc1xuICAgICAgICBmb3IgKGxldCBjYWxsYmFjayBvZiB0aGlzLmV2ZW50SGFuZGxlcnNbZXZlbnRdKSB7XG4gICAgICAgICAgY2FsbGJhY2socGxheWVyRXZlbnREYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLndyYXBwZXIgPSA8V3JhcHBlZFBsYXllcj53cmFwcGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB3cmFwcGVkIHBsYXllciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBvbiBwbGFjZSBvZiB0aGUgbm9ybWFsIHBsYXllciBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtXcmFwcGVkUGxheWVyfSBhIHdyYXBwZWQgcGxheWVyXG4gICAqL1xuICBnZXRQbGF5ZXIoKTogV3JhcHBlZFBsYXllciB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIHJlZ2lzdGVyZWQgZXZlbnQgaGFuZGxlcnMgZnJvbSB0aGUgcGxheWVyIHRoYXQgd2VyZSBhZGRlZCB0aHJvdWdoIHRoZSB3cmFwcGVkIHBsYXllci5cbiAgICovXG4gIGNsZWFyRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2FsbCB0aGUgcGxheWVyIEFQSSB0byBjaGVjayBpZiB0aGUgaW5zdGFuY2UgaXMgc3RpbGwgdmFsaWQgb3IgYWxyZWFkeSBkZXN0cm95ZWQuXG4gICAgICAvLyBUaGlzIGNhbiBiZSBhbnkgY2FsbCB0aHJvd2luZyB0aGUgUGxheWVyQVBJTm90QXZhaWxhYmxlRXJyb3Igd2hlbiB0aGUgcGxheWVyIGluc3RhbmNlIGlzIGRlc3Ryb3llZC5cbiAgICAgIHRoaXMucGxheWVyLmdldFNvdXJjZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiB0aGlzLnBsYXllci5leHBvcnRzLlBsYXllckFQSU5vdEF2YWlsYWJsZUVycm9yKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgZGV0ZWN0ZWQgdGhhdCB0aGUgcGxheWVyIGluc3RhbmNlIGlzIGFscmVhZHkgZGVzdHJveWVkLCBzbyB3ZSBjbGVhciB0aGUgZXZlbnQgaGFuZGxlcnMgdG8gYXZvaWRcbiAgICAgICAgLy8gZXZlbnQgaGFuZGxlciB1bnN1YnNjcmlwdGlvbiBhdHRlbXB0cyAod2hpY2ggd291bGQgcmVzdWx0IGluIFBsYXllckFQSU5vdEF2YWlsYWJsZUVycm9yIGVycm9ycykuXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVycyA9IHt9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGV2ZW50VHlwZSBpbiB0aGlzLmV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGNhbGxiYWNrIG9mIHRoaXMuZXZlbnRIYW5kbGVyc1tldmVudFR5cGVdKSB7XG4gICAgICAgIHRoaXMucGxheWVyLm9mZihldmVudFR5cGUgYXMgUGxheWVyRXZlbnQsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWxsUHJvcGVydHlOYW1lcyh0YXJnZXQ6IE9iamVjdCk6IHN0cmluZ1tdIHtcbiAgbGV0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHdoaWxlICh0YXJnZXQpIHtcbiAgICBjb25zdCBuZXdOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCkuZmlsdGVyKG5hbWUgPT4gbmFtZXMuaW5kZXhPZihuYW1lKSA9PT0gLTEpO1xuICAgIG5hbWVzID0gbmFtZXMuY29uY2F0KG5ld05hbWVzKTtcbiAgICAvLyBnbyB1cCBwcm90b3R5cGUgY2hhaW5cbiAgICB0YXJnZXQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KTtcbiAgfVxuXG4gIHJldHVybiBuYW1lcztcbn1cbiIsImltcG9ydCB7Q29tcG9uZW50LCBDb21wb25lbnRDb25maWd9IGZyb20gJy4vY29tcG9uZW50cy9jb21wb25lbnQnO1xuaW1wb3J0IHtDb250YWluZXJ9IGZyb20gJy4vY29tcG9uZW50cy9jb250YWluZXInO1xuXG5leHBvcnQgbmFtZXNwYWNlIFVJVXRpbHMge1xuICBleHBvcnQgaW50ZXJmYWNlIFRyZWVUcmF2ZXJzYWxDYWxsYmFjayB7XG4gICAgKGNvbXBvbmVudDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4sIHBhcmVudD86IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+KTogdm9pZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0cmF2ZXJzZVRyZWUoY29tcG9uZW50OiBDb21wb25lbnQ8Q29tcG9uZW50Q29uZmlnPiwgdmlzaXQ6IFRyZWVUcmF2ZXJzYWxDYWxsYmFjayk6IHZvaWQge1xuICAgIGxldCByZWN1cnNpdmVUcmVlV2Fsa2VyID0gKGNvbXBvbmVudDogQ29tcG9uZW50PENvbXBvbmVudENvbmZpZz4sIHBhcmVudD86IENvbXBvbmVudDxDb21wb25lbnRDb25maWc+KSA9PiB7XG4gICAgICB2aXNpdChjb21wb25lbnQsIHBhcmVudCk7XG5cbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNvbXBvbmVudCBpcyBhIGNvbnRhaW5lciwgdmlzaXQgaXQncyBjaGlsZHJlblxuICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbnRhaW5lcikge1xuICAgICAgICBmb3IgKGxldCBjaGlsZENvbXBvbmVudCBvZiBjb21wb25lbnQuZ2V0Q29tcG9uZW50cygpKSB7XG4gICAgICAgICAgcmVjdXJzaXZlVHJlZVdhbGtlcihjaGlsZENvbXBvbmVudCwgY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXYWxrIGFuZCBjb25maWd1cmUgdGhlIGNvbXBvbmVudCB0cmVlXG4gICAgcmVjdXJzaXZlVHJlZVdhbGtlcihjb21wb25lbnQpO1xuICB9XG5cbiAgLy8gRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL25mcmllbmQvdHMta2V5Y29kZS1lbnVtL2Jsb2IvbWFzdGVyL0tleS5lbnVtLnRzXG4gIGV4cG9ydCBlbnVtIEtleUNvZGUge1xuICAgIExlZnRBcnJvdyA9IDM3LFxuICAgIFVwQXJyb3cgPSAzOCxcbiAgICBSaWdodEFycm93ID0gMzksXG4gICAgRG93bkFycm93ID0gNDAsXG4gICAgU3BhY2UgPSAzMixcbiAgICBFbmQgPSAzNSxcbiAgICBIb21lID0gMzYsXG4gIH1cbn1cbiIsImltcG9ydCB7IEV2ZW50LCBFdmVudERpc3BhdGNoZXIgfSBmcm9tICcuL2V2ZW50ZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBQbGF5ZXJBUEkgfSBmcm9tICdiaXRtb3Zpbi1wbGF5ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZvbHVtZVNldHRpbmdDaGFuZ2VkQXJncyB7XG4gIHZvbHVtZTogbnVtYmVyO1xuICBtdXRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDYW4gYmUgdXNlZCB0byBjZW50cmFsbHkgbWFuYWdlIGFuZCBjb250cm9sIHRoZSB2b2x1bWUgYW5kIG11dGUgc3RhdGUgb2YgdGhlIHBsYXllciBmcm9tIG11bHRpcGxlIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWb2x1bWVDb250cm9sbGVyIHtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpc3N1ZXJOYW1lID0gJ3VpLXZvbHVtZWNvbnRyb2xsZXInO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRzID0ge1xuICAgIG9uQ2hhbmdlZDogbmV3IEV2ZW50RGlzcGF0Y2hlcjxWb2x1bWVDb250cm9sbGVyLCBWb2x1bWVTZXR0aW5nQ2hhbmdlZEFyZ3M+KCksXG4gIH07XG5cbiAgcHJpdmF0ZSBzdG9yZWRWb2x1bWU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBsYXllcjogUGxheWVyQVBJKSB7XG4gICAgdGhpcy5zdG9yZVZvbHVtZSgpO1xuXG4gICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25DaGFuZ2VkRXZlbnQoKTtcbiAgICB9O1xuXG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlNvdXJjZUxvYWRlZCwgaGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlZvbHVtZUNoYW5nZWQsIGhhbmRsZXIpO1xuICAgIHBsYXllci5vbihwbGF5ZXIuZXhwb3J0cy5QbGF5ZXJFdmVudC5NdXRlZCwgaGFuZGxlcik7XG4gICAgcGxheWVyLm9uKHBsYXllci5leHBvcnRzLlBsYXllckV2ZW50LlVubXV0ZWQsIGhhbmRsZXIpO1xuICB9XG5cbiAgc2V0Vm9sdW1lKHZvbHVtZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wbGF5ZXIuc2V0Vm9sdW1lKHZvbHVtZSwgVm9sdW1lQ29udHJvbGxlci5pc3N1ZXJOYW1lKTtcbiAgfVxuXG4gIGdldFZvbHVtZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5nZXRWb2x1bWUoKTtcbiAgfVxuXG4gIHNldE11dGVkKG11dGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKG11dGVkKSB7XG4gICAgICB0aGlzLnBsYXllci5tdXRlKFZvbHVtZUNvbnRyb2xsZXIuaXNzdWVyTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyLnVubXV0ZShWb2x1bWVDb250cm9sbGVyLmlzc3Vlck5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZU11dGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTXV0ZWQoKSB8fCB0aGlzLmdldFZvbHVtZSgpID09PSAwKSB7XG4gICAgICAvLyBVbm11dGluZyBmcm9tIHRoZSBtdXRlIG9yIHplcm8tdm9sdW1lIHN0YXRlIHJlY2FsbHMgdGhlIHByZXZpb3VzbHkgc2F2ZWQgdm9sdW1lIHNldHRpbmcuIFNldHRpbmcgdGhlXG4gICAgICAvLyB2b2x1bWUgYXV0b21hdGljYWxseSB1bm11dGVzIHRoZSBwbGF5ZXIgaW4gdjcuXG4gICAgICB0aGlzLnJlY2FsbFZvbHVtZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldE11dGVkKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGlzTXV0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmlzTXV0ZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZXMgKHNhdmVzKSB0aGUgY3VycmVudCB2b2x1bWUgc28gaXQgY2FuIGxhdGVyIGJlIHJlc3RvcmVkIHdpdGgge0BsaW5rIHJlY2FsbFZvbHVtZX0uXG4gICAqL1xuICBzdG9yZVZvbHVtZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlZFZvbHVtZSA9IHRoaXMuZ2V0Vm9sdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjYWxscyAoc2V0cykgdGhlIHZvbHVtZSBwcmV2aW91c2x5IHN0b3JlZCB3aXRoIHtAbGluayBzdG9yZVZvbHVtZX0uXG4gICAqL1xuICByZWNhbGxWb2x1bWUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRNdXRlZCh0aGlzLnN0b3JlZFZvbHVtZSA9PT0gMCk7XG4gICAgdGhpcy5zZXRWb2x1bWUodGhpcy5zdG9yZWRWb2x1bWUpO1xuICB9XG5cbiAgc3RhcnRUcmFuc2l0aW9uKCk6IFZvbHVtZVRyYW5zaXRpb24ge1xuICAgIHJldHVybiBuZXcgVm9sdW1lVHJhbnNpdGlvbih0aGlzKTtcbiAgfVxuXG4gIG9uQ2hhbmdlZEV2ZW50KCkge1xuICAgIGNvbnN0IHBsYXllck11dGVkID0gdGhpcy5pc011dGVkKCk7XG4gICAgY29uc3QgcGxheWVyVm9sdW1lID0gdGhpcy5nZXRWb2x1bWUoKTtcblxuICAgIGNvbnN0IHVpTXV0ZWQgPSBwbGF5ZXJNdXRlZCB8fCBwbGF5ZXJWb2x1bWUgPT09IDA7XG4gICAgY29uc3QgdWlWb2x1bWUgPSBwbGF5ZXJNdXRlZCA/IDAgOiBwbGF5ZXJWb2x1bWU7XG5cbiAgICB0aGlzLmV2ZW50cy5vbkNoYW5nZWQuZGlzcGF0Y2godGhpcywgeyB2b2x1bWU6IHVpVm9sdW1lLCBtdXRlZDogdWlNdXRlZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBldmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIHZvbHVtZSBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuXG4gICAqL1xuICBnZXQgb25DaGFuZ2VkKCk6IEV2ZW50PFZvbHVtZUNvbnRyb2xsZXIsIFZvbHVtZVNldHRpbmdDaGFuZ2VkQXJncz4ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5vbkNoYW5nZWQuZ2V0RXZlbnQoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVm9sdW1lVHJhbnNpdGlvbiB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb250cm9sbGVyOiBWb2x1bWVDb250cm9sbGVyKSB7XG4gICAgLy8gU3RvcmUgdGhlIHZvbHVtZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgdm9sdW1lIGNoYW5nZSBzbyB3ZSBjYW4gcmVjYWxsIGl0IGxhdGVyIGluIGNhc2Ugd2Ugc2V0IHRoZSB2b2x1bWUgdG9cbiAgICAvLyB6ZXJvIGFuZCBhY3R1YWxseSBtdXRlIHRoZSBwbGF5ZXIuXG4gICAgY29udHJvbGxlci5zdG9yZVZvbHVtZSgpO1xuICB9XG5cbiAgdXBkYXRlKHZvbHVtZTogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgd2hpbGUgdHJhbnNpdGlvbmluZyBzbyB0aGUgdXNlciBoYXMgYSBcImxpdmUgcHJldmlld1wiIG9mIHRoZSBkZXNpcmVkIHRhcmdldCB2b2x1bWVcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2V0TXV0ZWQoZmFsc2UpO1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRWb2x1bWUodm9sdW1lKTtcbiAgfVxuXG4gIGZpbmlzaCh2b2x1bWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh2b2x1bWUgPT09IDApIHtcbiAgICAgIC8vIFdoZW4gdGhlIHZvbHVtZSBpcyB6ZXJvIHdlIGVzc2VudGlhbGx5IG11dGUgdGhlIHZvbHVtZSBzbyB3ZSByZWNhbGwgdGhlIHZvbHVtZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gICAgICAvLyB0cmFuc2l0aW9uIGFuZCBtdXRlIHRoZSBwbGF5ZXIgaW5zdGVhZC4gUmVjYWxsaW5nIGlzIG5lY2Vzc2FyeSB0byByZXR1cm4gdG8gdGhlIGFjdHVhbCBhdWRpbyB2b2x1bWVcbiAgICAgIC8vIHdoZW4gdW5tdXRpbmcuXG4gICAgICAvLyBXZSBtdXN0IGZpcnN0IHJlY2FsbCB0aGUgdm9sdW1lIGFuZCB0aGVuIG11dGUsIGJlY2F1c2UgcmVjYWxsaW5nIHNldHMgdGhlIHZvbHVtZSBvbiB0aGUgcGxheWVyXG4gICAgICAvLyBhbmQgc2V0dGluZyBhIHBsYXllciB2b2x1bWUgPiAwIHVubXV0ZXMgdGhlIHBsYXllciBpbiB2Ny5cbiAgICAgIHRoaXMuY29udHJvbGxlci5yZWNhbGxWb2x1bWUoKTtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRNdXRlZCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldE11dGVkKGZhbHNlKTtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRWb2x1bWUodm9sdW1lKTtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zdG9yZVZvbHVtZSgpO1xuICAgIH1cbiAgfVxufSIsImltcG9ydCB7IFN1YnRpdGxlUmVnaW9uQ29udGFpbmVyLCBTdWJ0aXRsZUxhYmVsIH0gZnJvbSAnLi9jb21wb25lbnRzL3N1YnRpdGxlb3ZlcmxheSc7XG5pbXBvcnQgeyBWVFRQcm9wZXJ0aWVzLCBWVFRSZWdpb25Qcm9wZXJ0aWVzIH0gZnJvbSAnYml0bW92aW4tcGxheWVyL3R5cGVzL3N1YnRpdGxlcy92dHQvQVBJJztcbmltcG9ydCB7IERPTSwgU2l6ZSB9IGZyb20gJy4vZG9tJztcblxuLy8gT3VyIGRlZmF1bHQgaGVpZ2h0IG9mIGEgbGluZVxuY29uc3QgbGluZUhlaWdodCA9IDI4O1xuY29uc3QgZGVmYXVsdExpbmVOdW1iZXIgPSAyMTsgLy8gT3VyIGRlZmF1bHQgYW1vdW50IG9mIGxpbmVzXG5cbmVudW0gRGlyZWN0aW9uIHtcbiAgVG9wID0gJ3RvcCcsXG4gIEJvdHRvbSA9ICdib3R0b20nLFxuICBMZWZ0ID0gJ2xlZnQnLFxuICBSaWdodCA9ICdyaWdodCcsXG59XG5cbmNvbnN0IERpcmVjdGlvblBhaXIgPSBuZXcgTWFwPERpcmVjdGlvbiwgRGlyZWN0aW9uPihbXG4gIFtEaXJlY3Rpb24uVG9wLCBEaXJlY3Rpb24uQm90dG9tXSxcbiAgW0RpcmVjdGlvbi5MZWZ0LCBEaXJlY3Rpb24uUmlnaHRdLFxuICBbRGlyZWN0aW9uLlJpZ2h0LCBEaXJlY3Rpb24uTGVmdF0sXG5dKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBkZWZhdWx0IHN0YW5kYXJkaXplZCBzdHlsZXMgZm9yIHRoZSBDdWUgQm94XG4gKiBodHRwczovL3czLm9yZy9UUi93ZWJ2dHQxLyNhcHBseWluZy1jc3MtcHJvcGVydGllc1xuICovXG5jb25zdCBzZXREZWZhdWx0VnR0U3R5bGVzID0gKGN1ZUNvbnRhaW5lckRvbTogRE9NLCB2dHQ6IFZUVFByb3BlcnRpZXMpID0+IHtcbiAgaWYgKHZ0dC5yZWdpb24pIHtcbiAgICBjdWVDb250YWluZXJEb20uY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ3VuaWNvZGUtYmlkaScsICdwbGFpbnRleHQnKTtcbiAgfSBlbHNlIHtcbiAgICBjdWVDb250YWluZXJEb20uY3NzKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ292ZXJmbG93LXdyYXAnLCAnYnJlYWstd29yZCcpO1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ292ZXJmbG93JywgJ2hpZGRlbicpO1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ2ZsZXgtZmxvdycsICdjb2x1bW4nKTtcbiAgfVxuICBjdWVDb250YWluZXJEb20uY3NzKCdkaXNwbGF5JywgJ2lubGluZS1mbGV4Jyk7XG59O1xuXG4vKipcbiAqIEFsaWduIHRoZSBDdWUgQm94J3MgbGluZVxuICogaHR0cHM6Ly93My5vcmcvVFIvd2VidnR0MS8jd2VidnR0LWN1ZS1saW5lLWFsaWdubWVudFxuICovXG5jb25zdCBzZXRWdHRMaW5lQWxpZ24gPSAoY3VlQ29udGFpbmVyRG9tOiBET00sIHsgbGluZUFsaWduIH06IFZUVFByb3BlcnRpZXMsIGRpcmVjdGlvbjogRGlyZWN0aW9uKSA9PiB7XG4gIHN3aXRjaCAobGluZUFsaWduKSB7XG4gICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoYG1hcmdpbi0ke2RpcmVjdGlvbn1gLCBgJHstbGluZUhlaWdodCAvIDJ9cHhgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZCc6XG4gICAgICBjdWVDb250YWluZXJEb20uY3NzKGBtYXJnaW4tJHtkaXJlY3Rpb259YCwgYCR7LWxpbmVIZWlnaHR9cHhgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBsaW5lIHBvc2l0aW9uaW5nIG9mIHRoZSBDdWUgQm94XG4gKiBodHRwczovL3czLm9yZy9UUi93ZWJ2dHQxLyN3ZWJ2dHQtY3VlLWxpbmVcbiAqL1xuY29uc3Qgc2V0VnR0TGluZSA9IChcbiAgY3VlQ29udGFpbmVyRG9tOiBET00sXG4gIHZ0dDogVlRUUHJvcGVydGllcyxcbiAgZGlyZWN0aW9uOiBEaXJlY3Rpb24sXG4gIHN1YnRpdGxlT3ZlckxheVNpemU6IFNpemUsXG4pID0+IHtcbiAgaWYgKHZ0dC5saW5lID09PSAnYXV0bycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcmVsYXRpdmVMaW5lUG9zaXRpb24gPSBwYXJzZUZsb2F0KHZ0dC5saW5lIGFzIHN0cmluZyk7XG5cbiAgaWYgKHZ0dC5zbmFwVG9MaW5lcykge1xuICAgIGxldCB0YXJnZXRMaW5lID0gTnVtYmVyKHZ0dC5saW5lKTtcbiAgICBpZiAodGFyZ2V0TGluZSA8IDApIHtcbiAgICAgIHRhcmdldExpbmUgPSBkZWZhdWx0TGluZU51bWJlciArIHRhcmdldExpbmU7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZUhlaWdodCA9IHN1YnRpdGxlT3ZlckxheVNpemUuaGVpZ2h0IC8gZGVmYXVsdExpbmVOdW1iZXI7XG4gICAgY29uc3QgYWJzb2x1dGVMaW5lUG9zaXRpb24gPSBsaW5lSGVpZ2h0ICogdGFyZ2V0TGluZTtcbiAgICByZWxhdGl2ZUxpbmVQb3NpdGlvbiA9ICgxMDAgKiBhYnNvbHV0ZUxpbmVQb3NpdGlvbikgLyBzdWJ0aXRsZU92ZXJMYXlTaXplLmhlaWdodDtcbiAgfVxuXG4gIGN1ZUNvbnRhaW5lckRvbS5jc3MoZGlyZWN0aW9uLCBgJHtyZWxhdGl2ZUxpbmVQb3NpdGlvbn0lYCk7XG4gIHNldFZ0dExpbmVBbGlnbihjdWVDb250YWluZXJEb20sIHZ0dCwgZGlyZWN0aW9uKTtcbn07XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgd3JpdGluZyBkaXJlY3Rpb24gb2YgdGhlIEN1ZSBCb3hcbiAqIGh0dHBzOi8vdzMub3JnL1RSL3dlYnZ0dDEvI3dlYnZ0dC1jdWUtd3JpdGluZy1kaXJlY3Rpb25cbiAqL1xuY29uc3Qgc2V0VnR0V3JpdGluZ0RpcmVjdGlvbiA9IChcbiAgY3VlQ29udGFpbmVyRG9tOiBET00sIHZ0dDogVlRUUHJvcGVydGllcyxcbiAgc3VidGl0bGVPdmVybGF5U2l6ZTogU2l6ZSxcbikgPT4ge1xuICBpZiAodnR0LnZlcnRpY2FsID09PSAnJykge1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ3dyaXRpbmctbW9kZScsICdob3Jpem9udGFsLXRiJyk7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcyhEaXJlY3Rpb24uQm90dG9tLCAnMCcpO1xuICAgIHNldFZ0dExpbmUoY3VlQ29udGFpbmVyRG9tLCB2dHQsIERpcmVjdGlvbi5Ub3AsIHN1YnRpdGxlT3ZlcmxheVNpemUpO1xuICB9IGVsc2UgaWYgKHZ0dC52ZXJ0aWNhbCA9PT0gJ2xyJykge1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ3dyaXRpbmctbW9kZScsICd2ZXJ0aWNhbC1scicpO1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoRGlyZWN0aW9uLlJpZ2h0LCAnMCcpO1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoRGlyZWN0aW9uLlRvcCwgJzAnKTtcbiAgICBzZXRWdHRMaW5lKGN1ZUNvbnRhaW5lckRvbSwgdnR0LCBEaXJlY3Rpb24uUmlnaHQsIHN1YnRpdGxlT3ZlcmxheVNpemUpO1xuICB9IGVsc2UgaWYgKHZ0dC52ZXJ0aWNhbCA9PT0gJ3JsJykge1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ3dyaXRpbmctbW9kZScsICd2ZXJ0aWNhbC1ybCcpO1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoRGlyZWN0aW9uLkxlZnQsICcwJyk7XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcyhEaXJlY3Rpb24uVG9wLCAnMCcpO1xuICAgIHNldFZ0dExpbmUoY3VlQ29udGFpbmVyRG9tLCB2dHQsIERpcmVjdGlvbi5MZWZ0LCBzdWJ0aXRsZU92ZXJsYXlTaXplKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBDdWUgcG9zaXRpb24gYWxpZ25tZW50XG4gKiBodHRwczovL3czLm9yZy9UUi93ZWJ2dHQxLyN3ZWJ2dHQtY3VlLXBvc2l0aW9uLWFsaWdubWVudFxuICovXG5jb25zdCBzZXRWdHRQb3NpdGlvbkFsaWduID0gKGN1ZUNvbnRhaW5lckRvbTogRE9NLCB2dHQ6IFZUVFByb3BlcnRpZXMsIGRpcmVjdGlvbjogRGlyZWN0aW9uKSA9PiB7XG4gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJ2dHQxLyN3ZWJ2dHQtY3VlLXBvc2l0aW9uXG4gIGlmICh2dHQucG9zaXRpb24gPT09ICdhdXRvJykge1xuICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoZGlyZWN0aW9uLCAnMCcpO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAodnR0LnBvc2l0aW9uQWxpZ24pIHtcbiAgICAgIGNhc2UgJ2xpbmUtbGVmdCc6XG4gICAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoZGlyZWN0aW9uLCBgJHt2dHQucG9zaXRpb259JWApO1xuICAgICAgICBjdWVDb250YWluZXJEb20uY3NzKERpcmVjdGlvblBhaXIuZ2V0KGRpcmVjdGlvbiksICdhdXRvJyk7XG4gICAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ2p1c3RpZnktY29udGVudCcsICdmbGV4LXN0YXJ0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgY3VlQ29udGFpbmVyRG9tLmNzcyhkaXJlY3Rpb24sIGAke3Z0dC5wb3NpdGlvbiAtIHZ0dC5zaXplIC8gMn0lYCk7XG4gICAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoRGlyZWN0aW9uUGFpci5nZXQoZGlyZWN0aW9uKSwgJ2F1dG8nKTtcbiAgICAgICAgY3VlQ29udGFpbmVyRG9tLmNzcygnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xpbmUtcmlnaHQnOlxuICAgICAgICBjdWVDb250YWluZXJEb20uY3NzKGRpcmVjdGlvbiwgJ2F1dG8nKTtcbiAgICAgICAgY3VlQ29udGFpbmVyRG9tLmNzcyhEaXJlY3Rpb25QYWlyLmdldChkaXJlY3Rpb24pLCBgJHsxMDAgLSB2dHQucG9zaXRpb259JWApO1xuICAgICAgICBjdWVDb250YWluZXJEb20uY3NzKCdqdXN0aWZ5LWNvbnRlbnQnLCAnZmxleC1lbmQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjdWVDb250YWluZXJEb20uY3NzKGRpcmVjdGlvbiwgYCR7dnR0LnBvc2l0aW9ufSVgKTtcbiAgICAgICAgY3VlQ29udGFpbmVyRG9tLmNzcygnanVzdGlmeS1jb250ZW50JywgJ2ZsZXgtc3RhcnQnKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBuYW1lc3BhY2UgVnR0VXRpbHMge1xuICBleHBvcnQgY29uc3Qgc2V0VnR0Q3VlQm94U3R5bGVzID0gKFxuICAgIGN1ZUNvbnRhaW5lcjogU3VidGl0bGVMYWJlbCxcbiAgICBzdWJ0aXRsZU92ZXJsYXlTaXplOiBTaXplLFxuICApID0+IHtcbiAgICBjb25zdCB2dHQgPSBjdWVDb250YWluZXIudnR0O1xuICAgIGNvbnN0IGN1ZUNvbnRhaW5lckRvbSA9IGN1ZUNvbnRhaW5lci5nZXREb21FbGVtZW50KCk7XG5cbiAgICBzZXREZWZhdWx0VnR0U3R5bGVzKGN1ZUNvbnRhaW5lckRvbSwgdnR0KTtcbiAgICBzZXRWdHRXcml0aW5nRGlyZWN0aW9uKGN1ZUNvbnRhaW5lckRvbSwgdnR0LCBzdWJ0aXRsZU92ZXJsYXlTaXplKTtcblxuICAgIC8vIGh0dHBzOi8vdzMub3JnL1RSL3dlYnZ0dDEvI3dlYnZ0dC1jdWUtdGV4dC1hbGlnbm1lbnRcbiAgICBjb25zdCB0ZXh0QWxpZ24gPSB2dHQuYWxpZ24gPT09ICdtaWRkbGUnID8gJ2NlbnRlcicgOiB2dHQuYWxpZ247XG4gICAgY3VlQ29udGFpbmVyRG9tLmNzcygndGV4dC1hbGlnbicsIHRleHRBbGlnbik7XG5cbiAgICAvLyBodHRwczovL3czLm9yZy9UUi93ZWJ2dHQxLyN3ZWJ2dHQtY3VlLXNpemVcbiAgICBjb25zdCBjb250YWluZXJTaXplID0gdnR0LnNpemU7XG4gICAgaWYgKHZ0dC52ZXJ0aWNhbCA9PT0gJycpIHtcbiAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ3dpZHRoJywgYCR7Y29udGFpbmVyU2l6ZX0lYCk7XG4gICAgICBzZXRWdHRQb3NpdGlvbkFsaWduKGN1ZUNvbnRhaW5lckRvbSwgdnR0LCBEaXJlY3Rpb24uTGVmdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1ZUNvbnRhaW5lckRvbS5jc3MoJ2hlaWdodCcsIGAke2NvbnRhaW5lclNpemV9JWApO1xuICAgICAgc2V0VnR0UG9zaXRpb25BbGlnbihjdWVDb250YWluZXJEb20sIHZ0dCwgRGlyZWN0aW9uLlRvcCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBodHRwczovL3d3dy53My5vcmcvVFIvd2VidnR0MS8jcmVnaW9uc1xuICAgKiAgaHR0cHM6Ly93d3cuc3BlZWNocGFkLmNvbS9jYXB0aW9ucy93ZWJ2dHQjdG9jXzE2XG4gICAqL1xuICBleHBvcnQgY29uc3Qgc2V0VnR0UmVnaW9uU3R5bGVzID0gKFxuICAgIHJlZ2lvbkNvbnRhaW5lcjogU3VidGl0bGVSZWdpb25Db250YWluZXIsXG4gICAgcmVnaW9uOiBWVFRSZWdpb25Qcm9wZXJ0aWVzLFxuICAgIG92ZXJsYXlTaXplOiBTaXplLFxuICApID0+IHtcbiAgICBjb25zdCByZWdpb25Db250YWluZXJEb20gPSByZWdpb25Db250YWluZXIuZ2V0RG9tRWxlbWVudCgpO1xuICAgIGNvbnN0IHJlZ2lvblBvc2l0aW9uWCA9IG92ZXJsYXlTaXplLndpZHRoICogcmVnaW9uLnZpZXdwb3J0QW5jaG9yWCAvIDEwMCAtICgob3ZlcmxheVNpemUud2lkdGggKiByZWdpb24ud2lkdGggLyAxMDApICogcmVnaW9uLnJlZ2lvbkFuY2hvclggLyAxMDApO1xuICAgIGNvbnN0IHJlZ2lvblBvc2l0aW9uWSA9IG92ZXJsYXlTaXplLmhlaWdodCAqIHJlZ2lvbi52aWV3cG9ydEFuY2hvclkgLyAxMDAgLSAoKHJlZ2lvbi5saW5lcyAqIGxpbmVIZWlnaHQpICogcmVnaW9uLnJlZ2lvbkFuY2hvclkgLyAxMDApO1xuICAgIHJlZ2lvbkNvbnRhaW5lckRvbS5jc3MoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgcmVnaW9uQ29udGFpbmVyRG9tLmNzcygnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XG4gICAgcmVnaW9uQ29udGFpbmVyRG9tLmNzcygnd2lkdGgnLCBgJHtyZWdpb24ud2lkdGh9JWApO1xuICAgIHJlZ2lvbkNvbnRhaW5lckRvbS5jc3MoRGlyZWN0aW9uLkxlZnQsIGAke3JlZ2lvblBvc2l0aW9uWH1weGApO1xuICAgIHJlZ2lvbkNvbnRhaW5lckRvbS5jc3MoRGlyZWN0aW9uLlJpZ2h0LCAndW5zZXQnKTtcbiAgICByZWdpb25Db250YWluZXJEb20uY3NzKERpcmVjdGlvbi5Ub3AsIGAke3JlZ2lvblBvc2l0aW9uWX1weGApO1xuICAgIHJlZ2lvbkNvbnRhaW5lckRvbS5jc3MoRGlyZWN0aW9uLkJvdHRvbSwgJ3Vuc2V0Jyk7XG4gICAgcmVnaW9uQ29udGFpbmVyRG9tLmNzcygnaGVpZ2h0JywgYCR7cmVnaW9uLmxpbmVzICogbGluZUhlaWdodH1weGApO1xuICB9O1xufVxuIl19
|