@tetacom/ng-components 1.0.148 → 1.0.150

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 (179) hide show
  1. package/assets/color-icons.svg +49 -521
  2. package/assets/file-icons.svg +0 -1
  3. package/assets/icons.svg +205 -138
  4. package/common/model/view-type.model.d.ts +1 -0
  5. package/component/accordion/accordion-item/accordion-item.component.d.ts +4 -1
  6. package/component/avatar/avatar/avatar.component.d.ts +17 -0
  7. package/component/avatar/avatar.module.d.ts +9 -0
  8. package/component/avatar/model/avatar-color.enum.d.ts +20 -0
  9. package/component/avatar/public-api.d.ts +2 -0
  10. package/component/button/button/button.component.d.ts +4 -1
  11. package/component/checkbox/checkbox/checkbox.component.d.ts +2 -1
  12. package/component/date-picker/base-calendar.d.ts +49 -0
  13. package/component/date-picker/base-picker.d.ts +60 -0
  14. package/component/date-picker/date-picker/date-calendar/date-calendar.component.d.ts +20 -0
  15. package/component/date-picker/date-picker/date-picker.component.d.ts +38 -68
  16. package/component/date-picker/date-picker.module.d.ts +19 -15
  17. package/component/date-picker/date-range/date-range.component.d.ts +46 -0
  18. package/component/date-picker/date-range/range-calendar/range-calendar.component.d.ts +39 -0
  19. package/component/date-picker/day-picker/day-item/day-item.component.d.ts +9 -0
  20. package/component/date-picker/day-picker/day-picker.component.d.ts +30 -0
  21. package/component/date-picker/model/from-to.model.d.ts +4 -0
  22. package/component/date-picker/model/min-max-date.model.d.ts +4 -0
  23. package/component/date-picker/month-picker/month-picker.component.d.ts +16 -50
  24. package/component/date-picker/public-api.d.ts +5 -4
  25. package/component/date-picker/year-picker/scroll-to-selected-year.directive.d.ts +11 -0
  26. package/component/date-picker/year-picker/year-picker.component.d.ts +24 -0
  27. package/component/divider/divider/divider.component.d.ts +10 -0
  28. package/component/divider/divider.module.d.ts +8 -0
  29. package/component/divider/public-api.d.ts +2 -0
  30. package/component/dropdown/dropdown-base.d.ts +3 -1
  31. package/component/icon/icon-file/icon-file.component.d.ts +9 -3
  32. package/component/icon/icon-file/icon-file.module.d.ts +9 -0
  33. package/component/icon/icon.module.d.ts +4 -5
  34. package/component/icon/public-api.d.ts +1 -0
  35. package/component/input/input/input.component.d.ts +3 -1
  36. package/component/message/model/message.d.ts +3 -0
  37. package/component/public-api.d.ts +2 -0
  38. package/component/select/select/select.component.d.ts +4 -1
  39. package/component/switch/switch/switch.component.d.ts +4 -1
  40. package/directive/hint/hint.directive.d.ts +3 -1
  41. package/esm2020/common/model/view-type.model.mjs +2 -0
  42. package/esm2020/component/accordion/accordion/accordion.component.mjs +3 -2
  43. package/esm2020/component/accordion/accordion-head/accordion-head.component.mjs +3 -2
  44. package/esm2020/component/accordion/accordion-item/accordion-item.component.mjs +13 -3
  45. package/esm2020/component/avatar/avatar/avatar.component.mjs +57 -0
  46. package/esm2020/component/avatar/avatar.module.mjs +28 -0
  47. package/esm2020/component/avatar/model/avatar-color.enum.mjs +22 -0
  48. package/esm2020/component/avatar/public-api.mjs +3 -0
  49. package/esm2020/component/button/button/button.component.mjs +18 -3
  50. package/esm2020/component/checkbox/checkbox/checkbox.component.mjs +6 -3
  51. package/esm2020/component/date-picker/base-calendar.mjs +99 -0
  52. package/esm2020/component/date-picker/base-picker.mjs +102 -0
  53. package/esm2020/component/date-picker/date-picker/date-calendar/date-calendar.component.mjs +49 -0
  54. package/esm2020/component/date-picker/date-picker/date-picker.component.mjs +141 -234
  55. package/esm2020/component/date-picker/date-picker.module.mjs +41 -41
  56. package/esm2020/component/date-picker/date-range/date-range.component.mjs +211 -0
  57. package/esm2020/component/date-picker/date-range/range-calendar/range-calendar.component.mjs +108 -0
  58. package/esm2020/component/date-picker/day-picker/day-item/day-item.component.mjs +15 -0
  59. package/esm2020/component/date-picker/day-picker/day-picker.component.mjs +113 -0
  60. package/esm2020/component/date-picker/model/from-to.model.mjs +2 -0
  61. package/esm2020/component/date-picker/model/min-max-date.model.mjs +2 -0
  62. package/esm2020/component/date-picker/month-picker/month-picker.component.mjs +33 -236
  63. package/esm2020/component/date-picker/public-api.mjs +6 -5
  64. package/esm2020/component/date-picker/year-picker/scroll-to-selected-year.directive.mjs +26 -0
  65. package/esm2020/component/date-picker/year-picker/year-picker.component.mjs +48 -0
  66. package/esm2020/component/divider/divider/divider.component.mjs +18 -0
  67. package/esm2020/component/divider/divider.module.mjs +20 -0
  68. package/esm2020/component/divider/public-api.mjs +3 -0
  69. package/esm2020/component/dropdown/dropdown/dropdown.component.mjs +3 -2
  70. package/esm2020/component/dropdown/dropdown-base.mjs +6 -2
  71. package/esm2020/component/dropdown/dropdown.directive.mjs +1 -1
  72. package/esm2020/component/expand-card/expand-card/expand-card.component.mjs +1 -1
  73. package/esm2020/component/expand-card/expand-item/expand-item.component.mjs +1 -1
  74. package/esm2020/component/expand-panel/expand-panel/expand-panel.component.mjs +1 -1
  75. package/esm2020/component/file-upload/file-upload-area/file-upload-area.component.mjs +1 -1
  76. package/esm2020/component/filter/date-filter/date-filter.component.mjs +1 -1
  77. package/esm2020/component/filter/list-filter/list-filter.component.mjs +1 -1
  78. package/esm2020/component/filter/numeric-filter/numeric-filter.component.mjs +1 -1
  79. package/esm2020/component/filter/string-filter/string-filter.component.mjs +1 -1
  80. package/esm2020/component/icon/icon-file/icon-file.component.mjs +20 -6
  81. package/esm2020/component/icon/icon-file/icon-file.module.mjs +28 -0
  82. package/esm2020/component/icon/icon.module.mjs +1 -6
  83. package/esm2020/component/icon/public-api.mjs +2 -1
  84. package/esm2020/component/input/input/input.component.mjs +6 -3
  85. package/esm2020/component/input/input.module.mjs +1 -1
  86. package/esm2020/component/input/text-field/text-field.component.mjs +3 -3
  87. package/esm2020/component/message/message/message.component.mjs +4 -3
  88. package/esm2020/component/message/message-host/message-host.component.mjs +1 -1
  89. package/esm2020/component/message/model/message.mjs +2 -1
  90. package/esm2020/component/modal/dialog/dialog.component.mjs +1 -1
  91. package/esm2020/component/property-grid/property-grid/property-grid-item/property-grid-item.component.mjs +2 -2
  92. package/esm2020/component/public-api.mjs +4 -1
  93. package/esm2020/component/select/select/select.component.mjs +9 -4
  94. package/esm2020/component/switch/switch/switch.component.mjs +19 -7
  95. package/esm2020/component/table/default/boolean-cell/boolean-cell.component.mjs +1 -1
  96. package/esm2020/component/table/default/date-cell/date-cell.component.mjs +1 -1
  97. package/esm2020/component/table/default/date-time-cell/date-time-cell.component.mjs +1 -1
  98. package/esm2020/component/table/default/default-head-cell/default-head-cell.component.mjs +1 -1
  99. package/esm2020/component/table/default/list-cell/list-cell.component.mjs +1 -1
  100. package/esm2020/component/table/default/string-cell/string-cell.component.mjs +1 -1
  101. package/esm2020/component/table/selection-cell/selection-cell.component.mjs +1 -1
  102. package/esm2020/component/table/selection-head-cell/selection-head-cell.component.mjs +1 -1
  103. package/esm2020/component/table/table-head/filter-dropdown-tab/filter-dropdown-tab.component.mjs +1 -1
  104. package/esm2020/component/table/table-head/visibility-dropdown-tab/visibility-dropdown-tab.component.mjs +1 -1
  105. package/esm2020/component/theme-switch/theme-switch/theme-switch.component.mjs +1 -1
  106. package/esm2020/directive/hint/hint.directive.mjs +6 -3
  107. package/esm2020/locale/en.mjs +3 -1
  108. package/esm2020/locale/ru.mjs +3 -1
  109. package/esm2020/locale/teta-localisation.mjs +1 -1
  110. package/fesm2015/tetacom-ng-components.mjs +2898 -3015
  111. package/fesm2015/tetacom-ng-components.mjs.map +1 -1
  112. package/fesm2020/tetacom-ng-components.mjs +5440 -5565
  113. package/fesm2020/tetacom-ng-components.mjs.map +1 -1
  114. package/locale/teta-localisation.d.ts +2 -0
  115. package/package.json +3 -2
  116. package/style/accordion.scss +28 -6
  117. package/style/assembly-library.scss +4 -1
  118. package/style/assembly-presets.scss +0 -1
  119. package/style/badge.scss +28 -0
  120. package/style/bottombar.scss +5 -0
  121. package/style/button.scss +16 -13
  122. package/style/checkbox.scss +26 -13
  123. package/style/chips.scss +10 -10
  124. package/style/color.scss +1 -36
  125. package/style/datepicker.scss +139 -24
  126. package/style/divider.scss +15 -0
  127. package/style/drag.scss +1 -1
  128. package/style/dropdown.scss +6 -4
  129. package/style/hint.scss +5 -5
  130. package/style/icon.scss +2 -1
  131. package/style/input.scss +32 -23
  132. package/style/layout.scss +6 -2
  133. package/style/list.scss +11 -8
  134. package/style/loader.scss +2 -2
  135. package/style/message.scss +15 -7
  136. package/style/modal.scss +3 -2
  137. package/style/navigation.scss +4 -1
  138. package/style/presets/color-presets.scss +8 -160
  139. package/style/presets/font-presets.scss +26 -25
  140. package/style/presets/view-types.scss +15 -0
  141. package/style/progress.scss +3 -3
  142. package/style/radio.scss +21 -7
  143. package/style/resize-panel.scss +2 -2
  144. package/style/scroll.scss +3 -3
  145. package/style/select.scss +26 -21
  146. package/style/shadow.scss +0 -20
  147. package/style/sidebar.scss +1 -1
  148. package/style/switch.scss +15 -10
  149. package/style/table.scss +15 -15
  150. package/style/tabs.scss +11 -11
  151. package/style/tag.scss +37 -0
  152. package/style/toggle.scss +20 -18
  153. package/style/toolbar.scss +1 -1
  154. package/style/tooltip.scss +8 -6
  155. package/style/tree.scss +4 -4
  156. package/component/date-picker/day-select/day-select.component.d.ts +0 -51
  157. package/component/date-picker/model/date-picker-mode.enum.d.ts +0 -5
  158. package/component/date-picker/month-select/month-select.component.d.ts +0 -40
  159. package/component/date-picker/service/picker-touch.service.d.ts +0 -12
  160. package/component/date-picker/time-part-control/time-part-control.component.d.ts +0 -26
  161. package/component/date-picker/util/date-picker-util.d.ts +0 -15
  162. package/component/date-picker/year-select/year-select.component.d.ts +0 -45
  163. package/esm2020/component/date-picker/day-select/day-select.component.mjs +0 -184
  164. package/esm2020/component/date-picker/model/date-picker-mode.enum.mjs +0 -7
  165. package/esm2020/component/date-picker/month-select/month-select.component.mjs +0 -148
  166. package/esm2020/component/date-picker/service/picker-touch.service.mjs +0 -34
  167. package/esm2020/component/date-picker/time-part-control/time-part-control.component.mjs +0 -73
  168. package/esm2020/component/date-picker/util/date-picker-util.mjs +0 -142
  169. package/esm2020/component/date-picker/year-select/year-select.component.mjs +0 -189
  170. package/esm2020/pipe/prepend-zero/prepend-zero.module.mjs +0 -18
  171. package/esm2020/pipe/prepend-zero/prepend-zero.pipe.mjs +0 -21
  172. package/pipe/prepend-zero/prepend-zero.module.d.ts +0 -8
  173. package/pipe/prepend-zero/prepend-zero.pipe.d.ts +0 -7
  174. package/style/presets/shadow-presets.scss +0 -16
  175. package/style/tokens/basedark.tokens.css +0 -77
  176. package/style/tokens/baselight.tokens.css +0 -61
  177. package/style/tokens/global.tokens.css +0 -235
  178. package/style/tokens/utility.tokens.css +0 -1119
  179. package/style/util/button-util.scss +0 -58
