@tsi-developpement/tsi-shared-ui 1.9.10 → 1.9.11

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.
@@ -5,10 +5,11 @@ import timeGridPlugin from '@fullcalendar/timegrid';
5
5
  import listPlugin from '@fullcalendar/list';
6
6
  import { ContextMenuComponent } from './context-menu/context-menu.component';
7
7
  import { Component_Modes, Modes } from '../../enums';
8
+ import { ApiDateTimeFormat } from '../../consts/tsi-consts';
8
9
  import * as i0 from "@angular/core";
9
10
  import * as i1 from "../../services/notification/tsi-notification.service";
10
- import * as i2 from "../../pipes/localize.pipe";
11
- import * as i3 from "@angular/common";
11
+ import * as i2 from "@angular/common";
12
+ import * as i3 from "../../pipes/localize.pipe";
12
13
  import * as i4 from "primeng/calendar";
13
14
  import * as i5 from "primeng/dropdown";
14
15
  import * as i6 from "@fullcalendar/angular";
@@ -17,10 +18,11 @@ export class TsiCalenderComponent {
17
18
  set eventsData(value) {
18
19
  this.mapDataToEvents(value);
19
20
  }
20
- constructor(_changeDetector, _viewContainerRef, _messageService, _localizePipe, renderer) {
21
+ constructor(_changeDetector, _viewContainerRef, _messageService, _datePipe, _localizePipe, renderer) {
21
22
  this._changeDetector = _changeDetector;
22
23
  this._viewContainerRef = _viewContainerRef;
23
24
  this._messageService = _messageService;
25
+ this._datePipe = _datePipe;
24
26
  this._localizePipe = _localizePipe;
25
27
  this.renderer = renderer;
26
28
  this.showInfoButton = false;
@@ -109,7 +111,8 @@ export class TsiCalenderComponent {
109
111
  // { label: 'vue chronologique jour', value: 'timelineDay' },
110
112
  ];
111
113
  }
112
- ngOnInit() { }
114
+ ngOnInit() {
115
+ }
113
116
  ngAfterViewInit() {
114
117
  const iconForCalendar = document.querySelector('.fc-icon-Calendar');
115
118
  if (iconForCalendar) {
@@ -165,9 +168,16 @@ export class TsiCalenderComponent {
165
168
  });
166
169
  }
167
170
  handleDateSelect(selectInfo) {
171
+ if (!this.entityInfo?.calendarStartDateColumn || !this.entityInfo?.calendarEndDateColumn) {
172
+ return;
173
+ }
174
+ const startColumn = this.entityInfo.calendarStartDateColumn;
175
+ const endColumn = this.entityInfo.calendarEndDateColumn;
176
+ let formattedStartDate = this._datePipe.transform(selectInfo.start, ApiDateTimeFormat) ?? '';
168
177
  this.eventClick.emit({
169
178
  mode: Component_Modes.CREATE,
170
- dateDebut: selectInfo.start.toLocaleDateString('fr-FR')
179
+ [startColumn]: formattedStartDate,
180
+ [endColumn]: selectInfo.end
171
181
  });
172
182
  }
173
183
  handleEventClick(clickInfo) {
@@ -289,13 +299,13 @@ export class TsiCalenderComponent {
289
299
  });
290
300
  }
291
301
  }
292
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiCalenderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i1.TsiNotificationService }, { token: i2.LocalizePipe }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
293
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiCalenderComponent, selector: "tsi-calender", inputs: { crudService: "crudService", schema: "schema", eventsData: "eventsData", showInfoButton: "showInfoButton", showDownloadButton: "showDownloadButton", showUploadButton: "showUploadButton", showNoteButton: "showNoteButton", showActionButton: "showActionButton" }, outputs: { eventClick: "eventClick", dateRangeChange: "dateRangeChange" }, viewQueries: [{ propertyName: "contextMenu", first: true, predicate: ContextMenuComponent, descendants: true }, { propertyName: "datePicker", first: true, predicate: ["datePicker"], descendants: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true }], ngImport: i0, template: "<p-calendar #datePicker class=\"hidden-calendar\" (onSelect)=\"navigateToDate($event)\"/>\r\n<full-calendar #calendar [options]='calendarOptions()'>\r\n <ng-template let-arg>\r\n\r\n <i [ngStyle]=\"arg.event.color && arg.event.color !== '' ? {'background-color': arg.event.color} : {}\" >\r\n \r\n {{ arg.event.title }}</i>\r\n </ng-template>\r\n</full-calendar>\r\n<app-context-menu \r\n [showInfoButton]=\"showInfoButton\"\r\n [showUploadButton]=\"showUploadButton\"\r\n [showNoteButton]=\"showNoteButton\"\r\n [showActionButton]=\"showActionButton\"\r\n (actionSelected)=\"handleSelectedAction($event)\">\r\n</app-context-menu>\r\n<ng-template #dropdownTemplate>\r\n <p-dropdown [style]=\"{'width' : '200px','border-radius': '5px'}\" [options]=\"displayModeOptions\" (onChange)=\"onDisplayModeChange($event)\"></p-dropdown>\r\n</ng-template>\r\n", styles: ["::ng-deep .hidden-calendar .p-inputtext{border:none;width:0px;height:0px}::ng-deep .hidden-calendar .p-inputtext:enabled:focus{box-shadow:none}::ng-deep .displayModeOptions{background:#fff;border:none}.attachment-info{margin-left:50px;font-size:12px;color:#080808}.attachment-info i{margin-right:5px}\n"], dependencies: [{ kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i5.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i6.FullCalendarComponent, selector: "full-calendar", inputs: ["options", "deepChangeDetection", "events", "eventSources", "resources"] }, { kind: "component", type: i7.ContextMenuComponent, selector: "app-context-menu", inputs: ["showInfoButton", "showUploadButton", "showNoteButton", "showActionButton"], outputs: ["actionSelected"] }] }); }
302
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiCalenderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i1.TsiNotificationService }, { token: i2.DatePipe }, { token: i3.LocalizePipe }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
303
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiCalenderComponent, selector: "tsi-calender", inputs: { crudService: "crudService", schema: "schema", eventsData: "eventsData", showInfoButton: "showInfoButton", showDownloadButton: "showDownloadButton", showUploadButton: "showUploadButton", showNoteButton: "showNoteButton", showActionButton: "showActionButton", entityInfo: "entityInfo" }, outputs: { eventClick: "eventClick", dateRangeChange: "dateRangeChange" }, viewQueries: [{ propertyName: "contextMenu", first: true, predicate: ContextMenuComponent, descendants: true }, { propertyName: "datePicker", first: true, predicate: ["datePicker"], descendants: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true }], ngImport: i0, template: "<p-calendar #datePicker class=\"hidden-calendar\" (onSelect)=\"navigateToDate($event)\"/>\r\n<full-calendar #calendar [options]='calendarOptions()'>\r\n <ng-template let-arg>\r\n\r\n <i [ngStyle]=\"arg.event.color && arg.event.color !== '' ? {'background-color': arg.event.color} : {}\" >\r\n \r\n {{ arg.event.title }}</i>\r\n </ng-template>\r\n</full-calendar>\r\n<app-context-menu \r\n [showInfoButton]=\"showInfoButton\"\r\n [showUploadButton]=\"showUploadButton\"\r\n [showNoteButton]=\"showNoteButton\"\r\n [showActionButton]=\"showActionButton\"\r\n (actionSelected)=\"handleSelectedAction($event)\">\r\n</app-context-menu>\r\n<ng-template #dropdownTemplate>\r\n <p-dropdown [style]=\"{'width' : '200px','border-radius': '5px'}\" [options]=\"displayModeOptions\" (onChange)=\"onDisplayModeChange($event)\"></p-dropdown>\r\n</ng-template>\r\n", styles: ["::ng-deep .hidden-calendar .p-inputtext{border:none;width:0px;height:0px}::ng-deep .hidden-calendar .p-inputtext:enabled:focus{box-shadow:none}::ng-deep .displayModeOptions{background:#fff;border:none}.attachment-info{margin-left:50px;font-size:12px;color:#080808}.attachment-info i{margin-right:5px}\n"], dependencies: [{ kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i5.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i6.FullCalendarComponent, selector: "full-calendar", inputs: ["options", "deepChangeDetection", "events", "eventSources", "resources"] }, { kind: "component", type: i7.ContextMenuComponent, selector: "app-context-menu", inputs: ["showInfoButton", "showUploadButton", "showNoteButton", "showActionButton"], outputs: ["actionSelected"] }] }); }
294
304
  }
