primekit 1.0.12 → 1.0.13

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.
Files changed (50) hide show
  1. package/README.md +25 -25
  2. package/esm2022/lib/lib/atomix-alert/atomix-alert.component.mjs +3 -3
  3. package/esm2022/lib/lib/atomix-autocomplete/atomix-autocomplete.component.mjs +3 -3
  4. package/esm2022/lib/lib/atomix-button/atomix-button.component.mjs +3 -3
  5. package/esm2022/lib/lib/atomix-button/atomix-button.models.mjs +1 -1
  6. package/esm2022/lib/lib/atomix-calendar/atomix-calendar.component.mjs +3 -3
  7. package/esm2022/lib/lib/atomix-card/atomix-card.component.mjs +3 -3
  8. package/esm2022/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.mjs +3 -3
  9. package/esm2022/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.mjs +47 -4
  10. package/esm2022/lib/lib/atomix-divider/atomix-divider.component.mjs +3 -3
  11. package/esm2022/lib/lib/atomix-dropdown/atomix-dropdown.component.mjs +3 -3
  12. package/esm2022/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.mjs +1 -1
  13. package/esm2022/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.mjs +1 -1
  14. package/esm2022/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.mjs +3 -3
  15. package/esm2022/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.mjs +3 -3
  16. package/esm2022/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.mjs +3 -3
  17. package/esm2022/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.mjs +3 -3
  18. package/esm2022/lib/lib/atomix-form/atomix-form-chips/form.chips.models.mjs +1 -1
  19. package/esm2022/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.mjs +3 -3
  20. package/esm2022/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.mjs +3 -3
  21. package/esm2022/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.mjs +3 -3
  22. package/esm2022/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.mjs +3 -3
  23. package/esm2022/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.mjs +3 -3
  24. package/esm2022/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.mjs +3 -3
  25. package/esm2022/lib/lib/atomix-input/atomix-input.component.mjs +3 -3
  26. package/esm2022/lib/lib/atomix-input-switch/atomix-input-switch.component.mjs +3 -3
  27. package/esm2022/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.mjs +3 -3
  28. package/esm2022/lib/lib/atomix-messages/messages.component.mjs +3 -3
  29. package/esm2022/lib/lib/atomix-pagination/atomix-pagination.component.mjs +3 -3
  30. package/esm2022/lib/lib/atomix-radio-button/atomix-radio-button.component.mjs +3 -3
  31. package/esm2022/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.mjs +3 -3
  32. package/esm2022/lib/lib/atomix-select-button/atomix-select-button-models.mjs +1 -1
  33. package/esm2022/lib/lib/atomix-select-button/atomix-select-button.component.mjs +3 -3
  34. package/esm2022/lib/lib/atomix-snackbar/atomix-snackbar.component.mjs +3 -3
  35. package/esm2022/lib/lib/atomix-spinner/atomix-spinner.component.mjs +3 -3
  36. package/esm2022/lib/lib/atomix-steps/atomix-steps.component.mjs +3 -3
  37. package/esm2022/lib/lib/atomix-tabMenu/atomix-tabMenu.component.mjs +3 -3
  38. package/esm2022/lib/lib/atomix-table/atomix-table.component.mjs +3 -3
  39. package/esm2022/lib/lib/atomix-table/atomix-table.models.mjs +1 -1
  40. package/esm2022/lib/lib/atomix-tag/atomix-tag.component.mjs +3 -3
  41. package/esm2022/lib/lib/utils/prime-icons.util.mjs +1 -1
  42. package/esm2022/lib/primekit.component.mjs +1 -1
  43. package/esm2022/lib/primekit.module.mjs +1 -1
  44. package/esm2022/lib/primekit.service.mjs +1 -1
  45. package/esm2022/public-api.mjs +1 -1
  46. package/fesm2022/primekit.mjs +110 -67
  47. package/fesm2022/primekit.mjs.map +1 -1
  48. package/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.d.ts +8 -1
  49. package/package.json +1 -1
  50. package/src/assets/images/empty-table.svg +25 -25