@@ -1,288 +1,195 @@
1
- import { ChangeDetectionStrategy, Component, forwardRef, HostBinding, HostListener, Input, } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { takeWhile } from 'rxjs/operators';
4
- import { DatePickerMode } from '../model/date-picker-mode.enum';
5
- import { DateUtil } from '../../../util/date-util';
6
- import { DatePickerUtil } from '../util/date-picker-util';
7
- import { Align } from '../../../common/enum/align.enum';
8
- import { VerticalAlign } from '../../../common/enum/vertical-align.enum';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
3
+ import { Align } from "../../../common/enum/align.enum";
4
+ import { VerticalAlign } from "../../../common/enum/vertical-align.enum";
5
+ import { DatePipe } from "@angular/common";
6
+ import { BasePicker } from "../base-picker";
7
+ import dayjs from "dayjs";
8
+ import { maskitoDateOptionsGenerator, maskitoDateTimeOptionsGenerator } from "@maskito/kit";
9
+ import { ReplaySubject } from 'rxjs';
9
10
  import * as i0 from "@angular/core";
10
- import * as i1 from "../../../locale/teta-config.service";
11
- import * as i2 from "@angular/common";
12
- import * as i3 from "../../dropdown/dropdown/dropdown.component";
13
- import * as i4 from "../../dropdown/dropdown-head.directive";
14
- import * as i5 from "../../dropdown/dropdown-content.directive";
15
- import * as i6 from "@angular/forms";
11
+ import * as i1 from "@angular/common";
12
+ import * as i2 from "../../dropdown/dropdown/dropdown.component";
13
+ import * as i3 from "../../dropdown/dropdown-head.directive";
14
+ import * as i4 from "../../dropdown/dropdown-content.directive";
15
+ import * as i5 from "@angular/forms";
16
+ import * as i6 from "@maskito/angular";
16
17
  import * as i7 from "../../icon/icon/icon.component";
17
- import * as i8 from "../../button/button/button.component";
18
- import * as i9 from "../day-select/day-select.component";
19
- import * as i10 from "../year-select/year-select.component";
20
- import * as i11 from "../month-select/month-select.component";
21
- import * as i12 from "../time-part-control/time-part-control.component";
18
+ import * as i8 from "../../input/input/input.component";
19
+ import * as i9 from "./date-calendar/date-calendar.component";
22
20
  export const DATE_PICKER_CONTROL_VALUE_ACCESSOR = {
23
21
  provide: NG_VALUE_ACCESSOR,
24
22
  useExisting: forwardRef(() => DatePickerComponent),
25
23
  multi: true,
26
24
  };