295
305
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiCalenderComponent, decorators: [{
296
306
  type: Component,
297
307
  args: [{ selector: 'tsi-calender', template: "<p-calendar #datePicker class=\"hidden-calendar\" (onSelect)=\"navigateToDate($event)\"/>\r\n<full-calendar #calendar [options]='calendarOptions()'>\r\n <ng-template let-arg>\r\n\r\n <i [ngStyle]=\"arg.event.color && arg.event.color !== '' ? {'background-color': arg.event.color} : {}\" >\r\n \r\n {{ arg.event.title }}</i>\r\n </ng-template>\r\n</full-calendar>\r\n<app-context-menu \r\n [showInfoButton]=\"showInfoButton\"\r\n [showUploadButton]=\"showUploadButton\"\r\n [showNoteButton]=\"showNoteButton\"\r\n [showActionButton]=\"showActionButton\"\r\n (actionSelected)=\"handleSelectedAction($event)\">\r\n</app-context-menu>\r\n<ng-template #dropdownTemplate>\r\n <p-dropdown [style]=\"{'width' : '200px','border-radius': '5px'}\" [options]=\"displayModeOptions\" (onChange)=\"onDisplayModeChange($event)\"></p-dropdown>\r\n</ng-template>\r\n", styles: ["::ng-deep .hidden-calendar .p-inputtext{border:none;width:0px;height:0px}::ng-deep .hidden-calendar .p-inputtext:enabled:focus{box-shadow:none}::ng-deep .displayModeOptions{background:#fff;border:none}.attachment-info{margin-left:50px;font-size:12px;color:#080808}.attachment-info i{margin-right:5px}\n"] }]
298
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ViewContainerRef }, { type: i1.TsiNotificationService }, { type: i2.LocalizePipe }, { type: i0.Renderer2 }], propDecorators: { contextMenu: [{
308
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ViewContainerRef }, { type: i1.TsiNotificationService }, { type: i2.DatePipe }, { type: i3.LocalizePipe }, { type: i0.Renderer2 }], propDecorators: { contextMenu: [{
299
309
  type: ViewChild,
300
310
  args: [ContextMenuComponent]
301
311
  }], datePicker: [{
@@ -327,5 +337,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
327
337
  type: Output
328
338
  }], dateRangeChange: [{
329
339
  type: Output
340
+ }], entityInfo: [{
341
+ type: Input
330
342
  }] } });
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWNhbGVuZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2ktY2FsZW5kZXIvdHNpLWNhbGVuZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2ktY2FsZW5kZXIvdHNpLWNhbGVuZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLE1BQU0sRUFBZSxTQUFTLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBRzlLLE9BQU8saUJBQXlDLE1BQU0sMkJBQTJCLENBQUM7QUFDbEYsT0FBTyxhQUFhLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxjQUFjLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxVQUFVLE1BQU0sb0JBQW9CLENBQUM7QUFFNUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7Ozs7OztBQVdyRCxNQUFNLE9BQU8sb0JBQW9CO0lBVS9CLElBQWEsVUFBVSxDQUFDLEtBQVk7UUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBWUQsWUFDVSxlQUFrQyxFQUNsQyxpQkFBbUMsRUFDbkMsZUFBdUMsRUFDdkMsYUFBMkIsRUFDM0IsUUFBbUI7UUFKbkIsb0JBQWUsR0FBZixlQUFlLENBQW1CO1FBQ2xDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDbkMsb0JBQWUsR0FBZixlQUFlLENBQXdCO1FBQ3ZD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QUFDLENBQUMsQ0FBQztnQkFDbkcsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM5RixDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQzsrR0EzVFUsb0JBQW9CO21HQUFwQixvQkFBb0IsMGJBR3BCLG9CQUFvQix5VUN2QmpDLGszQkFtQkE7OzRGRENhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxjQUFjOzZNQU9TLFdBQVc7c0JBQTNDLFNBQVM7dUJBQUMsb0JBQW9CO2dCQUNOLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDQSxRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ1UsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFFcEIsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ08sVUFBVTtzQkFBdEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiwgc2lnbmFsLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENhbGVuZGFyQXBpLCBDYWxlbmRhck9wdGlvbnMsIERhdGVTZWxlY3RBcmcsIEV2ZW50QXBpLCBFdmVudENsaWNrQXJnLCBFdmVudElucHV0IH0gZnJvbSAnQGZ1bGxjYWxlbmRhci9jb3JlJztcclxuaW1wb3J0ICogYXMgcHJpbWVOZyBmcm9tICdwcmltZW5nL2NhbGVuZGFyJztcclxuaW1wb3J0IGludGVyYWN0aW9uUGx1Z2luLCB7IEV2ZW50UmVzaXplRG9uZUFyZyB9IGZyb20gJ0BmdWxsY2FsZW5kYXIvaW50ZXJhY3Rpb24nO1xyXG5pbXBvcnQgZGF5R3JpZFBsdWdpbiBmcm9tICdAZnVsbGNhbGVuZGFyL2RheWdyaWQnO1xyXG5pbXBvcnQgdGltZUdyaWRQbHVnaW4gZnJvbSAnQGZ1bGxjYWxlbmRhci90aW1lZ3JpZCc7XHJcbmltcG9ydCBsaXN0UGx1Z2luIGZyb20gJ0BmdWxsY2FsZW5kYXIvbGlzdCc7XHJcbmltcG9ydCB7IEZ1bGxDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJ0BmdWxsY2FsZW5kYXIvYW5ndWxhcic7XHJcbmltcG9ydCB7IENvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9jb250ZXh0LW1lbnUvY29udGV4dC1tZW51LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbXBvbmVudF9Nb2RlcywgTW9kZXMgfSBmcm9tICcuLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2xvY2FsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBDcnVkQmFzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9iYXNlL2NydWQtYmFzZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFdmVudFNjaGVtYSB9IGZyb20gJy4uLy4uL21vZGVscy9jb21tb24vZXZlbnQtc2NoZW1hJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHNpLWNhbGVuZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHNpLWNhbGVuZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktY2FsZW5kZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpQ2FsZW5kZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG5cclxuICBjdXJyZW50Q29udGV4dE1lbnVFdmVudDogYW55O1xyXG4gIEBWaWV3Q2hpbGQoQ29udGV4dE1lbnVDb21wb25lbnQpIGNvbnRleHRNZW51OiBDb250ZXh0TWVudUNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuICBAVmlld0NoaWxkKCdkYXRlUGlja2VyJykgZGF0ZVBpY2tlcjogcHJpbWVOZy5DYWxlbmRhciB8IHVuZGVmaW5lZDtcclxuICBAVmlld0NoaWxkKCdjYWxlbmRhcicpIGNhbGVuZGFyOiBGdWxsQ2FsZW5kYXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcbiAgQFZpZXdDaGlsZCgnZHJvcGRvd25UZW1wbGF0ZScpIGRyb3Bkb3duVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBJbnB1dCgpIGNydWRTZXJ2aWNlPzogQ3J1ZEJhc2VTZXJ2aWNlPGFueSwgYW55LCBhbnksIGFueT47XHJcbiAgQElucHV0KCkgc2NoZW1hOiBFdmVudFNjaGVtYSB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBzZXQgZXZlbnRzRGF0YSh2YWx1ZTogYW55W10pIHtcclxuICAgIHRoaXMubWFwRGF0YVRvRXZlbnRzKHZhbHVlKTtcclxuICB9XHJcbiAgQElucHV0KCkgc2hvd0luZm9CdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93RG93bmxvYWRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93VXBsb2FkQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd05vdGVCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93QWN0aW9uQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBldmVudENsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBkYXRlUmFuZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGRpc3BsYXlNb2RlT3B0aW9uczogYW55W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZVNlcnZpY2U6IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9sb2NhbGl6ZVBpcGU6IExvY2FsaXplUGlwZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxyXG4gICkge1xyXG4gICAgdGhpcy5kaXNwbGF5TW9kZU9wdGlvbnMgPSBbXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMuX2xvY2FsaXplUGlwZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfY2FsZW5kZXJfZGF5R3JpZE1vbnRoJyksIHZhbHVlOiAnZGF5R3JpZE1vbnRoJyB9LFxyXG4gICAgICB7IGxhYmVsOiB0aGlzLl9sb2NhbGl6ZVBpcGUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2NhbGVuZGVyX2RheUdyaWRXZWVrJyksIHZhbHVlOiAnZGF5R3JpZFdlZWsnIH0sXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMuX2xvY2FsaXplUGlwZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfY2FsZW5kZXJfZGF5R3JpZERheScpLCB2YWx1ZTogJ2RheUdyaWREYXknIH0sXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMuX2xvY2FsaXplUGlwZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfY2FsZW5kZXJfdGltZUdyaWREYXknKSwgdmFsdWU6ICd0aW1lR3JpZERheScgfSxcclxuICAgICAgeyBsYWJlbDogdGhpcy5fbG9jYWxpemVQaXBlLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9jYWxlbmRlcl90aW1lR3JpZFdlZWsnKSwgdmFsdWU6ICd0aW1lR3JpZFdlZWsnIH0sXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMuX2xvY2FsaXplUGlwZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfY2FsZW5kZXJfbGlzdFllYXInKSwgdmFsdWU6ICdsaXN0WWVhcicgfSxcclxuICAgICAgeyBsYWJlbDogdGhpcy5fbG9jYWxpemVQaXBlLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9jYWxlbmRlcl9saXN0TW9udGgnKSwgdmFsdWU6ICdsaXN0TW9udGgnIH0sXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMuX2xvY2FsaXplUGlwZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfY2FsZW5kZXJfbGlzdFdlZWsnKSwgdmFsdWU6ICdsaXN0V2VlaycgfSxcclxuICAgICAgeyBsYWJlbDogdGhpcy5fbG9jYWxpemVQaXBlLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9jYWxlbmRlcl9saXN0RGF5JyksIHZhbHVlOiAnbGlzdERheScgfSxcclxuICAgICAgLy9wcmVtaXVtXHJcbiAgICAgIC8vIHsgbGFiZWw6ICd2dWUgY2hyb25vbG9naXF1ZSBhbm7DqWUnLCB2YWx1ZTogJ3RpbWVsaW5lWWVhcicgfSxcclxuICAgICAgLy8geyBsYWJlbDogJ3Z1ZSBjaHJvbm9sb2dpcXVlIG1vaXMnLCB2YWx1ZTogJ3RpbWVsaW5lTW9udGgnIH0sXHJcbiAgICAgIC8vIHsgbGFiZWw6ICd2dWUgY2hyb25vbG9naXF1ZSBzZW1haW5lJywgdmFsdWU6ICd0aW1lbGluZVdlZWsnIH0sXHJcbiAgICAgIC8vIHsgbGFiZWw6ICd2dWUgY2hyb25vbG9naXF1ZSBqb3VyJywgdmFsdWU6ICd0aW1lbGluZURheScgfSxcclxuICAgIF1cclxuXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHsgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBjb25zdCBpY29uRm9yQ2FsZW5kYXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmMtaWNvbi1DYWxlbmRhcicpO1xyXG4gICAgaWYgKGljb25Gb3JDYWxlbmRhcikge1xyXG4gICAgICBpY29uRm9yQ2FsZW5kYXIuY2xhc3NMaXN0LnZhbHVlID0gXCJwaSBwaS1jYWxlbmRhclwiXHJcbiAgICB9XHJcbiAgICBjb25zdCBpY29uRm9yU2VhcmNoRmlsdGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZjLWljb24tU2VhcmNoRmlsdGVyJyk7XHJcbiAgICBpZiAoaWNvbkZvclNlYXJjaEZpbHRlcikge1xyXG4gICAgICBpY29uRm9yU2VhcmNoRmlsdGVyLmNsYXNzTGlzdC52YWx1ZSA9IFwicGkgcGktc2VhcmNoXCJcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkcm9wZG93bkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmMtZGlzcGxheU1vZGVPcHRpb25zLWJ1dHRvbicpO1xyXG4gICAgaWYgKGRyb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICBkcm9wZG93bkVsZW1lbnQuaW5uZXJIVE1MID0gJyc7IC8vIENsZWFyIGFueSBkZWZhdWx0IGNvbnRlbnRcclxuICAgICAgLy8gQ3JlYXRlIGFuIGVtYmVkZGVkIHZpZXcgZnJvbSB0aGUgdGVtcGxhdGVcclxuICAgICAgY29uc3QgZW1iZWRkZWRWaWV3ID0gdGhpcy5kcm9wZG93blRlbXBsYXRlIS5jcmVhdGVFbWJlZGRlZFZpZXcobnVsbCk7XHJcbiAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYuaW5zZXJ0KGVtYmVkZGVkVmlldyk7XHJcbiAgICAgIC8vIEFwcGVuZCB0aGUgZHJvcGRvd24gdG8gdGhlIHRvb2xiYXJcclxuICAgICAgZW1iZWRkZWRWaWV3IS5yb290Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRyb3Bkb3duRWxlbWVudCwgbm9kZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkcm9wZG93bkVsZW1lbnQuY2xhc3NMaXN0LnZhbHVlID0gJ2Rpc3BsYXlNb2RlT3B0aW9ucyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYWxlbmRhck9wdGlvbnMgPSBzaWduYWw8Q2FsZW5kYXJPcHRpb25zPih7XHJcbiAgICBwbHVnaW5zOiBbXHJcbiAgICAgIGludGVyYWN0aW9uUGx1Z2luLFxyXG4gICAgICBkYXlHcmlkUGx1Z2luLFxyXG4gICAgICB0aW1lR3JpZFBsdWdpbixcclxuICAgICAgbGlzdFBsdWdpbixcclxuICAgIF0sXHJcbiAgICBoZWFkZXJUb29sYmFyOiB7XHJcbiAgICAgIGxlZnQ6ICdwcmV2WWVhcixwcmV2LGRhdGVQaWNrZXJOYXZpZ2F0b3Isc2VhcmNoRmlsdGVyLG5leHQsbmV4dFllYXIsdG9kYXknLFxyXG4gICAgICBjZW50ZXI6ICd0aXRsZScsXHJcbiAgICAgIHJpZ2h0OiAnZGlzcGxheU1vZGVPcHRpb25zJyxcclxuICAgIH0sXHJcbiAgICBidXR0b25UZXh0OiB7XHJcbiAgICAgIHRvZGF5OiBcIkF1am91cmQnaHVpXCIsXHJcbiAgICB9LFxyXG4gICAgY3VzdG9tQnV0dG9uczoge1xyXG4gICAgICBkYXRlUGlja2VyTmF2aWdhdG9yOiB7XHJcbiAgICAgICAgaWNvbjogXCJDYWxlbmRhclwiLFxyXG4gICAgICAgIGhpbnQ6IFwiXCIsXHJcbiAgICAgICAgY2xpY2s6IHRoaXMuaGFuZGxlRGF0ZVBpY2tlck5hdmlnYXRvckNsaWNrLmJpbmQodGhpcylcclxuICAgICAgfSxcclxuICAgICAgc2VhcmNoRmlsdGVyOiB7XHJcbiAgICAgICAgaWNvbjogXCJTZWFyY2hGaWx0ZXJcIixcclxuICAgICAgICBoaW50OiBcIlwiLFxyXG4gICAgICAgIGNsaWNrOiB0aGlzLmhhbmRsZVNlYXJjaEZpbHRlci5iaW5kKHRoaXMpXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgaW5pdGlhbFZpZXc6ICdkYXlHcmlkTW9udGgnLFxyXG4gICAgbG9jYWxlOiBcImZyXCIsXHJcbiAgICBldmVudHM6IHRoaXMuZXZlbnRzRGF0YSxcclxuICAgIHdlZWtlbmRzOiB0cnVlLFxyXG4gICAgc2VsZWN0YWJsZTogdHJ1ZSxcclxuICAgIGVkaXRhYmxlOiB0cnVlLFxyXG4gICAgZXZlbnRSZXNpemFibGVGcm9tU3RhcnQ6IHRydWUsXHJcbiAgICBldmVudFN0YXJ0RWRpdGFibGU6IHRydWUsXHJcbiAgICBldmVudER1cmF0aW9uRWRpdGFibGU6IHRydWUsXHJcbiAgICBzZWxlY3RNaXJyb3I6IHRydWUsXHJcbiAgICBkYXlNYXhFdmVudHM6IHRydWUsXHJcbiAgICBzZWxlY3Q6IHRoaXMuaGFuZGxlRGF0ZVNlbGVjdC5iaW5kKHRoaXMpLFxyXG4gICAgZXZlbnRDbGljazogdGhpcy5oYW5kbGVFdmVudENsaWNrLmJpbmQodGhpcyksXHJcbiAgICBldmVudHNTZXQ6IHRoaXMuaGFuZGxlRXZlbnRzLmJpbmQodGhpcyksXHJcbiAgICBldmVudERyb3A6IHRoaXMuaGFuZGxlRXZlbnREcm9wLmJpbmQodGhpcyksXHJcbiAgICBldmVudFJlc2l6ZTogdGhpcy5oYW5kbGVFdmVudFJlc2l6ZS5iaW5kKHRoaXMpLFxyXG4gICAgZXZlbnREaWRNb3VudDogdGhpcy5oYW5kbGVFdmVudERpZE1vdW50LmJpbmQodGhpcyksXHJcbiAgICBkYXRlc1NldDogdGhpcy5nZXRDdXJyZW50RGF0ZXMuYmluZCh0aGlzKSxcclxuICAgIGV2ZW50Q29udGVudDogKGFyZykgPT4ge1xyXG4gICAgICBjb25zdCBub21icmVBdHRhY2hlbWVudCA9IGFyZy5ldmVudC5leHRlbmRlZFByb3BzPy5bJ25vbWJyZUF0dGFjaGVtZW50J10gfHwgMDtcclxuICAgICAgY29uc3QgYXR0YWNobWVudEh0bWwgPSBub21icmVBdHRhY2hlbWVudCA+IDBcclxuICAgICAgICA/IGA8c3BhbiBjbGFzcz1cImF0dGFjaG1lbnQtaW5mb1wiPjxpIGNsYXNzPVwicGkgcGktcGFwZXJjbGlwXCI+PC9pPiBbJHtub21icmVBdHRhY2hlbWVudH1dPC9zcGFuPmBcclxuICAgICAgICA6ICcnO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBodG1sOiBgXHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImV2ZW50LXRpdGxlXCI+JHthcmcuZXZlbnQudGl0bGV9PC9zcGFuPlxyXG4gICAgICAgICAgICAke2F0dGFjaG1lbnRIdG1sfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgYCxcclxuICAgICAgfTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbiAgY3VycmVudEV2ZW50cyA9IHNpZ25hbDxFdmVudEFwaVtdPihbXSk7XHJcblxyXG4gIG1hcERhdGFUb0V2ZW50cyh2YWx1ZTogYW55W10pIHtcclxuICAgIHRoaXMuY2FsZW5kYXJPcHRpb25zLnVwZGF0ZSgob2xkQ2FsZW5kZXJPcHRzOiBDYWxlbmRhck9wdGlvbnMpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnNjaGVtYSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInNjaGVtYSBzaG91bGQgYmUgZGVmaW5lZC5cIilcclxuICAgICAgfVxyXG4gICAgICBsZXQgZXZ0cyA9IHZhbHVlLm1hcChpdGVtID0+IHtcclxuICAgICAgICBsZXQgdGl0bGU6IHN0cmluZyA9IHRoaXMuc2NoZW1hIS50aXRsZVxyXG4gICAgICAgICAgLm1hcCgoY29sdW1uTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9XHJcbiAgICAgICAgICAgICAgY29sdW1uTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGNvbHVtbk5hbWUuc2xpY2UoMSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gKGl0ZW1bcHJvcGVydHlOYW1lXSA/PyBpdGVtW2NvbHVtbk5hbWVdID8/ICcnKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcclxuICAgICAgICAgIC5qb2luKCcgLSAnKTtcclxuICAgICAgICBsZXQgZXZlbnQ6IEV2ZW50SW5wdXQgPSB7XHJcbiAgICAgICAgICBpZDogaXRlbVt0aGlzLnNjaGVtYSEuaWRdLFxyXG4gICAgICAgICAgc3RhcnQ6IGl0ZW1bdGhpcy5zY2hlbWEhLnN0YXJ0XSxcclxuICAgICAgICAgIGVuZDogaXRlbVt0aGlzLnNjaGVtYSEuZW5kXSxcclxuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yLFxyXG4gICAgICAgICAgZXh0ZW5kZWRQcm9wczoge1xyXG4gICAgICAgICAgICBub21icmVBdHRhY2hlbWVudDogaXRlbS5ub21icmVBdHRhY2hlbWVudCxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBldmVudDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBvbGRDYWxlbmRlck9wdHMuZXZlbnRzID0gZXZ0cztcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5vbGRDYWxlbmRlck9wdHMsXHJcbiAgICAgICAgZXZlbnRzOiBldnRzXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZURhdGVTZWxlY3Qoc2VsZWN0SW5mbzogRGF0ZVNlbGVjdEFyZykge1xyXG4gICAgdGhpcy5ldmVudENsaWNrLmVtaXQoe1xyXG4gICAgICBtb2RlOiBDb21wb25lbnRfTW9kZXMuQ1JFQVRFLFxyXG4gICAgICBkYXRlRGVidXQ6IHNlbGVjdEluZm8uc3RhcnQudG9Mb2NhbGVEYXRlU3RyaW5nKCdmci1GUicpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUV2ZW50Q2xpY2soY2xpY2tJbmZvOiBFdmVudENsaWNrQXJnKSB7XHJcbiAgICB0aGlzLmV2ZW50Q2xpY2suZW1pdCh7XHJcbiAgICAgIG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5FRElULFxyXG4gICAgICBpZDogY2xpY2tJbmZvLmV2ZW50LmlkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUV2ZW50cyhldmVudHM6IEV2ZW50QXBpW10pIHtcclxuICAgIHRoaXMuY3VycmVudEV2ZW50cy5zZXQoZXZlbnRzKTtcclxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTsgLy8gd29ya2Fyb3VuZCBmb3IgcHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcclxuICB9XHJcblxyXG4gIGhhbmRsZUV2ZW50UmVzaXplKGluZm86IEV2ZW50UmVzaXplRG9uZUFyZykge1xyXG4gICAgdGhpcy51cGRhdGVFdmVudChpbmZvKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUV2ZW50RHJvcChpbmZvOiBhbnkpIHtcclxuICAgIHRoaXMudXBkYXRlRXZlbnQoaW5mbyk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFdmVudChpbmZvOiBhbnkpIHtcclxuICAgIGNvbnN0IG5ld1N0YXJ0ID0gaW5mby5ldmVudC5zdGFydDtcclxuICAgIGNvbnN0IG5ld0VuZCA9IGluZm8uZXZlbnQuZW5kO1xyXG4gICAgY29uc3QgaWQgPSBpbmZvLmV2ZW50LmlkO1xyXG5cclxuICAgIGlmICh0aGlzLmNydWRTZXJ2aWNlKSB7XHJcbiAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZ2V0QnlJZChpZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICghdGhpcy5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2NoZW1hIHNob3VsZCBiZSBkZWZpbmVkLlwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IGl0ZW0gPSByZXM7XHJcbiAgICAgICAgICBpdGVtW3RoaXMuc2NoZW1hIS5zdGFydF0gPSBuZXdTdGFydDtcclxuICAgICAgICAgIGl0ZW1bdGhpcy5zY2hlbWEhLmVuZF0gPSBuZXdFbmQgPyBuZXdFbmQgOiBuZXdTdGFydDsgLy8gaWYgaXQncyBvbiB0aGUgc2FtZSBkYXlcclxuICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2U/LnVwZGF0ZShpdGVtLCBpZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKCkgPT4gdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3VjY2VzcyhcInNoYXJlZF9yZXBvcnRpbmdfc3VjY2Vzc191cGRhdGVkXCIpLFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5sb2coZXJyKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmxvZyhcIkNhbiBub3QgdXBkYXRlIGl0ZW0gOlwiLCBlcnIpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVEYXRlUGlja2VyTmF2aWdhdG9yQ2xpY2soZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlcikge1xyXG4gICAgICBsZXQgY2FsZW5kYXJJbnB1dCA9IHRoaXMuZGF0ZVBpY2tlci5pbnB1dGZpZWxkVmlld0NoaWxkPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBjYWxlbmRhcklucHV0LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGhhbmRsZVNlYXJjaEZpbHRlcihldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmV2ZW50Q2xpY2suZW1pdCh7XHJcbiAgICAgIG1vZGU6IFwiU0VBUkNIXCJcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0ZVRvRGF0ZShldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBmdWxsQ2FsZW5kYXIgPSB0aGlzLmNhbGVuZGFyPy5nZXRBcGkoKTtcclxuICAgIGZ1bGxDYWxlbmRhcj8uZ290b0RhdGUoZXZlbnQpO1xyXG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlcikge1xyXG4gICAgICBsZXQgY2FsZW5kYXJJbnB1dCA9IHRoaXMuZGF0ZVBpY2tlci5pbnB1dGZpZWxkVmlld0NoaWxkPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBjYWxlbmRhcklucHV0LmJsdXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUV2ZW50RGlkTW91bnQoYXJnOiBhbnkpIHtcclxuICAgIC8vQXR0YWNoIHJpZ2h0LWNsaWNrIGV2ZW50IHRvIGVhY2ggZXZlbnQgY2VsbFxyXG4gICAgYXJnLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgIC8vUHJldmVudCB0aGUgZGVmYXVsdCBjb250ZXh0IG1lbnUgZnJvbSBhcHBlYXJpbmdcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5jdXJyZW50Q29udGV4dE1lbnVFdmVudCA9IGFyZy5ldmVudDtcclxuICAgICAgdGhpcy5jb250ZXh0TWVudT8ub3Blbk1lbnUoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVNlbGVjdGVkQWN0aW9uKGFjdGlvbjogYW55KTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKGFjdGlvbi5zZWxlY3RlZEFjdGlvbikge1xyXG4gICAgICBjYXNlIE1vZGVzLmRlbGV0ZTpcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29udGV4dE1lbnVFdmVudCkge1xyXG4gICAgICAgICAgdGhpcy5jcnVkU2VydmljZT8uZGVsZXRlKHRoaXMuY3VycmVudENvbnRleHRNZW51RXZlbnQuaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBmdWxsQ2FsZW5kYXIgPSB0aGlzLmNhbGVuZGFyPy5nZXRBcGkoKTtcclxuICAgICAgICAgICAgICBmdWxsQ2FsZW5kYXI/LmdldEV2ZW50QnlJZCh0aGlzLmN1cnJlbnRDb250ZXh0TWVudUV2ZW50LmlkKT8ucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3VjY2VzcyhcInNoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfY2FsZW5kZXJfZGVsZXRlX2l0ZW1fc3VjY2Vzc1wiKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycikgPT4gdGhpcy5fbWVzc2FnZVNlcnZpY2UuZXJyb3IoZXJyLmVycm9yLmVycm9yc1s1NDddID8gXCJzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2NhbGVuZGVyX2RlbGV0ZV9pdGVtX2ZhaWxlZFwiIDogZXJyLmVycm9yLmRldGFpbCksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNb2Rlcy5jb25zdWx0OlxyXG4gICAgICAgIHRoaXMuZXZlbnRDbGljay5lbWl0KHtcclxuICAgICAgICAgIG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5DT05TVUxULFxyXG4gICAgICAgICAgaWQ6IHRoaXMuY3VycmVudENvbnRleHRNZW51RXZlbnQuaWRcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNb2Rlcy5lZGl0OlxyXG4gICAgICAgIHRoaXMuZXZlbnRDbGljay5lbWl0KHtcclxuICAgICAgICAgIG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5FRElULFxyXG4gICAgICAgICAgaWQ6IHRoaXMuY3VycmVudENvbnRleHRNZW51RXZlbnQuaWRcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnaW5mbyc6XHJcbiAgICAgICAgdGhpcy5ldmVudENsaWNrLmVtaXQoeyBtb2RlOiAnaW5mbycsIGlkOiB0aGlzLmN1cnJlbnRDb250ZXh0TWVudUV2ZW50LmlkIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAndXBsb2FkJzpcclxuICAgICAgICB0aGlzLmV2ZW50Q2xpY2suZW1pdCh7IG1vZGU6ICd1cGxvYWQnLCBpZDogdGhpcy5jdXJyZW50Q29udGV4dE1lbnVFdmVudC5pZCB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ25vdGVzJzpcclxuICAgICAgICB0aGlzLmV2ZW50Q2xpY2suZW1pdCh7IG1vZGU6ICdub3RlcycsIGlkOiB0aGlzLmN1cnJlbnRDb250ZXh0TWVudUV2ZW50LmlkIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnQWN0aW9uRVJQJzpcclxuICAgICAgICB0aGlzLmV2ZW50Q2xpY2suZW1pdCh7IG1vZGU6ICdBY3Rpb25FUlAnLCBpZDogdGhpcy5jdXJyZW50Q29udGV4dE1lbnVFdmVudC5pZCB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRpc3BsYXlNb2RlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGNhbGVuZGFyQXBpID0gdGhpcy5jYWxlbmRhcj8uZ2V0QXBpKCk7XHJcbiAgICBjYWxlbmRhckFwaT8uY2hhbmdlVmlldyhldmVudC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXRDdXJyZW50RGF0ZXMoKSB7XHJcbiAgICBpZiAodGhpcy5jYWxlbmRhcikge1xyXG4gICAgICBjb25zdCBjYWxlbmRhckFwaTogQ2FsZW5kYXJBcGkgPSB0aGlzLmNhbGVuZGFyLmdldEFwaSgpO1xyXG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHtcclxuICAgICAgICBzdGFydDogbmV3IERhdGUoY2FsZW5kYXJBcGkudmlldy5jdXJyZW50U3RhcnQuc2V0RGF0ZShjYWxlbmRhckFwaS52aWV3LmN1cnJlbnRTdGFydC5nZXREYXRlKCkgKyAxKSksXHJcbiAgICAgICAgZW5kOiBuZXcgRGF0ZShjYWxlbmRhckFwaS52aWV3LmN1cnJlbnRFbmQuc2V0RGF0ZShjYWxlbmRhckFwaS52aWV3LmN1cnJlbnRFbmQuZ2V0RGF0ZSgpICsgMSkpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8cC1jYWxlbmRhciAjZGF0ZVBpY2tlciBjbGFzcz1cImhpZGRlbi1jYWxlbmRhclwiIChvblNlbGVjdCk9XCJuYXZpZ2F0ZVRvRGF0ZSgkZXZlbnQpXCIvPlxyXG48ZnVsbC1jYWxlbmRhciAjY2FsZW5kYXIgW29wdGlvbnNdPSdjYWxlbmRhck9wdGlvbnMoKSc+XHJcbiAgICA8bmctdGVtcGxhdGUgIGxldC1hcmc+XHJcblxyXG4gICAgPGkgW25nU3R5bGVdPVwiYXJnLmV2ZW50LmNvbG9yICYmIGFyZy5ldmVudC5jb2xvciAhPT0gJycgPyB7J2JhY2tncm91bmQtY29sb3InOiBhcmcuZXZlbnQuY29sb3J9IDoge31cIiA+XHJcbiAgICAgICAgXHJcbiAgICAgICAge3sgYXJnLmV2ZW50LnRpdGxlIH19PC9pPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuPC9mdWxsLWNhbGVuZGFyPlxyXG48YXBwLWNvbnRleHQtbWVudSBcclxuICBbc2hvd0luZm9CdXR0b25dPVwic2hvd0luZm9CdXR0b25cIlxyXG4gIFtzaG93VXBsb2FkQnV0dG9uXT1cInNob3dVcGxvYWRCdXR0b25cIlxyXG4gIFtzaG93Tm90ZUJ1dHRvbl09XCJzaG93Tm90ZUJ1dHRvblwiXHJcbiAgW3Nob3dBY3Rpb25CdXR0b25dPVwic2hvd0FjdGlvbkJ1dHRvblwiXHJcbiAgKGFjdGlvblNlbGVjdGVkKT1cImhhbmRsZVNlbGVjdGVkQWN0aW9uKCRldmVudClcIj5cclxuPC9hcHAtY29udGV4dC1tZW51PlxyXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3duVGVtcGxhdGU+XHJcbiAgICA8cC1kcm9wZG93biBbc3R5bGVdPVwieyd3aWR0aCcgOiAnMjAwcHgnLCdib3JkZXItcmFkaXVzJzogJzVweCd9XCIgW29wdGlvbnNdPVwiZGlzcGxheU1vZGVPcHRpb25zXCIgKG9uQ2hhbmdlKT1cIm9uRGlzcGxheU1vZGVDaGFuZ2UoJGV2ZW50KVwiPjwvcC1kcm9wZG93bj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWNhbGVuZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2ktY2FsZW5kZXIvdHNpLWNhbGVuZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2ktY2FsZW5kZXIvdHNpLWNhbGVuZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLE1BQU0sRUFBZSxTQUFTLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBRzlLLE9BQU8saUJBQXlDLE1BQU0sMkJBQTJCLENBQUM7QUFDbEYsT0FBTyxhQUFhLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxjQUFjLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxVQUFVLE1BQU0sb0JBQW9CLENBQUM7QUFFNUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7OztBQU81RCxNQUFNLE9BQU8sb0JBQW9CO0lBVS9CLElBQWEsVUFBVSxDQUFDLEtBQVk7UUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBWUQsWUFDVSxlQUFrQyxFQUNsQyxpQkFBbUMsRUFDbkMsZUFBdUMsRUFDdkMsU0FBbUIsRUFDbkIsYUFBMkIsRUFDM0IsUUFBbUI7UUFMbkIsb0JBQWUsR0FBZixlQUFlLENBQW1CO1FBQ2xDLHNC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SztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQStCRSxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiwgc2lnbmFsLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENhbGVuZGFyQXBpLCBDYWxlbmRhck9wdGlvbnMsIERhdGVTZWxlY3RBcmcsIEV2ZW50QXBpLCBFdmVudENsaWNrQXJnLCBFdmVudElucHV0IH0gZnJvbSAnQGZ1bGxjYWxlbmRhci9jb3JlJztcclxuaW1wb3J0ICogYXMgcHJpbWVOZyBmcm9tICdwcmltZW5nL2NhbGVuZGFyJztcclxuaW1wb3J0IGludGVyYWN0aW9uUGx1Z2luLCB7IEV2ZW50UmVzaXplRG9uZUFyZyB9IGZyb20gJ0BmdWxsY2FsZW5kYXIvaW50ZXJhY3Rpb24nO1xyXG5pbXBvcnQgZGF5R3JpZFBsdWdpbiBmcm9tICdAZnVsbGNhbGVuZGFyL2RheWdyaWQnO1xyXG5pbXBvcnQgdGltZUdyaWRQbHVnaW4gZnJvbSAnQGZ1bGxjYWxlbmRhci90aW1lZ3JpZCc7XHJcbmltcG9ydCBsaXN0UGx1Z2luIGZyb20gJ0BmdWxsY2FsZW5kYXIvbGlzdCc7XHJcbmltcG9ydCB7IEZ1bGxDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJ0BmdWxsY2FsZW5kYXIvYW5ndWxhcic7XHJcbmltcG9ydCB7IENvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9jb250ZXh0LW1lbnUvY29udGV4dC1tZW51LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbXBvbmVudF9Nb2RlcywgTW9kZXMgfSBmcm9tICcuLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2xvY2FsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBDcnVkQmFzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9iYXNlL2NydWQtYmFzZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFdmVudFNjaGVtYSB9IGZyb20gJy4uLy4uL21vZGVscy9jb21tb24vZXZlbnQtc2NoZW1hJztcclxuaW1wb3J0IHsgRW50aXR5SW5mbyB9IGZyb20gJy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQXBpRGF0ZVRpbWVGb3JtYXQgfSBmcm9tICcuLi8uLi9jb25zdHMvdHNpLWNvbnN0cyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RzaS1jYWxlbmRlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RzaS1jYWxlbmRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHNpLWNhbGVuZGVyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRzaUNhbGVuZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgY3VycmVudENvbnRleHRNZW51RXZlbnQ6IGFueTtcclxuICBAVmlld0NoaWxkKENvbnRleHRNZW51Q29tcG9uZW50KSBjb250ZXh0TWVudTogQ29udGV4dE1lbnVDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcbiAgQFZpZXdDaGlsZCgnZGF0ZVBpY2tlcicpIGRhdGVQaWNrZXI6IHByaW1lTmcuQ2FsZW5kYXIgfCB1bmRlZmluZWQ7XHJcbiAgQFZpZXdDaGlsZCgnY2FsZW5kYXInKSBjYWxlbmRhcjogRnVsbENhbGVuZGFyQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duVGVtcGxhdGUnKSBkcm9wZG93blRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKSBjcnVkU2VydmljZT86IENydWRCYXNlU2VydmljZTxhbnksIGFueSwgYW55LCBhbnk+O1xyXG4gIEBJbnB1dCgpIHNjaGVtYTogRXZlbnRTY2hlbWEgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgc2V0IGV2ZW50c0RhdGEodmFsdWU6IGFueVtdKSB7XHJcbiAgICB0aGlzLm1hcERhdGFUb0V2ZW50cyh2YWx1ZSk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNob3dJbmZvQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0Rvd25sb2FkQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd1VwbG9hZEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dOb3RlQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgZXZlbnRDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZGF0ZVJhbmdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBkaXNwbGF5TW9kZU9wdGlvbnM6IGFueVtdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBUc2lOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZGF0ZVBpcGU6IERhdGVQaXBlLFxyXG4gICAgcHJpdmF0ZSBfbG9jYWxpemVQaXBlOiBMb2NhbGl6ZVBpcGUsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcclxuICApIHtcclxuICAgIHRoaXMuZGlzcGxheU1vZGVPcHRpb25zID0gW1xyXG4gICAgICB7IGxhYmVsOiB0aGlzLl9sb2NhbGl6ZVBpcGUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2NhbGVuZGVyX2RheUdyaWRNb250aCcpLCB2YWx1ZTogJ2RheUdyaWRNb250aCcgfSxcclxuICAgICAgeyBsYWJlbDogdGhpcy5fbG9jYWxpemVQaXBlLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9jYWxlbmRlcl9kYXlHcmlkV2VlaycpLCB2YWx1ZTogJ2RheUdyaWRXZWVrJyB9LFxyXG4gICAgICB7IGxhYmVsOiB0aGlzLl9sb2NhbGl6ZVBpcGUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2NhbGVuZGVyX2RheUdyaWREYXknKSwgdmFsdWU6ICdkYXlHcmlkRGF5JyB9LFxyXG4gICAgICB7IGxhYmVsOiB0aGlzLl9sb2NhbGl6ZVBpcGUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2NhbGVuZGVyX3RpbWVHcmlkRGF5JyksIHZhbHVlOiAndGltZUdyaWREYXknIH0sXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMuX2xvY2FsaXplUGlwZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfY2FsZW5kZXJfdGltZUdyaWRXZWVrJyksIHZhbHVlOiAndGltZUdyaWRXZWVrJyB9LFxyXG4gICAgICB7IGxhYmVsOiB0aGlzLl9sb2NhbGl6ZVBpcGUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2NhbGVuZGVyX2xpc3RZZWFyJyksIHZhbHVlOiAnbGlzdFllYXInIH0sXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMuX2xvY2FsaXplUGlwZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfY2FsZW5kZXJfbGlzdE1vbnRoJyksIHZhbHVlOiAnbGlzdE1vbnRoJyB9LFxyXG4gICAgICB7IGxhYmVsOiB0aGlzLl9sb2NhbGl6ZVBpcGUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2NhbGVuZGVyX2xpc3RXZWVrJyksIHZhbHVlOiAnbGlzdFdlZWsnIH0sXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMuX2xvY2FsaXplUGlwZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfY29tcG9uZW50X2dyaWRfY2FsZW5kZXJfbGlzdERheScpLCB2YWx1ZTogJ2xpc3REYXknIH0sXHJcbiAgICAgIC8vcHJlbWl1bVxyXG4gICAgICAvLyB7IGxhYmVsOiAndnVlIGNocm9ub2xvZ2lxdWUgYW5uw6llJywgdmFsdWU6ICd0aW1lbGluZVllYXInIH0sXHJcbiAgICAgIC8vIHsgbGFiZWw6ICd2dWUgY2hyb25vbG9naXF1ZSBtb2lzJywgdmFsdWU6ICd0aW1lbGluZU1vbnRoJyB9LFxyXG4gICAgICAvLyB7IGxhYmVsOiAndnVlIGNocm9ub2xvZ2lxdWUgc2VtYWluZScsIHZhbHVlOiAndGltZWxpbmVXZWVrJyB9LFxyXG4gICAgICAvLyB7IGxhYmVsOiAndnVlIGNocm9ub2xvZ2lxdWUgam91cicsIHZhbHVlOiAndGltZWxpbmVEYXknIH0sXHJcbiAgICBdXHJcblxyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgZW50aXR5SW5mbz86IEVudGl0eUluZm87XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGNvbnN0IGljb25Gb3JDYWxlbmRhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mYy1pY29uLUNhbGVuZGFyJyk7XHJcbiAgICBpZiAoaWNvbkZvckNhbGVuZGFyKSB7XHJcbiAgICAgIGljb25Gb3JDYWxlbmRhci5jbGFzc0xpc3QudmFsdWUgPSBcInBpIHBpLWNhbGVuZGFyXCJcclxuICAgIH1cclxuICAgIGNvbnN0IGljb25Gb3JTZWFyY2hGaWx0ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmMtaWNvbi1TZWFyY2hGaWx0ZXInKTtcclxuICAgIGlmIChpY29uRm9yU2VhcmNoRmlsdGVyKSB7XHJcbiAgICAgIGljb25Gb3JTZWFyY2hGaWx0ZXIuY2xhc3NMaXN0LnZhbHVlID0gXCJwaSBwaS1zZWFyY2hcIlxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRyb3Bkb3duRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mYy1kaXNwbGF5TW9kZU9wdGlvbnMtYnV0dG9uJyk7XHJcbiAgICBpZiAoZHJvcGRvd25FbGVtZW50KSB7XHJcbiAgICAgIGRyb3Bkb3duRWxlbWVudC5pbm5lckhUTUwgPSAnJzsgLy8gQ2xlYXIgYW55IGRlZmF1bHQgY29udGVudFxyXG4gICAgICAvLyBDcmVhdGUgYW4gZW1iZWRkZWQgdmlldyBmcm9tIHRoZSB0ZW1wbGF0ZVxyXG4gICAgICBjb25zdCBlbWJlZGRlZFZpZXcgPSB0aGlzLmRyb3Bkb3duVGVtcGxhdGUhLmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcclxuICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbnNlcnQoZW1iZWRkZWRWaWV3KTtcclxuICAgICAgLy8gQXBwZW5kIHRoZSBkcm9wZG93biB0byB0aGUgdG9vbGJhclxyXG4gICAgICBlbWJlZGRlZFZpZXchLnJvb3ROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZHJvcGRvd25FbGVtZW50LCBub2RlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGRyb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QudmFsdWUgPSAnZGlzcGxheU1vZGVPcHRpb25zJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGVuZGFyT3B0aW9ucyA9IHNpZ25hbDxDYWxlbmRhck9wdGlvbnM+KHtcclxuICAgIHBsdWdpbnM6IFtcclxuICAgICAgaW50ZXJhY3Rpb25QbHVnaW4sXHJcbiAgICAgIGRheUdyaWRQbHVnaW4sXHJcbiAgICAgIHRpbWVHcmlkUGx1Z2luLFxyXG4gICAgICBsaXN0UGx1Z2luLFxyXG4gICAgXSxcclxuICAgIGhlYWRlclRvb2xiYXI6IHtcclxuICAgICAgbGVmdDogJ3ByZXZZZWFyLHByZXYsZGF0ZVBpY2tlck5hdmlnYXRvcixzZWFyY2hGaWx0ZXIsbmV4dCxuZXh0WWVhcix0b2RheScsXHJcbiAgICAgIGNlbnRlcjogJ3RpdGxlJyxcclxuICAgICAgcmlnaHQ6ICdkaXNwbGF5TW9kZU9wdGlvbnMnLFxyXG4gICAgfSxcclxuICAgIGJ1dHRvblRleHQ6IHtcclxuICAgICAgdG9kYXk6IFwiQXVqb3VyZCdodWlcIixcclxuICAgIH0sXHJcbiAgICBjdXN0b21CdXR0b25zOiB7XHJcbiAgICAgIGRhdGVQaWNrZXJOYXZpZ2F0b3I6IHtcclxuICAgICAgICBpY29uOiBcIkNhbGVuZGFyXCIsXHJcbiAgICAgICAgaGludDogXCJcIixcclxuICAgICAgICBjbGljazogdGhpcy5oYW5kbGVEYXRlUGlja2VyTmF2aWdhdG9yQ2xpY2suYmluZCh0aGlzKVxyXG4gICAgICB9LFxyXG4gICAgICBzZWFyY2hGaWx0ZXI6IHtcclxuICAgICAgICBpY29uOiBcIlNlYXJjaEZpbHRlclwiLFxyXG4gICAgICAgIGhpbnQ6IFwiXCIsXHJcbiAgICAgICAgY2xpY2s6IHRoaXMuaGFuZGxlU2VhcmNoRmlsdGVyLmJpbmQodGhpcylcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBpbml0aWFsVmlldzogJ2RheUdyaWRNb250aCcsXHJcbiAgICBsb2NhbGU6IFwiZnJcIixcclxuICAgIGV2ZW50czogdGhpcy5ldmVudHNEYXRhLFxyXG4gICAgd2Vla2VuZHM6IHRydWUsXHJcbiAgICBzZWxlY3RhYmxlOiB0cnVlLFxyXG4gICAgZWRpdGFibGU6IHRydWUsXHJcbiAgICBldmVudFJlc2l6YWJsZUZyb21TdGFydDogdHJ1ZSxcclxuICAgIGV2ZW50U3RhcnRFZGl0YWJsZTogdHJ1ZSxcclxuICAgIGV2ZW50RHVyYXRpb25FZGl0YWJsZTogdHJ1ZSxcclxuICAgIHNlbGVjdE1pcnJvcjogdHJ1ZSxcclxuICAgIGRheU1heEV2ZW50czogdHJ1ZSxcclxuICAgIHNlbGVjdDogdGhpcy5oYW5kbGVEYXRlU2VsZWN0LmJpbmQodGhpcyksXHJcbiAgICBldmVudENsaWNrOiB0aGlzLmhhbmRsZUV2ZW50Q2xpY2suYmluZCh0aGlzKSxcclxuICAgIGV2ZW50c1NldDogdGhpcy5oYW5kbGVFdmVudHMuYmluZCh0aGlzKSxcclxuICAgIGV2ZW50RHJvcDogdGhpcy5oYW5kbGVFdmVudERyb3AuYmluZCh0aGlzKSxcclxuICAgIGV2ZW50UmVzaXplOiB0aGlzLmhhbmRsZUV2ZW50UmVzaXplLmJpbmQodGhpcyksXHJcbiAgICBldmVudERpZE1vdW50OiB0aGlzLmhhbmRsZUV2ZW50RGlkTW91bnQuYmluZCh0aGlzKSxcclxuICAgIGRhdGVzU2V0OiB0aGlzLmdldEN1cnJlbnREYXRlcy5iaW5kKHRoaXMpLFxyXG4gICAgZXZlbnRDb250ZW50OiAoYXJnKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vbWJyZUF0dGFjaGVtZW50ID0gYXJnLmV2ZW50LmV4dGVuZGVkUHJvcHM/Llsnbm9tYnJlQXR0YWNoZW1lbnQnXSB8fCAwO1xyXG4gICAgICBjb25zdCBhdHRhY2htZW50SHRtbCA9IG5vbWJyZUF0dGFjaGVtZW50ID4gMFxyXG4gICAgICAgID8gYDxzcGFuIGNsYXNzPVwiYXR0YWNobWVudC1pbmZvXCI+PGkgY2xhc3M9XCJwaSBwaS1wYXBlcmNsaXBcIj48L2k+IFske25vbWJyZUF0dGFjaGVtZW50fV08L3NwYW4+YFxyXG4gICAgICAgIDogJyc7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGh0bWw6IGBcclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXZlbnQtdGl0bGVcIj4ke2FyZy5ldmVudC50aXRsZX08L3NwYW4+XHJcbiAgICAgICAgICAgICR7YXR0YWNobWVudEh0bWx9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgLFxyXG4gICAgICB9O1xyXG4gICAgfSxcclxuICB9KTtcclxuICBjdXJyZW50RXZlbnRzID0gc2lnbmFsPEV2ZW50QXBpW10+KFtdKTtcclxuXHJcbiAgbWFwRGF0YVRvRXZlbnRzKHZhbHVlOiBhbnlbXSkge1xyXG4gICAgdGhpcy5jYWxlbmRhck9wdGlvbnMudXBkYXRlKChvbGRDYWxlbmRlck9wdHM6IENhbGVuZGFyT3B0aW9ucykgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2NoZW1hIHNob3VsZCBiZSBkZWZpbmVkLlwiKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCBldnRzID0gdmFsdWUubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgIGxldCB0aXRsZTogc3RyaW5nID0gdGhpcy5zY2hlbWEhLnRpdGxlXHJcbiAgICAgICAgICAubWFwKChjb2x1bW5OYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID1cclxuICAgICAgICAgICAgICBjb2x1bW5OYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgY29sdW1uTmFtZS5zbGljZSgxKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoaXRlbVtwcm9wZXJ0eU5hbWVdID8/IGl0ZW1bY29sdW1uTmFtZV0gPz8gJycpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxyXG4gICAgICAgICAgLmpvaW4oJyAtICcpO1xyXG4gICAgICAgIGxldCBldmVudDogRXZlbnRJbnB1dCA9IHtcclxuICAgICAgICAgIGlkOiBpdGVtW3RoaXMuc2NoZW1hIS5pZF0sXHJcbiAgICAgICAgICBzdGFydDogaXRlbVt0aGlzLnNjaGVtYSEuc3RhcnRdLFxyXG4gICAgICAgICAgZW5kOiBpdGVtW3RoaXMuc2NoZW1hIS5lbmRdLFxyXG4gICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IsXHJcbiAgICAgICAgICBleHRlbmRlZFByb3BzOiB7XHJcbiAgICAgICAgICAgIG5vbWJyZUF0dGFjaGVtZW50OiBpdGVtLm5vbWJyZUF0dGFjaGVtZW50LFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIG9sZENhbGVuZGVyT3B0cy5ldmVudHMgPSBldnRzO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLm9sZENhbGVuZGVyT3B0cyxcclxuICAgICAgICBldmVudHM6IGV2dHNcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuaGFuZGxlRGF0ZVNlbGVjdChzZWxlY3RJbmZvOiBEYXRlU2VsZWN0QXJnKSB7XHJcblxyXG4gIGlmICghdGhpcy5lbnRpdHlJbmZvPy5jYWxlbmRhclN0YXJ0RGF0ZUNvbHVtbiB8fCAhdGhpcy5lbnRpdHlJbmZvPy5jYWxlbmRhckVuZERhdGVDb2x1bW4pIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGNvbnN0IHN0YXJ0Q29sdW1uID0gdGhpcy5lbnRpdHlJbmZvLmNhbGVuZGFyU3RhcnREYXRlQ29sdW1uO1xyXG4gIGNvbnN0IGVuZENvbHVtbiA9IHRoaXMuZW50aXR5SW5mby5jYWxlbmRhckVuZERhdGVDb2x1bW47XHJcbiAgbGV0IGZvcm1hdHRlZFN0YXJ0RGF0ZSA9IHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShzZWxlY3RJbmZvLnN0YXJ0LCBBcGlEYXRlVGltZUZvcm1hdCkgPz8gJyc7XHJcblxyXG4gIHRoaXMuZXZlbnRDbGljay5lbWl0KHtcclxuICAgIG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5DUkVBVEUsXHJcbiAgICBbc3RhcnRDb2x1bW5dOiBmb3JtYXR0ZWRTdGFydERhdGUsXHJcbiAgICBbZW5kQ29sdW1uXTogc2VsZWN0SW5mby5lbmQgXHJcbiAgfSk7XHJcbn1cclxuICBoYW5kbGVFdmVudENsaWNrKGNsaWNrSW5mbzogRXZlbnRDbGlja0FyZykge1xyXG4gICAgdGhpcy5ldmVudENsaWNrLmVtaXQoe1xyXG4gICAgICBtb2RlOiBDb21wb25lbnRfTW9kZXMuRURJVCxcclxuICAgICAgaWQ6IGNsaWNrSW5mby5ldmVudC5pZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFdmVudHMoZXZlbnRzOiBFdmVudEFwaVtdKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRFdmVudHMuc2V0KGV2ZW50cyk7XHJcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7IC8vIHdvcmthcm91bmQgZm9yIHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXHJcbiAgfVxyXG5cclxuICBoYW5kbGVFdmVudFJlc2l6ZShpbmZvOiBFdmVudFJlc2l6ZURvbmVBcmcpIHtcclxuICAgIHRoaXMudXBkYXRlRXZlbnQoaW5mbyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFdmVudERyb3AoaW5mbzogYW55KSB7XHJcbiAgICB0aGlzLnVwZGF0ZUV2ZW50KGluZm8pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRXZlbnQoaW5mbzogYW55KSB7XHJcbiAgICBjb25zdCBuZXdTdGFydCA9IGluZm8uZXZlbnQuc3RhcnQ7XHJcbiAgICBjb25zdCBuZXdFbmQgPSBpbmZvLmV2ZW50LmVuZDtcclxuICAgIGNvbnN0IGlkID0gaW5mby5ldmVudC5pZDtcclxuXHJcbiAgICBpZiAodGhpcy5jcnVkU2VydmljZSkge1xyXG4gICAgICB0aGlzLmNydWRTZXJ2aWNlLmdldEJ5SWQoaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNjaGVtYSBzaG91bGQgYmUgZGVmaW5lZC5cIilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBpdGVtID0gcmVzO1xyXG4gICAgICAgICAgaXRlbVt0aGlzLnNjaGVtYSEuc3RhcnRdID0gbmV3U3RhcnQ7XHJcbiAgICAgICAgICBpdGVtW3RoaXMuc2NoZW1hIS5lbmRdID0gbmV3RW5kID8gbmV3RW5kIDogbmV3U3RhcnQ7IC8vIGlmIGl0J3Mgb24gdGhlIHNhbWUgZGF5XHJcbiAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlPy51cGRhdGUoaXRlbSwgaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MoXCJzaGFyZWRfcmVwb3J0aW5nX3N1Y2Nlc3NfdXBkYXRlZFwiKSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5sb2coXCJDYW4gbm90IHVwZGF0ZSBpdGVtIDpcIiwgZXJyKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRGF0ZVBpY2tlck5hdmlnYXRvckNsaWNrKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRhdGVQaWNrZXIpIHtcclxuICAgICAgbGV0IGNhbGVuZGFySW5wdXQgPSB0aGlzLmRhdGVQaWNrZXIuaW5wdXRmaWVsZFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudDtcclxuICAgICAgY2FsZW5kYXJJbnB1dC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuICBoYW5kbGVTZWFyY2hGaWx0ZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5ldmVudENsaWNrLmVtaXQoe1xyXG4gICAgICBtb2RlOiBcIlNFQVJDSFwiXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVUb0RhdGUoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZnVsbENhbGVuZGFyID0gdGhpcy5jYWxlbmRhcj8uZ2V0QXBpKCk7XHJcbiAgICBmdWxsQ2FsZW5kYXI/LmdvdG9EYXRlKGV2ZW50KTtcclxuICAgIGlmICh0aGlzLmRhdGVQaWNrZXIpIHtcclxuICAgICAgbGV0IGNhbGVuZGFySW5wdXQgPSB0aGlzLmRhdGVQaWNrZXIuaW5wdXRmaWVsZFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudDtcclxuICAgICAgY2FsZW5kYXJJbnB1dC5ibHVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFdmVudERpZE1vdW50KGFyZzogYW55KSB7XHJcbiAgICAvL0F0dGFjaCByaWdodC1jbGljayBldmVudCB0byBlYWNoIGV2ZW50IGNlbGxcclxuICAgIGFyZy5lbC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAvL1ByZXZlbnQgdGhlIGRlZmF1bHQgY29udGV4dCBtZW51IGZyb20gYXBwZWFyaW5nXHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMuY3VycmVudENvbnRleHRNZW51RXZlbnQgPSBhcmcuZXZlbnQ7XHJcbiAgICAgIHRoaXMuY29udGV4dE1lbnU/Lm9wZW5NZW51KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTZWxlY3RlZEFjdGlvbihhY3Rpb246IGFueSk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChhY3Rpb24uc2VsZWN0ZWRBY3Rpb24pIHtcclxuICAgICAgY2FzZSBNb2Rlcy5kZWxldGU6XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENvbnRleHRNZW51RXZlbnQpIHtcclxuICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2U/LmRlbGV0ZSh0aGlzLmN1cnJlbnRDb250ZXh0TWVudUV2ZW50LmlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZnVsbENhbGVuZGFyID0gdGhpcy5jYWxlbmRhcj8uZ2V0QXBpKCk7XHJcbiAgICAgICAgICAgICAgZnVsbENhbGVuZGFyPy5nZXRFdmVudEJ5SWQodGhpcy5jdXJyZW50Q29udGV4dE1lbnVFdmVudC5pZCk/LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MoXCJzaGFyZWRfdHNpX2NvbXBvbmVudF9ncmlkX2NhbGVuZGVyX2RlbGV0ZV9pdGVtX3N1Y2Nlc3NcIilcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVycm9yKGVyci5lcnJvci5lcnJvcnNbNTQ3XSA/IFwic2hhcmVkX3RzaV9jb21wb25lbnRfZ3JpZF9jYWxlbmRlcl9kZWxldGVfaXRlbV9mYWlsZWRcIiA6IGVyci5lcnJvci5kZXRhaWwpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTW9kZXMuY29uc3VsdDpcclxuICAgICAgICB0aGlzLmV2ZW50Q2xpY2suZW1pdCh7XHJcbiAgICAgICAgICBtb2RlOiBDb21wb25lbnRfTW9kZXMuQ09OU1VMVCxcclxuICAgICAgICAgIGlkOiB0aGlzLmN1cnJlbnRDb250ZXh0TWVudUV2ZW50LmlkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTW9kZXMuZWRpdDpcclxuICAgICAgICB0aGlzLmV2ZW50Q2xpY2suZW1pdCh7XHJcbiAgICAgICAgICBtb2RlOiBDb21wb25lbnRfTW9kZXMuRURJVCxcclxuICAgICAgICAgIGlkOiB0aGlzLmN1cnJlbnRDb250ZXh0TWVudUV2ZW50LmlkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2luZm8nOlxyXG4gICAgICAgIHRoaXMuZXZlbnRDbGljay5lbWl0KHsgbW9kZTogJ2luZm8nLCBpZDogdGhpcy5jdXJyZW50Q29udGV4dE1lbnVFdmVudC5pZCB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ3VwbG9hZCc6XHJcbiAgICAgICAgdGhpcy5ldmVudENsaWNrLmVtaXQoeyBtb2RlOiAndXBsb2FkJywgaWQ6IHRoaXMuY3VycmVudENvbnRleHRNZW51RXZlbnQuaWQgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdub3Rlcyc6XHJcbiAgICAgICAgdGhpcy5ldmVudENsaWNrLmVtaXQoeyBtb2RlOiAnbm90ZXMnLCBpZDogdGhpcy5jdXJyZW50Q29udGV4dE1lbnVFdmVudC5pZCB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ0FjdGlvbkVSUCc6XHJcbiAgICAgICAgdGhpcy5ldmVudENsaWNrLmVtaXQoeyBtb2RlOiAnQWN0aW9uRVJQJywgaWQ6IHRoaXMuY3VycmVudENvbnRleHRNZW51RXZlbnQuaWQgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25EaXNwbGF5TW9kZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBjYWxlbmRhckFwaSA9IHRoaXMuY2FsZW5kYXI/LmdldEFwaSgpO1xyXG4gICAgY2FsZW5kYXJBcGk/LmNoYW5nZVZpZXcoZXZlbnQudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3VycmVudERhdGVzKCkge1xyXG4gICAgaWYgKHRoaXMuY2FsZW5kYXIpIHtcclxuICAgICAgY29uc3QgY2FsZW5kYXJBcGk6IENhbGVuZGFyQXBpID0gdGhpcy5jYWxlbmRhci5nZXRBcGkoKTtcclxuICAgICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgc3RhcnQ6IG5ldyBEYXRlKGNhbGVuZGFyQXBpLnZpZXcuY3VycmVudFN0YXJ0LnNldERhdGUoY2FsZW5kYXJBcGkudmlldy5jdXJyZW50U3RhcnQuZ2V0RGF0ZSgpICsgMSkpLFxyXG4gICAgICAgIGVuZDogbmV3IERhdGUoY2FsZW5kYXJBcGkudmlldy5jdXJyZW50RW5kLnNldERhdGUoY2FsZW5kYXJBcGkudmlldy5jdXJyZW50RW5kLmdldERhdGUoKSArIDEpKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIiwiPHAtY2FsZW5kYXIgI2RhdGVQaWNrZXIgY2xhc3M9XCJoaWRkZW4tY2FsZW5kYXJcIiAob25TZWxlY3QpPVwibmF2aWdhdGVUb0RhdGUoJGV2ZW50KVwiLz5cclxuPGZ1bGwtY2FsZW5kYXIgI2NhbGVuZGFyIFtvcHRpb25zXT0nY2FsZW5kYXJPcHRpb25zKCknPlxyXG4gICAgPG5nLXRlbXBsYXRlICBsZXQtYXJnPlxyXG5cclxuICAgIDxpIFtuZ1N0eWxlXT1cImFyZy5ldmVudC5jb2xvciAmJiBhcmcuZXZlbnQuY29sb3IgIT09ICcnID8geydiYWNrZ3JvdW5kLWNvbG9yJzogYXJnLmV2ZW50LmNvbG9yfSA6IHt9XCIgPlxyXG4gICAgICAgIFxyXG4gICAgICAgIHt7IGFyZy5ldmVudC50aXRsZSB9fTwvaT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbjwvZnVsbC1jYWxlbmRhcj5cclxuPGFwcC1jb250ZXh0LW1lbnUgXHJcbiAgW3Nob3dJbmZvQnV0dG9uXT1cInNob3dJbmZvQnV0dG9uXCJcclxuICBbc2hvd1VwbG9hZEJ1dHRvbl09XCJzaG93VXBsb2FkQnV0dG9uXCJcclxuICBbc2hvd05vdGVCdXR0b25dPVwic2hvd05vdGVCdXR0b25cIlxyXG4gIFtzaG93QWN0aW9uQnV0dG9uXT1cInNob3dBY3Rpb25CdXR0b25cIlxyXG4gIChhY3Rpb25TZWxlY3RlZCk9XCJoYW5kbGVTZWxlY3RlZEFjdGlvbigkZXZlbnQpXCI+XHJcbjwvYXBwLWNvbnRleHQtbWVudT5cclxuPG5nLXRlbXBsYXRlICNkcm9wZG93blRlbXBsYXRlPlxyXG4gICAgPHAtZHJvcGRvd24gW3N0eWxlXT1cInsnd2lkdGgnIDogJzIwMHB4JywnYm9yZGVyLXJhZGl1cyc6ICc1cHgnfVwiIFtvcHRpb25zXT1cImRpc3BsYXlNb2RlT3B0aW9uc1wiIChvbkNoYW5nZSk9XCJvbkRpc3BsYXlNb2RlQ2hhbmdlKCRldmVudClcIj48L3AtZHJvcGRvd24+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==