@agorapulse/ui-components 13.0.2 → 13.1.1

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.
@@ -1,388 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild, } from "@angular/core";
2
- import format from "date-fns/format";
3
- import parse from "date-fns/parse";
4
- import IMask from "imask";
5
- import { fromEvent, Subject } from "rxjs";
6
- import { debounceTime, distinctUntilChanged, map, takeUntil, } from "rxjs/operators";
7
- // FIXME Move these models when we remove the old timepicker
8
- import { TimeFormat } from "../timepicker/timepicker.component";
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/material/button";
11
- import * as i2 from "@angular/common";
12
- import * as i3 from "@angular/forms";
13
- import * as i4 from "../popmenu/popmenu.directive";
14
- import * as i5 from "../tooltip-neo/tooltip-neo.directive";
15
- import * as i6 from "angular-imask";
16
- export class NeoTimepickerComponent {
17
- constructor(changeDetectorRef) {
18
- this.changeDetectorRef = changeDetectorRef;
19
- this.i18n = {
20
- hourLabel: 'Hour',
21
- minuteLabel: 'Minute',
22
- meridianLabel: 'AM/PM',
23
- doneLabel: 'Done',
24
- cancelLabel: 'Cancel',
25
- };
26
- this.disabled = false;
27
- this.format = TimeFormat.Default;
28
- this.invalid = false;
29
- this.placement = 'bottom';
30
- this.timeModelChange = new EventEmitter();
31
- this.meridians = ['AM', 'PM'];
32
- this.imaskDefault = {
33
- mask: 'HH:MM',
34
- blocks: {
35
- HH: {
36
- mask: IMask.MaskedRange,
37
- from: 0,
38
- to: 23,
39
- autofix: 'pad',
40
- },
41
- MM: {
42
- mask: IMask.MaskedRange,
43
- from: 0,
44
- to: 59,
45
- autofix: 'pad',
46
- },
47
- },
48
- };
49
- this.imaskMeridian = {
50
- mask: 'HH:MM AMPM',
51
- blocks: {
52
- HH: {
53
- mask: IMask.MaskedRange,
54
- from: 1,
55
- to: 12,
56
- autofix: 'pad',
57
- },
58
- MM: {
59
- mask: IMask.MaskedRange,
60
- from: 0,
61
- to: 59,
62
- autofix: 'pad',
63
- },
64
- AMPM: {
65
- mask: IMask.MaskedEnum,
66
- enum: ['AM', 'PM']
67
- }
68
- },
69
- lazy: false,
70
- prepare: function (str) {
71
- return str.toUpperCase();
72
- },
73
- };
74
- this.ENTER_KEY = 'Enter';
75
- this.ESCAPE_KEY = 'Escape';
76
- this.FIX_NUMBER = 10;
77
- this.HOURS_MAX = 24;
78
- this.HOURS_MERIDIAN_MAX = 12;
79
- this.MARGIN = 8;
80
- this.MINUTES_MAX = 60;
81
- this.TIME_OPTION_HEIGHT = 387;
82
- this.TIME_PICKER_DEFAULT_WIDTH = 96;
83
- this.TIME_PICKER_MERIDIAN_WIDTH = 152;
84
- this.ROW_HEIGHT = 34;
85
- this.hours = [];
86
- this.minutes = [];
87
- this.position = null;
88
- this.TimeFormat = TimeFormat;
89
- }
90
- onKeypress(event) {
91
- if (this.timepickerOpened) {
92
- if (event.code === this.ENTER_KEY) {
93
- this.onSaveSelection();
94
- }
95
- if (event.code === this.ESCAPE_KEY) {
96
- this.onCancelSelection();
97
- }
98
- }
99
- }
100
- ngOnInit() {
101
- this.generateTimeSlots();
102
- this.onTimeModelChange();
103
- }
104
- ngOnChanges(changes) {
105
- this.generateTimeSlots();
106
- if (changes.format?.currentValue) {
107
- this.timeFormat = this.format === TimeFormat.Default ? 'HH:mm' : 'hh:mm a';
108
- if (this.format === TimeFormat.Default && this.meridians.some(meridian => this.timeModel?.endsWith(meridian))) {
109
- this.timeModel = NeoTimepickerComponent.convert12To24(this.timeModel);
110
- }
111
- else if (this.format === TimeFormat.Meridian && this.meridians.every(meridian => !this.timeModel?.endsWith(meridian))) {
112
- this.timeModel = NeoTimepickerComponent.convert24To12(this.timeModel);
113
- }
114
- setTimeout(() => this.changeDetectorRef.markForCheck());
115
- }
116
- if (changes.placement?.currentValue) {
117
- this.updateTimePickerPosition();
118
- }
119
- if (changes.format?.currentValue) {
120
- this.updateTimePickerPosition();
121
- }
122
- }
123
- onOpenTimepicker() {
124
- this.destroy$ = new Subject();
125
- this.previousValue = this.timeModel;
126
- this.timepickerOpened = true;
127
- this.timepickerClosed = false;
128
- this.updateTimePickerPosition();
129
- setTimeout(() => {
130
- this.updateElementPosition('minute', this.selectedMinute, 'auto');
131
- this.updateElementPosition('hour', this.selectedHour, 'auto');
132
- this.updateElementPosition('meridian', this.selectedMeridian, 'auto');
133
- this.inputBox.nativeElement.focus();
134
- this.inputBox.nativeElement.select();
135
- }, 1);
136
- this.changeDetectorRef.markForCheck();
137
- }
138
- onTimepickerOpened() {
139
- this.hoursScrollObserver$ = this.onObserveElementScroll(this.hourOptions.nativeElement);
140
- this.minutesScrollObserver$ = this.onObserveElementScroll(this.minutesOptions.nativeElement);
141
- this.hoursScrollObserver$.subscribe((indexToScroll) => {
142
- this.updateTimeModel(this.hours[indexToScroll], this.selectedMinute, this.selectedMeridian);
143
- });
144
- this.minutesScrollObserver$.subscribe((indexToScroll) => {
145
- this.updateTimeModel(this.selectedHour, this.minutes[indexToScroll], this.selectedMeridian);
146
- });
147
- if (this.format === TimeFormat.Meridian) {
148
- this.meridiansScrollObserver$ = this.onObserveElementScroll(this.meridiansOptions.nativeElement);
149
- this.meridiansScrollObserver$.subscribe((indexToScroll) => {
150
- this.updateTimeModel(this.selectedHour, this.selectedMinute, this.meridians[indexToScroll]);
151
- });
152
- }
153
- }
154
- onObserveElementScroll(element) {
155
- return fromEvent(element, 'scroll').pipe(debounceTime(150), distinctUntilChanged(), takeUntil(this.destroy$), map(() => {
156
- return Math.round(element.scrollTop / this.ROW_HEIGHT);
157
- }));
158
- }
159
- onTimePickerClosed() {
160
- this.onCancelSelection();
161
- this.destroy$.next();
162
- this.destroy$.complete();
163
- }
164
- onTimeModelChange() {
165
- let date = new Date();
166
- if (this.timeModel) {
167
- date = parse(this.timeModel, this.timeFormat, new Date());
168
- }
169
- this.timeModel = format(date, this.timeFormat);
170
- if (!this.previousValue) {
171
- this.previousValue = this.timeModel;
172
- }
173
- let jsHour = date.getHours();
174
- if (this.format === TimeFormat.Meridian) {
175
- if (jsHour > 12) {
176
- jsHour = jsHour - 12;
177
- }
178
- // JS doesn't handle well AM/PM hour so 12:53 PM will be 00:53 ...
179
- if (jsHour == 0) {
180
- jsHour = 12;
181
- }
182
- }
183
- const hour = NeoTimepickerComponent.toFixed(jsHour.toString(), 10);
184
- if (hour != this.selectedHour) {
185
- this.selectedHour = hour;
186
- this.updateElementPosition('hour', this.selectedHour, 'auto');
187
- }
188
- const minute = NeoTimepickerComponent.toFixed(date.getMinutes().toString(), 10);
189
- if (minute != this.selectedMinute) {
190
- this.selectedMinute = minute;
191
- this.updateElementPosition('minute', this.selectedMinute, 'auto');
192
- }
193
- if (this.format === TimeFormat.Meridian && this.selectedMeridian !== this.timeModel.split(' ')[1]) {
194
- this.selectedMeridian = this.timeModel.split(' ')[1];
195
- this.updateElementPosition('meridian', this.selectedMeridian, 'auto');
196
- }
197
- this.changeDetectorRef.markForCheck();
198
- }
199
- onSelectHour(hour) {
200
- this.updateTimeModel(hour, this.selectedMinute, this.selectedMeridian);
201
- }
202
- onSelectMinute(minute) {
203
- this.updateTimeModel(this.selectedHour, minute, this.selectedMeridian);
204
- }
205
- onSelectMeridian(meridian) {
206
- this.updateTimeModel(this.selectedHour, this.selectedMinute, meridian);
207
- }
208
- onSaveSelection() {
209
- this.previousValue = this.timeModel;
210
- this.timepickerClosed = true;
211
- this.timepickerOpened = false;
212
- const timeModelValue = parse(this.timeModel, this.timeFormat, new Date());
213
- this.timeModelChange.emit({
214
- hours: timeModelValue.getHours(),
215
- minutes: timeModelValue.getMinutes(),
216
- });
217
- this.changeDetectorRef.markForCheck();
218
- }
219
- onCancelSelection() {
220
- this.timepickerClosed = true;
221
- this.timepickerOpened = false;
222
- this.timeModel = this.previousValue;
223
- this.changeDetectorRef.markForCheck();
224
- }
225
- onMaskValidateComplete(value) {
226
- if (this.timeModel !== value) {
227
- this.timeModel = value;
228
- }
229
- this.onTimeModelChange();
230
- }
231
- updateTimeModel(hour, minute, meridian) {
232
- if (this.format === TimeFormat.Meridian) {
233
- this.timeModel = `${hour}:${minute} ${meridian}`;
234
- }
235
- else {
236
- this.timeModel = `${hour}:${minute}`;
237
- }
238
- this.changeDetectorRef.markForCheck();
239
- }
240
- updateElementPosition(elementType, id, scrollBehavior) {
241
- const element = document.getElementById(`${elementType}-${id}`);
242
- this.scrollToElement(element, scrollBehavior);
243
- }
244
- scrollToElement(element, behavior = 'auto') {
245
- if (element) {
246
- setTimeout(() => {
247
- element.scrollIntoView({
248
- behavior,
249
- block: 'center',
250
- inline: 'center'
251
- });
252
- }, 1);
253
- }
254
- }
255
- /**
256
- * Fullfill minutes and hours arrays like [0, 1, 2 ... 12] and [0, 1, 2, ... 59]
257
- */
258
- generateTimeSlots() {
259
- this.hours = [];
260
- this.minutes = [NeoTimepickerComponent.toFixed(0, this.FIX_NUMBER)];
261
- for (let i = 1; i <= this.HOURS_MERIDIAN_MAX; i++) {
262
- const indexToAdd = NeoTimepickerComponent.toFixed(i, this.FIX_NUMBER);
263
- this.hours.push(indexToAdd);
264
- this.minutes.push(indexToAdd);
265
- }
266
- if (this.format === TimeFormat.Default) {
267
- this.hours = [NeoTimepickerComponent.toFixed(0, this.FIX_NUMBER), ...this.hours];
268
- for (let i = 13; i < this.HOURS_MAX; i++) {
269
- this.hours.push(NeoTimepickerComponent.toFixed(i, this.FIX_NUMBER));
270
- }
271
- }
272
- for (let i = 13; i < this.MINUTES_MAX; i++) {
273
- this.minutes.push(NeoTimepickerComponent.toFixed(i, this.FIX_NUMBER));
274
- }
275
- this.changeDetectorRef.markForCheck();
276
- }
277
- updateTimePickerPosition() {
278
- if (this.inputBox?.nativeElement) {
279
- const inputBoxBounds = this.inputBox.nativeElement.getBoundingClientRect();
280
- const topPosition = inputBoxBounds.top - this.TIME_OPTION_HEIGHT - this.MARGIN;
281
- const bottomPosition = inputBoxBounds.top + inputBoxBounds.height;
282
- const timePickerWidth = this.format === TimeFormat.Meridian ? this.TIME_PICKER_MERIDIAN_WIDTH : this.TIME_PICKER_DEFAULT_WIDTH;
283
- const shift = (timePickerWidth - inputBoxBounds.width) / 2;
284
- if (this.placement === 'top') {
285
- this.position = {
286
- top: topPosition < 0 ? bottomPosition : topPosition,
287
- left: inputBoxBounds.left - shift,
288
- };
289
- }
290
- else {
291
- this.position = {
292
- top: bottomPosition + this.TIME_OPTION_HEIGHT + this.MARGIN > window.innerHeight ? topPosition : bottomPosition,
293
- left: inputBoxBounds.left - shift,
294
- };
295
- }
296
- this.changeDetectorRef.markForCheck();
297
- }
298
- }
299
- static convert12To24(time) {
300
- const terms = time.split(':');
301
- const minutes = terms[1].substring(0, 2);
302
- const meridian = terms[1].trim().slice(-2).toUpperCase();
303
- let hour = parseInt(terms[0]);
304
- if (!isNaN(parseInt(terms[0]))) {
305
- if (meridian === 'PM' && hour < 12) {
306
- hour = hour + 12;
307
- }
308
- if (meridian === 'AM' && hour === 12) {
309
- hour = 0;
310
- }
311
- }
312
- return `${hour}:${minutes}`;
313
- }
314
- static convert24To12(time) {
315
- const terms = time.split(':');
316
- let meridian = 'AM';
317
- let hour = parseInt(terms[0]);
318
- let minute = parseInt(terms[1]);
319
- if (!isNaN(parseInt(terms[0]))) {
320
- if (hour >= 12) {
321
- meridian = 'PM';
322
- if (hour > 12) {
323
- hour = hour - 12;
324
- }
325
- }
326
- if (hour === 0) {
327
- hour = 12;
328
- }
329
- }
330
- const hourStr = NeoTimepickerComponent.toFixed(hour, 10);
331
- const minuteStr = NeoTimepickerComponent.toFixed(minute, 10);
332
- return `${hourStr}:${minuteStr} ${meridian}`;
333
- }
334
- /**
335
- * Return 08 for 8, 06 for 6
336
- * @param num
337
- * @param fix
338
- * @private
339
- */
340
- static toFixed(num, fix) {
341
- let fixedNum = num.toString();
342
- if (num < fix) {
343
- fixedNum = `0${fixedNum}`;
344
- }
345
- return fixedNum;
346
- }
347
- }
348
- /** @nocollapse */ /** @nocollapse */ NeoTimepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: NeoTimepickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
349
- /** @nocollapse */ /** @nocollapse */ NeoTimepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: NeoTimepickerComponent, selector: "ap-neo-timepicker", inputs: { i18n: "i18n", disabled: "disabled", format: "format", invalid: "invalid", invalidationMessage: "invalidationMessage", placement: "placement", timeModel: "timeModel" }, outputs: { timeModelChange: "timeModelChange" }, host: { listeners: { "window:keydown": "onKeypress($event)" } }, viewQueries: [{ propertyName: "inputBox", first: true, predicate: ["inputBox"], descendants: true }, { propertyName: "hourOptions", first: true, predicate: ["hourOptions"], descendants: true }, { propertyName: "minutesOptions", first: true, predicate: ["minutesOptions"], descendants: true }, { propertyName: "meridiansOptions", first: true, predicate: ["meridiansOptions"], descendants: true }, { propertyName: "timepicker", first: true, predicate: ["timepicker"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"time-picker-container\">\n <ng-template #timeOptionsTemplate>\n <div class=\"time-picker-options\"\n [class.meridian]=\"format === TimeFormat.Meridian\"\n *ngIf=\"timepickerOpened\"\n #timepicker\n >\n <div class=\"header\">\n <span> {{ i18n.hourLabel }} </span>\n <span> {{ i18n.minuteLabel }} </span>\n <span *ngIf=\"format === TimeFormat.Meridian\"> {{ i18n.meridianLabel }} </span>\n </div>\n <div class=\"content\">\n <div class=\"selector\">\n <span>:</span>\n <span *ngIf=\"format === TimeFormat.Meridian\"></span>\n </div>\n <div class=\"options\"\n #hourOptions>\n <div class=\"invisible-block\"></div>\n <div *ngFor=\"let hour of hours;\"\n class=\"option\"\n [id]=\"'hour-' + hour\"\n [class.selected]=\"hour === selectedHour\"\n (click)=\"onSelectHour(hour)\">\n {{ hour }}\n </div>\n <div class=\"invisible-block\"></div>\n </div>\n <div class=\"divider\"></div>\n <div class=\"options\"\n #minutesOptions>\n <div class=\"invisible-block\"></div>\n <div *ngFor=\"let minute of minutes;\"\n class=\"option\"\n [id]=\"'minute-' + minute\"\n [class.selected]=\"minute === selectedMinute\"\n (click)=\"onSelectMinute(minute)\">\n {{ minute }}\n </div>\n <div class=\"invisible-block\"></div>\n </div>\n <div *ngIf=\"format === TimeFormat.Meridian\"\n class=\"divider\"></div>\n <div *ngIf=\"format === TimeFormat.Meridian\"\n class=\"options\"\n #meridiansOptions>\n <div class=\"invisible-block\"></div>\n <div *ngFor=\"let meridian of meridians;\"\n class=\"option\"\n [id]=\"'meridian-' + meridian\"\n [class.selected]=\"selectedMeridian === meridian\"\n (click)=\"onSelectMeridian(meridian)\">\n {{ meridian }}\n </div>\n <div class=\"invisible-block\"></div>\n </div>\n </div>\n <div class=\"buttons\">\n <button mat-flat-button\n class=\"full-width\"\n color=\"primary\"\n (click)=\"onSaveSelection()\">\n {{ i18n.doneLabel }}\n </button>\n <button mat-flat-button\n class=\"full-width\"\n (click)=\"onCancelSelection()\">\n {{ i18n.cancelLabel }}\n </button>\n </div>\n </div>\n </ng-template>\n <input #inputBox\n class=\"time-input\"\n placement=\"bottom right\"\n color=\"secondary\"\n [class.active]=\"timepickerOpened\"\n [class.invalid]=\"invalid\"\n [apPopmenu]=\"timeOptionsTemplate\"\n [apPopmenuBackground]=\"false\"\n [apPopmenuBorder]=\"false\"\n [apPopmenuDisabled]=\"timepickerOpened\"\n [apTooltipNeo]=\"{content: invalidationMessage, display: invalidationMessage && invalid}\"\n [close]=\"timepickerClosed\"\n [disabled]=\"disabled\"\n [imask]=\"format === TimeFormat.Meridian ? imaskMeridian : imaskDefault\"\n [(ngModel)]=\"timeModel\"\n [pointer]=\"true\"\n [position]=\"position\"\n [rounded]=\"true\"\n [shadow]=\"false\"\n (click)=\"onOpenTimepicker()\"\n (complete)=\"onMaskValidateComplete($event)\"\n (menuClosed)=\"onTimePickerClosed()\"\n (menuOpened)=\"onTimepickerOpened()\">\n</div>\n", styles: ["[color=facebook]{color:#1877f2}[bgcolor=facebook],[hcolor=facebook]:hover{background-color:#1877f2}[border=facebook]{border:1px solid #1877f2}[color=google]{color:#4e85e8}[bgcolor=google],[hcolor=google]:hover{background-color:#4e85e8}[border=google]{border:1px solid #4e85e8}[color=instagram]{color:#e1306c}[bgcolor=instagram],[hcolor=instagram]:hover{background-color:#e1306c}[border=instagram]{border:1px solid #e1306c}[color=instagrammagenta]{color:#c13584}[bgcolor=instagrammagenta],[hcolor=instagrammagenta]:hover{background-color:#c13584}[border=instagrammagenta]{border:1px solid #c13584}[color=instagramblue]{color:#5851db}[bgcolor=instagramblue],[hcolor=instagramblue]:hover{background-color:#5851db}[border=instagramblue]{border:1px solid #5851db}[color=instagrampurple]{color:#833ab4}[bgcolor=instagrampurple],[hcolor=instagrampurple]:hover{background-color:#833ab4}[border=instagrampurple]{border:1px solid #833ab4}[color=instagramorange]{color:#f56040}[bgcolor=instagramorange],[hcolor=instagramorange]:hover{background-color:#f56040}[border=instagramorange]{border:1px solid #f56040}[color=instagramyellow]{color:#ffdc80}[bgcolor=instagramyellow],[hcolor=instagramyellow]:hover{background-color:#ffdc80}[border=instagramyellow]{border:1px solid #ffdc80}[color=linkedin]{color:#2c67bc}[bgcolor=linkedin],[hcolor=linkedin]:hover{background-color:#2c67bc}[border=linkedin]{border:1px solid #2c67bc}[color=twitter]{color:#55acee}[bgcolor=twitter],[hcolor=twitter]:hover{background-color:#55acee}[border=twitter]{border:1px solid #55acee}[color=youtube]{color:red}[bgcolor=youtube],[hcolor=youtube]:hover{background-color:red}[border=youtube]{border:1px solid #ff0000}[color=blood-orange]{color:#ff4d00}[bgcolor=blood-orange],[hcolor=blood-orange]:hover{background-color:#ff4d00}[border=blood-orange]{border:1px solid #ff4d00}[color=pinkish-orange]{color:#ff7b49}[bgcolor=pinkish-orange],[hcolor=pinkish-orange]:hover{background-color:#ff7b49}[border=pinkish-orange]{border:1px solid #ff7b49}[color=charcoal-grey]{color:#2a2f34}[bgcolor=charcoal-grey],[hcolor=charcoal-grey]:hover{background-color:#2a2f34}[border=charcoal-grey]{border:1px solid #2a2f34}[color=azure]{color:#00aeef}[bgcolor=azure],[hcolor=azure]:hover{background-color:#00aeef}[border=azure]{border:1px solid #00aeef}[color=light-azure]{color:#eaf5fd}[bgcolor=light-azure],[hcolor=light-azure]:hover{background-color:#eaf5fd}[border=light-azure]{border:1px solid #eaf5fd}[color=blue-grey]{color:#8d98a9}[bgcolor=blue-grey],[hcolor=blue-grey]:hover{background-color:#8d98a9}[border=blue-grey]{border:1px solid #8d98a9}[color=silver]{color:#ced0da}[bgcolor=silver],[hcolor=silver]:hover{background-color:#ced0da}[border=silver]{border:1px solid #ced0da}[color=pale-grey]{color:#dfe3e9}[bgcolor=pale-grey],[hcolor=pale-grey]:hover{background-color:#dfe3e9}[border=pale-grey]{border:1px solid #dfe3e9}[color=grey-white]{color:#f5f7f8}[bgcolor=grey-white],[hcolor=grey-white]:hover{background-color:#f5f7f8}[border=grey-white]{border:1px solid #f5f7f8}[color=cool-grey]{color:#b4bbc6}[bgcolor=cool-grey],[hcolor=cool-grey]:hover{background-color:#b4bbc6}[border=cool-grey]{border:1px solid #b4bbc6}[color=black]{color:#344563}[bgcolor=black],[hcolor=black]:hover{background-color:#344563}[border=black]{border:1px solid #344563}[color=grey-blue]{color:#68768c}[bgcolor=grey-blue],[hcolor=grey-blue]:hover{background-color:#68768c}[border=grey-blue]{border:1px solid #68768c}[color=strawberry]{color:#f4282d}[bgcolor=strawberry],[hcolor=strawberry]:hover{background-color:#f4282d}[border=strawberry]{border:1px solid #f4282d}[color=light-strawberry]{color:#f8eded}[bgcolor=light-strawberry],[hcolor=light-strawberry]:hover{background-color:#f8eded}[border=light-strawberry]{border:1px solid #f8eded}[color=white]{color:#fff}[bgcolor=white],[hcolor=white]:hover{background-color:#fff}[border=white]{border:1px solid #ffffff}[color=cool-green]{color:#33c15d}[bgcolor=cool-green],[hcolor=cool-green]:hover{background-color:#33c15d}[border=cool-green]{border:1px solid #33c15d}[color=light-green]{color:#ebfaef}[bgcolor=light-green],[hcolor=light-green]:hover{background-color:#ebfaef}[border=light-green]{border:1px solid #ebfaef}[color=transparent]{color:transparent}[bgcolor=transparent],[hcolor=transparent]:hover{background-color:transparent}[border=transparent]{border:1px solid transparent}[color=c0]{color:#a566a5}[bgcolor=c0],[hcolor=c0]:hover{background-color:#a566a5}[border=c0]{border:1px solid #A566A5}[color=c1]{color:#c7ab82}[bgcolor=c1],[hcolor=c1]:hover{background-color:#c7ab82}[border=c1]{border:1px solid #C7AB82}[color=c2]{color:#f2713c}[bgcolor=c2],[hcolor=c2]:hover{background-color:#f2713c}[border=c2]{border:1px solid #F2713C}[color=c3]{color:#ffd006}[bgcolor=c3],[hcolor=c3]:hover{background-color:#ffd006}[border=c3]{border:1px solid #FFD006}[color=c4]{color:#94c5aa}[bgcolor=c4],[hcolor=c4]:hover{background-color:#94c5aa}[border=c4]{border:1px solid #94C5AA}[color=c5]{color:#2a9d8f}[bgcolor=c5],[hcolor=c5]:hover{background-color:#2a9d8f}[border=c5]{border:1px solid #2A9D8F}[color=c6]{color:#78acd8}[bgcolor=c6],[hcolor=c6]:hover{background-color:#78acd8}[border=c6]{border:1px solid #78ACD8}[color=c7]{color:#525a9e}[bgcolor=c7],[hcolor=c7]:hover{background-color:#525a9e}[border=c7]{border:1px solid #525A9E}[color=c8]{color:#6a2459}[bgcolor=c8],[hcolor=c8]:hover{background-color:#6a2459}[border=c8]{border:1px solid #6A2459}[color=c9]{color:#74729e}[bgcolor=c9],[hcolor=c9]:hover{background-color:#74729e}[border=c9]{border:1px solid #74729E}.time-picker-container{display:flex}.time-input{width:80px;max-width:80px;text-align:center;padding:0;margin:0;height:36px;line-height:24px}.time-input.active{border-color:#178dfe}.time-picker-options{display:flex;flex-direction:column;width:96px;margin-top:8px;max-width:96px;height:379px;background:white;border-radius:4px;overflow:hidden;box-shadow:0 3px 10px #00000014}.time-picker-options.meridian{width:152px;max-width:152px}.time-picker-options .header{display:flex;align-items:center;min-height:29px;border-bottom:1px solid #eaecef;color:#344563;font-size:12px;line-height:18px}.time-picker-options .header>span{flex:1;text-align:center}.time-picker-options .content{display:flex;position:relative;min-height:252px;overflow:hidden}.time-picker-options .content .selector{display:flex;justify-content:space-evenly;align-items:center;background-color:#f9f9fa;border-top:1px solid #eaecef;border-bottom:1px solid #eaecef;width:100%;height:34px;position:absolute;top:50%;transform:translateY(-50%);z-index:4;box-sizing:border-box}.time-picker-options .content .divider{height:100%;width:1px;background:#eaecef}.time-picker-options .content .options{flex:1;height:100%;overflow-y:scroll;z-index:5;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none}.time-picker-options .content .options::-webkit-scrollbar{display:none}.time-picker-options .content .options .invisible-block{min-height:109px;max-height:109px;width:100%}.time-picker-options .content .options .option{min-height:34px;display:flex;z-index:5;justify-content:center;align-items:center;font-size:14px;line-height:17px;color:#aeb5c1;scroll-snap-align:center;padding-block:1px;box-sizing:border-box}.time-picker-options .content .options .option:hover{color:#178dfe;cursor:pointer}.time-picker-options .content .options .option.selected{color:#344563!important}.time-picker-options .content .meridian{flex:1;display:flex;flex-direction:column;justify-content:center}.time-picker-options .content .meridian>div{min-height:34px;display:flex;justify-content:center;align-items:center;font-size:14px;line-height:17px;color:#aeb5c1;scroll-snap-align:center}.time-picker-options .buttons{display:flex;flex-direction:column;padding:8px;min-height:96px;border-top:1px solid #eaecef;gap:8px}.time-picker-options .buttons button{font-weight:700;min-width:80px}\n"], components: [{ type: i1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.PopmenuDirective, selector: "[apPopmenu]", inputs: ["apPopmenuBorder", "apPopmenuDisabled", "apPopmenuBackground", "arrow", "arrowOffset", "arrowPosition", "close", "hasBackdrop", "offset", "placement", "pointer", "apPopmenu", "position", "rounded", "shadow", "options"], outputs: ["menuClosed", "menuOpened"] }, { type: i5.TooltipNeoDirective, selector: "[apTooltipNeo]", inputs: ["apTooltipNeo"] }, { type: i6.IMaskDirective, selector: "[imask]", inputs: ["imaskElement", "imask", "unmask"], outputs: ["accept", "complete"], exportAs: ["imask"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
350
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: NeoTimepickerComponent, decorators: [{
351
- type: Component,
352
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ap-neo-timepicker', template: "<div class=\"time-picker-container\">\n <ng-template #timeOptionsTemplate>\n <div class=\"time-picker-options\"\n [class.meridian]=\"format === TimeFormat.Meridian\"\n *ngIf=\"timepickerOpened\"\n #timepicker\n >\n <div class=\"header\">\n <span> {{ i18n.hourLabel }} </span>\n <span> {{ i18n.minuteLabel }} </span>\n <span *ngIf=\"format === TimeFormat.Meridian\"> {{ i18n.meridianLabel }} </span>\n </div>\n <div class=\"content\">\n <div class=\"selector\">\n <span>:</span>\n <span *ngIf=\"format === TimeFormat.Meridian\"></span>\n </div>\n <div class=\"options\"\n #hourOptions>\n <div class=\"invisible-block\"></div>\n <div *ngFor=\"let hour of hours;\"\n class=\"option\"\n [id]=\"'hour-' + hour\"\n [class.selected]=\"hour === selectedHour\"\n (click)=\"onSelectHour(hour)\">\n {{ hour }}\n </div>\n <div class=\"invisible-block\"></div>\n </div>\n <div class=\"divider\"></div>\n <div class=\"options\"\n #minutesOptions>\n <div class=\"invisible-block\"></div>\n <div *ngFor=\"let minute of minutes;\"\n class=\"option\"\n [id]=\"'minute-' + minute\"\n [class.selected]=\"minute === selectedMinute\"\n (click)=\"onSelectMinute(minute)\">\n {{ minute }}\n </div>\n <div class=\"invisible-block\"></div>\n </div>\n <div *ngIf=\"format === TimeFormat.Meridian\"\n class=\"divider\"></div>\n <div *ngIf=\"format === TimeFormat.Meridian\"\n class=\"options\"\n #meridiansOptions>\n <div class=\"invisible-block\"></div>\n <div *ngFor=\"let meridian of meridians;\"\n class=\"option\"\n [id]=\"'meridian-' + meridian\"\n [class.selected]=\"selectedMeridian === meridian\"\n (click)=\"onSelectMeridian(meridian)\">\n {{ meridian }}\n </div>\n <div class=\"invisible-block\"></div>\n </div>\n </div>\n <div class=\"buttons\">\n <button mat-flat-button\n class=\"full-width\"\n color=\"primary\"\n (click)=\"onSaveSelection()\">\n {{ i18n.doneLabel }}\n </button>\n <button mat-flat-button\n class=\"full-width\"\n (click)=\"onCancelSelection()\">\n {{ i18n.cancelLabel }}\n </button>\n </div>\n </div>\n </ng-template>\n <input #inputBox\n class=\"time-input\"\n placement=\"bottom right\"\n color=\"secondary\"\n [class.active]=\"timepickerOpened\"\n [class.invalid]=\"invalid\"\n [apPopmenu]=\"timeOptionsTemplate\"\n [apPopmenuBackground]=\"false\"\n [apPopmenuBorder]=\"false\"\n [apPopmenuDisabled]=\"timepickerOpened\"\n [apTooltipNeo]=\"{content: invalidationMessage, display: invalidationMessage && invalid}\"\n [close]=\"timepickerClosed\"\n [disabled]=\"disabled\"\n [imask]=\"format === TimeFormat.Meridian ? imaskMeridian : imaskDefault\"\n [(ngModel)]=\"timeModel\"\n [pointer]=\"true\"\n [position]=\"position\"\n [rounded]=\"true\"\n [shadow]=\"false\"\n (click)=\"onOpenTimepicker()\"\n (complete)=\"onMaskValidateComplete($event)\"\n (menuClosed)=\"onTimePickerClosed()\"\n (menuOpened)=\"onTimepickerOpened()\">\n</div>\n", styles: ["[color=facebook]{color:#1877f2}[bgcolor=facebook],[hcolor=facebook]:hover{background-color:#1877f2}[border=facebook]{border:1px solid #1877f2}[color=google]{color:#4e85e8}[bgcolor=google],[hcolor=google]:hover{background-color:#4e85e8}[border=google]{border:1px solid #4e85e8}[color=instagram]{color:#e1306c}[bgcolor=instagram],[hcolor=instagram]:hover{background-color:#e1306c}[border=instagram]{border:1px solid #e1306c}[color=instagrammagenta]{color:#c13584}[bgcolor=instagrammagenta],[hcolor=instagrammagenta]:hover{background-color:#c13584}[border=instagrammagenta]{border:1px solid #c13584}[color=instagramblue]{color:#5851db}[bgcolor=instagramblue],[hcolor=instagramblue]:hover{background-color:#5851db}[border=instagramblue]{border:1px solid #5851db}[color=instagrampurple]{color:#833ab4}[bgcolor=instagrampurple],[hcolor=instagrampurple]:hover{background-color:#833ab4}[border=instagrampurple]{border:1px solid #833ab4}[color=instagramorange]{color:#f56040}[bgcolor=instagramorange],[hcolor=instagramorange]:hover{background-color:#f56040}[border=instagramorange]{border:1px solid #f56040}[color=instagramyellow]{color:#ffdc80}[bgcolor=instagramyellow],[hcolor=instagramyellow]:hover{background-color:#ffdc80}[border=instagramyellow]{border:1px solid #ffdc80}[color=linkedin]{color:#2c67bc}[bgcolor=linkedin],[hcolor=linkedin]:hover{background-color:#2c67bc}[border=linkedin]{border:1px solid #2c67bc}[color=twitter]{color:#55acee}[bgcolor=twitter],[hcolor=twitter]:hover{background-color:#55acee}[border=twitter]{border:1px solid #55acee}[color=youtube]{color:red}[bgcolor=youtube],[hcolor=youtube]:hover{background-color:red}[border=youtube]{border:1px solid #ff0000}[color=blood-orange]{color:#ff4d00}[bgcolor=blood-orange],[hcolor=blood-orange]:hover{background-color:#ff4d00}[border=blood-orange]{border:1px solid #ff4d00}[color=pinkish-orange]{color:#ff7b49}[bgcolor=pinkish-orange],[hcolor=pinkish-orange]:hover{background-color:#ff7b49}[border=pinkish-orange]{border:1px solid #ff7b49}[color=charcoal-grey]{color:#2a2f34}[bgcolor=charcoal-grey],[hcolor=charcoal-grey]:hover{background-color:#2a2f34}[border=charcoal-grey]{border:1px solid #2a2f34}[color=azure]{color:#00aeef}[bgcolor=azure],[hcolor=azure]:hover{background-color:#00aeef}[border=azure]{border:1px solid #00aeef}[color=light-azure]{color:#eaf5fd}[bgcolor=light-azure],[hcolor=light-azure]:hover{background-color:#eaf5fd}[border=light-azure]{border:1px solid #eaf5fd}[color=blue-grey]{color:#8d98a9}[bgcolor=blue-grey],[hcolor=blue-grey]:hover{background-color:#8d98a9}[border=blue-grey]{border:1px solid #8d98a9}[color=silver]{color:#ced0da}[bgcolor=silver],[hcolor=silver]:hover{background-color:#ced0da}[border=silver]{border:1px solid #ced0da}[color=pale-grey]{color:#dfe3e9}[bgcolor=pale-grey],[hcolor=pale-grey]:hover{background-color:#dfe3e9}[border=pale-grey]{border:1px solid #dfe3e9}[color=grey-white]{color:#f5f7f8}[bgcolor=grey-white],[hcolor=grey-white]:hover{background-color:#f5f7f8}[border=grey-white]{border:1px solid #f5f7f8}[color=cool-grey]{color:#b4bbc6}[bgcolor=cool-grey],[hcolor=cool-grey]:hover{background-color:#b4bbc6}[border=cool-grey]{border:1px solid #b4bbc6}[color=black]{color:#344563}[bgcolor=black],[hcolor=black]:hover{background-color:#344563}[border=black]{border:1px solid #344563}[color=grey-blue]{color:#68768c}[bgcolor=grey-blue],[hcolor=grey-blue]:hover{background-color:#68768c}[border=grey-blue]{border:1px solid #68768c}[color=strawberry]{color:#f4282d}[bgcolor=strawberry],[hcolor=strawberry]:hover{background-color:#f4282d}[border=strawberry]{border:1px solid #f4282d}[color=light-strawberry]{color:#f8eded}[bgcolor=light-strawberry],[hcolor=light-strawberry]:hover{background-color:#f8eded}[border=light-strawberry]{border:1px solid #f8eded}[color=white]{color:#fff}[bgcolor=white],[hcolor=white]:hover{background-color:#fff}[border=white]{border:1px solid #ffffff}[color=cool-green]{color:#33c15d}[bgcolor=cool-green],[hcolor=cool-green]:hover{background-color:#33c15d}[border=cool-green]{border:1px solid #33c15d}[color=light-green]{color:#ebfaef}[bgcolor=light-green],[hcolor=light-green]:hover{background-color:#ebfaef}[border=light-green]{border:1px solid #ebfaef}[color=transparent]{color:transparent}[bgcolor=transparent],[hcolor=transparent]:hover{background-color:transparent}[border=transparent]{border:1px solid transparent}[color=c0]{color:#a566a5}[bgcolor=c0],[hcolor=c0]:hover{background-color:#a566a5}[border=c0]{border:1px solid #A566A5}[color=c1]{color:#c7ab82}[bgcolor=c1],[hcolor=c1]:hover{background-color:#c7ab82}[border=c1]{border:1px solid #C7AB82}[color=c2]{color:#f2713c}[bgcolor=c2],[hcolor=c2]:hover{background-color:#f2713c}[border=c2]{border:1px solid #F2713C}[color=c3]{color:#ffd006}[bgcolor=c3],[hcolor=c3]:hover{background-color:#ffd006}[border=c3]{border:1px solid #FFD006}[color=c4]{color:#94c5aa}[bgcolor=c4],[hcolor=c4]:hover{background-color:#94c5aa}[border=c4]{border:1px solid #94C5AA}[color=c5]{color:#2a9d8f}[bgcolor=c5],[hcolor=c5]:hover{background-color:#2a9d8f}[border=c5]{border:1px solid #2A9D8F}[color=c6]{color:#78acd8}[bgcolor=c6],[hcolor=c6]:hover{background-color:#78acd8}[border=c6]{border:1px solid #78ACD8}[color=c7]{color:#525a9e}[bgcolor=c7],[hcolor=c7]:hover{background-color:#525a9e}[border=c7]{border:1px solid #525A9E}[color=c8]{color:#6a2459}[bgcolor=c8],[hcolor=c8]:hover{background-color:#6a2459}[border=c8]{border:1px solid #6A2459}[color=c9]{color:#74729e}[bgcolor=c9],[hcolor=c9]:hover{background-color:#74729e}[border=c9]{border:1px solid #74729E}.time-picker-container{display:flex}.time-input{width:80px;max-width:80px;text-align:center;padding:0;margin:0;height:36px;line-height:24px}.time-input.active{border-color:#178dfe}.time-picker-options{display:flex;flex-direction:column;width:96px;margin-top:8px;max-width:96px;height:379px;background:white;border-radius:4px;overflow:hidden;box-shadow:0 3px 10px #00000014}.time-picker-options.meridian{width:152px;max-width:152px}.time-picker-options .header{display:flex;align-items:center;min-height:29px;border-bottom:1px solid #eaecef;color:#344563;font-size:12px;line-height:18px}.time-picker-options .header>span{flex:1;text-align:center}.time-picker-options .content{display:flex;position:relative;min-height:252px;overflow:hidden}.time-picker-options .content .selector{display:flex;justify-content:space-evenly;align-items:center;background-color:#f9f9fa;border-top:1px solid #eaecef;border-bottom:1px solid #eaecef;width:100%;height:34px;position:absolute;top:50%;transform:translateY(-50%);z-index:4;box-sizing:border-box}.time-picker-options .content .divider{height:100%;width:1px;background:#eaecef}.time-picker-options .content .options{flex:1;height:100%;overflow-y:scroll;z-index:5;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none}.time-picker-options .content .options::-webkit-scrollbar{display:none}.time-picker-options .content .options .invisible-block{min-height:109px;max-height:109px;width:100%}.time-picker-options .content .options .option{min-height:34px;display:flex;z-index:5;justify-content:center;align-items:center;font-size:14px;line-height:17px;color:#aeb5c1;scroll-snap-align:center;padding-block:1px;box-sizing:border-box}.time-picker-options .content .options .option:hover{color:#178dfe;cursor:pointer}.time-picker-options .content .options .option.selected{color:#344563!important}.time-picker-options .content .meridian{flex:1;display:flex;flex-direction:column;justify-content:center}.time-picker-options .content .meridian>div{min-height:34px;display:flex;justify-content:center;align-items:center;font-size:14px;line-height:17px;color:#aeb5c1;scroll-snap-align:center}.time-picker-options .buttons{display:flex;flex-direction:column;padding:8px;min-height:96px;border-top:1px solid #eaecef;gap:8px}.time-picker-options .buttons button{font-weight:700;min-width:80px}\n"] }]
353
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { inputBox: [{
354
- type: ViewChild,
355
- args: ['inputBox']
356
- }], hourOptions: [{
357
- type: ViewChild,
358
- args: ['hourOptions']
359
- }], minutesOptions: [{
360
- type: ViewChild,
361
- args: ['minutesOptions']
362
- }], meridiansOptions: [{
363
- type: ViewChild,
364
- args: ['meridiansOptions']
365
- }], timepicker: [{
366
- type: ViewChild,
367
- args: ['timepicker']
368
- }], i18n: [{
369
- type: Input
370
- }], disabled: [{
371
- type: Input
372
- }], format: [{
373
- type: Input
374
- }], invalid: [{
375
- type: Input
376
- }], invalidationMessage: [{
377
- type: Input
378
- }], placement: [{
379
- type: Input
380
- }], timeModel: [{
381
- type: Input
382
- }], timeModelChange: [{
383
- type: Output
384
- }], onKeypress: [{
385
- type: HostListener,
386
- args: ['window:keydown', ['$event']]
387
- }] } });
388
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVvLXRpbWVwaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL3NyYy9saWIvbmVvLXRpbWVwaWNrZXIvbmVvLXRpbWVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL3NyYy9saWIvbmVvLXRpbWVwaWNrZXIvbmVvLXRpbWVwaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUNyQyxPQUFPLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUNuQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUNILFlBQVksRUFDWixvQkFBb0IsRUFDcEIsR0FBRyxFQUNILFNBQVMsR0FDWixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLDREQUE0RDtBQUM1RCxPQUFPLEVBQVEsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7O0FBZ0J0RSxNQUFNLE9BQU8sc0JBQXNCO0lBNkcvQixZQUFtQixpQkFBb0M7UUFBcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQXJHOUMsU0FBSSxHQUFnQztZQUN6QyxTQUFTLEVBQUUsTUFBTTtZQUNqQixXQUFXLEVBQUUsUUFBUTtZQUNyQixhQUFhLEVBQUUsT0FBTztZQUN0QixTQUFTLEVBQUUsTUFBTTtZQUNqQixXQUFXLEVBQUUsUUFBUTtTQUN4QixDQUFDO1FBQ08sYUFBUSxHQUFZLEtB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O2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQTJFUCxVQUFVO3NCQURULFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGZvcm1hdCBmcm9tIFwiZGF0ZS1mbnMvZm9ybWF0XCI7XG5pbXBvcnQgcGFyc2UgZnJvbSBcImRhdGUtZm5zL3BhcnNlXCI7XG5pbXBvcnQgSU1hc2sgZnJvbSBcImltYXNrXCI7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtcbiAgICBkZWJvdW5jZVRpbWUsXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gICAgbWFwLFxuICAgIHRha2VVbnRpbCxcbn0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG4vLyBGSVhNRSBNb3ZlIHRoZXNlIG1vZGVscyB3aGVuIHdlIHJlbW92ZSB0aGUgb2xkIHRpbWVwaWNrZXJcbmltcG9ydCB7IFRpbWUsIFRpbWVGb3JtYXQgfSBmcm9tIFwiLi4vdGltZXBpY2tlci90aW1lcGlja2VyLmNvbXBvbmVudFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVQaWNrZXJUcmFuc2xhdGVkU3RyaW5ncyB7XG4gICAgaG91ckxhYmVsOiBzdHJpbmc7XG4gICAgbWludXRlTGFiZWw6IHN0cmluZztcbiAgICBtZXJpZGlhbkxhYmVsOiBzdHJpbmc7XG4gICAgZG9uZUxhYmVsOiBzdHJpbmc7XG4gICAgY2FuY2VsTGFiZWw6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc2VsZWN0b3I6ICdhcC1uZW8tdGltZXBpY2tlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL25lby10aW1lcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9uZW8tdGltZXBpY2tlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5lb1RpbWVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgICBAVmlld0NoaWxkKCdpbnB1dEJveCcpIGlucHV0Qm94OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2hvdXJPcHRpb25zJykgaG91ck9wdGlvbnM6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnbWludXRlc09wdGlvbnMnKSBtaW51dGVzT3B0aW9uczogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdtZXJpZGlhbnNPcHRpb25zJykgbWVyaWRpYW5zT3B0aW9uczogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCd0aW1lcGlja2VyJykgdGltZXBpY2tlcjogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpIGkxOG46IFRpbWVQaWNrZXJUcmFuc2xhdGVkU3RyaW5ncyA9IHtcbiAgICAgICAgaG91ckxhYmVsOiAnSG91cicsXG4gICAgICAgIG1pbnV0ZUxhYmVsOiAnTWludXRlJyxcbiAgICAgICAgbWVyaWRpYW5MYWJlbDogJ0FNL1BNJyxcbiAgICAgICAgZG9uZUxhYmVsOiAnRG9uZScsXG4gICAgICAgIGNhbmNlbExhYmVsOiAnQ2FuY2VsJyxcbiAgICB9O1xuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgZm9ybWF0OiBUaW1lRm9ybWF0ID0gVGltZUZvcm1hdC5EZWZhdWx0O1xuICAgIEBJbnB1dCgpIGludmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBpbnZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcGxhY2VtZW50OiAndG9wJyB8ICdib3R0b20nID0gJ2JvdHRvbSc7XG4gICAgQElucHV0KCkgdGltZU1vZGVsOiBzdHJpbmc7XG5cbiAgICBAT3V0cHV0KCkgdGltZU1vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VGltZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFRpbWU+KCk7XG5cbiAgICByZWFkb25seSBtZXJpZGlhbnM6IHN0cmluZ1tdID0gWydBTScsICdQTSddO1xuICAgIHJlYWRvbmx5IGltYXNrRGVmYXVsdCA9IHtcbiAgICAgICAgbWFzazogJ0hIOk1NJyxcbiAgICAgICAgYmxvY2tzOiB7XG4gICAgICAgICAgICBISDoge1xuICAgICAgICAgICAgICAgIG1hc2s6IElNYXNrLk1hc2tlZFJhbmdlLFxuICAgICAgICAgICAgICAgIGZyb206IDAsXG4gICAgICAgICAgICAgICAgdG86IDIzLFxuICAgICAgICAgICAgICAgIGF1dG9maXg6ICdwYWQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE1NOiB7XG4gICAgICAgICAgICAgICAgbWFzazogSU1hc2suTWFza2VkUmFuZ2UsXG4gICAgICAgICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAgICAgICB0bzogNTksXG4gICAgICAgICAgICAgICAgYXV0b2ZpeDogJ3BhZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH07XG4gICAgcmVhZG9ubHkgaW1hc2tNZXJpZGlhbiA9IHtcbiAgICAgICAgbWFzazogJ0hIOk1NIEFNUE0nLFxuICAgICAgICBibG9ja3M6IHtcbiAgICAgICAgICAgIEhIOiB7XG4gICAgICAgICAgICAgICAgbWFzazogSU1hc2suTWFza2VkUmFuZ2UsXG4gICAgICAgICAgICAgICAgZnJvbTogMSxcbiAgICAgICAgICAgICAgICB0bzogMTIsXG4gICAgICAgICAgICAgICAgYXV0b2ZpeDogJ3BhZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgTU06IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBJTWFzay5NYXNrZWRSYW5nZSxcbiAgICAgICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgICAgIHRvOiA1OSxcbiAgICAgICAgICAgICAgICBhdXRvZml4OiAncGFkJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBBTVBNOiB7XG4gICAgICAgICAgICAgICAgbWFzazogSU1hc2suTWFza2VkRW51bSxcbiAgICAgICAgICAgICAgICBlbnVtOiBbJ0FNJywgJ1BNJ11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbGF6eTogZmFsc2UsXG4gICAgICAgIHByZXBhcmU6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmVhZG9ubHkgRU5URVJfS0VZOiBzdHJpbmcgPSAnRW50ZXInO1xuICAgIHJlYWRvbmx5IEVTQ0FQRV9LRVk6IHN0cmluZyA9ICdFc2NhcGUnO1xuICAgIHJlYWRvbmx5IEZJWF9OVU1CRVI6IG51bWJlciA9IDEwO1xuICAgIHJlYWRvbmx5IEhPVVJTX01BWDogbnVtYmVyID0gMjQ7XG4gICAgcmVhZG9ubHkgSE9VUlNfTUVSSURJQU5fTUFYOiBudW1iZXIgPSAxMjtcbiAgICByZWFkb25seSBNQVJHSU46IG51bWJlciA9IDg7XG4gICAgcmVhZG9ubHkgTUlOVVRFU19NQVg6IG51bWJlciA9IDYwO1xuICAgIHJlYWRvbmx5IFRJTUVfT1BUSU9OX0hFSUdIVDogbnVtYmVyID0gMzg3O1xuICAgIHJlYWRvbmx5IFRJTUVfUElDS0VSX0RFRkFVTFRfV0lEVEg6IG51bWJlciA9IDk2O1xuICAgIHJlYWRvbmx5IFRJTUVfUElDS0VSX01FUklESUFOX1dJRFRIOiBudW1iZXIgPSAxNTI7XG4gICAgcmVhZG9ubHkgUk9XX0hFSUdIVDogbnVtYmVyID0gMzQ7XG5cbiAgICBkZXN0cm95JDogU3ViamVjdDx2b2lkPjtcbiAgICBob3Vyczogc3RyaW5nW10gPSBbXTtcbiAgICBob3Vyc1Njcm9sbE9ic2VydmVyJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAgIG1lcmlkaWFuc1Njcm9sbE9ic2VydmVyJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAgIG1pbnV0ZXNTY3JvbGxPYnNlcnZlciQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgICBtaW51dGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHBvc2l0aW9uOiB7IHRvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXIgfSA9IG51bGw7XG4gICAgcHJldmlvdXNWYWx1ZTogc3RyaW5nO1xuICAgIHNlbGVjdGVkSG91cjogc3RyaW5nO1xuICAgIHNlbGVjdGVkTWludXRlOiBzdHJpbmc7XG4gICAgc2VsZWN0ZWRNZXJpZGlhbjogc3RyaW5nO1xuICAgIHRpbWVwaWNrZXJDbG9zZWQ6IGJvb2xlYW47XG4gICAgdGltZXBpY2tlck9wZW5lZDogYm9vbGVhbjtcbiAgICBUaW1lRm9ybWF0ID0gVGltZUZvcm1hdDtcbiAgICB0aW1lRm9ybWF0OiBzdHJpbmc7XG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgb25LZXlwcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy50aW1lcGlja2VyT3BlbmVkKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gdGhpcy5FTlRFUl9LRVkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2F2ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gdGhpcy5FU0NBUEVfS0VZKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNhbmNlbFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdlbmVyYXRlVGltZVNsb3RzKCk7XG4gICAgICAgIHRoaXMub25UaW1lTW9kZWxDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRpbWVTbG90cygpO1xuICAgICAgICBpZiAoY2hhbmdlcy5mb3JtYXQ/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lRm9ybWF0ID0gdGhpcy5mb3JtYXQgPT09IFRpbWVGb3JtYXQuRGVmYXVsdCA/ICdISDptbScgOiAnaGg6bW0gYSc7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT09IFRpbWVGb3JtYXQuRGVmYXVsdCAmJiB0aGlzLm1lcmlkaWFucy5zb21lKG1lcmlkaWFuID0+IHRoaXMudGltZU1vZGVsPy5lbmRzV2l0aChtZXJpZGlhbikpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lTW9kZWwgPSBOZW9UaW1lcGlja2VyQ29tcG9uZW50LmNvbnZlcnQxMlRvMjQodGhpcy50aW1lTW9kZWwpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1hdCA9PT0gVGltZUZvcm1hdC5NZXJpZGlhbiAmJiB0aGlzLm1lcmlkaWFucy5ldmVyeShtZXJpZGlhbiA9PiAhdGhpcy50aW1lTW9kZWw/LmVuZHNXaXRoKG1lcmlkaWFuKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVNb2RlbCA9IE5lb1RpbWVwaWNrZXJDb21wb25lbnQuY29udmVydDI0VG8xMih0aGlzLnRpbWVNb2RlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLnBsYWNlbWVudD8uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVQaWNrZXJQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLmZvcm1hdD8uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVQaWNrZXJQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25PcGVuVGltZXBpY2tlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IHRoaXMudGltZU1vZGVsO1xuICAgICAgICB0aGlzLnRpbWVwaWNrZXJPcGVuZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRpbWVwaWNrZXJDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGVUaW1lUGlja2VyUG9zaXRpb24oKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFBvc2l0aW9uKCdtaW51dGUnLCB0aGlzLnNlbGVjdGVkTWludXRlLCAnYXV0bycpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50UG9zaXRpb24oJ2hvdXInLCB0aGlzLnNlbGVjdGVkSG91ciwgJ2F1dG8nKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFBvc2l0aW9uKCdtZXJpZGlhbicsIHRoaXMuc2VsZWN0ZWRNZXJpZGlhbiwgJ2F1dG8nKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRCb3gubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dEJveC5uYXRpdmVFbGVtZW50LnNlbGVjdCgpO1xuICAgICAgICB9LCAxKVxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIG9uVGltZXBpY2tlck9wZW5lZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3Vyc1Njcm9sbE9ic2VydmVyJCA9IHRoaXMub25PYnNlcnZlRWxlbWVudFNjcm9sbCh0aGlzLmhvdXJPcHRpb25zLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLm1pbnV0ZXNTY3JvbGxPYnNlcnZlciQgPSB0aGlzLm9uT2JzZXJ2ZUVsZW1lbnRTY3JvbGwodGhpcy5taW51dGVzT3B0aW9ucy5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgICB0aGlzLmhvdXJzU2Nyb2xsT2JzZXJ2ZXIkLnN1YnNjcmliZSgoaW5kZXhUb1Njcm9sbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lTW9kZWwodGhpcy5ob3Vyc1tpbmRleFRvU2Nyb2xsXSwgdGhpcy5zZWxlY3RlZE1pbnV0ZSwgdGhpcy5zZWxlY3RlZE1lcmlkaWFuKTtcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5taW51dGVzU2Nyb2xsT2JzZXJ2ZXIkLnN1YnNjcmliZSgoaW5kZXhUb1Njcm9sbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lTW9kZWwodGhpcy5zZWxlY3RlZEhvdXIsIHRoaXMubWludXRlc1tpbmRleFRvU2Nyb2xsXSwgdGhpcy5zZWxlY3RlZE1lcmlkaWFuKTtcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT09IFRpbWVGb3JtYXQuTWVyaWRpYW4pIHtcbiAgICAgICAgICAgIHRoaXMubWVyaWRpYW5zU2Nyb2xsT2JzZXJ2ZXIkID0gdGhpcy5vbk9ic2VydmVFbGVtZW50U2Nyb2xsKHRoaXMubWVyaWRpYW5zT3B0aW9ucy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMubWVyaWRpYW5zU2Nyb2xsT2JzZXJ2ZXIkLnN1YnNjcmliZSgoaW5kZXhUb1Njcm9sbCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZU1vZGVsKHRoaXMuc2VsZWN0ZWRIb3VyLCB0aGlzLnNlbGVjdGVkTWludXRlLCB0aGlzLm1lcmlkaWFuc1tpbmRleFRvU2Nyb2xsXSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBvbk9ic2VydmVFbGVtZW50U2Nyb2xsKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIGZyb21FdmVudChlbGVtZW50LCAnc2Nyb2xsJykucGlwZShcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSgxNTApLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZWxlbWVudC5zY3JvbGxUb3AgLyB0aGlzLlJPV19IRUlHSFQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIG9uVGltZVBpY2tlckNsb3NlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNhbmNlbFNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9uVGltZU1vZGVsQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnRpbWVNb2RlbCkge1xuICAgICAgICAgICAgZGF0ZSA9IHBhcnNlKHRoaXMudGltZU1vZGVsLCB0aGlzLnRpbWVGb3JtYXQsIG5ldyBEYXRlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZU1vZGVsID0gZm9ybWF0KGRhdGUsIHRoaXMudGltZUZvcm1hdCk7XG4gICAgICAgIGlmICghdGhpcy5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzVmFsdWUgPSB0aGlzLnRpbWVNb2RlbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQganNIb3VyID0gZGF0ZS5nZXRIb3VycygpO1xuICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT09IFRpbWVGb3JtYXQuTWVyaWRpYW4pIHtcbiAgICAgICAgICAgIGlmIChqc0hvdXIgPiAxMikge1xuICAgICAgICAgICAgICAgIGpzSG91ciA9IGpzSG91ciAtIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSlMgZG9lc24ndCBoYW5kbGUgd2VsbCBBTS9QTSBob3VyIHNvIDEyOjUzIFBNIHdpbGwgYmUgMDA6NTMgLi4uXG4gICAgICAgICAgICBpZiAoanNIb3VyID09IDApIHtcbiAgICAgICAgICAgICAgICBqc0hvdXIgPSAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhvdXIgPSBOZW9UaW1lcGlja2VyQ29tcG9uZW50LnRvRml4ZWQoanNIb3VyLnRvU3RyaW5nKCksIDEwKTtcbiAgICAgICAgaWYgKGhvdXIgIT0gdGhpcy5zZWxlY3RlZEhvdXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gaG91cjtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFBvc2l0aW9uKCdob3VyJywgdGhpcy5zZWxlY3RlZEhvdXIsICdhdXRvJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW51dGUgPSBOZW9UaW1lcGlja2VyQ29tcG9uZW50LnRvRml4ZWQoZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKSwgMTApO1xuICAgICAgICBpZiAobWludXRlICE9IHRoaXMuc2VsZWN0ZWRNaW51dGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNaW51dGUgPSBtaW51dGU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRQb3NpdGlvbignbWludXRlJywgdGhpcy5zZWxlY3RlZE1pbnV0ZSwgJ2F1dG8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gVGltZUZvcm1hdC5NZXJpZGlhbiAmJiB0aGlzLnNlbGVjdGVkTWVyaWRpYW4gIT09IHRoaXMudGltZU1vZGVsLnNwbGl0KCcgJylbMV0pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZXJpZGlhbiA9IHRoaXMudGltZU1vZGVsLnNwbGl0KCcgJylbMV07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRQb3NpdGlvbignbWVyaWRpYW4nLCB0aGlzLnNlbGVjdGVkTWVyaWRpYW4sICdhdXRvJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIG9uU2VsZWN0SG91cihob3VyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVUaW1lTW9kZWwoaG91ciwgdGhpcy5zZWxlY3RlZE1pbnV0ZSwgdGhpcy5zZWxlY3RlZE1lcmlkaWFuKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdE1pbnV0ZShtaW51dGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVNb2RlbCh0aGlzLnNlbGVjdGVkSG91ciwgbWludXRlLCB0aGlzLnNlbGVjdGVkTWVyaWRpYW4pO1xuICAgIH1cblxuICAgIG9uU2VsZWN0TWVyaWRpYW4obWVyaWRpYW46IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVRpbWVNb2RlbCh0aGlzLnNlbGVjdGVkSG91ciwgdGhpcy5zZWxlY3RlZE1pbnV0ZSwgbWVyaWRpYW4pO1xuICAgIH1cblxuICAgIG9uU2F2ZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdGhpcy50aW1lTW9kZWw7XG4gICAgICAgIHRoaXMudGltZXBpY2tlckNsb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMudGltZXBpY2tlck9wZW5lZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCB0aW1lTW9kZWxWYWx1ZSA9IHBhcnNlKHRoaXMudGltZU1vZGVsLCB0aGlzLnRpbWVGb3JtYXQsIG5ldyBEYXRlKCkpO1xuICAgICAgICB0aGlzLnRpbWVNb2RlbENoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIGhvdXJzOiB0aW1lTW9kZWxWYWx1ZS5nZXRIb3VycygpLFxuICAgICAgICAgICAgbWludXRlczogdGltZU1vZGVsVmFsdWUuZ2V0TWludXRlcygpLFxuICAgICAgICB9KVxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIG9uQ2FuY2VsU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRpbWVwaWNrZXJDbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRpbWVwaWNrZXJPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50aW1lTW9kZWwgPSB0aGlzLnByZXZpb3VzVmFsdWU7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgb25NYXNrVmFsaWRhdGVDb21wbGV0ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy50aW1lTW9kZWwgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVNb2RlbCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25UaW1lTW9kZWxDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUaW1lTW9kZWwoaG91cjogc3RyaW5nLCBtaW51dGU6IHN0cmluZywgbWVyaWRpYW4/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBUaW1lRm9ybWF0Lk1lcmlkaWFuKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVNb2RlbCA9IGAke2hvdXJ9OiR7bWludXRlfSAke21lcmlkaWFufWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVNb2RlbCA9IGAke2hvdXJ9OiR7bWludXRlfWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUVsZW1lbnRQb3NpdGlvbihlbGVtZW50VHlwZTogJ2hvdXInIHwgJ21pbnV0ZScgfCAnbWVyaWRpYW4nLCBpZDogc3RyaW5nLCBzY3JvbGxCZWhhdmlvcjogJ2F1dG8nIHwgJ3Ntb290aCcpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2VsZW1lbnRUeXBlfS0ke2lkfWApO1xuICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudChcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBzY3JvbGxCZWhhdmlvclxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsVG9FbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBiZWhhdmlvcjogJ2F1dG8nIHwgJ3Ntb290aCcgPSAnYXV0bycpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcixcbiAgICAgICAgICAgICAgICAgICAgYmxvY2s6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICBpbmxpbmU6ICdjZW50ZXInXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCAxKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVsbGZpbGwgbWludXRlcyBhbmQgaG91cnMgYXJyYXlzIGxpa2UgWzAsIDEsIDIgLi4uIDEyXSBhbmQgWzAsIDEsIDIsIC4uLiA1OV1cbiAgICAgKi9cbiAgICBwcml2YXRlIGdlbmVyYXRlVGltZVNsb3RzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvdXJzID0gW107XG4gICAgICAgIHRoaXMubWludXRlcyA9IFtOZW9UaW1lcGlja2VyQ29tcG9uZW50LnRvRml4ZWQoMCwgdGhpcy5GSVhfTlVNQkVSKV07XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMuSE9VUlNfTUVSSURJQU5fTUFYOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4VG9BZGQgPSBOZW9UaW1lcGlja2VyQ29tcG9uZW50LnRvRml4ZWQoaSwgdGhpcy5GSVhfTlVNQkVSKTtcbiAgICAgICAgICAgIHRoaXMuaG91cnMucHVzaChpbmRleFRvQWRkKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5wdXNoKGluZGV4VG9BZGQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gVGltZUZvcm1hdC5EZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzID0gW05lb1RpbWVwaWNrZXJDb21wb25lbnQudG9GaXhlZCgwLCB0aGlzLkZJWF9OVU1CRVIpLCAuLi50aGlzLmhvdXJzXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxMzsgaSA8IHRoaXMuSE9VUlNfTUFYOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvdXJzLnB1c2goTmVvVGltZXBpY2tlckNvbXBvbmVudC50b0ZpeGVkKGksIHRoaXMuRklYX05VTUJFUikpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDEzOyBpIDwgdGhpcy5NSU5VVEVTX01BWDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMucHVzaChOZW9UaW1lcGlja2VyQ29tcG9uZW50LnRvRml4ZWQoaSwgdGhpcy5GSVhfTlVNQkVSKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVRpbWVQaWNrZXJQb3NpdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRCb3g/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0Qm94Qm91bmRzID0gdGhpcy5pbnB1dEJveC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgdG9wUG9zaXRpb24gPSBpbnB1dEJveEJvdW5kcy50b3AgLSB0aGlzLlRJTUVfT1BUSU9OX0hFSUdIVCAtIHRoaXMuTUFSR0lOO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tUG9zaXRpb24gPSBpbnB1dEJveEJvdW5kcy50b3AgKyBpbnB1dEJveEJvdW5kcy5oZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCB0aW1lUGlja2VyV2lkdGggPSB0aGlzLmZvcm1hdCA9PT0gVGltZUZvcm1hdC5NZXJpZGlhbiA/IHRoaXMuVElNRV9QSUNLRVJfTUVSSURJQU5fV0lEVEg6IHRoaXMuVElNRV9QSUNLRVJfREVGQVVMVF9XSURUSDtcbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gKHRpbWVQaWNrZXJXaWR0aCAtIGlucHV0Qm94Qm91bmRzLndpZHRoKSAvIDI7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBsYWNlbWVudCA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICB0b3A6IHRvcFBvc2l0aW9uIDwgMCA/IGJvdHRvbVBvc2l0aW9uIDogdG9wUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGlucHV0Qm94Qm91bmRzLmxlZnQgLSBzaGlmdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICB0b3A6IGJvdHRvbVBvc2l0aW9uICsgdGhpcy5USU1FX09QVElPTl9IRUlHSFQgKyB0aGlzLk1BUkdJTiA+IHdpbmRvdy5pbm5lckhlaWdodCA/IHRvcFBvc2l0aW9uIDogYm90dG9tUG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGlucHV0Qm94Qm91bmRzLmxlZnQgLSBzaGlmdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvbnZlcnQxMlRvMjQodGltZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRlcm1zID0gdGltZS5zcGxpdCgnOicpO1xuICAgICAgICBjb25zdCBtaW51dGVzID0gdGVybXNbMV0uc3Vic3RyaW5nKDAsIDIpO1xuICAgICAgICBjb25zdCBtZXJpZGlhbiA9IHRlcm1zWzFdLnRyaW0oKS5zbGljZSgtMikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGhvdXIgPSBwYXJzZUludCh0ZXJtc1swXSk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VJbnQodGVybXNbMF0pKSkge1xuICAgICAgICAgICAgaWYgKG1lcmlkaWFuID09PSAnUE0nICYmIGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpYW4gPT09ICdBTScgJiYgaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7aG91cn06JHttaW51dGVzfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29udmVydDI0VG8xMih0aW1lKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdGVybXMgPSB0aW1lLnNwbGl0KCc6Jyk7XG4gICAgICAgIGxldCBtZXJpZGlhbiA9ICdBTSc7XG4gICAgICAgIGxldCBob3VyID0gcGFyc2VJbnQodGVybXNbMF0pO1xuICAgICAgICBsZXQgbWludXRlID0gcGFyc2VJbnQodGVybXNbMV0pO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlSW50KHRlcm1zWzBdKSkpIHtcbiAgICAgICAgICAgIGlmIChob3VyID49IDEyKSB7XG4gICAgICAgICAgICAgICAgbWVyaWRpYW4gPSAnUE0nO1xuICAgICAgICAgICAgICAgIGlmIChob3VyID4gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgaG91ciA9IGhvdXIgLSAxMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBob3VyU3RyID0gTmVvVGltZXBpY2tlckNvbXBvbmVudC50b0ZpeGVkKGhvdXIsIDEwKTtcbiAgICAgICAgY29uc3QgbWludXRlU3RyID0gTmVvVGltZXBpY2tlckNvbXBvbmVudC50b0ZpeGVkKG1pbnV0ZSwgMTApO1xuICAgICAgICByZXR1cm4gYCR7aG91clN0cn06JHttaW51dGVTdHJ9ICR7bWVyaWRpYW59YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gMDggZm9yIDgsIDA2IGZvciA2XG4gICAgICogQHBhcmFtIG51bVxuICAgICAqIEBwYXJhbSBmaXhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIHRvRml4ZWQobnVtLCBmaXgpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZml4ZWROdW06IHN0cmluZyA9IG51bS50b1N0cmluZygpO1xuICAgICAgICBpZiAobnVtIDwgZml4KSB7XG4gICAgICAgICAgICBmaXhlZE51bSA9IGAwJHtmaXhlZE51bX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXhlZE51bTtcbiAgICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1jb250YWluZXJcIj5cbiAgICA8bmctdGVtcGxhdGUgI3RpbWVPcHRpb25zVGVtcGxhdGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1vcHRpb25zXCJcbiAgICAgICAgICAgICBbY2xhc3MubWVyaWRpYW5dPVwiZm9ybWF0ID09PSBUaW1lRm9ybWF0Lk1lcmlkaWFuXCJcbiAgICAgICAgICAgICAqbmdJZj1cInRpbWVwaWNrZXJPcGVuZWRcIlxuICAgICAgICAgICAgICN0aW1lcGlja2VyXG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj4ge3sgaTE4bi5ob3VyTGFiZWwgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBpMThuLm1pbnV0ZUxhYmVsIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1hdCA9PT0gVGltZUZvcm1hdC5NZXJpZGlhblwiPiB7eyBpMThuLm1lcmlkaWFuTGFiZWwgfX0gPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj46PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZvcm1hdCA9PT0gVGltZUZvcm1hdC5NZXJpZGlhblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICNob3VyT3B0aW9ucz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmlzaWJsZS1ibG9ja1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBob3VyIG9mIGhvdXJzO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2hvdXItJyArIGhvdXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImhvdXIgPT09IHNlbGVjdGVkSG91clwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3RIb3VyKGhvdXIpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBob3VyIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52aXNpYmxlLWJsb2NrXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAjbWludXRlc09wdGlvbnM+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZpc2libGUtYmxvY2tcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbWludXRlIG9mIG1pbnV0ZXM7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidtaW51dGUtJyArIG1pbnV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cIm1pbnV0ZSA9PT0gc2VsZWN0ZWRNaW51dGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdE1pbnV0ZShtaW51dGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBtaW51dGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZpc2libGUtYmxvY2tcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZm9ybWF0ID09PSBUaW1lRm9ybWF0Lk1lcmlkaWFuXCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtYXQgPT09IFRpbWVGb3JtYXQuTWVyaWRpYW5cIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICNtZXJpZGlhbnNPcHRpb25zPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52aXNpYmxlLWJsb2NrXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1lcmlkaWFuIG9mIG1lcmlkaWFucztcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ21lcmlkaWFuLScgKyBtZXJpZGlhblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGVkTWVyaWRpYW4gPT09IG1lcmlkaWFuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3RNZXJpZGlhbihtZXJpZGlhbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1lcmlkaWFuIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52aXNpYmxlLWJsb2NrXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnVsbC13aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2F2ZVNlbGVjdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGkxOG4uZG9uZUxhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnVsbC13aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYW5jZWxTZWxlY3Rpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpMThuLmNhbmNlbExhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8aW5wdXQgI2lucHV0Qm94XG4gICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSByaWdodFwiXG4gICAgICAgICAgIGNvbG9yPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJ0aW1lcGlja2VyT3BlbmVkXCJcbiAgICAgICAgICAgW2NsYXNzLmludmFsaWRdPVwiaW52YWxpZFwiXG4gICAgICAgICAgIFthcFBvcG1lbnVdPVwidGltZU9wdGlvbnNUZW1wbGF0ZVwiXG4gICAgICAgICAgIFthcFBvcG1lbnVCYWNrZ3JvdW5kXT1cImZhbHNlXCJcbiAgICAgICAgICAgW2FwUG9wbWVudUJvcmRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgIFthcFBvcG1lbnVEaXNhYmxlZF09XCJ0aW1lcGlja2VyT3BlbmVkXCJcbiAgICAgICAgICAgW2FwVG9vbHRpcE5lb109XCJ7Y29udGVudDogaW52YWxpZGF0aW9uTWVzc2FnZSwgZGlzcGxheTogaW52YWxpZGF0aW9uTWVzc2FnZSAmJiBpbnZhbGlkfVwiXG4gICAgICAgICAgIFtjbG9zZV09XCJ0aW1lcGlja2VyQ2xvc2VkXCJcbiAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgW2ltYXNrXT1cImZvcm1hdCA9PT0gVGltZUZvcm1hdC5NZXJpZGlhbiA/IGltYXNrTWVyaWRpYW4gOiBpbWFza0RlZmF1bHRcIlxuICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRpbWVNb2RlbFwiXG4gICAgICAgICAgIFtwb2ludGVyXT1cInRydWVcIlxuICAgICAgICAgICBbcG9zaXRpb25dPVwicG9zaXRpb25cIlxuICAgICAgICAgICBbcm91bmRlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgW3NoYWRvd109XCJmYWxzZVwiXG4gICAgICAgICAgIChjbGljayk9XCJvbk9wZW5UaW1lcGlja2VyKClcIlxuICAgICAgICAgICAoY29tcGxldGUpPVwib25NYXNrVmFsaWRhdGVDb21wbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgKG1lbnVDbG9zZWQpPVwib25UaW1lUGlja2VyQ2xvc2VkKClcIlxuICAgICAgICAgICAobWVudU9wZW5lZCk9XCJvblRpbWVwaWNrZXJPcGVuZWQoKVwiPlxuPC9kaXY+XG4iXX0=
@@ -1,32 +0,0 @@
1
- import { ElementRef, EventEmitter, OnDestroy } from '@angular/core';
2
- import { MatDialog, MatDialogRef } from '@angular/material/dialog';
3
- import { EditTagsModalData } from './model/edit-tags-modal.model';
4
- import * as i0 from "@angular/core";
5
- export declare class EditTagsModalComponent implements OnDestroy {
6
- data: EditTagsModalData;
7
- dialogRef: MatDialogRef<EditTagsModalComponent>;
8
- dialog: MatDialog;
9
- deletedTags: string[];
10
- editTag: EventEmitter<Map<string, string>>;
11
- filteredTags: string[];
12
- savingTags: string[];
13
- tagEditedIndex: number;
14
- tags: string[];
15
- updatedTags: Map<string, string>;
16
- updateStatusByTags: Map<string, boolean>;
17
- tagInput: ElementRef;
18
- private readonly destroy$;
19
- constructor(data: EditTagsModalData, dialogRef: MatDialogRef<EditTagsModalComponent>, dialog: MatDialog);
20
- cancelEdit(): void;
21
- onDone(): void;
22
- onEdit(index: number): void;
23
- onRemove(tag: string): void;
24
- onValidateInput(index: number): void;
25
- onValidate(value: string, index: number): void;
26
- onValidateEnter(event: any, index: number): void;
27
- onSearch(tag: string): void;
28
- updateTagSuccess(tag: string): void;
29
- ngOnDestroy(): void;
30
- static ɵfac: i0.ɵɵFactoryDeclaration<EditTagsModalComponent, never>;
31
- static ɵcmp: i0.ɵɵComponentDeclaration<EditTagsModalComponent, "ng-component", never, {}, {}, never, never>;
32
- }
@@ -1,21 +0,0 @@
1
- import { Observable } from 'rxjs';
2
- export interface EditTagsModalData {
3
- tags$: Observable<string[]>;
4
- updateStatusByTag$: Observable<TagStatus[]>;
5
- translatedString: TranslatedStrings;
6
- }
7
- export interface TagStatus {
8
- tag: string;
9
- loading: boolean;
10
- }
11
- export interface TranslatedStrings {
12
- cancelTooltip: string;
13
- deletedLabel: string;
14
- deleteTooltip?: string;
15
- doneLabel: string;
16
- savedLabel: string;
17
- searchPlaceholder: string;
18
- subtitle: string;
19
- title: string;
20
- validateTooltip: string;
21
- }