cfc-ds
Version:
Design System do Conselho Federal de Contabilidade baseado no govbr-ds
260 lines • 32.4 kB
JavaScript
import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { DateTimePickerMode } from '../../enums/date-time-picker.enum';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../icon/icon.component";
export class DatetimerPickerComponent {
ngZone;
label = 'Data e Hora';
mode = DateTimePickerMode.DateTime;
rangeSelection = false;
minDate = null;
maxDate = null;
disabled = false;
dateTimeChange = new EventEmitter();
pickerRoot;
static idCounter = 0;
uniqueId = ++DatetimerPickerComponent.idCounter;
inputId = `datetimepicker-input-${this.uniqueId}`;
buttonId = `${this.inputId}-btn`;
innerValue = null;
instance;
loadInterval;
loadTimeout;
onChange = () => { };
onTouched = () => { };
get dataMode() {
return this.rangeSelection ? 'range' : 'single';
}
get dataType() {
switch (this.mode) {
case DateTimePickerMode.Time:
return 'time';
case DateTimePickerMode.DateTime:
return 'datetime-local';
default:
return 'text';
}
}
get inputType() {
return this.dataType;
}
get iconName() {
return this.mode === DateTimePickerMode.Time ? 'clock' : 'calendar-alt';
}
get ariaLabel() {
return this.mode === DateTimePickerMode.Time
? 'Abrir Timepicker'
: 'Abrir Datepicker';
}
get placeholder() {
if (this.mode === DateTimePickerMode.Date) {
return this.rangeSelection
? 'exemplo: 02/02/2024 até 03/02/2025'
: 'exemplo: 02/02/2024';
}
if (this.mode === DateTimePickerMode.Time) {
return 'exemplo: 02:40';
}
return 'exemplo: 02/02/2024 02:02';
}
constructor(ngZone) {
this.ngZone = ngZone;
}
ngAfterViewInit() {
this.ensureCoreLoaded();
}
ngOnChanges(changes) {
if (this.pickerRoot &&
(changes['mode'] ||
changes['rangeSelection'] ||
changes['minDate'] ||
changes['maxDate'])) {
this.initPicker();
}
}
ngOnDestroy() {
this.clearLoadTimer();
this.destroyPicker();
}
clearLoadTimer() {
if (this.loadInterval) {
window.clearInterval(this.loadInterval);
this.loadInterval = undefined;
}
if (this.loadTimeout) {
window.clearTimeout(this.loadTimeout);
this.loadTimeout = undefined;
}
}
writeValue(value) {
this.innerValue = value || null;
if (this.instance) {
this.setPickerValue(this.innerValue, false);
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
if (this.instance && this.instance.calendar) {
this.instance.calendar.set('allowInput', !isDisabled);
}
}
ensureCoreLoaded() {
if (typeof window === 'undefined') {
return;
}
if (this.getCore()) {
this.initPicker();
return;
}
this.loadInterval = window.setInterval(() => {
if (this.getCore()) {
this.clearLoadTimer();
this.initPicker();
}
}, 100);
this.loadTimeout = window.setTimeout(() => this.clearLoadTimer(), 10000);
}
getCore() {
return window.core;
}
initPicker() {
const core = this.getCore();
if (!core || !core.BRDateTimePicker || !this.pickerRoot) {
return;
}
const root = this.pickerRoot.nativeElement;
const existingFlatpickr = root._flatpickr;
if (existingFlatpickr && typeof existingFlatpickr.destroy === 'function') {
existingFlatpickr.destroy();
}
this.destroyPicker();
const config = {
onChange: (selectedDates) => {
this.handleSelection(selectedDates);
},
};
if (this.minDate) {
config.minDate = this.minDate;
}
if (this.maxDate) {
config.maxDate = this.maxDate;
}
if (this.innerValue) {
config.defaultDate = this.buildDefaultDate(this.innerValue);
}
try {
this.instance = new core.BRDateTimePicker('br-datetimepicker', root, config);
if (this.disabled) {
this.instance.calendar.set('allowInput', false);
}
}
catch (error) {
console.error('Erro ao inicializar BRDateTimePicker', error);
}
}
buildDefaultDate(value) {
if (!value) {
return undefined;
}
if (this.rangeSelection && this.isDateTimeRange(value)) {
if (value.start && value.end) {
return [value.start, value.end];
}
if (value.start) {
return [value.start];
}
return undefined;
}
if (value instanceof Date) {
return value;
}
return undefined;
}
setPickerValue(value, triggerChange = true) {
if (!this.instance || !this.instance.calendar) {
return;
}
const date = this.buildDefaultDate(value);
if (date) {
this.instance.calendar.setDate(date, triggerChange);
}
else {
this.instance.calendar.setDate([], false);
}
}
handleSelection(selectedDates) {
this.ngZone.run(() => {
let value = null;
if (this.rangeSelection) {
if (selectedDates.length > 0) {
value = {
start: selectedDates[0],
end: selectedDates[1] || null,
};
}
}
else {
value = selectedDates[0] || null;
}
this.innerValue = value;
this.onChange(value);
this.onTouched();
this.dateTimeChange.emit(value);
});
}
destroyPicker() {
if (this.instance &&
this.instance.calendar &&
typeof this.instance.calendar.destroy === 'function') {
this.instance.calendar.destroy();
this.instance = null;
}
}
isDateTimeRange(value) {
return value && 'start' in value;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatetimerPickerComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatetimerPickerComponent, selector: "cfc-datetimer-picker", inputs: { label: "label", mode: "mode", rangeSelection: "rangeSelection", minDate: "minDate", maxDate: "maxDate", disabled: "disabled" }, outputs: { dateTimeChange: "dateTimeChange" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: DatetimerPickerComponent,
multi: true,
},
], viewQueries: [{ propertyName: "pickerRoot", first: true, predicate: ["pickerRoot"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"br-datetimepicker\"\r\n [attr.data-mode]=\"dataMode\"\r\n [attr.data-type]=\"dataType\"\r\n #pickerRoot>\r\n <div class=\"br-input has-icon\">\r\n <label *ngIf=\"label\" [for]=\"inputId\">{{ label }}</label>\r\n <input\r\n [id]=\"inputId\"\r\n [type]=\"inputType\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"disabled\"\r\n data-input=\"data-input\"\r\n />\r\n <button\r\n class=\"br-button circle small\"\r\n type=\"button\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.id]=\"buttonId\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n data-toggle=\"data-toggle\"\r\n [disabled]=\"disabled\">\r\n <cfc-icon [iconName]=\"iconName\" [familyName]=\"'fas'\" [size]=\"'14px'\"></cfc-icon>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%}.br-datetimepicker{position:relative}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IconComponent, selector: "cfc-icon", inputs: ["iconName", "familyName", "className", "size", "color"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatetimerPickerComponent, decorators: [{
type: Component,
args: [{ selector: 'cfc-datetimer-picker', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: DatetimerPickerComponent,
multi: true,
},
], template: "<div class=\"br-datetimepicker\"\r\n [attr.data-mode]=\"dataMode\"\r\n [attr.data-type]=\"dataType\"\r\n #pickerRoot>\r\n <div class=\"br-input has-icon\">\r\n <label *ngIf=\"label\" [for]=\"inputId\">{{ label }}</label>\r\n <input\r\n [id]=\"inputId\"\r\n [type]=\"inputType\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"disabled\"\r\n data-input=\"data-input\"\r\n />\r\n <button\r\n class=\"br-button circle small\"\r\n type=\"button\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.id]=\"buttonId\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n data-toggle=\"data-toggle\"\r\n [disabled]=\"disabled\">\r\n <cfc-icon [iconName]=\"iconName\" [familyName]=\"'fas'\" [size]=\"'14px'\"></cfc-icon>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%}.br-datetimepicker{position:relative}\n"] }]
}], ctorParameters: () => [{ type: i0.NgZone }], propDecorators: { label: [{
type: Input
}], mode: [{
type: Input
}], rangeSelection: [{
type: Input
}], minDate: [{
type: Input
}], maxDate: [{
type: Input
}], disabled: [{
type: Input
}], dateTimeChange: [{
type: Output
}], pickerRoot: [{
type: ViewChild,
args: ['pickerRoot', { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGV0aW1lci1waWNrZXIvZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2RhdGV0aW1lci1waWNrZXIvZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFNBQVMsR0FPVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7QUFldkUsTUFBTSxPQUFPLHdCQUF3QjtJQXFFZjtJQWxFWCxLQUFLLEdBQVcsYUFBYSxDQUFDO0lBQzlCLElBQUksR0FBdUIsa0JBQWtCLENBQUMsUUFBUSxDQUFDO0lBQ3ZELGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMsT0FBTyxHQUFnQixJQUFJLENBQUM7SUFDNUIsT0FBTyxHQUFnQixJQUFJLENBQUM7SUFDNUIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUV6QixjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7SUFHM0UsVUFBVSxDQUEyQjtJQUU3QixNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNaLFFBQVEsR0FBRyxFQUFFLHdCQUF3QixDQUFDLFNBQVMsQ0FBQztJQUVqRSxPQUFPLEdBQUcsd0JBQXdCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsRCxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxN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cHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgTmdab25lLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVUaW1lUGlja2VyTW9kZSB9IGZyb20gJy4uLy4uL2VudW1zL2RhdGUtdGltZS1waWNrZXIuZW51bSc7XHJcbmltcG9ydCB7IERhdGVUaW1lUmFuZ2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0ZS10aW1lLXJhbmdlLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2ZjLWRhdGV0aW1lci1waWNrZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRldGltZXItcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZGF0ZXRpbWVyLXBpY2tlci5jb21wb25lbnQuc2NzcycsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogRGF0ZXRpbWVyUGlja2VyQ29tcG9uZW50LFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGV0aW1lclBpY2tlckNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yXHJcbntcclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJ0RhdGEgZSBIb3JhJztcclxuICBASW5wdXQoKSBtb2RlOiBEYXRlVGltZVBpY2tlck1vZGUgPSBEYXRlVGltZVBpY2tlck1vZGUuRGF0ZVRpbWU7XHJcbiAgQElucHV0KCkgcmFuZ2VTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBkYXRlVGltZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IERhdGVUaW1lUmFuZ2UgfCBudWxsPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdwaWNrZXJSb290JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwaWNrZXJSb290ITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGlkQ291bnRlciA9IDA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1bmlxdWVJZCA9ICsrRGF0ZXRpbWVyUGlja2VyQ29tcG9uZW50LmlkQ291bnRlcjtcclxuXHJcbiAgaW5wdXRJZCA9IGBkYXRldGltZXBpY2tlci1pbnB1dC0ke3RoaXMudW5pcXVlSWR9YDtcclxuICBidXR0b25JZCA9IGAke3RoaXMuaW5wdXRJZH0tYnRuYDtcclxuXHJcbiAgcHJpdmF0ZSBpbm5lclZhbHVlOiBEYXRlIHwgRGF0ZVRpbWVSYW5nZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgaW5zdGFuY2U6IGFueTtcclxuICBwcml2YXRlIGxvYWRJbnRlcnZhbDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgbG9hZFRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IERhdGUgfCBEYXRlVGltZVJhbmdlIHwgbnVsbCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIGdldCBkYXRhTW9kZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucmFuZ2VTZWxlY3Rpb24gPyAncmFuZ2UnIDogJ3NpbmdsZSc7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0YVR5cGUoKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XHJcbiAgICAgIGNhc2UgRGF0ZVRpbWVQaWNrZXJNb2RlLlRpbWU6XHJcbiAgICAgICAgcmV0dXJuICd0aW1lJztcclxuICAgICAgY2FzZSBEYXRlVGltZVBpY2tlck1vZGUuRGF0ZVRpbWU6XHJcbiAgICAgICAgcmV0dXJuICdkYXRldGltZS1sb2NhbCc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICd0ZXh0JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBpbnB1dFR5cGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFUeXBlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGljb25OYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBEYXRlVGltZVBpY2tlck1vZGUuVGltZSA/ICdjbG9jaycgOiAnY2FsZW5kYXItYWx0JztcclxuICB9XHJcblxyXG4gIGdldCBhcmlhTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IERhdGVUaW1lUGlja2VyTW9kZS5UaW1lXHJcbiAgICAgID8gJ0FicmlyIFRpbWVwaWNrZXInXHJcbiAgICAgIDogJ0FicmlyIERhdGVwaWNrZXInO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSBEYXRlVGltZVBpY2tlck1vZGUuRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yYW5nZVNlbGVjdGlvblxyXG4gICAgICAgID8gJ2V4ZW1wbG86IDAyLzAyLzIwMjQgYXTDqSAwMy8wMi8yMDI1J1xyXG4gICAgICAgIDogJ2V4ZW1wbG86IDAyLzAyLzIwMjQnO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gRGF0ZVRpbWVQaWNrZXJNb2RlLlRpbWUpIHtcclxuICAgICAgcmV0dXJuICdleGVtcGxvOiAwMjo0MCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ2V4ZW1wbG86IDAyLzAyLzIwMjQgMDI6MDInO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge31cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5lbnN1cmVDb3JlTG9hZGVkKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMucGlja2VyUm9vdCAmJlxyXG4gICAgICAoY2hhbmdlc1snbW9kZSddIHx8XHJcbiAgICAgICAgY2hhbmdlc1sncmFuZ2VTZWxlY3Rpb24nXSB8fFxyXG4gICAgICAgIGNoYW5nZXNbJ21pbkRhdGUnXSB8fFxyXG4gICAgICAgIGNoYW5nZXNbJ21heERhdGUnXSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLmluaXRQaWNrZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhckxvYWRUaW1lcigpO1xyXG4gICAgdGhpcy5kZXN0cm95UGlja2VyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyTG9hZFRpbWVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubG9hZEludGVydmFsKSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMubG9hZEludGVydmFsKTtcclxuICAgICAgdGhpcy5sb2FkSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sb2FkVGltZW91dCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubG9hZFRpbWVvdXQpO1xyXG4gICAgICB0aGlzLmxvYWRUaW1lb3V0ID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZSB8IERhdGVUaW1lUmFuZ2UgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLmlubmVyVmFsdWUgPSB2YWx1ZSB8fCBudWxsO1xyXG4gICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5zZXRQaWNrZXJWYWx1ZSh0aGlzLmlubmVyVmFsdWUsIGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogRGF0ZSB8IERhdGVUaW1lUmFuZ2UgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLmluc3RhbmNlLmNhbGVuZGFyKSB7XHJcbiAgICAgIHRoaXMuaW5zdGFuY2UuY2FsZW5kYXIuc2V0KCdhbGxvd0lucHV0JywgIWlzRGlzYWJsZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbnN1cmVDb3JlTG9hZGVkKCk6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmdldENvcmUoKSkge1xyXG4gICAgICB0aGlzLmluaXRQaWNrZXIoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2FkSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5nZXRDb3JlKCkpIHtcclxuICAgICAgICB0aGlzLmNsZWFyTG9hZFRpbWVyKCk7XHJcbiAgICAgICAgdGhpcy5pbml0UGlja2VyKCk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwMCk7XHJcbiAgICB0aGlzLmxvYWRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbGVhckxvYWRUaW1lcigpLCAxMDAwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvcmUoKTogYW55IHtcclxuICAgIHJldHVybiAod2luZG93IGFzIGFueSkuY29yZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdFBpY2tlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvcmUgPSB0aGlzLmdldENvcmUoKTtcclxuICAgIGlmICghY29yZSB8fCAhY29yZS5CUkRhdGVUaW1lUGlja2VyIHx8ICF0aGlzLnBpY2tlclJvb3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnBpY2tlclJvb3QubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGV4aXN0aW5nRmxhdHBpY2tyID0gKHJvb3QgYXMgYW55KS5fZmxhdHBpY2tyO1xyXG4gICAgaWYgKGV4aXN0aW5nRmxhdHBpY2tyICYmIHR5cGVvZiBleGlzdGluZ0ZsYXRwaWNrci5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGV4aXN0aW5nRmxhdHBpY2tyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRlc3Ryb3lQaWNrZXIoKTtcclxuXHJcbiAgICBjb25zdCBjb25maWc6IGFueSA9IHtcclxuICAgICAgb25DaGFuZ2U6IChzZWxlY3RlZERhdGVzOiBEYXRlW10pID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbihzZWxlY3RlZERhdGVzKTtcclxuICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMubWluRGF0ZSkge1xyXG4gICAgICBjb25maWcubWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1heERhdGUpIHtcclxuICAgICAgY29uZmlnLm1heERhdGUgPSB0aGlzLm1heERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaW5uZXJWYWx1ZSkge1xyXG4gICAgICBjb25maWcuZGVmYXVsdERhdGUgPSB0aGlzLmJ1aWxkRGVmYXVsdERhdGUodGhpcy5pbm5lclZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmluc3RhbmNlID0gbmV3IGNvcmUuQlJEYXRlVGltZVBpY2tlcihcclxuICAgICAgICAnYnItZGF0ZXRpbWVwaWNrZXInLFxyXG4gICAgICAgIHJvb3QsXHJcbiAgICAgICAgY29uZmlnXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5jYWxlbmRhci5zZXQoJ2FsbG93SW5wdXQnLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm8gYW8gaW5pY2lhbGl6YXIgQlJEYXRlVGltZVBpY2tlcicsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0RGF0ZShcclxuICAgIHZhbHVlOiBEYXRlIHwgRGF0ZVRpbWVSYW5nZSB8IG51bGxcclxuICApOiBEYXRlIHwgRGF0ZVtdIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnJhbmdlU2VsZWN0aW9uICYmIHRoaXMuaXNEYXRlVGltZVJhbmdlKHZhbHVlKSkge1xyXG4gICAgICBpZiAodmFsdWUuc3RhcnQgJiYgdmFsdWUuZW5kKSB7XHJcbiAgICAgICAgcmV0dXJuIFt2YWx1ZS5zdGFydCwgdmFsdWUuZW5kXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsdWUuc3RhcnQpIHtcclxuICAgICAgICByZXR1cm4gW3ZhbHVlLnN0YXJ0XTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRQaWNrZXJWYWx1ZShcclxuICAgIHZhbHVlOiBEYXRlIHwgRGF0ZVRpbWVSYW5nZSB8IG51bGwsXHJcbiAgICB0cmlnZ2VyQ2hhbmdlID0gdHJ1ZVxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmluc3RhbmNlIHx8ICF0aGlzLmluc3RhbmNlLmNhbGVuZGFyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmJ1aWxkRGVmYXVsdERhdGUodmFsdWUpO1xyXG4gICAgaWYgKGRhdGUpIHtcclxuICAgICAgdGhpcy5pbnN0YW5jZS5jYWxlbmRhci5zZXREYXRlKGRhdGUsIHRyaWdnZXJDaGFuZ2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnN0YW5jZS5jYWxlbmRhci5zZXREYXRlKFtdLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVNlbGVjdGlvbihzZWxlY3RlZERhdGVzOiBEYXRlW10pOiB2b2lkIHtcclxuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgIGxldCB2YWx1ZTogRGF0ZSB8IERhdGVUaW1lUmFuZ2UgfCBudWxsID0gbnVsbDtcclxuICAgICAgaWYgKHRoaXMucmFuZ2VTZWxlY3Rpb24pIHtcclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHtcclxuICAgICAgICAgICAgc3RhcnQ6IHNlbGVjdGVkRGF0ZXNbMF0sXHJcbiAgICAgICAgICAgIGVuZDogc2VsZWN0ZWREYXRlc1sxXSB8fCBudWxsLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFsdWUgPSBzZWxlY3RlZERhdGVzWzBdIHx8IG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaW5uZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICAgICAgdGhpcy5kYXRlVGltZUNoYW5nZS5lbWl0KHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95UGlja2VyKCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmluc3RhbmNlICYmXHJcbiAgICAgIHRoaXMuaW5zdGFuY2UuY2FsZW5kYXIgJiZcclxuICAgICAgdHlwZW9mIHRoaXMuaW5zdGFuY2UuY2FsZW5kYXIuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJ1xyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuaW5zdGFuY2UuY2FsZW5kYXIuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLmluc3RhbmNlID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNEYXRlVGltZVJhbmdlKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBEYXRlVGltZVJhbmdlIHtcclxuICAgIHJldHVybiB2YWx1ZSAmJiAnc3RhcnQnIGluIHZhbHVlO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYnItZGF0ZXRpbWVwaWNrZXJcIlxyXG4gICAgIFthdHRyLmRhdGEtbW9kZV09XCJkYXRhTW9kZVwiXHJcbiAgICAgW2F0dHIuZGF0YS10eXBlXT1cImRhdGFUeXBlXCJcclxuICAgICAjcGlja2VyUm9vdD5cclxuICA8ZGl2IGNsYXNzPVwiYnItaW5wdXQgaGFzLWljb25cIj5cclxuICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgW2Zvcl09XCJpbnB1dElkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxyXG4gICAgPGlucHV0XHJcbiAgICAgIFtpZF09XCJpbnB1dElkXCJcclxuICAgICAgW3R5cGVdPVwiaW5wdXRUeXBlXCJcclxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgZGF0YS1pbnB1dD1cImRhdGEtaW5wdXRcIlxyXG4gICAgLz5cclxuICAgIDxidXR0b25cclxuICAgICAgY2xhc3M9XCJici1idXR0b24gY2lyY2xlIHNtYWxsXCJcclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcclxuICAgICAgW2F0dHIuaWRdPVwiYnV0dG9uSWRcIlxyXG4gICAgICB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgZGF0YS10b2dnbGU9XCJkYXRhLXRvZ2dsZVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxyXG4gICAgICA8Y2ZjLWljb24gW2ljb25OYW1lXT1cImljb25OYW1lXCIgW2ZhbWlseU5hbWVdPVwiJ2ZhcydcIiBbc2l6ZV09XCInMTRweCdcIj48L2NmYy1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=