@updevs/components 1.0.0-alpha.47 → 1.0.0-alpha.49
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/README.md +1 -13
- package/calendar/calendar.component.d.ts +58 -122
- package/calendar/models/calendar-date.model.d.ts +10 -0
- package/calendar/models/calendar-month.model.d.ts +7 -0
- package/calendar/models/calendar-selected.model.d.ts +5 -0
- package/calendar/models/calendar-year.model.d.ts +6 -0
- package/calendar/models/date-range.model.d.ts +0 -4
- package/calendar/models/enums/calendar-view.enum.d.ts +5 -0
- package/calendar/models/public-api.d.ts +5 -0
- package/calendar/upd-calendar.module.d.ts +6 -11
- package/card/public-api.d.ts +1 -0
- package/card/types/public-api.d.ts +5 -0
- package/dropdown/dropdown.component.d.ts +3 -0
- package/esm2022/calendar/calendar.component.mjs +288 -217
- package/esm2022/calendar/models/calendar-date.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-month.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-selected.model.mjs +2 -0
- package/esm2022/calendar/models/calendar-year.model.mjs +2 -0
- package/esm2022/calendar/models/date-range.model.mjs +1 -1
- package/esm2022/calendar/models/enums/calendar-view.enum.mjs +7 -0
- package/esm2022/calendar/models/public-api.mjs +6 -1
- package/esm2022/calendar/upd-calendar.module.mjs +2 -20
- package/esm2022/card/public-api.mjs +2 -1
- package/esm2022/card/types/public-api.mjs +6 -0
- package/esm2022/dropdown/dropdown.component.mjs +23 -7
- package/esm2022/form-controls/date-picker/date-picker.component.mjs +45 -60
- package/esm2022/form-controls/input/input.component.mjs +3 -3
- package/esm2022/lib/models/row-column-size.mjs +1 -1
- package/esm2022/lib/tools/column-size.helper.mjs +2 -2
- package/esm2022/popover/popover.directive.mjs +10 -26
- package/esm2022/pricing-cards/index.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item-feature.model.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item-features-group.model.mjs +2 -0
- package/esm2022/pricing-cards/models/price-item.model.mjs +2 -0
- package/esm2022/pricing-cards/models/public-api.mjs +4 -0
- package/esm2022/pricing-cards/pricing-cards.component.mjs +24 -0
- package/esm2022/pricing-cards/public-api.mjs +4 -0
- package/esm2022/pricing-cards/upd-pricing-cards.module.mjs +36 -0
- package/esm2022/pricing-cards/updevs-components-pricing-cards.mjs +5 -0
- package/esm2022/table/abstractions/base.column.mjs +30 -44
- package/esm2022/table/table.component.mjs +9 -12
- package/fesm2022/updevs-components-calendar.mjs +319 -1449
- package/fesm2022/updevs-components-calendar.mjs.map +1 -1
- package/fesm2022/updevs-components-dropdown.mjs +22 -6
- package/fesm2022/updevs-components-dropdown.mjs.map +1 -1
- package/fesm2022/updevs-components-form-controls-date-picker.mjs +44 -59
- package/fesm2022/updevs-components-form-controls-date-picker.mjs.map +1 -1
- package/fesm2022/updevs-components-form-controls-input.mjs +2 -2
- package/fesm2022/updevs-components-form-controls-input.mjs.map +1 -1
- package/fesm2022/updevs-components-popover.mjs +9 -25
- package/fesm2022/updevs-components-popover.mjs.map +1 -1
- package/fesm2022/updevs-components-pricing-cards.mjs +64 -0
- package/fesm2022/updevs-components-pricing-cards.mjs.map +1 -0
- package/fesm2022/updevs-components-table.mjs +38 -55
- package/fesm2022/updevs-components-table.mjs.map +1 -1
- package/fesm2022/updevs-components.mjs +1 -1
- package/fesm2022/updevs-components.mjs.map +1 -1
- package/form-controls/date-picker/date-picker.component.d.ts +10 -31
- package/lib/models/row-column-size.d.ts +5 -9
- package/package.json +36 -30
- package/pricing-cards/index.d.ts +1 -0
- package/pricing-cards/models/price-item-feature.model.d.ts +5 -0
- package/pricing-cards/models/price-item-features-group.model.d.ts +5 -0
- package/pricing-cards/models/price-item.model.d.ts +19 -0
- package/pricing-cards/models/public-api.d.ts +3 -0
- package/pricing-cards/pricing-cards.component.d.ts +11 -0
- package/pricing-cards/public-api.d.ts +3 -0
- package/pricing-cards/upd-pricing-cards.module.d.ts +11 -0
- package/table/abstractions/base.column.d.ts +4 -0
- package/calendar/components/calendar-body/calendar-body.component.d.ts +0 -263
- package/calendar/components/calendar-header/calendar-header.component.d.ts +0 -57
- package/calendar/components/calendar-month-view/calendar-month-view.component.d.ts +0 -151
- package/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +0 -10
- package/calendar/components/calendar-year-view/calendar-year-view.component.d.ts +0 -9
- package/calendar/models/calendar-cell.model.d.ts +0 -16
- package/calendar/services/calendar.service.d.ts +0 -15
- package/calendar/tools/events-options.d.ts +0 -12
- package/calendar/tools/keyboard-tools.d.ts +0 -9
- package/calendar/tools/passive-listeners.d.ts +0 -16
- package/calendar/types/calendar-cell-class-function.type.d.ts +0 -3
- package/calendar/types/calendar-cell-css-classes.type.d.ts +0 -3
- package/calendar/types/modifier-key.type.d.ts +0 -1
- package/esm2022/calendar/components/calendar-body/calendar-body.component.mjs +0 -515
- package/esm2022/calendar/components/calendar-header/calendar-header.component.mjs +0 -144
- package/esm2022/calendar/components/calendar-month-view/calendar-month-view.component.mjs +0 -423
- package/esm2022/calendar/components/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -18
- package/esm2022/calendar/components/calendar-year-view/calendar-year-view.component.mjs +0 -17
- package/esm2022/calendar/models/calendar-cell.model.mjs +0 -18
- package/esm2022/calendar/services/calendar.service.mjs +0 -40
- package/esm2022/calendar/tools/events-options.mjs +0 -14
- package/esm2022/calendar/tools/keyboard-tools.mjs +0 -14
- package/esm2022/calendar/tools/passive-listeners.mjs +0 -29
- package/esm2022/calendar/types/calendar-cell-class-function.type.mjs +0 -2
- package/esm2022/calendar/types/calendar-cell-css-classes.type.mjs +0 -2
- package/esm2022/calendar/types/modifier-key.type.mjs +0 -2
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { Component, inject } from '@angular/core';
|
|
2
|
-
import { DateService } from '@updevs/sdk/core';
|
|
3
|
-
import { CalendarService } from '../../services/calendar.service';
|
|
4
|
-
import { CalendarSignalsService } from '../../services/calendar-signals.service';
|
|
5
|
-
import { yearsPerPage } from '../calendar-multi-year-view/calendar-multi-year-view.component';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@updevs/components/button";
|
|
8
|
-
import * as i2 from "@jsverse/transloco";
|
|
9
|
-
import * as i3 from "@updevs/icons";
|
|
10
|
-
let calendarHeaderId = 1;
|
|
11
|
-
export class CalendarHeaderComponent {
|
|
12
|
-
constructor() {
|
|
13
|
-
this.id = `upd-calendar-header-${calendarHeaderId++}`;
|
|
14
|
-
this.calendarService = inject(CalendarService);
|
|
15
|
-
this.calendarSignalsService = inject(CalendarSignalsService);
|
|
16
|
-
this.dateService = inject(DateService);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* The `aria-label` for changing the calendar view.
|
|
20
|
-
*/
|
|
21
|
-
get periodButtonLabel() {
|
|
22
|
-
return this.calendarSignalsService.currentView() === 'month' ? 'SwitchToMultiYearView' : 'SwitchToMonthView';
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* The label for the previous button.
|
|
26
|
-
*/
|
|
27
|
-
get prevButtonLabel() {
|
|
28
|
-
return {
|
|
29
|
-
'month': 'PreviousMonth',
|
|
30
|
-
'year': 'PreviousYear',
|
|
31
|
-
'multi-year': 'PreviousMultiYear'
|
|
32
|
-
}[this.calendarSignalsService.currentView()];
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* The label for the next button.
|
|
36
|
-
*/
|
|
37
|
-
get nextButtonLabel() {
|
|
38
|
-
return {
|
|
39
|
-
'month': 'NextMonth',
|
|
40
|
-
'year': 'NextYear',
|
|
41
|
-
'multi-year': 'NextMultiYear'
|
|
42
|
-
}[this.calendarSignalsService.currentView()];
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Whether the selected view is not a month.
|
|
46
|
-
*/
|
|
47
|
-
get isNotMonth() {
|
|
48
|
-
return this.calendarSignalsService.currentView() !== 'month';
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* ID of the label of the period button.
|
|
52
|
-
*/
|
|
53
|
-
get periodButtonLabelId() {
|
|
54
|
-
return `${this.id}-period-label`;
|
|
55
|
-
}
|
|
56
|
-
get minYearOfPageLabel() {
|
|
57
|
-
return this.dateService.getYearName(this.dateService.create(this.minYearOfPage, 0, 1));
|
|
58
|
-
}
|
|
59
|
-
get maxYearOfPageLabel() {
|
|
60
|
-
const maxYearOfPage = this.minYearOfPage + yearsPerPage - 1;
|
|
61
|
-
return this.dateService.getYearName(this.dateService.create(maxYearOfPage, 0, 1));
|
|
62
|
-
}
|
|
63
|
-
get periodText() {
|
|
64
|
-
if (this.calendarSignalsService.currentView() === 'month') {
|
|
65
|
-
return this.dateService
|
|
66
|
-
.format(this.calendarSignalsService.activeDate(), { year: 'numeric', month: 'short' })
|
|
67
|
-
.toLocaleUpperCase();
|
|
68
|
-
}
|
|
69
|
-
if (this.calendarSignalsService.currentView() === 'year') {
|
|
70
|
-
return this.dateService.getYearName(this.calendarSignalsService.activeDate());
|
|
71
|
-
}
|
|
72
|
-
return '';
|
|
73
|
-
}
|
|
74
|
-
get minYearOfPage() {
|
|
75
|
-
// The offset from the active year to the "slot" for the starting year is the
|
|
76
|
-
// *actual* first rendered year in the multi-year view, and the last year is
|
|
77
|
-
// just yearsPerPage - 1 away.
|
|
78
|
-
const activeDate = this.calendarSignalsService.activeDate();
|
|
79
|
-
const activeYear = activeDate.getFullYear();
|
|
80
|
-
const offset = this.calendarService.getMultiYearActiveOffset(activeDate, this.calendarSignalsService.minDate(), this.calendarSignalsService.maxDate());
|
|
81
|
-
return activeYear - offset;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Handles user clicks on the period label.
|
|
85
|
-
*/
|
|
86
|
-
currentPeriodClicked() {
|
|
87
|
-
this.calendarSignalsService.currentView = this.calendarSignalsService.currentView() === 'month' ? 'multi-year' : 'month';
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Handles user clicks on the previous button.
|
|
91
|
-
*/
|
|
92
|
-
previousClicked() {
|
|
93
|
-
this.calendarSignalsService.activeDate =
|
|
94
|
-
this.calendarSignalsService.currentView() === 'month'
|
|
95
|
-
? this.dateService.addMonths(this.calendarSignalsService.activeDate(), -1)
|
|
96
|
-
: this.dateService.addYears(this.calendarSignalsService.activeDate(), this.calendarSignalsService.currentView() === 'year' ? -1 : -yearsPerPage);
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Handles user clicks on the next button.
|
|
100
|
-
*/
|
|
101
|
-
nextClicked() {
|
|
102
|
-
this.calendarSignalsService.activeDate =
|
|
103
|
-
this.calendarSignalsService.currentView() === 'month'
|
|
104
|
-
? this.dateService.addMonths(this.calendarSignalsService.activeDate(), 1)
|
|
105
|
-
: this.dateService.addYears(this.calendarSignalsService.activeDate(), this.calendarSignalsService.currentView() === 'year' ? 1 : yearsPerPage);
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Whether the previous period button is enabled.
|
|
109
|
-
*/
|
|
110
|
-
previousEnabled() {
|
|
111
|
-
if (!this.calendarSignalsService.minDate()) {
|
|
112
|
-
return true;
|
|
113
|
-
}
|
|
114
|
-
return !this.calendarSignalsService.minDate()
|
|
115
|
-
|| !this.isSameView(this.calendarSignalsService.activeDate(), this.calendarSignalsService.minDate());
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Whether the next period button is enabled.
|
|
119
|
-
*/
|
|
120
|
-
nextEnabled() {
|
|
121
|
-
return !this.calendarSignalsService.maxDate()
|
|
122
|
-
|| !this.isSameView(this.calendarSignalsService.activeDate(), this.calendarSignalsService.maxDate());
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Whether the two dates represent the same view in the current view mode (month or year).
|
|
126
|
-
*/
|
|
127
|
-
isSameView(date1, date2) {
|
|
128
|
-
if (this.calendarSignalsService.currentView() === 'month') {
|
|
129
|
-
return date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth();
|
|
130
|
-
}
|
|
131
|
-
if (this.calendarSignalsService.currentView() === 'year') {
|
|
132
|
-
return date1.getFullYear() === date2.getFullYear();
|
|
133
|
-
}
|
|
134
|
-
// Otherwise we are in 'multi-year' view.
|
|
135
|
-
return this.calendarService.isSameMultiYearView(date1, date2, this.calendarSignalsService.minDate(), this.calendarSignalsService.maxDate());
|
|
136
|
-
}
|
|
137
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
138
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.0", type: CalendarHeaderComponent, selector: "upd-calendar-header", ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'UpDevs.Calendar'\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col d-flex\">\n <label [id]=\"periodButtonLabelId\" class=\"visually-hidden\" aria-live=\"polite\">\n {{ periodText || t('YearRangeLabel', { start: minYearOfPageLabel, end: maxYearOfPageLabel }) }}\n </label>\n\n <upd-button [isIcon]=\"true\" [iconModel]=\"{tablerIcon:'chevron-left'}\" [isDisabled]=\"!previousEnabled()\"\n (clicked)=\"previousClicked()\" [attr.aria-label]=\"t(prevButtonLabel)\">\n </upd-button>\n\n <upd-button (click)=\"currentPeriodClicked()\" [attr.aria-label]=\"t(periodButtonLabel)\"\n [attr.aria-describedby]=\"periodButtonLabelId\" customClasses=\"mx-1 flex-grow-1\">\n <span aria-hidden=\"true\">\n {{ periodText || t('YearRange', { start: minYearOfPageLabel, end: maxYearOfPageLabel }) }}\n </span>\n <upd-icon [tablerIcon]=\"!isNotMonth ? 'chevron-down' : 'chevron-up'\"></upd-icon>\n </upd-button>\n\n <upd-button [isIcon]=\"true\" [iconModel]=\"{tablerIcon:'chevron-right'}\" [isDisabled]=\"!nextEnabled()\"\n (clicked)=\"nextClicked()\" [attr.aria-label]=\"t(nextButtonLabel)\">\n </upd-button>\n </div>\n </div>\n </div>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "component", type: i1.ButtonComponent, selector: "upd-button", inputs: ["model", "text", "brandColorStyle", "customClasses", "isOutline", "isGhost", "isSquare", "isPill", "isIcon", "isLoading", "isList", "isFloating", "isAction", "isNavigationLink", "isLink", "shouldIgnoreBtnClass", "iconModel", "iconPosition", "isDisabled", "isActive", "badgeConfig", "colorStyle", "size", "title"], outputs: ["clicked"] }, { kind: "directive", type: i2.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: i3.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }] }); }
|
|
139
|
-
}
|
|
140
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: CalendarHeaderComponent, decorators: [{
|
|
141
|
-
type: Component,
|
|
142
|
-
args: [{ selector: 'upd-calendar-header', template: "<ng-container *transloco=\"let t; prefix: 'UpDevs.Calendar'\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col d-flex\">\n <label [id]=\"periodButtonLabelId\" class=\"visually-hidden\" aria-live=\"polite\">\n {{ periodText || t('YearRangeLabel', { start: minYearOfPageLabel, end: maxYearOfPageLabel }) }}\n </label>\n\n <upd-button [isIcon]=\"true\" [iconModel]=\"{tablerIcon:'chevron-left'}\" [isDisabled]=\"!previousEnabled()\"\n (clicked)=\"previousClicked()\" [attr.aria-label]=\"t(prevButtonLabel)\">\n </upd-button>\n\n <upd-button (click)=\"currentPeriodClicked()\" [attr.aria-label]=\"t(periodButtonLabel)\"\n [attr.aria-describedby]=\"periodButtonLabelId\" customClasses=\"mx-1 flex-grow-1\">\n <span aria-hidden=\"true\">\n {{ periodText || t('YearRange', { start: minYearOfPageLabel, end: maxYearOfPageLabel }) }}\n </span>\n <upd-icon [tablerIcon]=\"!isNotMonth ? 'chevron-down' : 'chevron-up'\"></upd-icon>\n </upd-button>\n\n <upd-button [isIcon]=\"true\" [iconModel]=\"{tablerIcon:'chevron-right'}\" [isDisabled]=\"!nextEnabled()\"\n (clicked)=\"nextClicked()\" [attr.aria-label]=\"t(nextButtonLabel)\">\n </upd-button>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
|
|
143
|
-
}] });
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1oZWFkZXIvY2FsZW5kYXItaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jYWxlbmRhci9zcmMvY29tcG9uZW50cy9jYWxlbmRhci1oZWFkZXIvY2FsZW5kYXItaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdFQUFnRSxDQUFDOzs7OztBQUU5RixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQU96QixNQUFNLE9BQU8sdUJBQXVCO0lBTHBDO1FBdUZZLE9BQUUsR0FBRyx1QkFBdUIsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzFDLDJCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3hELGdCQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBMkV0RDtJQS9KRzs7T0FFRztJQUNILElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO0lBQ2pILENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksZUFBZTtRQUNmLE9BQU87WUFDSCxPQUFPLEVBQUUsZUFBZTtZQUN4QixNQUFNLEVBQUUsY0FBYztZQUN0QixZQUFZLEVBQUUsbUJBQW1CO1NBQ3BDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxlQUFlO1FBQ2YsT0FBTztZQUNILE9BQU8sRUFBRSxXQUFXO1lBQ3BCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLFlBQVksRUFBRSxlQUFlO1NBQ2hDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksbUJBQW1CO1FBQ25CLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDbEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDVixJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQyxXQUFXO2lCQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7aUJBQ3JGLGlCQUFpQixFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3ZELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQVksYUFBYTtRQUNyQiw2RUFBNkU7UUFDN0UsNEVBQTRFO1FBQzVFLDhCQUE4QjtRQUM5QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQ3hELFVBQVUsRUFDVixJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLEVBQ3JDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsQ0FDeEMsQ0FBQztRQUVGLE9BQU8sVUFBVSxHQUFHLE1BQU0sQ0FBQztJQUMvQixDQUFDO0lBT0Q7O09BRUc7SUFDSCxvQkFBb0I7UUFDaEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM3SCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ1gsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVU7WUFDbEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU87Z0JBQ2pELENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FDdkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxFQUN4QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQzVFLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1AsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVU7WUFDbEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU87Z0JBQ2pELENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsRUFDeEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQzFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRTtlQUN0QyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUcsQ0FBQyxDQUFDO0lBQzlHLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDUCxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRTtlQUN0QyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUcsQ0FBQyxDQUFDO0lBQzlHLENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVUsQ0FBQyxLQUFXLEVBQUUsS0FBVztRQUN2QyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN4RCxPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDdkQsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZELENBQUM7UUFFRCx5Q0FBeUM7UUFDekMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUMzQyxLQUFLLEVBQ0wsS0FBSyxFQUNMLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsRUFDckMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxDQUN4QyxDQUFDO0lBQ04sQ0FBQzs4R0EvSlEsdUJBQXVCO2tHQUF2Qix1QkFBdUIsMkRDZHBDLGkvQ0EyQkE7OzJGRGJhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDSSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZVNlcnZpY2UgfSBmcm9tICdAdXBkZXZzL3Nkay9jb3JlJztcblxuaW1wb3J0IHsgQ2FsZW5kYXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2FsZW5kYXIuc2VydmljZSc7XG5pbXBvcnQgeyBDYWxlbmRhclNpZ25hbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2FsZW5kYXItc2lnbmFscy5zZXJ2aWNlJztcbmltcG9ydCB7IHllYXJzUGVyUGFnZSB9IGZyb20gJy4uL2NhbGVuZGFyLW11bHRpLXllYXItdmlldy9jYWxlbmRhci1tdWx0aS15ZWFyLXZpZXcuY29tcG9uZW50JztcblxubGV0IGNhbGVuZGFySGVhZGVySWQgPSAxO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VwZC1jYWxlbmRhci1oZWFkZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9jYWxlbmRhci1oZWFkZXIuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFySGVhZGVyQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGFyaWEtbGFiZWxgIGZvciBjaGFuZ2luZyB0aGUgY2FsZW5kYXIgdmlldy5cbiAgICAgKi9cbiAgICBnZXQgcGVyaW9kQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5jdXJyZW50VmlldygpID09PSAnbW9udGgnID8gJ1N3aXRjaFRvTXVsdGlZZWFyVmlldycgOiAnU3dpdGNoVG9Nb250aFZpZXcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBsYWJlbCBmb3IgdGhlIHByZXZpb3VzIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBnZXQgcHJldkJ1dHRvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnbW9udGgnOiAnUHJldmlvdXNNb250aCcsXG4gICAgICAgICAgICAneWVhcic6ICdQcmV2aW91c1llYXInLFxuICAgICAgICAgICAgJ211bHRpLXllYXInOiAnUHJldmlvdXNNdWx0aVllYXInXG4gICAgICAgIH1bdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmN1cnJlbnRWaWV3KCldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBsYWJlbCBmb3IgdGhlIG5leHQgYnV0dG9uLlxuICAgICAqL1xuICAgIGdldCBuZXh0QnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdtb250aCc6ICdOZXh0TW9udGgnLFxuICAgICAgICAgICAgJ3llYXInOiAnTmV4dFllYXInLFxuICAgICAgICAgICAgJ211bHRpLXllYXInOiAnTmV4dE11bHRpWWVhcidcbiAgICAgICAgfVt0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuY3VycmVudFZpZXcoKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgc2VsZWN0ZWQgdmlldyBpcyBub3QgYSBtb250aC5cbiAgICAgKi9cbiAgICBnZXQgaXNOb3RNb250aCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5jdXJyZW50VmlldygpICE9PSAnbW9udGgnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBsYWJlbCBvZiB0aGUgcGVyaW9kIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBnZXQgcGVyaW9kQnV0dG9uTGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5pZH0tcGVyaW9kLWxhYmVsYDtcbiAgICB9XG5cbiAgICBnZXQgbWluWWVhck9mUGFnZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVTZXJ2aWNlLmdldFllYXJOYW1lKHRoaXMuZGF0ZVNlcnZpY2UuY3JlYXRlKHRoaXMubWluWWVhck9mUGFnZSwgMCwgMSkpO1xuICAgIH1cblxuICAgIGdldCBtYXhZZWFyT2ZQYWdlTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbWF4WWVhck9mUGFnZSA9IHRoaXMubWluWWVhck9mUGFnZSArIHllYXJzUGVyUGFnZSAtIDE7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVTZXJ2aWNlLmdldFllYXJOYW1lKHRoaXMuZGF0ZVNlcnZpY2UuY3JlYXRlKG1heFllYXJPZlBhZ2UsIDAsIDEpKTtcbiAgICB9XG5cbiAgICBnZXQgcGVyaW9kVGV4dCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmN1cnJlbnRWaWV3KCkgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmZvcm1hdCh0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSgpLCB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcgfSlcbiAgICAgICAgICAgICAgICAudG9Mb2NhbGVVcHBlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuY3VycmVudFZpZXcoKSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlU2VydmljZS5nZXRZZWFyTmFtZSh0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBtaW5ZZWFyT2ZQYWdlKCk6IG51bWJlciB7XG4gICAgICAgIC8vIFRoZSBvZmZzZXQgZnJvbSB0aGUgYWN0aXZlIHllYXIgdG8gdGhlIFwic2xvdFwiIGZvciB0aGUgc3RhcnRpbmcgeWVhciBpcyB0aGVcbiAgICAgICAgLy8gKmFjdHVhbCogZmlyc3QgcmVuZGVyZWQgeWVhciBpbiB0aGUgbXVsdGkteWVhciB2aWV3LCBhbmQgdGhlIGxhc3QgeWVhciBpc1xuICAgICAgICAvLyBqdXN0IHllYXJzUGVyUGFnZSAtIDEgYXdheS5cbiAgICAgICAgY29uc3QgYWN0aXZlRGF0ZSA9IHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVllYXIgPSBhY3RpdmVEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuY2FsZW5kYXJTZXJ2aWNlLmdldE11bHRpWWVhckFjdGl2ZU9mZnNldChcbiAgICAgICAgICAgIGFjdGl2ZURhdGUsXG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UubWluRGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLm1heERhdGUoKVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBhY3RpdmVZZWFyIC0gb2Zmc2V0O1xuICAgIH1cblxuICAgIHByaXZhdGUgaWQgPSBgdXBkLWNhbGVuZGFyLWhlYWRlci0ke2NhbGVuZGFySGVhZGVySWQrK31gO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FsZW5kYXJTZXJ2aWNlID0gaW5qZWN0KENhbGVuZGFyU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWxlbmRhclNpZ25hbHNTZXJ2aWNlID0gaW5qZWN0KENhbGVuZGFyU2lnbmFsc1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0ZVNlcnZpY2UgPSBpbmplY3QoRGF0ZVNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB1c2VyIGNsaWNrcyBvbiB0aGUgcGVyaW9kIGxhYmVsLlxuICAgICAqL1xuICAgIGN1cnJlbnRQZXJpb2RDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuY3VycmVudFZpZXcgPSB0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuY3VycmVudFZpZXcoKSA9PT0gJ21vbnRoJyA/ICdtdWx0aS15ZWFyJyA6ICdtb250aCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB1c2VyIGNsaWNrcyBvbiB0aGUgcHJldmlvdXMgYnV0dG9uLlxuICAgICAqL1xuICAgIHByZXZpb3VzQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUgPVxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmN1cnJlbnRWaWV3KCkgPT09ICdtb250aCdcbiAgICAgICAgICAgICAgICA/IHRoaXMuZGF0ZVNlcnZpY2UuYWRkTW9udGhzKHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlKCksIC0xKVxuICAgICAgICAgICAgICAgIDogdGhpcy5kYXRlU2VydmljZS5hZGRZZWFycyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmN1cnJlbnRWaWV3KCkgPT09ICd5ZWFyJyA/IC0xIDogLXllYXJzUGVyUGFnZVxuICAgICAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB1c2VyIGNsaWNrcyBvbiB0aGUgbmV4dCBidXR0b24uXG4gICAgICovXG4gICAgbmV4dENsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5hY3RpdmVEYXRlID1cbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5jdXJyZW50VmlldygpID09PSAnbW9udGgnXG4gICAgICAgICAgICAgICAgPyB0aGlzLmRhdGVTZXJ2aWNlLmFkZE1vbnRocyh0aGlzLmNhbGVuZGFyU2lnbmFsc1NlcnZpY2UuYWN0aXZlRGF0ZSgpLCAxKVxuICAgICAgICAgICAgICAgIDogdGhpcy5kYXRlU2VydmljZS5hZGRZZWFycyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmN1cnJlbnRWaWV3KCkgPT09ICd5ZWFyJyA/IDEgOiB5ZWFyc1BlclBhZ2VcbiAgICAgICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHByZXZpb3VzIHBlcmlvZCBidXR0b24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBwcmV2aW91c0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLm1pbkRhdGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5taW5EYXRlKClcbiAgICAgICAgICAgIHx8ICF0aGlzLmlzU2FtZVZpZXcodGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUoKSwgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLm1pbkRhdGUoKSEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIG5leHQgcGVyaW9kIGJ1dHRvbiBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIG5leHRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5tYXhEYXRlKClcbiAgICAgICAgICAgIHx8ICF0aGlzLmlzU2FtZVZpZXcodGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLmFjdGl2ZURhdGUoKSwgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLm1heERhdGUoKSEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHR3byBkYXRlcyByZXByZXNlbnQgdGhlIHNhbWUgdmlldyBpbiB0aGUgY3VycmVudCB2aWV3IG1vZGUgKG1vbnRoIG9yIHllYXIpLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNTYW1lVmlldyhkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5jdXJyZW50VmlldygpID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZTEuZ2V0RnVsbFllYXIoKSA9PT0gZGF0ZTIuZ2V0RnVsbFllYXIoKSAmJiBkYXRlMS5nZXRNb250aCgpID09PSBkYXRlMi5nZXRNb250aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5jdXJyZW50VmlldygpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlMS5nZXRGdWxsWWVhcigpID09PSBkYXRlMi5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIGFyZSBpbiAnbXVsdGkteWVhcicgdmlldy5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLmlzU2FtZU11bHRpWWVhclZpZXcoXG4gICAgICAgICAgICBkYXRlMSxcbiAgICAgICAgICAgIGRhdGUyLFxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNpZ25hbHNTZXJ2aWNlLm1pbkRhdGUoKSxcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTaWduYWxzU2VydmljZS5tYXhEYXRlKClcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICp0cmFuc2xvY289XCJsZXQgdDsgcHJlZml4OiAnVXBEZXZzLkNhbGVuZGFyJ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2lkXT1cInBlcmlvZEJ1dHRvbkxhYmVsSWRcIiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBwZXJpb2RUZXh0IHx8IHQoJ1llYXJSYW5nZUxhYmVsJywgeyBzdGFydDogbWluWWVhck9mUGFnZUxhYmVsLCBlbmQ6IG1heFllYXJPZlBhZ2VMYWJlbCB9KSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICA8dXBkLWJ1dHRvbiBbaXNJY29uXT1cInRydWVcIiBbaWNvbk1vZGVsXT1cInt0YWJsZXJJY29uOidjaGV2cm9uLWxlZnQnfVwiIFtpc0Rpc2FibGVkXT1cIiFwcmV2aW91c0VuYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInByZXZpb3VzQ2xpY2tlZCgpXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KHByZXZCdXR0b25MYWJlbClcIj5cbiAgICAgICAgICAgICAgICA8L3VwZC1idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8dXBkLWJ1dHRvbiAoY2xpY2spPVwiY3VycmVudFBlcmlvZENsaWNrZWQoKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwidChwZXJpb2RCdXR0b25MYWJlbClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInBlcmlvZEJ1dHRvbkxhYmVsSWRcIiBjdXN0b21DbGFzc2VzPVwibXgtMSBmbGV4LWdyb3ctMVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHBlcmlvZFRleHQgfHwgdCgnWWVhclJhbmdlJywgeyBzdGFydDogbWluWWVhck9mUGFnZUxhYmVsLCBlbmQ6IG1heFllYXJPZlBhZ2VMYWJlbCB9KSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiBbdGFibGVySWNvbl09XCIhaXNOb3RNb250aCA/ICdjaGV2cm9uLWRvd24nIDogJ2NoZXZyb24tdXAnXCI+PC91cGQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L3VwZC1idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8dXBkLWJ1dHRvbiBbaXNJY29uXT1cInRydWVcIiBbaWNvbk1vZGVsXT1cInt0YWJsZXJJY29uOidjaGV2cm9uLXJpZ2h0J31cIiBbaXNEaXNhYmxlZF09XCIhbmV4dEVuYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cIm5leHRDbGlja2VkKClcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQobmV4dEJ1dHRvbkxhYmVsKVwiPlxuICAgICAgICAgICAgICAgIDwvdXBkLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
|