nxt-pick-datetime 16.0.0-alpha.6 → 16.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 (111) hide show
  1. package/{esm2020 → esm2022}/lib/class/date-time-adapter.class.mjs +96 -96
  2. package/{esm2020 → esm2022}/lib/class/date-time-format.class.mjs +3 -3
  3. package/esm2022/lib/class/date-time.class.mjs +96 -0
  4. package/{esm2020 → esm2022}/lib/class/dialog-config.class.mjs +46 -46
  5. package/{esm2020 → esm2022}/lib/class/dialog-ref.class.mjs +118 -118
  6. package/esm2022/lib/date-time/calendar/calendar.component.mjs +347 -0
  7. package/esm2022/lib/date-time/calendar-body/calendar-body.component.mjs +152 -0
  8. package/esm2022/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +430 -0
  9. package/esm2022/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +359 -0
  10. package/esm2022/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +363 -0
  11. package/esm2022/lib/date-time/date-time-inline/date-time-inline.component.mjs +276 -0
  12. package/esm2022/lib/date-time/date-time-picker/date-time-picker.component.mjs +542 -0
  13. package/{esm2020 → esm2022}/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +18 -18
  14. package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +390 -0
  15. package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +619 -0
  16. package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +62 -0
  17. package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +71 -0
  18. package/esm2022/lib/date-time/date-time.module.mjs +97 -0
  19. package/esm2022/lib/date-time/number-fixed-len.pipe.mjs +23 -0
  20. package/esm2022/lib/date-time/timer/timer.component.mjs +300 -0
  21. package/esm2022/lib/date-time/timer-box/timer-box.component.mjs +96 -0
  22. package/esm2022/lib/dialog/dialog-container/dialog-container.component.mjs +249 -0
  23. package/esm2022/lib/dialog/dialog.module.mjs +43 -0
  24. package/esm2022/lib/dialog/dialog.service.mjs +252 -0
  25. package/esm2022/lib/utils/object.mjs +24 -0
  26. package/esm2022/moment-adapter/date-time-adapter.class.mjs +221 -0
  27. package/{esm2020 → esm2022}/moment-adapter/date-time-format.class.mjs +12 -12
  28. package/esm2022/moment-adapter/moment-adapter.module.mjs +38 -0
  29. package/{esm2020 → esm2022}/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +4 -4
  30. package/{esm2020 → esm2022}/moment-adapter/public-api.mjs +2 -2
  31. package/esm2022/native-adapter/date-time-adapter.class.mjs +367 -0
  32. package/{esm2020 → esm2022}/native-adapter/date-time-format.class.mjs +12 -12
  33. package/esm2022/native-adapter/native-adapter.module.mjs +38 -0
  34. package/{esm2020 → esm2022}/native-adapter/nxt-pick-datetime-native-adapter.mjs +4 -4
  35. package/{esm2020 → esm2022}/native-adapter/public-api.mjs +1 -1
  36. package/{esm2020 → esm2022}/nxt-pick-datetime.mjs +4 -4
  37. package/{esm2020 → esm2022}/public-api.mjs +13 -13
  38. package/{fesm2020 → fesm2022}/nxt-pick-datetime-moment-adapter.mjs +257 -257
  39. package/{fesm2020 → fesm2022}/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
  40. package/{fesm2020 → fesm2022}/nxt-pick-datetime-native-adapter.mjs +402 -402
  41. package/{fesm2020 → fesm2022}/nxt-pick-datetime-native-adapter.mjs.map +1 -1
  42. package/{fesm2020 → fesm2022}/nxt-pick-datetime.mjs +4858 -4860
  43. package/{fesm2020 → fesm2022}/nxt-pick-datetime.mjs.map +1 -1
  44. package/index.d.ts +5 -5
  45. package/lib/class/date-time-adapter.class.d.ts +176 -176
  46. package/lib/class/date-time-format.class.d.ts +12 -12
  47. package/lib/class/date-time.class.d.ts +76 -76
  48. package/lib/class/dialog-config.class.d.ts +90 -90
  49. package/lib/class/dialog-ref.class.d.ts +50 -50
  50. package/lib/date-time/calendar/calendar.component.d.ts +147 -147
  51. package/lib/date-time/calendar-body/calendar-body.component.d.ts +79 -79
  52. package/lib/date-time/calendar-month-view/calendar-month-view.component.d.ts +139 -139
  53. package/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +115 -115
  54. package/lib/date-time/calendar-year-view/calendar-year-view.component.d.ts +123 -123
  55. package/lib/date-time/date-time-inline/date-time-inline.component.d.ts +106 -106
  56. package/lib/date-time/date-time-picker/date-time-picker.component.d.ts +172 -172
  57. package/lib/date-time/date-time-picker-container/date-time-picker-container.animations.d.ts +6 -6
  58. package/lib/date-time/date-time-picker-container/date-time-picker-container.component.d.ts +129 -129
  59. package/lib/date-time/date-time-picker-input.directive.d.ts +167 -167
  60. package/lib/date-time/date-time-picker-intl.service.d.ts +51 -51
  61. package/lib/date-time/date-time-picker-trigger.directive.d.ts +22 -22
  62. package/lib/date-time/date-time.module.d.ts +23 -23
  63. package/lib/date-time/number-fixed-len.pipe.d.ts +8 -8
  64. package/lib/date-time/timer/timer.component.d.ts +131 -131
  65. package/lib/date-time/timer-box/timer-box.component.d.ts +37 -37
  66. package/lib/dialog/dialog-container/dialog-container.component.d.ts +69 -69
  67. package/lib/dialog/dialog.module.d.ts +12 -12
  68. package/lib/dialog/dialog.service.d.ts +78 -78
  69. package/lib/utils/object.d.ts +9 -10
  70. package/moment-adapter/date-time-adapter.class.d.ts +64 -64
  71. package/moment-adapter/date-time-format.class.d.ts +5 -5
  72. package/moment-adapter/index.d.ts +5 -5
  73. package/moment-adapter/moment-adapter.module.d.ts +6 -6
  74. package/moment-adapter/public-api.d.ts +2 -2
  75. package/native-adapter/date-time-adapter.class.d.ts +72 -72
  76. package/native-adapter/date-time-format.class.d.ts +5 -5
  77. package/native-adapter/index.d.ts +5 -5
  78. package/native-adapter/native-adapter.module.d.ts +7 -7
  79. package/native-adapter/public-api.d.ts +1 -1
  80. package/package.json +18 -28
  81. package/public-api.d.ts +14 -14
  82. package/esm2020/lib/class/date-time.class.mjs +0 -95
  83. package/esm2020/lib/date-time/calendar/calendar.component.mjs +0 -346
  84. package/esm2020/lib/date-time/calendar-body/calendar-body.component.mjs +0 -151
  85. package/esm2020/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +0 -429
  86. package/esm2020/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -358
  87. package/esm2020/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +0 -362
  88. package/esm2020/lib/date-time/date-time-inline/date-time-inline.component.mjs +0 -275
  89. package/esm2020/lib/date-time/date-time-picker/date-time-picker.component.mjs +0 -541
  90. package/esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +0 -389
  91. package/esm2020/lib/date-time/date-time-picker-input.directive.mjs +0 -618
  92. package/esm2020/lib/date-time/date-time-picker-intl.service.mjs +0 -61
  93. package/esm2020/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
  94. package/esm2020/lib/date-time/date-time.module.mjs +0 -96
  95. package/esm2020/lib/date-time/number-fixed-len.pipe.mjs +0 -22
  96. package/esm2020/lib/date-time/timer/timer.component.mjs +0 -299
  97. package/esm2020/lib/date-time/timer-box/timer-box.component.mjs +0 -95
  98. package/esm2020/lib/dialog/dialog-container/dialog-container.component.mjs +0 -248
  99. package/esm2020/lib/dialog/dialog.module.mjs +0 -42
  100. package/esm2020/lib/dialog/dialog.service.mjs +0 -252
  101. package/esm2020/lib/utils/object.mjs +0 -25
  102. package/esm2020/moment-adapter/date-time-adapter.class.mjs +0 -220
  103. package/esm2020/moment-adapter/moment-adapter.module.mjs +0 -37
  104. package/esm2020/native-adapter/date-time-adapter.class.mjs +0 -366
  105. package/esm2020/native-adapter/native-adapter.module.mjs +0 -37
  106. package/fesm2015/nxt-pick-datetime-moment-adapter.mjs +0 -274
  107. package/fesm2015/nxt-pick-datetime-moment-adapter.mjs.map +0 -1
  108. package/fesm2015/nxt-pick-datetime-native-adapter.mjs +0 -420
  109. package/fesm2015/nxt-pick-datetime-native-adapter.mjs.map +0 -1
  110. package/fesm2015/nxt-pick-datetime.mjs +0 -5014
  111. package/fesm2015/nxt-pick-datetime.mjs.map +0 -1
