nxt-pick-datetime 14.0.0 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +130 -147
  2. package/assets/picker.scss +88 -93
  3. package/esm2020/lib/class/date-time-adapter.class.mjs +8 -8
  4. package/esm2020/lib/class/date-time-format.class.mjs +2 -2
  5. package/esm2020/lib/class/date-time.class.mjs +54 -71
  6. package/esm2020/lib/class/dialog-config.class.mjs +3 -13
  7. package/esm2020/lib/class/dialog-ref.class.mjs +8 -9
  8. package/esm2020/lib/date-time/calendar/calendar.component.mjs +85 -90
  9. package/esm2020/lib/date-time/calendar-body/calendar-body.component.mjs +32 -28
  10. package/esm2020/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +69 -78
  11. package/esm2020/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +57 -63
  12. package/esm2020/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +57 -68
  13. package/esm2020/lib/date-time/date-time-inline/date-time-inline.component.mjs +68 -78
  14. package/esm2020/lib/date-time/date-time-picker/date-time-picker.component.mjs +164 -182
  15. package/esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +2 -2
  16. package/esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +106 -114
  17. package/esm2020/lib/date-time/date-time-picker-input.directive.mjs +185 -203
  18. package/esm2020/lib/date-time/date-time-picker-intl.service.mjs +5 -5
  19. package/esm2020/lib/date-time/date-time-picker-trigger.directive.mjs +20 -19
  20. package/esm2020/lib/date-time/date-time.module.mjs +79 -68
  21. package/esm2020/lib/date-time/number-fixed-len.pipe.mjs +9 -13
  22. package/esm2020/lib/date-time/timer/timer.component.mjs +62 -57
  23. package/esm2020/lib/date-time/timer-box/timer-box.component.mjs +22 -17
  24. package/esm2020/lib/dialog/dialog-container/dialog-container.component.mjs +44 -49
  25. package/esm2020/lib/dialog/dialog.module.mjs +26 -16
  26. package/esm2020/lib/dialog/dialog.service.mjs +52 -49
  27. package/esm2020/lib/utils/object.mjs +3 -3
  28. package/esm2020/moment-adapter/date-time-adapter.class.mjs +17 -16
  29. package/esm2020/moment-adapter/date-time-format.class.mjs +2 -2
  30. package/esm2020/moment-adapter/moment-adapter.module.mjs +18 -22
  31. package/esm2020/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +1 -1
  32. package/esm2020/moment-adapter/public-api.mjs +2 -2
  33. package/esm2020/native-adapter/date-time-adapter.class.mjs +13 -13
  34. package/esm2020/native-adapter/date-time-format.class.mjs +2 -2
  35. package/esm2020/native-adapter/native-adapter.module.mjs +23 -21
  36. package/esm2020/native-adapter/nxt-pick-datetime-native-adapter.mjs +1 -1
  37. package/esm2020/native-adapter/public-api.mjs +2 -2
  38. package/esm2020/nxt-pick-datetime.mjs +1 -1
  39. package/esm2020/public-api.mjs +14 -14
  40. package/fesm2015/nxt-pick-datetime-moment-adapter.mjs +32 -35
  41. package/fesm2015/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
  42. package/fesm2015/nxt-pick-datetime-native-adapter.mjs +34 -32
  43. package/fesm2015/nxt-pick-datetime-native-adapter.mjs.map +1 -1
  44. package/fesm2015/nxt-pick-datetime.mjs +1229 -1247
  45. package/fesm2015/nxt-pick-datetime.mjs.map +1 -1
  46. package/fesm2020/nxt-pick-datetime-moment-adapter.mjs +32 -35
  47. package/fesm2020/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
  48. package/fesm2020/nxt-pick-datetime-native-adapter.mjs +34 -32
  49. package/fesm2020/nxt-pick-datetime-native-adapter.mjs.map +1 -1
  50. package/fesm2020/nxt-pick-datetime.mjs +1159 -1237
  51. package/fesm2020/nxt-pick-datetime.mjs.map +1 -1
  52. package/lib/class/date-time-adapter.class.d.ts +31 -31
  53. package/lib/class/date-time-format.class.d.ts +2 -2
  54. package/lib/class/date-time.class.d.ts +24 -23
  55. package/lib/class/dialog-config.class.d.ts +5 -5
  56. package/lib/class/dialog-ref.class.d.ts +16 -17
  57. package/lib/date-time/calendar/calendar.component.d.ts +41 -41
  58. package/lib/date-time/calendar-body/calendar-body.component.d.ts +11 -11
  59. package/lib/date-time/calendar-month-view/calendar-month-view.component.d.ts +40 -40
  60. package/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +38 -38
  61. package/lib/date-time/calendar-year-view/calendar-year-view.component.d.ts +36 -36
  62. package/lib/date-time/date-time-inline/date-time-inline.component.d.ts +38 -40
  63. package/lib/date-time/date-time-picker/date-time-picker.component.d.ts +51 -53
  64. package/lib/date-time/date-time-picker-container/date-time-picker-container.animations.d.ts +1 -1
  65. package/lib/date-time/date-time-picker-container/date-time-picker-container.component.d.ts +38 -39
  66. package/lib/date-time/date-time-picker-input.directive.d.ts +59 -53
  67. package/lib/date-time/date-time-picker-intl.service.d.ts +3 -3
  68. package/lib/date-time/date-time-picker-trigger.directive.d.ts +9 -9
  69. package/lib/date-time/date-time.module.d.ts +4 -4
  70. package/lib/date-time/number-fixed-len.pipe.d.ts +1 -1
  71. package/lib/date-time/timer/timer.component.d.ts +22 -22
  72. package/lib/date-time/timer-box/timer-box.component.d.ts +10 -10
  73. package/lib/dialog/dialog-container/dialog-container.component.d.ts +28 -24
  74. package/lib/dialog/dialog.module.d.ts +4 -4
  75. package/lib/dialog/dialog.service.d.ts +28 -28
  76. package/moment-adapter/date-time-adapter.class.d.ts +9 -9
  77. package/moment-adapter/date-time-format.class.d.ts +2 -2
  78. package/moment-adapter/moment-adapter.module.d.ts +0 -5
  79. package/moment-adapter/public-api.d.ts +1 -1
  80. package/native-adapter/date-time-adapter.class.d.ts +6 -6
  81. package/native-adapter/date-time-format.class.d.ts +2 -2
  82. package/native-adapter/native-adapter.module.d.ts +0 -5
  83. package/native-adapter/public-api.d.ts +1 -1
  84. package/package.json +13 -11
  85. package/public-api.d.ts +13 -13
