@dhutaryan/ngx-mat-timepicker 18.0.4 → 19.1.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 (47) hide show
  1. package/README.md +3 -0
  2. package/_timepicker-theme.scss +0 -6
  3. package/fesm2022/dhutaryan-ngx-mat-timepicker.mjs +119 -123
  4. package/fesm2022/dhutaryan-ngx-mat-timepicker.mjs.map +1 -1
  5. package/lib/hours-clock-dial.d.ts +1 -1
  6. package/lib/time-face-base.d.ts +1 -1
  7. package/lib/time-input-base.d.ts +1 -1
  8. package/lib/timepicker-actions.d.ts +5 -9
  9. package/lib/timepicker-base.d.ts +1 -1
  10. package/lib/timepicker-content.d.ts +9 -9
  11. package/lib/timepicker-input-base.d.ts +1 -1
  12. package/package.json +5 -6
  13. package/themes/_utils.scss +39 -0
  14. package/themes/m2/_tokens.scss +2 -0
  15. package/themes/m3/_base.scss +0 -8
  16. package/themes/m3/_color.scss +0 -11
  17. package/themes/m3/_tokens.scss +1 -1
  18. package/esm2022/dhutaryan-ngx-mat-timepicker.mjs +0 -5
  19. package/esm2022/lib/adapter/index.mjs +0 -34
  20. package/esm2022/lib/adapter/native-date-time-adapter.mjs +0 -137
  21. package/esm2022/lib/adapter/time-adapter.mjs +0 -90
  22. package/esm2022/lib/clock-dial-adnimation.mjs +0 -11
  23. package/esm2022/lib/clock-dials.mjs +0 -95
  24. package/esm2022/lib/clock-size.mjs +0 -25
  25. package/esm2022/lib/hours-clock-dial.mjs +0 -192
  26. package/esm2022/lib/minutes-clock-dial.mjs +0 -165
  27. package/esm2022/lib/orientation.mjs +0 -2
  28. package/esm2022/lib/time-face-base.mjs +0 -318
  29. package/esm2022/lib/time-input-base.mjs +0 -85
  30. package/esm2022/lib/time-inputs.mjs +0 -179
  31. package/esm2022/lib/time-period.mjs +0 -67
  32. package/esm2022/lib/time-selection-model.mjs +0 -76
  33. package/esm2022/lib/timepicker-actions-default.mjs +0 -3
  34. package/esm2022/lib/timepicker-actions.mjs +0 -135
  35. package/esm2022/lib/timepicker-animations.mjs +0 -22
  36. package/esm2022/lib/timepicker-base.mjs +0 -458
  37. package/esm2022/lib/timepicker-content-layout.mjs +0 -23
  38. package/esm2022/lib/timepicker-content.mjs +0 -127
  39. package/esm2022/lib/timepicker-input-base.mjs +0 -254
  40. package/esm2022/lib/timepicker-input.mjs +0 -136
  41. package/esm2022/lib/timepicker-intl.mjs +0 -39
  42. package/esm2022/lib/timepicker-scroll-strategy.mjs +0 -15
  43. package/esm2022/lib/timepicker-toggle.mjs +0 -96
  44. package/esm2022/lib/timepicker.mjs +0 -33
  45. package/esm2022/lib/timepicker.module.mjs +0 -138
  46. package/esm2022/public-api.mjs +0 -23
  47. package/themes/_base.scss +0 -119
