ngx-bootstrap 8.0.0-RC.1 → 8.0.0-RC.5
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.
- package/accordion/package.json +5 -3
- package/alert/package.json +4 -2
- package/buttons/package.json +3 -1
- package/carousel/package.json +4 -2
- package/chronos/esm2020/i18n/es-pr.mjs +74 -0
- package/chronos/esm2020/public_api.mjs +2 -1
- package/chronos/fesm2015/ngx-bootstrap-chronos.mjs +90 -17
- package/chronos/fesm2015/ngx-bootstrap-chronos.mjs.map +1 -1
- package/chronos/fesm2020/ngx-bootstrap-chronos.mjs +90 -17
- package/chronos/fesm2020/ngx-bootstrap-chronos.mjs.map +1 -1
- package/chronos/i18n/es-pr.d.ts +2 -0
- package/chronos/package.json +3 -1
- package/chronos/public_api.d.ts +1 -0
- package/collapse/package.json +3 -1
- package/component-loader/esm2020/component-loader.class.mjs +4 -8
- package/component-loader/fesm2015/ngx-bootstrap-component-loader.mjs +5 -9
- package/component-loader/fesm2015/ngx-bootstrap-component-loader.mjs.map +1 -1
- package/component-loader/fesm2020/ngx-bootstrap-component-loader.mjs +3 -7
- package/component-loader/fesm2020/ngx-bootstrap-component-loader.mjs.map +1 -1
- package/component-loader/package.json +5 -3
- package/datepicker/esm2020/public_api.mjs +1 -9
- package/datepicker/esm2020/reducer/bs-datepicker.reducer.mjs +2 -2
- package/datepicker/fesm2015/ngx-bootstrap-datepicker.mjs +3 -1108
- package/datepicker/fesm2015/ngx-bootstrap-datepicker.mjs.map +1 -1
- package/datepicker/fesm2020/ngx-bootstrap-datepicker.mjs +3 -1107
- package/datepicker/fesm2020/ngx-bootstrap-datepicker.mjs.map +1 -1
- package/datepicker/package.json +10 -8
- package/datepicker/public_api.d.ts +0 -8
- package/dropdown/package.json +6 -4
- package/focus-trap/package.json +3 -1
- package/locale/esm2020/public_api.mjs +2 -1
- package/locale/fesm2015/ngx-bootstrap-locale.mjs +1 -1
- package/locale/fesm2020/ngx-bootstrap-locale.mjs +1 -1
- package/locale/package.json +4 -2
- package/locale/public_api.d.ts +1 -0
- package/mini-ngrx/package.json +3 -1
- package/modal/package.json +7 -5
- package/package.json +212 -19
- package/pagination/package.json +3 -1
- package/popover/esm2020/popover-container.component.mjs +3 -3
- package/popover/fesm2015/ngx-bootstrap-popover.mjs +2 -2
- package/popover/fesm2015/ngx-bootstrap-popover.mjs.map +1 -1
- package/popover/fesm2020/ngx-bootstrap-popover.mjs +2 -2
- package/popover/fesm2020/ngx-bootstrap-popover.mjs.map +1 -1
- package/popover/package.json +6 -4
- package/positioning/esm2020/modifiers/preventOverflow.mjs +6 -7
- package/positioning/esm2020/utils/computeAutoPlacement.mjs +15 -19
- package/positioning/fesm2015/ngx-bootstrap-positioning.mjs +21 -26
- package/positioning/fesm2015/ngx-bootstrap-positioning.mjs.map +1 -1
- package/positioning/fesm2020/ngx-bootstrap-positioning.mjs +19 -24
- package/positioning/fesm2020/ngx-bootstrap-positioning.mjs.map +1 -1
- package/positioning/package.json +4 -2
- package/progressbar/package.json +4 -2
- package/rating/package.json +3 -1
- package/schematics/package.json +3 -1
- package/schematics/utils/current_dependency_versions.json +2 -2
- package/sortable/package.json +3 -1
- package/tabs/package.json +3 -1
- package/timepicker/package.json +4 -2
- package/tooltip/package.json +6 -4
- package/typeahead/package.json +6 -4
- package/utils/package.json +3 -1
- package/datepicker/date-formatter.d.ts +0 -3
- package/datepicker/datepicker-inner.component.d.ts +0 -80
- package/datepicker/datepicker.component.d.ts +0 -81
- package/datepicker/datepicker.config.d.ts +0 -22
- package/datepicker/datepicker.module.d.ts +0 -15
- package/datepicker/daypicker.component.d.ts +0 -20
- package/datepicker/esm2020/date-formatter.mjs +0 -7
- package/datepicker/esm2020/datepicker-inner.component.mjs +0 -325
- package/datepicker/esm2020/datepicker.component.mjs +0 -204
- package/datepicker/esm2020/datepicker.config.mjs +0 -32
- package/datepicker/esm2020/datepicker.module.mjs +0 -48
- package/datepicker/esm2020/daypicker.component.mjs +0 -255
- package/datepicker/esm2020/monthpicker.component.mjs +0 -131
- package/datepicker/esm2020/yearpicker.component.mjs +0 -146
- package/datepicker/monthpicker.component.d.ts +0 -14
- package/datepicker/yearpicker.component.d.ts +0 -14
@@ -1,80 +0,0 @@
|
|
1
|
-
import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
|
2
|
-
import { DateFormatter } from './date-formatter';
|
3
|
-
import * as i0 from "@angular/core";
|
4
|
-
declare type CompareDatesFn = (date1: Date, date2: Date) => number;
|
5
|
-
export declare class DatePickerInnerComponent implements OnInit, OnChanges {
|
6
|
-
locale?: string;
|
7
|
-
datepickerMode?: string;
|
8
|
-
startingDay?: number;
|
9
|
-
yearRange?: number;
|
10
|
-
minDate?: Date;
|
11
|
-
maxDate?: Date;
|
12
|
-
minMode?: string;
|
13
|
-
maxMode?: string;
|
14
|
-
showWeeks?: boolean;
|
15
|
-
formatDay?: string;
|
16
|
-
formatMonth?: string;
|
17
|
-
formatYear?: string;
|
18
|
-
formatDayHeader?: string;
|
19
|
-
formatDayTitle?: string;
|
20
|
-
formatMonthTitle?: string;
|
21
|
-
onlyCurrentMonth?: boolean;
|
22
|
-
shortcutPropagation?: boolean;
|
23
|
-
customClass?: {
|
24
|
-
date: Date;
|
25
|
-
mode: string;
|
26
|
-
clazz: string;
|
27
|
-
}[];
|
28
|
-
monthColLimit: number;
|
29
|
-
yearColLimit: number;
|
30
|
-
dateDisabled?: {
|
31
|
-
date: Date;
|
32
|
-
mode: string;
|
33
|
-
}[];
|
34
|
-
dayDisabled?: number[];
|
35
|
-
initDate?: Date;
|
36
|
-
selectionDone: EventEmitter<Date>;
|
37
|
-
update: EventEmitter<Date>;
|
38
|
-
activeDateChange: EventEmitter<Date>;
|
39
|
-
stepDay: {};
|
40
|
-
stepMonth: {};
|
41
|
-
stepYear: {};
|
42
|
-
uniqueId?: string;
|
43
|
-
protected modes: string[];
|
44
|
-
protected dateFormatter: DateFormatter;
|
45
|
-
protected selectedDate?: Date;
|
46
|
-
protected activeDateId?: string;
|
47
|
-
protected refreshViewHandlerDay?: () => void;
|
48
|
-
protected compareHandlerDay?: CompareDatesFn;
|
49
|
-
protected refreshViewHandlerMonth?: () => void;
|
50
|
-
protected compareHandlerMonth?: CompareDatesFn;
|
51
|
-
protected refreshViewHandlerYear?: () => void;
|
52
|
-
protected compareHandlerYear?: CompareDatesFn;
|
53
|
-
protected _activeDate?: Date;
|
54
|
-
get activeDate(): Date | undefined;
|
55
|
-
set activeDate(value: Date | undefined);
|
56
|
-
ngOnInit(): void;
|
57
|
-
ngOnChanges(changes: SimpleChanges): void;
|
58
|
-
checkIfActiveDateGotUpdated(activeDate: any): void;
|
59
|
-
setCompareHandler(handler: CompareDatesFn, type: string): void;
|
60
|
-
compare(date1?: Date, date2?: Date): number | undefined;
|
61
|
-
setRefreshViewHandler(handler: () => void, type: string): void;
|
62
|
-
refreshView(): void;
|
63
|
-
dateFilter(date: Date, format: string): string;
|
64
|
-
isActive(dateObject: any): boolean;
|
65
|
-
createDateObject(date: Date, format: string): any;
|
66
|
-
split(arr: any[], size: number): any[];
|
67
|
-
fixTimeZone(date: Date): Date;
|
68
|
-
select(date: Date, isManual?: boolean): void;
|
69
|
-
move(direction: number): void;
|
70
|
-
toggleMode(_direction: number): void;
|
71
|
-
protected getCustomClassForDate(date: Date): string;
|
72
|
-
protected compareDateDisabled(date1Disabled: {
|
73
|
-
date: Date;
|
74
|
-
mode: string;
|
75
|
-
}, date2: Date): number | undefined;
|
76
|
-
protected isDisabled(date: Date): boolean;
|
77
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerInnerComponent, never>;
|
78
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DatePickerInnerComponent, "datepicker-inner", never, { "locale": "locale"; "datepickerMode": "datepickerMode"; "startingDay": "startingDay"; "yearRange": "yearRange"; "minDate": "minDate"; "maxDate": "maxDate"; "minMode": "minMode"; "maxMode": "maxMode"; "showWeeks": "showWeeks"; "formatDay": "formatDay"; "formatMonth": "formatMonth"; "formatYear": "formatYear"; "formatDayHeader": "formatDayHeader"; "formatDayTitle": "formatDayTitle"; "formatMonthTitle": "formatMonthTitle"; "onlyCurrentMonth": "onlyCurrentMonth"; "shortcutPropagation": "shortcutPropagation"; "customClass": "customClass"; "monthColLimit": "monthColLimit"; "yearColLimit": "yearColLimit"; "dateDisabled": "dateDisabled"; "dayDisabled": "dayDisabled"; "initDate": "initDate"; "activeDate": "activeDate"; }, { "selectionDone": "selectionDone"; "update": "update"; "activeDateChange": "activeDateChange"; }, never, ["*"]>;
|
79
|
-
}
|
80
|
-
export {};
|
@@ -1,81 +0,0 @@
|
|
1
|
-
import { EventEmitter, Provider } from '@angular/core';
|
2
|
-
import { ControlValueAccessor } from '@angular/forms';
|
3
|
-
import { DatePickerInnerComponent } from './datepicker-inner.component';
|
4
|
-
import { DatepickerConfig } from './datepicker.config';
|
5
|
-
import * as i0 from "@angular/core";
|
6
|
-
export declare const DATEPICKER_CONTROL_VALUE_ACCESSOR: Provider;
|
7
|
-
export declare class DatePickerComponent implements ControlValueAccessor {
|
8
|
-
/** sets datepicker mode, supports: `day`, `month`, `year` */
|
9
|
-
datepickerMode: string;
|
10
|
-
/** default date to show if `ng-model` value is not specified */
|
11
|
-
initDate?: Date;
|
12
|
-
/** oldest selectable date */
|
13
|
-
minDate?: Date;
|
14
|
-
/** latest selectable date */
|
15
|
-
maxDate?: Date;
|
16
|
-
/** set lower datepicker mode, supports: `day`, `month`, `year` */
|
17
|
-
minMode?: string;
|
18
|
-
/** sets upper datepicker mode, supports: `day`, `month`, `year` */
|
19
|
-
maxMode?: string;
|
20
|
-
/** if false week numbers will be hidden */
|
21
|
-
showWeeks: boolean;
|
22
|
-
/** format of day in month */
|
23
|
-
formatDay?: string;
|
24
|
-
/** format of month in year */
|
25
|
-
formatMonth?: string;
|
26
|
-
/** format of year in year range */
|
27
|
-
formatYear?: string;
|
28
|
-
/** format of day in week header */
|
29
|
-
formatDayHeader?: string;
|
30
|
-
/** format of title when selecting day */
|
31
|
-
formatDayTitle?: string;
|
32
|
-
/** format of title when selecting month */
|
33
|
-
formatMonthTitle?: string;
|
34
|
-
/** starting day of the week from 0-6 (0=Sunday, ..., 6=Saturday) */
|
35
|
-
startingDay?: number;
|
36
|
-
/** number of years displayed in year selection */
|
37
|
-
yearRange?: number;
|
38
|
-
/** if true only dates from the currently displayed month will be shown */
|
39
|
-
onlyCurrentMonth?: boolean;
|
40
|
-
/** if true shortcut`s event propagation will be disabled */
|
41
|
-
shortcutPropagation?: boolean;
|
42
|
-
/** number of months displayed in a single row of month picker */
|
43
|
-
monthColLimit: number;
|
44
|
-
/** number of years displayed in a single row of year picker */
|
45
|
-
yearColLimit: number;
|
46
|
-
/** array of custom css classes to be applied to targeted dates */
|
47
|
-
customClass?: {
|
48
|
-
date: Date;
|
49
|
-
mode: string;
|
50
|
-
clazz: string;
|
51
|
-
}[];
|
52
|
-
/** array of disabled dates */
|
53
|
-
dateDisabled?: {
|
54
|
-
date: Date;
|
55
|
-
mode: string;
|
56
|
-
}[];
|
57
|
-
/** disabled days of the week from 0-6 (0=Sunday, ..., 6=Saturday) */
|
58
|
-
dayDisabled?: number[];
|
59
|
-
/** currently active date */
|
60
|
-
get activeDate(): Date | undefined;
|
61
|
-
set activeDate(value: Date | undefined);
|
62
|
-
selectionDone: EventEmitter<Date>;
|
63
|
-
/** callback to invoke when the activeDate is changed. */
|
64
|
-
activeDateChange: EventEmitter<Date>;
|
65
|
-
_datePicker?: DatePickerInnerComponent;
|
66
|
-
onChange: any;
|
67
|
-
onTouched: any;
|
68
|
-
config: DatepickerConfig;
|
69
|
-
protected _now: Date;
|
70
|
-
protected _activeDate?: Date;
|
71
|
-
constructor(config: DatepickerConfig);
|
72
|
-
configureOptions(): void;
|
73
|
-
onUpdate(event: Date): void;
|
74
|
-
onSelectionDone(event: Date): void;
|
75
|
-
onActiveDateChange(event: Date): void;
|
76
|
-
writeValue(value: any): void;
|
77
|
-
registerOnChange(fn: () => void): void;
|
78
|
-
registerOnTouched(fn: () => void): void;
|
79
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<DatePickerComponent, never>;
|
80
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DatePickerComponent, "datepicker", never, { "datepickerMode": "datepickerMode"; "initDate": "initDate"; "minDate": "minDate"; "maxDate": "maxDate"; "minMode": "minMode"; "maxMode": "maxMode"; "showWeeks": "showWeeks"; "formatDay": "formatDay"; "formatMonth": "formatMonth"; "formatYear": "formatYear"; "formatDayHeader": "formatDayHeader"; "formatDayTitle": "formatDayTitle"; "formatMonthTitle": "formatMonthTitle"; "startingDay": "startingDay"; "yearRange": "yearRange"; "onlyCurrentMonth": "onlyCurrentMonth"; "shortcutPropagation": "shortcutPropagation"; "monthColLimit": "monthColLimit"; "yearColLimit": "yearColLimit"; "customClass": "customClass"; "dateDisabled": "dateDisabled"; "dayDisabled": "dayDisabled"; "activeDate": "activeDate"; }, { "selectionDone": "selectionDone"; "activeDateChange": "activeDateChange"; }, never, never>;
|
81
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
import * as i0 from "@angular/core";
|
2
|
-
export declare class DatepickerConfig {
|
3
|
-
locale: string;
|
4
|
-
datepickerMode: string;
|
5
|
-
startingDay: number;
|
6
|
-
yearRange: number;
|
7
|
-
minMode: string;
|
8
|
-
maxMode: string;
|
9
|
-
showWeeks: boolean;
|
10
|
-
formatDay: string;
|
11
|
-
formatMonth: string;
|
12
|
-
formatYear: string;
|
13
|
-
formatDayHeader: string;
|
14
|
-
formatDayTitle: string;
|
15
|
-
formatMonthTitle: string;
|
16
|
-
onlyCurrentMonth: boolean;
|
17
|
-
monthColLimit: number;
|
18
|
-
yearColLimit: number;
|
19
|
-
shortcutPropagation: boolean;
|
20
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<DatepickerConfig, never>;
|
21
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<DatepickerConfig>;
|
22
|
-
}
|
@@ -1,15 +0,0 @@
|
|
1
|
-
import { ModuleWithProviders } from '@angular/core';
|
2
|
-
import * as i0 from "@angular/core";
|
3
|
-
import * as i1 from "./datepicker.component";
|
4
|
-
import * as i2 from "./datepicker-inner.component";
|
5
|
-
import * as i3 from "./daypicker.component";
|
6
|
-
import * as i4 from "./monthpicker.component";
|
7
|
-
import * as i5 from "./yearpicker.component";
|
8
|
-
import * as i6 from "@angular/common";
|
9
|
-
import * as i7 from "@angular/forms";
|
10
|
-
export declare class DatepickerModule {
|
11
|
-
static forRoot(): ModuleWithProviders<DatepickerModule>;
|
12
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<DatepickerModule, never>;
|
13
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<DatepickerModule, [typeof i1.DatePickerComponent, typeof i2.DatePickerInnerComponent, typeof i3.DayPickerComponent, typeof i4.MonthPickerComponent, typeof i5.YearPickerComponent], [typeof i6.CommonModule, typeof i7.FormsModule], [typeof i1.DatePickerComponent, typeof i2.DatePickerInnerComponent, typeof i3.DayPickerComponent, typeof i4.MonthPickerComponent, typeof i5.YearPickerComponent]>;
|
14
|
-
static ɵinj: i0.ɵɵInjectorDeclaration<DatepickerModule>;
|
15
|
-
}
|
@@ -1,20 +0,0 @@
|
|
1
|
-
import { OnInit } from '@angular/core';
|
2
|
-
import { DatePickerInnerComponent } from './datepicker-inner.component';
|
3
|
-
import * as i0 from "@angular/core";
|
4
|
-
export declare class DayPickerComponent implements OnInit {
|
5
|
-
labels: {
|
6
|
-
abbr?: unknown;
|
7
|
-
full?: unknown;
|
8
|
-
}[];
|
9
|
-
title?: string;
|
10
|
-
rows: any;
|
11
|
-
weekNumbers: number[];
|
12
|
-
datePicker: DatePickerInnerComponent;
|
13
|
-
constructor(datePicker: DatePickerInnerComponent);
|
14
|
-
get isBs4(): boolean;
|
15
|
-
ngOnInit(): void;
|
16
|
-
protected getDates(startDate: Date, n: number): Date[];
|
17
|
-
protected getISO8601WeekNumber(date: Date): number;
|
18
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<DayPickerComponent, never>;
|
19
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DayPickerComponent, "daypicker", never, {}, {}, never, never>;
|
20
|
-
}
|
@@ -1,7 +0,0 @@
|
|
1
|
-
import { formatDate } from 'ngx-bootstrap/chronos';
|
2
|
-
export class DateFormatter {
|
3
|
-
format(date, format, locale) {
|
4
|
-
return formatDate(date, format, locale);
|
5
|
-
}
|
6
|
-
}
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0ZXBpY2tlci9kYXRlLWZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbkQsTUFBTSxPQUFPLGFBQWE7SUFDeEIsTUFBTSxDQUFDLElBQVUsRUFBRSxNQUFjLEVBQUUsTUFBZTtRQUNoRCxPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuXG5leHBvcnQgY2xhc3MgRGF0ZUZvcm1hdHRlciB7XG4gIGZvcm1hdChkYXRlOiBEYXRlLCBmb3JtYXQ6IHN0cmluZywgbG9jYWxlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXQsIGxvY2FsZSk7XG4gIH1cbn1cbiJdfQ==
|
@@ -1,325 +0,0 @@
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
2
|
-
import { DateFormatter } from './date-formatter';
|
3
|
-
import * as i0 from "@angular/core";
|
4
|
-
import * as i1 from "@angular/common";
|
5
|
-
export class DatePickerInnerComponent {
|
6
|
-
constructor() {
|
7
|
-
this.monthColLimit = 0;
|
8
|
-
this.yearColLimit = 0;
|
9
|
-
this.selectionDone = new EventEmitter(undefined);
|
10
|
-
this.update = new EventEmitter(false);
|
11
|
-
this.activeDateChange = new EventEmitter(undefined);
|
12
|
-
this.stepDay = {};
|
13
|
-
this.stepMonth = {};
|
14
|
-
this.stepYear = {};
|
15
|
-
this.modes = ['day', 'month', 'year'];
|
16
|
-
this.dateFormatter = new DateFormatter();
|
17
|
-
}
|
18
|
-
get activeDate() {
|
19
|
-
return this._activeDate;
|
20
|
-
}
|
21
|
-
set activeDate(value) {
|
22
|
-
this._activeDate = value;
|
23
|
-
}
|
24
|
-
// todo: add formatter value to Date object
|
25
|
-
ngOnInit() {
|
26
|
-
// todo: use date for unique value
|
27
|
-
this.uniqueId = `datepicker--${Math.floor(Math.random() * 10000)}`;
|
28
|
-
if (this.initDate) {
|
29
|
-
this.activeDate = this.initDate;
|
30
|
-
this.selectedDate = new Date(this.activeDate.valueOf());
|
31
|
-
this.update.emit(this.activeDate);
|
32
|
-
}
|
33
|
-
else if (this.activeDate === undefined) {
|
34
|
-
this.activeDate = new Date();
|
35
|
-
}
|
36
|
-
}
|
37
|
-
// this.refreshView should be called here to reflect the changes on the fly
|
38
|
-
ngOnChanges(changes) {
|
39
|
-
this.refreshView();
|
40
|
-
this.checkIfActiveDateGotUpdated(changes["activeDate"]);
|
41
|
-
}
|
42
|
-
// Check if activeDate has been update and then emit the activeDateChange with the new date
|
43
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
44
|
-
checkIfActiveDateGotUpdated(activeDate) {
|
45
|
-
if (activeDate && !activeDate.firstChange) {
|
46
|
-
const previousValue = activeDate.previousValue;
|
47
|
-
if (previousValue &&
|
48
|
-
previousValue instanceof Date &&
|
49
|
-
previousValue.getTime() !== activeDate.currentValue.getTime()) {
|
50
|
-
this.activeDateChange.emit(this.activeDate);
|
51
|
-
}
|
52
|
-
}
|
53
|
-
}
|
54
|
-
setCompareHandler(handler, type) {
|
55
|
-
if (type === 'day') {
|
56
|
-
this.compareHandlerDay = handler;
|
57
|
-
}
|
58
|
-
if (type === 'month') {
|
59
|
-
this.compareHandlerMonth = handler;
|
60
|
-
}
|
61
|
-
if (type === 'year') {
|
62
|
-
this.compareHandlerYear = handler;
|
63
|
-
}
|
64
|
-
}
|
65
|
-
compare(date1, date2) {
|
66
|
-
if (date1 === undefined || date2 === undefined) {
|
67
|
-
return undefined;
|
68
|
-
}
|
69
|
-
if (this.datepickerMode === 'day' && this.compareHandlerDay) {
|
70
|
-
return this.compareHandlerDay(date1, date2);
|
71
|
-
}
|
72
|
-
if (this.datepickerMode === 'month' && this.compareHandlerMonth) {
|
73
|
-
return this.compareHandlerMonth(date1, date2);
|
74
|
-
}
|
75
|
-
if (this.datepickerMode === 'year' && this.compareHandlerYear) {
|
76
|
-
return this.compareHandlerYear(date1, date2);
|
77
|
-
}
|
78
|
-
return void 0;
|
79
|
-
}
|
80
|
-
setRefreshViewHandler(handler, type) {
|
81
|
-
if (type === 'day') {
|
82
|
-
this.refreshViewHandlerDay = handler;
|
83
|
-
}
|
84
|
-
if (type === 'month') {
|
85
|
-
this.refreshViewHandlerMonth = handler;
|
86
|
-
}
|
87
|
-
if (type === 'year') {
|
88
|
-
this.refreshViewHandlerYear = handler;
|
89
|
-
}
|
90
|
-
}
|
91
|
-
refreshView() {
|
92
|
-
if (this.datepickerMode === 'day' && this.refreshViewHandlerDay) {
|
93
|
-
this.refreshViewHandlerDay();
|
94
|
-
}
|
95
|
-
if (this.datepickerMode === 'month' && this.refreshViewHandlerMonth) {
|
96
|
-
this.refreshViewHandlerMonth();
|
97
|
-
}
|
98
|
-
if (this.datepickerMode === 'year' && this.refreshViewHandlerYear) {
|
99
|
-
this.refreshViewHandlerYear();
|
100
|
-
}
|
101
|
-
}
|
102
|
-
dateFilter(date, format) {
|
103
|
-
return this.dateFormatter.format(date, format, this.locale);
|
104
|
-
}
|
105
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
106
|
-
isActive(dateObject) {
|
107
|
-
if (this.compare(dateObject.date, this.activeDate) === 0) {
|
108
|
-
this.activeDateId = dateObject.uid;
|
109
|
-
return true;
|
110
|
-
}
|
111
|
-
return false;
|
112
|
-
}
|
113
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
114
|
-
createDateObject(date, format) {
|
115
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
116
|
-
const dateObject = {};
|
117
|
-
dateObject.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
118
|
-
dateObject.date = this.fixTimeZone(dateObject.date);
|
119
|
-
dateObject.label = this.dateFilter(date, format);
|
120
|
-
dateObject.selected = this.compare(date, this.selectedDate) === 0;
|
121
|
-
dateObject.disabled = this.isDisabled(date);
|
122
|
-
dateObject.current = this.compare(date, new Date()) === 0;
|
123
|
-
dateObject.customClass = this.getCustomClassForDate(dateObject.date);
|
124
|
-
return dateObject;
|
125
|
-
}
|
126
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
127
|
-
split(arr, size) {
|
128
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
129
|
-
const arrays = [];
|
130
|
-
while (arr.length > 0) {
|
131
|
-
arrays.push(arr.splice(0, size));
|
132
|
-
}
|
133
|
-
return arrays;
|
134
|
-
}
|
135
|
-
// Fix a hard-reproducible bug with timezones
|
136
|
-
// The bug depends on OS, browser, current timezone and current date
|
137
|
-
// i.e.
|
138
|
-
// var date = new Date(2014, 0, 1);
|
139
|
-
// console.log(date.getFullYear(), date.getMonth(), date.getDate(),
|
140
|
-
// date.getHours()); can result in "2013 11 31 23" because of the bug.
|
141
|
-
fixTimeZone(date) {
|
142
|
-
const hours = date.getHours();
|
143
|
-
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), hours === 23 ? hours + 2 : 0);
|
144
|
-
}
|
145
|
-
select(date, isManual = true) {
|
146
|
-
if (this.datepickerMode === this.minMode) {
|
147
|
-
if (!this.activeDate) {
|
148
|
-
this.activeDate = new Date(0, 0, 0, 0, 0, 0, 0);
|
149
|
-
}
|
150
|
-
this.activeDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
151
|
-
this.activeDate = this.fixTimeZone(this.activeDate);
|
152
|
-
if (isManual) {
|
153
|
-
this.selectionDone.emit(this.activeDate);
|
154
|
-
}
|
155
|
-
}
|
156
|
-
else {
|
157
|
-
this.activeDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
158
|
-
this.activeDate = this.fixTimeZone(this.activeDate);
|
159
|
-
if (isManual && this.datepickerMode) {
|
160
|
-
this.datepickerMode = this.modes[this.modes.indexOf(this.datepickerMode) - 1];
|
161
|
-
}
|
162
|
-
}
|
163
|
-
this.selectedDate = new Date(this.activeDate.valueOf());
|
164
|
-
this.update.emit(this.activeDate);
|
165
|
-
this.refreshView();
|
166
|
-
}
|
167
|
-
move(direction) {
|
168
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
169
|
-
let expectedStep;
|
170
|
-
if (this.datepickerMode === 'day') {
|
171
|
-
expectedStep = this.stepDay;
|
172
|
-
}
|
173
|
-
if (this.datepickerMode === 'month') {
|
174
|
-
expectedStep = this.stepMonth;
|
175
|
-
}
|
176
|
-
if (this.datepickerMode === 'year') {
|
177
|
-
expectedStep = this.stepYear;
|
178
|
-
}
|
179
|
-
if (expectedStep && this.activeDate) {
|
180
|
-
const year = this.activeDate.getFullYear() + direction * (expectedStep.years || 0);
|
181
|
-
const month = this.activeDate.getMonth() + direction * (expectedStep.months || 0);
|
182
|
-
this.activeDate = new Date(year, month, 1);
|
183
|
-
this.refreshView();
|
184
|
-
this.activeDateChange.emit(this.activeDate);
|
185
|
-
}
|
186
|
-
}
|
187
|
-
toggleMode(_direction) {
|
188
|
-
const direction = _direction || 1;
|
189
|
-
if ((this.datepickerMode === this.maxMode && direction === 1) ||
|
190
|
-
(this.datepickerMode === this.minMode && direction === -1)) {
|
191
|
-
return;
|
192
|
-
}
|
193
|
-
if (this.datepickerMode) {
|
194
|
-
this.datepickerMode = this.modes[this.modes.indexOf(this.datepickerMode) + direction];
|
195
|
-
}
|
196
|
-
this.refreshView();
|
197
|
-
}
|
198
|
-
getCustomClassForDate(date) {
|
199
|
-
if (!this.customClass) {
|
200
|
-
return '';
|
201
|
-
}
|
202
|
-
// todo: build a hash of custom classes, it will work faster
|
203
|
-
const customClassObject = this.customClass.find((customClass) => {
|
204
|
-
return (customClass.date.valueOf() === date.valueOf() &&
|
205
|
-
customClass.mode === this.datepickerMode);
|
206
|
-
}, this);
|
207
|
-
return customClassObject === undefined ? '' : customClassObject.clazz;
|
208
|
-
}
|
209
|
-
compareDateDisabled(date1Disabled, date2) {
|
210
|
-
if (date1Disabled === undefined || date2 === undefined) {
|
211
|
-
return undefined;
|
212
|
-
}
|
213
|
-
if (date1Disabled.mode === 'day' && this.compareHandlerDay) {
|
214
|
-
return this.compareHandlerDay(date1Disabled.date, date2);
|
215
|
-
}
|
216
|
-
if (date1Disabled.mode === 'month' && this.compareHandlerMonth) {
|
217
|
-
return this.compareHandlerMonth(date1Disabled.date, date2);
|
218
|
-
}
|
219
|
-
if (date1Disabled.mode === 'year' && this.compareHandlerYear) {
|
220
|
-
return this.compareHandlerYear(date1Disabled.date, date2);
|
221
|
-
}
|
222
|
-
return undefined;
|
223
|
-
}
|
224
|
-
isDisabled(date) {
|
225
|
-
let isDateDisabled = false;
|
226
|
-
if (this.dateDisabled) {
|
227
|
-
this.dateDisabled.forEach((disabledDate) => {
|
228
|
-
if (this.compareDateDisabled(disabledDate, date) === 0) {
|
229
|
-
isDateDisabled = true;
|
230
|
-
}
|
231
|
-
});
|
232
|
-
}
|
233
|
-
if (this.dayDisabled) {
|
234
|
-
isDateDisabled =
|
235
|
-
isDateDisabled ||
|
236
|
-
this.dayDisabled.indexOf(date.getDay()) > -1;
|
237
|
-
}
|
238
|
-
if (isDateDisabled) {
|
239
|
-
return isDateDisabled;
|
240
|
-
}
|
241
|
-
const minDate = Number(this.minDate && this.compare(date, this.minDate));
|
242
|
-
if (!isNaN(minDate)) {
|
243
|
-
return minDate < 0;
|
244
|
-
}
|
245
|
-
const maxDate = Number(this.maxDate && this.compare(date, this.maxDate));
|
246
|
-
if (!isNaN(maxDate)) {
|
247
|
-
return maxDate > 0;
|
248
|
-
}
|
249
|
-
return false;
|
250
|
-
}
|
251
|
-
}
|
252
|
-
DatePickerInnerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DatePickerInnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
253
|
-
DatePickerInnerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: DatePickerInnerComponent, selector: "datepicker-inner", inputs: { locale: "locale", datepickerMode: "datepickerMode", startingDay: "startingDay", yearRange: "yearRange", minDate: "minDate", maxDate: "maxDate", minMode: "minMode", maxMode: "maxMode", showWeeks: "showWeeks", formatDay: "formatDay", formatMonth: "formatMonth", formatYear: "formatYear", formatDayHeader: "formatDayHeader", formatDayTitle: "formatDayTitle", formatMonthTitle: "formatMonthTitle", onlyCurrentMonth: "onlyCurrentMonth", shortcutPropagation: "shortcutPropagation", customClass: "customClass", monthColLimit: "monthColLimit", yearColLimit: "yearColLimit", dateDisabled: "dateDisabled", dayDisabled: "dayDisabled", initDate: "initDate", activeDate: "activeDate" }, outputs: { selectionDone: "selectionDone", update: "update", activeDateChange: "activeDateChange" }, usesOnChanges: true, ngImport: i0, template: `
|
254
|
-
<!--<!–ng-keydown="keydown($event)"–>-->
|
255
|
-
<div *ngIf='datepickerMode' class='well well-sm bg-faded p-a card' role='application'>
|
256
|
-
<ng-content></ng-content>
|
257
|
-
</div>
|
258
|
-
`, isInline: true, directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
259
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: DatePickerInnerComponent, decorators: [{
|
260
|
-
type: Component,
|
261
|
-
args: [{
|
262
|
-
selector: 'datepicker-inner',
|
263
|
-
template: `
|
264
|
-
<!--<!–ng-keydown="keydown($event)"–>-->
|
265
|
-
<div *ngIf='datepickerMode' class='well well-sm bg-faded p-a card' role='application'>
|
266
|
-
<ng-content></ng-content>
|
267
|
-
</div>
|
268
|
-
`
|
269
|
-
}]
|
270
|
-
}], propDecorators: { locale: [{
|
271
|
-
type: Input
|
272
|
-
}], datepickerMode: [{
|
273
|
-
type: Input
|
274
|
-
}], startingDay: [{
|
275
|
-
type: Input
|
276
|
-
}], yearRange: [{
|
277
|
-
type: Input
|
278
|
-
}], minDate: [{
|
279
|
-
type: Input
|
280
|
-
}], maxDate: [{
|
281
|
-
type: Input
|
282
|
-
}], minMode: [{
|
283
|
-
type: Input
|
284
|
-
}], maxMode: [{
|
285
|
-
type: Input
|
286
|
-
}], showWeeks: [{
|
287
|
-
type: Input
|
288
|
-
}], formatDay: [{
|
289
|
-
type: Input
|
290
|
-
}], formatMonth: [{
|
291
|
-
type: Input
|
292
|
-
}], formatYear: [{
|
293
|
-
type: Input
|
294
|
-
}], formatDayHeader: [{
|
295
|
-
type: Input
|
296
|
-
}], formatDayTitle: [{
|
297
|
-
type: Input
|
298
|
-
}], formatMonthTitle: [{
|
299
|
-
type: Input
|
300
|
-
}], onlyCurrentMonth: [{
|
301
|
-
type: Input
|
302
|
-
}], shortcutPropagation: [{
|
303
|
-
type: Input
|
304
|
-
}], customClass: [{
|
305
|
-
type: Input
|
306
|
-
}], monthColLimit: [{
|
307
|
-
type: Input
|
308
|
-
}], yearColLimit: [{
|
309
|
-
type: Input
|
310
|
-
}], dateDisabled: [{
|
311
|
-
type: Input
|
312
|
-
}], dayDisabled: [{
|
313
|
-
type: Input
|
314
|
-
}], initDate: [{
|
315
|
-
type: Input
|
316
|
-
}], selectionDone: [{
|
317
|
-
type: Output
|
318
|
-
}], update: [{
|
319
|
-
type: Output
|
320
|
-
}], activeDateChange: [{
|
321
|
-
type: Output
|
322
|
-
}], activeDate: [{
|
323
|
-
type: Input
|
324
|
-
}] } });
|
325
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLWlubmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFFekcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7QUFhakQsTUFBTSxPQUFPLHdCQUF3QjtJQVRyQztRQTZCVyxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUNsQixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUtoQixrQkFBYSxHQUF1QixJQUFJLFlBQVksQ0FBTyxTQUFTLENBQUMsQ0FBQztRQUN0RSxXQUFNLEdBQXVCLElBQUksWUFBWSxDQUFPLEtBQUssQ0FBQyxDQUFDO1FBQzNELHFCQUFnQixHQUF1QixJQUFJLFlBQVksQ0FBTyxTQUFTLENBQUMsQ0FBQztRQUVuRixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFJSixVQUFLLEdBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLGtCQUFhLEdBQWtCLElBQUksYUFBYSxFQUFFLENBQUM7S0E2VTlEO0lBalVDLElBQ0ksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBcUI7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELDJDQUEyQztJQUMzQyxRQUFRO1FBQ04sa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxJQUFJLENBQUMsS0FBSyxDQUFDLElB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QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFzQkgsVUFBVTtzQkFEYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERhdGVGb3JtYXR0ZXIgfSBmcm9tICcuL2RhdGUtZm9ybWF0dGVyJztcblxudHlwZSBDb21wYXJlRGF0ZXNGbiA9IChkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpID0+IG51bWJlcjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF0ZXBpY2tlci1pbm5lcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLSZsdDshJm5kYXNoO25nLWtleWRvd249XCJrZXlkb3duKCRldmVudClcIiZuZGFzaDsmZ3Q7LS0+XG4gICAgPGRpdiAqbmdJZj0nZGF0ZXBpY2tlck1vZGUnIGNsYXNzPSd3ZWxsIHdlbGwtc20gYmctZmFkZWQgcC1hIGNhcmQnIHJvbGU9J2FwcGxpY2F0aW9uJz5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VySW5uZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGxvY2FsZT86IHN0cmluZztcbiAgQElucHV0KCkgZGF0ZXBpY2tlck1vZGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0YXJ0aW5nRGF5PzogbnVtYmVyO1xuICBASW5wdXQoKSB5ZWFyUmFuZ2U/OiBudW1iZXI7XG5cbiAgQElucHV0KCkgbWluRGF0ZT86IERhdGU7XG4gIEBJbnB1dCgpIG1heERhdGU/OiBEYXRlO1xuICBASW5wdXQoKSBtaW5Nb2RlPzogc3RyaW5nO1xuICBASW5wdXQoKSBtYXhNb2RlPzogc3RyaW5nO1xuICBASW5wdXQoKSBzaG93V2Vla3M/OiBib29sZWFuO1xuICBASW5wdXQoKSBmb3JtYXREYXk/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdE1vbnRoPzogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtYXRZZWFyPzogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtYXREYXlIZWFkZXI/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1hdERheVRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtYXRNb250aFRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSBvbmx5Q3VycmVudE1vbnRoPzogYm9vbGVhbjtcbiAgQElucHV0KCkgc2hvcnRjdXRQcm9wYWdhdGlvbj86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzPzogeyBkYXRlOiBEYXRlOyBtb2RlOiBzdHJpbmc7IGNsYXp6OiBzdHJpbmcgfVtdO1xuICBASW5wdXQoKSBtb250aENvbExpbWl0ID0gMDtcbiAgQElucHV0KCkgeWVhckNvbExpbWl0ID0gMDtcbiAgQElucHV0KCkgZGF0ZURpc2FibGVkPzogeyBkYXRlOiBEYXRlOyBtb2RlOiBzdHJpbmcgfVtdO1xuICBASW5wdXQoKSBkYXlEaXNhYmxlZD86IG51bWJlcltdO1xuICBASW5wdXQoKSBpbml0RGF0ZT86IERhdGU7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkRvbmU6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4odW5kZWZpbmVkKTtcbiAgQE91dHB1dCgpIHVwZGF0ZTogRXZlbnRFbWl0dGVyPERhdGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPihmYWxzZSk7XG4gIEBPdXRwdXQoKSBhY3RpdmVEYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KHVuZGVmaW5lZCk7XG5cbiAgc3RlcERheSA9IHt9O1xuICBzdGVwTW9udGggPSB7fTtcbiAgc3RlcFllYXIgPSB7fTtcblxuICB1bmlxdWVJZD86IHN0cmluZztcblxuICBwcm90ZWN0ZWQgbW9kZXM6IHN0cmluZ1tdID0gWydkYXknLCAnbW9udGgnLCAneWVhciddO1xuICBwcm90ZWN0ZWQgZGF0ZUZvcm1hdHRlcjogRGF0ZUZvcm1hdHRlciA9IG5ldyBEYXRlRm9ybWF0dGVyKCk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZERhdGU/OiBEYXRlO1xuICBwcm90ZWN0ZWQgYWN0aXZlRGF0ZUlkPzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVmcmVzaFZpZXdIYW5kbGVyRGF5PzogKCkgPT4gdm9pZDtcbiAgcHJvdGVjdGVkIGNvbXBhcmVIYW5kbGVyRGF5PzogQ29tcGFyZURhdGVzRm47XG4gIHByb3RlY3RlZCByZWZyZXNoVmlld0hhbmRsZXJNb250aD86ICgpID0+IHZvaWQ7XG4gIHByb3RlY3RlZCBjb21wYXJlSGFuZGxlck1vbnRoPzogQ29tcGFyZURhdGVzRm47XG4gIHByb3RlY3RlZCByZWZyZXNoVmlld0hhbmRsZXJZZWFyPzogKCkgPT4gdm9pZDtcbiAgcHJvdGVjdGVkIGNvbXBhcmVIYW5kbGVyWWVhcj86IENvbXBhcmVEYXRlc0ZuO1xuXG4gIHByb3RlY3RlZCBfYWN0aXZlRGF0ZT86IERhdGU7XG5cbiAgQElucHV0KClcbiAgZ2V0IGFjdGl2ZURhdGUoKTogRGF0ZXx1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEYXRlO1xuICB9XG5cbiAgc2V0IGFjdGl2ZURhdGUodmFsdWU6IERhdGV8dW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fYWN0aXZlRGF0ZSA9IHZhbHVlO1xuICB9XG5cbiAgLy8gdG9kbzogYWRkIGZvcm1hdHRlciB2YWx1ZSB0byBEYXRlIG9iamVjdFxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyB0b2RvOiB1c2UgZGF0ZSBmb3IgdW5pcXVlIHZhbHVlXG4gICAgdGhpcy51bmlxdWVJZCA9IGBkYXRlcGlja2VyLS0ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwKX1gO1xuXG4gICAgaWYgKHRoaXMuaW5pdERhdGUpIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuaW5pdERhdGU7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlRGF0ZS52YWx1ZU9mKCkpO1xuICAgICAgdGhpcy51cGRhdGUuZW1pdCh0aGlzLmFjdGl2ZURhdGUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmVEYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gdGhpcy5yZWZyZXNoVmlldyBzaG91bGQgYmUgY2FsbGVkIGhlcmUgdG8gcmVmbGVjdCB0aGUgY2hhbmdlcyBvbiB0aGUgZmx5XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gICAgdGhpcy5jaGVja0lmQWN0aXZlRGF0ZUdvdFVwZGF0ZWQoY2hhbmdlc1tcImFjdGl2ZURhdGVcIl0pO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYWN0aXZlRGF0ZSBoYXMgYmVlbiB1cGRhdGUgYW5kIHRoZW4gZW1pdCB0aGUgYWN0aXZlRGF0ZUNoYW5nZSB3aXRoIHRoZSBuZXcgZGF0ZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjaGVja0lmQWN0aXZlRGF0ZUdvdFVwZGF0ZWQoYWN0aXZlRGF0ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZURhdGUgJiYgIWFjdGl2ZURhdGUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBhY3RpdmVEYXRlLnByZXZpb3VzVmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgIHByZXZpb3VzVmFsdWUgJiZcbiAgICAgICAgcHJldmlvdXNWYWx1ZSBpbnN0YW5jZW9mIERhdGUgJiZcbiAgICAgICAgcHJldmlvdXNWYWx1ZS5nZXRUaW1lKCkgIT09IGFjdGl2ZURhdGUuY3VycmVudFZhbHVlLmdldFRpbWUoKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0Q29tcGFyZUhhbmRsZXIoaGFuZGxlcjogQ29tcGFyZURhdGVzRm4sIHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnZGF5Jykge1xuICAgICAgdGhpcy5jb21wYXJlSGFuZGxlckRheSA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMuY29tcGFyZUhhbmRsZXJNb250aCA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy5jb21wYXJlSGFuZGxlclllYXIgPSBoYW5kbGVyO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBhcmUoZGF0ZTE/OiBEYXRlLCBkYXRlMj86IERhdGUpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmIChkYXRlMSA9PT0gdW5kZWZpbmVkIHx8IGRhdGUyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdkYXknICYmIHRoaXMuY29tcGFyZUhhbmRsZXJEYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVIYW5kbGVyRGF5KGRhdGUxLCBkYXRlMik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdtb250aCcgJiYgdGhpcy5jb21wYXJlSGFuZGxlck1vbnRoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wYXJlSGFuZGxlck1vbnRoKGRhdGUxLCBkYXRlMik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICd5ZWFyJyAmJiB0aGlzLmNvbXBhcmVIYW5kbGVyWWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZUhhbmRsZXJZZWFyKGRhdGUxLCBkYXRlMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIHNldFJlZnJlc2hWaWV3SGFuZGxlcihoYW5kbGVyOiAoKSA9PiB2b2lkLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZSA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXdIYW5kbGVyRGF5ID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJZZWFyID0gaGFuZGxlcjtcbiAgICB9XG4gIH1cblxuICByZWZyZXNoVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheScgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJEYXkpIHtcbiAgICAgIHRoaXMucmVmcmVzaFZpZXdIYW5kbGVyRGF5KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdtb250aCcgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCkge1xuICAgICAgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJNb250aCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJNb2RlID09PSAneWVhcicgJiYgdGhpcy5yZWZyZXNoVmlld0hhbmRsZXJZZWFyKSB7XG4gICAgICB0aGlzLnJlZnJlc2hWaWV3SGFuZGxlclllYXIoKTtcbiAgICB9XG4gIH1cblxuICBkYXRlRmlsdGVyKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlRm9ybWF0dGVyLmZvcm1hdChkYXRlLCBmb3JtYXQsIHRoaXMubG9jYWxlKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGlzQWN0aXZlKGRhdGVPYmplY3Q6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNvbXBhcmUoZGF0ZU9iamVjdC5kYXRlLCB0aGlzLmFjdGl2ZURhdGUpID09PSAwKSB7XG4gICAgICB0aGlzLmFjdGl2ZURhdGVJZCA9IGRhdGVPYmplY3QudWlkO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjcmVhdGVEYXRlT2JqZWN0KGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogYW55IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGRhdGVPYmplY3Q6IGFueSA9IHt9O1xuICAgIGRhdGVPYmplY3QuZGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgZGF0ZS5nZXREYXRlKClcbiAgICApO1xuICAgIGRhdGVPYmplY3QuZGF0ZSA9IHRoaXMuZml4VGltZVpvbmUoZGF0ZU9iamVjdC5kYXRlKTtcbiAgICBkYXRlT2JqZWN0LmxhYmVsID0gdGhpcy5kYXRlRmlsdGVyKGRhdGUsIGZvcm1hdCk7XG4gICAgZGF0ZU9iamVjdC5zZWxlY3RlZCA9IHRoaXMuY29tcGFyZShkYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSkgPT09IDA7XG4gICAgZGF0ZU9iamVjdC5kaXNhYmxlZCA9IHRoaXMuaXNEaXNhYmxlZChkYXRlKTtcbiAgICBkYXRlT2JqZWN0LmN1cnJlbnQgPSB0aGlzLmNvbXBhcmUoZGF0ZSwgbmV3IERhdGUoKSkgPT09IDA7XG4gICAgZGF0ZU9iamVjdC5jdXN0b21DbGFzcyA9IHRoaXMuZ2V0Q3VzdG9tQ2xhc3NGb3JEYXRlKGRhdGVPYmplY3QuZGF0ZSk7XG5cbiAgICByZXR1cm4gZGF0ZU9iamVjdDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHNwbGl0KGFycjogYW55W10sIHNpemU6IG51bWJlcik6IGFueVtdIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGFycmF5czogYW55W10gPSBbXTtcbiAgICB3aGlsZSAoYXJyLmxlbmd0aCA+IDApIHtcbiAgICAgIGFycmF5cy5wdXNoKGFyci5zcGxpY2UoMCwgc2l6ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheXM7XG4gIH1cblxuICAvLyBGaXggYSBoYXJkLXJlcHJvZHVjaWJsZSBidWcgd2l0aCB0aW1lem9uZXNcbiAgLy8gVGhlIGJ1ZyBkZXBlbmRzIG9uIE9TLCBicm93c2VyLCBjdXJyZW50IHRpbWV6b25lIGFuZCBjdXJyZW50IGRhdGVcbiAgLy8gaS5lLlxuICAvLyB2YXIgZGF0ZSA9IG5ldyBEYXRlKDIwMTQsIDAsIDEpO1xuICAvLyBjb25zb2xlLmxvZyhkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCksXG4gIC8vIGRhdGUuZ2V0SG91cnMoKSk7IGNhbiByZXN1bHQgaW4gXCIyMDEzIDExIDMxIDIzXCIgYmVjYXVzZSBvZiB0aGUgYnVnLlxuICBmaXhUaW1lWm9uZShkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG5cbiAgICByZXR1cm4gbmV3IERhdGUoXG4gICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBkYXRlLmdldE1vbnRoKCksXG4gICAgICBkYXRlLmdldERhdGUoKSxcbiAgICAgIGhvdXJzID09PSAyMyA/IGhvdXJzICsgMiA6IDBcbiAgICApO1xuICB9XG5cbiAgc2VsZWN0KGRhdGU6IERhdGUsIGlzTWFudWFsID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJNb2RlID09PSB0aGlzLm1pbk1vZGUpIHtcbiAgICAgIGlmICghdGhpcy5hY3RpdmVEYXRlKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ldyBEYXRlKDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBkYXRlLmdldE1vbnRoKCksXG4gICAgICAgIGRhdGUuZ2V0RGF0ZSgpXG4gICAgICApO1xuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gdGhpcy5maXhUaW1lWm9uZSh0aGlzLmFjdGl2ZURhdGUpO1xuICAgICAgaWYgKGlzTWFudWFsKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRG9uZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIGRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgZGF0ZS5nZXREYXRlKClcbiAgICAgICk7XG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLmZpeFRpbWVab25lKHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgICBpZiAoaXNNYW51YWwgJiYgdGhpcy5kYXRlcGlja2VyTW9kZSkge1xuICAgICAgICB0aGlzLmRhdGVwaWNrZXJNb2RlID0gdGhpcy5tb2Rlc1t0aGlzLm1vZGVzLmluZGV4T2YodGhpcy5kYXRlcGlja2VyTW9kZSkgLSAxXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuYWN0aXZlRGF0ZS52YWx1ZU9mKCkpO1xuICAgIHRoaXMudXBkYXRlLmVtaXQodGhpcy5hY3RpdmVEYXRlKTtcbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICBtb3ZlKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBsZXQgZXhwZWN0ZWRTdGVwOiBhbnk7XG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdkYXknKSB7XG4gICAgICBleHBlY3RlZFN0ZXAgPSB0aGlzLnN0ZXBEYXk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlck1vZGUgPT09ICdtb250aCcpIHtcbiAgICAgIGV4cGVjdGVkU3RlcCA9IHRoaXMuc3RlcE1vbnRoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJNb2RlID09PSAneWVhcicpIHtcbiAgICAgIGV4cGVjdGVkU3RlcCA9IHRoaXMuc3RlcFllYXI7XG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdGVkU3RlcCAmJiB0aGlzLmFjdGl2ZURhdGUpIHtcbiAgICAgIGNvbnN0IHllYXIgPVxuICAgICAgICB0aGlzLmFjdGl2ZURhdGUuZ2V0RnVsbFllYXIoKSArIGRpcmVjdGlvbiAqIChleHBlY3RlZFN0ZXAueWVhcnMgfHwgMCk7XG4gICAgICBjb25zdCBtb250aCA9XG4gICAgICAgIHRoaXMuYWN0aXZlRGF0ZS5nZXRNb250aCgpICsgZGlyZWN0aW9uICogKGV4cGVjdGVkU3RlcC5tb250aHMgfHwgMCk7XG4gICAgICB0aGlzLmFjdGl2ZURhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG5cbiAgICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcbiAgICAgIHRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlTW9kZShfZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBfZGlyZWN0aW9uIHx8IDE7XG5cbiAgICBpZiAoXG4gICAgICAodGhpcy5kYXRlcGlja2VyTW9kZSA9PT0gdGhpcy5tYXhNb2RlICYmIGRpcmVjdGlvbiA9PT0gMSkgfHxcbiAgICAgICh0aGlzLmRhdGVwaWNrZXJNb2RlID09PSB0aGlzLm1pbk1vZGUgJiYgZGlyZWN0aW9uID09PSAtMSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyTW9kZSkge1xuICAgICAgdGhpcy5kYXRlcGlja2VyTW9kZSA9IHRoaXMubW9kZXNbdGhpcy5tb2Rlcy5pbmRleE9mKHRoaXMuZGF0ZXBpY2tlck1vZGUpICsgZGlyZWN0aW9uXTtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q3VzdG9tQ2xhc3NGb3JEYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jdXN0b21DbGFzcykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvLyB0b2RvOiBidWlsZCBhIGhhc2ggb2YgY3VzdG9tIGNsYXNzZXMsIGl0IHdpbGwgd29yayBmYXN0ZXJcbiAgICBjb25zdCBjdXN0b21DbGFzc09iamVjdDogKHtcbiAgICAgIGRhdGU6IERhdGU7XG4gICAgICBtb2RlOiBzdHJpbmc7XG4gICAgICBjbGF6ejogc3RyaW5nO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9IHwgdW5kZWZpbmVkKSA9IHRoaXMuY3VzdG9tQ2xhc3MuZmluZCgoY3VzdG9tQ2xhc3M6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY3VzdG9tQ2xhc3MuZGF0ZS52YWx1ZU9mKCkgPT09IGRhdGUudmFsdWVPZigpICYmXG4gICAgICAgIGN1c3RvbUNsYXNzLm1vZGUgPT09IHRoaXMuZGF0ZXBpY2tlck1vZGVcbiAgICAgICk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gY3VzdG9tQ2xhc3NPYmplY3QgPT09IHVuZGVmaW5lZCA/ICcnIDogY3VzdG9tQ2xhc3NPYmplY3QuY2xheno7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tcGFyZURhdGVEaXNhYmxlZChcbiAgICBkYXRlMURpc2FibGVkOiB7IGRhdGU6IERhdGU7IG1vZGU6IHN0cmluZyB9LFxuICAgIGRhdGUyOiBEYXRlXG4gICk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGRhdGUxRGlzYWJsZWQgPT09IHVuZGVmaW5lZCB8fCBkYXRlMiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChkYXRlMURpc2FibGVkLm1vZGUgPT09ICdkYXknICYmIHRoaXMuY29tcGFyZUhhbmRsZXJEYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVIYW5kbGVyRGF5KGRhdGUxRGlzYWJsZWQuZGF0ZSwgZGF0ZTIpO1xuICAgIH1cblxuICAgIGlmIChkYXRlMURpc2FibGVkLm1vZGUgPT09ICdtb250aCcgJiYgdGhpcy5jb21wYXJlSGFuZGxlck1vbnRoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wYXJlSGFuZGxlck1vbnRoKGRhdGUxRGlzYWJsZWQuZGF0ZSwgZGF0ZTIpO1xuICAgIH1cblxuICAgIGlmIChkYXRlMURpc2FibGVkLm1vZGUgPT09ICd5ZWFyJyAmJiB0aGlzLmNvbXBhcmVIYW5kbGVyWWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZUhhbmRsZXJZZWFyKGRhdGUxRGlzYWJsZWQuZGF0ZSwgZGF0ZTIpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgbGV0IGlzRGF0ZURpc2FibGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGF0ZURpc2FibGVkKSB7XG4gICAgICB0aGlzLmRhdGVEaXNhYmxlZC5mb3JFYWNoKFxuICAgICAgICAoZGlzYWJsZWREYXRlOiB7IGRhdGU6IERhdGU7IG1vZGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29tcGFyZURhdGVEaXNhYmxlZChkaXNhYmxlZERhdGUsIGRhdGUpID09PSAwKSB7XG4gICAgICAgICAgICBpc0RhdGVEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRheURpc2FibGVkKSB7XG4gICAgICBpc0RhdGVEaXNhYmxlZCA9XG4gICAgICAgIGlzRGF0ZURpc2FibGVkIHx8XG4gICAgICAgIHRoaXMuZGF5RGlzYWJsZWQuaW5kZXhPZihkYXRlLmdldERheSgpKSA+IC0xO1xuICAgIH1cblxuICAgIGlmIChpc0RhdGVEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIGlzRGF0ZURpc2FibGVkO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbkRhdGUgPSBOdW1iZXIodGhpcy5taW5EYXRlICYmIHRoaXMuY29tcGFyZShkYXRlLCB0aGlzLm1pbkRhdGUpKTtcbiAgICBpZiAoIWlzTmFOKG1pbkRhdGUpKSB7XG4gICAgICByZXR1cm4gbWluRGF0ZSA8IDA7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4RGF0ZSA9IE51bWJlcih0aGlzLm1heERhdGUgJiYgdGhpcy5jb21wYXJlKGRhdGUsIHRoaXMubWF4RGF0ZSkpO1xuICAgIGlmICghaXNOYU4obWF4RGF0ZSkpIHtcbiAgICAgIHJldHVybiBtYXhEYXRlID4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
|