@@ -12,7 +12,18 @@ export class CalendarCell {
12
12
  this.cellClass = cellClass;
13
13
  }
14
14
  }
15
- export class OwlCalendarBodyComponent {
15
+ export class CalendarBodyComponent {
16
+ get calendarBodyClass() {
17
+ return true;
18
+ }
19
+ get isInSingleMode() {
20
+ return this.selectMode === 'single';
21
+ }
22
+ get isInRangeMode() {
23
+ return (this.selectMode === 'range' ||
24
+ this.selectMode === 'rangeFrom' ||
25
+ this.selectMode === 'rangeTo');
26
+ }
16
27
  constructor(elmRef, ngZone) {
17
28
  this.elmRef = elmRef;
18
29
  this.ngZone = ngZone;
@@ -33,17 +44,6 @@ export class OwlCalendarBodyComponent {
33
44
  * */
34
45
  this.select = new EventEmitter();
35
46
  }
36
- get owlDTCalendarBodyClass() {
37
- return true;
38
- }
39
- get isInSingleMode() {
40
- return this.selectMode === 'single';
41
- }
42
- get isInRangeMode() {
43
- return (this.selectMode === 'range' ||
44
- this.selectMode === 'rangeFrom' ||
45
- this.selectMode === 'rangeTo');
46
- }
47
47
  ngOnInit() { }
48
48
  selectCell(cell) {
49
49
  this.select.emit(cell);
@@ -67,39 +67,43 @@ export class OwlCalendarBodyComponent {
67
67
  const toValue = this.selectedValues[1];
68
68
  return value === fromValue || value === toValue;
69
69
  }
70
+ return false;
70
71
  }
71
72
  /**
72
73
  * Check if the cell in the range
73
74
  * */
74
75
  isInRange(value) {
75
76
  if (this.isInRangeMode) {
76
- const fromValue = this.selectedValues[0];
77
- const toValue = this.selectedValues[1];
78
- if (fromValue !== null && toValue !== null) {
77
+ const fromValue = this.selectedValues?.[0];
78
+ const toValue = this.selectedValues?.[1];
79
+ if (fromValue !== undefined && toValue !== undefined) {
79
80
  return value >= fromValue && value <= toValue;
80
81
  }
81
82
  else {
82
83
  return value === fromValue || value === toValue;
83
84
  }
84
85
  }
86
+ return false;
85
87
  }
86
88
  /**
87
89
  * Check if the cell is the range from
88
90
  * */
89
91
  isRangeFrom(value) {
90
92
  if (this.isInRangeMode) {
91
- const fromValue = this.selectedValues[0];
92
- return fromValue !== null && value === fromValue;
93
+ const fromValue = this.selectedValues?.[0];
94
+ return fromValue !== undefined && value === fromValue;
93
95
  }
96
+ return false;
94
97
  }
95
98
  /**
96
99
  * Check if the cell is the range to
97
100
  * */
98
101
  isRangeTo(value) {
99
102
  if (this.isInRangeMode) {
100
- const toValue = this.selectedValues[1];
101
- return toValue !== null && value === toValue;
103
+ const toValue = this.selectedValues?.[1];
104
+ return toValue !== undefined && value === toValue;
102
105
  }
106
+ return false;
103
107
  }
104
108
  /**
105
109
  * Focus to a active cell
@@ -111,17 +115,17 @@ export class OwlCalendarBodyComponent {
111
115
  .pipe(take(1))
112
116
  .subscribe(() => {
113
117
  this.elmRef.nativeElement
114
- .querySelector('.owl-dt-calendar-cell-active')
115
- .focus();
118
+ ?.querySelector('.nxt-dt-calendar-cell-active')
119
+ ?.focus();
116
120
  });
117
121
  });
118
122
  }
119
123
  }
120
- OwlCalendarBodyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: OwlCalendarBodyComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
121
- OwlCalendarBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: OwlCalendarBodyComponent, selector: "[owl-date-time-calendar-body]", inputs: { activeCell: "activeCell", rows: "rows", numCols: "numCols", cellRatio: "cellRatio", todayValue: "todayValue", selectedValues: "selectedValues", selectMode: "selectMode" }, outputs: { select: "select" }, host: { properties: { "class.owl-dt-calendar-body": "this.owlDTCalendarBodyClass" } }, exportAs: ["owlDateTimeCalendarBody"], ngImport: i0, template: "<tr *ngFor=\"let row of rows; let rowIndex = index\"\n role=\"row\">\n <td *ngFor=\"let item of row; let colIndex = index\"\n class=\"owl-dt-calendar-cell {{item.cellClass}}\"\n [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.owl-dt-calendar-cell-active]=\"isActiveCell(rowIndex, colIndex)\"\n [class.owl-dt-calendar-cell-disabled]=\"!item.enabled\"\n [class.owl-dt-calendar-cell-in-range]=\"isInRange(item.value)\"\n [class.owl-dt-calendar-cell-range-from]=\"isRangeFrom(item.value)\"\n [class.owl-dt-calendar-cell-range-to]=\"isRangeTo(item.value)\"\n [attr.aria-label]=\"item.ariaLabel\"\n [attr.aria-disabled]=\"!item.enabled || null\"\n [style.width.%]=\"100 / numCols\"\n [style.paddingTop.%]=\"50 * cellRatio / numCols\"\n [style.paddingBottom.%]=\"50 * cellRatio / numCols\"\n (click)=\"selectCell(item)\">\n <span class=\"owl-dt-calendar-cell-content\"\n [ngClass]=\"{\n 'owl-dt-calendar-cell-out': item.out,\n 'owl-dt-calendar-cell-today': item.value === todayValue,\n 'owl-dt-calendar-cell-selected': isSelected(item.value)\n }\">\n {{item.displayValue}}\n </span>\n </td>\n</tr>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
122
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: OwlCalendarBodyComponent, decorators: [{
124
+ CalendarBodyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: CalendarBodyComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
125
+ CalendarBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: CalendarBodyComponent, selector: "[nxtDateTimeCalendarBody]", inputs: { activeCell: "activeCell", rows: "rows", numCols: "numCols", cellRatio: "cellRatio", todayValue: "todayValue", selectedValues: "selectedValues", selectMode: "selectMode" }, outputs: { select: "select" }, host: { properties: { "class.nxt-dt-calendar-body": "this.calendarBodyClass" } }, exportAs: ["nxtDateTimeCalendarBody"], ngImport: i0, template: "<tr *ngFor=\"let row of rows; let rowIndex = index\"\n role=\"row\">\n <td *ngFor=\"let item of row; let colIndex = index\"\n class=\"nxt-dt-calendar-cell {{item.cellClass}}\"\n [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.nxt-dt-calendar-cell-active]=\"isActiveCell(rowIndex, colIndex)\"\n [class.nxt-dt-calendar-cell-disabled]=\"!item.enabled\"\n [class.nxt-dt-calendar-cell-in-range]=\"isInRange(item.value)\"\n [class.nxt-dt-calendar-cell-range-from]=\"isRangeFrom(item.value)\"\n [class.nxt-dt-calendar-cell-range-to]=\"isRangeTo(item.value)\"\n [attr.aria-label]=\"item.ariaLabel\"\n [attr.aria-disabled]=\"!item.enabled || null\"\n [style.width.%]=\"100 / numCols\"\n [style.paddingTop.%]=\"50 * cellRatio / numCols\"\n [style.paddingBottom.%]=\"50 * cellRatio / numCols\"\n (click)=\"selectCell(item)\">\n <span class=\"nxt-dt-calendar-cell-content\"\n [ngClass]=\"{\n 'nxt-dt-calendar-cell-out': item.out,\n 'nxt-dt-calendar-cell-today': item.value === todayValue,\n 'nxt-dt-calendar-cell-selected': isSelected(item.value)\n }\">\n {{item.displayValue}}\n </span>\n </td>\n</tr>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: CalendarBodyComponent, decorators: [{
123
127
  type: Component,
124
- args: [{ selector: '[owl-date-time-calendar-body]', exportAs: 'owlDateTimeCalendarBody', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<tr *ngFor=\"let row of rows; let rowIndex = index\"\n role=\"row\">\n <td *ngFor=\"let item of row; let colIndex = index\"\n class=\"owl-dt-calendar-cell {{item.cellClass}}\"\n [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.owl-dt-calendar-cell-active]=\"isActiveCell(rowIndex, colIndex)\"\n [class.owl-dt-calendar-cell-disabled]=\"!item.enabled\"\n [class.owl-dt-calendar-cell-in-range]=\"isInRange(item.value)\"\n [class.owl-dt-calendar-cell-range-from]=\"isRangeFrom(item.value)\"\n [class.owl-dt-calendar-cell-range-to]=\"isRangeTo(item.value)\"\n [attr.aria-label]=\"item.ariaLabel\"\n [attr.aria-disabled]=\"!item.enabled || null\"\n [style.width.%]=\"100 / numCols\"\n [style.paddingTop.%]=\"50 * cellRatio / numCols\"\n [style.paddingBottom.%]=\"50 * cellRatio / numCols\"\n (click)=\"selectCell(item)\">\n <span class=\"owl-dt-calendar-cell-content\"\n [ngClass]=\"{\n 'owl-dt-calendar-cell-out': item.out,\n 'owl-dt-calendar-cell-today': item.value === todayValue,\n 'owl-dt-calendar-cell-selected': isSelected(item.value)\n }\">\n {{item.displayValue}}\n </span>\n </td>\n</tr>\n" }]
128
+ args: [{ selector: '[nxtDateTimeCalendarBody]', exportAs: 'nxtDateTimeCalendarBody', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<tr *ngFor=\"let row of rows; let rowIndex = index\"\n role=\"row\">\n <td *ngFor=\"let item of row; let colIndex = index\"\n class=\"nxt-dt-calendar-cell {{item.cellClass}}\"\n [tabindex]=\"isActiveCell(rowIndex, colIndex) ? 0 : -1\"\n [class.nxt-dt-calendar-cell-active]=\"isActiveCell(rowIndex, colIndex)\"\n [class.nxt-dt-calendar-cell-disabled]=\"!item.enabled\"\n [class.nxt-dt-calendar-cell-in-range]=\"isInRange(item.value)\"\n [class.nxt-dt-calendar-cell-range-from]=\"isRangeFrom(item.value)\"\n [class.nxt-dt-calendar-cell-range-to]=\"isRangeTo(item.value)\"\n [attr.aria-label]=\"item.ariaLabel\"\n [attr.aria-disabled]=\"!item.enabled || null\"\n [style.width.%]=\"100 / numCols\"\n [style.paddingTop.%]=\"50 * cellRatio / numCols\"\n [style.paddingBottom.%]=\"50 * cellRatio / numCols\"\n (click)=\"selectCell(item)\">\n <span class=\"nxt-dt-calendar-cell-content\"\n [ngClass]=\"{\n 'nxt-dt-calendar-cell-out': item.out,\n 'nxt-dt-calendar-cell-today': item.value === todayValue,\n 'nxt-dt-calendar-cell-selected': isSelected(item.value)\n }\">\n {{item.displayValue}}\n </span>\n </td>\n</tr>\n" }]
125
129
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { activeCell: [{
126
130
  type: Input
127
131
  }], rows: [{
@@ -138,8 +142,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
138
142
  type: Input
139
143
  }], select: [{
140
144
  type: Output
141
- }], owlDTCalendarBodyClass: [{
145
+ }], calendarBodyClass: [{
142
146
  type: HostBinding,
143
- args: ['class.owl-dt-calendar-body']
147
+ args: ['class.nxt-dt-calendar-body']
144
148
  }] } });
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtcGljay1kYXRldGltZS9zcmMvbGliL2RhdGUtdGltZS9jYWxlbmRhci1ib2R5L2NhbGVuZGFyLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LXBpY2stZGF0ZXRpbWUvc3JjL2xpYi9kYXRlLXRpbWUvY2FsZW5kYXItYm9keS9jYWxlbmRhci1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN4SSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7OztBQUdyQyxNQUFNLE9BQU8sWUFBWTtJQUNyQixZQUNXLEtBQWEsRUFDYixZQUFvQixFQUNwQixTQUFpQixFQUNqQixPQUFnQixFQUNoQixNQUFlLEtBQUssRUFDcEIsWUFBb0IsRUFBRTtRQUx0QixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLFFBQUcsR0FBSCxHQUFHLENBQWlCO1FBQ3BCLGNBQVMsR0FBVCxTQUFTLENBQWE7SUFDN0IsQ0FBQztDQUNSO0FBV0QsTUFBTSxPQUFPLHdCQUF3QjtJQW1FakMsWUFBb0IsTUFBa0IsRUFBVSxNQUFjO1FBQTFDLFdBQU0sR0FBTixNQUFNLENBQVk7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBbEU5RDs7V0FFRztRQUVILGVBQVUsR0FBRyxDQUFDLENBQUE7UUFRZDs7YUFFSztRQUVMLFlBQU8sR0FBRyxDQUFD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Q0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtpQkFDZixZQUFZLEVBQUU7aUJBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDYixTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYTtxQkFDcEIsYUFBYSxDQUFDLDhCQUE4QixDQUFDO3FCQUM3QyxLQUFLLEVBQUUsQ0FBQTtZQUNoQixDQUFDLENBQUMsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzs7c0hBdEpRLHdCQUF3QjswR0FBeEIsd0JBQXdCLHdaQ3hCckMsMHhDQTBCQTs0RkRGYSx3QkFBd0I7a0JBVHBDLFNBQVM7K0JBRUksK0JBQStCLFlBQy9CLHlCQUF5Qix1QkFHZCxLQUFLLG1CQUNULHVCQUF1QixDQUFDLE1BQU07c0hBTy9DLFVBQVU7c0JBRFQsS0FBSztnQkFPTixJQUFJO3NCQURILEtBQUs7Z0JBT04sT0FBTztzQkFETixLQUFLO2dCQU9OLFNBQVM7c0JBRFIsS0FBSztnQkFPTixVQUFVO3NCQURULEtBQUs7Z0JBT04sY0FBYztzQkFEYixLQUFLO2dCQU9OLFVBQVU7c0JBRFQsS0FBSztnQkFRVSxNQUFNO3NCQUZyQixNQUFNO2dCQUtILHNCQUFzQjtzQkFEekIsV0FBVzt1QkFBQyw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgTmdab25lLCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBTZWxlY3RNb2RlIH0gZnJvbSAnLi4vLi4vY2xhc3MvZGF0ZS10aW1lLmNsYXNzJ1xuXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJDZWxsIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHZhbHVlOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBkaXNwbGF5VmFsdWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhbixcbiAgICAgICAgcHVibGljIG91dDogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgICBwdWJsaWMgY2VsbENsYXNzOiBzdHJpbmcgPSAnJ1xuICAgICkgeyB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdbb3dsLWRhdGUtdGltZS1jYWxlbmRhci1ib2R5XScsXG4gICAgZXhwb3J0QXM6ICdvd2xEYXRlVGltZUNhbGVuZGFyQm9keScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLWJvZHkuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLWJvZHkuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBPd2xDYWxlbmRhckJvZHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIFRoZSBjZWxsIG51bWJlciBvZiB0aGUgYWN0aXZlIGNlbGwgaW4gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWN0aXZlQ2VsbCA9IDBcblxuICAgIC8qKlxuICAgICAqIFRoZSBjZWxscyB0byBkaXNwbGF5IGluIHRoZSB0YWJsZS5cbiAgICAgKiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcm93czogQ2FsZW5kYXJDZWxsW11bXVxuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS5cbiAgICAgKiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbnVtQ29scyA9IDdcblxuICAgIC8qKlxuICAgICAqIFRoZSByYXRpbyAod2lkdGggLyBoZWlnaHQpIHRvIHVzZSBmb3IgdGhlIGNlbGxzIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGNlbGxSYXRpbyA9IDFcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBpbiB0aGUgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0b2RheS5cbiAgICAgKiAqL1xuICAgIEBJbnB1dCgpXG4gICAgdG9kYXlWYWx1ZTogbnVtYmVyXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgaW4gdGhlIHRhYmxlIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkLlxuICAgICAqICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZFZhbHVlczogbnVtYmVyW11cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgcGlja2VyIHNlbGVjdCBtb2RlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RNb2RlOiBTZWxlY3RNb2RlXG5cbiAgICAvKipcbiAgICAgKiBFbWl0IHdoZW4gYSBjYWxlbmRhciBjZWxsIGlzIHNlbGVjdGVkXG4gICAgICogKi9cbiAgICBAT3V0cHV0KClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhckNlbGw+KClcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mub3dsLWR0LWNhbGVuZGFyLWJvZHknKVxuICAgIGdldCBvd2xEVENhbGVuZGFyQm9keUNsYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGdldCBpc0luU2luZ2xlTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZSdcbiAgICB9XG5cbiAgICBnZXQgaXNJblJhbmdlTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyB8fFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJyB8fFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2VUbydcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxtUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7IH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHsgfVxuXG4gICAgcHVibGljIHNlbGVjdENlbGwoY2VsbDogQ2FsZW5kYXJDZWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0LmVtaXQoY2VsbClcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBY3RpdmVDZWxsKHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY2VsbE51bWJlciA9IHJvd0luZGV4ICogdGhpcy5udW1Db2xzICsgY29sSW5kZXhcbiAgICAgICAgcmV0dXJuIGNlbGxOdW1iZXIgPT09IHRoaXMuYWN0aXZlQ2VsbFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBjZWxsIGlzIHNlbGVjdGVkXG4gICAgICovXG4gICAgcHVibGljIGlzU2VsZWN0ZWQodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRWYWx1ZXMgfHwgdGhpcy5zZWxlY3RlZFZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdGhpcy5zZWxlY3RlZFZhbHVlc1swXVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNJblJhbmdlTW9kZSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbVZhbHVlID0gdGhpcy5zZWxlY3RlZFZhbHVlc1swXVxuICAgICAgICAgICAgY29uc3QgdG9WYWx1ZSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXNbMV1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmcm9tVmFsdWUgfHwgdmFsdWUgPT09IHRvVmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBjZWxsIGluIHRoZSByYW5nZVxuICAgICAqICovXG4gICAgcHVibGljIGlzSW5SYW5nZSh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXNbMF1cbiAgICAgICAgICAgIGNvbnN0IHRvVmFsdWUgPSB0aGlzLnNlbGVjdGVkVmFsdWVzWzFdXG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IG51bGwgJiYgdG9WYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA+PSBmcm9tVmFsdWUgJiYgdmFsdWUgPD0gdG9WYWx1ZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZyb21WYWx1ZSB8fCB2YWx1ZSA9PT0gdG9WYWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGNlbGwgaXMgdGhlIHJhbmdlIGZyb21cbiAgICAgKiAqL1xuICAgIHB1YmxpYyBpc1JhbmdlRnJvbSh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXNbMF1cbiAgICAgICAgICAgIHJldHVybiBmcm9tVmFsdWUgIT09IG51bGwgJiYgdmFsdWUgPT09IGZyb21WYWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGNlbGwgaXMgdGhlIHJhbmdlIHRvXG4gICAgICogKi9cbiAgICBwdWJsaWMgaXNSYW5nZVRvKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJblJhbmdlTW9kZSkge1xuICAgICAgICAgICAgY29uc3QgdG9WYWx1ZSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXNbMV1cbiAgICAgICAgICAgIHJldHVybiB0b1ZhbHVlICE9PSBudWxsICYmIHZhbHVlID09PSB0b1ZhbHVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb2N1cyB0byBhIGFjdGl2ZSBjZWxsXG4gICAgICogKi9cbiAgICBwdWJsaWMgZm9jdXNBY3RpdmVDZWxsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcub3dsLWR0LWNhbGVuZGFyLWNlbGwtYWN0aXZlJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCI8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXG4gICAgcm9sZT1cInJvd1wiPlxuICAgIDx0ZCAqbmdGb3I9XCJsZXQgaXRlbSBvZiByb3c7IGxldCBjb2xJbmRleCA9IGluZGV4XCJcbiAgICAgICAgY2xhc3M9XCJvd2wtZHQtY2FsZW5kYXItY2VsbCB7e2l0ZW0uY2VsbENsYXNzfX1cIlxuICAgICAgICBbdGFiaW5kZXhdPVwiaXNBY3RpdmVDZWxsKHJvd0luZGV4LCBjb2xJbmRleCkgPyAwIDogLTFcIlxuICAgICAgICBbY2xhc3Mub3dsLWR0LWNhbGVuZGFyLWNlbGwtYWN0aXZlXT1cImlzQWN0aXZlQ2VsbChyb3dJbmRleCwgY29sSW5kZXgpXCJcbiAgICAgICAgW2NsYXNzLm93bC1kdC1jYWxlbmRhci1jZWxsLWRpc2FibGVkXT1cIiFpdGVtLmVuYWJsZWRcIlxuICAgICAgICBbY2xhc3Mub3dsLWR0LWNhbGVuZGFyLWNlbGwtaW4tcmFuZ2VdPVwiaXNJblJhbmdlKGl0ZW0udmFsdWUpXCJcbiAgICAgICAgW2NsYXNzLm93bC1kdC1jYWxlbmRhci1jZWxsLXJhbmdlLWZyb21dPVwiaXNSYW5nZUZyb20oaXRlbS52YWx1ZSlcIlxuICAgICAgICBbY2xhc3Mub3dsLWR0LWNhbGVuZGFyLWNlbGwtcmFuZ2UtdG9dPVwiaXNSYW5nZVRvKGl0ZW0udmFsdWUpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpdGVtLmFyaWFMYWJlbFwiXG4gICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIWl0ZW0uZW5hYmxlZCB8fCBudWxsXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiMTAwIC8gbnVtQ29sc1wiXG4gICAgICAgIFtzdHlsZS5wYWRkaW5nVG9wLiVdPVwiNTAgKiBjZWxsUmF0aW8gLyBudW1Db2xzXCJcbiAgICAgICAgW3N0eWxlLnBhZGRpbmdCb3R0b20uJV09XCI1MCAqIGNlbGxSYXRpbyAvIG51bUNvbHNcIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2VsbChpdGVtKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm93bC1kdC1jYWxlbmRhci1jZWxsLWNvbnRlbnRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICdvd2wtZHQtY2FsZW5kYXItY2VsbC1vdXQnOiBpdGVtLm91dCxcbiAgICAgICAgICAgICAgICAnb3dsLWR0LWNhbGVuZGFyLWNlbGwtdG9kYXknOiBpdGVtLnZhbHVlID09PSB0b2RheVZhbHVlLFxuICAgICAgICAgICAgICAgICdvd2wtZHQtY2FsZW5kYXItY2VsbC1zZWxlY3RlZCc6IGlzU2VsZWN0ZWQoaXRlbS52YWx1ZSlcbiAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAge3tpdGVtLmRpc3BsYXlWYWx1ZX19XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L3RkPlxuPC90cj5cbiJdfQ==
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2NhbGVuZGFyLWJvZHkvY2FsZW5kYXItYm9keS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2NhbGVuZGFyLWJvZHkvY2FsZW5kYXItYm9keS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFrQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDeEksT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFBOzs7QUFHckMsTUFBTSxPQUFPLFlBQVk7SUFDckIsWUFDVyxLQUFhLEVBQ2IsWUFBb0IsRUFDcEIsU0FBaUIsRUFDakIsT0FBZ0IsRUFDaEIsTUFBZSxLQUFLLEVBQ3BCLFlBQW9CLEVBQUU7UUFMdEIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQ3BCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDakIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixRQUFHLEdBQUgsR0FBRyxDQUFpQjtRQUNwQixjQUFTLEdBQVQsU0FBUyxDQUFhO0lBQzdCLENBQUM7Q0FDUjtBQVdELE1BQU0sT0FBTyxxQkFBcUI7SUFrRDlCLElBQ0ksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELElBQUksY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUE7SUFDdkMsQ0FBQztJQUVELElBQUksYUFBYTtRQUNiLE9BQU8sQ0FDSCxJQUFJLENBQUMs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QVMsSUFBSSxLQUFLLEtBQUssT0FBTyxDQUFBO1NBQ3BEO1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDaEIsQ0FBQztJQUVEOztTQUVLO0lBQ0UsZUFBZTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7aUJBQ2YsWUFBWSxFQUFFO2lCQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2IsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWE7b0JBQ3JCLEVBQUUsYUFBYSxDQUFjLDhCQUE4QixDQUFDO29CQUM1RCxFQUFFLEtBQUssRUFBRSxDQUFBO1lBQ2pCLENBQUMsQ0FBQyxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDOztrSEE3SlEscUJBQXFCO3NHQUFyQixxQkFBcUIsK1lDeEJsQywweENBMEJBOzJGREZhLHFCQUFxQjtrQkFUakMsU0FBUzsrQkFFSSwyQkFBMkIsWUFDM0IseUJBQXlCLHVCQUdkLEtBQUssbUJBQ1QsdUJBQXVCLENBQUMsTUFBTTtzSEFPL0MsVUFBVTtzQkFEVCxLQUFLO2dCQU9OLElBQUk7c0JBREgsS0FBSztnQkFPTixPQUFPO3NCQUROLEtBQUs7Z0JBT04sU0FBUztzQkFEUixLQUFLO2dCQU9OLFVBQVU7c0JBRFQsS0FBSztnQkFPTixjQUFjO3NCQURiLEtBQUs7Z0JBT04sVUFBVTtzQkFEVCxLQUFLO2dCQVFVLE1BQU07c0JBRnJCLE1BQU07Z0JBS0gsaUJBQWlCO3NCQURwQixXQUFXO3VCQUFDLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBOZ1pvbmUsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IFNlbGVjdE1vZGUgfSBmcm9tICcuLi8uLi9jbGFzcy9kYXRlLXRpbWUuY2xhc3MnXG5cbmV4cG9ydCBjbGFzcyBDYWxlbmRhckNlbGwge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgdmFsdWU6IG51bWJlcixcbiAgICAgICAgcHVibGljIGRpc3BsYXlWYWx1ZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgb3V0OiBib29sZWFuID0gZmFsc2UsXG4gICAgICAgIHB1YmxpYyBjZWxsQ2xhc3M6IHN0cmluZyA9ICcnXG4gICAgKSB7IH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1tueHREYXRlVGltZUNhbGVuZGFyQm9keV0nLFxuICAgIGV4cG9ydEFzOiAnbnh0RGF0ZVRpbWVDYWxlbmRhckJvZHknLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1ib2R5LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1ib2R5LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJCb2R5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2VsbCBudW1iZXIgb2YgdGhlIGFjdGl2ZSBjZWxsIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGFjdGl2ZUNlbGwgPSAwXG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2VsbHMgdG8gZGlzcGxheSBpbiB0aGUgdGFibGUuXG4gICAgICogKi9cbiAgICBASW5wdXQoKVxuICAgIHJvd3M/OiBDYWxlbmRhckNlbGxbXVtdXG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlLlxuICAgICAqICovXG4gICAgQElucHV0KClcbiAgICBudW1Db2xzID0gN1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJhdGlvICh3aWR0aCAvIGhlaWdodCkgdG8gdXNlIGZvciB0aGUgY2VsbHMgaW4gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgY2VsbFJhdGlvID0gMVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIGluIHRoZSB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRvZGF5LlxuICAgICAqICovXG4gICAgQElucHV0KClcbiAgICB0b2RheVZhbHVlPzogbnVtYmVyXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgaW4gdGhlIHRhYmxlIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkLlxuICAgICAqICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PG51bWJlciB8IHVuZGVmaW5lZD5cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgcGlja2VyIHNlbGVjdCBtb2RlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RNb2RlPzogU2VsZWN0TW9kZVxuXG4gICAgLyoqXG4gICAgICogRW1pdCB3aGVuIGEgY2FsZW5kYXIgY2VsbCBpcyBzZWxlY3RlZFxuICAgICAqICovXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gICAgcHVibGljIHJlYWRvbmx5IHNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJDZWxsPigpXG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm54dC1kdC1jYWxlbmRhci1ib2R5JylcbiAgICBnZXQgY2FsZW5kYXJCb2R5Q2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgZ2V0IGlzSW5TaW5nbGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJ1xuICAgIH1cblxuICAgIGdldCBpc0luUmFuZ2VNb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2UnIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZVRvJ1xuICAgICAgICApXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZWxtUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmU6IE5nWm9uZVxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7IH1cblxuICAgIHB1YmxpYyBzZWxlY3RDZWxsKGNlbGw6IENhbGVuZGFyQ2VsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdC5lbWl0KGNlbGwpXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWN0aXZlQ2VsbChyb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNlbGxOdW1iZXIgPSByb3dJbmRleCAqIHRoaXMubnVtQ29scyArIGNvbEluZGV4XG4gICAgICAgIHJldHVybiBjZWxsTnVtYmVyID09PSB0aGlzLmFjdGl2ZUNlbGxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgY2VsbCBpcyBzZWxlY3RlZFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1NlbGVjdGVkKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkVmFsdWVzIHx8IHRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzSW5TaW5nbGVNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZXNbMF1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXNbMF1cbiAgICAgICAgICAgIGNvbnN0IHRvVmFsdWUgPSB0aGlzLnNlbGVjdGVkVmFsdWVzWzFdXG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gZnJvbVZhbHVlIHx8IHZhbHVlID09PSB0b1ZhbHVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGNlbGwgaW4gdGhlIHJhbmdlXG4gICAgICogKi9cbiAgICBwdWJsaWMgaXNJblJhbmdlKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJblJhbmdlTW9kZSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbVZhbHVlID0gdGhpcy5zZWxlY3RlZFZhbHVlcz8uWzBdXG4gICAgICAgICAgICBjb25zdCB0b1ZhbHVlID0gdGhpcy5zZWxlY3RlZFZhbHVlcz8uWzFdXG5cbiAgICAgICAgICAgIGlmIChmcm9tVmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0b1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPj0gZnJvbVZhbHVlICYmIHZhbHVlIDw9IHRvVmFsdWVcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmcm9tVmFsdWUgfHwgdmFsdWUgPT09IHRvVmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgY2VsbCBpcyB0aGUgcmFuZ2UgZnJvbVxuICAgICAqICovXG4gICAgcHVibGljIGlzUmFuZ2VGcm9tKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJblJhbmdlTW9kZSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbVZhbHVlID0gdGhpcy5zZWxlY3RlZFZhbHVlcz8uWzBdXG4gICAgICAgICAgICByZXR1cm4gZnJvbVZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPT09IGZyb21WYWx1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBjZWxsIGlzIHRoZSByYW5nZSB0b1xuICAgICAqICovXG4gICAgcHVibGljIGlzUmFuZ2VUbyh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvVmFsdWUgPSB0aGlzLnNlbGVjdGVkVmFsdWVzPy5bMV1cbiAgICAgICAgICAgIHJldHVybiB0b1ZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPT09IHRvVmFsdWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb2N1cyB0byBhIGFjdGl2ZSBjZWxsXG4gICAgICogKi9cbiAgICBwdWJsaWMgZm9jdXNBY3RpdmVDZWxsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5ueHQtZHQtY2FsZW5kYXItY2VsbC1hY3RpdmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgPy5mb2N1cygpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCI8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXG4gICAgcm9sZT1cInJvd1wiPlxuICAgIDx0ZCAqbmdGb3I9XCJsZXQgaXRlbSBvZiByb3c7IGxldCBjb2xJbmRleCA9IGluZGV4XCJcbiAgICAgICAgY2xhc3M9XCJueHQtZHQtY2FsZW5kYXItY2VsbCB7e2l0ZW0uY2VsbENsYXNzfX1cIlxuICAgICAgICBbdGFiaW5kZXhdPVwiaXNBY3RpdmVDZWxsKHJvd0luZGV4LCBjb2xJbmRleCkgPyAwIDogLTFcIlxuICAgICAgICBbY2xhc3Mubnh0LWR0LWNhbGVuZGFyLWNlbGwtYWN0aXZlXT1cImlzQWN0aXZlQ2VsbChyb3dJbmRleCwgY29sSW5kZXgpXCJcbiAgICAgICAgW2NsYXNzLm54dC1kdC1jYWxlbmRhci1jZWxsLWRpc2FibGVkXT1cIiFpdGVtLmVuYWJsZWRcIlxuICAgICAgICBbY2xhc3Mubnh0LWR0LWNhbGVuZGFyLWNlbGwtaW4tcmFuZ2VdPVwiaXNJblJhbmdlKGl0ZW0udmFsdWUpXCJcbiAgICAgICAgW2NsYXNzLm54dC1kdC1jYWxlbmRhci1jZWxsLXJhbmdlLWZyb21dPVwiaXNSYW5nZUZyb20oaXRlbS52YWx1ZSlcIlxuICAgICAgICBbY2xhc3Mubnh0LWR0LWNhbGVuZGFyLWNlbGwtcmFuZ2UtdG9dPVwiaXNSYW5nZVRvKGl0ZW0udmFsdWUpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpdGVtLmFyaWFMYWJlbFwiXG4gICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIWl0ZW0uZW5hYmxlZCB8fCBudWxsXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiMTAwIC8gbnVtQ29sc1wiXG4gICAgICAgIFtzdHlsZS5wYWRkaW5nVG9wLiVdPVwiNTAgKiBjZWxsUmF0aW8gLyBudW1Db2xzXCJcbiAgICAgICAgW3N0eWxlLnBhZGRpbmdCb3R0b20uJV09XCI1MCAqIGNlbGxSYXRpbyAvIG51bUNvbHNcIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2VsbChpdGVtKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm54dC1kdC1jYWxlbmRhci1jZWxsLWNvbnRlbnRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICdueHQtZHQtY2FsZW5kYXItY2VsbC1vdXQnOiBpdGVtLm91dCxcbiAgICAgICAgICAgICAgICAnbnh0LWR0LWNhbGVuZGFyLWNlbGwtdG9kYXknOiBpdGVtLnZhbHVlID09PSB0b2RheVZhbHVlLFxuICAgICAgICAgICAgICAgICdueHQtZHQtY2FsZW5kYXItY2VsbC1zZWxlY3RlZCc6IGlzU2VsZWN0ZWQoaXRlbS52YWx1ZSlcbiAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAge3tpdGVtLmRpc3BsYXlWYWx1ZX19XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L3RkPlxuPC90cj5cbiJdfQ==