@nova-ui/bits
Version:
SolarWinds Nova Framework
130 lines • 24.9 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewEncapsulation, } from "@angular/core";
import _cloneDeep from "lodash/cloneDeep";
import moment from "moment/moment";
import { TimeframeService } from "./services/timeframe.service";
import * as i0 from "@angular/core";
import * as i1 from "./services/timeframe.service";
import * as i2 from "../date-time-picker/date-time-picker.component";
// <example-url>./../examples/index.html#/time-frame-picker</example-url>
export class TimeFramePickerComponent {
constructor(timeFrameService, changeDetector) {
this.timeFrameService = timeFrameService;
this.changeDetector = changeDetector;
/** callback to be invoked on model change */
this.changed = new EventEmitter();
}
ngOnChanges(changes) {
if (changes["startModel"]) {
this.model = TimeframeService.cloneTimeFrame(this.startModel);
this.validateCombination();
}
}
ngOnInit() {
if (this.startModel) {
this.model = TimeframeService.cloneTimeFrame(this.startModel);
this.validateCombination();
}
}
selectPreset(key, value) {
const timeframe = this.timeFrameService.getTimeframe(value.startDatetimePattern, value.endDatetimePattern);
timeframe.selectedPresetId = key;
this.model = timeframe;
}
isPresetSelected(key) {
return this.model && this.model.selectedPresetId === key;
}
onChangeInternalStart(event) {
this.model.startDatetime = event;
this.onChangeInternal();
}
onChangeInternalEnd(event) {
this.model.endDatetime = event;
this.onChangeInternal();
}
onBlurInternal() {
this.validateCombination();
if (!this.model.startDatetime || !this.model.endDatetime) {
this.model = _cloneDeep(this.modelDefault);
}
else {
this.modelDefault = _cloneDeep(this.model);
}
this.isFocused = false;
}
onFocusInternal() {
this.modelDefault = _cloneDeep(this.model);
this.isFocused = true;
}
validateCombination() {
if (this.model.startDatetime && this.model.endDatetime) {
if (this.model.startDatetime >= this.model.endDatetime) {
this.model.endDatetime = moment(this.model.startDatetime.valueOf() + this.distanceToEndDate);
this.model.selectedPresetId = undefined;
this.model.title = undefined;
}
else {
this.updateDistanceToEndDate(this.model.startDatetime, this.model.endDatetime);
}
}
}
updateDistanceToEndDate(newStartDatetime, newEndDatetime) {
const startMoment = moment(newStartDatetime);
const endMoment = moment(newEndDatetime);
if (startMoment.isValid() && endMoment.isValid()) {
this.distanceToEndDate =
newEndDatetime.valueOf() - newStartDatetime.valueOf();
}
}
onChangeInternal() {
if (!this.isFocused) {
this.validateCombination();
}
// clear 'selectedPresetId' and 'title' values
if (this.model.selectedPresetId) {
const timeFrame = this.timeFrameService.getTimeframeByPresetId(this.model.selectedPresetId);
if (!this.model.startDatetime ||
!this.model.endDatetime ||
!this.timeFrameService.isEqualDuration(this.model, timeFrame)) {
this.model.selectedPresetId = undefined;
this.model.title = undefined;
}
}
this.changed.emit(this.model);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeFramePickerComponent, deps: [{ token: i1.TimeframeService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TimeFramePickerComponent, selector: "nui-time-frame-picker", inputs: { minDate: "minDate", maxDate: "maxDate", startModel: "startModel", appendToBody: "appendToBody" }, outputs: { changed: "changed" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"nui-time-frame-picker\">\n <div class=\"nui-time-frame-picker__date-times\">\n <label class=\"nui-time-frame-picker__label\" i18n>Start</label>\n <span\n class=\"nui-time-frame-picker__date-time nui-time-frame-picker__date-time_start\"\n >\n <nui-date-time-picker\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [model]=\"model.startDatetime\"\n (modelChanged)=\"onChangeInternalStart($event)\"\n (focus)=\"onFocusInternal()\"\n (blur)=\"onBlurInternal()\"\n [appendToBody]=\"appendToBody\"\n ></nui-date-time-picker>\n </span>\n <label class=\"nui-time-frame-picker__label\" i18n>End</label>\n <span\n class=\"nui-time-frame-picker__date-time nui-time-frame-picker__date-time_end\"\n >\n <nui-date-time-picker\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [model]=\"model.endDatetime\"\n (modelChanged)=\"onChangeInternalEnd($event)\"\n (focus)=\"onFocusInternal()\"\n (blur)=\"onBlurInternal()\"\n [appendToBody]=\"appendToBody\"\n ></nui-date-time-picker>\n </span>\n </div>\n</div>\n", styles: [".nui-time-frame-picker__date-time{display:flex}.nui-time-frame-picker__date-time_start{margin-bottom:15px}.nui-time-frame-picker__date-time_end{padding-bottom:10px}\n"], dependencies: [{ kind: "component", type: i2.DateTimePickerComponent, selector: "nui-date-time-picker", inputs: ["maxDate", "minDate", "displayMode", "isDisabled", "initEmpty", "handleTimezone", "appendToBody", "ariaLabel", "model"], outputs: ["modelChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeFramePickerComponent, decorators: [{
type: Component,
args: [{ selector: "nui-time-frame-picker", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"nui-time-frame-picker\">\n <div class=\"nui-time-frame-picker__date-times\">\n <label class=\"nui-time-frame-picker__label\" i18n>Start</label>\n <span\n class=\"nui-time-frame-picker__date-time nui-time-frame-picker__date-time_start\"\n >\n <nui-date-time-picker\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [model]=\"model.startDatetime\"\n (modelChanged)=\"onChangeInternalStart($event)\"\n (focus)=\"onFocusInternal()\"\n (blur)=\"onBlurInternal()\"\n [appendToBody]=\"appendToBody\"\n ></nui-date-time-picker>\n </span>\n <label class=\"nui-time-frame-picker__label\" i18n>End</label>\n <span\n class=\"nui-time-frame-picker__date-time nui-time-frame-picker__date-time_end\"\n >\n <nui-date-time-picker\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [model]=\"model.endDatetime\"\n (modelChanged)=\"onChangeInternalEnd($event)\"\n (focus)=\"onFocusInternal()\"\n (blur)=\"onBlurInternal()\"\n [appendToBody]=\"appendToBody\"\n ></nui-date-time-picker>\n </span>\n </div>\n</div>\n", styles: [".nui-time-frame-picker__date-time{display:flex}.nui-time-frame-picker__date-time_start{margin-bottom:15px}.nui-time-frame-picker__date-time_end{padding-bottom:10px}\n"] }]
}], ctorParameters: () => [{ type: i1.TimeframeService }, { type: i0.ChangeDetectorRef }], propDecorators: { minDate: [{
type: Input
}], maxDate: [{
type: Input
}], startModel: [{
type: Input
}], appendToBody: [{
type: Input
}], changed: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1mcmFtZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90aW1lLWZyYW1lLXBpY2tlci90aW1lLWZyYW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3RpbWUtZnJhbWUtcGlja2VyL3RpbWUtZnJhbWUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04saUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sVUFBVSxNQUFNLGtCQUFrQixDQUFDO0FBRTFDLE9BQU8sTUFBTSxNQUFNLGVBQWUsQ0FBQztBQUduQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7OztBQUVoRSx5RUFBeUU7QUFTekUsTUFBTSxPQUFPLHdCQUF3QjtJQW9CakMsWUFDWSxnQkFBa0MsRUFDbkMsY0FBaUM7UUFEaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNuQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFWNUMsNkNBQTZDO1FBQzVCLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO0lBVXZELENBQUM7SUFFRyxX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Q3JDLGswQ0FnQ0E7OzRGRGVhLHdCQUF3QjtrQkFQcEMsU0FBUzsrQkFDSSx1QkFBdUIsaUJBR2xCLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07cUhBSXRDLE9BQU87c0JBQWYsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtXLE9BQU87c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IF9jbG9uZURlZXAgZnJvbSBcImxvZGFzaC9jbG9uZURlZXBcIjtcbmltcG9ydCB7IE1vbWVudCB9IGZyb20gXCJtb21lbnQvbW9tZW50XCI7XG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnQvbW9tZW50XCI7XG5cbmltcG9ydCB7IElUaW1lZnJhbWUsIElUaW1lRnJhbWVQcmVzZXQgfSBmcm9tIFwiLi9wdWJsaWMtYXBpXCI7XG5pbXBvcnQgeyBUaW1lZnJhbWVTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvdGltZWZyYW1lLnNlcnZpY2VcIjtcblxuLy8gPGV4YW1wbGUtdXJsPi4vLi4vZXhhbXBsZXMvaW5kZXguaHRtbCMvdGltZS1mcmFtZS1waWNrZXI8L2V4YW1wbGUtdXJsPlxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJudWktdGltZS1mcmFtZS1waWNrZXJcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL3RpbWUtZnJhbWUtcGlja2VyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL3RpbWUtZnJhbWUtcGlja2VyLmNvbXBvbmVudC5sZXNzXCJdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVGcmFtZVBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgICAvKiogIGVhcmxpZXN0IHNlbGVjdGFibGUgZGF0ZSAqL1xuICAgIEBJbnB1dCgpIG1pbkRhdGU6IE1vbWVudDtcbiAgICAvKiogIGxhdGVzdCBzZWxlY3RhYmxlIGRhdGUgKi9cbiAgICBASW5wdXQoKSBtYXhEYXRlOiBNb21lbnQ7XG4gICAgLyoqIG1vZGVsIG9mIHRpbWVwaWNrZXIgKi9cbiAgICBASW5wdXQoKSBzdGFydE1vZGVsOiBJVGltZWZyYW1lO1xuICAgIC8qKiBBbGxvd3MgcG9wdXAgYm94IHRvIGJlIGF0dGFjaGVkIHRvIGRvY3VtZW50LmJvZHkgKi9cbiAgICBASW5wdXQoKSBhcHBlbmRUb0JvZHk6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgbW9kZWw6IElUaW1lZnJhbWU7XG5cbiAgICAvKiogY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBtb2RlbCBjaGFuZ2UgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElUaW1lZnJhbWU+KCk7XG5cbiAgICBwdWJsaWMgaXNGb2N1c2VkOiBib29sZWFuO1xuICAgIHB1YmxpYyBtb2RlbERlZmF1bHQ6IGFueTtcblxuICAgIHB1YmxpYyBkaXN0YW5jZVRvRW5kRGF0ZTogbnVtYmVyOyAvLyB0byBrZWVwIGRpc3RhbmNlIGJldHdlZW4gc3RhcnQgYW5kIGVuZC1kYXRlXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSB0aW1lRnJhbWVTZXJ2aWNlOiBUaW1lZnJhbWVTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmXG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1tcInN0YXJ0TW9kZWxcIl0pIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSBUaW1lZnJhbWVTZXJ2aWNlLmNsb25lVGltZUZyYW1lKHRoaXMuc3RhcnRNb2RlbCk7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlQ29tYmluYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbCA9IFRpbWVmcmFtZVNlcnZpY2UuY2xvbmVUaW1lRnJhbWUodGhpcy5zdGFydE1vZGVsKTtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVDb21iaW5hdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdFByZXNldChrZXk6IHN0cmluZywgdmFsdWU6IElUaW1lRnJhbWVQcmVzZXQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGltZWZyYW1lID0gdGhpcy50aW1lRnJhbWVTZXJ2aWNlLmdldFRpbWVmcmFtZShcbiAgICAgICAgICAgIHZhbHVlLnN0YXJ0RGF0ZXRpbWVQYXR0ZXJuLFxuICAgICAgICAgICAgdmFsdWUuZW5kRGF0ZXRpbWVQYXR0ZXJuXG4gICAgICAgICk7XG4gICAgICAgIHRpbWVmcmFtZS5zZWxlY3RlZFByZXNldElkID0ga2V5O1xuICAgICAgICB0aGlzLm1vZGVsID0gdGltZWZyYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1ByZXNldFNlbGVjdGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwuc2VsZWN0ZWRQcmVzZXRJZCA9PT0ga2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNoYW5nZUludGVybmFsU3RhcnQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZGVsLnN0YXJ0RGF0ZXRpbWUgPSBldmVudDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUludGVybmFsKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2hhbmdlSW50ZXJuYWxFbmQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZGVsLmVuZERhdGV0aW1lID0gZXZlbnQ7XG4gICAgICAgIHRoaXMub25DaGFuZ2VJbnRlcm5hbCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXJJbnRlcm5hbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUNvbWJpbmF0aW9uKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLnN0YXJ0RGF0ZXRpbWUgfHwgIXRoaXMubW9kZWwuZW5kRGF0ZXRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSBfY2xvbmVEZWVwKHRoaXMubW9kZWxEZWZhdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWxEZWZhdWx0ID0gX2Nsb25lRGVlcCh0aGlzLm1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZvY3VzSW50ZXJuYWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kZWxEZWZhdWx0ID0gX2Nsb25lRGVlcCh0aGlzLm1vZGVsKTtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmFsaWRhdGVDb21iaW5hdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZWwuc3RhcnREYXRldGltZSAmJiB0aGlzLm1vZGVsLmVuZERhdGV0aW1lKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5zdGFydERhdGV0aW1lID49IHRoaXMubW9kZWwuZW5kRGF0ZXRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmVuZERhdGV0aW1lID0gbW9tZW50KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnN0YXJ0RGF0ZXRpbWUudmFsdWVPZigpICsgdGhpcy5kaXN0YW5jZVRvRW5kRGF0ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZFByZXNldElkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwudGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzdGFuY2VUb0VuZERhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc3RhcnREYXRldGltZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5lbmREYXRldGltZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZURpc3RhbmNlVG9FbmREYXRlKFxuICAgICAgICBuZXdTdGFydERhdGV0aW1lOiBEYXRlIHwgTW9tZW50LFxuICAgICAgICBuZXdFbmREYXRldGltZTogRGF0ZSB8IE1vbWVudFxuICAgICkge1xuICAgICAgICBjb25zdCBzdGFydE1vbWVudCA9IG1vbWVudChuZXdTdGFydERhdGV0aW1lKTtcbiAgICAgICAgY29uc3QgZW5kTW9tZW50ID0gbW9tZW50KG5ld0VuZERhdGV0aW1lKTtcblxuICAgICAgICBpZiAoc3RhcnRNb21lbnQuaXNWYWxpZCgpICYmIGVuZE1vbWVudC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzdGFuY2VUb0VuZERhdGUgPVxuICAgICAgICAgICAgICAgIG5ld0VuZERhdGV0aW1lLnZhbHVlT2YoKSAtIG5ld1N0YXJ0RGF0ZXRpbWUudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZUludGVybmFsKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlQ29tYmluYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjbGVhciAnc2VsZWN0ZWRQcmVzZXRJZCcgYW5kICd0aXRsZScgdmFsdWVzXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLnNlbGVjdGVkUHJlc2V0SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVGcmFtZSA9IHRoaXMudGltZUZyYW1lU2VydmljZS5nZXRUaW1lZnJhbWVCeVByZXNldElkKFxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRQcmVzZXRJZFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICF0aGlzLm1vZGVsLnN0YXJ0RGF0ZXRpbWUgfHxcbiAgICAgICAgICAgICAgICAhdGhpcy5tb2RlbC5lbmREYXRldGltZSB8fFxuICAgICAgICAgICAgICAgICF0aGlzLnRpbWVGcmFtZVNlcnZpY2UuaXNFcXVhbER1cmF0aW9uKHRoaXMubW9kZWwsIHRpbWVGcmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRQcmVzZXRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnRpdGxlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlZC5lbWl0KHRoaXMubW9kZWwpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJudWktdGltZS1mcmFtZS1waWNrZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwibnVpLXRpbWUtZnJhbWUtcGlja2VyX19kYXRlLXRpbWVzXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm51aS10aW1lLWZyYW1lLXBpY2tlcl9fbGFiZWxcIiBpMThuPlN0YXJ0PC9sYWJlbD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwibnVpLXRpbWUtZnJhbWUtcGlja2VyX19kYXRlLXRpbWUgbnVpLXRpbWUtZnJhbWUtcGlja2VyX19kYXRlLXRpbWVfc3RhcnRcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bnVpLWRhdGUtdGltZS1waWNrZXJcbiAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcbiAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCJcbiAgICAgICAgICAgICAgICBbbW9kZWxdPVwibW9kZWwuc3RhcnREYXRldGltZVwiXG4gICAgICAgICAgICAgICAgKG1vZGVsQ2hhbmdlZCk9XCJvbkNoYW5nZUludGVybmFsU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXNJbnRlcm5hbCgpXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkJsdXJJbnRlcm5hbCgpXCJcbiAgICAgICAgICAgICAgICBbYXBwZW5kVG9Cb2R5XT1cImFwcGVuZFRvQm9keVwiXG4gICAgICAgICAgICA+PC9udWktZGF0ZS10aW1lLXBpY2tlcj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJudWktdGltZS1mcmFtZS1waWNrZXJfX2xhYmVsXCIgaTE4bj5FbmQ8L2xhYmVsPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJudWktdGltZS1mcmFtZS1waWNrZXJfX2RhdGUtdGltZSBudWktdGltZS1mcmFtZS1waWNrZXJfX2RhdGUtdGltZV9lbmRcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bnVpLWRhdGUtdGltZS1waWNrZXJcbiAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJtaW5EYXRlXCJcbiAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCJcbiAgICAgICAgICAgICAgICBbbW9kZWxdPVwibW9kZWwuZW5kRGF0ZXRpbWVcIlxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZWQpPVwib25DaGFuZ2VJbnRlcm5hbEVuZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1c0ludGVybmFsKClcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1ckludGVybmFsKClcIlxuICAgICAgICAgICAgICAgIFthcHBlbmRUb0JvZHldPVwiYXBwZW5kVG9Cb2R5XCJcbiAgICAgICAgICAgID48L251aS1kYXRlLXRpbWUtcGlja2VyPlxuICAgICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==