27
- export class DatePickerComponent {
28
- constructor(localeService, _cdr, _elementRef) {
29
- this.localeService = localeService;
30
- this._cdr = _cdr;
25
+ export class DatePickerComponent extends BasePicker {
26
+ constructor(_elementRef, _cdr, datePipe) {
27
+ super(_elementRef, _cdr, datePipe);
31
28
  this._elementRef = _elementRef;
32
- this.firstDayOfWeek = 1;
29
+ this._cdr = _cdr;
30
+ this.datePipe = datePipe;
31
+ this.date = null;
32
+ this.locale = 'ru';
33
+ this.showTime = false;
34
+ this.minDate = null;
35
+ this.maxDate = null;
36
+ this.invalid = false;
37
+ this.disabled = false;
33
38
  this.align = Align.left;
34
39
  this.verticalAlign = VerticalAlign.auto;
35
- this.allowNull = true;
36
- this.showTime = false;
37
- this.classDatepicker = true;
38
- this.tabindex = 0;
39
- this.today = new Date();
40
- this.datePickerModeEnum = DatePickerMode;
41
- this.displayMode = DatePickerMode.date;
42
- this._value = null;
43
- this._alive = true;
44
- this.onChange = (_) => {
45
- };
46
- this.onTouched = () => {
47
- };
48
- this.setDate = (day) => {
49
- if (day === null || day === undefined) {
50
- this.currentValue = null;
51
- return;
52
- }
53
- const dt = this.internalValue;
54
- dt.setFullYear(day.getFullYear(), day.getMonth(), day.getDate());
55
- this.currentValue = new Date(dt);
56
- this._cdr.markForCheck();
57
- };
58
- this.setYear = (year) => {
59
- const dt = this.internalValue;
60
- dt.setFullYear(year);
61
- this.currentValue = new Date(dt);
62
- this.setMode(DatePickerMode.date);
63
- this._cdr.markForCheck();
64
- };
65
- this.setMonth = (month) => {
66
- const dt = this.internalValue;
67
- dt.setMonth(month);
68
- this.currentValue = new Date(dt);
69
- this.setMode(DatePickerMode.date);
70
- this._cdr.markForCheck();
71
- };
72
- this.setHour = (hours) => {
73
- const dt = this.internalValue;
74
- dt.setHours(hours);
75
- this.currentValue = new Date(dt);
76
- this._cdr.markForCheck();
77
- };
78
- this.setMinute = (minute) => {
79
- const dt = this.internalValue;
80
- dt.setMinutes(minute);
81
- this.currentValue = new Date(dt);
82
- this._cdr.markForCheck();
83
- };
84
- this.setSecond = (seconds) => {
85
- const dt = this.internalValue;
86
- dt.setSeconds(seconds);
87
- this.currentValue = new Date(dt);
88
- this._cdr.markForCheck();
89
- };
90
- this.setToday = () => {
91
- this.currentValue = this.emptyDate();
92
- this._cdr.markForCheck();
93
- };
94
- this.clearPicker = (event) => {
95
- this.preventEvent(event);
96
- this.value = null;
97
- this.onChange(null);
98
- };
99
- this.isDateInDisabledPeriod = (dat) => {
100
- if (!this.disabledPeriods || this.disabledPeriods.length < 1 || !dat) {
101
- return false;
102
- }
103
- return this.disabledPeriods.some((d) => d &&
104
- d.start &&
105
- d.end &&
106
- d.start.getTime() <= dat.getTime() &&
107
- d.end.getTime() >= dat.getTime());
108
- };
109
- this.isScrollIgnored = () => this.displayMode === DatePickerMode.month ||
110
- this.displayMode === DatePickerMode.year;
111
- this.scrollMonth = (e) => {
112
- const delta = e?.deltaY ?? e;
113
- if (e instanceof WheelEvent) {
114
- this.preventEvent(e);
115
- }
116
- if (this.isScrollIgnored()) {
117
- return false;
118
- }
119
- this.currentValue = DatePickerUtil.scrollMonth(delta, this.internalValue);
120
- };
121
- this.scrollYear = (e) => {
122
- this.preventEvent(e);
123
- if (this.isScrollIgnored()) {
124
- return false;
125
- }
126
- this.currentValue = DatePickerUtil.scrollYear(e.deltaY, this.internalValue);
127
- };
128
- this.openPicker = (show) => {
129
- if (this.disabled) {
130
- return;
40
+ this.viewType = 'rounded';
41
+ this.allowNull = false;
42
+ this.firstDayOfWeek = 1;
43
+ this.selectDate = new EventEmitter();
44
+ this.selectedDate = new ReplaySubject(1);
45
+ this.mask = '';
46
+ }
47
+ ngOnInit() {
48
+ if (!this.date) {
49
+ this.setDate(this.allowNull ? null : new Date());
50
+ this.date = this.allowNull ? null : new Date();
51
+ }
52
+ else {
53
+ this.setDate(new Date(this.date));
54
+ }
55
+ this.prepareInput();
56
+ }
57
+ prepareInput() {
58
+ const str = this.date ? this.getLocaleString(this.date) : '';
59
+ let option;
60
+ const setMinMax = () => {
61
+ if (this.minDate) {
62
+ option.min = dayjs(new Date(this.minDate)).startOf('day');
131
63
  }
132
- if (!show) {
133
- this.setMode(DatePickerMode.date);
134
- this.applyValue(this.currentValue);
64
+ if (this.maxDate) {
65
+ option.max = dayjs(new Date(this.maxDate)).endOf('day');
135
66
  }
136
- this.open = show;
137
- this._cdr.markForCheck();
138
- };
139
- this.closePicker = () => {
140
- this.openPicker(false);
141
- this.onTouched();
142
67
  };
143
- this.preventEvent = (event) => {
144
- event.stopPropagation();
145
- event.preventDefault();
146
- return false;
147
- };
148
- localeService.locale
149
- .pipe(takeWhile((_) => this._alive))
150
- .subscribe((locale) => {
151
- this.locale = locale;
152
- });
153
- }
154
- set format(val) {
155
- this._format = val;
156
- }
157
- get format() {
158
- if (this._format) {
159
- return this._format;
68
+ if (this.showTime) {
69
+ this.mask = 'dd.mm.yyyy, hh:mm';
70
+ option = {
71
+ dateMode: 'dd/mm/yyyy',
72
+ timeMode: 'HH:MM',
73
+ dateSeparator: '.',
74
+ };
75
+ setMinMax();
76
+ this.maskitoOptions = maskitoDateTimeOptionsGenerator(option);
160
77
  }
161
- return this.showTime ? 'dd.MM.yyyy HH:mm:ss' : 'dd.MM.yyyy';
162
- }
163
- get value() {
164
- return this._value;
165
- }
166
- set value(v) {
167
- if (v?.getTime() !== this._value?.getTime()) {
168
- this._value = v;
169
- this.currentValue = this._value;
78
+ else {
79
+ this.mask = 'dd.mm.yyyy';
80
+ option = {
81
+ mode: 'dd/mm/yyyy',
82
+ separator: '.',
83
+ };
84
+ setMinMax();
85
+ this.maskitoOptions = maskitoDateOptionsGenerator(option);
170
86
  }
87
+ this.changePlaceholder(str);
171
88
  }
172
- get currentValue() {
173
- return this._currentValue;
174
- }
175
- set currentValue(date) {
176
- this._currentValue = date;
177
- this._cdr.markForCheck();
178
- }
179
- get internalValue() {
180
- return this.currentValue ?? this.emptyDate();
89
+ onBlur() {
90
+ if (this.allowNull && this.inputText.trim() === '') {
91
+ this.setDate(null);
92
+ this.emitValue(null);
93
+ }
94
+ else {
95
+ const val = this.inputText.split(',');
96
+ const { day, year, month } = this.getDateFromStr(val[0]);
97
+ const { mins, hours } = this.getTimeFromStr(val[1]);
98
+ if (day && year && month) {
99
+ let date = new Date(year, month - 1, day);
100
+ if (this.showTime) {
101
+ date = new Date(date.setHours(hours || 0, mins || 0));
102
+ }
103
+ this.changeSelectedDate(this.getAvailableDate(this.minDate, this.maxDate, date));
104
+ }
105
+ else {
106
+ this.setDate(this.date);
107
+ }
108
+ }
181
109
  }
182
- keyUp(event) {
183
- if (!this.open) {
184
- return;
110
+ setDate(date) {
111
+ if (!date && this.allowNull) {
112
+ this.inputText = '';
113
+ this.changePlaceholder('');
114
+ this.selectedDate.next(new Date(this.minDate || new Date()));
185
115
  }
186
- if (event.code === 'Escape') {
187
- this.currentValue = this.value;
188
- this.open = false;
116
+ else {
117
+ this.inputText = this.getLocaleString(date);
118
+ this.changePlaceholder(this.getLocaleString(date));
119
+ this.selectedDate.next(date);
189
120
  }
190
121
  }
191
- writeValue(value) {
192
- this.value = value;
193
- this._cdr.markForCheck();
122
+ onChange(date) {
194
123
  }
195
124
  registerOnChange(fn) {
196
125
  this.onChange = fn;
197
126
  }
198
127
  registerOnTouched(fn) {
199
- this.onTouched = fn;
200
- }
201
- setDisabledState(isDisabled) {
202
- this.disabled = isDisabled;
203
- this._cdr.detectChanges();
204
- }
205
- ngOnInit() {
206
- }
207
- ngOnDestroy() {
208
- this._alive = false;
209
- }
210
- applyValue(date) {
211
- this.setDate(date);
212
- this.value = this.currentValue;
213
- this.onChange(new Date(this.value));
214
- this.open = false;
215
- }
216
- focus() {
217
- this._elementRef.nativeElement.focus();
218
128
  }
219
- setMode(mode) {
220
- let result;
221
- if (mode === this.displayMode || mode === DatePickerMode.date) {
222
- result = DatePickerMode.date;
129
+ writeValue(obj) {
130
+ if (obj) {
131
+ this.date = new Date(obj);
132
+ this.setDate(new Date(this.date));
223
133
  }
224
134
  else {
225
- result = mode;
135
+ if (this.allowNull) {
136
+ this.date = null;
137
+ this.selectedDate.next(null);
138
+ }
139
+ else {
140
+ this.date = this.minDate || new Date();
141
+ this.selectedDate.next(this.minDate || new Date());
142
+ }
226
143
  }
227
- this.displayMode = result;
228
- }
229
- emptyDate() {
230
- return DateUtil.truncateToDay(new Date());
231
144
  }
232
145
  }
233
- DatePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DatePickerComponent, deps: [{ token: i1.TetaConfigService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
234
- DatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: DatePickerComponent, selector: "teta-date-picker", inputs: { disabled: "disabled", invalid: "invalid", firstDayOfWeek: "firstDayOfWeek", disabledDates: "disabledDates", disabledPeriods: "disabledPeriods", disabledDays: "disabledDays", minDate: "minDate", maxDate: "maxDate", minYearDate: "minYearDate", maxYearDate: "maxYearDate", align: "align", verticalAlign: "verticalAlign", appendToBody: "appendToBody", allowNull: "allowNull", backdrop: "backdrop", showTime: "showTime", format: "format" }, host: { listeners: { "window:keyup": "keyUp($event)" }, properties: { "class.datepicker-wide": "this.showTime", "class.datepicker_open": "this.open", "class.datepicker": "this.classDatepicker", "tabindex": "this.tabindex" } }, providers: [DATE_PICKER_CONTROL_VALUE_ACCESSOR], ngImport: i0, template: "<teta-dropdown\n class=\"row row_auto\"\n [disabled]=\"disabled\"\n [open]=\"open\"\n [autoCloseIgnore]=\"['esc', 'inside']\"\n (openChange)=\"openPicker($event)\"\n [align]=\"align\"\n [verticalAlign]=\"verticalAlign\"\n [appendToBody]=\"appendToBody\"\n [backdrop]=\"backdrop\">\n <div tetaDropdownHead\n class=\"datepicker-head font-body-3\"\n [class.datepicker-head_disabled]=\"disabled\"\n [class.datepicker-head_invalid]=\"invalid\">\n <teta-icon [name]=\"'calendar'\" class=\"margin-right-1\"></teta-icon>\n <div class=\"row_auto nowrap\">\n {{currentValue !== null && currentValue !== undefined ? (currentValue | date : format) : ''}}\n </div>\n <teta-icon *ngIf=\"allowNull\"\n [name]=\"'closeBig'\"\n (click)=\"clearPicker($event);\"\n class=\"margin-left-1\"></teta-icon>\n </div>\n <div tetaDropdownContent class=\"scrollable\" (click)=\"$event.preventDefault()\">\n <div class=\"padding-3\">\n <div class=\"row align-center justify-content-between\">\n <div>\n <button teta-button\n type=\"button\"\n [palette]=\"'text'\"\n [view]=\"displayMode===datePickerModeEnum.month ? 'primary' : 'ghost'\"\n (click)=\"setMode(datePickerModeEnum.month)\"\n (wheel)=\"scrollMonth($event);\">\n {{locale.months[internalValue?.getMonth()]}}\n </button>\n <button teta-button\n type=\"button\"\n class=\"margin-left-2\"\n [palette]=\"'text'\"\n [view]=\"displayMode===datePickerModeEnum.year ? 'primary' : 'ghost'\"\n (click)=\"setMode(datePickerModeEnum.year)\"\n (wheel)=\"scrollYear($event);\">\n {{internalValue?.getFullYear()}}\n </button>\n </div>\n <button teta-button\n type=\"button\"\n [palette]=\"'text'\"\n [view]=\"'ghost'\"\n (click)=\"setToday()\">\n <teta-icon [name]=\"'calendar'\"></teta-icon>\n </button>\n </div>\n <div class=\"datepicker-content\">\n <teta-year-select\n *ngIf=\"displayMode === datePickerModeEnum.year\"\n [currentYear]=\"internalValue?.getFullYear()\"\n [today]=\"today\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n (yearSelected)=\"setYear($event)\">\n </teta-year-select>\n <teta-month-select\n *ngIf=\"displayMode === datePickerModeEnum.month\"\n [currentMonth]=\"internalValue?.getMonth()\"\n [currentYear]=\"internalValue?.getFullYear()\"\n [locale]=\"locale\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n (monthSelected)=\"setMonth($event)\">\n </teta-month-select>\n <teta-day-select\n *ngIf=\"displayMode === datePickerModeEnum.date\"\n [ngModel]=\"currentValue\"\n (ngModelChange)=\"applyValue($event)\"\n (dateSelected)=\"setDate($event)\"\n (yearSelected)=\"setYear($event)\"\n (monthSelected)=\"setMonth($event)\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [firstDayOfWeek]=\"firstDayOfWeek\"\n [disabledDays]=\"disabledDays\"\n [disabledDates]=\"disabledDates\"\n [disabledPeriods]=\"disabledPeriods\"></teta-day-select>\n </div>\n </div>\n <div *ngIf=\"showTime\" class=\"datepicker-time padding-v-1 border-top border-text-10 font-body-3 color-text-90\">\n <teta-time-part-control [max]=\"23\" [ngModel]=\"internalValue?.getHours()\"\n (ngModelChange)=\"setHour($event)\"></teta-time-part-control>\n :\n <teta-time-part-control [ngModel]=\"internalValue?.getMinutes()\"\n (ngModelChange)=\"setMinute($event)\"></teta-time-part-control>\n :\n <teta-time-part-control [ngModel]=\"internalValue?.getSeconds()\"\n (ngModelChange)=\"setSecond($event)\"></teta-time-part-control>\n </div>\n </div>\n</teta-dropdown>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DropdownComponent, selector: "teta-dropdown", exportAs: ["dropdown"] }, { kind: "directive", type: i4.DropdownHeadDirective, selector: "[tetaDropdownHead]" }, { kind: "directive", type: i5.DropdownContentDirective, selector: "[tetaDropdownContent]" }, { 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"] }, { kind: "component", type: i7.IconComponent, selector: "teta-icon", inputs: ["name", "size", "palette", "class"] }, { kind: "component", type: i8.ButtonComponent, selector: "button[teta-button], teta-button", inputs: ["palette", "class", "view", "square"] }, { kind: "component", type: i9.DaySelectComponent, selector: "teta-day-select", inputs: ["firstDayOfWeek", "disabledDates", "disabledPeriods", "disabledDays", "minDate", "maxDate", "disabled"], outputs: ["dateSelected", "monthSelected", "yearSelected"] }, { kind: "component", type: i10.YearSelectComponent, selector: "teta-year-select", inputs: ["currentYear", "today", "size", "minDate", "maxDate", "allowableRange"], outputs: ["yearSelected", "yearApplied"] }, { kind: "component", type: i11.MonthSelectComponent, selector: "teta-month-select", inputs: ["locale", "minDate", "maxDate", "size", "currentMonth", "currentYear"], outputs: ["monthSelected", "monthApplied"] }, { kind: "component", type: i12.TimePartControlComponent, selector: "teta-time-part-control", inputs: ["min", "max", "disabled"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
146
+ DatePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DatePickerComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Component });
147
+ DatePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: DatePickerComponent, selector: "teta-date-picker", inputs: { date: "date", locale: "locale", showTime: "showTime", minDate: "minDate", maxDate: "maxDate", invalid: "invalid", disabled: "disabled", align: "align", verticalAlign: "verticalAlign", viewType: "viewType", appendToBody: "appendToBody", backdrop: "backdrop", allowNull: "allowNull", firstDayOfWeek: "firstDayOfWeek", disabledDates: "disabledDates", disabledPeriods: "disabledPeriods", disabledDays: "disabledDays", minYearDate: "minYearDate", maxYearDate: "maxYearDate" }, outputs: { selectDate: "selectDate" }, providers: [DATE_PICKER_CONTROL_VALUE_ACCESSOR, DatePipe], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<teta-dropdown *ngIf=\"{selectedDate:selectedDate|async}as data\" [appendToBody]=\"appendToBody\" [backdrop]=\"backdrop\"\n [open]=\"open\" (openChange)=\"openChange($event)\" [viewType]=\"viewType\"\n [disabled]=\"disabled\" [verticalAlign]=\"verticalAlign\" [align]=\"align\"\n [autoCloseIgnore]=\"['esc', 'inside','enter']\">\n <div tetaDropdownHead\n [class]=\"'datepicker-head font-body-3 gap-8 datepicker_'+viewType\"\n [ngClass]=\"{'datepicker-head_invalid':invalid,'datepicker-head_disabled':disabled}\">\n <teta-input class=\"row row_auto flex\">\n <div [class]=\"'row_auto row datepicker_'+viewType\">\n <div class=\"row position-relative font-body-3 align-center\">\n <input [ngClass]=\"{'color-text-90':!disabled}\" [disabled]=\"disabled\" #input style=\"z-index: 1\" class=\"border-0\" (keydown)=\"checkEnter($event)\" [(ngModel)]=\"inputText\" (ngModelChange)=\"changeInput($event)\"\n [maskito]=\"maskitoOptions\">\n <div (click)=\"input.focus()\" *ngIf=\"data.selectedDate||allowNull\" class=\"position-absolute color-text-10\"\n style=\"top:-0.3px;cursor: text;user-select: none\">{{placeholder}}</div>\n </div>\n <teta-icon [name]=\"'calendar'\"></teta-icon>\n </div>\n </teta-input>\n </div>\n <div tetaDropdownContent class=\"scrollable\" (click)=\"$event.preventDefault()\">\n <ng-container *ngIf=\"open\">\n <teta-date-calendar [isDateNull]=\"date===null\" [open]=\"open\" [max]=\"maxDate\" [min]=\"minDate\"\n (setDate)=\"changeSelectedDate($event)\"\n [selectedDate]=\"data.selectedDate\"\n [viewType]=\"viewType\" [locale]=\"locale\"></teta-date-calendar>\n </ng-container>\n\n </div>\n </teta-dropdown>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.DropdownComponent, selector: "teta-dropdown", exportAs: ["dropdown"] }, { kind: "directive", type: i3.DropdownHeadDirective, selector: "[tetaDropdownHead]" }, { kind: "directive", type: i4.DropdownContentDirective, selector: "[tetaDropdownContent]" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "directive", type: i6.MaskitoCva, selector: "input[maskito], textarea[maskito]", inputs: ["maskito"] }, { kind: "component", type: i7.IconComponent, selector: "teta-icon", inputs: ["name", "size", "palette", "class"] }, { kind: "component", type: i8.InputComponent, selector: "teta-input", inputs: ["label", "hint", "viewType", "horizontal", "required"] }, { kind: "component", type: i9.DateCalendarComponent, selector: "teta-date-calendar", inputs: ["selectedDate", "locale", "open", "viewType", "min", "isDateNull", "max"], outputs: ["setDate"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
235
148
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: DatePickerComponent, decorators: [{
236
149
  type: Component,
237
- args: [{ selector: 'teta-date-picker', providers: [DATE_PICKER_CONTROL_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<teta-dropdown\n class=\"row row_auto\"\n [disabled]=\"disabled\"\n [open]=\"open\"\n [autoCloseIgnore]=\"['esc', 'inside']\"\n (openChange)=\"openPicker($event)\"\n [align]=\"align\"\n [verticalAlign]=\"verticalAlign\"\n [appendToBody]=\"appendToBody\"\n [backdrop]=\"backdrop\">\n <div tetaDropdownHead\n class=\"datepicker-head font-body-3\"\n [class.datepicker-head_disabled]=\"disabled\"\n [class.datepicker-head_invalid]=\"invalid\">\n <teta-icon [name]=\"'calendar'\" class=\"margin-right-1\"></teta-icon>\n <div class=\"row_auto nowrap\">\n {{currentValue !== null && currentValue !== undefined ? (currentValue | date : format) : ''}}\n </div>\n <teta-icon *ngIf=\"allowNull\"\n [name]=\"'closeBig'\"\n (click)=\"clearPicker($event);\"\n class=\"margin-left-1\"></teta-icon>\n </div>\n <div tetaDropdownContent class=\"scrollable\" (click)=\"$event.preventDefault()\">\n <div class=\"padding-3\">\n <div class=\"row align-center justify-content-between\">\n <div>\n <button teta-button\n type=\"button\"\n [palette]=\"'text'\"\n [view]=\"displayMode===datePickerModeEnum.month ? 'primary' : 'ghost'\"\n (click)=\"setMode(datePickerModeEnum.month)\"\n (wheel)=\"scrollMonth($event);\">\n {{locale.months[internalValue?.getMonth()]}}\n </button>\n <button teta-button\n type=\"button\"\n class=\"margin-left-2\"\n [palette]=\"'text'\"\n [view]=\"displayMode===datePickerModeEnum.year ? 'primary' : 'ghost'\"\n (click)=\"setMode(datePickerModeEnum.year)\"\n (wheel)=\"scrollYear($event);\">\n {{internalValue?.getFullYear()}}\n </button>\n </div>\n <button teta-button\n type=\"button\"\n [palette]=\"'text'\"\n [view]=\"'ghost'\"\n (click)=\"setToday()\">\n <teta-icon [name]=\"'calendar'\"></teta-icon>\n </button>\n </div>\n <div class=\"datepicker-content\">\n <teta-year-select\n *ngIf=\"displayMode === datePickerModeEnum.year\"\n [currentYear]=\"internalValue?.getFullYear()\"\n [today]=\"today\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n (yearSelected)=\"setYear($event)\">\n </teta-year-select>\n <teta-month-select\n *ngIf=\"displayMode === datePickerModeEnum.month\"\n [currentMonth]=\"internalValue?.getMonth()\"\n [currentYear]=\"internalValue?.getFullYear()\"\n [locale]=\"locale\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n (monthSelected)=\"setMonth($event)\">\n </teta-month-select>\n <teta-day-select\n *ngIf=\"displayMode === datePickerModeEnum.date\"\n [ngModel]=\"currentValue\"\n (ngModelChange)=\"applyValue($event)\"\n (dateSelected)=\"setDate($event)\"\n (yearSelected)=\"setYear($event)\"\n (monthSelected)=\"setMonth($event)\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [firstDayOfWeek]=\"firstDayOfWeek\"\n [disabledDays]=\"disabledDays\"\n [disabledDates]=\"disabledDates\"\n [disabledPeriods]=\"disabledPeriods\"></teta-day-select>\n </div>\n </div>\n <div *ngIf=\"showTime\" class=\"datepicker-time padding-v-1 border-top border-text-10 font-body-3 color-text-90\">\n <teta-time-part-control [max]=\"23\" [ngModel]=\"internalValue?.getHours()\"\n (ngModelChange)=\"setHour($event)\"></teta-time-part-control>\n :\n <teta-time-part-control [ngModel]=\"internalValue?.getMinutes()\"\n (ngModelChange)=\"setMinute($event)\"></teta-time-part-control>\n :\n <teta-time-part-control [ngModel]=\"internalValue?.getSeconds()\"\n (ngModelChange)=\"setSecond($event)\"></teta-time-part-control>\n </div>\n </div>\n</teta-dropdown>\n" }]
238
- }], ctorParameters: function () { return [{ type: i1.TetaConfigService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { disabled: [{
239
- type: Input
240
- }], invalid: [{
150
+ args: [{ selector: 'teta-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, providers: [DATE_PICKER_CONTROL_VALUE_ACCESSOR, DatePipe], template: "<teta-dropdown *ngIf=\"{selectedDate:selectedDate|async}as data\" [appendToBody]=\"appendToBody\" [backdrop]=\"backdrop\"\n [open]=\"open\" (openChange)=\"openChange($event)\" [viewType]=\"viewType\"\n [disabled]=\"disabled\" [verticalAlign]=\"verticalAlign\" [align]=\"align\"\n [autoCloseIgnore]=\"['esc', 'inside','enter']\">\n <div tetaDropdownHead\n [class]=\"'datepicker-head font-body-3 gap-8 datepicker_'+viewType\"\n [ngClass]=\"{'datepicker-head_invalid':invalid,'datepicker-head_disabled':disabled}\">\n <teta-input class=\"row row_auto flex\">\n <div [class]=\"'row_auto row datepicker_'+viewType\">\n <div class=\"row position-relative font-body-3 align-center\">\n <input [ngClass]=\"{'color-text-90':!disabled}\" [disabled]=\"disabled\" #input style=\"z-index: 1\" class=\"border-0\" (keydown)=\"checkEnter($event)\" [(ngModel)]=\"inputText\" (ngModelChange)=\"changeInput($event)\"\n [maskito]=\"maskitoOptions\">\n <div (click)=\"input.focus()\" *ngIf=\"data.selectedDate||allowNull\" class=\"position-absolute color-text-10\"\n style=\"top:-0.3px;cursor: text;user-select: none\">{{placeholder}}</div>\n </div>\n <teta-icon [name]=\"'calendar'\"></teta-icon>\n </div>\n </teta-input>\n </div>\n <div tetaDropdownContent class=\"scrollable\" (click)=\"$event.preventDefault()\">\n <ng-container *ngIf=\"open\">\n <teta-date-calendar [isDateNull]=\"date===null\" [open]=\"open\" [max]=\"maxDate\" [min]=\"minDate\"\n (setDate)=\"changeSelectedDate($event)\"\n [selectedDate]=\"data.selectedDate\"\n [viewType]=\"viewType\" [locale]=\"locale\"></teta-date-calendar>\n </ng-container>\n\n </div>\n </teta-dropdown>\n" }]
151
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.DatePipe }]; }, propDecorators: { date: [{
241
152
  type: Input
242
- }], firstDayOfWeek: [{
243
- type: Input
244
- }], disabledDates: [{
245
- type: Input
246
- }], disabledPeriods: [{
153
+ }], locale: [{
247
154
  type: Input
248
- }], disabledDays: [{
155
+ }], showTime: [{
249
156
  type: Input
250
157
  }], minDate: [{
251
158
  type: Input
252
159
  }], maxDate: [{
253
160
  type: Input
254
- }], minYearDate: [{
161
+ }], invalid: [{
255
162
  type: Input
256
- }], maxYearDate: [{
163
+ }], disabled: [{
257
164
  type: Input
258
165
  }], align: [{
259
166
  type: Input
260
167
  }], verticalAlign: [{
261
168
  type: Input
169
+ }], viewType: [{
170
+ type: Input
262
171
  }], appendToBody: [{
263
172
  type: Input
173
+ }], backdrop: [{
174
+ type: Input
264
175
  }], allowNull: [{
265
176
  type: Input
266
- }], backdrop: [{
177
+ }], firstDayOfWeek: [{
267
178
  type: Input
268
- }], showTime: [{
269
- type: HostBinding,
270
- args: ['class.datepicker-wide']
271
- }, {
179
+ }], disabledDates: [{
272
180
  type: Input
273
- }], format: [{
181
+ }], disabledPeriods: [{
182
+ type: Input
183
+ }], disabledDays: [{
184
+ type: Input
185
+ }], minYearDate: [{
186
+ type: Input
187
+ }], maxYearDate: [{
274
188
  type: Input
275
- }], open: [{
276
- type: HostBinding,
277
- args: ['class.datepicker_open']
278
- }], classDatepicker: [{
279
- type: HostBinding,
280
- args: ['class.datepicker']
281
- }], tabindex: [{
282
- type: HostBinding,
283
- args: ['tabindex']
284
- }], keyUp: [{
285
- type: HostListener,
286
- args: ['window:keyup', ['$event']]
189
+ }], input: [{
190
+ type: ViewChild,
191
+ args: ['input']
192
+ }], selectDate: [{
193
+ type: Output
287
194
  }] } });
288
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50L2RhdGUtcGlja2VyL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssR0FHTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXVCLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMENBQTBDLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBSXZFLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFRO0lBQ3JELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztJQUNsRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFTRixNQUFNLE9BQU8sbUJBQW1CO0lBMEU5QixZQUNTLGFBQWdDLEVBQy9CLElBQXVCLEVBQ3ZCLFdBQXVCO1FBRnhCLGtCQUFhLEdBQWIsYUFBYSxDQUFt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Q0FBQyxDQUFDO0lBQzVDLENBQUM7O2dIQWxSVSxtQkFBbUI7b0dBQW5CLG1CQUFtQiw0c0JBSG5CLENBQUMsa0NBQWtDLENBQUMsMEJDakNqRCwwbklBa0dBOzJGRDlEYSxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0Usa0JBQWtCLGFBR2pCLENBQUMsa0NBQWtDLENBQUMsbUJBQzlCLHVCQUF1QixDQUFDLE1BQU07aUtBSXRDLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSU4sUUFBUTtzQkFGUCxXQUFXO3VCQUFDLHVCQUF1Qjs7c0JBQ25DLEtBQUs7Z0JBSUYsTUFBTTtzQkFEVCxLQUFLO2dCQVlnQyxJQUFJO3NCQUF6QyxXQUFXO3VCQUFDLHVCQUF1QjtnQkFDYyxlQUFlO3NCQUFoRSxXQUFXO3VCQUFDLGtCQUFrQjtnQkFDVyxRQUFRO3NCQUFqRCxXQUFXO3VCQUFDLFVBQVU7Z0JBa0RtQixLQUFLO3NCQUE5QyxZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7dGFrZVdoaWxlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0RhdGVQZXJpb2R9IGZyb20gJy4uL21vZGVsL2RhdGUtcGVyaW9kJztcbmltcG9ydCB7RGF0ZVBpY2tlck1vZGV9IGZyb20gJy4uL21vZGVsL2RhdGUtcGlja2VyLW1vZGUuZW51bSc7XG5pbXBvcnQge0RhdGVVdGlsfSBmcm9tICcuLi8uLi8uLi91dGlsL2RhdGUtdXRpbCc7XG5pbXBvcnQge0RhdGVQaWNrZXJVdGlsfSBmcm9tICcuLi91dGlsL2RhdGUtcGlja2VyLXV0aWwnO1xuaW1wb3J0IHtBbGlnbn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2VudW0vYWxpZ24uZW51bSc7XG5pbXBvcnQge1ZlcnRpY2FsQWxpZ259IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lbnVtL3ZlcnRpY2FsLWFsaWduLmVudW0nO1xuaW1wb3J0IHtUZXRhTG9jYWxpc2F0aW9ufSBmcm9tICcuLi8uLi8uLi9sb2NhbGUvdGV0YS1sb2NhbGlzYXRpb24nO1xuaW1wb3J0IHtUZXRhQ29uZmlnU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vbG9jYWxlL3RldGEtY29uZmlnLnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgREFURV9QSUNLRVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGV0YS1kYXRlLXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0RBVEVfUElDS0VSX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZVBpY2tlckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuICBASW5wdXQoKSBpbnZhbGlkOiBib29sZWFuO1xuICBASW5wdXQoKSBmaXJzdERheU9mV2VlayA9IDE7XG4gIEBJbnB1dCgpIGRpc2FibGVkRGF0ZXM6IERhdGVbXTtcbiAgQElucHV0KCkgZGlzYWJsZWRQZXJpb2RzOiBEYXRlUGVyaW9kW107XG4gIEBJbnB1dCgpIGRpc2FibGVkRGF5czogbnVtYmVyW107XG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGU7XG4gIEBJbnB1dCgpIG1heERhdGU6IERhdGU7XG4gIEBJbnB1dCgpIG1pblllYXJEYXRlOiBEYXRlO1xuICBASW5wdXQoKSBtYXhZZWFyRGF0ZTogRGF0ZTtcbiAgQElucHV0KCkgYWxpZ246IEFsaWduID0gQWxpZ24ubGVmdDtcbiAgQElucHV0KCkgdmVydGljYWxBbGlnbjogVmVydGljYWxBbGlnbiA9IFZlcnRpY2FsQWxpZ24uYXV0bztcbiAgQElucHV0KCkgYXBwZW5kVG9Cb2R5OiBib29sZWFuO1xuICBASW5wdXQoKSBhbGxvd051bGwgPSB0cnVlO1xuICBASW5wdXQoKSBiYWNrZHJvcDogYm9vbGVhbjtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRhdGVwaWNrZXItd2lkZScpXG4gIEBJbnB1dCgpXG4gIHNob3dUaW1lID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGZvcm1hdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuX2Zvcm1hdCA9IHZhbDtcbiAgfVxuXG4gIGdldCBmb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fZm9ybWF0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9ybWF0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaG93VGltZSA/ICdkZC5NTS55eXl5IEhIOm1tOnNzJyA6ICdkZC5NTS55eXl5JztcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGF0ZXBpY2tlcl9vcGVuJykgb3BlbjogYm9vbGVhbjtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kYXRlcGlja2VyJykgcHJpdmF0ZSByZWFkb25seSBjbGFzc0RhdGVwaWNrZXIgPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ3RhYmluZGV4JykgcHJpdmF0ZSByZWFkb25seSB0YWJpbmRleCA9IDA7XG5cbiAgbG9jYWxlOiBUZXRhTG9jYWxpc2F0aW9uO1xuICB0b2RheTogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgZGF0ZVBpY2tlck1vZGVFbnVtID0gRGF0ZVBpY2tlck1vZGU7XG4gIGRpc3BsYXlNb2RlOiBEYXRlUGlja2VyTW9kZSA9IERhdGVQaWNrZXJNb2RlLmRhdGU7XG4gIF9mb3JtYXQ6IHN0cmluZztcblxuICBfdmFsdWU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgX2N1cnJlbnRWYWx1ZTogRGF0ZTtcblxuICBwcml2YXRlIF9hbGl2ZSA9IHRydWU7XG5cbiAgZ2V0IHZhbHVlKCk6IERhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUodjogRGF0ZSB8IG51bGwpIHtcbiAgICBpZiAodj8uZ2V0VGltZSgpICE9PSB0aGlzLl92YWx1ZT8uZ2V0VGltZSgpKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjdXJyZW50VmFsdWUoKTogRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHNldCBjdXJyZW50VmFsdWUoZGF0ZTogRGF0ZSkge1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IGRhdGU7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IGludGVybmFsVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlID8/IHRoaXMuZW1wdHlEYXRlKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbG9jYWxlU2VydmljZTogVGV0YUNvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmXG4gICkge1xuICAgIGxvY2FsZVNlcnZpY2UubG9jYWxlXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKF8pID0+IHRoaXMuX2FsaXZlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGxvY2FsZTogVGV0YUxvY2FsaXNhdGlvbikgPT4ge1xuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleXVwJywgWyckZXZlbnQnXSkga2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHtcbiAgfTtcblxuICBvblRvdWNoZWQgPSAoKSA9PiB7XG4gIH07XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2FsaXZlID0gZmFsc2U7XG4gIH1cblxuICBhcHBseVZhbHVlKGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLnNldERhdGUoZGF0ZSk7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuY3VycmVudFZhbHVlO1xuICAgIHRoaXMub25DaGFuZ2UobmV3IERhdGUodGhpcy52YWx1ZSkpO1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgc2V0RGF0ZSA9IChkYXk6IERhdGUpID0+IHtcbiAgICBpZiAoZGF5ID09PSBudWxsIHx8IGRheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGR0ID0gdGhpcy5pbnRlcm5hbFZhbHVlO1xuICAgIGR0LnNldEZ1bGxZZWFyKGRheS5nZXRGdWxsWWVhcigpLCBkYXkuZ2V0TW9udGgoKSwgZGF5LmdldERhdGUoKSk7XG4gICAgdGhpcy5jdXJyZW50VmFsdWUgPSBuZXcgRGF0ZShkdCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9O1xuXG4gIHNldFllYXIgPSAoeWVhcjogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgZHQgPSB0aGlzLmludGVybmFsVmFsdWU7XG4gICAgZHQuc2V0RnVsbFllYXIoeWVhcik7XG4gICAgdGhpcy5jdXJyZW50VmFsdWUgPSBuZXcgRGF0ZShkdCk7XG4gICAgdGhpcy5zZXRNb2RlKERhdGVQaWNrZXJNb2RlLmRhdGUpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfTtcblxuICBzZXRNb250aCA9IChtb250aDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgZHQgPSB0aGlzLmludGVybmFsVmFsdWU7XG4gICAgZHQuc2V0TW9udGgobW9udGgpO1xuICAgIHRoaXMuY3VycmVudFZhbHVlID0gbmV3IERhdGUoZHQpO1xuICAgIHRoaXMuc2V0TW9kZShEYXRlUGlja2VyTW9kZS5kYXRlKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH07XG5cbiAgc2V0SG91ciA9IChob3VyczogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgZHQgPSB0aGlzLmludGVybmFsVmFsdWU7XG4gICAgZHQuc2V0SG91cnMoaG91cnMpO1xuICAgIHRoaXMuY3VycmVudFZhbHVlID0gbmV3IERhdGUoZHQpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfTtcblxuICBzZXRNaW51dGUgPSAobWludXRlOiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBkdCA9IHRoaXMuaW50ZXJuYWxWYWx1ZTtcbiAgICBkdC5zZXRNaW51dGVzKG1pbnV0ZSk7XG4gICAgdGhpcy5jdXJyZW50VmFsdWUgPSBuZXcgRGF0ZShkdCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9O1xuXG4gIHNldFNlY29uZCA9IChzZWNvbmRzOiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBkdCA9IHRoaXMuaW50ZXJuYWxWYWx1ZTtcbiAgICBkdC5zZXRTZWNvbmRzKHNlY29uZHMpO1xuICAgIHRoaXMuY3VycmVudFZhbHVlID0gbmV3IERhdGUoZHQpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfTtcblxuICBzZXRUb2RheSA9ICgpID0+IHtcbiAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRoaXMuZW1wdHlEYXRlKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9O1xuXG4gIGNsZWFyUGlja2VyID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgdGhpcy5wcmV2ZW50RXZlbnQoZXZlbnQpO1xuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XG4gIH07XG5cbiAgaXNEYXRlSW5EaXNhYmxlZFBlcmlvZCA9IChkYXQ6IERhdGUpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWRQZXJpb2RzIHx8IHRoaXMuZGlzYWJsZWRQZXJpb2RzLmxlbmd0aCA8IDEgfHwgIWRhdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFBlcmlvZHMuc29tZShcbiAgICAgIChkOiBEYXRlUGVyaW9kKSA9PlxuICAgICAgICBkICYmXG4gICAgICAgIGQuc3RhcnQgJiZcbiAgICAgICAgZC5lbmQgJiZcbiAgICAgICAgZC5zdGFydC5nZXRUaW1lKCkgPD0gZGF0LmdldFRpbWUoKSAmJlxuICAgICAgICBkLmVuZC5nZXRUaW1lKCkgPj0gZGF0LmdldFRpbWUoKVxuICAgICk7XG4gIH07XG5cbiAgaXNTY3JvbGxJZ25vcmVkID0gKCk6IGJvb2xlYW4gPT5cbiAgICB0aGlzLmRpc3BsYXlNb2RlID09PSBEYXRlUGlja2VyTW9kZS5tb250aCB8fFxuICAgIHRoaXMuZGlzcGxheU1vZGUgPT09IERhdGVQaWNrZXJNb2RlLnllYXI7XG5cbiAgc2Nyb2xsTW9udGggPSAoZTogYW55KSA9PiB7XG4gICAgY29uc3QgZGVsdGEgPSBlPy5kZWx0YVkgPz8gZTtcblxuICAgIGlmIChlIGluc3RhbmNlb2YgV2hlZWxFdmVudCkge1xuICAgICAgdGhpcy5wcmV2ZW50RXZlbnQoZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTY3JvbGxJZ25vcmVkKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50VmFsdWUgPSBEYXRlUGlja2VyVXRpbC5zY3JvbGxNb250aChkZWx0YSwgdGhpcy5pbnRlcm5hbFZhbHVlKTtcbiAgfTtcblxuICBzY3JvbGxZZWFyID0gKGU6IGFueSkgPT4ge1xuICAgIHRoaXMucHJldmVudEV2ZW50KGUpO1xuICAgIGlmICh0aGlzLmlzU2Nyb2xsSWdub3JlZCgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFZhbHVlID0gRGF0ZVBpY2tlclV0aWwuc2Nyb2xsWWVhcihcbiAgICAgIGUuZGVsdGFZLFxuICAgICAgdGhpcy5pbnRlcm5hbFZhbHVlXG4gICAgKTtcbiAgfTtcblxuICBvcGVuUGlja2VyID0gKHNob3c6IGJvb2xlYW4pID0+IHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXNob3cpIHtcbiAgICAgIHRoaXMuc2V0TW9kZShEYXRlUGlja2VyTW9kZS5kYXRlKTtcbiAgICAgIHRoaXMuYXBwbHlWYWx1ZSh0aGlzLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMub3BlbiA9IHNob3c7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9O1xuXG4gIGNsb3NlUGlja2VyID0gKCkgPT4ge1xuICAgIHRoaXMub3BlblBpY2tlcihmYWxzZSk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfTtcblxuICBwcmV2ZW50RXZlbnQgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGZvY3VzKCkge1xuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgc2V0TW9kZShtb2RlOiBEYXRlUGlja2VyTW9kZSkge1xuICAgIGxldCByZXN1bHQ6IERhdGVQaWNrZXJNb2RlO1xuICAgIGlmIChtb2RlID09PSB0aGlzLmRpc3BsYXlNb2RlIHx8IG1vZGUgPT09IERhdGVQaWNrZXJNb2RlLmRhdGUpIHtcbiAgICAgIHJlc3VsdCA9IERhdGVQaWNrZXJNb2RlLmRhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IG1vZGU7XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheU1vZGUgPSByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGVtcHR5RGF0ZSgpIHtcbiAgICByZXR1cm4gRGF0ZVV0aWwudHJ1bmNhdGVUb0RheShuZXcgRGF0ZSgpKTtcbiAgfVxufVxuIiwiPHRldGEtZHJvcGRvd25cbiAgY2xhc3M9XCJyb3cgcm93X2F1dG9cIlxuICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbb3Blbl09XCJvcGVuXCJcbiAgW2F1dG9DbG9zZUlnbm9yZV09XCJbJ2VzYycsICdpbnNpZGUnXVwiXG4gIChvcGVuQ2hhbmdlKT1cIm9wZW5QaWNrZXIoJGV2ZW50KVwiXG4gIFthbGlnbl09XCJhbGlnblwiXG4gIFt2ZXJ0aWNhbEFsaWduXT1cInZlcnRpY2FsQWxpZ25cIlxuICBbYXBwZW5kVG9Cb2R5XT1cImFwcGVuZFRvQm9keVwiXG4gIFtiYWNrZHJvcF09XCJiYWNrZHJvcFwiPlxuICA8ZGl2IHRldGFEcm9wZG93bkhlYWRcbiAgICAgICBjbGFzcz1cImRhdGVwaWNrZXItaGVhZCBmb250LWJvZHktM1wiXG4gICAgICAgW2NsYXNzLmRhdGVwaWNrZXItaGVhZF9kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgW2NsYXNzLmRhdGVwaWNrZXItaGVhZF9pbnZhbGlkXT1cImludmFsaWRcIj5cbiAgICA8dGV0YS1pY29uIFtuYW1lXT1cIidjYWxlbmRhcidcIiBjbGFzcz1cIm1hcmdpbi1yaWdodC0xXCI+PC90ZXRhLWljb24+XG4gICAgPGRpdiBjbGFzcz1cInJvd19hdXRvIG5vd3JhcFwiPlxuICAgICAge3tjdXJyZW50VmFsdWUgIT09IG51bGwgJiYgY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQgPyAoY3VycmVudFZhbHVlIHwgZGF0ZSA6IGZvcm1hdCkgOiAnJ319XG4gICAgPC9kaXY+XG4gICAgPHRldGEtaWNvbiAqbmdJZj1cImFsbG93TnVsbFwiXG4gICAgICAgICAgICAgICBbbmFtZV09XCInY2xvc2VCaWcnXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclBpY2tlcigkZXZlbnQpO1wiXG4gICAgICAgICAgICAgICBjbGFzcz1cIm1hcmdpbi1sZWZ0LTFcIj48L3RldGEtaWNvbj5cbiAgPC9kaXY+XG4gIDxkaXYgdGV0YURyb3Bkb3duQ29udGVudCBjbGFzcz1cInNjcm9sbGFibGVcIiAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICA8ZGl2IGNsYXNzPVwicGFkZGluZy0zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxidXR0b24gdGV0YS1idXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgW3BhbGV0dGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgICAgIFt2aWV3XT1cImRpc3BsYXlNb2RlPT09ZGF0ZVBpY2tlck1vZGVFbnVtLm1vbnRoID8gJ3ByaW1hcnknIDogJ2dob3N0J1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZShkYXRlUGlja2VyTW9kZUVudW0ubW9udGgpXCJcbiAgICAgICAgICAgICAgICAgICh3aGVlbCk9XCJzY3JvbGxNb250aCgkZXZlbnQpO1wiPlxuICAgICAgICAgICAge3tsb2NhbGUubW9udGhzW2ludGVybmFsVmFsdWU/LmdldE1vbnRoKCldfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHRldGEtYnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWFyZ2luLWxlZnQtMlwiXG4gICAgICAgICAgICAgICAgICBbcGFsZXR0ZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgW3ZpZXddPVwiZGlzcGxheU1vZGU9PT1kYXRlUGlja2VyTW9kZUVudW0ueWVhciA/ICdwcmltYXJ5JyA6ICdnaG9zdCdcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoZGF0ZVBpY2tlck1vZGVFbnVtLnllYXIpXCJcbiAgICAgICAgICAgICAgICAgICh3aGVlbCk9XCJzY3JvbGxZZWFyKCRldmVudCk7XCI+XG4gICAgICAgICAgICB7e2ludGVybmFsVmFsdWU/LmdldEZ1bGxZZWFyKCl9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0ZXRhLWJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtwYWxldHRlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgICAgW3ZpZXddPVwiJ2dob3N0J1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldFRvZGF5KClcIj5cbiAgICAgICAgICA8dGV0YS1pY29uIFtuYW1lXT1cIidjYWxlbmRhcidcIj48L3RldGEtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWNvbnRlbnRcIj5cbiAgICAgICAgPHRldGEteWVhci1zZWxlY3RcbiAgICAgICAgICAqbmdJZj1cImRpc3BsYXlNb2RlID09PSBkYXRlUGlja2VyTW9kZUVudW0ueWVhclwiXG4gICAgICAgICAgW2N1cnJlbnRZZWFyXT1cImludGVybmFsVmFsdWU/LmdldEZ1bGxZZWFyKClcIlxuICAgICAgICAgIFt0b2RheV09XCJ0b2RheVwiXG4gICAgICAgICAgW21pbkRhdGVdPVwibWluRGF0ZVwiXG4gICAgICAgICAgW21heERhdGVdPVwibWF4RGF0ZVwiXG4gICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJzZXRZZWFyKCRldmVudClcIj5cbiAgICAgICAgPC90ZXRhLXllYXItc2VsZWN0PlxuICAgICAgICA8dGV0YS1tb250aC1zZWxlY3RcbiAgICAgICAgICAqbmdJZj1cImRpc3BsYXlNb2RlID09PSBkYXRlUGlja2VyTW9kZUVudW0ubW9udGhcIlxuICAgICAgICAgIFtjdXJyZW50TW9udGhdPVwiaW50ZXJuYWxWYWx1ZT8uZ2V0TW9udGgoKVwiXG4gICAgICAgICAgW2N1cnJlbnRZZWFyXT1cImludGVybmFsVmFsdWU/LmdldEZ1bGxZZWFyKClcIlxuICAgICAgICAgIFtsb2NhbGVdPVwibG9jYWxlXCJcbiAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcbiAgICAgICAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCJcbiAgICAgICAgICAobW9udGhTZWxlY3RlZCk9XCJzZXRNb250aCgkZXZlbnQpXCI+XG4gICAgICAgIDwvdGV0YS1tb250aC1zZWxlY3Q+XG4gICAgICAgIDx0ZXRhLWRheS1zZWxlY3RcbiAgICAgICAgICAqbmdJZj1cImRpc3BsYXlNb2RlID09PSBkYXRlUGlja2VyTW9kZUVudW0uZGF0ZVwiXG4gICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVudFZhbHVlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJhcHBseVZhbHVlKCRldmVudClcIlxuICAgICAgICAgIChkYXRlU2VsZWN0ZWQpPVwic2V0RGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAoeWVhclNlbGVjdGVkKT1cInNldFllYXIoJGV2ZW50KVwiXG4gICAgICAgICAgKG1vbnRoU2VsZWN0ZWQpPVwic2V0TW9udGgoJGV2ZW50KVwiXG4gICAgICAgICAgW21pbkRhdGVdPVwibWluRGF0ZVwiXG4gICAgICAgICAgW21heERhdGVdPVwibWF4RGF0ZVwiXG4gICAgICAgICAgW2ZpcnN0RGF5T2ZXZWVrXT1cImZpcnN0RGF5T2ZXZWVrXCJcbiAgICAgICAgICBbZGlzYWJsZWREYXlzXT1cImRpc2FibGVkRGF5c1wiXG4gICAgICAgICAgW2Rpc2FibGVkRGF0ZXNdPVwiZGlzYWJsZWREYXRlc1wiXG4gICAgICAgICAgW2Rpc2FibGVkUGVyaW9kc109XCJkaXNhYmxlZFBlcmlvZHNcIj48L3RldGEtZGF5LXNlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJzaG93VGltZVwiIGNsYXNzPVwiZGF0ZXBpY2tlci10aW1lIHBhZGRpbmctdi0xIGJvcmRlci10b3AgYm9yZGVyLXRleHQtMTAgZm9udC1ib2R5LTMgY29sb3ItdGV4dC05MFwiPlxuICAgICAgPHRldGEtdGltZS1wYXJ0LWNvbnRyb2wgW21heF09XCIyM1wiIFtuZ01vZGVsXT1cImludGVybmFsVmFsdWU/LmdldEhvdXJzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0SG91cigkZXZlbnQpXCI+PC90ZXRhLXRpbWUtcGFydC1jb250cm9sPlxuICAgICAgOlxuICAgICAgPHRldGEtdGltZS1wYXJ0LWNvbnRyb2wgW25nTW9kZWxdPVwiaW50ZXJuYWxWYWx1ZT8uZ2V0TWludXRlcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldE1pbnV0ZSgkZXZlbnQpXCI+PC90ZXRhLXRpbWUtcGFydC1jb250cm9sPlxuICAgICAgOlxuICAgICAgPHRldGEtdGltZS1wYXJ0LWNvbnRyb2wgW25nTW9kZWxdPVwiaW50ZXJuYWxWYWx1ZT8uZ2V0U2Vjb25kcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldFNlY29uZCgkZXZlbnQpXCI+PC90ZXRhLXRpbWUtcGFydC1jb250cm9sPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGV0YS1kcm9wZG93bj5cbiJdfQ==
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50L2RhdGUtcGlja2VyL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFBRSxVQUFVLEVBQ3hCLEtBQUssRUFFTCxNQUFNLEVBQUUsU0FBUyxFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQXVCLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUN2RSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsMkJBQTJCLEVBQUUsK0JBQStCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDMUYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7QUFHbkMsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQVE7SUFDckQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQVdGLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxVQUFVO0lBNEJqRCxZ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QkFBbkIsS0FBSztnQkFFYyxLQUFLO3NCQUF4QixTQUFTO3VCQUFDLE9BQU87Z0JBQ1IsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCwgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt2aWV3VHlwZX0gZnJvbSBcIi4uLy4uLy4uL2NvbW1vbi9tb2RlbC92aWV3LXR5cGUubW9kZWxcIjtcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7QWxpZ259IGZyb20gXCIuLi8uLi8uLi9jb21tb24vZW51bS9hbGlnbi5lbnVtXCI7XG5pbXBvcnQge1ZlcnRpY2FsQWxpZ259IGZyb20gXCIuLi8uLi8uLi9jb21tb24vZW51bS92ZXJ0aWNhbC1hbGlnbi5lbnVtXCI7XG5pbXBvcnQge0RhdGVQaXBlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge0Jhc2VQaWNrZXJ9IGZyb20gXCIuLi9iYXNlLXBpY2tlclwiO1xuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xuaW1wb3J0IHttYXNraXRvRGF0ZU9wdGlvbnNHZW5lcmF0b3IsIG1hc2tpdG9EYXRlVGltZU9wdGlvbnNHZW5lcmF0b3J9IGZyb20gXCJAbWFza2l0by9raXRcIjtcbmltcG9ydCB7UmVwbGF5U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0RhdGVQZXJpb2R9IGZyb20gXCIuLi9tb2RlbC9kYXRlLXBlcmlvZFwiO1xuXG5leHBvcnQgY29uc3QgREFURV9QSUNLRVJfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVBpY2tlckNvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGV0YS1kYXRlLXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtEQVRFX1BJQ0tFUl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SLCBEYXRlUGlwZV1cblxufSlcblxuZXhwb3J0IGNsYXNzIERhdGVQaWNrZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlUGlja2VyIGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBsb2NhbGU6IHN0cmluZyA9ICdydSc7XG4gIEBJbnB1dCgpIHNob3dUaW1lOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBtYXhEYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyID0gbnVsbDtcbiAgQElucHV0KCkgaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGlnbjogQWxpZ24gPSBBbGlnbi5sZWZ0O1xuICBASW5wdXQoKSB2ZXJ0aWNhbEFsaWduOiBWZXJ0aWNhbEFsaWduID0gVmVydGljYWxBbGlnbi5hdXRvO1xuICBASW5wdXQoKSB2aWV3VHlwZTogdmlld1R5cGUgPSAncm91bmRlZCdcbiAgQElucHV0KCkgYXBwZW5kVG9Cb2R5OiBib29sZWFuO1xuICBASW5wdXQoKSBiYWNrZHJvcDogYm9vbGVhbjtcbiAgQElucHV0KCkgYWxsb3dOdWxsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZmlyc3REYXlPZldlZWsgPSAxO1xuICBASW5wdXQoKSBkaXNhYmxlZERhdGVzOiBEYXRlW107XG4gIEBJbnB1dCgpIGRpc2FibGVkUGVyaW9kczogRGF0ZVBlcmlvZFtdO1xuICBASW5wdXQoKSBkaXNhYmxlZERheXM6IG51bWJlcltdO1xuICBASW5wdXQoKSBtaW5ZZWFyRGF0ZTogRGF0ZTtcbiAgQElucHV0KCkgbWF4WWVhckRhdGU6IERhdGU7XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXQnKSBpbnB1dDogRWxlbWVudFJlZjtcbiAgQE91dHB1dCgpIHNlbGVjdERhdGU6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKVxuICBwdWJsaWMgc2VsZWN0ZWREYXRlOiBSZXBsYXlTdWJqZWN0PERhdGUgfCBzdHJpbmcgfCBudW1iZXI+ID0gbmV3IFJlcGxheVN1YmplY3Q8RGF0ZSB8IHN0cmluZyB8IG51bWJlcj4oMSlcbiAgcHVibGljIG1hc2s6IHN0cmluZyA9ICcnO1xuXG5cbiAgY29uc3RydWN0b3Iob3ZlcnJpZGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG92ZXJyaWRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLCBvdmVycmlkZSBkYXRlUGlwZTogRGF0ZVBpcGUpIHtcbiAgICBzdXBlcihfZWxlbWVudFJlZiwgX2NkciwgZGF0ZVBpcGUpXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0ZSkge1xuICAgICAgdGhpcy5zZXREYXRlKHRoaXMuYWxsb3dOdWxsID8gbnVsbCA6IG5ldyBEYXRlKCkpXG4gICAgICB0aGlzLmRhdGUgPSB0aGlzLmFsbG93TnVsbCA/IG51bGwgOiBuZXcgRGF0ZSgpXG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREYXRlKG5ldyBEYXRlKHRoaXMuZGF0ZSkpXG4gICAgfVxuICAgIHRoaXMucHJlcGFyZUlucHV0KClcbiAgfVxuXG4gIHByZXBhcmVJbnB1dCgpIHtcbiAgICBjb25zdCBzdHIgPSB0aGlzLmRhdGUgPyB0aGlzLmdldExvY2FsZVN0cmluZyh0aGlzLmRhdGUpIDogJydcbiAgICBsZXQgb3B0aW9uO1xuICAgIGNvbnN0IHNldE1pbk1heCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcbiAgICAgICAgb3B0aW9uLm1pbiA9IGRheWpzKG5ldyBEYXRlKHRoaXMubWluRGF0ZSkpLnN0YXJ0T2YoJ2RheScpXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXhEYXRlKSB7XG4gICAgICAgIG9wdGlvbi5tYXggPSBkYXlqcyhuZXcgRGF0ZSh0aGlzLm1heERhdGUpKS5lbmRPZignZGF5JylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd1RpbWUpIHtcbiAgICAgIHRoaXMubWFzayA9ICdkZC5tbS55eXl5LCBoaDptbSc7XG4gICAgICBvcHRpb24gPSB7XG4gICAgICAgIGRhdGVNb2RlOiAnZGQvbW0veXl5eScsXG4gICAgICAgIHRpbWVNb2RlOiAnSEg6TU0nLFxuICAgICAgICBkYXRlU2VwYXJhdG9yOiAnLicsXG4gICAgICB9XG4gICAgICBzZXRNaW5NYXgoKVxuICAgICAgdGhpcy5tYXNraXRvT3B0aW9ucyA9IG1hc2tpdG9EYXRlVGltZU9wdGlvbnNHZW5lcmF0b3Iob3B0aW9uKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hc2sgPSAnZGQubW0ueXl5eSc7XG4gICAgICBvcHRpb24gPSB7XG4gICAgICAgIG1vZGU6ICdkZC9tbS95eXl5JyxcbiAgICAgICAgc2VwYXJhdG9yOiAnLicsXG4gICAgICB9XG4gICAgICBzZXRNaW5NYXgoKVxuICAgICAgdGhpcy5tYXNraXRvT3B0aW9ucyA9IG1hc2tpdG9EYXRlT3B0aW9uc0dlbmVyYXRvcihvcHRpb24pXG4gICAgfVxuICAgIHRoaXMuY2hhbmdlUGxhY2Vob2xkZXIoc3RyKVxuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIGlmICh0aGlzLmFsbG93TnVsbCAmJiB0aGlzLmlucHV0VGV4dC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLnNldERhdGUobnVsbClcbiAgICAgIHRoaXMuZW1pdFZhbHVlKG51bGwpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuaW5wdXRUZXh0LnNwbGl0KCcsJyk7XG4gICAgICBjb25zdCB7ZGF5LCB5ZWFyLCBtb250aH0gPSB0aGlzLmdldERhdGVGcm9tU3RyKHZhbFswXSk7XG4gICAgICBjb25zdCB7bWlucywgaG91cnN9ID0gdGhpcy5nZXRUaW1lRnJvbVN0cih2YWxbMV0pO1xuICAgICAgaWYgKGRheSAmJiB5ZWFyICYmIG1vbnRoKSB7XG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXkpXG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUuc2V0SG91cnMoaG91cnMgfHwgMCwgbWlucyB8fCAwKSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZVNlbGVjdGVkRGF0ZSh0aGlzLmdldEF2YWlsYWJsZURhdGUodGhpcy5taW5EYXRlLCB0aGlzLm1heERhdGUsIGRhdGUpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXREYXRlKHRoaXMuZGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBzZXREYXRlKGRhdGUpIHtcbiAgICBpZiAoIWRhdGUgJiYgdGhpcy5hbGxvd051bGwpIHtcbiAgICAgIHRoaXMuaW5wdXRUZXh0ID0gJydcbiAgICAgIHRoaXMuY2hhbmdlUGxhY2Vob2xkZXIoJycpXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5uZXh0KG5ldyBEYXRlKHRoaXMubWluRGF0ZSB8fCBuZXcgRGF0ZSgpKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnB1dFRleHQgPSB0aGlzLmdldExvY2FsZVN0cmluZyhkYXRlKVxuICAgICAgdGhpcy5jaGFuZ2VQbGFjZWhvbGRlcih0aGlzLmdldExvY2FsZVN0cmluZyhkYXRlKSlcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLm5leHQoZGF0ZSlcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZShkYXRlOiBEYXRlKSB7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoZGF0ZTogRGF0ZSkgPT4gYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICB9XG5cbiAgd3JpdGVWYWx1ZShvYmo6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAob2JqKSB7XG4gICAgICB0aGlzLmRhdGUgPSBuZXcgRGF0ZShvYmopXG4gICAgICB0aGlzLnNldERhdGUobmV3IERhdGUodGhpcy5kYXRlKSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuYWxsb3dOdWxsKSB7XG4gICAgICAgIHRoaXMuZGF0ZSA9IG51bGxcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUubmV4dChudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kYXRlID0gdGhpcy5taW5EYXRlIHx8IG5ldyBEYXRlKClcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUubmV4dCh0aGlzLm1pbkRhdGUgfHwgbmV3IERhdGUoKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG5cbn1cbiIsIjx0ZXRhLWRyb3Bkb3duICpuZ0lmPVwie3NlbGVjdGVkRGF0ZTpzZWxlY3RlZERhdGV8YXN5bmN9YXMgZGF0YVwiIFthcHBlbmRUb0JvZHldPVwiYXBwZW5kVG9Cb2R5XCIgW2JhY2tkcm9wXT1cImJhY2tkcm9wXCJcbiAgICAgICAgICAgICAgICAgW29wZW5dPVwib3BlblwiIChvcGVuQ2hhbmdlKT1cIm9wZW5DaGFuZ2UoJGV2ZW50KVwiIFt2aWV3VHlwZV09XCJ2aWV3VHlwZVwiXG4gICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFt2ZXJ0aWNhbEFsaWduXT1cInZlcnRpY2FsQWxpZ25cIiBbYWxpZ25dPVwiYWxpZ25cIlxuICAgICAgICAgICAgICAgICBbYXV0b0Nsb3NlSWdub3JlXT1cIlsnZXNjJywgJ2luc2lkZScsJ2VudGVyJ11cIj5cbiAgICA8ZGl2IHRldGFEcm9wZG93bkhlYWRcbiAgICAgICAgIFtjbGFzc109XCInZGF0ZXBpY2tlci1oZWFkIGZvbnQtYm9keS0zIGdhcC04ICBkYXRlcGlja2VyXycrdmlld1R5cGVcIlxuICAgICAgICAgW25nQ2xhc3NdPVwieydkYXRlcGlja2VyLWhlYWRfaW52YWxpZCc6aW52YWxpZCwnZGF0ZXBpY2tlci1oZWFkX2Rpc2FibGVkJzpkaXNhYmxlZH1cIj5cbiAgICAgIDx0ZXRhLWlucHV0IGNsYXNzPVwicm93IHJvd19hdXRvIGZsZXhcIj5cbiAgICAgICAgPGRpdiBbY2xhc3NdPVwiJ3Jvd19hdXRvIHJvdyBkYXRlcGlja2VyXycrdmlld1R5cGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHBvc2l0aW9uLXJlbGF0aXZlIGZvbnQtYm9keS0zIGFsaWduLWNlbnRlclwiPlxuICAgICAgICAgICAgPGlucHV0IFtuZ0NsYXNzXT1cInsnY29sb3ItdGV4dC05MCc6IWRpc2FibGVkfVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiICNpbnB1dCBzdHlsZT1cInotaW5kZXg6IDFcIiBjbGFzcz1cImJvcmRlci0wXCIgKGtleWRvd24pPVwiY2hlY2tFbnRlcigkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJpbnB1dFRleHRcIiAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICBbbWFza2l0b109XCJtYXNraXRvT3B0aW9uc1wiPlxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiaW5wdXQuZm9jdXMoKVwiICpuZ0lmPVwiZGF0YS5zZWxlY3RlZERhdGV8fGFsbG93TnVsbFwiIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgY29sb3ItdGV4dC0xMFwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwidG9wOi0wLjNweDtjdXJzb3I6IHRleHQ7dXNlci1zZWxlY3Q6IG5vbmVcIj57e3BsYWNlaG9sZGVyfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8dGV0YS1pY29uIFtuYW1lXT1cIidjYWxlbmRhcidcIj48L3RldGEtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RldGEtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiB0ZXRhRHJvcGRvd25Db250ZW50IGNsYXNzPVwic2Nyb2xsYWJsZVwiIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wZW5cIj5cbiAgICAgICAgPHRldGEtZGF0ZS1jYWxlbmRhciBbaXNEYXRlTnVsbF09XCJkYXRlPT09bnVsbFwiIFtvcGVuXT1cIm9wZW5cIiBbbWF4XT1cIm1heERhdGVcIiBbbWluXT1cIm1pbkRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAoc2V0RGF0ZSk9XCJjaGFuZ2VTZWxlY3RlZERhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZERhdGVdPVwiZGF0YS5zZWxlY3RlZERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICBbdmlld1R5cGVdPVwidmlld1R5cGVcIiBbbG9jYWxlXT1cImxvY2FsZVwiPjwvdGV0YS1kYXRlLWNhbGVuZGFyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L2Rpdj5cbiAgPC90ZXRhLWRyb3Bkb3duPlxuIl19