@annalib/anna-core 20.2.19 → 20.2.21
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 +28 -28
- package/{esm2020 → esm2022}/annalib-anna-core.mjs +4 -4
- package/esm2022/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +14 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +13 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +11 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +43 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +14 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +13 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +22 -0
- package/esm2022/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +14 -0
- package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +44 -0
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +273 -273
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +46 -46
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +39 -39
- package/esm2022/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +2 -0
- package/esm2022/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +2 -0
- package/esm2022/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +11 -0
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-sort.model.mjs +7 -7
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +30 -30
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +39 -39
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +27 -27
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +22 -22
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +55 -55
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +26 -26
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +17 -17
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +208 -208
- package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +1259 -0
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +151 -151
- package/esm2022/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +135 -0
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +53 -53
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +65 -65
- package/{esm2020 → esm2022}/lib/anna-core-shared-lib/services/anna-sort.service.mjs +178 -178
- package/esm2022/lib/anna-core.module.mjs +226 -0
- package/esm2022/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +160 -0
- package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +371 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +252 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +185 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +312 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +298 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +845 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +64 -0
- package/esm2022/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +352 -0
- package/esm2022/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +204 -0
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +2 -2
- package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +180 -0
- package/{esm2020 → esm2022}/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +2 -2
- package/{esm2020 → esm2022}/public-api.mjs +58 -58
- package/fesm2022/annalib-anna-core.mjs +6063 -0
- package/fesm2022/annalib-anna-core.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.d.ts +5 -5
- package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +17 -17
- package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -11
- package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +12 -12
- package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -8
- package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +42 -41
- package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -34
- package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +16 -16
- package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +10 -10
- package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +16 -16
- package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +97 -97
- package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +118 -118
- package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +11 -11
- package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +25 -25
- package/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +8 -8
- package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -9
- package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -7
- package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +28 -28
- package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +154 -154
- package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +27 -27
- package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -21
- package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +8 -8
- package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +9 -9
- package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +18 -18
- package/lib/anna-core.module.d.ts +45 -45
- package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +45 -45
- package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +70 -70
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +60 -60
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.d.ts +53 -53
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +65 -65
- package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +83 -83
- package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +174 -174
- package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +17 -17
- package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -141
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -89
- package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -1
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -45
- package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -1
- package/package.json +5 -11
- package/public-api.d.ts +42 -42
- package/src/lib/anna-common-scss/_animate.scss +27 -27
- package/src/lib/anna-common-scss/_application-spacing.scss +7 -7
- package/src/lib/anna-common-scss/_bootstrap-tooltip.scss +27 -27
- package/src/lib/anna-common-scss/_button.scss +18 -18
- package/src/lib/anna-common-scss/_colors.scss +107 -107
- package/src/lib/anna-common-scss/_common-order-listing-table.scss +172 -172
- package/src/lib/anna-common-scss/_custom-anna-datepicker.scss +14 -14
- package/src/lib/anna-common-scss/_customDropdown.scss +123 -123
- package/src/lib/anna-common-scss/_dashboard-partials.scss +106 -106
- package/src/lib/anna-common-scss/_date-picker-form.scss +87 -87
- package/src/lib/anna-common-scss/_easy-filter.scss +138 -138
- package/src/lib/anna-common-scss/_edit-filter-popup.scss +70 -70
- package/src/lib/anna-common-scss/_filters.scss +712 -712
- package/src/lib/anna-common-scss/_font.scss +9 -9
- package/src/lib/anna-common-scss/_fonts.scss +86 -86
- package/src/lib/anna-common-scss/_generic-modal.scss +63 -63
- package/src/lib/anna-common-scss/_generic-table-common.scss +198 -198
- package/src/lib/anna-common-scss/_gt-table.scss +425 -425
- package/src/lib/anna-common-scss/_legend.scss +11 -11
- package/src/lib/anna-common-scss/_mat-button-toggle.scss +38 -38
- package/src/lib/anna-common-scss/_mat-menu.scss +17 -17
- package/src/lib/anna-common-scss/_mixins.scss +187 -187
- package/src/lib/anna-common-scss/_modal.scss +37 -37
- package/src/lib/anna-common-scss/_popup-filter-toggle-button.scss +36 -36
- package/src/lib/anna-common-scss/_scrollbar.scss +14 -14
- package/src/lib/anna-common-scss/_sort.scss +30 -30
- package/src/lib/anna-common-scss/_toggle.scss +86 -86
- package/src/lib/anna-common-scss/style.scss +1 -1
- package/src/lib/anna-common-scss/third-party-lib/_angular-material-mat-radio.scss +25 -25
- package/src/lib/anna-common-scss/third-party-lib/_anna-mat-button-toggle-group-size-lg.scss +34 -34
- package/src/lib/anna-common-scss/third-party-lib/_mat-autocomplete.scss +31 -31
- package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +0 -14
- package/esm2020/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +0 -13
- package/esm2020/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +0 -11
- package/esm2020/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +0 -43
- package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +0 -14
- package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +0 -22
- package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +0 -13
- package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +0 -22
- package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +0 -14
- package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -43
- package/esm2020/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +0 -2
- package/esm2020/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +0 -2
- package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +0 -11
- package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -1259
- package/esm2020/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +0 -135
- package/esm2020/lib/anna-core.module.mjs +0 -237
- package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +0 -160
- package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -371
- package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +0 -252
- package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +0 -185
- package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +0 -312
- package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +0 -298
- package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -840
- package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +0 -64
- package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -352
- package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +0 -204
- package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -180
- package/fesm2015/annalib-anna-core.mjs +0 -6076
- package/fesm2015/annalib-anna-core.mjs.map +0 -1
- package/fesm2020/annalib-anna-core.mjs +0 -6068
- package/fesm2020/annalib-anna-core.mjs.map +0 -1
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
// Angular import statements
|
|
2
|
+
import { DatePipe, NgIf, NgClass } from '@angular/common';
|
|
3
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
4
|
+
// Third party import statements
|
|
5
|
+
import { NgbCalendar, NgbDate, NgbDatepickerConfig, NgbInputDatepicker, NgbDatepicker, } from '@ng-bootstrap/ng-bootstrap';
|
|
6
|
+
import dayjs from 'dayjs';
|
|
7
|
+
import { AnnaDateTimeFormatService } from '../../../anna-core-shared-lib/services/anna-date-time-format.service';
|
|
8
|
+
import { AnnaGlobalConfigService } from '../../../anna-core-shared-lib/services/anna-global-config.service';
|
|
9
|
+
import { FormsModule } from '@angular/forms';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
12
|
+
import * as i2 from "../../../anna-core-shared-lib/services/anna-date-time-format.service";
|
|
13
|
+
import * as i3 from "../../../anna-core-shared-lib/services/anna-global-config.service";
|
|
14
|
+
import * as i4 from "@angular/forms";
|
|
15
|
+
// User defined import statements
|
|
16
|
+
export class AnnaWeekCalendarComponent {
|
|
17
|
+
ngOnChanges(changes) {
|
|
18
|
+
//if some values are not sent, setting the default values
|
|
19
|
+
this._defaultValues = this.globalConfigService.defaultWeekCalendarConfig;
|
|
20
|
+
this.config = { ...this._defaultValues, ...this.config };
|
|
21
|
+
if (this.config.selectCurrentWeek) {
|
|
22
|
+
this.initializeWeekData();
|
|
23
|
+
this.fromDate && this.selectWeek(this.fromDate);
|
|
24
|
+
}
|
|
25
|
+
this.formatter = this.formattedDates();
|
|
26
|
+
if (this.selectedFromDate && this.selectedEndDate && this.config) {
|
|
27
|
+
// this.selectWeek(this.fromDate);
|
|
28
|
+
this.fromDate = NgbDate.from(this.selectedFromDate);
|
|
29
|
+
this.toDate = NgbDate.from(this.selectedEndDate);
|
|
30
|
+
this.weekNumberGenerator();
|
|
31
|
+
this.displayToUI();
|
|
32
|
+
this.setCalendarMap();
|
|
33
|
+
}
|
|
34
|
+
if (this.disabledDates.length > 0) {
|
|
35
|
+
this.disabledFunc = (date, current) => {
|
|
36
|
+
return this.checkIfDateIsDisabled(date);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
constructor(calendar, datePickerConfig, annaDateTimeFormatService, globalConfigService) {
|
|
41
|
+
this.calendar = calendar;
|
|
42
|
+
this.datePickerConfig = datePickerConfig;
|
|
43
|
+
this.annaDateTimeFormatService = annaDateTimeFormatService;
|
|
44
|
+
this.globalConfigService = globalConfigService;
|
|
45
|
+
this.hoveredDate = null;
|
|
46
|
+
this.toDate = null;
|
|
47
|
+
this.weekNumbers = [];
|
|
48
|
+
this.dateToDisplay = '';
|
|
49
|
+
this.multiSelectDropdownOpen = false;
|
|
50
|
+
this.calendarMap = new Map();
|
|
51
|
+
this.disabledDates = [];
|
|
52
|
+
this.applyWeekCalendarChanges = new EventEmitter();
|
|
53
|
+
this.calendarToggled = new EventEmitter();
|
|
54
|
+
}
|
|
55
|
+
getWeekNumber(week, firstDayOfWeek) {
|
|
56
|
+
const weekStartDate = dayjs(convertNgbDateToMoment(week[0]), 'MM/DD/YYYY');
|
|
57
|
+
const weekYear = weekStartDate.year();
|
|
58
|
+
const yearStartDate = dayjs(`01/01/${weekYear}`, 'MM/DD/YYYY');
|
|
59
|
+
const weekDay = yearStartDate.day();
|
|
60
|
+
const noOfDays = weekStartDate.diff(yearStartDate, 'd') + 1;
|
|
61
|
+
function convertNgbDateToMoment(ngbDate) {
|
|
62
|
+
let formatType = 'MM/DD/YYYY';
|
|
63
|
+
let converted = null;
|
|
64
|
+
if (ngbDate && ngbDate.month && ngbDate.day && ngbDate.year) {
|
|
65
|
+
converted = ngbDate.month + '/' + ngbDate.day + '/' + ngbDate.year;
|
|
66
|
+
converted = dayjs(converted).format(formatType);
|
|
67
|
+
}
|
|
68
|
+
return converted;
|
|
69
|
+
}
|
|
70
|
+
function checkIfYearIsBroadcastLeapYear() {
|
|
71
|
+
let isLeapYear = (weekYear % 4 == 0 && weekYear % 100 != 0) || weekYear % 400 == 0;
|
|
72
|
+
return (isLeapYear && (weekDay == 0 || weekDay == 6)) || (!isLeapYear && weekDay == 0);
|
|
73
|
+
}
|
|
74
|
+
const isLeapYear = checkIfYearIsBroadcastLeapYear();
|
|
75
|
+
const divider = isLeapYear ? 53 : 52;
|
|
76
|
+
const adder = isLeapYear ? 2 : 1;
|
|
77
|
+
let broadcastNumberOfDays = weekDay + noOfDays;
|
|
78
|
+
let broadcastWeekNumber = broadcastNumberOfDays % 7 > 0 ? broadcastNumberOfDays / 7 + adder : broadcastNumberOfDays / 7;
|
|
79
|
+
if (Math.floor(broadcastWeekNumber % divider) === 0) {
|
|
80
|
+
return divider;
|
|
81
|
+
}
|
|
82
|
+
return Math.floor(broadcastWeekNumber % divider);
|
|
83
|
+
}
|
|
84
|
+
ngAfterViewInit() {
|
|
85
|
+
// CHANGES@ANNALIB Changed this.
|
|
86
|
+
// this.calendar["__proto__"].getWeekNumber = this.getWeekNumber;
|
|
87
|
+
Object.setPrototypeOf(this.calendar, { getWeekNumber: this.getWeekNumber });
|
|
88
|
+
}
|
|
89
|
+
ngOnInit() {
|
|
90
|
+
// this.selectWeek(this.fromDate);
|
|
91
|
+
this.setCalendarMap();
|
|
92
|
+
}
|
|
93
|
+
initializeWeekData() {
|
|
94
|
+
this.weekObjects = [];
|
|
95
|
+
this.fromDate = this.calendar.getToday();
|
|
96
|
+
this.today = this.calendar.getToday();
|
|
97
|
+
let backDatedPeriod = JSON.parse(localStorage.getItem('userDetails') || '{}').locking_period_days;
|
|
98
|
+
if (backDatedPeriod < 0) {
|
|
99
|
+
let date = this.calendar.getPrev(this.calendar.getToday(), 'd', Math.abs(backDatedPeriod));
|
|
100
|
+
this.today = NgbDate.from(date);
|
|
101
|
+
this.fromDate = NgbDate.from(date);
|
|
102
|
+
}
|
|
103
|
+
// Disable months before numberOfMonthsToEnable
|
|
104
|
+
this.datePickerConfig.markDisabled = (date) => {
|
|
105
|
+
let previousMonth = this.calendar.getPrev(this.today, 'm', this.config.numberOfMonthsToEnableInPast);
|
|
106
|
+
let previousDay = this.calendar.getPrev(previousMonth, 'd', 1);
|
|
107
|
+
return !NgbDate.from(previousDay).before(date);
|
|
108
|
+
};
|
|
109
|
+
this.formatter = this.formattedDates();
|
|
110
|
+
this.flag1 = false;
|
|
111
|
+
this.flag2 = false;
|
|
112
|
+
}
|
|
113
|
+
selectWeek(date) {
|
|
114
|
+
const dateObject = new Date(date.year, date.month - 1, date.day);
|
|
115
|
+
let constructDate = this.buildDate(dateObject);
|
|
116
|
+
if (!this.config.selectMultipleWeeks) {
|
|
117
|
+
//Single week selection
|
|
118
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
119
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
120
|
+
this.weekNumberGenerator();
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
if (date.before(this.fromDate)) {
|
|
124
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
125
|
+
if (this.flag1) {
|
|
126
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
127
|
+
}
|
|
128
|
+
this.flag1 = !this.flag1;
|
|
129
|
+
}
|
|
130
|
+
else if (date.after(this.toDate)) {
|
|
131
|
+
if (this.flag2) {
|
|
132
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
133
|
+
//this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
134
|
+
}
|
|
135
|
+
this.flag2 = !this.flag2;
|
|
136
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this.fromDate = this.constructStartDate(dateObject)(constructDate);
|
|
140
|
+
this.toDate = this.constructEndDate(dateObject)(constructDate);
|
|
141
|
+
}
|
|
142
|
+
if (this.disabledDates.length > 0) {
|
|
143
|
+
let dayjsStartDate = dayjs(this.annaDateTimeFormatService.convertNgbDateToMoment(this.fromDate), 'MM/DD/YYYY');
|
|
144
|
+
let dayjsEndDate = dayjs(this.annaDateTimeFormatService.convertNgbDateToMoment(this.toDate), 'MM/DD/YYYY');
|
|
145
|
+
let ngbDate;
|
|
146
|
+
while (!dayjsStartDate.isSame(dayjsEndDate)) {
|
|
147
|
+
ngbDate = this.annaDateTimeFormatService.convertToNgbDate(dayjsStartDate, 'MM/DD/YYYY');
|
|
148
|
+
if (this.checkIfDateIsDisabled(ngbDate)) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
dayjsStartDate.add(1, 'd');
|
|
152
|
+
}
|
|
153
|
+
let newDateObject = new Date(ngbDate.year, ngbDate.month - 1, ngbDate.day - 1);
|
|
154
|
+
let constructDate = this.buildDate(newDateObject);
|
|
155
|
+
this.toDate = this.constructEndDate(newDateObject)(constructDate);
|
|
156
|
+
}
|
|
157
|
+
this.weekNumberGenerator();
|
|
158
|
+
}
|
|
159
|
+
if (!this.config.showAsDropdown) {
|
|
160
|
+
this.applyChanges();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
weekNumberGenerator() {
|
|
164
|
+
let dates = [];
|
|
165
|
+
let week = [];
|
|
166
|
+
let startDate = NgbDate.from(this.fromDate);
|
|
167
|
+
let endDate = NgbDate.from(this.toDate);
|
|
168
|
+
week.push(startDate);
|
|
169
|
+
while (endDate != null && !startDate.equals(endDate)) {
|
|
170
|
+
let date = this.calendar.getNext(startDate, 'd', 1);
|
|
171
|
+
startDate = date;
|
|
172
|
+
week.push(date);
|
|
173
|
+
// Collect all days in week to calculate the week number
|
|
174
|
+
if (week.length == 7) {
|
|
175
|
+
dates.push(week);
|
|
176
|
+
week = [];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if ((this.config.maxWeeksToSelect ?? 0) > 0 && dates.length > (this.config.maxWeeksToSelect ?? 0)) {
|
|
180
|
+
dates.splice(this.config.maxWeeksToSelect ?? 0, dates.length - (this.config.maxWeeksToSelect ?? 0));
|
|
181
|
+
}
|
|
182
|
+
this.selectedDates(dates);
|
|
183
|
+
this.weekNumbers = [];
|
|
184
|
+
this.weekObjects = [];
|
|
185
|
+
if (dates.length > 0) {
|
|
186
|
+
for (let date of dates) {
|
|
187
|
+
this.weekNumbers.push(' Week ' + this.calendar.getWeekNumber(date, this.config.firstDayOfWeek));
|
|
188
|
+
let dates = this.formatter(date[0], date[6]);
|
|
189
|
+
let dateObjects = { startDate: dates.formattedStartDate, endDate: dates.formattedEndDate };
|
|
190
|
+
this.weekObjects.push(dateObjects);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.displayToUI();
|
|
194
|
+
}
|
|
195
|
+
selectedDates(dates) {
|
|
196
|
+
this.fromDate = dates[0][0];
|
|
197
|
+
this.toDate = dates[dates.length - 1][6];
|
|
198
|
+
}
|
|
199
|
+
formattedDates() {
|
|
200
|
+
let pipe = new DatePipe('en-US');
|
|
201
|
+
let thisObj = this;
|
|
202
|
+
return function (fromDate, toDate) {
|
|
203
|
+
let fromDateObject = new Date(fromDate.year, fromDate.month - 1, fromDate.day);
|
|
204
|
+
let toDateObject = new Date(toDate.year, toDate.month - 1, toDate.day);
|
|
205
|
+
thisObj.formattedStartDate = pipe.transform(fromDateObject, thisObj.config.dateFormatForRequest);
|
|
206
|
+
thisObj.formattedEndDate = pipe.transform(toDateObject, thisObj.config.dateFormatForRequest);
|
|
207
|
+
thisObj.dateToDisplay =
|
|
208
|
+
pipe.transform(fromDateObject, thisObj.config.dateFormatToDisplay) +
|
|
209
|
+
' to ' +
|
|
210
|
+
pipe.transform(toDateObject, thisObj.config.dateFormatToDisplay);
|
|
211
|
+
return thisObj;
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
displayToUI() {
|
|
215
|
+
if (!this.config.selectMultipleWeeks && this.fromDate && this.toDate) {
|
|
216
|
+
// Display for only Single Week
|
|
217
|
+
this.formatter(this.fromDate, this.toDate);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
// Display for Multiple Weeks
|
|
221
|
+
if (this.weekNumbers.length > (this.config.maxWeeksToShowWithRemainingCount ?? 0)) {
|
|
222
|
+
let weekDisplay = [];
|
|
223
|
+
for (let i = 0; i < (this.config.maxWeeksToShowWithRemainingCount ?? 0); i++) {
|
|
224
|
+
weekDisplay.push(this.weekNumbers.shift());
|
|
225
|
+
}
|
|
226
|
+
let remainingWeeks = this.weekNumbers.length;
|
|
227
|
+
this.weekNumbers = [];
|
|
228
|
+
this.weekNumbers.push(weekDisplay + ' +' + remainingWeeks);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
constructStartDate(date) {
|
|
233
|
+
let firstDayOfWeek = this.config.firstDayOfWeek;
|
|
234
|
+
return function (constructDate) {
|
|
235
|
+
let startDay = date.getDay() != 0 ? (firstDayOfWeek ?? 0) - date.getDay() : -6;
|
|
236
|
+
return constructDate(startDay);
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
constructEndDate(date) {
|
|
240
|
+
let firstDayOfWeek = this.config.firstDayOfWeek;
|
|
241
|
+
return function (constructDate) {
|
|
242
|
+
let endDay = date.getDay() != 0 ? (firstDayOfWeek ?? 0) + 6 - date.getDay() : 0;
|
|
243
|
+
return constructDate(endDay);
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
buildDate(date) {
|
|
247
|
+
return function (number) {
|
|
248
|
+
let day = date.getDate() + number;
|
|
249
|
+
const dateObject = new Date(date.getFullYear(), date.getMonth(), day);
|
|
250
|
+
let ngbDateObject = {};
|
|
251
|
+
ngbDateObject.day = day;
|
|
252
|
+
if (ngbDateObject.day > 31 || ngbDateObject.day < 1) {
|
|
253
|
+
ngbDateObject.day = dateObject.getDate();
|
|
254
|
+
}
|
|
255
|
+
ngbDateObject.month = dateObject.getMonth() + 1;
|
|
256
|
+
ngbDateObject.year = dateObject.getFullYear();
|
|
257
|
+
return NgbDate.from(ngbDateObject);
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
isHovered(date) {
|
|
261
|
+
return (this.fromDate &&
|
|
262
|
+
!this.toDate &&
|
|
263
|
+
this.hoveredDate &&
|
|
264
|
+
date.after(this.fromDate) &&
|
|
265
|
+
date.before(this.hoveredDate));
|
|
266
|
+
}
|
|
267
|
+
isInside(date) {
|
|
268
|
+
return this.toDate && date.after(this.fromDate) && date.before(this.toDate);
|
|
269
|
+
}
|
|
270
|
+
isRange(date) {
|
|
271
|
+
return (date.equals(this.fromDate) ||
|
|
272
|
+
(this.toDate && date.equals(this.toDate)) ||
|
|
273
|
+
this.isInside(date) ||
|
|
274
|
+
this.isHovered(date));
|
|
275
|
+
}
|
|
276
|
+
previousWeek() {
|
|
277
|
+
if (this.fromDate) {
|
|
278
|
+
this.toDate = this.calendar.getPrev(this.fromDate, 'd', 1);
|
|
279
|
+
this.fromDate = this.calendar.getPrev(this.fromDate, 'd', this.calendar.getDaysPerWeek());
|
|
280
|
+
}
|
|
281
|
+
this.weekNumberGenerator();
|
|
282
|
+
this.applyChanges();
|
|
283
|
+
}
|
|
284
|
+
nextWeek() {
|
|
285
|
+
if (this.fromDate) {
|
|
286
|
+
this.fromDate = this.calendar.getNext(this.fromDate, 'd', this.calendar.getDaysPerWeek());
|
|
287
|
+
this.toDate = this.calendar.getNext(this.fromDate, 'd', this.calendar.getDaysPerWeek() - 1);
|
|
288
|
+
}
|
|
289
|
+
this.weekNumberGenerator();
|
|
290
|
+
this.applyChanges();
|
|
291
|
+
}
|
|
292
|
+
setCalendarMap() {
|
|
293
|
+
let dateObj = { fromDate: this.fromDate, toDate: this.toDate };
|
|
294
|
+
this.calendarMap.set('oldDates', dateObj);
|
|
295
|
+
}
|
|
296
|
+
applyChanges() {
|
|
297
|
+
this.multiSelectDropdownOpen = false;
|
|
298
|
+
if (!this.config.emitMultipleWeekObjects) {
|
|
299
|
+
let dates = {};
|
|
300
|
+
let formattedDates = this.formatter(this.fromDate, this.toDate);
|
|
301
|
+
dates.startDate = formattedDates.formattedStartDate;
|
|
302
|
+
dates.endDate = formattedDates.formattedEndDate;
|
|
303
|
+
this.applyWeekCalendarChanges.emit(dates);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
this.applyWeekCalendarChanges.emit(this.weekObjects);
|
|
307
|
+
}
|
|
308
|
+
this.setCalendarMap();
|
|
309
|
+
}
|
|
310
|
+
isFocused(value) {
|
|
311
|
+
this.calendarToggled.emit(value);
|
|
312
|
+
}
|
|
313
|
+
isDropdownOpenedForCalendar(datepicker) {
|
|
314
|
+
this.datepicker = datepicker;
|
|
315
|
+
if (this.datepicker.isOpen()) {
|
|
316
|
+
this.revertDates();
|
|
317
|
+
this.datepicker.close();
|
|
318
|
+
this.multiSelectDropdownOpen = false;
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
this.datepicker.open();
|
|
322
|
+
this.multiSelectDropdownOpen = true;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
revertDates() {
|
|
326
|
+
this.multiSelectDropdownOpen = false;
|
|
327
|
+
if (this.calendarMap.get('oldDates')) {
|
|
328
|
+
let dateObj = this.calendarMap.get('oldDates');
|
|
329
|
+
this.fromDate = dateObj.fromDate;
|
|
330
|
+
this.toDate = dateObj.toDate;
|
|
331
|
+
this.weekNumberGenerator();
|
|
332
|
+
this.displayToUI();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
checkIfDateIsDisabled(date) {
|
|
336
|
+
const validatorFunc = (ngbDate) => ngbDate.year === date.year && ngbDate.month === date.month && ngbDate.day === date.day;
|
|
337
|
+
return this.disabledDates.some(validatorFunc);
|
|
338
|
+
}
|
|
339
|
+
closeDatepicker(datepickerRef) {
|
|
340
|
+
datepickerRef.close();
|
|
341
|
+
}
|
|
342
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaWeekCalendarComponent, deps: [{ token: i1.NgbCalendar }, { token: i1.NgbDatepickerConfig }, { token: i2.AnnaDateTimeFormatService }, { token: i3.AnnaGlobalConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
343
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AnnaWeekCalendarComponent, isStandalone: true, selector: "anna-core-week-calendar-filter-lib", inputs: { selectedFromDate: ["from-date", "selectedFromDate"], selectedEndDate: ["to-date", "selectedEndDate"], disabledDates: ["disabled-dates", "disabledDates"], maxDate: "maxDate", minDate: "minDate", config: ["week-calendar-config", "config"] }, outputs: { applyWeekCalendarChanges: "apply", calendarToggled: "toggle-calendar" }, usesOnChanges: true, ngImport: i0, template: "<form\n class=\"form-inline\"\n *ngIf=\"config.showAsDropdown\"\n>\n <div class=\"form-group hidden\">\n <div class=\"input-group\">\n <input\n name=\"datepicker\"\n class=\"form-control\"\n ngbDatepicker\n #datepicker=\"ngbDatepicker\"\n [autoClose]=\"false\"\n (dateSelect)=\"selectWeek($event)\"\n (closed)=\"isFocused(false)\"\n [displayMonths]=\"1\"\n [dayTemplate]=\"t\"\n [startDate]=\"fromDate!\"\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\n [showWeekNumbers]=\"config.showWeekNumbers\"\n tabindex=\"-1\"\n style=\"display: none\"\n [footerTemplate]=\"footerTemplate\"\n />\n </div>\n </div>\n\n <!--Single week select-->\n <div *ngIf=\"!config.selectMultipleWeeks\">\n <span style=\"position: relative; left: 30px; font-size: 12px\"> {{ weekNumbers }} </span>\n <div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"single-week\">\n <div class=\"left\">\n <span\n class=\"material-icons next-round-btn\"\n (click)=\"previousWeek()\"\n >\n navigate_next\n </span>\n </div>\n <input\n #dpFromDate\n class=\"form-control\"\n placeholder=\"Select Weeks\"\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\n name=\"dpFromDate\"\n [value]=\"dateToDisplay\"\n [readonly]=\"true\"\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\n />\n <i\n class=\"mdi mdi-menu-down\"\n *ngIf=\"!datepicker.isOpen()\"\n (click)=\"datepicker.open()\"\n ></i>\n <i\n class=\"mdi mdi-menu-up\"\n *ngIf=\"datepicker.isOpen()\"\n (click)=\"isDropdownOpenedForCalendar(datepicker)\"\n ></i>\n <div class=\"right\">\n <span\n class=\"material-icons round-btn\"\n (click)=\"nextWeek()\"\n >\n navigate_next\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!--Multiple week select-->\n <div\n class=\"form-group\"\n *ngIf=\"config.selectMultipleWeeks\"\n >\n <div class=\"input-group\">\n <div class=\"multiple-weeks\">\n <input\n #dpFromDate\n class=\"form-control\"\n placeholder=\"Select Weeks\"\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\n name=\"dpFromDate\"\n [readonly]=\"true\"\n [value]=\"weekNumbers\"\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\n />\n <i\n *ngIf=\"!multiSelectDropdownOpen\"\n class=\"mdi mdi-menu-down multiselect-input-arrow\"\n ></i>\n <i\n *ngIf=\"multiSelectDropdownOpen\"\n class=\"mdi mdi-menu-up multiselect-input-arrow\"\n ></i>\n </div>\n </div>\n </div>\n</form>\n\n<ngb-datepicker\n #weekPicker\n *ngIf=\"!config.showAsDropdown\"\n [displayMonths]=\"1\"\n [startDate]=\"fromDate!\"\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\n [showWeekNumbers]=\"config.showWeekNumbers\"\n [dayTemplate]=\"t\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n (dateSelect)=\"selectWeek($event)\"\n [markDisabled]=\"disabledFunc\"\n>\n</ngb-datepicker>\n\n<ng-template #footerTemplate>\n <hr class=\"my-0\" />\n <button\n class=\"btn btn-primary btn-sm m-2 float-right\"\n (click)=\"applyChanges(); closeDatepicker(datepicker)\"\n style=\"background-color: #268bff; color: #ffffff\"\n >\n Apply\n </button>\n <button\n class=\"btn btn-primary btn-sm m-2 float-right\"\n (click)=\"revertDates(); closeDatepicker(datepicker)\"\n style=\"background-color: rgba(38, 139, 255, 0.12); color: #268bff\"\n >\n Cancel\n </button>\n</ng-template>\n\n<ng-template\n #t\n let-date\n let-focused=\"focused\"\n let-disabled=\"disabled\"\n>\n <span\n class=\"custom-day\"\n [class.focused]=\"focused\"\n [class.range]=\"isRange(date)\"\n [class.faded]=\"isHovered(date) || isInside(date)\"\n [class.disabled]=\"disabled\"\n (mouseenter)=\"hoveredDate = date\"\n (mouseleave)=\"hoveredDate = null\"\n >\n {{ date.day }}\n </span>\n</ng-template>\n\n<!--\n\n<hr>\n\n<pre>From: {{ fromDate | json }} </pre>\n<pre>To: {{ toDate | json }} </pre>\n<pre>weekNumbers: {{ weekNumbers | json }} </pre>\n\n-->\n", styles: [":host ::ng-deep .ngb-dp-arrow button:disabled{color:#4a4a4a;background-color:#fff;opacity:.25;cursor:not-allowed}:host ::ng-deep .ngb-dp-arrow button:disabled .ngb-dp-navigation-chevron{color:#4a4a4a}:host ::ng-deep .ngb-dp-arrow button .ngb-dp-navigation-chevron{color:#000}:host::ng-deep .right{width:unset!important;background-color:#fff!important}:host::ng-deep .ngb-dp-day,:host::ng-deep .ngb-dp-weekday{width:3rem!important;font-style:unset!important;color:#8bac2a;outline:none}:host::ng-deep .ngb-dp-day:first-child{border:1px solid black}:host::ng-deep .ngb-dp-day.disabled{color:#d4d4d4;cursor:not-allowed}:host::ng-deep .ngb-dp-showweek:before{content:\"Weeks\";margin-right:5px}:host::ng-deep .ngb-dp-week-number{font-style:unset!important;width:4rem!important;margin-right:5px;font-weight:700;color:#000!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-week-number:before{font-style:unset!important;content:\"Week \"}:host::ng-deep .ngb-dp-weekday.ngb-dp-showweek{margin-right:5px;width:4rem!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .dropdown-menu{box-shadow:none}:host::ng-deep .dropdown-menu.show{top:15px!important}:host::ng-deep .bg-light{background-color:#fff!important}:host::ng-deep .ngb-dp-weekdays{border-top:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-arrow-btn:focus{box-shadow:none}.custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:1.75rem;font-weight:700;color:#222b45;width:3rem!important}.custom-day.focused{background-color:#fff}.custom-day.faded{background-color:#0275d880!important}.custom-day.faded:focus{outline:none!important}.custom-day:hover{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day:focus{outline:none!important}.custom-day.range{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day.range:focus{outline:none!important}.custom-day.disabled{color:#d3d3d3}.input-group>.single-week,.input-group .multiple-weeks{display:inline-flex!important}.input-group>.single-week>.form-control,.input-group .multiple-weeks>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.input-group>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.form-control[readonly]{background-color:#fff!important}.next-round-btn{transform:rotate(180deg);margin-left:.125rem;line-height:1.3;border-radius:50%;cursor:pointer}.round-btn{line-height:1.3;border-radius:50%;cursor:pointer;margin-left:.25rem}:host::ng-deep select.custom-select{background:none;appearance:auto}.left,.right{width:1.875rem!important;height:1.875rem;background:#d8d8d8!important;border-radius:50%}.left{margin-right:.3125rem}.right{margin-left:.3125rem}:host::ng-deep .right .ngb-dp-navigation-chevron,:host::ng-deep .ngb-dp-navigation-chevron{color:#268bff}:host::ng-deep .ngb-dp-arrow-btn:focus{outline-width:0px}.custom-day.faded{background-color:#268bff33!important;color:#000!important;font-weight:600}.custom-day{text-align:center;padding:.185rem .25rem;color:#000;display:inline-block;line-height:1.9;height:2rem;width:2rem}.custom-day.focused{background-color:#e6e6e6}.custom-day.range{background-color:#268bff!important;color:#fff!important;font-weight:600}.custom-day:hover{background-color:#d9e1e6;border-radius:.25rem;color:#bdbdbd}:host::ng-deep div.ngb-dp-weekday{color:#8bac2a;font-family:Roboto;font-size:.8125rem;font-weight:700;font-stretch:normal;font-style:normal;line-height:2.6;letter-spacing:normal}.mdi-menu-up,.mdi-menu-down{position:absolute;right:2.438rem;top:1px;font-size:1.375rem;cursor:pointer}.multiselect-input-arrow{position:absolute;right:.75rem;top:3px;font-size:1.25rem;cursor:pointer;pointer-events:none}button:focus{outline:none;box-shadow:none;border-color:transparent}::ng-deep .ngb-dp-header,::ng-deep .ngb-dp-week{background:#fff!important}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgbDatepicker, selector: "ngb-datepicker", inputs: ["contentTemplate", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "maxDate", "minDate", "navigation", "outsideDays", "showWeekNumbers", "startDate", "weekdays"], outputs: ["navigate", "dateSelect"], exportAs: ["ngbDatepicker"] }] }); }
|
|
344
|
+
}
|
|
345
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaWeekCalendarComponent, decorators: [{
|
|
346
|
+
type: Component,
|
|
347
|
+
args: [{ selector: 'anna-core-week-calendar-filter-lib', standalone: true, imports: [NgIf, FormsModule, NgbInputDatepicker, NgClass, NgbDatepicker], template: "<form\n class=\"form-inline\"\n *ngIf=\"config.showAsDropdown\"\n>\n <div class=\"form-group hidden\">\n <div class=\"input-group\">\n <input\n name=\"datepicker\"\n class=\"form-control\"\n ngbDatepicker\n #datepicker=\"ngbDatepicker\"\n [autoClose]=\"false\"\n (dateSelect)=\"selectWeek($event)\"\n (closed)=\"isFocused(false)\"\n [displayMonths]=\"1\"\n [dayTemplate]=\"t\"\n [startDate]=\"fromDate!\"\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\n [showWeekNumbers]=\"config.showWeekNumbers\"\n tabindex=\"-1\"\n style=\"display: none\"\n [footerTemplate]=\"footerTemplate\"\n />\n </div>\n </div>\n\n <!--Single week select-->\n <div *ngIf=\"!config.selectMultipleWeeks\">\n <span style=\"position: relative; left: 30px; font-size: 12px\"> {{ weekNumbers }} </span>\n <div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"single-week\">\n <div class=\"left\">\n <span\n class=\"material-icons next-round-btn\"\n (click)=\"previousWeek()\"\n >\n navigate_next\n </span>\n </div>\n <input\n #dpFromDate\n class=\"form-control\"\n placeholder=\"Select Weeks\"\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\n name=\"dpFromDate\"\n [value]=\"dateToDisplay\"\n [readonly]=\"true\"\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\n />\n <i\n class=\"mdi mdi-menu-down\"\n *ngIf=\"!datepicker.isOpen()\"\n (click)=\"datepicker.open()\"\n ></i>\n <i\n class=\"mdi mdi-menu-up\"\n *ngIf=\"datepicker.isOpen()\"\n (click)=\"isDropdownOpenedForCalendar(datepicker)\"\n ></i>\n <div class=\"right\">\n <span\n class=\"material-icons round-btn\"\n (click)=\"nextWeek()\"\n >\n navigate_next\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!--Multiple week select-->\n <div\n class=\"form-group\"\n *ngIf=\"config.selectMultipleWeeks\"\n >\n <div class=\"input-group\">\n <div class=\"multiple-weeks\">\n <input\n #dpFromDate\n class=\"form-control\"\n placeholder=\"Select Weeks\"\n [ngClass]=\"[config.customClass == '' ? '' : config.customClass]\"\n name=\"dpFromDate\"\n [readonly]=\"true\"\n [value]=\"weekNumbers\"\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\n />\n <i\n *ngIf=\"!multiSelectDropdownOpen\"\n class=\"mdi mdi-menu-down multiselect-input-arrow\"\n ></i>\n <i\n *ngIf=\"multiSelectDropdownOpen\"\n class=\"mdi mdi-menu-up multiselect-input-arrow\"\n ></i>\n </div>\n </div>\n </div>\n</form>\n\n<ngb-datepicker\n #weekPicker\n *ngIf=\"!config.showAsDropdown\"\n [displayMonths]=\"1\"\n [startDate]=\"fromDate!\"\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\n [showWeekNumbers]=\"config.showWeekNumbers\"\n [dayTemplate]=\"t\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n (dateSelect)=\"selectWeek($event)\"\n [markDisabled]=\"disabledFunc\"\n>\n</ngb-datepicker>\n\n<ng-template #footerTemplate>\n <hr class=\"my-0\" />\n <button\n class=\"btn btn-primary btn-sm m-2 float-right\"\n (click)=\"applyChanges(); closeDatepicker(datepicker)\"\n style=\"background-color: #268bff; color: #ffffff\"\n >\n Apply\n </button>\n <button\n class=\"btn btn-primary btn-sm m-2 float-right\"\n (click)=\"revertDates(); closeDatepicker(datepicker)\"\n style=\"background-color: rgba(38, 139, 255, 0.12); color: #268bff\"\n >\n Cancel\n </button>\n</ng-template>\n\n<ng-template\n #t\n let-date\n let-focused=\"focused\"\n let-disabled=\"disabled\"\n>\n <span\n class=\"custom-day\"\n [class.focused]=\"focused\"\n [class.range]=\"isRange(date)\"\n [class.faded]=\"isHovered(date) || isInside(date)\"\n [class.disabled]=\"disabled\"\n (mouseenter)=\"hoveredDate = date\"\n (mouseleave)=\"hoveredDate = null\"\n >\n {{ date.day }}\n </span>\n</ng-template>\n\n<!--\n\n<hr>\n\n<pre>From: {{ fromDate | json }} </pre>\n<pre>To: {{ toDate | json }} </pre>\n<pre>weekNumbers: {{ weekNumbers | json }} </pre>\n\n-->\n", styles: [":host ::ng-deep .ngb-dp-arrow button:disabled{color:#4a4a4a;background-color:#fff;opacity:.25;cursor:not-allowed}:host ::ng-deep .ngb-dp-arrow button:disabled .ngb-dp-navigation-chevron{color:#4a4a4a}:host ::ng-deep .ngb-dp-arrow button .ngb-dp-navigation-chevron{color:#000}:host::ng-deep .right{width:unset!important;background-color:#fff!important}:host::ng-deep .ngb-dp-day,:host::ng-deep .ngb-dp-weekday{width:3rem!important;font-style:unset!important;color:#8bac2a;outline:none}:host::ng-deep .ngb-dp-day:first-child{border:1px solid black}:host::ng-deep .ngb-dp-day.disabled{color:#d4d4d4;cursor:not-allowed}:host::ng-deep .ngb-dp-showweek:before{content:\"Weeks\";margin-right:5px}:host::ng-deep .ngb-dp-week-number{font-style:unset!important;width:4rem!important;margin-right:5px;font-weight:700;color:#000!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-week-number:before{font-style:unset!important;content:\"Week \"}:host::ng-deep .ngb-dp-weekday.ngb-dp-showweek{margin-right:5px;width:4rem!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .dropdown-menu{box-shadow:none}:host::ng-deep .dropdown-menu.show{top:15px!important}:host::ng-deep .bg-light{background-color:#fff!important}:host::ng-deep .ngb-dp-weekdays{border-top:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-arrow-btn:focus{box-shadow:none}.custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:1.75rem;font-weight:700;color:#222b45;width:3rem!important}.custom-day.focused{background-color:#fff}.custom-day.faded{background-color:#0275d880!important}.custom-day.faded:focus{outline:none!important}.custom-day:hover{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day:focus{outline:none!important}.custom-day.range{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day.range:focus{outline:none!important}.custom-day.disabled{color:#d3d3d3}.input-group>.single-week,.input-group .multiple-weeks{display:inline-flex!important}.input-group>.single-week>.form-control,.input-group .multiple-weeks>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.input-group>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.form-control[readonly]{background-color:#fff!important}.next-round-btn{transform:rotate(180deg);margin-left:.125rem;line-height:1.3;border-radius:50%;cursor:pointer}.round-btn{line-height:1.3;border-radius:50%;cursor:pointer;margin-left:.25rem}:host::ng-deep select.custom-select{background:none;appearance:auto}.left,.right{width:1.875rem!important;height:1.875rem;background:#d8d8d8!important;border-radius:50%}.left{margin-right:.3125rem}.right{margin-left:.3125rem}:host::ng-deep .right .ngb-dp-navigation-chevron,:host::ng-deep .ngb-dp-navigation-chevron{color:#268bff}:host::ng-deep .ngb-dp-arrow-btn:focus{outline-width:0px}.custom-day.faded{background-color:#268bff33!important;color:#000!important;font-weight:600}.custom-day{text-align:center;padding:.185rem .25rem;color:#000;display:inline-block;line-height:1.9;height:2rem;width:2rem}.custom-day.focused{background-color:#e6e6e6}.custom-day.range{background-color:#268bff!important;color:#fff!important;font-weight:600}.custom-day:hover{background-color:#d9e1e6;border-radius:.25rem;color:#bdbdbd}:host::ng-deep div.ngb-dp-weekday{color:#8bac2a;font-family:Roboto;font-size:.8125rem;font-weight:700;font-stretch:normal;font-style:normal;line-height:2.6;letter-spacing:normal}.mdi-menu-up,.mdi-menu-down{position:absolute;right:2.438rem;top:1px;font-size:1.375rem;cursor:pointer}.multiselect-input-arrow{position:absolute;right:.75rem;top:3px;font-size:1.25rem;cursor:pointer;pointer-events:none}button:focus{outline:none;box-shadow:none;border-color:transparent}::ng-deep .ngb-dp-header,::ng-deep .ngb-dp-week{background:#fff!important}\n"] }]
|
|
348
|
+
}], ctorParameters: function () { return [{ type: i1.NgbCalendar }, { type: i1.NgbDatepickerConfig }, { type: i2.AnnaDateTimeFormatService }, { type: i3.AnnaGlobalConfigService }]; }, propDecorators: { selectedFromDate: [{
|
|
349
|
+
type: Input,
|
|
350
|
+
args: ['from-date']
|
|
351
|
+
}], selectedEndDate: [{
|
|
352
|
+
type: Input,
|
|
353
|
+
args: ['to-date']
|
|
354
|
+
}], disabledDates: [{
|
|
355
|
+
type: Input,
|
|
356
|
+
args: ['disabled-dates']
|
|
357
|
+
}], maxDate: [{
|
|
358
|
+
type: Input
|
|
359
|
+
}], minDate: [{
|
|
360
|
+
type: Input
|
|
361
|
+
}], config: [{
|
|
362
|
+
type: Input,
|
|
363
|
+
args: ['week-calendar-config']
|
|
364
|
+
}], applyWeekCalendarChanges: [{
|
|
365
|
+
type: Output,
|
|
366
|
+
args: ['apply']
|
|
367
|
+
}], calendarToggled: [{
|
|
368
|
+
type: Output,
|
|
369
|
+
args: ['toggle-calendar']
|
|
370
|
+
}] } });
|
|
371
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWRyb3Bkb3duLWxpYi9jb21wb25lbnRzL2FubmEtd2Vlay1jYWxlbmRhci1maWx0ZXIvYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWRyb3Bkb3duLWxpYi9jb21wb25lbnRzL2FubmEtd2Vlay1jYWxlbmRhci1maWx0ZXIvYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUV4SCxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUNILFdBQVcsRUFDWCxPQUFPLEVBQ1AsbUJBQW1CLEVBRW5CLGtCQUFrQixFQUNsQixhQUFhLEdBQ2hCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRzFCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ2pILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1FQUFtRSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBRTdDLGlDQUFpQztBQVNqQyxNQUFNLE9BQU8seUJBQXlCO0lBb0NsQyxXQUFXLENBQUMsT0FBc0I7UUFDOUIseURBQXlEO1FBQ3pE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SUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDM0YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsZUFBZSxDQUFDLGFBQWtCO1FBQzlCLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDOytHQXZaUSx5QkFBeUI7bUdBQXpCLHlCQUF5QixpY0M3QnRDLGs3S0FvS0EsZzNIRHpJYyxJQUFJLDRGQUFFLFdBQVcsd2RBQUUsa0JBQWtCLHllQUFFLE9BQU8sb0ZBQUUsYUFBYTs7NEZBRTlELHlCQUF5QjtrQkFQckMsU0FBUzsrQkFDSSxvQ0FBb0MsY0FHbEMsSUFBSSxXQUNQLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDO2tOQXNCcEQsZ0JBQWdCO3NCQUFuQyxLQUFLO3VCQUFDLFdBQVc7Z0JBQ0EsZUFBZTtzQkFBaEMsS0FBSzt1QkFBQyxTQUFTO2dCQUNTLGFBQWE7c0JBQXJDLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUNkLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBUXlCLE1BQU07c0JBQXBDLEtBQUs7dUJBQUMsc0JBQXNCO2dCQUNaLHdCQUF3QjtzQkFBeEMsTUFBTTt1QkFBQyxPQUFPO2dCQUNZLGVBQWU7c0JBQXpDLE1BQU07dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xuaW1wb3J0IHsgRGF0ZVBpcGUsIE5nSWYsIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8vIFRoaXJkIHBhcnR5IGltcG9ydCBzdGF0ZW1lbnRzXG5pbXBvcnQge1xuICAgIE5nYkNhbGVuZGFyLFxuICAgIE5nYkRhdGUsXG4gICAgTmdiRGF0ZXBpY2tlckNvbmZpZyxcbiAgICBOZ2JEYXRlU3RydWN0LFxuICAgIE5nYklucHV0RGF0ZXBpY2tlcixcbiAgICBOZ2JEYXRlcGlja2VyLFxufSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgV2Vla09iamVjdCB9IGZyb20gJy4uLy4uLy4uL2FubmEtY29yZS1zaGFyZWQtbGliL21vZGVscy9hbm5hLWdlbmVyaWMtZGF0YS10eXBlLm1vZGVsJztcbmltcG9ydCB7IElXZWVrQ2FsZW5kYXIgfSBmcm9tICcuLi8uLi8uLi9hbm5hLWNvcmUtc2hhcmVkLWxpYi9tb2RlbHMvYW5uYS1nbG9iYWwtZHJvcGRvd24tY29uZmlnLm1vZGVsJztcbmltcG9ydCB7IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hbm5hLWNvcmUtc2hhcmVkLWxpYi9zZXJ2aWNlcy9hbm5hLWRhdGUtdGltZS1mb3JtYXQuc2VydmljZSc7XG5pbXBvcnQgeyBBbm5hR2xvYmFsQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZ2xvYmFsLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vLyBVc2VyIGRlZmluZWQgaW1wb3J0IHN0YXRlbWVudHNcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhbm5hLWNvcmUtd2Vlay1jYWxlbmRhci1maWx0ZXItbGliJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW05nSWYsIEZvcm1zTW9kdWxlLCBOZ2JJbnB1dERhdGVwaWNrZXIsIE5nQ2xhc3MsIE5nYkRhdGVwaWNrZXJdLFxufSlcbmV4cG9ydCBjbGFzcyBBbm5hV2Vla0NhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICAgIGZyb21EYXRlOiBOZ2JEYXRlIHwgbnVsbDtcbiAgICBob3ZlcmVkRGF0ZTogTmdiRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIHRvRGF0ZTogTmdiRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIHRvZGF5OiBOZ2JEYXRlO1xuXG4gICAgbW9kZWw6IE5nYkRhdGVTdHJ1Y3Q7XG5cbiAgICB3ZWVrTnVtYmVyczogc3RyaW5nW10gPSBbXTtcbiAgICBwaXBlOiBEYXRlUGlwZTtcbiAgICBkYXRlVG9EaXNwbGF5OiBzdHJpbmcgPSAnJztcbiAgICB3ZWVrT2JqZWN0czogV2Vla09iamVjdFtdO1xuICAgIG11bHRpU2VsZWN0RHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7XG4gICAgZGF0ZXBpY2tlcjogTmdiSW5wdXREYXRlcGlja2VyO1xuICAgIHByaXZhdGUgZm9ybWF0dGVyOiBhbnk7XG4gICAgcHVibGljIGZvcm1hdHRlZFN0YXJ0RGF0ZTogc3RyaW5nO1xuICAgIHB1YmxpYyBmb3JtYXR0ZWRFbmREYXRlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBjYWxlbmRhck1hcCA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIGZsYWcxOiBib29sZWFuO1xuICAgIHByaXZhdGUgZmxhZzI6IGJvb2xlYW47XG4gICAgQElucHV0KCdmcm9tLWRhdGUnKSBzZWxlY3RlZEZyb21EYXRlOiBOZ2JEYXRlU3RydWN0O1xuICAgIEBJbnB1dCgndG8tZGF0ZScpIHNlbGVjdGVkRW5kRGF0ZTogTmdiRGF0ZVN0cnVjdDtcbiAgICBASW5wdXQoJ2Rpc2FibGVkLWRhdGVzJykgZGlzYWJsZWREYXRlczogTmdiRGF0ZVtdID0gW107XG4gICAgQElucHV0KCkgbWF4RGF0ZTogYW55O1xuICAgIEBJbnB1dCgpIG1pbkRhdGU6IGFueTtcblxuICAgIGRpc2FibGVkRnVuYzogYW55O1xuICAgIHN0YXRlOiBhbnk7XG5cbiAgICAvL1NldHRpbmcgdGhlIGRlZmF1bHQgdmFsdWVzO1xuICAgIHByaXZhdGUgX2RlZmF1bHRWYWx1ZXM6IElXZWVrQ2FsZW5kYXI7XG5cbiAgICBASW5wdXQoJ3dlZWstY2FsZW5kYXItY29uZmlnJykgY29uZmlnOiBJV2Vla0NhbGVuZGFyO1xuICAgIEBPdXRwdXQoJ2FwcGx5JykgYXBwbHlXZWVrQ2FsZW5kYXJDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoJ3RvZ2dsZS1jYWxlbmRhcicpIGNhbGVuZGFyVG9nZ2xlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgLy9pZiBzb21lIHZhbHVlcyBhcmUgbm90IHNlbnQsIHNldHRpbmcgdGhlIGRlZmF1bHQgdmFsdWVzXG4gICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPSB0aGlzLmdsb2JhbENvbmZpZ1NlcnZpY2UuZGVmYXVsdFdlZWtDYWxlbmRhckNvbmZpZztcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuX2RlZmF1bHRWYWx1ZXMsIC4uLnRoaXMuY29uZmlnIH07XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnNlbGVjdEN1cnJlbnRXZWVrKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVXZWVrRGF0YSgpO1xuICAgICAgICAgICAgdGhpcy5mcm9tRGF0ZSAmJiB0aGlzLnNlbGVjdFdlZWsodGhpcy5mcm9tRGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcm1hdHRlciA9IHRoaXMuZm9ybWF0dGVkRGF0ZXMoKTtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZyb21EYXRlICYmIHRoaXMuc2VsZWN0ZWRFbmREYXRlICYmIHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgICAvLyB0aGlzLnNlbGVjdFdlZWsodGhpcy5mcm9tRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmZyb21EYXRlID0gTmdiRGF0ZS5mcm9tKHRoaXMuc2VsZWN0ZWRGcm9tRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnRvRGF0ZSA9IE5nYkRhdGUuZnJvbSh0aGlzLnNlbGVjdGVkRW5kRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLndlZWtOdW1iZXJHZW5lcmF0b3IoKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheVRvVUkoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FsZW5kYXJNYXAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZEZ1bmMgPSAoZGF0ZTogTmdiRGF0ZSwgY3VycmVudDogeyBtb250aDogbnVtYmVyIH0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja0lmRGF0ZUlzRGlzYWJsZWQoZGF0ZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY2FsZW5kYXI6IE5nYkNhbGVuZGFyLFxuICAgICAgICBwcml2YXRlIGRhdGVQaWNrZXJDb25maWc6IE5nYkRhdGVwaWNrZXJDb25maWcsXG4gICAgICAgIHByaXZhdGUgYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZTogQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBnbG9iYWxDb25maWdTZXJ2aWNlOiBBbm5hR2xvYmFsQ29uZmlnU2VydmljZSxcbiAgICApIHt9XG5cbiAgICBnZXRXZWVrTnVtYmVyKHdlZWs6IGFueSwgZmlyc3REYXlPZldlZWs6IGFueSkge1xuICAgICAgICBjb25zdCB3ZWVrU3RhcnREYXRlID0gZGF5anMoY29udmVydE5nYkRhdGVUb01vbWVudCh3ZWVrWzBdKSwgJ01NL0REL1lZWVknKTtcbiAgICAgICAgY29uc3Qgd2Vla1llYXIgPSB3ZWVrU3RhcnREYXRlLnllYXIoKTtcbiAgICAgICAgY29uc3QgeWVhclN0YXJ0RGF0ZSA9IGRheWpzKGAwMS8wMS8ke3dlZWtZZWFyfWAsICdNTS9ERC9ZWVlZJyk7XG4gICAgICAgIGNvbnN0IHdlZWtEYXkgPSB5ZWFyU3RhcnREYXRlLmRheSgpO1xuXG4gICAgICAgIGNvbnN0IG5vT2ZEYXlzID0gd2Vla1N0YXJ0RGF0ZS5kaWZmKHllYXJTdGFydERhdGUsICdkJykgKyAxO1xuXG4gICAgICAgIGZ1bmN0aW9uIGNvbnZlcnROZ2JEYXRlVG9Nb21lbnQobmdiRGF0ZTogTmdiRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgICAgICBsZXQgZm9ybWF0VHlwZSA9ICdNTS9ERC9ZWVlZJztcbiAgICAgICAgICAgIGxldCBjb252ZXJ0ZWQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKG5nYkRhdGUgJiYgbmdiRGF0ZS5tb250aCAmJiBuZ2JEYXRlLmRheSAmJiBuZ2JEYXRlLnllYXIpIHtcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBuZ2JEYXRlLm1vbnRoICsgJy8nICsgbmdiRGF0ZS5kYXkgKyAnLycgKyBuZ2JEYXRlLnllYXI7XG4gICAgICAgICAgICAgICAgY29udmVydGVkID0gZGF5anMoY29udmVydGVkKS5mb3JtYXQoZm9ybWF0VHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udmVydGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tJZlllYXJJc0Jyb2FkY2FzdExlYXBZZWFyKCkge1xuICAgICAgICAgICAgbGV0IGlzTGVhcFllYXIgPSAod2Vla1llYXIgJSA0ID09IDAgJiYgd2Vla1llYXIgJSAxMDAgIT0gMCkgfHwgd2Vla1llYXIgJSA0MDAgPT0gMDtcbiAgICAgICAgICAgIHJldHVybiAoaXNMZWFwWWVhciAmJiAod2Vla0RheSA9PSAwIHx8IHdlZWtEYXkgPT0gNikpIHx8ICghaXNMZWFwWWVhciAmJiB3ZWVrRGF5ID09IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNMZWFwWWVhciA9IGNoZWNrSWZZZWFySXNCcm9hZGNhc3RMZWFwWWVhcigpO1xuICAgICAgICBjb25zdCBkaXZpZGVyID0gaXNMZWFwWWVhciA/IDUzIDogNTI7XG4gICAgICAgIGNvbnN0IGFkZGVyID0gaXNMZWFwWWVhciA/IDIgOiAxO1xuXG4gICAgICAgIGxldCBicm9hZGNhc3ROdW1iZXJPZkRheXMgPSB3ZWVrRGF5ICsgbm9PZkRheXM7XG4gICAgICAgIGxldCBicm9hZGNhc3RXZWVrTnVtYmVyID1cbiAgICAgICAgICAgIGJyb2FkY2FzdE51bWJlck9mRGF5cyAlIDcgPiAwID8gYnJvYWRjYXN0TnVtYmVyT2ZEYXlzIC8gNyArIGFkZGVyIDogYnJvYWRjYXN0TnVtYmVyT2ZEYXlzIC8gNztcblxuICAgICAgICBpZiAoTWF0aC5mbG9vcihicm9hZGNhc3RXZWVrTnVtYmVyICUgZGl2aWRlcikgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBkaXZpZGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKGJyb2FkY2FzdFdlZWtOdW1iZXIgJSBkaXZpZGVyKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIENIQU5HRVNAQU5OQUxJQiBDaGFuZ2VkIHRoaXMuXG4gICAgICAgIC8vIHRoaXMuY2FsZW5kYXJbXCJfX3Byb3RvX19cIl0uZ2V0V2Vla051bWJlciA9IHRoaXMuZ2V0V2Vla051bWJlcjtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMuY2FsZW5kYXIsIHsgZ2V0V2Vla051bWJlcjogdGhpcy5nZXRXZWVrTnVtYmVyIH0pO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLnNlbGVjdFdlZWsodGhpcy5mcm9tRGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0Q2FsZW5kYXJNYXAoKTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplV2Vla0RhdGEoKSB7XG4gICAgICAgIHRoaXMud2Vla09iamVjdHMgPSBbXTtcblxuICAgICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jYWxlbmRhci5nZXRUb2RheSgpO1xuICAgICAgICB0aGlzLnRvZGF5ID0gdGhpcy5jYWxlbmRhci5nZXRUb2RheSgpO1xuXG4gICAgICAgIGxldCBiYWNrRGF0ZWRQZXJpb2QgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyRGV0YWlscycpIHx8ICd7fScpLmxvY2tpbmdfcGVyaW9kX2RheXM7XG4gICAgICAgIGlmIChiYWNrRGF0ZWRQZXJpb2QgPCAwKSB7XG4gICAgICAgICAgICBsZXQgZGF0ZTogTmdiRGF0ZSA9IHRoaXMuY2FsZW5kYXIuZ2V0UHJldih0aGlzLmNhbGVuZGFyLmdldFRvZGF5KCksICdkJywgTWF0aC5hYnMoYmFja0RhdGVkUGVyaW9kKSk7XG4gICAgICAgICAgICB0aGlzLnRvZGF5ID0gTmdiRGF0ZS5mcm9tKGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IE5nYkRhdGUuZnJvbShkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgbW9udGhzIGJlZm9yZSBudW1iZXJPZk1vbnRoc1RvRW5hYmxlXG4gICAgICAgIHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5tYXJrRGlzYWJsZWQgPSAoZGF0ZTogTmdiRGF0ZVN0cnVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IHByZXZpb3VzTW9udGggPSB0aGlzLmNhbGVuZGFyLmdldFByZXYodGhpcy50b2RheSwgJ20nLCB0aGlzLmNvbmZpZy5udW1iZXJPZk1vbnRoc1RvRW5hYmxlSW5QYXN0KTtcbiAgICAgICAgICAgIGxldCBwcmV2aW91c0RheSA9IHRoaXMuY2FsZW5kYXIuZ2V0UHJldihwcmV2aW91c01vbnRoLCAnZCcsIDEpO1xuICAgICAgICAgICAgcmV0dXJuICFOZ2JEYXRlLmZyb20ocHJldmlvdXNEYXkpLmJlZm9yZShkYXRlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb3JtYXR0ZXIgPSB0aGlzLmZvcm1hdHRlZERhdGVzKCk7XG4gICAgICAgIHRoaXMuZmxhZzEgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mbGFnMiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNlbGVjdFdlZWsoZGF0ZTogTmdiRGF0ZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlT2JqZWN0ID0gbmV3IERhdGUoZGF0ZS55ZWFyLCBkYXRlLm1vbnRoIC0gMSwgZGF0ZS5kYXkpO1xuICAgICAgICBsZXQgY29uc3RydWN0RGF0ZSA9IHRoaXMuYnVpbGREYXRlKGRhdGVPYmplY3QpO1xuXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc2VsZWN0TXVsdGlwbGVXZWVrcykge1xuICAgICAgICAgICAgLy9TaW5nbGUgd2VlayBzZWxlY3Rpb25cbiAgICAgICAgICAgIHRoaXMuZnJvbURhdGUgPSB0aGlzLmNvbnN0cnVjdFN0YXJ0RGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcbiAgICAgICAgICAgIHRoaXMudG9EYXRlID0gdGhpcy5jb25zdHJ1Y3RFbmREYXRlKGRhdGVPYmplY3QpKGNvbnN0cnVjdERhdGUpO1xuICAgICAgICAgICAgdGhpcy53ZWVrTnVtYmVyR2VuZXJhdG9yKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGF0ZS5iZWZvcmUodGhpcy5mcm9tRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jb25zdHJ1Y3RTdGFydERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmxhZzEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZmxhZzEgPSAhdGhpcy5mbGFnMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0ZS5hZnRlcih0aGlzLnRvRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mbGFnMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jb25zdHJ1Y3RTdGFydERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZmxhZzIgPSAhdGhpcy5mbGFnMjtcbiAgICAgICAgICAgICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuY29uc3RydWN0RW5kRGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMuY29uc3RydWN0U3RhcnREYXRlKGRhdGVPYmplY3QpKGNvbnN0cnVjdERhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9EYXRlID0gdGhpcy5jb25zdHJ1Y3RFbmREYXRlKGRhdGVPYmplY3QpKGNvbnN0cnVjdERhdGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZGF5anNTdGFydERhdGUgPSBkYXlqcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQodGhpcy5mcm9tRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGxldCBkYXlqc0VuZERhdGUgPSBkYXlqcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQodGhpcy50b0RhdGUpLFxuICAgICAgICAgICAgICAgICAgICAnTU0vREQvWVlZWScsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBsZXQgbmdiRGF0ZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWRheWpzU3RhcnREYXRlLmlzU2FtZShkYXlqc0VuZERhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5nYkRhdGUgPSB0aGlzLmFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShkYXlqc1N0YXJ0RGF0ZSwgJ01NL0REL1lZWVknKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tJZkRhdGVJc0Rpc2FibGVkKG5nYkRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkYXlqc1N0YXJ0RGF0ZS5hZGQoMSwgJ2QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG5ld0RhdGVPYmplY3QgPSBuZXcgRGF0ZShuZ2JEYXRlLnllYXIsIG5nYkRhdGUubW9udGggLSAxLCBuZ2JEYXRlLmRheSAtIDEpO1xuICAgICAgICAgICAgICAgIGxldCBjb25zdHJ1Y3REYXRlID0gdGhpcy5idWlsZERhdGUobmV3RGF0ZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUobmV3RGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMud2Vla051bWJlckdlbmVyYXRvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zaG93QXNEcm9wZG93bikge1xuICAgICAgICAgICAgdGhpcy5hcHBseUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdlZWtOdW1iZXJHZW5lcmF0b3IoKTogdm9pZCB7XG4gICAgICAgIGxldCBkYXRlcyA9IFtdO1xuICAgICAgICBsZXQgd2VlayA9IFtdO1xuXG4gICAgICAgIGxldCBzdGFydERhdGUgPSBOZ2JEYXRlLmZyb20odGhpcy5mcm9tRGF0ZSk7XG4gICAgICAgIGxldCBlbmREYXRlID0gTmdiRGF0ZS5mcm9tKHRoaXMudG9EYXRlKTtcblxuICAgICAgICB3ZWVrLnB1c2goc3RhcnREYXRlKTtcbiAgICAgICAgd2hpbGUgKGVuZERhdGUgIT0gbnVsbCAmJiAhc3RhcnREYXRlLmVxdWFscyhlbmREYXRlKSkge1xuICAgICAgICAgICAgbGV0IGRhdGUgPSB0aGlzLmNhbGVuZGFyLmdldE5leHQoc3RhcnREYXRlLCAnZCcsIDEpO1xuICAgICAgICAgICAgc3RhcnREYXRlID0gZGF0ZTtcbiAgICAgICAgICAgIHdlZWsucHVzaChkYXRlKTtcblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBhbGwgZGF5cyBpbiB3ZWVrIHRvIGNhbGN1bGF0ZSB0aGUgd2VlayBudW1iZXJcbiAgICAgICAgICAgIGlmICh3ZWVrLmxlbmd0aCA9PSA3KSB7XG4gICAgICAgICAgICAgICAgZGF0ZXMucHVzaCh3ZWVrKTtcbiAgICAgICAgICAgICAgICB3ZWVrID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2VsZWN0ID8/IDApID4gMCAmJiBkYXRlcy5sZW5ndGggPiAodGhpcy5jb25maWcubWF4V2Vla3NUb1NlbGVjdCA/PyAwKSkge1xuICAgICAgICAgICAgZGF0ZXMuc3BsaWNlKHRoaXMuY29uZmlnLm1heFdlZWtzVG9TZWxlY3QgPz8gMCwgZGF0ZXMubGVuZ3RoIC0gKHRoaXMuY29uZmlnLm1heFdlZWtzVG9TZWxlY3QgPz8gMCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyhkYXRlcyk7XG5cbiAgICAgICAgdGhpcy53ZWVrTnVtYmVycyA9IFtdO1xuICAgICAgICB0aGlzLndlZWtPYmplY3RzID0gW107XG4gICAgICAgIGlmIChkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkYXRlIG9mIGRhdGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53ZWVrTnVtYmVycy5wdXNoKCcgV2VlayAnICsgdGhpcy5jYWxlbmRhci5nZXRXZWVrTnVtYmVyKGRhdGUsIHRoaXMuY29uZmlnLmZpcnN0RGF5T2ZXZWVrKSk7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGVzID0gdGhpcy5mb3JtYXR0ZXIoZGF0ZVswXSwgZGF0ZVs2XSk7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGVPYmplY3RzID0geyBzdGFydERhdGU6IGRhdGVzLmZvcm1hdHRlZFN0YXJ0RGF0ZSwgZW5kRGF0ZTogZGF0ZXMuZm9ybWF0dGVkRW5kRGF0ZSB9O1xuICAgICAgICAgICAgICAgIHRoaXMud2Vla09iamVjdHMucHVzaChkYXRlT2JqZWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXNwbGF5VG9VSSgpO1xuICAgIH1cblxuICAgIHNlbGVjdGVkRGF0ZXMoZGF0ZXM6IGFueSkge1xuICAgICAgICB0aGlzLmZyb21EYXRlID0gZGF0ZXNbMF1bMF07XG4gICAgICAgIHRoaXMudG9EYXRlID0gZGF0ZXNbZGF0ZXMubGVuZ3RoIC0gMV1bNl07XG4gICAgfVxuXG4gICAgZm9ybWF0dGVkRGF0ZXMoKSB7XG4gICAgICAgIGxldCBwaXBlID0gbmV3IERhdGVQaXBlKCdlbi1VUycpO1xuICAgICAgICBsZXQgdGhpc09iaiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZnJvbURhdGU6IE5nYkRhdGUsIHRvRGF0ZTogTmdiRGF0ZSkge1xuICAgICAgICAgICAgbGV0IGZyb21EYXRlT2JqZWN0ID0gbmV3IERhdGUoZnJvbURhdGUueWVhciwgZnJvbURhdGUubW9udGggLSAxLCBmcm9tRGF0ZS5kYXkpO1xuICAgICAgICAgICAgbGV0IHRvRGF0ZU9iamVjdCA9IG5ldyBEYXRlKHRvRGF0ZS55ZWFyLCB0b0RhdGUubW9udGggLSAxLCB0b0RhdGUuZGF5KTtcbiAgICAgICAgICAgIHRoaXNPYmouZm9ybWF0dGVkU3RhcnREYXRlID0gcGlwZS50cmFuc2Zvcm0oZnJvbURhdGVPYmplY3QsIHRoaXNPYmouY29uZmlnLmRhdGVGb3JtYXRGb3JSZXF1ZXN0KTtcbiAgICAgICAgICAgIHRoaXNPYmouZm9ybWF0dGVkRW5kRGF0ZSA9IHBpcGUudHJhbnNmb3JtKHRvRGF0ZU9iamVjdCwgdGhpc09iai5jb25maWcuZGF0ZUZvcm1hdEZvclJlcXVlc3QpO1xuXG4gICAgICAgICAgICB0aGlzT2JqLmRhdGVUb0Rpc3BsYXkgPVxuICAgICAgICAgICAgICAgIHBpcGUudHJhbnNmb3JtKGZyb21EYXRlT2JqZWN0LCB0aGlzT2JqLmNvbmZpZy5kYXRlRm9ybWF0VG9EaXNwbGF5KSArXG4gICAgICAgICAgICAgICAgJyB0byAnICtcbiAgICAgICAgICAgICAgICBwaXBlLnRyYW5zZm9ybSh0b0RhdGVPYmplY3QsIHRoaXNPYmouY29uZmlnLmRhdGVGb3JtYXRUb0Rpc3BsYXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNPYmo7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZGlzcGxheVRvVUkoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc2VsZWN0TXVsdGlwbGVXZWVrcyAmJiB0aGlzLmZyb21EYXRlICYmIHRoaXMudG9EYXRlKSB7XG4gICAgICAgICAgICAvLyBEaXNwbGF5IGZvciBvbmx5IFNpbmdsZSBXZWVrXG4gICAgICAgICAgICB0aGlzLmZvcm1hdHRlcih0aGlzLmZyb21EYXRlLCB0aGlzLnRvRGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEaXNwbGF5IGZvciBNdWx0aXBsZSBXZWVrc1xuICAgICAgICAgICAgaWYgKHRoaXMud2Vla051bWJlcnMubGVuZ3RoID4gKHRoaXMuY29uZmlnLm1heFdlZWtzVG9TaG93V2l0aFJlbWFpbmluZ0NvdW50ID8/IDApKSB7XG4gICAgICAgICAgICAgICAgbGV0IHdlZWtEaXNwbGF5ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAodGhpcy5jb25maWcubWF4V2Vla3NUb1Nob3dXaXRoUmVtYWluaW5nQ291bnQgPz8gMCk7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrRGlzcGxheS5wdXNoKHRoaXMud2Vla051bWJlcnMuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmdXZWVrcyA9IHRoaXMud2Vla051bWJlcnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMud2Vla051bWJlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLndlZWtOdW1iZXJzLnB1c2god2Vla0Rpc3BsYXkgKyAnICsnICsgcmVtYWluaW5nV2Vla3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0U3RhcnREYXRlKGRhdGU6IERhdGUpIHtcbiAgICAgICAgbGV0IGZpcnN0RGF5T2ZXZWVrID0gdGhpcy5jb25maWcuZmlyc3REYXlPZldlZWs7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoY29uc3RydWN0RGF0ZTogYW55KSB7XG4gICAgICAgICAgICBsZXQgc3RhcnREYXkgPSBkYXRlLmdldERheSgpICE9IDAgPyAoZmlyc3REYXlPZldlZWsgPz8gMCkgLSBkYXRlLmdldERheSgpIDogLTY7XG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0RGF0ZShzdGFydERheSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3RydWN0RW5kRGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgICAgIGxldCBmaXJzdERheU9mV2VlayA9IHRoaXMuY29uZmlnLmZpcnN0RGF5T2ZXZWVrO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNvbnN0cnVjdERhdGU6IGFueSkge1xuICAgICAgICAgICAgbGV0IGVuZERheSA9IGRhdGUuZ2V0RGF5KCkgIT0gMCA/IChmaXJzdERheU9mV2VlayA/PyAwKSArIDYgLSBkYXRlLmdldERheSgpIDogMDtcbiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3REYXRlKGVuZERheSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYnVpbGREYXRlKGRhdGU6IERhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW1iZXI6IG51bWJlcik6IE5nYkRhdGUgfCBudWxsIHtcbiAgICAgICAgICAgIGxldCBkYXkgPSBkYXRlLmdldERhdGUoKSArIG51bWJlcjtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVPYmplY3QgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF5KTtcblxuICAgICAgICAgICAgbGV0IG5nYkRhdGVPYmplY3QgPSB7fSBhcyBOZ2JEYXRlO1xuICAgICAgICAgICAgbmdiRGF0ZU9iamVjdC5kYXkgPSBkYXk7XG5cbiAgICAgICAgICAgIGlmIChuZ2JEYXRlT2JqZWN0LmRheSA+IDMxIHx8IG5nYkRhdGVPYmplY3QuZGF5IDwgMSkge1xuICAgICAgICAgICAgICAgIG5nYkRhdGVPYmplY3QuZGF5ID0gZGF0ZU9iamVjdC5nZXREYXRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5nYkRhdGVPYmplY3QubW9udGggPSBkYXRlT2JqZWN0LmdldE1vbnRoKCkgKyAxO1xuICAgICAgICAgICAgbmdiRGF0ZU9iamVjdC55ZWFyID0gZGF0ZU9iamVjdC5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgcmV0dXJuIE5nYkRhdGUuZnJvbShuZ2JEYXRlT2JqZWN0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpc0hvdmVyZWQoZGF0ZTogTmdiRGF0ZSk6IGJvb2xlYW4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuZnJvbURhdGUgJiZcbiAgICAgICAgICAgICF0aGlzLnRvRGF0ZSAmJlxuICAgICAgICAgICAgdGhpcy5ob3ZlcmVkRGF0ZSAmJlxuICAgICAgICAgICAgZGF0ZS5hZnRlcih0aGlzLmZyb21EYXRlKSAmJlxuICAgICAgICAgICAgZGF0ZS5iZWZvcmUodGhpcy5ob3ZlcmVkRGF0ZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpc0luc2lkZShkYXRlOiBOZ2JEYXRlKTogYm9vbGVhbiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy50b0RhdGUgJiYgZGF0ZS5hZnRlcih0aGlzLmZyb21EYXRlKSAmJiBkYXRlLmJlZm9yZSh0aGlzLnRvRGF0ZSk7XG4gICAgfVxuXG4gICAgaXNSYW5nZShkYXRlOiBOZ2JEYXRlKTogYm9vbGVhbiB8IG51bGwge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZGF0ZS5lcXVhbHModGhpcy5mcm9tRGF0ZSkgfHxcbiAgICAgICAgICAgICh0aGlzLnRvRGF0ZSAmJiBkYXRlLmVxdWFscyh0aGlzLnRvRGF0ZSkpIHx8XG4gICAgICAgICAgICB0aGlzLmlzSW5zaWRlKGRhdGUpIHx8XG4gICAgICAgICAgICB0aGlzLmlzSG92ZXJlZChkYXRlKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByZXZpb3VzV2VlaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZnJvbURhdGUpIHtcbiAgICAgICAgICAgIHRoaXMudG9EYXRlID0gdGhpcy5jYWxlbmRhci5nZXRQcmV2KHRoaXMuZnJvbURhdGUsICdkJywgMSk7XG4gICAgICAgICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jYWxlbmRhci5nZXRQcmV2KHRoaXMuZnJvbURhdGUsICdkJywgdGhpcy5jYWxlbmRhci5nZXREYXlzUGVyV2VlaygpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlZWtOdW1iZXJHZW5lcmF0b3IoKTtcbiAgICAgICAgdGhpcy5hcHBseUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBuZXh0V2VlaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZnJvbURhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZnJvbURhdGUgPSB0aGlzLmNhbGVuZGFyLmdldE5leHQodGhpcy5mcm9tRGF0ZSwgJ2QnLCB0aGlzLmNhbGVuZGFyLmdldERheXNQZXJXZWVrKCkpO1xuICAgICAgICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNhbGVuZGFyLmdldE5leHQodGhpcy5mcm9tRGF0ZSwgJ2QnLCB0aGlzLmNhbGVuZGFyLmdldERheXNQZXJXZWVrKCkgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlZWtOdW1iZXJHZW5lcmF0b3IoKTtcbiAgICAgICAgdGhpcy5hcHBseUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBzZXRDYWxlbmRhck1hcCgpIHtcbiAgICAgICAgbGV0IGRhdGVPYmogPSB7IGZyb21EYXRlOiB0aGlzLmZyb21EYXRlLCB0b0RhdGU6IHRoaXMudG9EYXRlIH07XG4gICAgICAgIHRoaXMuY2FsZW5kYXJNYXAuc2V0KCdvbGREYXRlcycsIGRhdGVPYmopO1xuICAgIH1cblxuICAgIGFwcGx5Q2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmVtaXRNdWx0aXBsZVdlZWtPYmplY3RzKSB7XG4gICAgICAgICAgICBsZXQgZGF0ZXMgPSB7fSBhcyBXZWVrT2JqZWN0O1xuICAgICAgICAgICAgbGV0IGZvcm1hdHRlZERhdGVzID0gdGhpcy5mb3JtYXR0ZXIodGhpcy5mcm9tRGF0ZSwgdGhpcy50b0RhdGUpO1xuICAgICAgICAgICAgZGF0ZXMuc3RhcnREYXRlID0gZm9ybWF0dGVkRGF0ZXMuZm9ybWF0dGVkU3RhcnREYXRlO1xuICAgICAgICAgICAgZGF0ZXMuZW5kRGF0ZSA9IGZvcm1hdHRlZERhdGVzLmZvcm1hdHRlZEVuZERhdGU7XG4gICAgICAgICAgICB0aGlzLmFwcGx5V2Vla0NhbGVuZGFyQ2hhbmdlcy5lbWl0KGRhdGVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlXZWVrQ2FsZW5kYXJDaGFuZ2VzLmVtaXQodGhpcy53ZWVrT2JqZWN0cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRDYWxlbmRhck1hcCgpO1xuICAgIH1cblxuICAgIGlzRm9jdXNlZCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJUb2dnbGVkLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIGlzRHJvcGRvd25PcGVuZWRGb3JDYWxlbmRhcihkYXRlcGlja2VyOiBOZ2JJbnB1dERhdGVwaWNrZXIpIHtcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyID0gZGF0ZXBpY2tlcjtcbiAgICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlci5pc09wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5yZXZlcnREYXRlcygpO1xuICAgICAgICAgICAgdGhpcy5kYXRlcGlja2VyLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLm11bHRpU2VsZWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVwaWNrZXIub3BlbigpO1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdERyb3Bkb3duT3BlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXZlcnREYXRlcygpIHtcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jYWxlbmRhck1hcC5nZXQoJ29sZERhdGVzJykpIHtcbiAgICAgICAgICAgIGxldCBkYXRlT2JqID0gdGhpcy5jYWxlbmRhck1hcC5nZXQoJ29sZERhdGVzJyk7XG4gICAgICAgICAgICB0aGlzLmZyb21EYXRlID0gZGF0ZU9iai5mcm9tRGF0ZTtcbiAgICAgICAgICAgIHRoaXMudG9EYXRlID0gZGF0ZU9iai50b0RhdGU7XG4gICAgICAgICAgICB0aGlzLndlZWtOdW1iZXJHZW5lcmF0b3IoKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheVRvVUkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrSWZEYXRlSXNEaXNhYmxlZChkYXRlOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yRnVuYyA9IChuZ2JEYXRlOiBOZ2JEYXRlKSA9PlxuICAgICAgICAgICAgbmdiRGF0ZS55ZWFyID09PSBkYXRlLnllYXIgJiYgbmdiRGF0ZS5tb250aCA9PT0gZGF0ZS5tb250aCAmJiBuZ2JEYXRlLmRheSA9PT0gZGF0ZS5kYXk7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF0ZXMuc29tZSh2YWxpZGF0b3JGdW5jKTtcbiAgICB9XG5cbiAgICBjbG9zZURhdGVwaWNrZXIoZGF0ZXBpY2tlclJlZjogYW55KSB7XG4gICAgICAgIGRhdGVwaWNrZXJSZWYuY2xvc2UoKTtcbiAgICB9XG59XG4iLCI8Zm9ybVxuICAgIGNsYXNzPVwiZm9ybS1pbmxpbmVcIlxuICAgICpuZ0lmPVwiY29uZmlnLnNob3dBc0Ryb3Bkb3duXCJcbj5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBoaWRkZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGF0ZXBpY2tlclwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIG5nYkRhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICAjZGF0ZXBpY2tlcj1cIm5nYkRhdGVwaWNrZXJcIlxuICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChkYXRlU2VsZWN0KT1cInNlbGVjdFdlZWsoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJpc0ZvY3VzZWQoZmFsc2UpXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheU1vbnRoc109XCIxXCJcbiAgICAgICAgICAgICAgICBbZGF5VGVtcGxhdGVdPVwidFwiXG4gICAgICAgICAgICAgICAgW3N0YXJ0RGF0ZV09XCJmcm9tRGF0ZSFcIlxuICAgICAgICAgICAgICAgIFtmaXJzdERheU9mV2Vla109XCJjb25maWcuZmlyc3REYXlPZldlZWtcIlxuICAgICAgICAgICAgICAgIFtzaG93V2Vla051bWJlcnNdPVwiY29uZmlnLnNob3dXZWVrTnVtYmVyc1wiXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBub25lXCJcbiAgICAgICAgICAgICAgICBbZm9vdGVyVGVtcGxhdGVdPVwiZm9vdGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tU2luZ2xlIHdlZWsgc2VsZWN0LS0+XG4gICAgPGRpdiAqbmdJZj1cIiFjb25maWcuc2VsZWN0TXVsdGlwbGVXZWVrc1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgbGVmdDogMzBweDsgZm9udC1zaXplOiAxMnB4XCI+ICZuYnNwO3t7IHdlZWtOdW1iZXJzIH19IDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtd2Vla1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5leHQtcm91bmQtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHJldmlvdXNXZWVrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRlX25leHRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgI2RwRnJvbURhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFdlZWtzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIltjb25maWcuY3VzdG9tQ2xhc3MgPT0gJycgPyAnJyA6IGNvbmZpZy5jdXN0b21DbGFzc11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRwRnJvbURhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGVUb0Rpc3BsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImlzRm9jdXNlZCh0cnVlKTsgaXNEcm9wZG93bk9wZW5lZEZvckNhbGVuZGFyKGRhdGVwaWNrZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1tZW51LWRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGF0ZXBpY2tlci5pc09wZW4oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZXBpY2tlci5vcGVuKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLW1lbnUtdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlcGlja2VyLmlzT3BlbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpc0Ryb3Bkb3duT3BlbmVkRm9yQ2FsZW5kYXIoZGF0ZXBpY2tlcilcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyByb3VuZC1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuZXh0V2VlaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0ZV9uZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLU11bHRpcGxlIHdlZWsgc2VsZWN0LS0+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZvcm0tZ3JvdXBcIlxuICAgICAgICAqbmdJZj1cImNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzXCJcbiAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpcGxlLXdlZWtzXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICNkcEZyb21EYXRlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgV2Vla3NcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbY29uZmlnLmN1c3RvbUNsYXNzID09ICcnID8gJycgOiBjb25maWcuY3VzdG9tQ2xhc3NdXCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRwRnJvbURhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ3ZWVrTnVtYmVyc1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpc0ZvY3VzZWQodHJ1ZSk7IGlzRHJvcGRvd25PcGVuZWRGb3JDYWxlbmRhcihkYXRlcGlja2VyKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFtdWx0aVNlbGVjdERyb3Bkb3duT3BlblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1tZW51LWRvd24gbXVsdGlzZWxlY3QtaW5wdXQtYXJyb3dcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtdWx0aVNlbGVjdERyb3Bkb3duT3BlblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1tZW51LXVwIG11bHRpc2VsZWN0LWlucHV0LWFycm93XCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9mb3JtPlxuXG48bmdiLWRhdGVwaWNrZXJcbiAgICAjd2Vla1BpY2tlclxuICAgICpuZ0lmPVwiIWNvbmZpZy5zaG93QXNEcm9wZG93blwiXG4gICAgW2Rpc3BsYXlNb250aHNdPVwiMVwiXG4gICAgW3N0YXJ0RGF0ZV09XCJmcm9tRGF0ZSFcIlxuICAgIFtmaXJzdERheU9mV2Vla109XCJjb25maWcuZmlyc3REYXlPZldlZWtcIlxuICAgIFtzaG93V2Vla051bWJlcnNdPVwiY29uZmlnLnNob3dXZWVrTnVtYmVyc1wiXG4gICAgW2RheVRlbXBsYXRlXT1cInRcIlxuICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxuICAgIChkYXRlU2VsZWN0KT1cInNlbGVjdFdlZWsoJGV2ZW50KVwiXG4gICAgW21hcmtEaXNhYmxlZF09XCJkaXNhYmxlZEZ1bmNcIlxuPlxuPC9uZ2ItZGF0ZXBpY2tlcj5cblxuPG5nLXRlbXBsYXRlICNmb290ZXJUZW1wbGF0ZT5cbiAgICA8aHIgY2xhc3M9XCJteS0wXCIgLz5cbiAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBtLTIgZmxvYXQtcmlnaHRcIlxuICAgICAgICAoY2xpY2spPVwiYXBwbHlDaGFuZ2VzKCk7IGNsb3NlRGF0ZXBpY2tlcihkYXRlcGlja2VyKVwiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogIzI2OGJmZjsgY29sb3I6ICNmZmZmZmZcIlxuICAgID5cbiAgICAgICAgQXBwbHlcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBtLTIgZmxvYXQtcmlnaHRcIlxuICAgICAgICAoY2xpY2spPVwicmV2ZXJ0RGF0ZXMoKTsgY2xvc2VEYXRlcGlja2VyKGRhdGVwaWNrZXIpXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDM4LCAxMzksIDI1NSwgMC4xMik7IGNvbG9yOiAjMjY4YmZmXCJcbiAgICA+XG4gICAgICAgIENhbmNlbFxuICAgIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICAgI3RcbiAgICBsZXQtZGF0ZVxuICAgIGxldC1mb2N1c2VkPVwiZm9jdXNlZFwiXG4gICAgbGV0LWRpc2FibGVkPVwiZGlzYWJsZWRcIlxuPlxuICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiY3VzdG9tLWRheVwiXG4gICAgICAgIFtjbGFzcy5mb2N1c2VkXT1cImZvY3VzZWRcIlxuICAgICAgICBbY2xhc3MucmFuZ2VdPVwiaXNSYW5nZShkYXRlKVwiXG4gICAgICAgIFtjbGFzcy5mYWRlZF09XCJpc0hvdmVyZWQoZGF0ZSkgfHwgaXNJbnNpZGUoZGF0ZSlcIlxuICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJob3ZlcmVkRGF0ZSA9IGRhdGVcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkRGF0ZSA9IG51bGxcIlxuICAgID5cbiAgICAgICAge3sgZGF0ZS5kYXkgfX1cbiAgICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tXG5cbjxocj5cblxuPHByZT5Gcm9tOiB7eyBmcm9tRGF0ZSB8IGpzb24gfX0gPC9wcmU+XG48cHJlPlRvOiB7eyB0b0RhdGUgfCBqc29uIH19IDwvcHJlPlxuPHByZT53ZWVrTnVtYmVyczoge3sgd2Vla051bWJlcnMgfCBqc29uIH19IDwvcHJlPlxuXG4tLT5cbiJdfQ==
|