@@ -20,6 +20,9 @@ export class AtomixDaterangeCalendarComponent {
20
20
  minDate;
21
21
  defaultPreset = null;
22
22
  preservePreset = false;
23
+ customPresets = [];
24
+ selectedCustomPreset = null;
25
+ customPresetClick = new EventEmitter();
23
26
  customRangeMode = false;
24
27
  selectedPreset = null; // 'today' | 'yesterday' | 'last7days' | 'last30days' | 'last3months' | 'last6months' | 'last1year' | 'custom' | null
25
28
  overlayPanel;
@@ -83,7 +86,13 @@ export class AtomixDaterangeCalendarComponent {
83
86
  this.renderer = renderer;
84
87
  }
85
88
  ngOnInit() {
86
- if (!this.selectedDate && this.defaultPreset) {
89
+ // Apply custom preset if set externally at init time
90
+ if (this.selectedCustomPreset && this.customPresets?.find(p => p.key === this.selectedCustomPreset)) {
91
+ this.selectedPreset = this.selectedCustomPreset;
92
+ this.selectedDate = null;
93
+ this.modelDate = null;
94
+ }
95
+ else if (!this.selectedDate && this.defaultPreset) {
87
96
  this.applyPreset(this.defaultPreset);
88
97
  }
89
98
  // initialize internal model
@@ -96,6 +105,20 @@ export class AtomixDaterangeCalendarComponent {
96
105
  }
97
106
  }
98
107
  ngOnChanges(changes) {
108
+ if (changes['selectedCustomPreset']) {
109
+ const preset = changes['selectedCustomPreset'].currentValue;
110
+ if (preset && this.customPresets?.find(p => p.key === preset)) {
111
+ this.selectedPreset = preset;
112
+ this.selectedDate = null;
113
+ this.modelDate = null;
114
+ }
115
+ else if (preset === null) {
116
+ // Only clear if the current preset is a custom one
117
+ if (this.customPresets?.find(p => p.key === this.selectedPreset)) {
118
+ this.selectedPreset = null;
119
+ }
120
+ }
121
+ }
99
122
  if (changes['selectedDate']) {
100
123
  const sel = changes['selectedDate'].currentValue;
101
124
  if (sel && Array.isArray(sel) && sel.length === 2 && sel[0] && sel[1]) {
@@ -314,6 +337,10 @@ export class AtomixDaterangeCalendarComponent {
314
337
  this.selectedPreset = 'custom';
315
338
  }
316
339
  getDateRangeLabel() {
340
+ // Show custom preset label if a custom preset is selected
341
+ const customPreset = this.customPresets?.find(p => p.key === this.selectedPreset);
342
+ if (customPreset)
343
+ return customPreset.label;
317
344
  // Check the internal model first to show real-time updates while selecting
318
345
  const dateArray = this.modelDate || this.selectedDate;
319
346
  if (!dateArray || !Array.isArray(dateArray))
@@ -333,6 +360,16 @@ export class AtomixDaterangeCalendarComponent {
333
360
  }
334
361
  return '';
335
362
  }
363
+ onCustomPresetClick(key) {
364
+ this.selectedPreset = key;
365
+ this.selectedDate = null;
366
+ this.modelDate = null;
367
+ this.customPresetClick.emit(key);
368
+ try {
369
+ this.overlayPanel?.hide();
370
+ }
371
+ catch (e) { }
372
+ }
336
373
  applyPreset(preset) {
337
374
  const today = new Date();
338
375
  let start = null;
@@ -638,11 +675,11 @@ export class AtomixDaterangeCalendarComponent {
638
675
  return Array.from(new Set(calEls));
639
676
  }
640
677
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AtomixDaterangeCalendarComponent, deps: [{ token: i1.DatePipe }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
641
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AtomixDaterangeCalendarComponent, selector: "atomix-daterange-calendar", inputs: { placeholder: "placeholder", styleClass: "styleClass", selectionMode: "selectionMode", inputStyleClass: "inputStyleClass", inline: "inline", disabled: "disabled", selectedDate: "selectedDate", maxDate: "maxDate", minDate: "minDate", defaultPreset: "defaultPreset", preservePreset: "preservePreset" }, outputs: { dateRangeChange: "dateRangeChange" }, viewQueries: [{ propertyName: "overlayPanel", first: true, predicate: ["overlayPanel"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\r\n <ng-container *ngIf=\"!inline; else inlineBlock\">\r\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"inputStyleClass\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"getDateRangeLabel()\"\r\n readonly\r\n [disabled]=\"disabled\"\r\n (click)=\"overlayPanel?.toggle($event)\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n />\r\n <i\r\n class=\"pi pi-calendar input-icon\"\r\n title=\"Open calendar\"\r\n (click)=\"!disabled && overlayPanel?.toggle($event)\"\r\n ></i>\r\n <i\r\n *ngIf=\"hasSelection\"\r\n class=\"pi pi-times input-clear-icon\"\r\n title=\"Clear\"\r\n tabindex=\"0\"\r\n (click)=\"!disabled && clearAndStop($event)\"\r\n (keydown.enter)=\"!disabled && clearAndStop($event)\"\r\n (keydown.space)=\"!disabled && clearAndStop($event)\"\r\n ></i>\r\n </div>\r\n\r\n <p-overlayPanel\r\n #overlayPanel\r\n [dismissable]=\"true\"\r\n appendTo=\"body\"\r\n styleClass=\"atomix-date-range-overlay\"\r\n (onShow)=\"onOverlayShow()\"\r\n (onHide)=\"onOverlayHide()\"\r\n >\r\n <div class=\"overlay-inner\">\r\n <div class=\"overlay-left\">\r\n <div class=\"preset-list\">\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('today')\"\r\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\r\n label=\"Today\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('yesterday')\"\r\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\r\n label=\"Yesterday\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last7days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\r\n label=\"Last 7 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last30days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\r\n label=\"Last 30 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last3months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\r\n label=\"Last 3 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last6months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last6months' }\"\r\n label=\"Last 6 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last1year')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\r\n label=\"Last 1 year\"\r\n ></button>\r\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\r\n </div>\r\n </div>\r\n <div class=\"overlay-right\">\r\n <p-calendar\r\n [(ngModel)]=\"modelDate\"\r\n [selectionMode]=\"'range'\"\r\n [inline]=\"true\"\r\n [dateFormat]=\"'mm/dd/yyyy'\"\r\n [showOtherMonths]=\"true\"\r\n [locale]=\"enLocale\"\r\n [showIcon]=\"false\"\r\n [styleClass]=\"'atomix-overlay-calendar'\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (onMonthChange)=\"onCalendarViewChanged($event)\"\r\n (onYearChange)=\"onCalendarViewChanged($event)\"\r\n [disabled]=\"disabled\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n ></p-calendar>\r\n </div>\r\n </div>\r\n </p-overlayPanel>\r\n </ng-container>\r\n\r\n <ng-template #inlineBlock>\r\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"inputStyleClass\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"getDateRangeLabel()\"\r\n readonly\r\n [disabled]=\"disabled\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n />\r\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\"></i>\r\n <i\r\n *ngIf=\"hasSelection\"\r\n class=\"pi pi-times input-clear-icon\"\r\n title=\"Clear\"\r\n tabindex=\"0\"\r\n (click)=\"clearAndStop($event)\"\r\n (keydown.enter)=\"clearAndStop($event)\"\r\n (keydown.space)=\"clearAndStop($event)\"\r\n ></i>\r\n </div>\r\n <div class=\"overlay-inner inline-calendar flex\">\r\n <div class=\"overlay-left\">\r\n <div class=\"preset-list\">\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('today')\"\r\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\r\n label=\"Today\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('yesterday')\"\r\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\r\n label=\"Yesterday\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last7days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\r\n label=\"Last 7 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last30days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\r\n label=\"Last 30 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last3months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\r\n label=\"Last 3 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last1year')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\r\n label=\"Last 1 year\"\r\n ></button>\r\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\r\n </div>\r\n </div>\r\n <div class=\"overlay-right\">\r\n <p-calendar\r\n [(ngModel)]=\"modelDate\"\r\n [selectionMode]=\"'range'\"\r\n [inline]=\"true\"\r\n [dateFormat]=\"'mm/dd/yyyy'\"\r\n [showOtherMonths]=\"true\"\r\n [locale]=\"enLocale\"\r\n [showIcon]=\"false\"\r\n [styleClass]=\"'atomix-overlay-calendar'\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (onMonthChange)=\"onCalendarViewChanged($event)\"\r\n (onYearChange)=\"onCalendarViewChanged($event)\"\r\n [disabled]=\"disabled\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n ></p-calendar>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</div>\r\n", styles: ["::ng-deep .p-calendar button{background-color:transparent!important}::ng-deep .p-overlaypanel .p-overlaypanel-content{margin-top:0!important}::ng-deep .p-datepicker{border:none!important;border-radius:var(--global-border-radius)}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#fff;background:#63c984;padding:1rem!important}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month{padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#fff;background:#63b77e;padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year{padding:1rem!important}::ng-deep .p-datepicker table th{border-bottom:1px solid rgba(0,0,0,.12);color:var(--text-gray-700);font-weight:400;font-size:.875rem}::ng-deep .p-datepicker table td>span.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker table td{padding:.2rem 0}::ng-deep .p-datepicker table td>span{width:2.8rem;height:2.8rem;border-radius:0%;transition:none}::ng-deep .p-datepicker table td.p-datepicker-today>span{box-shadow:inset 0 0 0 2px #00000061}::ng-deep .p-datepicker table td>span.p-highlight.start-range{border-top-left-radius:10px;border-bottom-left-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.end-range{border-top-right-radius:10px;border-bottom-right-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.between-range{background:#00c37dad!important}::ng-deep .p-monthpicker-month{width:50%!important}::ng-deep .p-yearpicker-year{width:50%!important}::ng-deep .inline-calendar .p-datepicker table td>span{width:2.4rem;height:2.4rem}::ng-deep .inline-calendar{border-bottom:1px solid #e5e5e5}::ng-deep .atomix-date-range-overlay{border-radius:var(--global-border-radius)}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding:.75rem .75rem 2rem;text-align:center;border-right:1px solid #e5e5e5}.inline-calendar .overlay-left{padding-bottom:2rem}.input-wrapper{display:flex;align-items:center;gap:.5rem;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:40px!important;border-radius:var(--global-border-radius)}.input-wrapper input{color:#000000de}.input-wrapper input::placeholder{color:#0009}.input-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:27px}.preset-list{display:flex;flex-direction:column;gap:0}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.inline-calendar .preset-btn{padding:.3rem .8rem!important}.inline-calendar{gap:0}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:var(--text-gray-700);border-radius:var(--global-border-radius)}.preset-btn:hover{background-color:#63b77e}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#63b77e!important;color:#fff!important;font-weight:700;line-height:17px;border-radius:var(--global-border-radius)}.reset-link{text-align:left;cursor:pointer;margin-top:10px;padding:.3rem 1.4rem!important;color:#63b77e;font-weight:600}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1;width:230px;max-width:230px}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { 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.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
678
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AtomixDaterangeCalendarComponent, selector: "atomix-daterange-calendar", inputs: { placeholder: "placeholder", styleClass: "styleClass", selectionMode: "selectionMode", inputStyleClass: "inputStyleClass", inline: "inline", disabled: "disabled", selectedDate: "selectedDate", maxDate: "maxDate", minDate: "minDate", defaultPreset: "defaultPreset", preservePreset: "preservePreset", customPresets: "customPresets", selectedCustomPreset: "selectedCustomPreset" }, outputs: { customPresetClick: "customPresetClick", dateRangeChange: "dateRangeChange" }, viewQueries: [{ propertyName: "overlayPanel", first: true, predicate: ["overlayPanel"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\n <ng-container *ngIf=\"!inline; else inlineBlock\">\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (click)=\"overlayPanel?.toggle($event)\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i\n class=\"pi pi-calendar input-icon\"\n title=\"Open calendar\"\n (click)=\"!disabled && overlayPanel?.toggle($event)\"\n ></i>\n <i\n *ngIf=\"hasSelection\"\n class=\"pi pi-times input-clear-icon\"\n title=\"Clear\"\n tabindex=\"0\"\n (click)=\"!disabled && clearAndStop($event)\"\n (keydown.enter)=\"!disabled && clearAndStop($event)\"\n (keydown.space)=\"!disabled && clearAndStop($event)\"\n ></i>\n </div>\n\n <p-overlayPanel\n #overlayPanel\n [dismissable]=\"true\"\n appendTo=\"body\"\n styleClass=\"atomix-date-range-overlay\"\n (onShow)=\"onOverlayShow()\"\n (onHide)=\"onOverlayHide()\"\n >\n <div class=\"overlay-inner\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('today')\"\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\n label=\"Today\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('yesterday')\"\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\n label=\"Yesterday\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last7days')\"\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\n label=\"Last 7 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last30days')\"\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\n label=\"Last 30 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last3months')\"\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\n label=\"Last 3 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last6months')\"\n [ngClass]=\"{ active: selectedPreset === 'last6months' }\"\n label=\"Last 6 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last1year')\"\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\n label=\"Last 1 year\"\n ></button>\n <ng-container *ngFor=\"let cp of customPresets\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"onCustomPresetClick(cp.key)\" [ngClass]=\"{ 'active': selectedPreset === cp.key }\" [label]=\"cp.label\"></button>\n </ng-container>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar\n [(ngModel)]=\"modelDate\"\n [selectionMode]=\"'range'\"\n [inline]=\"true\"\n [dateFormat]=\"'mm/dd/yyyy'\"\n [showOtherMonths]=\"true\"\n [locale]=\"enLocale\"\n [showIcon]=\"false\"\n [styleClass]=\"'atomix-overlay-calendar'\"\n (ngModelChange)=\"onModelChange($event)\"\n (onMonthChange)=\"onCalendarViewChanged($event)\"\n (onYearChange)=\"onCalendarViewChanged($event)\"\n [disabled]=\"disabled\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n ></p-calendar>\n </div>\n </div>\n </p-overlayPanel>\n </ng-container>\n\n <ng-template #inlineBlock>\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\"></i>\n <i\n *ngIf=\"hasSelection\"\n class=\"pi pi-times input-clear-icon\"\n title=\"Clear\"\n tabindex=\"0\"\n (click)=\"clearAndStop($event)\"\n (keydown.enter)=\"clearAndStop($event)\"\n (keydown.space)=\"clearAndStop($event)\"\n ></i>\n </div>\n <div class=\"overlay-inner inline-calendar flex\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('today')\"\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\n label=\"Today\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('yesterday')\"\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\n label=\"Yesterday\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last7days')\"\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\n label=\"Last 7 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last30days')\"\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\n label=\"Last 30 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last3months')\"\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\n label=\"Last 3 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last1year')\"\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\n label=\"Last 1 year\"\n ></button>\n <ng-container *ngFor=\"let cp of customPresets\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"onCustomPresetClick(cp.key)\" [ngClass]=\"{ 'active': selectedPreset === cp.key }\" [label]=\"cp.label\"></button>\n </ng-container>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar\n [(ngModel)]=\"modelDate\"\n [selectionMode]=\"'range'\"\n [inline]=\"true\"\n [dateFormat]=\"'mm/dd/yyyy'\"\n [showOtherMonths]=\"true\"\n [locale]=\"enLocale\"\n [showIcon]=\"false\"\n [styleClass]=\"'atomix-overlay-calendar'\"\n (ngModelChange)=\"onModelChange($event)\"\n (onMonthChange)=\"onCalendarViewChanged($event)\"\n (onYearChange)=\"onCalendarViewChanged($event)\"\n [disabled]=\"disabled\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n ></p-calendar>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: ["::ng-deep .p-calendar button{background-color:transparent!important}::ng-deep .p-overlaypanel .p-overlaypanel-content{margin-top:0!important}::ng-deep .p-datepicker{border:none!important;border-radius:var(--global-border-radius)}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#fff;background:#63c984;padding:1rem!important}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month{padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#fff;background:#63b77e;padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year{padding:1rem!important}::ng-deep .p-datepicker table th{border-bottom:1px solid rgba(0,0,0,.12);color:var(--text-gray-700);font-weight:400;font-size:.875rem}::ng-deep .p-datepicker table td>span.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker table td{padding:.2rem 0}::ng-deep .p-datepicker table td>span{width:2.8rem;height:2.8rem;border-radius:0%;transition:none}::ng-deep .p-datepicker table td.p-datepicker-today>span{box-shadow:inset 0 0 0 2px #00000061}::ng-deep .p-datepicker table td>span.p-highlight.start-range{border-top-left-radius:10px;border-bottom-left-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.end-range{border-top-right-radius:10px;border-bottom-right-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.between-range{background:#00c37dad!important}::ng-deep .p-monthpicker-month{width:50%!important}::ng-deep .p-yearpicker-year{width:50%!important}::ng-deep .inline-calendar .p-datepicker table td>span{width:2.4rem;height:2.4rem}::ng-deep .inline-calendar{border-bottom:1px solid #e5e5e5}::ng-deep .atomix-date-range-overlay{border-radius:var(--global-border-radius)}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding:.75rem .75rem 2rem;text-align:center;border-right:1px solid #e5e5e5}.inline-calendar .overlay-left{padding-bottom:2rem}.input-wrapper{display:flex;align-items:center;gap:.5rem;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:40px!important;border-radius:var(--global-border-radius)}.input-wrapper input{color:#000000de}.input-wrapper input::placeholder{color:#0009}.input-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:27px}.preset-list{display:flex;flex-direction:column;gap:0}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.inline-calendar .preset-btn{padding:.3rem .8rem!important}.inline-calendar{gap:0}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:var(--text-gray-700);border-radius:var(--global-border-radius)}.preset-btn:hover{background-color:#63b77e}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#63b77e!important;color:#fff!important;font-weight:700;line-height:17px;border-radius:var(--global-border-radius)}.reset-link{text-align:left;cursor:pointer;margin-top:10px;padding:.3rem 1.4rem!important;color:#63b77e;font-weight:600}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1;width:230px;max-width:230px}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { 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.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
642
679
  }
643
680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AtomixDaterangeCalendarComponent, decorators: [{
644
681
  type: Component,
645
- args: [{ selector: 'atomix-daterange-calendar', template: "<div>\r\n <ng-container *ngIf=\"!inline; else inlineBlock\">\r\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"inputStyleClass\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"getDateRangeLabel()\"\r\n readonly\r\n [disabled]=\"disabled\"\r\n (click)=\"overlayPanel?.toggle($event)\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n />\r\n <i\r\n class=\"pi pi-calendar input-icon\"\r\n title=\"Open calendar\"\r\n (click)=\"!disabled && overlayPanel?.toggle($event)\"\r\n ></i>\r\n <i\r\n *ngIf=\"hasSelection\"\r\n class=\"pi pi-times input-clear-icon\"\r\n title=\"Clear\"\r\n tabindex=\"0\"\r\n (click)=\"!disabled && clearAndStop($event)\"\r\n (keydown.enter)=\"!disabled && clearAndStop($event)\"\r\n (keydown.space)=\"!disabled && clearAndStop($event)\"\r\n ></i>\r\n </div>\r\n\r\n <p-overlayPanel\r\n #overlayPanel\r\n [dismissable]=\"true\"\r\n appendTo=\"body\"\r\n styleClass=\"atomix-date-range-overlay\"\r\n (onShow)=\"onOverlayShow()\"\r\n (onHide)=\"onOverlayHide()\"\r\n >\r\n <div class=\"overlay-inner\">\r\n <div class=\"overlay-left\">\r\n <div class=\"preset-list\">\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('today')\"\r\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\r\n label=\"Today\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('yesterday')\"\r\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\r\n label=\"Yesterday\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last7days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\r\n label=\"Last 7 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last30days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\r\n label=\"Last 30 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last3months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\r\n label=\"Last 3 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last6months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last6months' }\"\r\n label=\"Last 6 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last1year')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\r\n label=\"Last 1 year\"\r\n ></button>\r\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\r\n </div>\r\n </div>\r\n <div class=\"overlay-right\">\r\n <p-calendar\r\n [(ngModel)]=\"modelDate\"\r\n [selectionMode]=\"'range'\"\r\n [inline]=\"true\"\r\n [dateFormat]=\"'mm/dd/yyyy'\"\r\n [showOtherMonths]=\"true\"\r\n [locale]=\"enLocale\"\r\n [showIcon]=\"false\"\r\n [styleClass]=\"'atomix-overlay-calendar'\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (onMonthChange)=\"onCalendarViewChanged($event)\"\r\n (onYearChange)=\"onCalendarViewChanged($event)\"\r\n [disabled]=\"disabled\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n ></p-calendar>\r\n </div>\r\n </div>\r\n </p-overlayPanel>\r\n </ng-container>\r\n\r\n <ng-template #inlineBlock>\r\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"inputStyleClass\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"getDateRangeLabel()\"\r\n readonly\r\n [disabled]=\"disabled\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n />\r\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\"></i>\r\n <i\r\n *ngIf=\"hasSelection\"\r\n class=\"pi pi-times input-clear-icon\"\r\n title=\"Clear\"\r\n tabindex=\"0\"\r\n (click)=\"clearAndStop($event)\"\r\n (keydown.enter)=\"clearAndStop($event)\"\r\n (keydown.space)=\"clearAndStop($event)\"\r\n ></i>\r\n </div>\r\n <div class=\"overlay-inner inline-calendar flex\">\r\n <div class=\"overlay-left\">\r\n <div class=\"preset-list\">\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('today')\"\r\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\r\n label=\"Today\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('yesterday')\"\r\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\r\n label=\"Yesterday\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last7days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\r\n label=\"Last 7 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last30days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\r\n label=\"Last 30 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last3months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\r\n label=\"Last 3 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last1year')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\r\n label=\"Last 1 year\"\r\n ></button>\r\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\r\n </div>\r\n </div>\r\n <div class=\"overlay-right\">\r\n <p-calendar\r\n [(ngModel)]=\"modelDate\"\r\n [selectionMode]=\"'range'\"\r\n [inline]=\"true\"\r\n [dateFormat]=\"'mm/dd/yyyy'\"\r\n [showOtherMonths]=\"true\"\r\n [locale]=\"enLocale\"\r\n [showIcon]=\"false\"\r\n [styleClass]=\"'atomix-overlay-calendar'\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (onMonthChange)=\"onCalendarViewChanged($event)\"\r\n (onYearChange)=\"onCalendarViewChanged($event)\"\r\n [disabled]=\"disabled\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n ></p-calendar>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</div>\r\n", styles: ["::ng-deep .p-calendar button{background-color:transparent!important}::ng-deep .p-overlaypanel .p-overlaypanel-content{margin-top:0!important}::ng-deep .p-datepicker{border:none!important;border-radius:var(--global-border-radius)}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#fff;background:#63c984;padding:1rem!important}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month{padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#fff;background:#63b77e;padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year{padding:1rem!important}::ng-deep .p-datepicker table th{border-bottom:1px solid rgba(0,0,0,.12);color:var(--text-gray-700);font-weight:400;font-size:.875rem}::ng-deep .p-datepicker table td>span.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker table td{padding:.2rem 0}::ng-deep .p-datepicker table td>span{width:2.8rem;height:2.8rem;border-radius:0%;transition:none}::ng-deep .p-datepicker table td.p-datepicker-today>span{box-shadow:inset 0 0 0 2px #00000061}::ng-deep .p-datepicker table td>span.p-highlight.start-range{border-top-left-radius:10px;border-bottom-left-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.end-range{border-top-right-radius:10px;border-bottom-right-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.between-range{background:#00c37dad!important}::ng-deep .p-monthpicker-month{width:50%!important}::ng-deep .p-yearpicker-year{width:50%!important}::ng-deep .inline-calendar .p-datepicker table td>span{width:2.4rem;height:2.4rem}::ng-deep .inline-calendar{border-bottom:1px solid #e5e5e5}::ng-deep .atomix-date-range-overlay{border-radius:var(--global-border-radius)}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding:.75rem .75rem 2rem;text-align:center;border-right:1px solid #e5e5e5}.inline-calendar .overlay-left{padding-bottom:2rem}.input-wrapper{display:flex;align-items:center;gap:.5rem;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:40px!important;border-radius:var(--global-border-radius)}.input-wrapper input{color:#000000de}.input-wrapper input::placeholder{color:#0009}.input-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:27px}.preset-list{display:flex;flex-direction:column;gap:0}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.inline-calendar .preset-btn{padding:.3rem .8rem!important}.inline-calendar{gap:0}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:var(--text-gray-700);border-radius:var(--global-border-radius)}.preset-btn:hover{background-color:#63b77e}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#63b77e!important;color:#fff!important;font-weight:700;line-height:17px;border-radius:var(--global-border-radius)}.reset-link{text-align:left;cursor:pointer;margin-top:10px;padding:.3rem 1.4rem!important;color:#63b77e;font-weight:600}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1;width:230px;max-width:230px}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}\n"] }]
682
+ args: [{ selector: 'atomix-daterange-calendar', template: "<div>\n <ng-container *ngIf=\"!inline; else inlineBlock\">\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (click)=\"overlayPanel?.toggle($event)\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i\n class=\"pi pi-calendar input-icon\"\n title=\"Open calendar\"\n (click)=\"!disabled && overlayPanel?.toggle($event)\"\n ></i>\n <i\n *ngIf=\"hasSelection\"\n class=\"pi pi-times input-clear-icon\"\n title=\"Clear\"\n tabindex=\"0\"\n (click)=\"!disabled && clearAndStop($event)\"\n (keydown.enter)=\"!disabled && clearAndStop($event)\"\n (keydown.space)=\"!disabled && clearAndStop($event)\"\n ></i>\n </div>\n\n <p-overlayPanel\n #overlayPanel\n [dismissable]=\"true\"\n appendTo=\"body\"\n styleClass=\"atomix-date-range-overlay\"\n (onShow)=\"onOverlayShow()\"\n (onHide)=\"onOverlayHide()\"\n >\n <div class=\"overlay-inner\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('today')\"\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\n label=\"Today\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('yesterday')\"\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\n label=\"Yesterday\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last7days')\"\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\n label=\"Last 7 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last30days')\"\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\n label=\"Last 30 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last3months')\"\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\n label=\"Last 3 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last6months')\"\n [ngClass]=\"{ active: selectedPreset === 'last6months' }\"\n label=\"Last 6 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last1year')\"\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\n label=\"Last 1 year\"\n ></button>\n <ng-container *ngFor=\"let cp of customPresets\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"onCustomPresetClick(cp.key)\" [ngClass]=\"{ 'active': selectedPreset === cp.key }\" [label]=\"cp.label\"></button>\n </ng-container>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar\n [(ngModel)]=\"modelDate\"\n [selectionMode]=\"'range'\"\n [inline]=\"true\"\n [dateFormat]=\"'mm/dd/yyyy'\"\n [showOtherMonths]=\"true\"\n [locale]=\"enLocale\"\n [showIcon]=\"false\"\n [styleClass]=\"'atomix-overlay-calendar'\"\n (ngModelChange)=\"onModelChange($event)\"\n (onMonthChange)=\"onCalendarViewChanged($event)\"\n (onYearChange)=\"onCalendarViewChanged($event)\"\n [disabled]=\"disabled\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n ></p-calendar>\n </div>\n </div>\n </p-overlayPanel>\n </ng-container>\n\n <ng-template #inlineBlock>\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\"></i>\n <i\n *ngIf=\"hasSelection\"\n class=\"pi pi-times input-clear-icon\"\n title=\"Clear\"\n tabindex=\"0\"\n (click)=\"clearAndStop($event)\"\n (keydown.enter)=\"clearAndStop($event)\"\n (keydown.space)=\"clearAndStop($event)\"\n ></i>\n </div>\n <div class=\"overlay-inner inline-calendar flex\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('today')\"\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\n label=\"Today\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('yesterday')\"\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\n label=\"Yesterday\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last7days')\"\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\n label=\"Last 7 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last30days')\"\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\n label=\"Last 30 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last3months')\"\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\n label=\"Last 3 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last1year')\"\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\n label=\"Last 1 year\"\n ></button>\n <ng-container *ngFor=\"let cp of customPresets\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"onCustomPresetClick(cp.key)\" [ngClass]=\"{ 'active': selectedPreset === cp.key }\" [label]=\"cp.label\"></button>\n </ng-container>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar\n [(ngModel)]=\"modelDate\"\n [selectionMode]=\"'range'\"\n [inline]=\"true\"\n [dateFormat]=\"'mm/dd/yyyy'\"\n [showOtherMonths]=\"true\"\n [locale]=\"enLocale\"\n [showIcon]=\"false\"\n [styleClass]=\"'atomix-overlay-calendar'\"\n (ngModelChange)=\"onModelChange($event)\"\n (onMonthChange)=\"onCalendarViewChanged($event)\"\n (onYearChange)=\"onCalendarViewChanged($event)\"\n [disabled]=\"disabled\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n ></p-calendar>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: ["::ng-deep .p-calendar button{background-color:transparent!important}::ng-deep .p-overlaypanel .p-overlaypanel-content{margin-top:0!important}::ng-deep .p-datepicker{border:none!important;border-radius:var(--global-border-radius)}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#fff;background:#63c984;padding:1rem!important}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month{padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#fff;background:#63b77e;padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year{padding:1rem!important}::ng-deep .p-datepicker table th{border-bottom:1px solid rgba(0,0,0,.12);color:var(--text-gray-700);font-weight:400;font-size:.875rem}::ng-deep .p-datepicker table td>span.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker table td{padding:.2rem 0}::ng-deep .p-datepicker table td>span{width:2.8rem;height:2.8rem;border-radius:0%;transition:none}::ng-deep .p-datepicker table td.p-datepicker-today>span{box-shadow:inset 0 0 0 2px #00000061}::ng-deep .p-datepicker table td>span.p-highlight.start-range{border-top-left-radius:10px;border-bottom-left-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.end-range{border-top-right-radius:10px;border-bottom-right-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.between-range{background:#00c37dad!important}::ng-deep .p-monthpicker-month{width:50%!important}::ng-deep .p-yearpicker-year{width:50%!important}::ng-deep .inline-calendar .p-datepicker table td>span{width:2.4rem;height:2.4rem}::ng-deep .inline-calendar{border-bottom:1px solid #e5e5e5}::ng-deep .atomix-date-range-overlay{border-radius:var(--global-border-radius)}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding:.75rem .75rem 2rem;text-align:center;border-right:1px solid #e5e5e5}.inline-calendar .overlay-left{padding-bottom:2rem}.input-wrapper{display:flex;align-items:center;gap:.5rem;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:40px!important;border-radius:var(--global-border-radius)}.input-wrapper input{color:#000000de}.input-wrapper input::placeholder{color:#0009}.input-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:27px}.preset-list{display:flex;flex-direction:column;gap:0}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.inline-calendar .preset-btn{padding:.3rem .8rem!important}.inline-calendar{gap:0}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:var(--text-gray-700);border-radius:var(--global-border-radius)}.preset-btn:hover{background-color:#63b77e}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#63b77e!important;color:#fff!important;font-weight:700;line-height:17px;border-radius:var(--global-border-radius)}.reset-link{text-align:left;cursor:pointer;margin-top:10px;padding:.3rem 1.4rem!important;color:#63b77e;font-weight:600}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1;width:230px;max-width:230px}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}\n"] }]
646
683
  }], ctorParameters: () => [{ type: i1.DatePipe }, { type: i0.Renderer2 }], propDecorators: { placeholder: [{
647
684
  type: Input
648
685
  }], styleClass: [{
@@ -665,10 +702,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
665
702
  type: Input
666
703
  }], preservePreset: [{
667
704
  type: Input
705
+ }], customPresets: [{
706
+ type: Input
707
+ }], selectedCustomPreset: [{
708
+ type: Input
709
+ }], customPresetClick: [{
710
+ type: Output
668
711
  }], overlayPanel: [{
669
712
  type: ViewChild,
670
713
  args: ['overlayPanel']
671
714
  }], dateRangeChange: [{
672
715
  type: Output
673
716
  }] } });
674
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmltZWtpdC9zcmMvbGliL2xpYi9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbWVraXQvc3JjL2xpYi9saWIvYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQU1WLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVN2QixNQUFNLE9BQU8sZ0NBQWdDO0lBc0ZqQztJQUNBO0lBcEZELFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUN4QixhQUFhLEdBQVksT0FBTyxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLFlBQVksR0FBUSxJQUFJLENBQUM7SUFDekIsT0FBTyxDQUFRO0lBQ2YsT0FBTyxDQUFRO0lBQ2YsYUFBYSxHQVFYLElBQUksQ0FBQztJQUNQLGNBQWMsR0FBWSxLQUFLLENBQUM7SUFFekMsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxjQUFjLEdBQWtCLElBQUksQ0FBQyxDQUFDLHFIQUFxSDtJQUNoSSxZQUFZLENBQWdCO0lBQzdDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRXBELHVHQUF1RztJQUN2RyxTQUFTLEdBQWtCLElBQUksQ0FBQztJQUVoQyxRQUFRLEdB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T0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQzt3R0F2ckJVLGdDQUFnQzs0RkFBaEMsZ0NBQWdDLDJpQkNwQjdDLHlyUUF5T0E7OzRGRHJOYSxnQ0FBZ0M7a0JBTDVDLFNBQVM7K0JBQ0UsMkJBQTJCO3FHQU81QixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQVNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBSXFCLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDZixlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBSZW5kZXJlcjIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE92ZXJsYXlQYW5lbCB9IGZyb20gJ3ByaW1lbmcvb3ZlcmxheXBhbmVsJztcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXRvbWl4RGF0ZXJhbmdlQ2FsZW5kYXJDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3lcclxue1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBzdHlsZUNsYXNzOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiAncmFuZ2UnID0gJ3JhbmdlJztcclxuICBASW5wdXQoKSBpbnB1dFN0eWxlQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGlubGluZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRlOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgpIG1heERhdGUhOiBEYXRlO1xyXG4gIEBJbnB1dCgpIG1pbkRhdGUhOiBEYXRlO1xyXG4gIEBJbnB1dCgpIGRlZmF1bHRQcmVzZXQ6XHJcbiAgICB8ICd0b2RheSdcclxuICAgIHwgJ3llc3RlcmRheSdcclxuICAgIHwgJ2xhc3Q3ZGF5cydcclxuICAgIHwgJ2xhc3QzMGRheXMnXHJcbiAgICB8ICdsYXN0M21vbnRocydcclxuICAgIHwgJ2xhc3Q2bW9udGhzJ1xyXG4gICAgfCAnbGFzdDF5ZWFyJ1xyXG4gICAgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBwcmVzZXJ2ZVByZXNldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjdXN0b21SYW5nZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWxlY3RlZFByZXNldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vICd0b2RheScgfCAneWVzdGVyZGF5JyB8ICdsYXN0N2RheXMnIHwgJ2xhc3QzMGRheXMnIHwgJ2xhc3QzbW9udGhzJyB8ICdsYXN0Nm1vbnRocycgfCAnbGFzdDF5ZWFyJyB8ICdjdXN0b20nIHwgbnVsbFxyXG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlQYW5lbCcpIG92ZXJsYXlQYW5lbD86IE92ZXJsYXlQYW5lbDtcclxuICBAT3V0cHV0KCkgZGF0ZVJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8vIGludGVybmFsIG1vZGVsIGJvdW5kIHRvIHAtY2FsZW5kYXIgdG8gYXZvaWQgY2hhbmdpbmcgZXh0ZXJuYWwgc2VsZWN0aW9uIGR1cmluZyBmaXJzdC1jbGljayBzZWxlY3Rpb25cclxuICBtb2RlbERhdGU6IERhdGVbXSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBlbkxvY2FsZSA9IHtcclxuICAgIGZpcnN0RGF5T2ZXZWVrOiAwLFxyXG4gICAgZGF5TmFtZXM6IFtcclxuICAgICAgJ1N1bmRheScsXHJcbiAgICAgICdNb25kYXknLFxyXG4gICAgICAnVHVlc2RheScsXHJcbiAgICAgICdXZWRuZXNkYXknLFxyXG4gICAgICAnVGh1cnNkYXknLFxyXG4gICAgICAnRnJpZGF5JyxcclxuICAgICAgJ1NhdHVyZGF5JyxcclxuICAgIF0sXHJcbiAgICBkYXlOYW1lc1Nob3J0OiBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLFxyXG4gICAgZGF5TmFtZXNNaW46IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXSxcclxuICAgIG1vbnRoTmFtZXM6IFtcclxuICAgICAgJ0phbnVhcnknLFxyXG4gICAgICAnRmVicnVhcnknLFxyXG4gICAgICAnTWFyY2gnLFxyXG4gICAgICAnQXByaWwnLFxyXG4gICAgICAnTWF5JyxcclxuICAgICAgJ0p1bmUnLFxyXG4gICAgICAnSnVseScsXHJcbiAgICAgICdBdWd1c3QnLFxyXG4gICAgICAnU2VwdGVtYmVyJyxcclxuICAgICAgJ09jdG9iZXInLFxyXG4gICAgICAnTm92ZW1iZXInLFxyXG4gICAgICAnRGVjZW1iZXInLFxyXG4gICAgXSxcclxuICAgIG1vbnRoTmFtZXNTaG9ydDogW1xyXG4gICAgICAnSmFuJyxcclxuICAgICAgJ0ZlYicsXHJcbiAgICAgICdNYXInLFxyXG4gICAgICAnQXByJyxcclxuICAgICAgJ01heScsXHJcbiAgICAgICdKdW4nLFxyXG4gICAgICAnSnVsJyxcclxuICAgICAgJ0F1ZycsXHJcbiAgICAgICdTZXAnLFxyXG4gICAgICAnT2N0JyxcclxuICAgICAgJ05vdicsXHJcbiAgICAgICdEZWMnLFxyXG4gICAgXSxcclxuICAgIHRvZGF5OiAnVG9kYXknLFxyXG4gICAgY2xlYXI6ICdDbGVhcicsXHJcbiAgfTtcclxuXHJcbiAgLy8gdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG92ZXJsYXkgc2Vzc2lvblxyXG4gIHByaXZhdGUgX292ZXJsYXlJbml0aWFsRGF0ZTogRGF0ZVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfb3ZlcmxheUluaXRpYWxQcmVzZXQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2NhbGVuZGFyT2JzZXJ2ZXJzOiBNdXRhdGlvbk9ic2VydmVyW10gPSBbXTtcclxuICBwcml2YXRlIF9vYnNlcnZlZEVsZW1lbnRzOiBFbGVtZW50W10gPSBbXTtcclxuICBwcml2YXRlIF9wYXJlbnRPYnNlcnZlcnM6IE11dGF0aW9uT2JzZXJ2ZXJbXSA9IFtdO1xyXG4gIHByaXZhdGUgX29ic2VydmVkUGFyZW50RWxlbWVudHM6IEVsZW1lbnRbXSA9IFtdO1xyXG4gIHByaXZhdGUgX3VwZGF0ZVJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGlkXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRGF0ZSAmJiB0aGlzLmRlZmF1bHRQcmVzZXQpIHtcclxuICAgICAgdGhpcy5hcHBseVByZXNldCh0aGlzLmRlZmF1bHRQcmVzZXQpO1xyXG4gICAgfVxyXG4gICAgLy8gaW5pdGlhbGl6ZSBpbnRlcm5hbCBtb2RlbFxyXG4gICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xyXG4gICAgLy8gaW5pdGlhbCBjbGFzcyB1cGRhdGUgaWYgdGhlcmUgaXMgYSBwcmUtc2VsZWN0ZWQgcmFuZ2VcclxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XHJcbiAgICAvLyBzdGFydCBvYnNlcnZlcnMgaWYgaW5saW5lIGNhbGVuZGFyIGlzIHVzZWRcclxuICAgIGlmICh0aGlzLmlubGluZSkge1xyXG4gICAgICB0aGlzLl9zdGFydENhbGVuZGFyT2JzZXJ2ZXJzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10pIHtcclxuICAgICAgY29uc3Qgc2VsID0gY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10uY3VycmVudFZhbHVlIGFzIERhdGVbXSB8IG51bGw7XHJcbiAgICAgIGlmIChzZWwgJiYgQXJyYXkuaXNBcnJheShzZWwpICYmIHNlbC5sZW5ndGggPT09IDIgJiYgc2VsWzBdICYmIHNlbFsxXSkge1xyXG4gICAgICAgIGNvbnN0IHByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KHNlbFswXSwgc2VsWzFdKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0ID8/ICdjdXN0b20nO1xyXG4gICAgICAgIC8vIHN5bmMgaW50ZXJuYWwgbW9kZWwgd2hlbiBleHRlcm5hbCB2YWx1ZSBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy5tb2RlbERhdGUgPSBbLi4uc2VsXTtcclxuICAgICAgfSBlbHNlIGlmIChzZWwgPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubW9kZWxEYXRlID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25JbnB1dEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLm92ZXJsYXlQYW5lbD8udG9nZ2xlKGV2ZW50IGFzIGFueSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk92ZXJsYXlTaG93KCk6IHZvaWQge1xyXG4gICAgLy8gc3RvcmUgYSBkZWVwIGNvcHkgb2YgY3VycmVudCBzZWxlY3Rpb24vcHJlc2V0IHdoZW4gb3ZlcmxheSBvcGVuc1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlICYmIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZERhdGUpKSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZSA9ICh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pLm1hcCgoZCkgPT5cclxuICAgICAgICBkID8gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIGQuZ2V0RGF0ZSgpKSA6IGRcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vdmVybGF5SW5pdGlhbFByZXNldCA9IHRoaXMuc2VsZWN0ZWRQcmVzZXQ7XHJcbiAgICAvLyBlbnN1cmUgY2FsZW5kYXIgbW9kZWwgc2hvd3MgdGhlIGN1cnJlbnRseSBjb21taXR0ZWQgc2VsZWN0aW9uIHdoZW4gb3BlbmluZ1xyXG4gICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xyXG4gICAgLy8gZW5zdXJlIHByZXNldCBidXR0b25zIHJlZmxlY3QgY3VycmVudCBzZWxlY3Rpb24gd2hlbiBvdmVybGF5IG9wZW5zXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZERhdGUpICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLmxlbmd0aCA9PT0gMlxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlWzBdLFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlWzFdXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBwcmVzZXQgPz8gJ2N1c3RvbSc7XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnNlbGVjdGVkRGF0ZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIC8vIGFkZCBzdGFydC9lbmQgY2xhc3NlcyB0byByYW5nZSBjZWxscyBmb3Igc3R5bGluZ1xyXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcclxuICAgIC8vIG9ic2VydmUgRE9NIGNoYW5nZXMgKFByaW1lTkcgbWF5IHJlLXJlbmRlciBpbnNpZGUgb3ZlcmxheSlcclxuICAgIHRoaXMuX3N0YXJ0Q2FsZW5kYXJPYnNlcnZlcnMoKTtcclxuICB9XHJcblxyXG4gIG9uT3ZlcmxheUhpZGUoKTogdm9pZCB7XHJcbiAgICAvLyBpZiBpbnRlcm5hbCBjYWxlbmRhciBtb2RlbCBoYXMgYW4gaW5jb21wbGV0ZSBzZWxlY3Rpb24gKHBhcnRpYWwgcmFuZ2UpIHJldmVydCB0byBpbml0aWFsXHJcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxEYXRlO1xyXG4gICAgY29uc3QgaXNQYXJ0aWFsTW9kZWwgPSBCb29sZWFuKFxyXG4gICAgICBtb2RlbCAmJiBBcnJheS5pc0FycmF5KG1vZGVsKSAmJiBtb2RlbC5sZW5ndGggPiAwICYmIG1vZGVsWzBdICYmICFtb2RlbFsxXVxyXG4gICAgKTtcclxuICAgIGlmIChpc1BhcnRpYWxNb2RlbCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IHRoaXMuX292ZXJsYXlJbml0aWFsUHJlc2V0O1xyXG4gICAgICAvLyByZXNldCBpbnRlcm5hbCBtb2RlbCB0byBzeW5jZWQgdmFsdWVcclxuICAgICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fb3ZlcmxheUluaXRpYWxEYXRlID0gbnVsbDtcclxuICAgIHRoaXMuX292ZXJsYXlJbml0aWFsUHJlc2V0ID0gbnVsbDtcclxuICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XHJcbiAgICAvLyBjbGVhbnVwIGFueSBzdGFydC9lbmQgY2xhc3NlcyB0byBhdm9pZCBzdGFsZSBjbGFzc2VzXHJcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xyXG4gICAgLy8gc3RvcCBvYnNlcnZpbmdcclxuICAgIHRoaXMuX3N0b3BDYWxlbmRhck9ic2VydmVycygpO1xyXG4gIH1cclxuXHJcbiAgb25Nb2RlbENoYW5nZShkYXRlUmFuZ2U6IERhdGVbXSB8IG51bGwpIHtcclxuICAgIC8vIFdoZW4gdXNlciBjbGlja3MgYSBmaXJzdCBkYXRlLCBQcmltZU5HIG1heSBlbWl0IGFuIGFycmF5IHdpdGggMSB2YWx1ZS4gV2UgZG9uJ3Qgd2FudCB0b1xyXG4gICAgLy8gdXBkYXRlIHRoZSBleHRlcm5hbCBzZWxlY3RlZERhdGUgdW50aWwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlZCAodHdvIGRhdGVzKSBzbyB0aGF0XHJcbiAgICAvLyB0aGUgY2FsZW5kYXIgZG9lcyBub3QganVtcCBiYWNrIHRvIGEgcHJldmlvdXNseSBzZWxlY3RlZCBlbmQgZGF0ZSdzIG1vbnRoLlxyXG4gICAgdGhpcy5tb2RlbERhdGUgPSBkYXRlUmFuZ2UgPyBbLi4uZGF0ZVJhbmdlXSA6IG51bGw7XHJcbiAgICBpZiAoXHJcbiAgICAgIGRhdGVSYW5nZSAmJlxyXG4gICAgICBBcnJheS5pc0FycmF5KGRhdGVSYW5nZSkgJiZcclxuICAgICAgZGF0ZVJhbmdlLmxlbmd0aCA9PT0gMiAmJlxyXG4gICAgICBkYXRlUmFuZ2VbMF0gJiZcclxuICAgICAgZGF0ZVJhbmdlWzFdXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KGRhdGVSYW5nZVswXSwgZGF0ZVJhbmdlWzFdKTtcclxuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBbLi4uZGF0ZVJhbmdlXTtcclxuICAgICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIC8vIGNsb3NlIG92ZXJsYXkgbGlrZSB3aGVuIGFwcGx5aW5nIGEgcHJlc2V0XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTtcclxuICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgIH0gZWxzZSBpZiAoIWRhdGVSYW5nZSkge1xyXG4gICAgICAvLyBjbGVhcmVkIHNlbGVjdGlvblxyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcclxuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xyXG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KG51bGwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gc2luZ2xlIGRhdGUgc2VsZWN0aW5nIChwYXJ0aWFsIHJhbmdlKSAtIGRvIG5vdCBlbWl0IGNoYW5nZSB5ZXQ7IGp1c3Qga2VlcCBpbnRlcm5hbCBtb2RlbFxyXG4gICAgICAvLyBzbyB0aGUgY2FsZW5kYXIncyB2aWV3IHJlbWFpbnMgd2hlcmUgdGhlIHVzZXIgbmF2aWdhdGVkIHRvLlxyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcclxuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIHVwZGF0ZSBzdGFydC9lbmQgY2xhc3NlcyB3aGlsZSB1c2VyIGlzIHNlbGVjdGluZyBvciB3aGVuIHJhbmdlIGNvbXBsZXRlc1xyXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcclxuICB9XHJcblxyXG4gIC8vIENhbGxlZCB3aGVuIHRoZSBjYWxlbmRhcidzIHZpc2libGUgbW9udGgveWVhciBjaGFuZ2VzXHJcbiAgb25DYWxlbmRhclZpZXdDaGFuZ2VkKGV2ZW50PzogYW55KTogdm9pZCB7XHJcbiAgICAvLyBSZWFwcGx5IGNsYXNzZXMgYWZ0ZXIgUHJpbWVORyByZS1yZW5kZXJcclxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XHJcbiAgICAvLyBSZWF0dGFjaCBvYnNlcnZlcnMgYWZ0ZXIgYSBzbWFsbCBkZWxheSBzaW5jZSBQcmltZU5HIHdpbGwgbGlrZWx5IHJlcGxhY2UgRE9NIG5vZGVzXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcclxuICAgICAgICB0aGlzLl9zdGFydENhbGVuZGFyT2JzZXJ2ZXJzKCk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICB9LCA0MCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlICYmXHJcbiAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRGF0ZSkgJiZcclxuICAgICAgICAodGhpcy5zZWxlY3RlZERhdGUgYXMgRGF0ZVtdKS5sZW5ndGggPT09IDIgJiZcclxuICAgICAgICAhISh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pWzBdICYmXHJcbiAgICAgICAgISEodGhpcy5zZWxlY3RlZERhdGUgYXMgRGF0ZVtdKVsxXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm9ybWFsaXplRGF0ZShkOiBEYXRlKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIGQuZ2V0RGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTYW1lRGF0ZShhOiBEYXRlLCBiOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBhLmdldEZ1bGxZZWFyKCkgPT09IGIuZ2V0RnVsbFllYXIoKSAmJlxyXG4gICAgICBhLmdldE1vbnRoKCkgPT09IGIuZ2V0TW9udGgoKSAmJlxyXG4gICAgICBhLmdldERhdGUoKSA9PT0gYi5nZXREYXRlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRldGVjdFByZXNldChzdGFydFJhdzogRGF0ZSwgZW5kUmF3OiBEYXRlKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzdGFydCA9IHRoaXMubm9ybWFsaXplRGF0ZShzdGFydFJhdyk7XHJcbiAgICBjb25zdCBlbmQgPSB0aGlzLm5vcm1hbGl6ZURhdGUoZW5kUmF3KTtcclxuICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5ub3JtYWxpemVEYXRlKG5ldyBEYXRlKCkpO1xyXG4gICAgLy8gdG9kYXlcclxuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIHRvZGF5KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCB0b2RheSkpXHJcbiAgICAgIHJldHVybiAndG9kYXknO1xyXG4gICAgLy8geWVzdGVyZGF5XHJcbiAgICBjb25zdCB5ID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgeS5zZXREYXRlKHkuZ2V0RGF0ZSgpIC0gMSk7XHJcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCB5KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCB5KSlcclxuICAgICAgcmV0dXJuICd5ZXN0ZXJkYXknO1xyXG4gICAgLy8gbGFzdDdkYXlzIChsYXN0IDcgZGF5cyBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSA2LCBlbmQgPSB0b2RheSlcclxuICAgIGNvbnN0IGw3RW5kID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgY29uc3QgbDdTdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIGw3U3RhcnQuc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgLSA2KTtcclxuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGw3U3RhcnQpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIGw3RW5kKSlcclxuICAgICAgcmV0dXJuICdsYXN0N2RheXMnO1xyXG4gICAgLy8gbGFzdDMwZGF5cyAobGFzdCAzMCBkYXlzIGluY2x1ZGluZyB0b2RheTogc3RhcnQgPSB0b2RheSAtIDI5LCBlbmQgPSB0b2RheSlcclxuICAgIGNvbnN0IGwzMEVuZCA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIGNvbnN0IGwzMFN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgbDMwU3RhcnQuc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgLSAyOSk7XHJcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBsMzBTdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDMwRW5kKSlcclxuICAgICAgcmV0dXJuICdsYXN0MzBkYXlzJztcclxuICAgIC8vIGxhc3QzbW9udGhzIChsYXN0IDMgbW9udGhzIGluY2x1ZGluZyB0b2RheTogc3RhcnQgPSB0b2RheSAtIDMgbW9udGhzLCBlbmQgPSB0b2RheSlcclxuICAgIGNvbnN0IGwzbUVuZCA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIGNvbnN0IGwzbVN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgbDNtU3RhcnQuc2V0TW9udGgodG9kYXkuZ2V0TW9udGgoKSAtIDMpO1xyXG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgbDNtU3RhcnQpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIGwzbUVuZCkpXHJcbiAgICAgIHJldHVybiAnbGFzdDNtb250aHMnO1xyXG4gICAgLy8gbGFzdDZtb250aHMgKGxhc3QgNiBtb250aHMgaW5jbHVkaW5nIHRvZGF5OiBzdGFydCA9IHRvZGF5IC0gNiBtb250aHMsIGVuZCA9IHRvZGF5KVxyXG4gICAgY29uc3QgbDZtRW5kID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgY29uc3QgbDZtU3RhcnQgPSBuZXcgRGF0ZSh0b2RheSk7XHJcbiAgICBsNm1TdGFydC5zZXRNb250aCh0b2RheS5nZXRNb250aCgpIC0gNik7XHJcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBsNm1TdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDZtRW5kKSlcclxuICAgICAgcmV0dXJuICdsYXN0Nm1vbnRocyc7XHJcbiAgICAvLyBsYXN0MXllYXIgKGxhc3QgMSB5ZWFyIGluY2x1ZGluZyB0b2RheTogc3RhcnQgPSB0b2RheSAtIDEgeWVhciwgZW5kID0gdG9kYXkpXHJcbiAgICBjb25zdCBsMXlFbmQgPSBuZXcgRGF0ZSh0b2RheSk7XHJcbiAgICBjb25zdCBsMXlTdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIGwxeVN0YXJ0LnNldEZ1bGxZZWFyKHRvZGF5LmdldEZ1bGxZZWFyKCkgLSAxKTtcclxuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGwxeVN0YXJ0KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCBsMXlFbmQpKVxyXG4gICAgICByZXR1cm4gJ2xhc3QxeWVhcic7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGNsZWFyRGF0ZVJhbmdlKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xyXG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcclxuICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XHJcbiAgICB0aGlzLm1vZGVsRGF0ZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICByZXNldEFuZENsb3NlKCkge1xyXG4gICAgdGhpcy5jbGVhckRhdGVSYW5nZSgpO1xyXG4gICAgaWYgKHRoaXMub3ZlcmxheVBhbmVsKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5vdmVybGF5UGFuZWwuaGlkZSgpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJBbmRTdG9wKGV2ZW50OiBFdmVudCkge1xyXG4gICAgdGhpcy5jbGVhckRhdGVSYW5nZSgpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTtcclxuICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUN1c3RvbVJhbmdlKCkge1xyXG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSAhdGhpcy5jdXN0b21SYW5nZU1vZGU7XHJcbiAgICBpZiAodGhpcy5jdXN0b21SYW5nZU1vZGUpIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSAnY3VzdG9tJztcclxuICB9XHJcblxyXG4gIGFwcGx5Q3VzdG9tUmFuZ2UoKSB7XHJcbiAgICAvLyBlbnN1cmUgZXh0ZXJuYWwgc2VsZWN0ZWREYXRlIGlzIGluIHN5bmMgd2l0aCBpbnRlcm5hbCBtb2RlbFxyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSB0aGlzLm1vZGVsRGF0ZSA/IFsuLi50aGlzLm1vZGVsRGF0ZV0gOiBudWxsO1xyXG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICBpZiAodGhpcy5vdmVybGF5UGFuZWwpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLm92ZXJsYXlQYW5lbC5oaWRlKCk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3RlZFByZXNldCA9ICdjdXN0b20nO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZVJhbmdlTGFiZWwoKSB7XHJcbiAgICAvLyBDaGVjayB0aGUgaW50ZXJuYWwgbW9kZWwgZmlyc3QgdG8gc2hvdyByZWFsLXRpbWUgdXBkYXRlcyB3aGlsZSBzZWxlY3RpbmdcclxuICAgIGNvbnN0IGRhdGVBcnJheSA9IHRoaXMubW9kZWxEYXRlIHx8IHRoaXMuc2VsZWN0ZWREYXRlO1xyXG4gICAgaWYgKCFkYXRlQXJyYXkgfHwgIUFycmF5LmlzQXJyYXkoZGF0ZUFycmF5KSkgcmV0dXJuICcnO1xyXG5cclxuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IGRhdGVBcnJheSBhcyAoRGF0ZSB8IG51bGwpW107XHJcbiAgICBjb25zdCBhcnJvdyA9ICdcXHUyNzk0JztcclxuXHJcbiAgICAvLyBTaG93IGp1c3QgdGhlIGZpcnN0IGRhdGUgd2l0aCBhbiBhcnJvdyBpZiBvbmx5IGZpcnN0IGRhdGUgaXMgc2VsZWN0ZWRcclxuICAgIGlmIChzdGFydCAmJiAhZW5kKSB7XHJcbiAgICAgIGNvbnN0IHN0YXJ0U3RyID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oc3RhcnQsICdNTS9kZC95eXl5Jyk7XHJcbiAgICAgIHJldHVybiBgJHtzdGFydFN0cn0gJHthcnJvd30gYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTaG93IHRoZSBjb21wbGV0ZSByYW5nZSBpZiBib3RoIGRhdGVzIGFyZSBzZWxlY3RlZFxyXG4gICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xyXG4gICAgICBjb25zdCBzdGFydFN0ciA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHN0YXJ0LCAnTU0vZGQveXl5eScpO1xyXG4gICAgICBjb25zdCBlbmRTdHIgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShlbmQsICdNTS9kZC95eXl5Jyk7XHJcbiAgICAgIHJldHVybiBgJHtzdGFydFN0cn0gJHthcnJvd30gJHtlbmRTdHJ9YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBhcHBseVByZXNldChcclxuICAgIHByZXNldDpcclxuICAgICAgfCAndG9kYXknXHJcbiAgICAgIHwgJ3llc3RlcmRheSdcclxuICAgICAgfCAnbGFzdDdkYXlzJ1xyXG4gICAgICB8ICdsYXN0MzBkYXlzJ1xyXG4gICAgICB8ICdsYXN0M21vbnRocydcclxuICAgICAgfCAnbGFzdDZtb250aHMnXHJcbiAgICAgIHwgJ2xhc3QxeWVhcidcclxuICApIHtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIGxldCBzdGFydDogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgbGV0IGVuZDogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgc3dpdGNoIChwcmVzZXQpIHtcclxuICAgICAgY2FzZSAndG9kYXknOlxyXG4gICAgICAgIHN0YXJ0ID0gZW5kID0gbmV3IERhdGUoXHJcbiAgICAgICAgICB0b2RheS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgICAgdG9kYXkuZ2V0TW9udGgoKSxcclxuICAgICAgICAgIHRvZGF5LmdldERhdGUoKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3llc3RlcmRheSc6XHJcbiAgICAgICAgY29uc3QgeSA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgICAgICB5LnNldERhdGUoeS5nZXREYXRlKCkgLSAxKTtcclxuICAgICAgICBzdGFydCA9IGVuZCA9IG5ldyBEYXRlKHkuZ2V0RnVsbFllYXIoKSwgeS5nZXRNb250aCgpLCB5LmdldERhdGUoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2xhc3Q3ZGF5cyc6IHtcclxuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xyXG4gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoZW5kKTtcclxuICAgICAgICBzdGFydC5zZXREYXRlKGVuZC5nZXREYXRlKCkgLSA2KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdsYXN0MzBkYXlzJzoge1xyXG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XHJcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xyXG4gICAgICAgIHN0YXJ0LnNldERhdGUoZW5kLmdldERhdGUoKSAtIDI5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdsYXN0M21vbnRocyc6IHtcclxuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xyXG4gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoZW5kKTtcclxuICAgICAgICBzdGFydC5zZXRNb250aChlbmQuZ2V0TW9udGgoKSAtIDMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ2xhc3Q2bW9udGhzJzoge1xyXG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XHJcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xyXG4gICAgICAgIHN0YXJ0LnNldE1vbnRoKGVuZC5nZXRNb250aCgpIC0gNik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnbGFzdDF5ZWFyJzoge1xyXG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XHJcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xyXG4gICAgICAgIHN0YXJ0LnNldEZ1bGxZZWFyKGVuZC5nZXRGdWxsWWVhcigpIC0gMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBbc3RhcnQsIGVuZF07XHJcbiAgICAgIHRoaXMubW9kZWxEYXRlID0gW3N0YXJ0LCBlbmRdO1xyXG4gICAgICBpZiAodGhpcy5wcmVzZXJ2ZVByZXNldCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gW3N0YXJ0LCBlbmQsIHsgcHJlc2V0czogcHJlc2V0IH1dO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0O1xyXG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTtcclxuICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAvLyBlbnN1cmUgd2UgdXBkYXRlIHN0YXJ0L2VuZCBjbGFzc2VzIGFmdGVyIGFwcGx5aW5nIGEgcHJlc2V0XHJcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25EYXRlUmFuZ2VDaGFuZ2UoZGF0ZVJhbmdlOiBEYXRlW10gfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KGRhdGVSYW5nZSk7XHJcbiAgICBpZiAoZGF0ZVJhbmdlICYmIEFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gdGhpcy5kZXRlY3RQcmVzZXQoZGF0ZVJhbmdlWzBdLCBkYXRlUmFuZ2VbMV0pO1xyXG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICghZGF0ZVJhbmdlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xyXG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3RvcENhbGVuZGFyT2JzZXJ2ZXJzKCk7XHJcbiAgICB0aGlzLl9jYW5jZWxTY2hlZHVsZWRVcGRhdGUoKTtcclxuICB9XHJcblxyXG4gIC8vIFdhbGsgdGhlIHJlbmRlcmVkIGNhbGVuZGFyIERPTShzKSAob3ZlcmxheSArIGlubGluZSkgYW5kIGFkZCBzdGFydC1yYW5nZS9lbmQtcmFuZ2UgY2xhc3Nlc1xyXG4gIHByaXZhdGUgX3VwZGF0ZVN0YXJ0RW5kUmFuZ2VDbGFzc2VzKCk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgY2FsZW5kYXJFbGVtZW50cyA9IHRoaXMuX2dldENhbGVuZGFyRWxlbWVudHMoKTtcclxuXHJcbiAgICAgIGNhbGVuZGFyRWxlbWVudHMuZm9yRWFjaCgoY2FsRWw6IEVsZW1lbnQpID0+IHtcclxuICAgICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgY2xhc3NlcyBmcm9tIHNwYW5zIGZpcnN0XHJcbiAgICAgICAgY29uc3QgYWxsU3BhbnMgPSBjYWxFbC5xdWVyeVNlbGVjdG9yQWxsKCd0ZCA+IHNwYW4nKTtcclxuICAgICAgICBhbGxTcGFucy5mb3JFYWNoKChzcGFuKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHNwYW4sICdzdGFydC1yYW5nZScpO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhzcGFuLCAnZW5kLXJhbmdlJyk7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHNwYW4sICdiZXR3ZWVuLXJhbmdlJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENvbGxlY3Qgc3Bhbi9kYXRlIHBhaXJzLCBwcmVmZXIgZGF0YS1kYXRlIGF0dHJpYnV0ZVxyXG4gICAgICAgIC8vIENhY2hlIGhlYWRlciBtb250aC95ZWFyIGZvciB0aGlzIGNhbGVuZGFyIHRvIGF2b2lkIHF1ZXJ5aW5nIHBlci1zcGFuXHJcbiAgICAgICAgY29uc3QgcGFuZWxOb2RlID0gY2FsRWwuY2xvc2VzdCgnLnAtZGF0ZXBpY2tlcicpIHx8IGNhbEVsO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck1vbnRoTm9kZSA9IChwYW5lbE5vZGUgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgICcucC1kYXRlcGlja2VyLWhlYWRlciAucC1kYXRlcGlja2VyLXRpdGxlIC5wLWRhdGVwaWNrZXItbW9udGgnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJZZWFyTm9kZSA9IChwYW5lbE5vZGUgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgICcucC1kYXRlcGlja2VyLWhlYWRlciAucC1kYXRlcGlja2VyLXRpdGxlIC5wLWRhdGVwaWNrZXIteWVhcidcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck1vbnRoSWR4ID1cclxuICAgICAgICAgIGhlYWRlck1vbnRoTm9kZSAmJiBoZWFkZXJNb250aE5vZGUudGV4dENvbnRlbnRcclxuICAgICAgICAgICAgPyAodGhpcy5lbkxvY2FsZS5tb250aE5hbWVzIHx8IFtdKS5pbmRleE9mKFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyTW9udGhOb2RlLnRleHRDb250ZW50LnRyaW0oKVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgOiBOYU47XHJcbiAgICAgICAgY29uc3QgaGVhZGVyWWVhclZhbCA9XHJcbiAgICAgICAgICBoZWFkZXJZZWFyTm9kZSAmJiBoZWFkZXJZZWFyTm9kZS50ZXh0Q29udGVudFxyXG4gICAgICAgICAgICA/IHBhcnNlSW50KGhlYWRlclllYXJOb2RlLnRleHRDb250ZW50LnRyaW0oKSwgMTApXHJcbiAgICAgICAgICAgIDogTmFOO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zOiB7IGR0OiBEYXRlOyBzcGFuOiBFbGVtZW50OyB0ZD86IEhUTUxFbGVtZW50IHwgbnVsbCB9W10gPVxyXG4gICAgICAgICAgW107XHJcbiAgICAgICAgY29uc3Qgc3BhbnMgPSBjYWxFbC5xdWVyeVNlbGVjdG9yQWxsKCd0ZCA+IHNwYW4ucC1oaWdobGlnaHQnKTtcclxuICAgICAgICBzcGFucy5mb3JFYWNoKChzcGFuKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB0ZCA9IHNwYW4uY2xvc2VzdCgndGQnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICAgICAgICAvLyBUcnkgdG8gcmVhZCBkYXRhLWRhdGUgYXR0cmlidXRlLCB3aGljaCBzb21lIFByaW1lTkcgdmVyc2lvbnMgcmVuZGVyIG9uIHNwYW4vdGRcclxuICAgICAgICAgIGxldCBkYXRhRGF0ZSA9IHNwYW4uZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGUnKTtcclxuICAgICAgICAgIGlmICghZGF0YURhdGUgJiYgdGQpIGRhdGFEYXRlID0gdGQuZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGUnKTtcclxuICAgICAgICAgIGlmIChkYXRhRGF0ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGRhdGFEYXRlLnNwbGl0KCctJykubWFwKChwKSA9PiBwYXJzZUludChwLCAxMCkpO1xyXG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID49IDMgJiYgcGFydHMuZXZlcnkoKG4pID0+ICFpc05hTihuKSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBbeSwgbSwgZF0gPSBwYXJ0cztcclxuICAgICAgICAgICAgICBjb25zdCBkdCA9IG5ldyBEYXRlKHksIG0gLSAxLCBkKTtcclxuICAgICAgICAgICAgICBpdGVtcy5wdXNoKHsgZHQsIHRkLCBzcGFuIH0pO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRmFsbGJhY2s6IHBhcnNlIGRheSBudW1iZXIgYW5kIGluZmVyIG1vbnRoL3llYXIgZnJvbSBuZWFyYnkgaGVhZGVyIGluIHRoZSBzYW1lIC5wLWRhdGVwaWNrZXJcclxuICAgICAgICAgIGNvbnN0IGRheVRleHQgPSAoc3Bhbi50ZXh0Q29udGVudCB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQoZGF5VGV4dCwgMTApO1xyXG4gICAgICAgICAgaWYgKCFpc05hTihkYXkpICYmIHRkKSB7XHJcbiAgICAgICAgICAgIC8vIFVzZSBjYWNoZWQgaGVhZGVyIG1vbnRoL3llYXIgd2hlbiBhdmFpbGFibGVcclxuICAgICAgICAgICAgaWYgKCFpc05hTihoZWFkZXJNb250aElkeCkgJiYgIWlzTmFOKGhlYWRlclllYXJWYWwpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZShoZWFkZXJZZWFyVmFsLCBoZWFkZXJNb250aElkeCwgZGF5KTtcclxuICAgICAgICAgICAgICBpdGVtcy5wdXNoKHsgZHQsIHRkLCBzcGFuIH0pO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gbGFzdCByZXNvcnQ6IGlnbm9yZSBzcGFuIGlmIGRhdGUgY2Fubm90IGJlIGRldGVybWluZWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBTb3J0IGl0ZW1zIHRvIGZpbmQgbWluL21heCAoc3RhcnQgJiBlbmQpXHJcbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4gYS5kdC5nZXRUaW1lKCkgLSBiLmR0LmdldFRpbWUoKSk7XHJcbiAgICAgICAgY29uc3QgZGV0ZWN0ZWRTdGFydCA9IGl0ZW1zWzBdLmR0O1xyXG4gICAgICAgIGNvbnN0IGRldGVjdGVkRW5kID0gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0uZHQ7XHJcblxyXG4gICAgICAgIC8vIFByZWZlcnJlZCByYW5nZSBpcyBtb2RlbERhdGUvc2VsZWN0ZWREYXRlIGlmIHByZXNlbnRcclxuICAgICAgICBjb25zdCByYW5nZSA9XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZS5sZW5ndGggPT09IDJcclxuICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRGF0ZVxyXG4gICAgICAgICAgICA6IHRoaXMubW9kZWxEYXRlICYmIHRoaXMubW9kZWxEYXRlLmxlbmd0aCA9PT0gMlxyXG4gICAgICAgICAgICAgID8gdGhpcy5tb2RlbERhdGVcclxuICAgICAgICAgICAgICA6IFtkZXRlY3RlZFN0YXJ0LCBkZXRlY3RlZEVuZF07XHJcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID1cclxuICAgICAgICAgIHJhbmdlICYmIHJhbmdlWzBdXHJcbiAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVEYXRlKHJhbmdlWzBdIGFzIERhdGUpXHJcbiAgICAgICAgICAgIDogZGV0ZWN0ZWRTdGFydDtcclxuICAgICAgICBjb25zdCBlbmREYXRlID1cclxuICAgICAgICAgIHJhbmdlICYmIHJhbmdlWzFdXHJcbiAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVEYXRlKHJhbmdlWzFdIGFzIERhdGUpXHJcbiAgICAgICAgICAgIDogZGV0ZWN0ZWRFbmQ7XHJcblxyXG4gICAgICAgIC8vIEZvciBlYWNoIGl0ZW0sIGFkZCBzdGFydC1yYW5nZSxlbmQtcmFuZ2UsIG9yIGJldHdlZW4tcmFuZ2UgYmFzZWQgb24gZGF0ZVxyXG4gICAgICAgIGNvbnN0IHNUaW1lID0gc3RhcnREYXRlLmdldFRpbWUoKTtcclxuICAgICAgICBjb25zdCBlVGltZSA9IGVuZERhdGUuZ2V0VGltZSgpO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgaXRlbXMpIHtcclxuICAgICAgICAgIGNvbnN0IHQgPSBpdC5kdC5nZXRUaW1lKCk7XHJcbiAgICAgICAgICBpZiAoc1RpbWUgPT09IGVUaW1lICYmIHQgPT09IHNUaW1lKSB7XHJcbiAgICAgICAgICAgIC8vIHNpbmdsZS1kYXkgcmFuZ2UsIG1hcmsgYm90aCBzdGFydCAmIGVuZFxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0LnNwYW4sICdzdGFydC1yYW5nZScpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0LnNwYW4sICdlbmQtcmFuZ2UnKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodCA9PT0gc1RpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdC5zcGFuLCAnc3RhcnQtcmFuZ2UnKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodCA9PT0gZVRpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdC5zcGFuLCAnZW5kLXJhbmdlJyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHQgPiBzVGltZSAmJiB0IDwgZVRpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdC5zcGFuLCAnYmV0d2Vlbi1yYW5nZScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIGlnbm9yZSBET00gZXJyb3JzIChlLmcuLCBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgLyBtaXNzaW5nIGVsZW1lbnRzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc29EYXRlKGQ6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgeSA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IG0gPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIHJldHVybiBgJHt5fS0ke219LSR7ZGF5fWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9maW5kRWxlbWVudEJ5RGF0ZShkYXRlPzogRGF0ZSk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghZGF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBtID0gZGF0ZS5nZXRNb250aCgpICsgMTsgLy8gMS4uMTJcclxuICAgIGNvbnN0IGQgPSBkYXRlLmdldERhdGUoKTtcclxuICAgIGNvbnN0IGlzb1VucGFkZGVkID0gYCR7eX0tJHttfS0ke2R9YDsgLy8gZS5nLiAyMDI1LTExLTFcclxuICAgIGNvbnN0IGlzb1BhZGRlZCA9IGAke3l9LSR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsICcwJyl9LSR7U3RyaW5nKGQpLnBhZFN0YXJ0KDIsICcwJyl9YDsgLy8gMjAyNS0xMS0wMVxyXG4gICAgY29uc3Qgc2VsZWN0b3JzID0gW1xyXG4gICAgICBgW2RhdGEtZGF0ZT1cIiR7aXNvVW5wYWRkZWR9XCJdYCxcclxuICAgICAgYFtkYXRhLWRhdGU9XCIke2lzb1BhZGRlZH1cIl1gLFxyXG4gICAgXTtcclxuICAgIGZvciAoY29uc3Qgc2VsIG9mIHNlbGVjdG9ycykge1xyXG4gICAgICBjb25zdCBmb3VuZEluT3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgYC5hdG9taXgtb3ZlcmxheS1jYWxlbmRhciAke3NlbH1gXHJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgICBpZiAoZm91bmRJbk92ZXJsYXkpXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIChmb3VuZEluT3ZlcmxheS5jbG9zZXN0KCd0ZCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbCkgfHwgZm91bmRJbk92ZXJsYXlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBzZWwgb2Ygc2VsZWN0b3JzKSB7XHJcbiAgICAgIGNvbnN0IGZvdW5kID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gKGZvdW5kLmNsb3Nlc3QoJ3RkJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKSB8fCBmb3VuZDtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdGFydENhbGVuZGFyT2JzZXJ2ZXJzKCk6IHZvaWQge1xyXG4gICAgLy8gc3RvcCBmaXJzdCB0byBhdm9pZCBkdXBsaWNhdGVzXHJcbiAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhbEVscyA9IHRoaXMuX2dldENhbGVuZGFyRWxlbWVudHMoKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMub3ZlcmxheVBhbmVsIGFzIGFueTtcclxuICAgICAgICBpZiAocGFuZWwgJiYgcGFuZWwuZWwgJiYgcGFuZWwuZWwubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgY29uc3QgZWwgPSBwYW5lbC5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGVwaWNrZXInKTtcclxuICAgICAgICAgIGlmIChlbCkgY2FsRWxzLnB1c2goZWwgYXMgRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7fVxyXG5cclxuICAgICAgY2FsRWxzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gUmVhcHBseSBjbGFzc2VzIGFmdGVyIERPTSBjaGFuZ2VzIChkZWJvdW5jZWQpXHJcbiAgICAgICAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFdhdGNoIGNoaWxkTGlzdCwgc3VidHJlZSBhbmQgY2xhc3MgYXR0cmlidXRlIGNoYW5nZXMgKHNwYW4gY2xhc3MgdG9nZ2xlcyBhcmUgY29tbW9uKVxyXG4gICAgICAgIG9icy5vYnNlcnZlKGVsLCB7XHJcbiAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxyXG4gICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcclxuICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzLnB1c2gob2JzKTtcclxuICAgICAgICB0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLnB1c2goZWwpO1xyXG4gICAgICAgIC8vIEFsc28gb2JzZXJ2ZSBwYXJlbnQgLSBpZiBQcmltZU5HIHJlcGxhY2VzIHRoZSAucC1kYXRlcGlja2VyIGVsZW1lbnQsIHBhcmVudCBjaGlsZExpc3QgY2hhbmdlcyB3aWxsIGZpcmVcclxuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGlmIChwYXJlbnQgJiYgdGhpcy5fb2JzZXJ2ZWRQYXJlbnRFbGVtZW50cy5pbmRleE9mKHBhcmVudCkgPT09IC0xKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJlbnRPYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHJlYXR0YWNoIG9ic2VydmVycyBzaW5jZSB0aGUgY2FsRWwgbWF5IGhhdmUgYmVlbiByZXBsYWNlZFxyXG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAvLyBkZXRhY2ggYW5kIHJlLWF0dGFjaCBvYnNlcnZlcnMgYWZ0ZXIgRE9NIHNldHRsZXNcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3BDYWxlbmRhck9ic2VydmVycygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRDYWxlbmRhck9ic2VydmVycygpO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgICAgIH0sIDEwMCk7IC8vIHNsaWdodGx5IGxhcmdlciBkZWxheSB0byBsZXQgUHJpbWVORyBmaW5pc2ggdGhlIG1vbnRoIHJlbmRlcmluZ1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBwYXJlbnRPYnMub2JzZXJ2ZShwYXJlbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiBmYWxzZSB9KTtcclxuICAgICAgICAgIHRoaXMuX3BhcmVudE9ic2VydmVycy5wdXNoKHBhcmVudE9icyk7XHJcbiAgICAgICAgICB0aGlzLl9vYnNlcnZlZFBhcmVudEVsZW1lbnRzLnB1c2gocGFyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyBpZ25vcmVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N0b3BDYWxlbmRhck9ic2VydmVycygpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzLmZvckVhY2goKG9icykgPT4gb2JzLmRpc2Nvbm5lY3QoKSk7XHJcbiAgICAgIHRoaXMuX3BhcmVudE9ic2VydmVycy5mb3JFYWNoKChvYnMpID0+IG9icy5kaXNjb25uZWN0KCkpO1xyXG4gICAgfSBjYXRjaCAoZSkge31cclxuICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzID0gW107XHJcbiAgICB0aGlzLl9vYnNlcnZlZEVsZW1lbnRzID0gW107XHJcbiAgICB0aGlzLl9wYXJlbnRPYnNlcnZlcnMgPSBbXTtcclxuICAgIHRoaXMuX29ic2VydmVkUGFyZW50RWxlbWVudHMgPSBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NjaGVkdWxlVXBkYXRlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3VwZGF0ZVJhZklkICE9IG51bGwpIHJldHVybjsgLy8gYWxyZWFkeSBzY2hlZHVsZWRcclxuICAgIHRoaXMuX3VwZGF0ZVJhZklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZVJhZklkID0gbnVsbDtcclxuICAgICAgdGhpcy5fdXBkYXRlU3RhcnRFbmRSYW5nZUNsYXNzZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuY2VsU2NoZWR1bGVkVXBkYXRlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3VwZGF0ZVJhZklkICE9IG51bGwpIHtcclxuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3VwZGF0ZVJhZklkKTtcclxuICAgICAgdGhpcy5fdXBkYXRlUmFmSWQgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Q2FsZW5kYXJFbGVtZW50cygpOiBFbGVtZW50W10ge1xyXG4gICAgY29uc3QgY2FsRWxzOiBFbGVtZW50W10gPSBbXTtcclxuICAgIGNvbnN0IG92ZXJsYXlDYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAnLmF0b21peC1vdmVybGF5LWNhbGVuZGFyIC5wLWRhdGVwaWNrZXInXHJcbiAgICApO1xyXG4gICAgY29uc3QgaW5saW5lQ2FsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlubGluZS1jYWxlbmRhciAucC1kYXRlcGlja2VyJyk7XHJcbiAgICBpZiAob3ZlcmxheUNhbCkgY2FsRWxzLnB1c2gob3ZlcmxheUNhbCk7XHJcbiAgICBpZiAoaW5saW5lQ2FsKSBjYWxFbHMucHVzaChpbmxpbmVDYWwpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLm92ZXJsYXlQYW5lbCBhcyBhbnk7XHJcbiAgICAgIGlmIChwYW5lbCAmJiBwYW5lbC5lbCAmJiBwYW5lbC5lbC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgZWwgPSBwYW5lbC5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGVwaWNrZXInKTtcclxuICAgICAgICBpZiAoZWwpIGNhbEVscy5wdXNoKGVsIGFzIEVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXNcclxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoY2FsRWxzKSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXY+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpbmxpbmU7IGVsc2UgaW5saW5lQmxvY2tcIj5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiIGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICBwSW5wdXRUZXh0XHJcbiAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImlucHV0U3R5bGVDbGFzc1wiXHJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICBbdmFsdWVdPVwiZ2V0RGF0ZVJhbmdlTGFiZWwoKVwiXHJcbiAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIChjbGljayk9XCJvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcclxuICAgICAgLz5cclxuICAgICAgPGlcclxuICAgICAgICBjbGFzcz1cInBpIHBpLWNhbGVuZGFyIGlucHV0LWljb25cIlxyXG4gICAgICAgIHRpdGxlPVwiT3BlbiBjYWxlbmRhclwiXHJcbiAgICAgICAgKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiBvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgPjwvaT5cclxuICAgICAgPGlcclxuICAgICAgICAqbmdJZj1cImhhc1NlbGVjdGlvblwiXHJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS10aW1lcyBpbnB1dC1jbGVhci1pY29uXCJcclxuICAgICAgICB0aXRsZT1cIkNsZWFyXCJcclxuICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgIChjbGljayk9XCIhZGlzYWJsZWQgJiYgY2xlYXJBbmRTdG9wKCRldmVudClcIlxyXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cIiFkaXNhYmxlZCAmJiBjbGVhckFuZFN0b3AoJGV2ZW50KVwiXHJcbiAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiIWRpc2FibGVkICYmIGNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcclxuICAgICAgPjwvaT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxwLW92ZXJsYXlQYW5lbFxyXG4gICAgICAjb3ZlcmxheVBhbmVsXHJcbiAgICAgIFtkaXNtaXNzYWJsZV09XCJ0cnVlXCJcclxuICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgc3R5bGVDbGFzcz1cImF0b21peC1kYXRlLXJhbmdlLW92ZXJsYXlcIlxyXG4gICAgICAob25TaG93KT1cIm9uT3ZlcmxheVNob3coKVwiXHJcbiAgICAgIChvbkhpZGUpPVwib25PdmVybGF5SGlkZSgpXCJcclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW5uZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1sZWZ0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJlc2V0LWxpc3RcIj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgICBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ3RvZGF5JylcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3RvZGF5JyB9XCJcclxuICAgICAgICAgICAgICBsYWJlbD1cIlRvZGF5XCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgneWVzdGVyZGF5JylcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3llc3RlcmRheScgfVwiXHJcbiAgICAgICAgICAgICAgbGFiZWw9XCJZZXN0ZXJkYXlcIlxyXG4gICAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0N2RheXMnKVwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDdkYXlzJyB9XCJcclxuICAgICAgICAgICAgICBsYWJlbD1cIkxhc3QgNyBkYXlzXCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDMwZGF5cycpXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0MzBkYXlzJyB9XCJcclxuICAgICAgICAgICAgICBsYWJlbD1cIkxhc3QgMzAgZGF5c1wiXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgICBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3QzbW9udGhzJylcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzbW9udGhzJyB9XCJcclxuICAgICAgICAgICAgICBsYWJlbD1cIkxhc3QgMyBtb250aHNcIlxyXG4gICAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0Nm1vbnRocycpXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0Nm1vbnRocycgfVwiXHJcbiAgICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDYgbW9udGhzXCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDF5ZWFyJylcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QxeWVhcicgfVwiXHJcbiAgICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDEgeWVhclwiXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJyZXNldC1saW5rXCIgKGNsaWNrKT1cInJlc2V0QW5kQ2xvc2UoKVwiPlJlc2V0PC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktcmlnaHRcIj5cclxuICAgICAgICAgIDxwLWNhbGVuZGFyXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwibW9kZWxEYXRlXCJcclxuICAgICAgICAgICAgW3NlbGVjdGlvbk1vZGVdPVwiJ3JhbmdlJ1wiXHJcbiAgICAgICAgICAgIFtpbmxpbmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cIidtbS9kZC95eXl5J1wiXHJcbiAgICAgICAgICAgIFtzaG93T3RoZXJNb250aHNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFtsb2NhbGVdPVwiZW5Mb2NhbGVcIlxyXG4gICAgICAgICAgICBbc2hvd0ljb25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBbc3R5bGVDbGFzc109XCInYXRvbWl4LW92ZXJsYXktY2FsZW5kYXInXCJcclxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG9uTW9udGhDaGFuZ2UpPVwib25DYWxlbmRhclZpZXdDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAob25ZZWFyQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgW21heERhdGVdPVwibWF4RGF0ZVwiXHJcbiAgICAgICAgICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxyXG4gICAgICAgICAgPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8bmctdGVtcGxhdGUgI2lubGluZUJsb2NrPlxyXG4gICAgPGRpdiBbbmdDbGFzc109XCJzdHlsZUNsYXNzXCIgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgIHBJbnB1dFRleHRcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiaW5wdXRTdHlsZUNsYXNzXCJcclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJnZXREYXRlUmFuZ2VMYWJlbCgpXCJcclxuICAgICAgICByZWFkb25seVxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXHJcbiAgICAgIC8+XHJcbiAgICAgIDxpIGNsYXNzPVwicGkgcGktY2FsZW5kYXIgaW5wdXQtaWNvblwiIHRpdGxlPVwiT3BlbiBjYWxlbmRhclwiPjwvaT5cclxuICAgICAgPGlcclxuICAgICAgICAqbmdJZj1cImhhc1NlbGVjdGlvblwiXHJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS10aW1lcyBpbnB1dC1jbGVhci1pY29uXCJcclxuICAgICAgICB0aXRsZT1cIkNsZWFyXCJcclxuICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgIChjbGljayk9XCJjbGVhckFuZFN0b3AoJGV2ZW50KVwiXHJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2xlYXJBbmRTdG9wKCRldmVudClcIlxyXG4gICAgICAgIChrZXlkb3duLnNwYWNlKT1cImNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcclxuICAgICAgPjwvaT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW5uZXIgaW5saW5lLWNhbGVuZGFyIGZsZXhcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktbGVmdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmVzZXQtbGlzdFwiPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgndG9kYXknKVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3RvZGF5JyB9XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJUb2RheVwiXHJcbiAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCd5ZXN0ZXJkYXknKVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3llc3RlcmRheScgfVwiXHJcbiAgICAgICAgICAgIGxhYmVsPVwiWWVzdGVyZGF5XCJcclxuICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICBwUmlwcGxlXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3Q3ZGF5cycpXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDdkYXlzJyB9XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDcgZGF5c1wiXHJcbiAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MzBkYXlzJylcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0MzBkYXlzJyB9XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMwIGRheXNcIlxyXG4gICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDNtb250aHMnKVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzbW9udGhzJyB9XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMgbW9udGhzXCJcclxuICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICBwUmlwcGxlXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3QxeWVhcicpXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDF5ZWFyJyB9XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDEgeWVhclwiXHJcbiAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICA8YSBjbGFzcz1cInJlc2V0LWxpbmtcIiAoY2xpY2spPVwicmVzZXRBbmRDbG9zZSgpXCI+UmVzZXQ8L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1yaWdodFwiPlxyXG4gICAgICAgIDxwLWNhbGVuZGFyXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsRGF0ZVwiXHJcbiAgICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCIncmFuZ2UnXCJcclxuICAgICAgICAgIFtpbmxpbmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICBbZGF0ZUZvcm1hdF09XCInbW0vZGQveXl5eSdcIlxyXG4gICAgICAgICAgW3Nob3dPdGhlck1vbnRoc109XCJ0cnVlXCJcclxuICAgICAgICAgIFtsb2NhbGVdPVwiZW5Mb2NhbGVcIlxyXG4gICAgICAgICAgW3Nob3dJY29uXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtzdHlsZUNsYXNzXT1cIidhdG9taXgtb3ZlcmxheS1jYWxlbmRhcidcIlxyXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChvbk1vbnRoQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgIChvblllYXJDaGFuZ2UpPVwib25DYWxlbmRhclZpZXdDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxyXG4gICAgICAgICAgW21pbkRhdGVdPVwibWluRGF0ZVwiXHJcbiAgICAgICAgPjwvcC1jYWxlbmRhcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2Rpdj5cclxuIl19
717
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmltZWtpdC9zcmMvbGliL2xpYi9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbWVraXQvc3JjL2xpYi9saWIvYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQU1WLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVN2QixNQUFNLE9BQU8sZ0NBQWdDO0lBMEZqQztJQUNBO0lBeEZELFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUN4QixhQUFhLEdBQVksT0FBTyxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLFlBQVksR0FBUSxJQUFJLENBQUM7SUFDekIsT0FBTyxDQUFRO0lBQ2YsT0FBTyxDQUFRO0lBQ2YsYUFBYSxHQVFYLElBQUksQ0FBQztJQUNQLGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMsYUFBYSxHQUFxQyxFQUFFLENBQUM7SUFDckQsb0JBQW9CLEdBQWtCLElBQUksQ0FBQztJQUUxQyxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRXpELGVBQWUsR0FBWSxLQUFLLENBQUM7SUFDakMsY0FBYyxHQUFrQixJQUFJLENBQUMsQ0FBQyxxSEFBcUg7SUFDaEksWUFBWSxD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QWM7c0JBQXRCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUksaUJBQWlCO3NCQUExQixNQUFNO2dCQUlvQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ2YsZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPdmVybGF5UGFuZWwgfSBmcm9tICdwcmltZW5nL292ZXJsYXlwYW5lbCc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQXRvbWl4RGF0ZXJhbmdlQ2FsZW5kYXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc3R5bGVDbGFzczogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNlbGVjdGlvbk1vZGU6ICdyYW5nZScgPSAncmFuZ2UnO1xuICBASW5wdXQoKSBpbnB1dFN0eWxlQ2xhc3M6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpbmxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRlOiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBtYXhEYXRlITogRGF0ZTtcbiAgQElucHV0KCkgbWluRGF0ZSE6IERhdGU7XG4gIEBJbnB1dCgpIGRlZmF1bHRQcmVzZXQ6XG4gICAgfCAndG9kYXknXG4gICAgfCAneWVzdGVyZGF5J1xuICAgIHwgJ2xhc3Q3ZGF5cydcbiAgICB8ICdsYXN0MzBkYXlzJ1xuICAgIHwgJ2xhc3QzbW9udGhzJ1xuICAgIHwgJ2xhc3Q2bW9udGhzJ1xuICAgIHwgJ2xhc3QxeWVhcidcbiAgICB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBwcmVzZXJ2ZVByZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjdXN0b21QcmVzZXRzOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3RlZEN1c3RvbVByZXNldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQE91dHB1dCgpIGN1c3RvbVByZXNldENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgY3VzdG9tUmFuZ2VNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkUHJlc2V0OiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gJ3RvZGF5JyB8ICd5ZXN0ZXJkYXknIHwgJ2xhc3Q3ZGF5cycgfCAnbGFzdDMwZGF5cycgfCAnbGFzdDNtb250aHMnIHwgJ2xhc3Q2bW9udGhzJyB8ICdsYXN0MXllYXInIHwgJ2N1c3RvbScgfCBudWxsXG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlQYW5lbCcpIG92ZXJsYXlQYW5lbD86IE92ZXJsYXlQYW5lbDtcbiAgQE91dHB1dCgpIGRhdGVSYW5nZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vIGludGVybmFsIG1vZGVsIGJvdW5kIHRvIHAtY2FsZW5kYXIgdG8gYXZvaWQgY2hhbmdpbmcgZXh0ZXJuYWwgc2VsZWN0aW9uIGR1cmluZyBmaXJzdC1jbGljayBzZWxlY3Rpb25cbiAgbW9kZWxEYXRlOiBEYXRlW10gfCBudWxsID0gbnVsbDtcblxuICBlbkxvY2FsZSA9IHtcbiAgICBmaXJzdERheU9mV2VlazogMCxcbiAgICBkYXlOYW1lczogW1xuICAgICAgJ1N1bmRheScsXG4gICAgICAnTW9uZGF5JyxcbiAgICAgICdUdWVzZGF5JyxcbiAgICAgICdXZWRuZXNkYXknLFxuICAgICAgJ1RodXJzZGF5JyxcbiAgICAgICdGcmlkYXknLFxuICAgICAgJ1NhdHVyZGF5JyxcbiAgICBdLFxuICAgIGRheU5hbWVzU2hvcnQ6IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J10sXG4gICAgZGF5TmFtZXNNaW46IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXSxcbiAgICBtb250aE5hbWVzOiBbXG4gICAgICAnSmFudWFyeScsXG4gICAgICAnRmVicnVhcnknLFxuICAgICAgJ01hcmNoJyxcbiAgICAgICdBcHJpbCcsXG4gICAgICAnTWF5JyxcbiAgICAgICdKdW5lJyxcbiAgICAgICdKdWx5JyxcbiAgICAgICdBdWd1c3QnLFxuICAgICAgJ1NlcHRlbWJlcicsXG4gICAgICAnT2N0b2JlcicsXG4gICAgICAnTm92ZW1iZXInLFxuICAgICAgJ0RlY2VtYmVyJyxcbiAgICBdLFxuICAgIG1vbnRoTmFtZXNTaG9ydDogW1xuICAgICAgJ0phbicsXG4gICAgICAnRmViJyxcbiAgICAgICdNYXInLFxuICAgICAgJ0FwcicsXG4gICAgICAnTWF5JyxcbiAgICAgICdKdW4nLFxuICAgICAgJ0p1bCcsXG4gICAgICAnQXVnJyxcbiAgICAgICdTZXAnLFxuICAgICAgJ09jdCcsXG4gICAgICAnTm92JyxcbiAgICAgICdEZWMnLFxuICAgIF0sXG4gICAgdG9kYXk6ICdUb2RheScsXG4gICAgY2xlYXI6ICdDbGVhcicsXG4gIH07XG5cbiAgLy8gdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG92ZXJsYXkgc2Vzc2lvblxuICBwcml2YXRlIF9vdmVybGF5SW5pdGlhbERhdGU6IERhdGVbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9vdmVybGF5SW5pdGlhbFByZXNldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2NhbGVuZGFyT2JzZXJ2ZXJzOiBNdXRhdGlvbk9ic2VydmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBfb2JzZXJ2ZWRFbGVtZW50czogRWxlbWVudFtdID0gW107XG4gIHByaXZhdGUgX3BhcmVudE9ic2VydmVyczogTXV0YXRpb25PYnNlcnZlcltdID0gW107XG4gIHByaXZhdGUgX29ic2VydmVkUGFyZW50RWxlbWVudHM6IEVsZW1lbnRbXSA9IFtdO1xuICBwcml2YXRlIF91cGRhdGVSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpZFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQXBwbHkgY3VzdG9tIHByZXNldCBpZiBzZXQgZXh0ZXJuYWxseSBhdCBpbml0IHRpbWVcbiAgICBpZiAodGhpcy5zZWxlY3RlZEN1c3RvbVByZXNldCAmJiB0aGlzLmN1c3RvbVByZXNldHM/LmZpbmQocCA9PiBwLmtleSA9PT0gdGhpcy5zZWxlY3RlZEN1c3RvbVByZXNldCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSB0aGlzLnNlbGVjdGVkQ3VzdG9tUHJlc2V0O1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xuICAgICAgdGhpcy5tb2RlbERhdGUgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlICYmIHRoaXMuZGVmYXVsdFByZXNldCkge1xuICAgICAgdGhpcy5hcHBseVByZXNldCh0aGlzLmRlZmF1bHRQcmVzZXQpO1xuICAgIH1cbiAgICAvLyBpbml0aWFsaXplIGludGVybmFsIG1vZGVsXG4gICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xuICAgIC8vIGluaXRpYWwgY2xhc3MgdXBkYXRlIGlmIHRoZXJlIGlzIGEgcHJlLXNlbGVjdGVkIHJhbmdlXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAvLyBzdGFydCBvYnNlcnZlcnMgaWYgaW5saW5lIGNhbGVuZGFyIGlzIHVzZWRcbiAgICBpZiAodGhpcy5pbmxpbmUpIHtcbiAgICAgIHRoaXMuX3N0YXJ0Q2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkQ3VzdG9tUHJlc2V0J10pIHtcbiAgICAgIGNvbnN0IHByZXNldCA9IGNoYW5nZXNbJ3NlbGVjdGVkQ3VzdG9tUHJlc2V0J10uY3VycmVudFZhbHVlO1xuICAgICAgaWYgKHByZXNldCAmJiB0aGlzLmN1c3RvbVByZXNldHM/LmZpbmQocCA9PiBwLmtleSA9PT0gcHJlc2V0KSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0O1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMubW9kZWxEYXRlID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAocHJlc2V0ID09PSBudWxsKSB7XG4gICAgICAgIC8vIE9ubHkgY2xlYXIgaWYgdGhlIGN1cnJlbnQgcHJlc2V0IGlzIGEgY3VzdG9tIG9uZVxuICAgICAgICBpZiAodGhpcy5jdXN0b21QcmVzZXRzPy5maW5kKHAgPT4gcC5rZXkgPT09IHRoaXMuc2VsZWN0ZWRQcmVzZXQpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZSddKSB7XG4gICAgICBjb25zdCBzZWwgPSBjaGFuZ2VzWydzZWxlY3RlZERhdGUnXS5jdXJyZW50VmFsdWUgYXMgRGF0ZVtdIHwgbnVsbDtcbiAgICAgIGlmIChzZWwgJiYgQXJyYXkuaXNBcnJheShzZWwpICYmIHNlbC5sZW5ndGggPT09IDIgJiYgc2VsWzBdICYmIHNlbFsxXSkge1xuICAgICAgICBjb25zdCBwcmVzZXQgPSB0aGlzLmRldGVjdFByZXNldChzZWxbMF0sIHNlbFsxXSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBwcmVzZXQgPz8gJ2N1c3RvbSc7XG4gICAgICAgIC8vIHN5bmMgaW50ZXJuYWwgbW9kZWwgd2hlbiBleHRlcm5hbCB2YWx1ZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMubW9kZWxEYXRlID0gWy4uLnNlbF07XG4gICAgICB9IGVsc2UgaWYgKHNlbCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xuICAgICAgICB0aGlzLm1vZGVsRGF0ZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25JbnB1dEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm92ZXJsYXlQYW5lbD8udG9nZ2xlKGV2ZW50IGFzIGFueSk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBvbk92ZXJsYXlTaG93KCk6IHZvaWQge1xuICAgIC8vIHN0b3JlIGEgZGVlcCBjb3B5IG9mIGN1cnJlbnQgc2VsZWN0aW9uL3ByZXNldCB3aGVuIG92ZXJsYXkgb3BlbnNcbiAgICBpZiAodGhpcy5zZWxlY3RlZERhdGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRGF0ZSkpIHtcbiAgICAgIHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZSA9ICh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pLm1hcCgoZCkgPT5cbiAgICAgICAgZCA/IG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCBkLmdldERhdGUoKSkgOiBkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vdmVybGF5SW5pdGlhbERhdGUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9vdmVybGF5SW5pdGlhbFByZXNldCA9IHRoaXMuc2VsZWN0ZWRQcmVzZXQ7XG4gICAgLy8gZW5zdXJlIGNhbGVuZGFyIG1vZGVsIHNob3dzIHRoZSBjdXJyZW50bHkgY29tbWl0dGVkIHNlbGVjdGlvbiB3aGVuIG9wZW5pbmdcbiAgICB0aGlzLm1vZGVsRGF0ZSA9IHRoaXMuc2VsZWN0ZWREYXRlID8gWy4uLnRoaXMuc2VsZWN0ZWREYXRlXSA6IG51bGw7XG4gICAgLy8gZW5zdXJlIHByZXNldCBidXR0b25zIHJlZmxlY3QgY3VycmVudCBzZWxlY3Rpb24gd2hlbiBvdmVybGF5IG9wZW5zXG4gICAgaWYgKFxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZERhdGUpICYmXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5sZW5ndGggPT09IDJcbiAgICApIHtcbiAgICAgIGNvbnN0IHByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KFxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVswXSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVbMV1cbiAgICAgICk7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0ID8/ICdjdXN0b20nO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gYWRkIHN0YXJ0L2VuZCBjbGFzc2VzIHRvIHJhbmdlIGNlbGxzIGZvciBzdHlsaW5nXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAvLyBvYnNlcnZlIERPTSBjaGFuZ2VzIChQcmltZU5HIG1heSByZS1yZW5kZXIgaW5zaWRlIG92ZXJsYXkpXG4gICAgdGhpcy5fc3RhcnRDYWxlbmRhck9ic2VydmVycygpO1xuICB9XG5cbiAgb25PdmVybGF5SGlkZSgpOiB2b2lkIHtcbiAgICAvLyBpZiBpbnRlcm5hbCBjYWxlbmRhciBtb2RlbCBoYXMgYW4gaW5jb21wbGV0ZSBzZWxlY3Rpb24gKHBhcnRpYWwgcmFuZ2UpIHJldmVydCB0byBpbml0aWFsXG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsRGF0ZTtcbiAgICBjb25zdCBpc1BhcnRpYWxNb2RlbCA9IEJvb2xlYW4oXG4gICAgICBtb2RlbCAmJiBBcnJheS5pc0FycmF5KG1vZGVsKSAmJiBtb2RlbC5sZW5ndGggPiAwICYmIG1vZGVsWzBdICYmICFtb2RlbFsxXVxuICAgICk7XG4gICAgaWYgKGlzUGFydGlhbE1vZGVsKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSB0aGlzLl9vdmVybGF5SW5pdGlhbFByZXNldDtcbiAgICAgIC8vIHJlc2V0IGludGVybmFsIG1vZGVsIHRvIHN5bmNlZCB2YWx1ZVxuICAgICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9vdmVybGF5SW5pdGlhbERhdGUgPSBudWxsO1xuICAgIHRoaXMuX292ZXJsYXlJbml0aWFsUHJlc2V0ID0gbnVsbDtcbiAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIC8vIGNsZWFudXAgYW55IHN0YXJ0L2VuZCBjbGFzc2VzIHRvIGF2b2lkIHN0YWxlIGNsYXNzZXNcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICAgIC8vIHN0b3Agb2JzZXJ2aW5nXG4gICAgdGhpcy5fc3RvcENhbGVuZGFyT2JzZXJ2ZXJzKCk7XG4gIH1cblxuICBvbk1vZGVsQ2hhbmdlKGRhdGVSYW5nZTogRGF0ZVtdIHwgbnVsbCkge1xuICAgIC8vIFdoZW4gdXNlciBjbGlja3MgYSBmaXJzdCBkYXRlLCBQcmltZU5HIG1heSBlbWl0IGFuIGFycmF5IHdpdGggMSB2YWx1ZS4gV2UgZG9uJ3Qgd2FudCB0b1xuICAgIC8vIHVwZGF0ZSB0aGUgZXh0ZXJuYWwgc2VsZWN0ZWREYXRlIHVudGlsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWQgKHR3byBkYXRlcykgc28gdGhhdFxuICAgIC8vIHRoZSBjYWxlbmRhciBkb2VzIG5vdCBqdW1wIGJhY2sgdG8gYSBwcmV2aW91c2x5IHNlbGVjdGVkIGVuZCBkYXRlJ3MgbW9udGguXG4gICAgdGhpcy5tb2RlbERhdGUgPSBkYXRlUmFuZ2UgPyBbLi4uZGF0ZVJhbmdlXSA6IG51bGw7XG4gICAgaWYgKFxuICAgICAgZGF0ZVJhbmdlICYmXG4gICAgICBBcnJheS5pc0FycmF5KGRhdGVSYW5nZSkgJiZcbiAgICAgIGRhdGVSYW5nZS5sZW5ndGggPT09IDIgJiZcbiAgICAgIGRhdGVSYW5nZVswXSAmJlxuICAgICAgZGF0ZVJhbmdlWzFdXG4gICAgKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gdGhpcy5kZXRlY3RQcmVzZXQoZGF0ZVJhbmdlWzBdLCBkYXRlUmFuZ2VbMV0pO1xuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gWy4uLmRhdGVSYW5nZV07XG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgIC8vIGNsb3NlIG92ZXJsYXkgbGlrZSB3aGVuIGFwcGx5aW5nIGEgcHJlc2V0XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9IGVsc2UgaWYgKCFkYXRlUmFuZ2UpIHtcbiAgICAgIC8vIGNsZWFyZWQgc2VsZWN0aW9uXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzaW5nbGUgZGF0ZSBzZWxlY3RpbmcgKHBhcnRpYWwgcmFuZ2UpIC0gZG8gbm90IGVtaXQgY2hhbmdlIHlldDsganVzdCBrZWVwIGludGVybmFsIG1vZGVsXG4gICAgICAvLyBzbyB0aGUgY2FsZW5kYXIncyB2aWV3IHJlbWFpbnMgd2hlcmUgdGhlIHVzZXIgbmF2aWdhdGVkIHRvLlxuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IG51bGw7XG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgc3RhcnQvZW5kIGNsYXNzZXMgd2hpbGUgdXNlciBpcyBzZWxlY3Rpbmcgb3Igd2hlbiByYW5nZSBjb21wbGV0ZXNcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICB9XG5cbiAgLy8gQ2FsbGVkIHdoZW4gdGhlIGNhbGVuZGFyJ3MgdmlzaWJsZSBtb250aC95ZWFyIGNoYW5nZXNcbiAgb25DYWxlbmRhclZpZXdDaGFuZ2VkKGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gUmVhcHBseSBjbGFzc2VzIGFmdGVyIFByaW1lTkcgcmUtcmVuZGVyXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAvLyBSZWF0dGFjaCBvYnNlcnZlcnMgYWZ0ZXIgYSBzbWFsbCBkZWxheSBzaW5jZSBQcmltZU5HIHdpbGwgbGlrZWx5IHJlcGxhY2UgRE9NIG5vZGVzXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICAgICAgdGhpcy5fc3RhcnRDYWxlbmRhck9ic2VydmVycygpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9LCA0MCk7XG4gIH1cblxuICBnZXQgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRGF0ZSkgJiZcbiAgICAgICAgKHRoaXMuc2VsZWN0ZWREYXRlIGFzIERhdGVbXSkubGVuZ3RoID09PSAyICYmXG4gICAgICAgICEhKHRoaXMuc2VsZWN0ZWREYXRlIGFzIERhdGVbXSlbMF0gJiZcbiAgICAgICAgISEodGhpcy5zZWxlY3RlZERhdGUgYXMgRGF0ZVtdKVsxXVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZURhdGUoZDogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgZC5nZXREYXRlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVEYXRlKGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYS5nZXRGdWxsWWVhcigpID09PSBiLmdldEZ1bGxZZWFyKCkgJiZcbiAgICAgIGEuZ2V0TW9udGgoKSA9PT0gYi5nZXRNb250aCgpICYmXG4gICAgICBhLmdldERhdGUoKSA9PT0gYi5nZXREYXRlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RQcmVzZXQoc3RhcnRSYXc6IERhdGUsIGVuZFJhdzogRGF0ZSk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5ub3JtYWxpemVEYXRlKHN0YXJ0UmF3KTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLm5vcm1hbGl6ZURhdGUoZW5kUmF3KTtcbiAgICBjb25zdCB0b2RheSA9IHRoaXMubm9ybWFsaXplRGF0ZShuZXcgRGF0ZSgpKTtcbiAgICAvLyB0b2RheVxuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIHRvZGF5KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCB0b2RheSkpXG4gICAgICByZXR1cm4gJ3RvZGF5JztcbiAgICAvLyB5ZXN0ZXJkYXlcbiAgICBjb25zdCB5ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIHkuc2V0RGF0ZSh5LmdldERhdGUoKSAtIDEpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIHkpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIHkpKVxuICAgICAgcmV0dXJuICd5ZXN0ZXJkYXknO1xuICAgIC8vIGxhc3Q3ZGF5cyAobGFzdCA3IGRheXMgaW5jbHVkaW5nIHRvZGF5OiBzdGFydCA9IHRvZGF5IC0gNiwgZW5kID0gdG9kYXkpXG4gICAgY29uc3QgbDdFbmQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgY29uc3QgbDdTdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBsN1N0YXJ0LnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpIC0gNik7XG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgbDdTdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDdFbmQpKVxuICAgICAgcmV0dXJuICdsYXN0N2RheXMnO1xuICAgIC8vIGxhc3QzMGRheXMgKGxhc3QgMzAgZGF5cyBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSAyOSwgZW5kID0gdG9kYXkpXG4gICAgY29uc3QgbDMwRW5kID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGNvbnN0IGwzMFN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGwzMFN0YXJ0LnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpIC0gMjkpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGwzMFN0YXJ0KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCBsMzBFbmQpKVxuICAgICAgcmV0dXJuICdsYXN0MzBkYXlzJztcbiAgICAvLyBsYXN0M21vbnRocyAobGFzdCAzIG1vbnRocyBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSAzIG1vbnRocywgZW5kID0gdG9kYXkpXG4gICAgY29uc3QgbDNtRW5kID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGNvbnN0IGwzbVN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGwzbVN0YXJ0LnNldE1vbnRoKHRvZGF5LmdldE1vbnRoKCkgLSAzKTtcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBsM21TdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDNtRW5kKSlcbiAgICAgIHJldHVybiAnbGFzdDNtb250aHMnO1xuICAgIC8vIGxhc3Q2bW9udGhzIChsYXN0IDYgbW9udGhzIGluY2x1ZGluZyB0b2RheTogc3RhcnQgPSB0b2RheSAtIDYgbW9udGhzLCBlbmQgPSB0b2RheSlcbiAgICBjb25zdCBsNm1FbmQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgY29uc3QgbDZtU3RhcnQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgbDZtU3RhcnQuc2V0TW9udGgodG9kYXkuZ2V0TW9udGgoKSAtIDYpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGw2bVN0YXJ0KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCBsNm1FbmQpKVxuICAgICAgcmV0dXJuICdsYXN0Nm1vbnRocyc7XG4gICAgLy8gbGFzdDF5ZWFyIChsYXN0IDEgeWVhciBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSAxIHllYXIsIGVuZCA9IHRvZGF5KVxuICAgIGNvbnN0IGwxeUVuZCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBjb25zdCBsMXlTdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBsMXlTdGFydC5zZXRGdWxsWWVhcih0b2RheS5nZXRGdWxsWWVhcigpIC0gMSk7XG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgbDF5U3RhcnQpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIGwxeUVuZCkpXG4gICAgICByZXR1cm4gJ2xhc3QxeWVhcic7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjbGVhckRhdGVSYW5nZSgpIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IG51bGw7XG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGVsRGF0ZSA9IG51bGw7XG4gIH1cblxuICByZXNldEFuZENsb3NlKCkge1xuICAgIHRoaXMuY2xlYXJEYXRlUmFuZ2UoKTtcbiAgICBpZiAodGhpcy5vdmVybGF5UGFuZWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVBhbmVsLmhpZGUoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG5cbiAgY2xlYXJBbmRTdG9wKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuY2xlYXJEYXRlUmFuZ2UoKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgdG9nZ2xlQ3VzdG9tUmFuZ2UoKSB7XG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSAhdGhpcy5jdXN0b21SYW5nZU1vZGU7XG4gICAgaWYgKHRoaXMuY3VzdG9tUmFuZ2VNb2RlKSB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gJ2N1c3RvbSc7XG4gIH1cblxuICBhcHBseUN1c3RvbVJhbmdlKCkge1xuICAgIC8vIGVuc3VyZSBleHRlcm5hbCBzZWxlY3RlZERhdGUgaXMgaW4gc3luYyB3aXRoIGludGVybmFsIG1vZGVsXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSB0aGlzLm1vZGVsRGF0ZSA/IFsuLi50aGlzLm1vZGVsRGF0ZV0gOiBudWxsO1xuICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgIGlmICh0aGlzLm92ZXJsYXlQYW5lbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vdmVybGF5UGFuZWwuaGlkZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gJ2N1c3RvbSc7XG4gIH1cblxuICAgIGdldERhdGVSYW5nZUxhYmVsKCkge1xuICAgIC8vIFNob3cgY3VzdG9tIHByZXNldCBsYWJlbCBpZiBhIGN1c3RvbSBwcmVzZXQgaXMgc2VsZWN0ZWRcbiAgICBjb25zdCBjdXN0b21QcmVzZXQgPSB0aGlzLmN1c3RvbVByZXNldHM/LmZpbmQocCA9PiBwLmtleSA9PT0gdGhpcy5zZWxlY3RlZFByZXNldCk7XG4gICAgaWYgKGN1c3RvbVByZXNldCkgcmV0dXJuIGN1c3RvbVByZXNldC5sYWJlbDtcblxuICAgIC8vIENoZWNrIHRoZSBpbnRlcm5hbCBtb2RlbCBmaXJzdCB0byBzaG93IHJlYWwtdGltZSB1cGRhdGVzIHdoaWxlIHNlbGVjdGluZ1xuICAgIGNvbnN0IGRhdGVBcnJheSA9IHRoaXMubW9kZWxEYXRlIHx8IHRoaXMuc2VsZWN0ZWREYXRlO1xuICAgIGlmICghZGF0ZUFycmF5IHx8ICFBcnJheS5pc0FycmF5KGRhdGVBcnJheSkpIHJldHVybiAnJztcblxuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IGRhdGVBcnJheSBhcyAoRGF0ZSB8IG51bGwpW107XG4gICAgY29uc3QgYXJyb3cgPSAnXFx1Mjc5NCc7XG5cbiAgICAvLyBTaG93IGp1c3QgdGhlIGZpcnN0IGRhdGUgd2l0aCBhbiBhcnJvdyBpZiBvbmx5IGZpcnN0IGRhdGUgaXMgc2VsZWN0ZWRcbiAgICBpZiAoc3RhcnQgJiYgIWVuZCkge1xuICAgICAgY29uc3Qgc3RhcnRTdHIgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShzdGFydCwgJ01NL2RkL3l5eXknKTtcbiAgICAgIHJldHVybiBgJHtzdGFydFN0cn0gJHthcnJvd30gYDtcbiAgICB9XG5cbiAgICAvLyBTaG93IHRoZSBjb21wbGV0ZSByYW5nZSBpZiBib3RoIGRhdGVzIGFyZSBzZWxlY3RlZFxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgIGNvbnN0IHN0YXJ0U3RyID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oc3RhcnQsICdNTS9kZC95eXl5Jyk7XG4gICAgICBjb25zdCBlbmRTdHIgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShlbmQsICdNTS9kZC95eXl5Jyk7XG4gICAgICByZXR1cm4gYCR7c3RhcnRTdHJ9ICR7YXJyb3d9ICR7ZW5kU3RyfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgb25DdXN0b21QcmVzZXRDbGljayhrZXk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBrZXk7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xuICAgIHRoaXMubW9kZWxEYXRlID0gbnVsbDtcbiAgICB0aGlzLmN1c3RvbVByZXNldENsaWNrLmVtaXQoa2V5KTtcbiAgICB0cnkgeyB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpOyB9IGNhdGNoIChlKSB7fVxuICB9XG5cbiAgYXBwbHlQcmVzZXQoXG4gICAgcHJlc2V0OlxuICAgICAgfCAndG9kYXknXG4gICAgICB8ICd5ZXN0ZXJkYXknXG4gICAgICB8ICdsYXN0N2RheXMnXG4gICAgICB8ICdsYXN0MzBkYXlzJ1xuICAgICAgfCAnbGFzdDNtb250aHMnXG4gICAgICB8ICdsYXN0Nm1vbnRocydcbiAgICAgIHwgJ2xhc3QxeWVhcidcbiAgKSB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBzdGFydDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBlbmQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBzd2l0Y2ggKHByZXNldCkge1xuICAgICAgY2FzZSAndG9kYXknOlxuICAgICAgICBzdGFydCA9IGVuZCA9IG5ldyBEYXRlKFxuICAgICAgICAgIHRvZGF5LmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgdG9kYXkuZ2V0TW9udGgoKSxcbiAgICAgICAgICB0b2RheS5nZXREYXRlKClcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd5ZXN0ZXJkYXknOlxuICAgICAgICBjb25zdCB5ID0gbmV3IERhdGUodG9kYXkpO1xuICAgICAgICB5LnNldERhdGUoeS5nZXREYXRlKCkgLSAxKTtcbiAgICAgICAgc3RhcnQgPSBlbmQgPSBuZXcgRGF0ZSh5LmdldEZ1bGxZZWFyKCksIHkuZ2V0TW9udGgoKSwgeS5nZXREYXRlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xhc3Q3ZGF5cyc6IHtcbiAgICAgICAgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpKTtcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xuICAgICAgICBzdGFydC5zZXREYXRlKGVuZC5nZXREYXRlKCkgLSA2KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0MzBkYXlzJzoge1xuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xuICAgICAgICBzdGFydCA9IG5ldyBEYXRlKGVuZCk7XG4gICAgICAgIHN0YXJ0LnNldERhdGUoZW5kLmdldERhdGUoKSAtIDI5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0M21vbnRocyc6IHtcbiAgICAgICAgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpKTtcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xuICAgICAgICBzdGFydC5zZXRNb250aChlbmQuZ2V0TW9udGgoKSAtIDMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xhc3Q2bW9udGhzJzoge1xuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xuICAgICAgICBzdGFydCA9IG5ldyBEYXRlKGVuZCk7XG4gICAgICAgIHN0YXJ0LnNldE1vbnRoKGVuZC5nZXRNb250aCgpIC0gNik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGFzdDF5ZWFyJzoge1xuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xuICAgICAgICBzdGFydCA9IG5ldyBEYXRlKGVuZCk7XG4gICAgICAgIHN0YXJ0LnNldEZ1bGxZZWFyKGVuZC5nZXRGdWxsWWVhcigpIC0gMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gW3N0YXJ0LCBlbmRdO1xuICAgICAgdGhpcy5tb2RlbERhdGUgPSBbc3RhcnQsIGVuZF07XG4gICAgICBpZiAodGhpcy5wcmVzZXJ2ZVByZXNldCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IFtzdGFydCwgZW5kLCB7IHByZXNldHM6IHByZXNldCB9XTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IHByZXNldDtcbiAgICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgLy8gZW5zdXJlIHdlIHVwZGF0ZSBzdGFydC9lbmQgY2xhc3NlcyBhZnRlciBhcHBseWluZyBhIHByZXNldFxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICBvbkRhdGVSYW5nZUNoYW5nZShkYXRlUmFuZ2U6IERhdGVbXSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KGRhdGVSYW5nZSk7XG4gICAgaWYgKGRhdGVSYW5nZSAmJiBBcnJheS5pc0FycmF5KGRhdGVSYW5nZSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSB0aGlzLmRldGVjdFByZXNldChkYXRlUmFuZ2VbMF0sIGRhdGVSYW5nZVsxXSk7XG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIWRhdGVSYW5nZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IG51bGw7XG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc3RvcENhbGVuZGFyT2JzZXJ2ZXJzKCk7XG4gICAgdGhpcy5fY2FuY2VsU2NoZWR1bGVkVXBkYXRlKCk7XG4gIH1cblxuICAvLyBXYWxrIHRoZSByZW5kZXJlZCBjYWxlbmRhciBET00ocykgKG92ZXJsYXkgKyBpbmxpbmUpIGFuZCBhZGQgc3RhcnQtcmFuZ2UvZW5kLXJhbmdlIGNsYXNzZXNcbiAgcHJpdmF0ZSBfdXBkYXRlU3RhcnRFbmRSYW5nZUNsYXNzZXMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhbGVuZGFyRWxlbWVudHMgPSB0aGlzLl9nZXRDYWxlbmRhckVsZW1lbnRzKCk7XG5cbiAgICAgIGNhbGVuZGFyRWxlbWVudHMuZm9yRWFjaCgoY2FsRWw6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGNsYXNzZXMgZnJvbSBzcGFucyBmaXJzdFxuICAgICAgICBjb25zdCBhbGxTcGFucyA9IGNhbEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkID4gc3BhbicpO1xuICAgICAgICBhbGxTcGFucy5mb3JFYWNoKChzcGFuKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhzcGFuLCAnc3RhcnQtcmFuZ2UnKTtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHNwYW4sICdlbmQtcmFuZ2UnKTtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHNwYW4sICdiZXR3ZWVuLXJhbmdlJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENvbGxlY3Qgc3Bhbi9kYXRlIHBhaXJzLCBwcmVmZXIgZGF0YS1kYXRlIGF0dHJpYnV0ZVxuICAgICAgICAvLyBDYWNoZSBoZWFkZXIgbW9udGgveWVhciBmb3IgdGhpcyBjYWxlbmRhciB0byBhdm9pZCBxdWVyeWluZyBwZXItc3BhblxuICAgICAgICBjb25zdCBwYW5lbE5vZGUgPSBjYWxFbC5jbG9zZXN0KCcucC1kYXRlcGlja2VyJykgfHwgY2FsRWw7XG4gICAgICAgIGNvbnN0IGhlYWRlck1vbnRoTm9kZSA9IChwYW5lbE5vZGUgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAnLnAtZGF0ZXBpY2tlci1oZWFkZXIgLnAtZGF0ZXBpY2tlci10aXRsZSAucC1kYXRlcGlja2VyLW1vbnRoJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBoZWFkZXJZZWFyTm9kZSA9IChwYW5lbE5vZGUgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAnLnAtZGF0ZXBpY2tlci1oZWFkZXIgLnAtZGF0ZXBpY2tlci10aXRsZSAucC1kYXRlcGlja2VyLXllYXInXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGhlYWRlck1vbnRoSWR4ID1cbiAgICAgICAgICBoZWFkZXJNb250aE5vZGUgJiYgaGVhZGVyTW9udGhOb2RlLnRleHRDb250ZW50XG4gICAgICAgICAgICA/ICh0aGlzLmVuTG9jYWxlLm1vbnRoTmFtZXMgfHwgW10pLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgaGVhZGVyTW9udGhOb2RlLnRleHRDb250ZW50LnRyaW0oKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IE5hTjtcbiAgICAgICAgY29uc3QgaGVhZGVyWWVhclZhbCA9XG4gICAgICAgICAgaGVhZGVyWWVhck5vZGUgJiYgaGVhZGVyWWVhck5vZGUudGV4dENvbnRlbnRcbiAgICAgICAgICAgID8gcGFyc2VJbnQoaGVhZGVyWWVhck5vZGUudGV4dENvbnRlbnQudHJpbSgpLCAxMClcbiAgICAgICAgICAgIDogTmFOO1xuICAgICAgICBjb25zdCBpdGVtczogeyBkdDogRGF0ZTsgc3BhbjogRWxlbWVudDsgdGQ/OiBIVE1MRWxlbWVudCB8IG51bGwgfVtdID1cbiAgICAgICAgICBbXTtcbiAgICAgICAgY29uc3Qgc3BhbnMgPSBjYWxFbC5xdWVyeVNlbGVjdG9yQWxsKCd0ZCA+IHNwYW4ucC1oaWdobGlnaHQnKTtcbiAgICAgICAgc3BhbnMuZm9yRWFjaCgoc3BhbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHRkID0gc3Bhbi5jbG9zZXN0KCd0ZCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAvLyBUcnkgdG8gcmVhZCBkYXRhLWRhdGUgYXR0cmlidXRlLCB3aGljaCBzb21lIFByaW1lTkcgdmVyc2lvbnMgcmVuZGVyIG9uIHNwYW4vdGRcbiAgICAgICAgICBsZXQgZGF0YURhdGUgPSBzcGFuLmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRlJyk7XG4gICAgICAgICAgaWYgKCFkYXRhRGF0ZSAmJiB0ZCkgZGF0YURhdGUgPSB0ZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0ZScpO1xuICAgICAgICAgIGlmIChkYXRhRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBkYXRhRGF0ZS5zcGxpdCgnLScpLm1hcCgocCkgPT4gcGFyc2VJbnQocCwgMTApKTtcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMyAmJiBwYXJ0cy5ldmVyeSgobikgPT4gIWlzTmFOKG4pKSkge1xuICAgICAgICAgICAgICBjb25zdCBbeSwgbSwgZF0gPSBwYXJ0cztcbiAgICAgICAgICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZSh5LCBtIC0gMSwgZCk7XG4gICAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBkdCwgdGQsIHNwYW4gfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IHBhcnNlIGRheSBudW1iZXIgYW5kIGluZmVyIG1vbnRoL3llYXIgZnJvbSBuZWFyYnkgaGVhZGVyIGluIHRoZSBzYW1lIC5wLWRhdGVwaWNrZXJcbiAgICAgICAgICBjb25zdCBkYXlUZXh0ID0gKHNwYW4udGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChkYXlUZXh0LCAxMCk7XG4gICAgICAgICAgaWYgKCFpc05hTihkYXkpICYmIHRkKSB7XG4gICAgICAgICAgICAvLyBVc2UgY2FjaGVkIGhlYWRlciBtb250aC95ZWFyIHdoZW4gYXZhaWxhYmxlXG4gICAgICAgICAgICBpZiAoIWlzTmFOKGhlYWRlck1vbnRoSWR4KSAmJiAhaXNOYU4oaGVhZGVyWWVhclZhbCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZShoZWFkZXJZZWFyVmFsLCBoZWFkZXJNb250aElkeCwgZGF5KTtcbiAgICAgICAgICAgICAgaXRlbXMucHVzaCh7IGR0LCB0ZCwgc3BhbiB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBsYXN0IHJlc29ydDogaWdub3JlIHNwYW4gaWYgZGF0ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gU29ydCBpdGVtcyB0byBmaW5kIG1pbi9tYXggKHN0YXJ0ICYgZW5kKVxuICAgICAgICBpdGVtcy5zb3J0KChhLCBiKSA9PiBhLmR0LmdldFRpbWUoKSAtIGIuZHQuZ2V0VGltZSgpKTtcbiAgICAgICAgY29uc3QgZGV0ZWN0ZWRTdGFydCA9IGl0ZW1zWzBdLmR0O1xuICAgICAgICBjb25zdCBkZXRlY3RlZEVuZCA9IGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdLmR0O1xuXG4gICAgICAgIC8vIFByZWZlcnJlZCByYW5nZSBpcyBtb2RlbERhdGUvc2VsZWN0ZWREYXRlIGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgcmFuZ2UgPVxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlICYmIHRoaXMuc2VsZWN0ZWREYXRlLmxlbmd0aCA9PT0gMlxuICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRGF0ZVxuICAgICAgICAgICAgOiB0aGlzLm1vZGVsRGF0ZSAmJiB0aGlzLm1vZGVsRGF0ZS5sZW5ndGggPT09IDJcbiAgICAgICAgICAgICAgPyB0aGlzLm1vZGVsRGF0ZVxuICAgICAgICAgICAgICA6IFtkZXRlY3RlZFN0YXJ0LCBkZXRlY3RlZEVuZF07XG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9XG4gICAgICAgICAgcmFuZ2UgJiYgcmFuZ2VbMF1cbiAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVEYXRlKHJhbmdlWzBdIGFzIERhdGUpXG4gICAgICAgICAgICA6IGRldGVjdGVkU3RhcnQ7XG4gICAgICAgIGNvbnN0IGVuZERhdGUgPVxuICAgICAgICAgIHJhbmdlICYmIHJhbmdlWzFdXG4gICAgICAgICAgICA/IHRoaXMubm9ybWFsaXplRGF0ZShyYW5nZVsxXSBhcyBEYXRlKVxuICAgICAgICAgICAgOiBkZXRlY3RlZEVuZDtcblxuICAgICAgICAvLyBGb3IgZWFjaCBpdGVtLCBhZGQgc3RhcnQtcmFuZ2UsZW5kLXJhbmdlLCBvciBiZXR3ZWVuLXJhbmdlIGJhc2VkIG9uIGRhdGVcbiAgICAgICAgY29uc3Qgc1RpbWUgPSBzdGFydERhdGUuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBlVGltZSA9IGVuZERhdGUuZ2V0VGltZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIGl0ZW1zKSB7XG4gICAgICAgICAgY29uc3QgdCA9IGl0LmR0LmdldFRpbWUoKTtcbiAgICAgICAgICBpZiAoc1RpbWUgPT09IGVUaW1lICYmIHQgPT09IHNUaW1lKSB7XG4gICAgICAgICAgICAvLyBzaW5nbGUtZGF5IHJhbmdlLCBtYXJrIGJvdGggc3RhcnQgJiBlbmRcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaXQuc3BhbiwgJ3N0YXJ0LXJhbmdlJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0LnNwYW4sICdlbmQtcmFuZ2UnKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHQgPT09IHNUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0LnNwYW4sICdzdGFydC1yYW5nZScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodCA9PT0gZVRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaXQuc3BhbiwgJ2VuZC1yYW5nZScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodCA+IHNUaW1lICYmIHQgPCBlVGltZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdC5zcGFuLCAnYmV0d2Vlbi1yYW5nZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWdub3JlIERPTSBlcnJvcnMgKGUuZy4sIHNlcnZlci1zaWRlIHJlbmRlcmluZyAvIG1pc3NpbmcgZWxlbWVudHMpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc29EYXRlKGQ6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHkgPSBkLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbSA9IFN0cmluZyhkLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7eX0tJHttfS0ke2RheX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZEVsZW1lbnRCeURhdGUoZGF0ZT86IERhdGUpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbSA9IGRhdGUuZ2V0TW9udGgoKSArIDE7IC8vIDEuLjEyXG4gICAgY29uc3QgZCA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IGlzb1VucGFkZGVkID0gYCR7eX0tJHttfS0ke2R9YDsgLy8gZS5nLiAyMDI1LTExLTFcbiAgICBjb25zdCBpc29QYWRkZWQgPSBgJHt5fS0ke1N0cmluZyhtKS5wYWRTdGFydCgyLCAnMCcpfS0ke1N0cmluZyhkKS5wYWRTdGFydCgyLCAnMCcpfWA7IC8vIDIwMjUtMTEtMDFcbiAgICBjb25zdCBzZWxlY3RvcnMgPSBbXG4gICAgICBgW2RhdGEtZGF0ZT1cIiR7aXNvVW5wYWRkZWR9XCJdYCxcbiAgICAgIGBbZGF0YS1kYXRlPVwiJHtpc29QYWRkZWR9XCJdYCxcbiAgICBdO1xuICAgIGZvciAoY29uc3Qgc2VsIG9mIHNlbGVjdG9ycykge1xuICAgICAgY29uc3QgZm91bmRJbk92ZXJsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLmF0b21peC1vdmVybGF5LWNhbGVuZGFyICR7c2VsfWBcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKGZvdW5kSW5PdmVybGF5KVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChmb3VuZEluT3ZlcmxheS5jbG9zZXN0KCd0ZCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbCkgfHwgZm91bmRJbk92ZXJsYXlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWwgb2Ygc2VsZWN0b3JzKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiAoZm91bmQuY2xvc2VzdCgndGQnKSBhcyBIVE1MRWxlbWVudCB8IG51bGwpIHx8IGZvdW5kO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnRDYWxlbmRhck9ic2VydmVycygpOiB2b2lkIHtcbiAgICAvLyBzdG9wIGZpcnN0IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FsRWxzID0gdGhpcy5fZ2V0Q2FsZW5kYXJFbGVtZW50cygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLm92ZXJsYXlQYW5lbCBhcyBhbnk7XG4gICAgICAgIGlmIChwYW5lbCAmJiBwYW5lbC5lbCAmJiBwYW5lbC5lbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgZWwgPSBwYW5lbC5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGVwaWNrZXInKTtcbiAgICAgICAgICBpZiAoZWwpIGNhbEVscy5wdXNoKGVsIGFzIEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICBjYWxFbHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgY29uc3Qgb2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgIC8vIFJlYXBwbHkgY2xhc3NlcyBhZnRlciBET00gY2hhbmdlcyAoZGVib3VuY2VkKVxuICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBXYXRjaCBjaGlsZExpc3QsIHN1YnRyZWUgYW5kIGNsYXNzIGF0dHJpYnV0ZSBjaGFuZ2VzIChzcGFuIGNsYXNzIHRvZ2dsZXMgYXJlIGNvbW1vbilcbiAgICAgICAgb2JzLm9ic2VydmUoZWwsIHtcbiAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJPYnNlcnZlcnMucHVzaChvYnMpO1xuICAgICAgICB0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgICAvLyBBbHNvIG9ic2VydmUgcGFyZW50IC0gaWYgUHJpbWVORyByZXBsYWNlcyB0aGUgLnAtZGF0ZXBpY2tlciBlbGVtZW50LCBwYXJlbnQgY2hpbGRMaXN0IGNoYW5nZXMgd2lsbCBmaXJlXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXJlbnQgJiYgdGhpcy5fb2JzZXJ2ZWRQYXJlbnRFbGVtZW50cy5pbmRleE9mKHBhcmVudCkgPT09IC0xKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50T2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgLy8gcmVhdHRhY2ggb2JzZXJ2ZXJzIHNpbmNlIHRoZSBjYWxFbCBtYXkgaGF2ZSBiZWVuIHJlcGxhY2VkXG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgICAgICAgLy8gZGV0YWNoIGFuZCByZS1hdHRhY2ggb2JzZXJ2ZXJzIGFmdGVyIERPTSBzZXR0bGVzXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydENhbGVuZGFyT2JzZXJ2ZXJzKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICB9LCAxMDApOyAvLyBzbGlnaHRseSBsYXJnZXIgZGVsYXkgdG8gbGV0IFByaW1lTkcgZmluaXNoIHRoZSBtb250aCByZW5kZXJpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXJlbnRPYnMub2JzZXJ2ZShwYXJlbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiBmYWxzZSB9KTtcbiAgICAgICAgICB0aGlzLl9wYXJlbnRPYnNlcnZlcnMucHVzaChwYXJlbnRPYnMpO1xuICAgICAgICAgIHRoaXMuX29ic2VydmVkUGFyZW50RWxlbWVudHMucHVzaChwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzLmZvckVhY2goKG9icykgPT4gb2JzLmRpc2Nvbm5lY3QoKSk7XG4gICAgICB0aGlzLl9wYXJlbnRPYnNlcnZlcnMuZm9yRWFjaCgob2JzKSA9PiBvYnMuZGlzY29ubmVjdCgpKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzID0gW107XG4gICAgdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cyA9IFtdO1xuICAgIHRoaXMuX3BhcmVudE9ic2VydmVycyA9IFtdO1xuICAgIHRoaXMuX29ic2VydmVkUGFyZW50RWxlbWVudHMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjaGVkdWxlVXBkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl91cGRhdGVSYWZJZCAhPSBudWxsKSByZXR1cm47IC8vIGFscmVhZHkgc2NoZWR1bGVkXG4gICAgdGhpcy5fdXBkYXRlUmFmSWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZVJhZklkID0gbnVsbDtcbiAgICAgIHRoaXMuX3VwZGF0ZVN0YXJ0RW5kUmFuZ2VDbGFzc2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jYW5jZWxTY2hlZHVsZWRVcGRhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3VwZGF0ZVJhZklkICE9IG51bGwpIHtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl91cGRhdGVSYWZJZCk7XG4gICAgICB0aGlzLl91cGRhdGVSYWZJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2FsZW5kYXJFbGVtZW50cygpOiBFbGVtZW50W10ge1xuICAgIGNvbnN0IGNhbEVsczogRWxlbWVudFtdID0gW107XG4gICAgY29uc3Qgb3ZlcmxheUNhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLmF0b21peC1vdmVybGF5LWNhbGVuZGFyIC5wLWRhdGVwaWNrZXInXG4gICAgKTtcbiAgICBjb25zdCBpbmxpbmVDYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW5saW5lLWNhbGVuZGFyIC5wLWRhdGVwaWNrZXInKTtcbiAgICBpZiAob3ZlcmxheUNhbCkgY2FsRWxzLnB1c2gob3ZlcmxheUNhbCk7XG4gICAgaWYgKGlubGluZUNhbCkgY2FsRWxzLnB1c2goaW5saW5lQ2FsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLm92ZXJsYXlQYW5lbCBhcyBhbnk7XG4gICAgICBpZiAocGFuZWwgJiYgcGFuZWwuZWwgJiYgcGFuZWwuZWwubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbCA9IHBhbmVsLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0ZXBpY2tlcicpO1xuICAgICAgICBpZiAoZWwpIGNhbEVscy5wdXNoKGVsIGFzIEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXNcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGNhbEVscykpO1xuICB9XG59XG4iLCI8ZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlubGluZTsgZWxzZSBpbmxpbmVCbG9ja1wiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiIGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbbmdDbGFzc109XCJpbnB1dFN0eWxlQ2xhc3NcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwiZ2V0RGF0ZVJhbmdlTGFiZWwoKVwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIChjbGljayk9XCJvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJwaSBwaS1jYWxlbmRhciBpbnB1dC1pY29uXCJcbiAgICAgICAgdGl0bGU9XCJPcGVuIGNhbGVuZGFyXCJcbiAgICAgICAgKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiBvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgID48L2k+XG4gICAgICA8aVxuICAgICAgICAqbmdJZj1cImhhc1NlbGVjdGlvblwiXG4gICAgICAgIGNsYXNzPVwicGkgcGktdGltZXMgaW5wdXQtY2xlYXItaWNvblwiXG4gICAgICAgIHRpdGxlPVwiQ2xlYXJcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAoY2xpY2spPVwiIWRpc2FibGVkICYmIGNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiIWRpc2FibGVkICYmIGNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiIWRpc2FibGVkICYmIGNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcbiAgICAgID48L2k+XG4gICAgPC9kaXY+XG5cbiAgICA8cC1vdmVybGF5UGFuZWxcbiAgICAgICNvdmVybGF5UGFuZWxcbiAgICAgIFtkaXNtaXNzYWJsZV09XCJ0cnVlXCJcbiAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICBzdHlsZUNsYXNzPVwiYXRvbWl4LWRhdGUtcmFuZ2Utb3ZlcmxheVwiXG4gICAgICAob25TaG93KT1cIm9uT3ZlcmxheVNob3coKVwiXG4gICAgICAob25IaWRlKT1cIm9uT3ZlcmxheUhpZGUoKVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW5uZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktbGVmdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmVzZXQtbGlzdFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHBSaXBwbGVcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgndG9kYXknKVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3RvZGF5JyB9XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJUb2RheVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCd5ZXN0ZXJkYXknKVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3llc3RlcmRheScgfVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiWWVzdGVyZGF5XCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3Q3ZGF5cycpXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDdkYXlzJyB9XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDcgZGF5c1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MzBkYXlzJylcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0MzBkYXlzJyB9XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMwIGRheXNcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHBSaXBwbGVcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDNtb250aHMnKVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzbW9udGhzJyB9XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMgbW9udGhzXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3Q2bW9udGhzJylcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0Nm1vbnRocycgfVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiTGFzdCA2IG1vbnRoc1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MXllYXInKVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QxeWVhcicgfVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiTGFzdCAxIHllYXJcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY3Agb2YgY3VzdG9tUHJlc2V0c1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuXCIgKGNsaWNrKT1cIm9uQ3VzdG9tUHJlc2V0Q2xpY2soY3Aua2V5KVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSBjcC5rZXkgfVwiIFtsYWJlbF09XCJjcC5sYWJlbFwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8YSBjbGFzcz1cInJlc2V0LWxpbmtcIiAoY2xpY2spPVwicmVzZXRBbmRDbG9zZSgpXCI+UmVzZXQ8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1yaWdodFwiPlxuICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsRGF0ZVwiXG4gICAgICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCIncmFuZ2UnXCJcbiAgICAgICAgICAgIFtpbmxpbmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCInbW0vZGQveXl5eSdcIlxuICAgICAgICAgICAgW3Nob3dPdGhlck1vbnRoc109XCJ0cnVlXCJcbiAgICAgICAgICAgIFtsb2NhbGVdPVwiZW5Mb2NhbGVcIlxuICAgICAgICAgICAgW3Nob3dJY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtzdHlsZUNsYXNzXT1cIidhdG9taXgtb3ZlcmxheS1jYWxlbmRhcidcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbk1vbnRoQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblllYXJDaGFuZ2UpPVwib25DYWxlbmRhclZpZXdDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgICAgICAgICAgW21pbkRhdGVdPVwibWluRGF0ZVwiXG4gICAgICAgICAgPjwvcC1jYWxlbmRhcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgI2lubGluZUJsb2NrPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiIGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbbmdDbGFzc109XCJpbnB1dFN0eWxlQ2xhc3NcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwiZ2V0RGF0ZVJhbmdlTGFiZWwoKVwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgLz5cbiAgICAgIDxpIGNsYXNzPVwicGkgcGktY2FsZW5kYXIgaW5wdXQtaWNvblwiIHRpdGxlPVwiT3BlbiBjYWxlbmRhclwiPjwvaT5cbiAgICAgIDxpXG4gICAgICAgICpuZ0lmPVwiaGFzU2VsZWN0aW9uXCJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS10aW1lcyBpbnB1dC1jbGVhci1pY29uXCJcbiAgICAgICAgdGl0bGU9XCJDbGVhclwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIChjbGljayk9XCJjbGVhckFuZFN0b3AoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cImNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiY2xlYXJBbmRTdG9wKCRldmVudClcIlxuICAgICAgPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1pbm5lciBpbmxpbmUtY2FsZW5kYXIgZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktbGVmdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJlc2V0LWxpc3RcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ3RvZGF5JylcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAndG9kYXknIH1cIlxuICAgICAgICAgICAgbGFiZWw9XCJUb2RheVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIHBSaXBwbGVcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgneWVzdGVyZGF5JylcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAneWVzdGVyZGF5JyB9XCJcbiAgICAgICAgICAgIGxhYmVsPVwiWWVzdGVyZGF5XCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0N2RheXMnKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0N2RheXMnIH1cIlxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDcgZGF5c1wiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIHBSaXBwbGVcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDMwZGF5cycpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzMGRheXMnIH1cIlxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMwIGRheXNcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3QzbW9udGhzJylcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDNtb250aHMnIH1cIlxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMgbW9udGhzXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MXllYXInKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0MXllYXInIH1cIlxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDEgeWVhclwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNwIG9mIGN1c3RvbVByZXNldHNcIj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwib25DdXN0b21QcmVzZXRDbGljayhjcC5rZXkpXCIgW25nQ2xhc3NdPVwieyAnYWN0aXZlJzogc2VsZWN0ZWRQcmVzZXQgPT09IGNwLmtleSB9XCIgW2xhYmVsXT1cImNwLmxhYmVsXCI+PC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJyZXNldC1saW5rXCIgKGNsaWNrKT1cInJlc2V0QW5kQ2xvc2UoKVwiPlJlc2V0PC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktcmlnaHRcIj5cbiAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsRGF0ZVwiXG4gICAgICAgICAgW3NlbGVjdGlvbk1vZGVdPVwiJ3JhbmdlJ1wiXG4gICAgICAgICAgW2lubGluZV09XCJ0cnVlXCJcbiAgICAgICAgICBbZGF0ZUZvcm1hdF09XCInbW0vZGQveXl5eSdcIlxuICAgICAgICAgIFtzaG93T3RoZXJNb250aHNdPVwidHJ1ZVwiXG4gICAgICAgICAgW2xvY2FsZV09XCJlbkxvY2FsZVwiXG4gICAgICAgICAgW3Nob3dJY29uXT1cImZhbHNlXCJcbiAgICAgICAgICBbc3R5bGVDbGFzc109XCInYXRvbWl4LW92ZXJsYXktY2FsZW5kYXInXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChvbk1vbnRoQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAob25ZZWFyQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgICAgICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxuICAgICAgICA+PC9wLWNhbGVuZGFyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==