UNPKG

ng-business-hours

Version:

Angular component allows you to show and manage business hours

149 lines 23.2 kB
import { Component, forwardRef, Input } from '@angular/core'; import { FormBuilder, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms'; import moment from 'moment'; import { LocalizedDatePipe } from './localized-date.pipe'; import { daySettingsValidator } from './day-settings.validator'; export class NgBusinessHoursComponent { constructor(localizedDatePipe, fb) { this.localizedDatePipe = localizedDatePipe; this.fb = fb; this.timeFrom = '09:00'; this.timeTo = '18:00'; this.isoWeek = true; this.val = ''; this.disabled = false; this.startTime = '00:00'; this.maxTime = '24:00'; this.interval = 15; this.timeFormat = 'HH:mm'; this.defaultBusinessHours = [ { open: true, from: this.timeFrom, to: this.timeTo }, { open: true, from: this.timeFrom, to: this.timeTo }, { open: true, from: this.timeFrom, to: this.timeTo }, { open: true, from: this.timeFrom, to: this.timeTo }, { open: true, from: this.timeFrom, to: this.timeTo }, { open: false, from: '', to: '' }, { open: false, from: '', to: '' }, ]; this.onChange = (obj) => { const values = Object.values(obj); this.onValuesChange(values); }; this.onValuesChange = (value) => { }; this.onTouched = () => { }; this.weekdays = Array.from(Array(7).keys()); this.timeOptions = this.getTimeOptions(this.startTime, this.maxTime, this.interval); this.businessHours = this.defaultBusinessHours; this.initForm(); } ngOnInit() { this.formValueChangesSubscription = this.form.valueChanges.subscribe(this.onChange); } registerOnChange(fn) { this.onValuesChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; if (isDisabled) { this.form.disable(); } else { this.form.enable(); } } writeValue(obj) { if (obj && obj.length > 0) { const values = Object.assign({}, obj); this.businessHours = values; this.form.setValue(values, { emitEvent: false }); } else { this.form.setValue(this.defaultBusinessHours, { emitEvent: true }); } } validate(control) { if (this.form.valid) { return null; } return { businessHoursInvalid: true }; } onChangeOperationState(i) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; if (this.disabled) { return; } this.businessHours[i].open = !this.businessHours[i].open; (_b = (_a = this.form.get(String(i))) === null || _a === void 0 ? void 0 : _a.get('open')) === null || _b === void 0 ? void 0 : _b.setValue(this.businessHours[i].open); if (this.businessHours[i].open) { (_d = (_c = this.form.get(String(i))) === null || _c === void 0 ? void 0 : _c.get('from')) === null || _d === void 0 ? void 0 : _d.setValue(this.timeFrom); (_f = (_e = this.form.get(String(i))) === null || _e === void 0 ? void 0 : _e.get('to')) === null || _f === void 0 ? void 0 : _f.setValue(this.timeTo); } else { (_h = (_g = this.form.get(String(i))) === null || _g === void 0 ? void 0 : _g.get('from')) === null || _h === void 0 ? void 0 : _h.setValue(''); (_k = (_j = this.form.get(String(i))) === null || _j === void 0 ? void 0 : _j.get('to')) === null || _k === void 0 ? void 0 : _k.setValue(''); } } getDateForWeekDay(num) { return moment().startOf(this.isoWeek ? 'isoWeek' : 'week').add(num, 'day').toDate(); } initForm() { this.form = this.fb.group({}); let fg; this.weekdays.forEach((value, index) => { fg = this.fb.group({ open: [{ value: this.businessHours[index].open, disabled: this.disabled }], from: [{ value: this.businessHours[index].from, disabled: this.disabled }], to: [{ value: this.businessHours[index].to, disabled: this.disabled }], }, { validators: daySettingsValidator }); this.form.addControl(String(index), fg); }); } getTimeOptions(startTime, maxTime, interval) { const start = moment(startTime, 'HH:mm'); const max = moment(maxTime, 'HH:mm'); const timeOptions = []; while (start <= max) { timeOptions.push(moment(start).format(this.timeFormat)); start.add(interval, 'minutes'); } return timeOptions; } ngOnDestroy() { this.formValueChangesSubscription.unsubscribe(); } } NgBusinessHoursComponent.decorators = [ { type: Component, args: [{ selector: 'ng-business-hours', template: "<form [formGroup]=\"form\" *ngIf=\"form\">\n <div class=\"business-hours\"\n [ngClass]=\"disabled ? 'business-hours--disabled' : ''\">\n <div *ngFor=\"let day of weekdays; index as i\" [formGroupName]=\"i\" class=\"day\">\n <div class=\"business-hours__left\">\n <div class=\"day__weekday\">{{getDateForWeekDay(i) | localizedDate | titlecase}}</div>\n <div class=\"day__box\"\n (click)=\"onChangeOperationState(i)\"\n [ngClass]=\"businessHours[i]['open'] ? 'day__box--open' : 'day__box--closed'\">\n <input type=\"checkbox\" class=\"invisible\" formControlName=\"open\"/>\n </div>\n </div>\n <div class=\"business-hours__right\">\n <div class=\"operation-time\">\n <div class=\"operation-time__input\">\n <mat-form-field [ngClass]=\"!businessHours[i]['open'] ? 'invisible' : ''\">\n <mat-label>{{timeFromLabel ? timeFromLabel : 'From'}}</mat-label>\n <mat-select value=\"{{businessHours[i]['from']}}\" formControlName=\"from\">\n <mat-option *ngFor=\"let timeOption of timeOptions\" [value]=\"timeOption\">{{timeOption}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div class=\"operation-time__input\">\n <mat-form-field [ngClass]=\"!businessHours[i]['open'] ? 'invisible' : ''\">\n <mat-label>{{timeToLabel ? timeToLabel : 'To'}}</mat-label>\n <mat-select value=\"{{businessHours[i]['to']}}\" formControlName=\"to\">\n <mat-option *ngFor=\"let timeOption of timeOptions\" [value]=\"timeOption\">{{timeOption}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <mat-error *ngIf=\"form.get(i.toString())?.hasError('timeToMustBeGreaterThenTimeFrom')\" class=\"text-small-error\">\n {{validationErrorMessage ? validationErrorMessage : 'The \"From\" must be earlier than the \"To\"'}}\n </mat-error>\n </div>\n </div>\n </div>\n </div>\n</form>\n", providers: [ { provide: NG_VALUE_ACCESSOR, multi: true, useExisting: forwardRef(() => NgBusinessHoursComponent), }, { provide: NG_VALIDATORS, multi: true, useExisting: forwardRef(() => NgBusinessHoursComponent), } ], styles: [".business-hours__left{width:70px}.business-hours__right{width:calc(100% - 70px)}.business-hours--disabled{color:rgba(0,0,0,.38)}.day{clear:both;width:100%;display:flex}.day__box{height:2rem;border:1px solid #888;border-radius:5px;float:right;width:2rem;cursor:pointer;margin-top:.25rem}.day__box--open{border:1px solid #56e399;background-color:#56e399}.day__box--closed{border:1px solid #ced4da;background-color:#ced4da}.day__weekday{margin-top:.7rem;float:left}.operation-time{float:left;width:100%}.operation-time__input{margin-left:1rem;float:left;width:calc(50% - 1rem)}.invisible{visibility:hidden!important}::ng-deep .mat-form-field,::ng-deep .mat-form-field-infix{width:100%}::ng-deep .mat-form-field-wrapper{padding:0}.text-small-error{margin-top:-.75rem;margin-left:1rem;display:block;float:left;font-size:.65rem}.business-hours--disabled .day__box{opacity:.7;cursor:auto}"] },] } ]; NgBusinessHoursComponent.ctorParameters = () => [ { type: LocalizedDatePipe }, { type: FormBuilder } ]; NgBusinessHoursComponent.propDecorators = { timeFromLabel: [{ type: Input }], timeToLabel: [{ type: Input }], validationErrorMessage: [{ type: Input }], timeFrom: [{ type: Input }], timeTo: [{ type: Input }], isoWeek: [{ type: Input }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctYnVzaW5lc3MtaG91cnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYnVzaW5lc3MtaG91cnMvc3JjL2xpYi9uZy1idXNpbmVzcy1ob3Vycy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBR0wsV0FBVyxFQUVYLGFBQWEsRUFDYixpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFvQjlELE1BQU0sT0FBTyx3QkFBd0I7SUFzQ25DLFlBQW9CLGlCQUFvQyxFQUFVLEVBQWU7UUFBN0Qsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUFVLE9BQUUsR0FBRixFQUFFLENBQWE7UUFsQ3hFLGFBQVEsR0FBRyxPQUFPLENBQUM7UUFDbkIsV0FBTSxHQUFHLE9BQU8sQ0FBQztRQUNqQixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXhCLFFBQUcsR0FBRyxFQUFFLENBQUM7UUFDVCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBSWpCLGNBQVMsR0FBRyxPQUFPLENBQUM7UUFDcEIsWUFBTyxHQUFHLE9BQU8sQ0FBQztRQUNsQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsZUFBVSxHQUFHLE9BQU8sQ0FBQztRQUlyQix5QkFBb0IsR0FBaUM7WUFDbkQsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDO1lBQ2xELEVBQUMsSUFB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QXBCTyxpQkFBaUI7WUFUdkIsV0FBVzs7OzRCQStCVixLQUFLOzBCQUNMLEtBQUs7cUNBQ0wsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7c0JBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Hcm91cCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge0xvY2FsaXplZERhdGVQaXBlfSBmcm9tICcuL2xvY2FsaXplZC1kYXRlLnBpcGUnO1xuaW1wb3J0IHtkYXlTZXR0aW5nc1ZhbGlkYXRvcn0gZnJvbSAnLi9kYXktc2V0dGluZ3MudmFsaWRhdG9yJztcbmltcG9ydCB7TmdCdXNpbmVzc0hvdXJzRGF5U2V0dGluZ3N9IGZyb20gJy4vbmctYnVzaW5lc3MtaG91cnMtZGF5LXNldHRpbmdzLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctYnVzaW5lc3MtaG91cnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmctYnVzaW5lc3MtaG91cnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZy1idXNpbmVzcy1ob3Vycy5jb21wb25lbnQuc2FzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdCdXNpbmVzc0hvdXJzQ29tcG9uZW50KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nQnVzaW5lc3NIb3Vyc0NvbXBvbmVudCksXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE5nQnVzaW5lc3NIb3Vyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcbiAgQElucHV0KCkgdGltZUZyb21MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSB0aW1lVG9MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSB2YWxpZGF0aW9uRXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIHRpbWVGcm9tID0gJzA5OjAwJztcbiAgQElucHV0KCkgdGltZVRvID0gJzE4OjAwJztcbiAgQElucHV0KCkgaXNvV2VlayA9IHRydWU7XG5cbiAgdmFsID0gJyc7XG4gIGRpc2FibGVkID0gZmFsc2U7XG4gIGZvcm0hOiBGb3JtR3JvdXA7XG4gIGZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24hOiBTdWJzY3JpcHRpb247XG5cbiAgc3RhcnRUaW1lID0gJzAwOjAwJztcbiAgbWF4VGltZSA9ICcyNDowMCc7XG4gIGludGVydmFsID0gMTU7XG4gIHRpbWVGb3JtYXQgPSAnSEg6bW0nO1xuICB0aW1lT3B0aW9ucyE6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzITogbnVtYmVyW107XG4gIGRlZmF1bHRCdXNpbmVzc0hvdXJzOiBOZ0J1c2luZXNzSG91cnNEYXlTZXR0aW5nc1tdID0gW1xuICAgIHtvcGVuOiB0cnVlLCBmcm9tOiB0aGlzLnRpbWVGcm9tLCB0bzogdGhpcy50aW1lVG99LFxuICAgIHtvcGVuOiB0cnVlLCBmcm9tOiB0aGlzLnRpbWVGcm9tLCB0bzogdGhpcy50aW1lVG99LFxuICAgIHtvcGVuOiB0cnVlLCBmcm9tOiB0aGlzLnRpbWVGcm9tLCB0bzogdGhpcy50aW1lVG99LFxuICAgIHtvcGVuOiB0cnVlLCBmcm9tOiB0aGlzLnRpbWVGcm9tLCB0bzogdGhpcy50aW1lVG99LFxuICAgIHtvcGVuOiB0cnVlLCBmcm9tOiB0aGlzLnRpbWVGcm9tLCB0bzogdGhpcy50aW1lVG99LFxuICAgIHtvcGVuOiBmYWxzZSwgZnJvbTogJycsIHRvOiAnJ30sXG4gICAge29wZW46IGZhbHNlLCBmcm9tOiAnJywgdG86ICcnfSxcbiAgXTtcbiAgYnVzaW5lc3NIb3VycyE6IE5nQnVzaW5lc3NIb3Vyc0RheVNldHRpbmdzW107XG5cbiAgb25DaGFuZ2UgPSAob2JqOiBOZ0J1c2luZXNzSG91cnNEYXlTZXR0aW5nc1tdKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhvYmopO1xuICAgIHRoaXMub25WYWx1ZXNDaGFuZ2UodmFsdWVzKTtcbiAgfVxuICBvblZhbHVlc0NoYW5nZSA9ICh2YWx1ZTogTmdCdXNpbmVzc0hvdXJzRGF5U2V0dGluZ3NbXSkgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9jYWxpemVkRGF0ZVBpcGU6IExvY2FsaXplZERhdGVQaXBlLCBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIHRoaXMud2Vla2RheXMgPSBBcnJheS5mcm9tKEFycmF5KDcpLmtleXMoKSk7XG4gICAgdGhpcy50aW1lT3B0aW9ucyA9IHRoaXMuZ2V0VGltZU9wdGlvbnModGhpcy5zdGFydFRpbWUsIHRoaXMubWF4VGltZSwgdGhpcy5pbnRlcnZhbCk7XG4gICAgdGhpcy5idXNpbmVzc0hvdXJzID0gdGhpcy5kZWZhdWx0QnVzaW5lc3NIb3VycztcbiAgICB0aGlzLmluaXRGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh0aGlzLm9uQ2hhbmdlKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25WYWx1ZXNDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZm9ybS5kaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybS5lbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKG9iajogW10pOiB2b2lkIHtcbiAgICBpZiAob2JqICYmIG9iai5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB7Li4ub2JqfTtcbiAgICAgIHRoaXMuYnVzaW5lc3NIb3VycyA9IHZhbHVlcztcbiAgICAgIHRoaXMuZm9ybS5zZXRWYWx1ZSh2YWx1ZXMsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybS5zZXRWYWx1ZSh0aGlzLmRlZmF1bHRCdXNpbmVzc0hvdXJzLCB7ZW1pdEV2ZW50OiB0cnVlfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7YnVzaW5lc3NIb3Vyc0ludmFsaWQ6IHRydWV9O1xuICB9XG5cbiAgb25DaGFuZ2VPcGVyYXRpb25TdGF0ZShpOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYnVzaW5lc3NIb3Vyc1tpXS5vcGVuID0gIXRoaXMuYnVzaW5lc3NIb3Vyc1tpXS5vcGVuO1xuICAgIHRoaXMuZm9ybS5nZXQoU3RyaW5nKGkpKT8uZ2V0KCdvcGVuJyk/LnNldFZhbHVlKHRoaXMuYnVzaW5lc3NIb3Vyc1tpXS5vcGVuKTtcblxuICAgIGlmICh0aGlzLmJ1c2luZXNzSG91cnNbaV0ub3Blbikge1xuICAgICAgdGhpcy5mb3JtLmdldChTdHJpbmcoaSkpPy5nZXQoJ2Zyb20nKT8uc2V0VmFsdWUodGhpcy50aW1lRnJvbSk7XG4gICAgICB0aGlzLmZvcm0uZ2V0KFN0cmluZyhpKSk/LmdldCgndG8nKT8uc2V0VmFsdWUodGhpcy50aW1lVG8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm0uZ2V0KFN0cmluZyhpKSk/LmdldCgnZnJvbScpPy5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmZvcm0uZ2V0KFN0cmluZyhpKSk/LmdldCgndG8nKT8uc2V0VmFsdWUoJycpO1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGVGb3JXZWVrRGF5KG51bTogbnVtYmVyKTogRGF0ZSB7XG4gICAgcmV0dXJuIG1vbWVudCgpLnN0YXJ0T2YodGhpcy5pc29XZWVrID8gJ2lzb1dlZWsnIDogJ3dlZWsnKS5hZGQobnVtLCAnZGF5JykudG9EYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgIGxldCBmZztcbiAgICB0aGlzLndlZWtkYXlzLmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgZmcgPSB0aGlzLmZiLmdyb3VwKFxuICAgICAgICB7XG4gICAgICAgICAgb3BlbjogW3t2YWx1ZTogdGhpcy5idXNpbmVzc0hvdXJzW2luZGV4XS5vcGVuLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZH1dLFxuICAgICAgICAgIGZyb206IFt7dmFsdWU6IHRoaXMuYnVzaW5lc3NIb3Vyc1tpbmRleF0uZnJvbSwgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWR9XSxcbiAgICAgICAgICB0bzogW3t2YWx1ZTogdGhpcy5idXNpbmVzc0hvdXJzW2luZGV4XS50bywgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWR9XSxcbiAgICAgICAgfSxcbiAgICAgICAge3ZhbGlkYXRvcnM6IGRheVNldHRpbmdzVmFsaWRhdG9yfVxuICAgICAgKTtcbiAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKFN0cmluZyhpbmRleCksIGZnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGltZU9wdGlvbnMoc3RhcnRUaW1lOiBzdHJpbmcsIG1heFRpbWU6IHN0cmluZywgaW50ZXJ2YWw6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdGFydCA9IG1vbWVudChzdGFydFRpbWUsICdISDptbScpO1xuICAgIGNvbnN0IG1heCA9IG1vbWVudChtYXhUaW1lLCAnSEg6bW0nKTtcblxuICAgIGNvbnN0IHRpbWVPcHRpb25zID0gW107XG4gICAgd2hpbGUgKHN0YXJ0IDw9IG1heCkge1xuICAgICAgdGltZU9wdGlvbnMucHVzaChtb21lbnQoc3RhcnQpLmZvcm1hdCh0aGlzLnRpbWVGb3JtYXQpKTtcbiAgICAgIHN0YXJ0LmFkZChpbnRlcnZhbCwgJ21pbnV0ZXMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZU9wdGlvbnM7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19