@@ -1,318 +0,0 @@
1
- import { Directive, EventEmitter, Input, Optional, Output, } from '@angular/core';
2
- import { coerceNumberProperty } from '@angular/cdk/coercion';
3
- import { ALL_MINUTES } from './minutes-clock-dial';
4
- import { ALL_HOURS } from './hours-clock-dial';
5
- import { DOWN_ARROW, UP_ARROW } from '@angular/cdk/keycodes';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "./adapter";
8
- export class MatTimeFaceBase {
9
- /** The currently selected time. */
10
- get selected() {
11
- return this._selected;
12
- }
13
- set selected(value) {
14
- this._selected = this._timeAdapter.getValidTimeOrNull(this._timeAdapter.deserialize(value));
15
- if (!this._selected) {
16
- return;
17
- }
18
- const hour = this._timeAdapter.getHour(this._selected);
19
- this.selectedHour = hour > 12 && this.isMeridiem ? hour - 12 : hour;
20
- if (hour === 0 && this.isMeridiem) {
21
- this.selectedHour = 12;
22
- }
23
- this.selectedMinute = this._timeAdapter.getMinute(this._selected);
24
- this.availableHours = ALL_HOURS;
25
- if (this.isMeridiem) {
26
- this.period = this._timeAdapter.getPeriod(this._selected);
27
- }
28
- this.availableMinutes = ALL_MINUTES;
29
- this._setMinHour();
30
- this._setMaxHour();
31
- this._setMinMinute();
32
- this._setMaxMinute();
33
- this._moveFocusOnNextTick = this.isMeridiem;
34
- }
35
- /** The minimum selectable time. */
36
- get minTime() {
37
- return this._minTime;
38
- }
39
- set minTime(value) {
40
- this._minTime = this._timeAdapter.getValidTimeOrNull(this._timeAdapter.deserialize(value));
41
- if (value) {
42
- this._setMinHour();
43
- this._setMinMinute();
44
- this._setDisabledPeriod();
45
- }
46
- }
47
- /** The maximum selectable time. */
48
- get maxTime() {
49
- return this._maxTime;
50
- }
51
- set maxTime(value) {
52
- this._maxTime = this._timeAdapter.getValidTimeOrNull(this._timeAdapter.deserialize(value));
53
- if (value) {
54
- this._setMaxHour();
55
- this._setMaxMinute();
56
- this._setDisabledPeriod();
57
- }
58
- }
59
- /** Step over minutes. */
60
- get minuteInterval() {
61
- return this._minuteInterval;
62
- }
63
- set minuteInterval(value) {
64
- this._minuteInterval = coerceNumberProperty(value) || 1;
65
- }
66
- constructor(_timeAdapter) {
67
- this._timeAdapter = _timeAdapter;
68
- this._minuteInterval = 1;
69
- /** Color palette. */
70
- this.color = 'primary';
71
- /** Emits when any hour, minute or period is selected. */
72
- this._userSelection = new EventEmitter();
73
- this.selectedChange = new EventEmitter();
74
- this.selectedHour = 0;
75
- this.selectedMinute = 0;
76
- this.disabledPeriod = null;
77
- this.availableMinutes = ALL_MINUTES;
78
- this.availableHours = ALL_HOURS;
79
- /**
80
- * Used for scheduling that focus should be moved to the active cell on the next tick.
81
- * We need to schedule it, rather than do it immediately, because we have to wait
82
- * for Angular to re-evaluate the view children.
83
- */
84
- this._moveFocusOnNextTick = false;
85
- }
86
- ngAfterContentInit() {
87
- if (!this.selected) {
88
- this.selected = this._timeAdapter.clampTime(this._timeAdapter.now(), this.minTime, this.maxTime);
89
- this._userSelection.emit(this.selected);
90
- }
91
- }
92
- ngAfterViewChecked() {
93
- if (this._moveFocusOnNextTick) {
94
- this._moveFocusOnNextTick = false;
95
- this.focusActiveCell();
96
- }
97
- }
98
- /** Handles hour selection. */
99
- _onHourSelected(hour) {
100
- this.selectedHour = hour;
101
- const selected = this._timeAdapter.updateHour(this.selected, this._getHourBasedOnPeriod(hour));
102
- this._timeSelected(selected);
103
- }
104
- /** Handles minute selection. */
105
- _onMinuteSelected(minute) {
106
- this.selectedMinute = minute;
107
- const selected = this._timeAdapter.updateMinute(this.selected, minute);
108
- this._timeSelected(selected);
109
- }
110
- /** Handles period changing. */
111
- _onPeriodChanged(period) {
112
- this.period = period;
113
- const selected = this._timeAdapter.updateHour(this.selected, this._getHourBasedOnPeriod(this.selectedHour));
114
- this._timeSelected(selected);
115
- }
116
- _getAvailableHours() {
117
- if (this.isMeridiem) {
118
- return this.availableHours
119
- .filter((h) => {
120
- if (this.period === 'am') {
121
- return h < 12;
122
- }
123
- if (this.period === 'pm') {
124
- return h >= 12;
125
- }
126
- return h;
127
- })
128
- .map((h) => {
129
- if (h > 12) {
130
- return h - 12;
131
- }
132
- if (h === 0) {
133
- return 12;
134
- }
135
- return h;
136
- });
137
- }
138
- return this.availableHours;
139
- }
140
- _onKeydown(event, view) {
141
- switch (view) {
142
- case 'hour':
143
- this._handleHourKeydown(event);
144
- break;
145
- case 'minute':
146
- this._handleMinuteKeydown(event);
147
- break;
148
- }
149
- }
150
- _handleHourKeydown(event) {
151
- const hours = this._getAvailableHours();
152
- const selectedHourIndex = hours.findIndex((hour) => hour === this.selectedHour);
153
- if (!hours.length) {
154
- return;
155
- }
156
- switch (event.keyCode) {
157
- case UP_ARROW:
158
- if (selectedHourIndex + 1 >= hours.length || selectedHourIndex < 0) {
159
- this._onHourSelected(hours[0]);
160
- }
161
- else {
162
- this._onHourSelected(hours[selectedHourIndex + 1]);
163
- }
164
- break;
165
- case DOWN_ARROW:
166
- if (selectedHourIndex - 1 < 0 || selectedHourIndex < 0) {
167
- this._onHourSelected(hours[hours.length - 1]);
168
- }
169
- else {
170
- this._onHourSelected(hours[selectedHourIndex - 1]);
171
- }
172
- break;
173
- default:
174
- break;
175
- }
176
- }
177
- _handleMinuteKeydown(event) {
178
- const minutes = this.availableMinutes;
179
- const selectedMinuteIndex = minutes.findIndex((minute) => minute === this.selectedMinute);
180
- if (!minutes.length) {
181
- return;
182
- }
183
- switch (event.keyCode) {
184
- case UP_ARROW:
185
- if (selectedMinuteIndex + this.minuteInterval >= minutes.length ||
186
- selectedMinuteIndex < 0) {
187
- const difference = 60 - this.selectedMinute + Math.min(...this.availableMinutes);
188
- const count = Math.ceil(difference / this.minuteInterval);
189
- const differenceForValid = count * this.minuteInterval;
190
- const nextValidValue = this.selectedMinute + differenceForValid;
191
- const correctIndex = minutes.findIndex((minute) => minute === nextValidValue - 60 // amount of mins
192
- );
193
- this._onMinuteSelected(minutes[correctIndex]);
194
- }
195
- else {
196
- this._onMinuteSelected(minutes[selectedMinuteIndex + this.minuteInterval]);
197
- }
198
- break;
199
- case DOWN_ARROW:
200
- if (selectedMinuteIndex - this.minuteInterval < 0 ||
201
- selectedMinuteIndex < 0) {
202
- const difference = 60 + this.selectedMinute - Math.max(...this.availableMinutes);
203
- const count = Math.ceil(difference / this.minuteInterval);
204
- const differenceForValid = count * this.minuteInterval;
205
- const nextValidValue = this.selectedMinute - differenceForValid;
206
- const correctIndex = minutes.findIndex((minute) => minute === nextValidValue + 60 // amount of mins
207
- );
208
- this._onMinuteSelected(minutes[correctIndex]);
209
- }
210
- else {
211
- this._onMinuteSelected(minutes[selectedMinuteIndex - this.minuteInterval]);
212
- }
213
- break;
214
- default:
215
- break;
216
- }
217
- }
218
- /** Gets a correct hours based on meridiem and period. */
219
- _getHourBasedOnPeriod(hour) {
220
- const afterNoon = this.isMeridiem && this.period === 'pm';
221
- const beforeNoon = this.isMeridiem && this.period === 'am';
222
- if (afterNoon) {
223
- return hour === 12 ? hour : hour + 12;
224
- }
225
- if (beforeNoon) {
226
- return hour === 12 ? 0 : hour;
227
- }
228
- return hour;
229
- }
230
- _timeSelected(value) {
231
- if (value && !this._timeAdapter.sameTime(value, this.selected)) {
232
- this.selectedChange.emit(value);
233
- }
234
- this._userSelection.emit(value);
235
- }
236
- /** Sets min hour. */
237
- _setMinHour() {
238
- if (!this.minTime) {
239
- return;
240
- }
241
- const minHour = this._timeAdapter.getHour(this.minTime);
242
- this.availableHours = this.availableHours.filter((h) => h >= minHour);
243
- }
244
- /** Sets max hour. */
245
- _setMaxHour() {
246
- if (!this.maxTime) {
247
- return;
248
- }
249
- const maxHour = this._timeAdapter.getHour(this.maxTime);
250
- this.availableHours = this.availableHours.filter((h) => h <= maxHour);
251
- }
252
- /** Sets min minute. */
253
- _setMinMinute() {
254
- if (!this.selected || !this.minTime) {
255
- return;
256
- }
257
- const selectedHour = this._timeAdapter.getHour(this.selected);
258
- const minHour = this._timeAdapter.getHour(this.minTime);
259
- const minMinute = selectedHour > minHour ? 0 : this._timeAdapter.getMinute(this.minTime);
260
- this.availableMinutes = this.availableMinutes.filter((minute) => minute >= minMinute);
261
- if (selectedHour < minHour) {
262
- this.availableMinutes = [];
263
- }
264
- }
265
- /** Sets max minute. */
266
- _setMaxMinute() {
267
- if (!this.selected || !this.maxTime) {
268
- return;
269
- }
270
- const selectedHour = this._timeAdapter.getHour(this.selected);
271
- const maxHour = this._timeAdapter.getHour(this.maxTime);
272
- const maxMinute = selectedHour < maxHour ? 59 : this._timeAdapter.getMinute(this.maxTime);
273
- this.availableMinutes = this.availableMinutes.filter((minute) => minute <= maxMinute);
274
- if (selectedHour > maxHour) {
275
- this.availableMinutes = [];
276
- }
277
- }
278
- /** Sets disabled period. */
279
- _setDisabledPeriod() {
280
- if (this.minTime) {
281
- const minHour = this._timeAdapter.getHour(this.minTime);
282
- if (minHour >= 12) {
283
- this.disabledPeriod = 'am';
284
- }
285
- }
286
- if (this.maxTime) {
287
- const maxHour = this._timeAdapter.getHour(this.maxTime);
288
- const maxMinute = this._timeAdapter.getHour(this.maxTime);
289
- if (maxHour < 12 || (maxHour === 12 && maxMinute === 0)) {
290
- this.disabledPeriod = 'pm';
291
- }
292
- }
293
- }
294
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimeFaceBase, deps: [{ token: i1.TimeAdapter, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
295
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.4", type: MatTimeFaceBase, inputs: { selected: "selected", minTime: "minTime", maxTime: "maxTime", minuteInterval: "minuteInterval", isMeridiem: "isMeridiem", color: "color" }, outputs: { _userSelection: "_userSelection", selectedChange: "selectedChange" }, ngImport: i0 }); }
296
- }
297
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimeFaceBase, decorators: [{
298
- type: Directive
299
- }], ctorParameters: () => [{ type: i1.TimeAdapter, decorators: [{
300
- type: Optional
301
- }] }], propDecorators: { selected: [{
302
- type: Input
303
- }], minTime: [{
304
- type: Input
305
- }], maxTime: [{
306
- type: Input
307
- }], minuteInterval: [{
308
- type: Input
309
- }], isMeridiem: [{
310
- type: Input
311
- }], color: [{
312
- type: Input
313
- }], _userSelection: [{
314
- type: Output
315
- }], selectedChange: [{
316
- type: Output
317
- }] } });
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1mYWNlLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXQtdGltZXBpY2tlci9zcmMvbGliL3RpbWUtZmFjZS1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSTdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQUczRSxNQUFNLE9BQWdCLGVBQWU7SUFHbkMsbUNBQW1DO0lBQ25DLElBQ0ksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsS0FBZTtRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUNyQyxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFD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QUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUUxRCxJQUFJLE9BQU8sR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLEtBQUssRUFBRSxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7OEdBMVptQixlQUFlO2tHQUFmLGVBQWU7OzJGQUFmLGVBQWU7a0JBRHBDLFNBQVM7OzBCQThHSyxRQUFRO3lDQXhHakIsUUFBUTtzQkFEWCxLQUFLO2dCQW9DRixPQUFPO3NCQURWLEtBQUs7Z0JBbUJGLE9BQU87c0JBRFYsS0FBSztnQkFtQkYsY0FBYztzQkFEakIsS0FBSztnQkFVRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHSSxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdDaGVja2VkLFxuICBEaXJlY3RpdmUsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5cbmltcG9ydCB7IFRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyJztcbmltcG9ydCB7IE1hdFRpbWVQZXJpb2RUeXBlIH0gZnJvbSAnLi90aW1lLXBlcmlvZCc7XG5pbXBvcnQgeyBBTExfTUlOVVRFUyB9IGZyb20gJy4vbWludXRlcy1jbG9jay1kaWFsJztcbmltcG9ydCB7IEFMTF9IT1VSUyB9IGZyb20gJy4vaG91cnMtY2xvY2stZGlhbCc7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBFTlRFUiwgU1BBQ0UsIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWF0VGltZUZhY2VCYXNlPFQ+XG4gIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZFxue1xuICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0aW1lLiAqL1xuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0ZWQoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuICBzZXQgc2VsZWN0ZWQodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB0aGlzLl90aW1lQWRhcHRlci5nZXRWYWxpZFRpbWVPck51bGwoXG4gICAgICB0aGlzLl90aW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSlcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLl9zZWxlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhvdXIgPSB0aGlzLl90aW1lQWRhcHRlci5nZXRIb3VyKHRoaXMuX3NlbGVjdGVkKTtcbiAgICB0aGlzLnNlbGVjdGVkSG91ciA9IGhvdXIgPiAxMiAmJiB0aGlzLmlzTWVyaWRpZW0gPyBob3VyIC0gMTIgOiBob3VyO1xuICAgIGlmIChob3VyID09PSAwICYmIHRoaXMuaXNNZXJpZGllbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEhvdXIgPSAxMjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZE1pbnV0ZSA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldE1pbnV0ZSh0aGlzLl9zZWxlY3RlZCk7XG4gICAgdGhpcy5hdmFpbGFibGVIb3VycyA9IEFMTF9IT1VSUztcblxuICAgIGlmICh0aGlzLmlzTWVyaWRpZW0pIHtcbiAgICAgIHRoaXMucGVyaW9kID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0UGVyaW9kKHRoaXMuX3NlbGVjdGVkKTtcbiAgICB9XG5cbiAgICB0aGlzLmF2YWlsYWJsZU1pbnV0ZXMgPSBBTExfTUlOVVRFUztcbiAgICB0aGlzLl9zZXRNaW5Ib3VyKCk7XG4gICAgdGhpcy5fc2V0TWF4SG91cigpO1xuICAgIHRoaXMuX3NldE1pbk1pbnV0ZSgpO1xuICAgIHRoaXMuX3NldE1heE1pbnV0ZSgpO1xuICAgIHRoaXMuX21vdmVGb2N1c09uTmV4dFRpY2sgPSB0aGlzLmlzTWVyaWRpZW07XG4gIH1cbiAgcHJpdmF0ZSBfc2VsZWN0ZWQ6IFQgfCBudWxsO1xuXG4gIC8qKiBUaGUgbWluaW11bSBzZWxlY3RhYmxlIHRpbWUuICovXG4gIEBJbnB1dCgpXG4gIGdldCBtaW5UaW1lKCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWluVGltZTtcbiAgfVxuICBzZXQgbWluVGltZSh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9taW5UaW1lID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0VmFsaWRUaW1lT3JOdWxsKFxuICAgICAgdGhpcy5fdGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpXG4gICAgKTtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2V0TWluSG91cigpO1xuICAgICAgdGhpcy5fc2V0TWluTWludXRlKCk7XG4gICAgICB0aGlzLl9zZXREaXNhYmxlZFBlcmlvZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9taW5UaW1lOiBUIHwgbnVsbDtcblxuICAvKiogVGhlIG1heGltdW0gc2VsZWN0YWJsZSB0aW1lLiAqL1xuICBASW5wdXQoKVxuICBnZXQgbWF4VGltZSgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21heFRpbWU7XG4gIH1cbiAgc2V0IG1heFRpbWUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fbWF4VGltZSA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldFZhbGlkVGltZU9yTnVsbChcbiAgICAgIHRoaXMuX3RpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxuICAgICk7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3NldE1heEhvdXIoKTtcbiAgICAgIHRoaXMuX3NldE1heE1pbnV0ZSgpO1xuICAgICAgdGhpcy5fc2V0RGlzYWJsZWRQZXJpb2QoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfbWF4VGltZTogVCB8IG51bGw7XG5cbiAgLyoqIFN0ZXAgb3ZlciBtaW51dGVzLiAqL1xuICBASW5wdXQoKVxuICBnZXQgbWludXRlSW50ZXJ2YWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWludXRlSW50ZXJ2YWw7XG4gIH1cbiAgc2V0IG1pbnV0ZUludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW51dGVJbnRlcnZhbCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKSB8fCAxO1xuICB9XG4gIHByaXZhdGUgX21pbnV0ZUludGVydmFsOiBudW1iZXIgPSAxO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjbG9jayB1c2VzIDEyIGhvdXIgZm9ybWF0LiAqL1xuICBASW5wdXQoKSBpc01lcmlkaWVtOiBib29sZWFuO1xuXG4gIC8qKiBDb2xvciBwYWxldHRlLiAqL1xuICBASW5wdXQoKSBjb2xvcjogVGhlbWVQYWxldHRlID0gJ3ByaW1hcnknO1xuXG4gIC8qKiBFbWl0cyB3aGVuIGFueSBob3VyLCBtaW51dGUgb3IgcGVyaW9kIGlzIHNlbGVjdGVkLiAqL1xuICBAT3V0cHV0KCkgX3VzZXJTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIHNlbGVjdGVkSG91cjogbnVtYmVyID0gMDtcbiAgc2VsZWN0ZWRNaW51dGU6IG51bWJlciA9IDA7XG4gIHBlcmlvZDogTWF0VGltZVBlcmlvZFR5cGU7XG4gIGRpc2FibGVkUGVyaW9kOiBNYXRUaW1lUGVyaW9kVHlwZSB8IG51bGwgPSBudWxsO1xuICBhdmFpbGFibGVNaW51dGVzID0gQUxMX01JTlVURVM7XG4gIGF2YWlsYWJsZUhvdXJzID0gQUxMX0hPVVJTO1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBzY2hlZHVsaW5nIHRoYXQgZm9jdXMgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBhY3RpdmUgY2VsbCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgKiBXZSBuZWVkIHRvIHNjaGVkdWxlIGl0LCByYXRoZXIgdGhhbiBkbyBpdCBpbW1lZGlhdGVseSwgYmVjYXVzZSB3ZSBoYXZlIHRvIHdhaXRcbiAgICogZm9yIEFuZ3VsYXIgdG8gcmUtZXZhbHVhdGUgdGhlIHZpZXcgY2hpbGRyZW4uXG4gICAqL1xuICBwcml2YXRlIF9tb3ZlRm9jdXNPbk5leHRUaWNrID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHJvdGVjdGVkIF90aW1lQWRhcHRlcjogVGltZUFkYXB0ZXI8VD4pIHt9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuX3RpbWVBZGFwdGVyLmNsYW1wVGltZShcbiAgICAgICAgdGhpcy5fdGltZUFkYXB0ZXIubm93KCksXG4gICAgICAgIHRoaXMubWluVGltZSxcbiAgICAgICAgdGhpcy5tYXhUaW1lXG4gICAgICApO1xuICAgICAgdGhpcy5fdXNlclNlbGVjdGlvbi5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5fbW92ZUZvY3VzT25OZXh0VGljaykge1xuICAgICAgdGhpcy5fbW92ZUZvY3VzT25OZXh0VGljayA9IGZhbHNlO1xuICAgICAgdGhpcy5mb2N1c0FjdGl2ZUNlbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNlcyB0aGUgYWN0aXZlIGNlbGwgYWZ0ZXIgb3IgaW5wdXQgdGhlIG1pY3JvdGFzayBxdWV1ZSBpcyBlbXB0eS5cbiAgICpcbiAgICogQWRkaW5nIGEgMG1zIHNldFRpbWVvdXQgc2VlbXMgdG8gZml4IFZvaWNlb3ZlciBsb3NpbmcgZm9jdXMgd2hlbiBwcmVzc2luZyBQYWdlVXAvUGFnZURvd24uXG4gICAqXG4gICAqIERldGVybWluZWQgYSAwbXMgYnkgZ3JhZHVhbGx5IGluY3JlYXNpbmcgZHVyYXRpb24gZnJvbSAwIGFuZCB0ZXN0aW5nIHR3byB1c2UgY2FzZXMgd2l0aCBzY3JlZW5cbiAgICogcmVhZGVyIGVuYWJsZWQ6XG4gICAqXG4gICAqIDEuIFByZXNzaW5nIFBhZ2VVcC9QYWdlRG93biByZXBlYXRlZGx5IHdpdGggcGF1c2luZyBiZXR3ZWVuIGVhY2gga2V5IHByZXNzLlxuICAgKiAyLiBQcmVzc2luZyBhbmQgaG9sZGluZyB0aGUgUGFnZURvd24ga2V5IHdpdGggcmVwZWF0ZWQga2V5cyBlbmFibGVkLlxuICAgKlxuICAgKiBUZXN0IDEgd29ya2VkIHJvdWdobHkgOTUtOTklIG9mIHRoZSB0aW1lIHdpdGggMG1zIGFuZCBnb3QgYSBsaXR0bGUgYml0IGJldHRlciBhcyB0aGUgZHVyYXRpb25cbiAgICogaW5jcmVhc2VkLiBUZXN0IDIgZ290IHNsaWdodGx5IGJldHRlciB1bnRpbCB0aGUgZHVyYXRpb24gd2FzIGxvbmcgZW5vdWdoIHRvIGludGVyZmVyZSB3aXRoXG4gICAqIHJlcGVhdGVkIGtleXMuIElmIHRoZSByZXBlYXRlZCBrZXkgc3BlZWQgd2FzIGZhc3RlciB0aGFuIHRoZSB0aW1lb3V0IGR1cmF0aW9uLCB0aGVuIHByZXNzaW5nXG4gICAqIGFuZCBob2xkaW5nIHBhZ2Vkb3duIGNhdXNlZCB0aGUgZW50aXJlIHBhZ2UgdG8gc2Nyb2xsLlxuICAgKlxuICAgKiBTaW5jZSByZXBlYXRlZCBrZXkgc3BlZWQgY2FuIHZlcmlmeSBhY3Jvc3MgbWFjaGluZXMsIGRldGVybWluZWQgdGhhdCBhbnkgZHVyYXRpb24gY291bGRcbiAgICogcG90ZW50aWFsbHkgaW50ZXJmZXJlIHdpdGggcmVwZWF0ZWQga2V5cy4gMG1zIHdvdWxkIGJlIGJlc3QgYmVjYXVzZSBpdCBhbG1vc3QgZW50aXJlbHlcbiAgICogZWxpbWluYXRlcyB0aGUgZm9jdXMgYmVpbmcgbG9zdCBpbiBWb2ljZW92ZXIgd2l0aG91dCBjYXVzaW5nIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLlxuICAgKiBBZGRpbmcgZGVsYXkgYWxzbyBjb21wbGljYXRlcyB3cml0aW5nIHRlc3RzLlxuICAgKi9cbiAgYWJzdHJhY3QgZm9jdXNBY3RpdmVDZWxsKCk6IHZvaWQ7XG5cbiAgLyoqIEhhbmRsZXMgaG91ciBzZWxlY3Rpb24uICovXG4gIF9vbkhvdXJTZWxlY3RlZChob3VyOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkSG91ciA9IGhvdXI7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLl90aW1lQWRhcHRlci51cGRhdGVIb3VyKFxuICAgICAgdGhpcy5zZWxlY3RlZCEsXG4gICAgICB0aGlzLl9nZXRIb3VyQmFzZWRPblBlcmlvZChob3VyKVxuICAgICk7XG4gICAgdGhpcy5fdGltZVNlbGVjdGVkKHNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIG1pbnV0ZSBzZWxlY3Rpb24uICovXG4gIF9vbk1pbnV0ZVNlbGVjdGVkKG1pbnV0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZE1pbnV0ZSA9IG1pbnV0ZTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuX3RpbWVBZGFwdGVyLnVwZGF0ZU1pbnV0ZSh0aGlzLnNlbGVjdGVkISwgbWludXRlKTtcbiAgICB0aGlzLl90aW1lU2VsZWN0ZWQoc2VsZWN0ZWQpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXMgcGVyaW9kIGNoYW5naW5nLiAqL1xuICBfb25QZXJpb2RDaGFuZ2VkKHBlcmlvZDogTWF0VGltZVBlcmlvZFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLnBlcmlvZCA9IHBlcmlvZDtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuX3RpbWVBZGFwdGVyLnVwZGF0ZUhvdXIoXG4gICAgICB0aGlzLnNlbGVjdGVkISxcbiAgICAgIHRoaXMuX2dldEhvdXJCYXNlZE9uUGVyaW9kKHRoaXMuc2VsZWN0ZWRIb3VyKVxuICAgICk7XG4gICAgdGhpcy5fdGltZVNlbGVjdGVkKHNlbGVjdGVkKTtcbiAgfVxuXG4gIF9nZXRBdmFpbGFibGVIb3VycygpOiBudW1iZXJbXSB7XG4gICAgaWYgKHRoaXMuaXNNZXJpZGllbSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlSG91cnNcbiAgICAgICAgLmZpbHRlcigoaCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnBlcmlvZCA9PT0gJ2FtJykge1xuICAgICAgICAgICAgcmV0dXJuIGggPCAxMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5wZXJpb2QgPT09ICdwbScpIHtcbiAgICAgICAgICAgIHJldHVybiBoID49IDEyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBoO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChoKSA9PiB7XG4gICAgICAgICAgaWYgKGggPiAxMikge1xuICAgICAgICAgICAgcmV0dXJuIGggLSAxMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDEyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBoO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVIb3VycztcbiAgfVxuXG4gIF9vbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHZpZXc6ICdob3VyJyB8ICdtaW51dGUnKTogdm9pZCB7XG4gICAgc3dpdGNoICh2aWV3KSB7XG4gICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgdGhpcy5faGFuZGxlSG91cktleWRvd24oZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIHRoaXMuX2hhbmRsZU1pbnV0ZUtleWRvd24oZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVIb3VyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGhvdXJzID0gdGhpcy5fZ2V0QXZhaWxhYmxlSG91cnMoKTtcbiAgICBjb25zdCBzZWxlY3RlZEhvdXJJbmRleCA9IGhvdXJzLmZpbmRJbmRleChcbiAgICAgIChob3VyKSA9PiBob3VyID09PSB0aGlzLnNlbGVjdGVkSG91clxuICAgICk7XG5cbiAgICBpZiAoIWhvdXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgICAgaWYgKHNlbGVjdGVkSG91ckluZGV4ICsgMSA+PSBob3Vycy5sZW5ndGggfHwgc2VsZWN0ZWRIb3VySW5kZXggPCAwKSB7XG4gICAgICAgICAgdGhpcy5fb25Ib3VyU2VsZWN0ZWQoaG91cnNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX29uSG91clNlbGVjdGVkKGhvdXJzW3NlbGVjdGVkSG91ckluZGV4ICsgMV0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBET1dOX0FSUk9XOlxuICAgICAgICBpZiAoc2VsZWN0ZWRIb3VySW5kZXggLSAxIDwgMCB8fCBzZWxlY3RlZEhvdXJJbmRleCA8IDApIHtcbiAgICAgICAgICB0aGlzLl9vbkhvdXJTZWxlY3RlZChob3Vyc1tob3Vycy5sZW5ndGggLSAxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fb25Ib3VyU2VsZWN0ZWQoaG91cnNbc2VsZWN0ZWRIb3VySW5kZXggLSAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVNaW51dGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgbWludXRlcyA9IHRoaXMuYXZhaWxhYmxlTWludXRlcztcbiAgICBjb25zdCBzZWxlY3RlZE1pbnV0ZUluZGV4ID0gbWludXRlcy5maW5kSW5kZXgoXG4gICAgICAobWludXRlKSA9PiBtaW51dGUgPT09IHRoaXMuc2VsZWN0ZWRNaW51dGVcbiAgICApO1xuXG4gICAgaWYgKCFtaW51dGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkTWludXRlSW5kZXggKyB0aGlzLm1pbnV0ZUludGVydmFsID49IG1pbnV0ZXMubGVuZ3RoIHx8XG4gICAgICAgICAgc2VsZWN0ZWRNaW51dGVJbmRleCA8IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9XG4gICAgICAgICAgICA2MCAtIHRoaXMuc2VsZWN0ZWRNaW51dGUgKyBNYXRoLm1pbiguLi50aGlzLmF2YWlsYWJsZU1pbnV0ZXMpO1xuICAgICAgICAgIGNvbnN0IGNvdW50ID0gTWF0aC5jZWlsKGRpZmZlcmVuY2UgLyB0aGlzLm1pbnV0ZUludGVydmFsKTtcbiAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlRm9yVmFsaWQgPSBjb3VudCAqIHRoaXMubWludXRlSW50ZXJ2YWw7XG4gICAgICAgICAgY29uc3QgbmV4dFZhbGlkVmFsdWUgPSB0aGlzLnNlbGVjdGVkTWludXRlICsgZGlmZmVyZW5jZUZvclZhbGlkO1xuICAgICAgICAgIGNvbnN0IGNvcnJlY3RJbmRleCA9IG1pbnV0ZXMuZmluZEluZGV4KFxuICAgICAgICAgICAgKG1pbnV0ZSkgPT4gbWludXRlID09PSBuZXh0VmFsaWRWYWx1ZSAtIDYwIC8vIGFtb3VudCBvZiBtaW5zXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9vbk1pbnV0ZVNlbGVjdGVkKG1pbnV0ZXNbY29ycmVjdEluZGV4XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fb25NaW51dGVTZWxlY3RlZChcbiAgICAgICAgICAgIG1pbnV0ZXNbc2VsZWN0ZWRNaW51dGVJbmRleCArIHRoaXMubWludXRlSW50ZXJ2YWxdXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRE9XTl9BUlJPVzpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkTWludXRlSW5kZXggLSB0aGlzLm1pbnV0ZUludGVydmFsIDwgMCB8fFxuICAgICAgICAgIHNlbGVjdGVkTWludXRlSW5kZXggPCAwXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPVxuICAgICAgICAgICAgNjAgKyB0aGlzLnNlbGVjdGVkTWludXRlIC0gTWF0aC5tYXgoLi4udGhpcy5hdmFpbGFibGVNaW51dGVzKTtcbiAgICAgICAgICBjb25zdCBjb3VudCA9IE1hdGguY2VpbChkaWZmZXJlbmNlIC8gdGhpcy5taW51dGVJbnRlcnZhbCk7XG4gICAgICAgICAgY29uc3QgZGlmZmVyZW5jZUZvclZhbGlkID0gY291bnQgKiB0aGlzLm1pbnV0ZUludGVydmFsO1xuICAgICAgICAgIGNvbnN0IG5leHRWYWxpZFZhbHVlID0gdGhpcy5zZWxlY3RlZE1pbnV0ZSAtIGRpZmZlcmVuY2VGb3JWYWxpZDtcbiAgICAgICAgICBjb25zdCBjb3JyZWN0SW5kZXggPSBtaW51dGVzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChtaW51dGUpID0+IG1pbnV0ZSA9PT0gbmV4dFZhbGlkVmFsdWUgKyA2MCAvLyBhbW91bnQgb2YgbWluc1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fb25NaW51dGVTZWxlY3RlZChtaW51dGVzW2NvcnJlY3RJbmRleF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX29uTWludXRlU2VsZWN0ZWQoXG4gICAgICAgICAgICBtaW51dGVzW3NlbGVjdGVkTWludXRlSW5kZXggLSB0aGlzLm1pbnV0ZUludGVydmFsXVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKiogR2V0cyBhIGNvcnJlY3QgaG91cnMgYmFzZWQgb24gbWVyaWRpZW0gYW5kIHBlcmlvZC4gKi9cbiAgcHJpdmF0ZSBfZ2V0SG91ckJhc2VkT25QZXJpb2QoaG91cjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBhZnRlck5vb24gPSB0aGlzLmlzTWVyaWRpZW0gJiYgdGhpcy5wZXJpb2QgPT09ICdwbSc7XG4gICAgY29uc3QgYmVmb3JlTm9vbiA9IHRoaXMuaXNNZXJpZGllbSAmJiB0aGlzLnBlcmlvZCA9PT0gJ2FtJztcblxuICAgIGlmIChhZnRlck5vb24pIHtcbiAgICAgIHJldHVybiBob3VyID09PSAxMiA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgfVxuXG4gICAgaWYgKGJlZm9yZU5vb24pIHtcbiAgICAgIHJldHVybiBob3VyID09PSAxMiA/IDAgOiBob3VyO1xuICAgIH1cblxuICAgIHJldHVybiBob3VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGltZVNlbGVjdGVkKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICYmICF0aGlzLl90aW1lQWRhcHRlci5zYW1lVGltZSh2YWx1ZSwgdGhpcy5zZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXNlclNlbGVjdGlvbi5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBTZXRzIG1pbiBob3VyLiAqL1xuICBwcml2YXRlIF9zZXRNaW5Ib3VyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5taW5UaW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWluSG91ciA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldEhvdXIodGhpcy5taW5UaW1lKTtcbiAgICB0aGlzLmF2YWlsYWJsZUhvdXJzID0gdGhpcy5hdmFpbGFibGVIb3Vycy5maWx0ZXIoKGgpID0+IGggPj0gbWluSG91cik7XG4gIH1cblxuICAvKiogU2V0cyBtYXggaG91ci4gKi9cbiAgcHJpdmF0ZSBfc2V0TWF4SG91cigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWF4VGltZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heEhvdXIgPSB0aGlzLl90aW1lQWRhcHRlci5nZXRIb3VyKHRoaXMubWF4VGltZSk7XG4gICAgdGhpcy5hdmFpbGFibGVIb3VycyA9IHRoaXMuYXZhaWxhYmxlSG91cnMuZmlsdGVyKChoKSA9PiBoIDw9IG1heEhvdXIpO1xuICB9XG5cbiAgLyoqIFNldHMgbWluIG1pbnV0ZS4gKi9cbiAgcHJpdmF0ZSBfc2V0TWluTWludXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCB8fCAhdGhpcy5taW5UaW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRIb3VyID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0SG91cih0aGlzLnNlbGVjdGVkKTtcbiAgICBjb25zdCBtaW5Ib3VyID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0SG91cih0aGlzLm1pblRpbWUpO1xuXG4gICAgY29uc3QgbWluTWludXRlID1cbiAgICAgIHNlbGVjdGVkSG91ciA+IG1pbkhvdXIgPyAwIDogdGhpcy5fdGltZUFkYXB0ZXIuZ2V0TWludXRlKHRoaXMubWluVGltZSk7XG5cbiAgICB0aGlzLmF2YWlsYWJsZU1pbnV0ZXMgPSB0aGlzLmF2YWlsYWJsZU1pbnV0ZXMuZmlsdGVyKFxuICAgICAgKG1pbnV0ZSkgPT4gbWludXRlID49IG1pbk1pbnV0ZVxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRIb3VyIDwgbWluSG91cikge1xuICAgICAgdGhpcy5hdmFpbGFibGVNaW51dGVzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgbWF4IG1pbnV0ZS4gKi9cbiAgcHJpdmF0ZSBfc2V0TWF4TWludXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCB8fCAhdGhpcy5tYXhUaW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRIb3VyID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0SG91cih0aGlzLnNlbGVjdGVkKTtcbiAgICBjb25zdCBtYXhIb3VyID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0SG91cih0aGlzLm1heFRpbWUpO1xuXG4gICAgY29uc3QgbWF4TWludXRlID1cbiAgICAgIHNlbGVjdGVkSG91ciA8IG1heEhvdXIgPyA1OSA6IHRoaXMuX3RpbWVBZGFwdGVyLmdldE1pbnV0ZSh0aGlzLm1heFRpbWUpO1xuXG4gICAgdGhpcy5hdmFpbGFibGVNaW51dGVzID0gdGhpcy5hdmFpbGFibGVNaW51dGVzLmZpbHRlcihcbiAgICAgIChtaW51dGUpID0+IG1pbnV0ZSA8PSBtYXhNaW51dGVcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkSG91ciA+IG1heEhvdXIpIHtcbiAgICAgIHRoaXMuYXZhaWxhYmxlTWludXRlcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIGRpc2FibGVkIHBlcmlvZC4gKi9cbiAgcHJpdmF0ZSBfc2V0RGlzYWJsZWRQZXJpb2QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWluVGltZSkge1xuICAgICAgY29uc3QgbWluSG91ciA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldEhvdXIodGhpcy5taW5UaW1lKTtcblxuICAgICAgaWYgKG1pbkhvdXIgPj0gMTIpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZFBlcmlvZCA9ICdhbSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWF4VGltZSkge1xuICAgICAgY29uc3QgbWF4SG91ciA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldEhvdXIodGhpcy5tYXhUaW1lKTtcbiAgICAgIGNvbnN0IG1heE1pbnV0ZSA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldEhvdXIodGhpcy5tYXhUaW1lKTtcblxuICAgICAgaWYgKG1heEhvdXIgPCAxMiB8fCAobWF4SG91ciA9PT0gMTIgJiYgbWF4TWludXRlID09PSAwKSkge1xuICAgICAgICB0aGlzLmRpc2FibGVkUGVyaW9kID0gJ3BtJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,85 +0,0 @@
1
- import { DOCUMENT } from '@angular/common';
2
- import { Input, Output, EventEmitter, Directive, Inject, HostListener, } from '@angular/core';
3
- import * as i0 from "@angular/core";
4
- export function withZeroPrefix(value) {
5
- return value < 10 ? `0${value}` : `${value}`;
6
- }
7
- export function withZeroPrefixMeridiem(value, isMeridiem) {
8
- const newValue = isMeridiem && value === 0 ? 12 : value;
9
- return withZeroPrefix(newValue);
10
- }
11
- const DIGIT_KEYS = Array.from({ length: 10 }, (_, i) => `${i}`);
12
- const SPECIAL_KEYS = ['Backspace', 'Delete', 'ArrowLeft', 'ArrowRight', 'Tab'];
13
- export class MatTimeInputBase {
14
- get value() {
15
- return this._value;
16
- }
17
- set value(value) {
18
- this._value = value;
19
- if (!this.hasFocus) {
20
- this.setInputValue(this._value);
21
- }
22
- // we need timeout here to set placeholder first time
23
- setTimeout(() => {
24
- this.setInputPlaceholder(this._value);
25
- }, 0);
26
- }
27
- _keydown(event) {
28
- const isAllow = (DIGIT_KEYS.includes(event.key) && !event.shiftKey) ||
29
- SPECIAL_KEYS.includes(event.code);
30
- if (!isAllow) {
31
- event.preventDefault();
32
- }
33
- }
34
- get inputElement() {
35
- return this.element.nativeElement;
36
- }
37
- get hasFocus() {
38
- return this.element?.nativeElement === this._document.activeElement;
39
- }
40
- constructor(element, _cdr, _document) {
41
- this.element = element;
42
- this._cdr = _cdr;
43
- this._document = _document;
44
- this.timeChanged = new EventEmitter();
45
- }
46
- focus() {
47
- this.setInputValue(null);
48
- }
49
- blur() {
50
- const isNumber = !isNaN(Number(this.inputElement.value));
51
- const value = this._formatValue(isNumber ? Number(this.inputElement.value || this._value) : this.value);
52
- this.setInputValue(value);
53
- this.setInputPlaceholder(value);
54
- this.timeChanged.emit(value);
55
- }
56
- setInputValue(value) {
57
- if (value !== null) {
58
- this.inputElement.value = this._withZeroPrefix(value);
59
- }
60
- else {
61
- this.inputElement.value = '';
62
- }
63
- this._cdr.markForCheck();
64
- }
65
- setInputPlaceholder(value) {
66
- this.inputElement.placeholder = this._withZeroPrefix(value);
67
- this._cdr.markForCheck();
68
- }
69
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimeInputBase, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); }
70
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.4", type: MatTimeInputBase, inputs: { value: "value" }, outputs: { timeChanged: "timeChanged" }, host: { listeners: { "keydown": "_keydown($event)" } }, ngImport: i0 }); }
71
- }
72
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimeInputBase, decorators: [{
73
- type: Directive
74
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
75
- type: Inject,
76
- args: [DOCUMENT]
77
- }] }], propDecorators: { value: [{
78
- type: Input
79
- }], timeChanged: [{
80
- type: Output
81
- }], _keydown: [{
82
- type: HostListener,
83
- args: ['keydown', ['$event']]
84
- }] } });
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1pbnB1dC1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRpbWVwaWNrZXIvc3JjL2xpYi90aW1lLWlucHV0LWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBR1QsTUFBTSxFQUVOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQzs7QUFFdkIsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFhO0lBQzFDLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztBQUMvQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxLQUFhLEVBQ2IsVUFBbUI7SUFFbkIsTUFBTSxRQUFRLEdBQUcsVUFBVSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBRXhELE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sWUFBWSxHQUFHLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRy9FLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBQ3BDLElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lB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RHJDLFNBQVM7OzBCQXlDTCxNQUFNOzJCQUFDLFFBQVE7eUNBdENkLEtBQUs7c0JBRFIsS0FBSztnQkFnQkksV0FBVztzQkFBcEIsTUFBTTtnQkFFOEIsUUFBUTtzQkFBNUMsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEluamVjdCxcbiAgU2VsZixcbiAgSG9zdExpc3RlbmVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhaZXJvUHJlZml4KHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUgPCAxMCA/IGAwJHt2YWx1ZX1gIDogYCR7dmFsdWV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhaZXJvUHJlZml4TWVyaWRpZW0oXG4gIHZhbHVlOiBudW1iZXIsXG4gIGlzTWVyaWRpZW06IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBuZXdWYWx1ZSA9IGlzTWVyaWRpZW0gJiYgdmFsdWUgPT09IDAgPyAxMiA6IHZhbHVlO1xuXG4gIHJldHVybiB3aXRoWmVyb1ByZWZpeChuZXdWYWx1ZSk7XG59XG5cbmNvbnN0IERJR0lUX0tFWVMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMCB9LCAgKF8sIGkpID0+IGAke2l9YCk7XG5jb25zdCBTUEVDSUFMX0tFWVMgPSBbJ0JhY2tzcGFjZScsICdEZWxldGUnLCAnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLCAnVGFiJ107XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1hdFRpbWVJbnB1dEJhc2Uge1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGlmICghdGhpcy5oYXNGb2N1cykge1xuICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgLy8gd2UgbmVlZCB0aW1lb3V0IGhlcmUgdG8gc2V0IHBsYWNlaG9sZGVyIGZpcnN0IHRpbWVcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0SW5wdXRQbGFjZWhvbGRlcih0aGlzLl92YWx1ZSk7XG4gICAgfSwgMCk7XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWU6IG51bWJlcjtcblxuICBAT3V0cHV0KCkgdGltZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSkgX2tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBpc0FsbG93ID1cbiAgICAgIChESUdJVF9LRVlTLmluY2x1ZGVzKGV2ZW50LmtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5KSB8fFxuICAgICAgU1BFQ0lBTF9LRVlTLmluY2x1ZGVzKGV2ZW50LmNvZGUpO1xuXG4gICAgaWYgKCFpc0FsbG93KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpbnB1dEVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIH1cblxuICBnZXQgaGFzRm9jdXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudD8ubmF0aXZlRWxlbWVudCA9PT0gdGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PixcbiAgICBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgKSB7fVxuXG4gIGZvY3VzKCkge1xuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZShudWxsKTtcbiAgfVxuXG4gIGJsdXIoKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4oTnVtYmVyKHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9mb3JtYXRWYWx1ZShcbiAgICAgIGlzTnVtYmVyID8gTnVtYmVyKHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlIHx8IHRoaXMuX3ZhbHVlKSA6IHRoaXMudmFsdWUsXG4gICAgKTtcbiAgICB0aGlzLnNldElucHV0VmFsdWUodmFsdWUpO1xuICAgIHRoaXMuc2V0SW5wdXRQbGFjZWhvbGRlcih2YWx1ZSk7XG4gICAgdGhpcy50aW1lQ2hhbmdlZC5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHNldElucHV0VmFsdWUodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlID0gdGhpcy5fd2l0aFplcm9QcmVmaXgodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlucHV0RWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNldElucHV0UGxhY2Vob2xkZXIodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuaW5wdXRFbGVtZW50LnBsYWNlaG9sZGVyID0gdGhpcy5fd2l0aFplcm9QcmVmaXgodmFsdWUpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFic3RyYWN0IF93aXRoWmVyb1ByZWZpeCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IF9mb3JtYXRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogbnVtYmVyO1xufVxuIl19