@@ -0,0 +1,276 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, HostBinding, Inject, Input, Output, ViewChild } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { NXT_DATE_TIME_FORMATS } from '../../class/date-time-format.class';
4
+ import { DateTimeDirective } from '../../class/date-time.class';
5
+ import { DateTimeContainerComponent } from '../date-time-picker-container/date-time-picker-container.component';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../class/date-time-adapter.class";
8
+ import * as i2 from "../date-time-picker-container/date-time-picker-container.component";
9
+ /** @internal */
10
+ export const NXT_DATETIME_VALUE_ACCESSOR = {
11
+ provide: NG_VALUE_ACCESSOR,
12
+ useExisting: forwardRef(() => DateTimeInlineComponent),
13
+ multi: true
14
+ };
15
+ class DateTimeInlineComponent extends DateTimeDirective {
16
+ /**
17
+ * Set the type of the dateTime picker
18
+ *
19
+ * - `'both'` - show both calendar and timer
20
+ * - `'calendar'` - show only calendar
21
+ * - `'timer'` - show only timer
22
+ */
23
+ get pickerType() {
24
+ return this._pickerType;
25
+ }
26
+ set pickerType(val) {
27
+ if (val !== this._pickerType) {
28
+ this._pickerType = val;
29
+ }
30
+ }
31
+ /** Whether the date time picker should be disabled */
32
+ get disabled() {
33
+ return !!this._disabled;
34
+ }
35
+ set disabled(value) {
36
+ this._disabled = !!value;
37
+ }
38
+ /**
39
+ * The picker select mode
40
+ *
41
+ * - `'single'` - select a single date
42
+ * - `'range'` - select a range [from, to]
43
+ * - `'rangeFrom'` - an open range with a fixed start date
44
+ * - `'rangeTo'` - an open range with a fixed end date
45
+ */
46
+ get selectMode() {
47
+ return this._selectMode;
48
+ }
49
+ set selectMode(mode) {
50
+ if (mode !== 'single' &&
51
+ mode !== 'range' &&
52
+ mode !== 'rangeFrom' &&
53
+ mode !== 'rangeTo') {
54
+ throw Error('DateTime Error: invalid selectMode value!');
55
+ }
56
+ this._selectMode = mode;
57
+ }
58
+ /**
59
+ * The date to show when picker opens
60
+ *
61
+ * Defaults to selected date (if available) or current date.
62
+ */
63
+ get startAt() {
64
+ if (this._startAt) {
65
+ return this._startAt;
66
+ }
67
+ if (this.selectMode === 'single') {
68
+ return this.value;
69
+ }
70
+ else if (this.selectMode === 'range' ||
71
+ this.selectMode === 'rangeFrom') {
72
+ return this.values?.[0];
73
+ }
74
+ else if (this.selectMode === 'rangeTo') {
75
+ return this.values?.[1];
76
+ }
77
+ else {
78
+ return;
79
+ }
80
+ }
81
+ set startAt(date) {
82
+ this._startAt = this.getValidDate(this.dateTimeAdapter.deserialize(date));
83
+ }
84
+ /** A function to filter available date & time */
85
+ get dateTimeFilter() {
86
+ return this._dateTimeFilter;
87
+ }
88
+ set dateTimeFilter(filter) {
89
+ this._dateTimeFilter = filter;
90
+ }
91
+ /** The minimum valid date */
92
+ set min(value) {
93
+ this._min = this.getValidDate(this.dateTimeAdapter.deserialize(value));
94
+ this.changeDetector.markForCheck();
95
+ }
96
+ get min() {
97
+ return this._min;
98
+ }
99
+ /** The maximum valid date */
100
+ set max(value) {
101
+ this._max = this.getValidDate(this.dateTimeAdapter.deserialize(value));
102
+ this.changeDetector.markForCheck();
103
+ }
104
+ get max() {
105
+ return this._max;
106
+ }
107
+ get value() {
108
+ return this._value;
109
+ }
110
+ set value(value) {
111
+ value = this.dateTimeAdapter.deserialize(value);
112
+ value = this.getValidDate(value);
113
+ this._value = value;
114
+ this.selected = value;
115
+ }
116
+ get values() {
117
+ return this._values;
118
+ }
119
+ set values(values) {
120
+ if (values && values.length > 0) {
121
+ values = values.map(v => {
122
+ v = this.dateTimeAdapter.deserialize(v);
123
+ v = this.getValidDate(v);
124
+ return (v && this.dateTimeAdapter.clone(v));
125
+ });
126
+ this._values = [...values];
127
+ this.selecteds = [...values];
128
+ }
129
+ else {
130
+ this._values = [];
131
+ this.selecteds = [];
132
+ }
133
+ }
134
+ get selected() {
135
+ return this._selected;
136
+ }
137
+ set selected(value) {
138
+ this._selected = value;
139
+ this.changeDetector.markForCheck();
140
+ }
141
+ get selecteds() {
142
+ return this._selecteds;
143
+ }
144
+ set selecteds(values) {
145
+ this._selecteds = values;
146
+ this.changeDetector.markForCheck();
147
+ }
148
+ get isOpen() {
149
+ return true;
150
+ }
151
+ get pickerMode() {
152
+ return 'inline';
153
+ }
154
+ get isInSingleMode() {
155
+ return this._selectMode === 'single';
156
+ }
157
+ get isInRangeMode() {
158
+ return (this._selectMode === 'range' ||
159
+ this._selectMode === 'rangeFrom' ||
160
+ this._selectMode === 'rangeTo');
161
+ }
162
+ /** @internal */
163
+ get inlineClass() {
164
+ return true;
165
+ }
166
+ constructor(changeDetector, dateTimeAdapter, dateTimeFormats) {
167
+ super(dateTimeAdapter, dateTimeFormats);
168
+ this.changeDetector = changeDetector;
169
+ this._pickerType = 'both';
170
+ this._disabled = false;
171
+ this._selectMode = 'single';
172
+ /**
173
+ * Emits selected year in multi-year view
174
+ *
175
+ * This doesn't imply a change on the selected date.
176
+ */
177
+ this.yearSelected = new EventEmitter();
178
+ /**
179
+ * Emits selected month in year view
180
+ *
181
+ * This doesn't imply a change on the selected date.
182
+ */
183
+ this.monthSelected = new EventEmitter();
184
+ this._selecteds = new Array();
185
+ }
186
+ ngOnInit() {
187
+ if (this.container)
188
+ this.container.picker = this;
189
+ }
190
+ writeValue(value) {
191
+ value = value ?? undefined;
192
+ if (this.isInSingleMode) {
193
+ this.value = value;
194
+ if (this.container)
195
+ this.container.pickerMoment = value;
196
+ }
197
+ else {
198
+ this.values = value;
199
+ if (this.container)
200
+ this.container.pickerMoment = this._values?.[this.container.activeSelectedIndex];
201
+ }
202
+ }
203
+ registerOnChange(fn) {
204
+ this.onModelChange = fn;
205
+ }
206
+ registerOnTouched(fn) {
207
+ this.onModelTouched = fn;
208
+ }
209
+ setDisabledState(isDisabled) {
210
+ this.disabled = isDisabled;
211
+ }
212
+ select(date) {
213
+ if (this.disabled) {
214
+ return;
215
+ }
216
+ if (Array.isArray(date)) {
217
+ this.values = [...date];
218
+ }
219
+ else {
220
+ this.value = date;
221
+ }
222
+ this.onModelChange?.(date);
223
+ this.onModelTouched?.();
224
+ }
225
+ /**
226
+ * Emits the selected year in multi-year view
227
+ */
228
+ selectYear(normalizedYear) {
229
+ this.yearSelected.emit(normalizedYear);
230
+ }
231
+ /**
232
+ * Emits selected month in year view
233
+ */
234
+ selectMonth(normalizedMonth) {
235
+ this.monthSelected.emit(normalizedMonth);
236
+ }
237
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: DateTimeInlineComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DateTimeAdapter }, { token: NXT_DATE_TIME_FORMATS }], target: i0.ɵɵFactoryTarget.Component }); }
238
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: DateTimeInlineComponent, selector: "nxt-date-time-inline", inputs: { pickerType: "pickerType", disabled: "disabled", selectMode: "selectMode", startAt: "startAt", dateTimeFilter: "dateTimeFilter", min: "min", max: "max", value: "value", values: "values" }, outputs: { yearSelected: "yearSelected", monthSelected: "monthSelected" }, host: { properties: { "class.nxt-dt-inline": "this.inlineClass" } }, providers: [NXT_DATETIME_VALUE_ACCESSOR], viewQueries: [{ propertyName: "container", first: true, predicate: DateTimeContainerComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<nxt-date-time-container></nxt-date-time-container>\n", styles: [""], dependencies: [{ kind: "component", type: i2.DateTimeContainerComponent, selector: "nxt-date-time-container" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
239
+ }
240
+ export { DateTimeInlineComponent };
241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: DateTimeInlineComponent, decorators: [{
242
+ type: Component,
243
+ args: [{ selector: 'nxt-date-time-inline', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, providers: [NXT_DATETIME_VALUE_ACCESSOR], template: "<nxt-date-time-container></nxt-date-time-container>\n" }]
244
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DateTimeAdapter }, { type: undefined, decorators: [{
245
+ type: Inject,
246
+ args: [NXT_DATE_TIME_FORMATS]
247
+ }] }]; }, propDecorators: { container: [{
248
+ type: ViewChild,
249
+ args: [DateTimeContainerComponent, { static: true }]
250
+ }], pickerType: [{
251
+ type: Input
252
+ }], disabled: [{
253
+ type: Input
254
+ }], selectMode: [{
255
+ type: Input
256
+ }], startAt: [{
257
+ type: Input
258
+ }], dateTimeFilter: [{
259
+ type: Input
260
+ }], min: [{
261
+ type: Input
262
+ }], max: [{
263
+ type: Input
264
+ }], value: [{
265
+ type: Input
266
+ }], values: [{
267
+ type: Input
268
+ }], yearSelected: [{
269
+ type: Output
270
+ }], monthSelected: [{
271
+ type: Output
272
+ }], inlineClass: [{
273
+ type: HostBinding,
274
+ args: ['class.nxt-dt-inline']
275
+ }] } });
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2RhdGUtdGltZS1pbmxpbmUvZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2RhdGUtdGltZS1pbmxpbmUvZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBWSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDaEwsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXhFLE9BQU8sRUFBbUIscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUMzRixPQUFPLEVBQWMsaUJBQWlCLEVBQXNDLE1BQU0sNkJBQTZCLENBQUE7QUFDL0csT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0VBQW9FLENBQUE7Ozs7QUFFL0csZ0JBQWdCO0FBQ2hCLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFhO0lBQ2pELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztJQUN0RCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUE7QUFFRCxNQVFhLHVCQUEyQixTQUFRLGlCQUFvQjtJQU1oRTs7Ozs7O09BTUc7SUFDSCxJQUNJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUE7SUFDM0IsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLEdBQWU7UUFDMUIsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQTtTQUN6QjtJQUNMLENBQUM7SUFHRCxzREFBc0Q7SUFDdEQsSUFDYSxRQUFRO1FBQ2pCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUE7SUFDM0IsQ0FBQztJQUVELElBQWEsUUFBUSxDQUFDLEtBQWM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFBO0lBQzVCLENBQUM7SUFHRDs7Ozs7OztPQU9HO0lBQ0gsSUFDSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFBO0lBQzNCLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFnQjtRQUMzQixJQUNJLElBQUksS0FBSyxRQUFRO1lBQ2pCLElBQUksS0FBSyxPQUFPO1lBQ2hCLElBQUksS0FBSyxXQUFXO1lBQ3BCLElBQUksS0FBSyxTQUFTLEVBQ3BCO1lBQ0UsTUFBTSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtTQUMzRDtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO0lBQzNCLENBQUM7SUFHRDs7OztPQUlHO0lBQ0gsSUFDSSxPQUFPO1FBQ1AsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFBO1NBQ3ZCO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsRUFBRTtZQUM5QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUE7U0FDcEI7YUFBTSxJQUNILElBQUksQ0FBQyxVQUFVLEtBQUssT0FBTztZQUMzQixJQUFJLENBQUMsVUFBVSxLQUFLLFdBQVcsRUFDakM7WUFDRSxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUMxQjthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDdEMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDMUI7YUFBTTtZQUNILE9BQU07U0FDVDtJQUNMLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFtQjtRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUN6QyxDQUFBO0lBQ0wsQ0FBQztJQUdELGlEQUFpRDtJQUNqRCxJQUNJLGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUE7SUFDL0IsQ0FBQztJQUVELElBQUksY0FBYyxDQUFDLE1BQWlDO1FBQ2hELElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFBO0lBQ2pDLENBQUM7SUFHRCw2QkFBNkI7SUFDN0IsSUFDSSxHQUFHLENBQUMsS0FBb0I7UUFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQ3BCLENBQUM7SUFHRCw2QkFBNkI7SUFDN0IsSUFDSSxHQUFHLENBQUMsS0FBb0I7UUFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQ3BCLENBQUM7SUFHRCxJQUNJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDdEIsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLEtBQW9CO1FBQzFCLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMvQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQTtJQUN6QixDQUFDO0lBR0QsSUFDSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUF3QztRQUMvQyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN2QyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDeEIsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQy9DLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUE7WUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUE7U0FDL0I7YUFBTTtZQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO1NBQ3RCO0lBQ0wsQ0FBQztJQW1CRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUE7SUFDekIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQW9CO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDdEMsQ0FBQztJQUdELElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQTtJQUMxQixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsTUFBNEI7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUE7UUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1YsT0FBTyxRQUFRLENBQUE7SUFDbkIsQ0FBQztJQUVELElBQUksY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUE7SUFDeEMsQ0FBQztJQUVELElBQUksYUFBYTtRQUNiLE9BQU8sQ0FDSCxJQUFJLENBQUMsV0FBVyxLQUFLLE9BQU87WUFDNUIsSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUNqQyxDQUFBO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUNJLFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFLRCxZQUN1QixjQUFpQyxFQUNwRCxlQUFtQyxFQUVuQyxlQUFnQztRQUVoQyxLQUFLLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBTHBCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQWhPaEQsZ0JBQVcsR0FBZSxNQUFNLENBQUE7UUFtQmhDLGNBQVMsR0FBRyxLQUFLLENBQUE7UUFXakIsZ0JBQVcsR0FBZSxRQUFRLENBQUE7UUFnSTFDOzs7O1dBSUc7UUFFTSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFLLENBQUE7UUFFN0M7Ozs7V0FJRztRQUVNLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQTtRQVl0QyxlQUFVLEdBQUcsSUFBSSxLQUFLLEVBQWlCLENBQUE7SUE4Qy9DLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxJQUFJLENBQUMsU0FBUztZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQTtJQUNwQyxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDakIsS0FBSyxHQUFHLEtBQUssSUFBSSxTQUFTLENBQUE7UUFDMUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1lBQ2xCLElBQUksSUFBSSxDQUFDLFNBQVM7Z0JBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFBO1NBQzFDO2FBQU07WUFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtZQUNuQixJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FDckMsQ0FBQTtTQUNSO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQU87UUFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUE7SUFDM0IsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQU87UUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUE7SUFDNUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFBO0lBQzlCLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBYTtRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixPQUFNO1NBQ1Q7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUE7U0FDMUI7YUFBTTtZQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1NBQ3BCO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFCLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFBO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxjQUFpQjtRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsZUFBa0I7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDNUMsQ0FBQzs4R0F2U1EsdUJBQXVCLGtGQXVPcEIscUJBQXFCO2tHQXZPeEIsdUJBQXVCLHFZQUZyQixDQUFDLDJCQUEyQixDQUFDLHFFQUk3QiwwQkFBMEIscUZDeEJ6Qyx1REFDQTs7U0RxQmEsdUJBQXVCOzJGQUF2Qix1QkFBdUI7a0JBUm5DLFNBQVM7K0JBQ0ksc0JBQXNCLG1CQUdmLHVCQUF1QixDQUFDLE1BQU0sdUJBQzFCLEtBQUssYUFDZixDQUFDLDJCQUEyQixDQUFDOzswQkF5T25DLE1BQU07MkJBQUMscUJBQXFCOzRDQXBPekIsU0FBUztzQkFEaEIsU0FBUzt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBWW5ELFVBQVU7c0JBRGIsS0FBSztnQkFjTyxRQUFRO3NCQURwQixLQUFLO2dCQW1CRixVQUFVO3NCQURiLEtBQUs7Z0JBeUJGLE9BQU87c0JBRFYsS0FBSztnQkE2QkYsY0FBYztzQkFEakIsS0FBSztnQkFZRixHQUFHO3NCQUROLEtBQUs7Z0JBYUYsR0FBRztzQkFETixLQUFLO2dCQVlGLEtBQUs7c0JBRFIsS0FBSztnQkFjRixNQUFNO3NCQURULEtBQUs7Z0JBMEJHLFlBQVk7c0JBRHBCLE1BQU07Z0JBU0UsYUFBYTtzQkFEckIsTUFBTTtnQkE2Q0gsV0FBVztzQkFEZCxXQUFXO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUHJvdmlkZXIsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7IERhdGVUaW1lQWRhcHRlciB9IGZyb20gJy4uLy4uL2NsYXNzL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJ1xuaW1wb3J0IHsgRGF0ZVRpbWVGb3JtYXRzLCBOWFRfREFURV9USU1FX0ZPUk1BVFMgfSBmcm9tICcuLi8uLi9jbGFzcy9kYXRlLXRpbWUtZm9ybWF0LmNsYXNzJ1xuaW1wb3J0IHsgRGF0ZUZpbHRlciwgRGF0ZVRpbWVEaXJlY3RpdmUsIFBpY2tlck1vZGUsIFBpY2tlclR5cGUsIFNlbGVjdE1vZGUgfSBmcm9tICcuLi8uLi9jbGFzcy9kYXRlLXRpbWUuY2xhc3MnXG5pbXBvcnQgeyBEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmNvbXBvbmVudCdcblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IE5YVF9EQVRFVElNRV9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVRpbWVJbmxpbmVDb21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbnh0LWRhdGUtdGltZS1pbmxpbmUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXRpbWUtaW5saW5lLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRlLXRpbWUtaW5saW5lLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgcHJvdmlkZXJzOiBbTlhUX0RBVEVUSU1FX1ZBTFVFX0FDQ0VTU09SXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRlVGltZUlubGluZUNvbXBvbmVudDxUPiBleHRlbmRzIERhdGVUaW1lRGlyZWN0aXZlPFQ+IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgICBAVmlld0NoaWxkKERhdGVUaW1lQ29udGFpbmVyQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByaXZhdGUgY29udGFpbmVyPzogRGF0ZVRpbWVDb250YWluZXJDb21wb25lbnQ8VD5cblxuICAgIHByaXZhdGUgX3BpY2tlclR5cGU6IFBpY2tlclR5cGUgPSAnYm90aCdcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHR5cGUgb2YgdGhlIGRhdGVUaW1lIHBpY2tlclxuICAgICAqXG4gICAgICogLSAgICBgJ2JvdGgnYCAtIHNob3cgYm90aCBjYWxlbmRhciBhbmQgdGltZXJcbiAgICAgKiAtICAgIGAnY2FsZW5kYXInYCAtIHNob3cgb25seSBjYWxlbmRhclxuICAgICAqIC0gICAgYCd0aW1lcidgIC0gc2hvdyBvbmx5IHRpbWVyXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXQgcGlja2VyVHlwZSgpOiBQaWNrZXJUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BpY2tlclR5cGVcbiAgICB9XG5cbiAgICBzZXQgcGlja2VyVHlwZSh2YWw6IFBpY2tlclR5cGUpIHtcbiAgICAgICAgaWYgKHZhbCAhPT0gdGhpcy5fcGlja2VyVHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fcGlja2VyVHlwZSA9IHZhbFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZVxuICAgIC8qKiBXaGV0aGVyIHRoZSBkYXRlIHRpbWUgcGlja2VyIHNob3VsZCBiZSBkaXNhYmxlZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgb3ZlcnJpZGUgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kaXNhYmxlZFxuICAgIH1cblxuICAgIG92ZXJyaWRlIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9ICEhdmFsdWVcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZWxlY3RNb2RlOiBTZWxlY3RNb2RlID0gJ3NpbmdsZSdcbiAgICAvKipcbiAgICAgKiBUaGUgcGlja2VyIHNlbGVjdCBtb2RlXG4gICAgICpcbiAgICAgKiAtICAgIGAnc2luZ2xlJ2AgLSBzZWxlY3QgYSBzaW5nbGUgZGF0ZVxuICAgICAqIC0gICAgYCdyYW5nZSdgIC0gc2VsZWN0IGEgcmFuZ2UgW2Zyb20sIHRvXVxuICAgICAqIC0gICAgYCdyYW5nZUZyb20nYCAtIGFuIG9wZW4gcmFuZ2Ugd2l0aCBhIGZpeGVkIHN0YXJ0IGRhdGVcbiAgICAgKiAtICAgIGAncmFuZ2VUbydgIC0gYW4gb3BlbiByYW5nZSB3aXRoIGEgZml4ZWQgZW5kIGRhdGVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBzZWxlY3RNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZVxuICAgIH1cblxuICAgIHNldCBzZWxlY3RNb2RlKG1vZGU6IFNlbGVjdE1vZGUpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgbW9kZSAhPT0gJ3NpbmdsZScgJiZcbiAgICAgICAgICAgIG1vZGUgIT09ICdyYW5nZScgJiZcbiAgICAgICAgICAgIG1vZGUgIT09ICdyYW5nZUZyb20nICYmXG4gICAgICAgICAgICBtb2RlICE9PSAncmFuZ2VUbydcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignRGF0ZVRpbWUgRXJyb3I6IGludmFsaWQgc2VsZWN0TW9kZSB2YWx1ZSEnKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2VsZWN0TW9kZSA9IG1vZGVcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zdGFydEF0PzogVFxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRvIHNob3cgd2hlbiBwaWNrZXIgb3BlbnNcbiAgICAgKlxuICAgICAqIERlZmF1bHRzIHRvIHNlbGVjdGVkIGRhdGUgKGlmIGF2YWlsYWJsZSkgb3IgY3VycmVudCBkYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHN0YXJ0QXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdGFydEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnRBdFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlXG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZScgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXM/LlswXVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXM/LlsxXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgc3RhcnRBdChkYXRlOiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0QXQgPSB0aGlzLmdldFZhbGlkRGF0ZShcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGUpXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kYXRlVGltZUZpbHRlcj86IERhdGVGaWx0ZXI8VD5cbiAgICAvKiogQSBmdW5jdGlvbiB0byBmaWx0ZXIgYXZhaWxhYmxlIGRhdGUgJiB0aW1lICovXG4gICAgQElucHV0KClcbiAgICBnZXQgZGF0ZVRpbWVGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlVGltZUZpbHRlclxuICAgIH1cblxuICAgIHNldCBkYXRlVGltZUZpbHRlcihmaWx0ZXI6IERhdGVGaWx0ZXI8VD4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fZGF0ZVRpbWVGaWx0ZXIgPSBmaWx0ZXJcbiAgICB9XG5cbiAgICBwcml2YXRlIF9taW4/OiBUXG4gICAgLyoqIFRoZSBtaW5pbXVtIHZhbGlkIGRhdGUgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBtaW4odmFsdWU6IFQgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fbWluID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKVxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpXG4gICAgfVxuXG4gICAgZ2V0IG1pbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pblxuICAgIH1cblxuICAgIHByaXZhdGUgX21heD86IFRcbiAgICAvKiogVGhlIG1heGltdW0gdmFsaWQgZGF0ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IG1heCh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9tYXggPSB0aGlzLmdldFZhbGlkRGF0ZSh0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKClcbiAgICB9XG5cbiAgICBnZXQgbWF4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmFsdWU/OiBUXG4gICAgQElucHV0KClcbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZVxuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWx1ZTogVCB8IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxuICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0VmFsaWREYXRlKHZhbHVlKVxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB2YWx1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgX3ZhbHVlcz86IEFycmF5PFQgfCB1bmRlZmluZWQ+XG4gICAgQElucHV0KClcbiAgICBnZXQgdmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzXG4gICAgfVxuXG4gICAgc2V0IHZhbHVlcyh2YWx1ZXM6IEFycmF5PFQgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5tYXAodiA9PiB7XG4gICAgICAgICAgICAgICAgdiA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHYpXG4gICAgICAgICAgICAgICAgdiA9IHRoaXMuZ2V0VmFsaWREYXRlKHYpXG4gICAgICAgICAgICAgICAgcmV0dXJuICh2ICYmIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsb25lKHYpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFsuLi52YWx1ZXNdXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkcyA9IFsuLi52YWx1ZXNdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBbXVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZHMgPSBbXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgc2VsZWN0ZWQgeWVhciBpbiBtdWx0aS15ZWFyIHZpZXdcbiAgICAgKlxuICAgICAqIFRoaXMgZG9lc24ndCBpbXBseSBhIGNoYW5nZSBvbiB0aGUgc2VsZWN0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSB5ZWFyU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KClcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHNlbGVjdGVkIG1vbnRoIGluIHllYXIgdmlld1xuICAgICAqXG4gICAgICogVGhpcyBkb2Vzbid0IGltcGx5IGEgY2hhbmdlIG9uIHRoZSBzZWxlY3RlZCBkYXRlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IG1vbnRoU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KClcblxuICAgIHByaXZhdGUgX3NlbGVjdGVkPzogVFxuICAgIGdldCBzZWxlY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkXG4gICAgfVxuXG4gICAgc2V0IHNlbGVjdGVkKHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdmFsdWVcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKVxuICAgIH1cblxuICAgIHByaXZhdGUgX3NlbGVjdGVkcyA9IG5ldyBBcnJheTxUIHwgdW5kZWZpbmVkPigpXG4gICAgZ2V0IHNlbGVjdGVkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkc1xuICAgIH1cblxuICAgIHNldCBzZWxlY3RlZHModmFsdWVzOiBBcnJheTxUIHwgdW5kZWZpbmVkPikge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZHMgPSB2YWx1ZXNcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKVxuICAgIH1cblxuICAgIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgZ2V0IHBpY2tlck1vZGUoKTogUGlja2VyTW9kZSB7XG4gICAgICAgIHJldHVybiAnaW5saW5lJ1xuICAgIH1cblxuICAgIGdldCBpc0luU2luZ2xlTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdE1vZGUgPT09ICdzaW5nbGUnXG4gICAgfVxuXG4gICAgZ2V0IGlzSW5SYW5nZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2UnIHx8XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJyB8fFxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ueHQtZHQtaW5saW5lJylcbiAgICBnZXQgaW5saW5lQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk1vZGVsQ2hhbmdlPzogKGRhdGU6IFQgfCBUW10pID0+IHZvaWRcbiAgICBwcml2YXRlIG9uTW9kZWxUb3VjaGVkPzogKCkgPT4gdm9pZFxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIGRhdGVUaW1lQWRhcHRlcjogRGF0ZVRpbWVBZGFwdGVyPFQ+LFxuICAgICAgICBASW5qZWN0KE5YVF9EQVRFX1RJTUVfRk9STUFUUylcbiAgICAgICAgZGF0ZVRpbWVGb3JtYXRzOiBEYXRlVGltZUZvcm1hdHNcbiAgICApIHtcbiAgICAgICAgc3VwZXIoZGF0ZVRpbWVBZGFwdGVyLCBkYXRlVGltZUZvcm1hdHMpXG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcilcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnBpY2tlciA9IHRoaXNcbiAgICB9XG5cbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA/PyB1bmRlZmluZWRcbiAgICAgICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnBpY2tlck1vbWVudCA9IHZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlXG4gICAgICAgICAgICBpZiAodGhpcy5jb250YWluZXIpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucGlja2VyTW9tZW50ID0gdGhpcy5fdmFsdWVzPy5bXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFjdGl2ZVNlbGVjdGVkSW5kZXhcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlID0gZm5cbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Nb2RlbFRvdWNoZWQgPSBmblxuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZFxuICAgIH1cblxuICAgIHNlbGVjdChkYXRlOiBUW10gfCBUKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGUpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcyA9IFsuLi5kYXRlXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2U/LihkYXRlKVxuICAgICAgICB0aGlzLm9uTW9kZWxUb3VjaGVkPy4oKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHRoZSBzZWxlY3RlZCB5ZWFyIGluIG11bHRpLXllYXIgdmlld1xuICAgICAqL1xuICAgIHNlbGVjdFllYXIobm9ybWFsaXplZFllYXI6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy55ZWFyU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkWWVhcilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBzZWxlY3RlZCBtb250aCBpbiB5ZWFyIHZpZXdcbiAgICAgKi9cbiAgICBzZWxlY3RNb250aChub3JtYWxpemVkTW9udGg6IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb250aFNlbGVjdGVkLmVtaXQobm9ybWFsaXplZE1vbnRoKVxuICAgIH1cbn1cbiIsIjxueHQtZGF0ZS10aW1lLWNvbnRhaW5lcj48L254dC1kYXRlLXRpbWUtY29udGFpbmVyPlxuIl19