@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,1259 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
// Third party import statements
|
|
3
|
+
import { min, max, map, sortBy, uniq, cloneDeep, isEqual } from 'lodash-es';
|
|
4
|
+
import dayjs from 'dayjs';
|
|
5
|
+
import CustomParseFormat from 'dayjs/plugin/customParseFormat';
|
|
6
|
+
import minMax from 'dayjs/plugin/minMax';
|
|
7
|
+
import isBetween from 'dayjs/plugin/isBetween';
|
|
8
|
+
import { SortTypeEnum } from '../models/anna-sort.model';
|
|
9
|
+
// User defined import statements
|
|
10
|
+
import { AnnaDateTimeFormatService } from './anna-date-time-format.service';
|
|
11
|
+
import { AnnaSortService } from './anna-sort.service';
|
|
12
|
+
import { TooltipModel } from '../models/anna-tooltip.model';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "./anna-date-time-format.service";
|
|
15
|
+
import * as i2 from "./anna-sort.service";
|
|
16
|
+
export class AnnaFilterService {
|
|
17
|
+
static { this.bufferSize = 20; }
|
|
18
|
+
constructor(dateTimeFormatService, annaSortService) {
|
|
19
|
+
this.dateTimeFormatService = dateTimeFormatService;
|
|
20
|
+
this.annaSortService = annaSortService;
|
|
21
|
+
this.tooltipMap = new Map();
|
|
22
|
+
this.tooltipSelectedMap = new Map();
|
|
23
|
+
this.appliedFiltersArray = [];
|
|
24
|
+
this.sliderCurrencySet = new Set([
|
|
25
|
+
'booked',
|
|
26
|
+
'cpp',
|
|
27
|
+
'cpm',
|
|
28
|
+
'rcvPreempt',
|
|
29
|
+
'osPreempt',
|
|
30
|
+
'postedAdu',
|
|
31
|
+
'scheduledAdu',
|
|
32
|
+
'audienceDeficit',
|
|
33
|
+
'Rate',
|
|
34
|
+
'userADUs',
|
|
35
|
+
'buyerChanges',
|
|
36
|
+
'userChanges',
|
|
37
|
+
'userMG',
|
|
38
|
+
'udValue',
|
|
39
|
+
'odValue',
|
|
40
|
+
]);
|
|
41
|
+
this.isFilterSortActive = {};
|
|
42
|
+
this.resetFilterSortActiveStatus = true;
|
|
43
|
+
this.percentTranslateFunction = (data) => {
|
|
44
|
+
if (Math.abs(data) >= 1000) {
|
|
45
|
+
let isNegVal = data < 0;
|
|
46
|
+
const val = (Math.abs(data) / 1000).toFixed(1) + 'k%';
|
|
47
|
+
return isNegVal ? '-' + val : val;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
let isNegVal = data < 0;
|
|
51
|
+
let isWholeNum = parseInt(data.toString()) == data;
|
|
52
|
+
let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
|
|
53
|
+
return isNegVal ? '-' + val + '%' : val + '%';
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
this.currencyTranslateFunction = (data) => {
|
|
57
|
+
if (Math.abs(data) >= 1000) {
|
|
58
|
+
let isNegVal = data < 0;
|
|
59
|
+
const val = '$' + (Math.abs(data) / 1000).toFixed(1) + 'k';
|
|
60
|
+
return isNegVal ? '-' + val : val;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
let isNegVal = data < 0;
|
|
64
|
+
let isWholeNum = parseInt(data.toString()) == data;
|
|
65
|
+
let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
|
|
66
|
+
return isNegVal ? '-$' + val : '$' + val;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
this.normalTranslateFunction = (data) => {
|
|
70
|
+
if (data >= 1000) {
|
|
71
|
+
const val = (data / 1000).toFixed(1) + 'k';
|
|
72
|
+
return val;
|
|
73
|
+
}
|
|
74
|
+
else if (data != Math.floor(data)) {
|
|
75
|
+
return data.toFixed(1).toString();
|
|
76
|
+
}
|
|
77
|
+
return data.toString();
|
|
78
|
+
};
|
|
79
|
+
dayjs.extend(minMax);
|
|
80
|
+
dayjs.extend(isBetween);
|
|
81
|
+
dayjs.extend(CustomParseFormat);
|
|
82
|
+
const sliderArr = [
|
|
83
|
+
'rcvPreempt',
|
|
84
|
+
'osPreempt',
|
|
85
|
+
'rcvUnderDly',
|
|
86
|
+
'postedAudPercent',
|
|
87
|
+
'booked',
|
|
88
|
+
'spots',
|
|
89
|
+
'grp',
|
|
90
|
+
'cpp',
|
|
91
|
+
'imps',
|
|
92
|
+
'cpm',
|
|
93
|
+
'osUnderDly',
|
|
94
|
+
'totalWeeks',
|
|
95
|
+
'WeekNumber',
|
|
96
|
+
'Rate',
|
|
97
|
+
'OrderedRatingsOrImpressions',
|
|
98
|
+
'PostedRatingsOrImpressions',
|
|
99
|
+
,
|
|
100
|
+
'postedAudPercent',
|
|
101
|
+
'postedAdu',
|
|
102
|
+
'scheduledAdu',
|
|
103
|
+
'audienceDeficit',
|
|
104
|
+
'offeredMGs',
|
|
105
|
+
'outstandingPE',
|
|
106
|
+
'offeredADUs',
|
|
107
|
+
'udDeficitValue',
|
|
108
|
+
'bookedValue',
|
|
109
|
+
'bookedSpots',
|
|
110
|
+
'userChanges',
|
|
111
|
+
'UDGrp',
|
|
112
|
+
'UDImps',
|
|
113
|
+
'ODGrp',
|
|
114
|
+
'ODImps',
|
|
115
|
+
'udImpsPercent',
|
|
116
|
+
'udGrpPercent',
|
|
117
|
+
'odImpsPercent',
|
|
118
|
+
'odGrpPercent',
|
|
119
|
+
'userADUs',
|
|
120
|
+
'buyerChanges',
|
|
121
|
+
'userChanges',
|
|
122
|
+
'userMG',
|
|
123
|
+
'WeeklyAUR',
|
|
124
|
+
'WeeklyAURatingOrImpressions',
|
|
125
|
+
'MGsValue',
|
|
126
|
+
'ADUsValue',
|
|
127
|
+
'UserCreditedValue',
|
|
128
|
+
'UserUnresolvedValue',
|
|
129
|
+
'BuyerAddedValue',
|
|
130
|
+
'BuyerDeletedValue',
|
|
131
|
+
'BuyerChangesValue',
|
|
132
|
+
'UserChangesValue',
|
|
133
|
+
'BookedGRPOrIMPS',
|
|
134
|
+
'BookedCPPOrCPM',
|
|
135
|
+
'BookedValue',
|
|
136
|
+
'BookedSpots',
|
|
137
|
+
'BookedRate',
|
|
138
|
+
'BookedRTG',
|
|
139
|
+
'BookedIMPS',
|
|
140
|
+
'AURTG',
|
|
141
|
+
'AURTG',
|
|
142
|
+
'PostedRating',
|
|
143
|
+
'PostedImpressions',
|
|
144
|
+
'NormalizedOrderedRating',
|
|
145
|
+
'NormalizedOrderedImpressions',
|
|
146
|
+
'NormalizedPostedRating',
|
|
147
|
+
'NormalizedPostedImpressions',
|
|
148
|
+
'BookedGRP',
|
|
149
|
+
'BookedIMPSRevTab',
|
|
150
|
+
'BookedCPP',
|
|
151
|
+
'BookedCPM',
|
|
152
|
+
'AUIMPS',
|
|
153
|
+
'bookedAmountValue',
|
|
154
|
+
'equivalizedBookedAmountValue',
|
|
155
|
+
'IMPS',
|
|
156
|
+
'udValue',
|
|
157
|
+
'odValue',
|
|
158
|
+
'ViolatedBookedValue',
|
|
159
|
+
'ViolatedBookedEURValue',
|
|
160
|
+
'ViolatingBookedEURValue',
|
|
161
|
+
'ViolatingBookedValue',
|
|
162
|
+
'Rebate',
|
|
163
|
+
'OtherAvailableSpotsTableWeeklyAUR',
|
|
164
|
+
'parentRowAnnaEstimatesRtg',
|
|
165
|
+
'parentRowPostedRtg',
|
|
166
|
+
'parentRowRollingAverageRtg',
|
|
167
|
+
'parentRowStationEstimatesRtg',
|
|
168
|
+
'parentRowAnnaEstimatesImps',
|
|
169
|
+
'parentRowPostedImps',
|
|
170
|
+
'parentRowRollingAverageImps',
|
|
171
|
+
'parentRowStationEstimatesImps',
|
|
172
|
+
'parentRowAnnaEstimatesShare',
|
|
173
|
+
'parentRowPostedShare',
|
|
174
|
+
'parentRowRollingAverageShare',
|
|
175
|
+
'parentRowAnnaEstimatesPutPer',
|
|
176
|
+
'parentRowPostedPutPer',
|
|
177
|
+
'parentRowRollingAveragePutPer',
|
|
178
|
+
'parentRowAnnaEstimatesPut',
|
|
179
|
+
'parentRowPostedPut',
|
|
180
|
+
'parentRowRollingAveragePut',
|
|
181
|
+
'ProjectedImpressions',
|
|
182
|
+
'ProjectedRtg',
|
|
183
|
+
];
|
|
184
|
+
const calendarArr = [
|
|
185
|
+
'period',
|
|
186
|
+
'AirDate',
|
|
187
|
+
'flightStartDate',
|
|
188
|
+
'flightEndDate',
|
|
189
|
+
'date',
|
|
190
|
+
'startDate',
|
|
191
|
+
'endDate',
|
|
192
|
+
'revisionStartDate',
|
|
193
|
+
'GeneratedOn',
|
|
194
|
+
'Week',
|
|
195
|
+
'timeoutDate',
|
|
196
|
+
'ViolatingSpotDate',
|
|
197
|
+
'ViolatedSpotDate',
|
|
198
|
+
];
|
|
199
|
+
const timeArr = [
|
|
200
|
+
'StartTimeForFilter',
|
|
201
|
+
'EndTimeForFilter',
|
|
202
|
+
'time',
|
|
203
|
+
'startTimeForFilter',
|
|
204
|
+
'endTimeForFilter',
|
|
205
|
+
'start_time_for_filter',
|
|
206
|
+
'end_time_for_filter',
|
|
207
|
+
'startEndTimeMulti',
|
|
208
|
+
'startEndTime',
|
|
209
|
+
'timeoutTime',
|
|
210
|
+
'OtherAvailableSpotsTableStartTime',
|
|
211
|
+
'OtherAvailableSpotsTableEndTime',
|
|
212
|
+
];
|
|
213
|
+
this.sliderSet = new Set(sliderArr);
|
|
214
|
+
this.calendarSet = new Set(calendarArr);
|
|
215
|
+
this.timeSet = new Set(timeArr);
|
|
216
|
+
}
|
|
217
|
+
returnMaxAndMinValue(data, key, isMin) {
|
|
218
|
+
data = data.filter((obj) => !['', '-', null].includes(obj[key]));
|
|
219
|
+
const values = data.map((x) => x[key]);
|
|
220
|
+
let valueToReturn = isMin ? min(values) : max(values);
|
|
221
|
+
return valueToReturn;
|
|
222
|
+
}
|
|
223
|
+
returnMinAndMaxDate(data, key) {
|
|
224
|
+
data = data.filter((obj) => !['', '-', null].includes(obj[key]));
|
|
225
|
+
let DateArr = data.map((obj) => dayjs(obj[key]));
|
|
226
|
+
let minDate = dayjs.min(DateArr);
|
|
227
|
+
let maxDate = dayjs.max(DateArr);
|
|
228
|
+
return [minDate, maxDate];
|
|
229
|
+
}
|
|
230
|
+
isTooltipActive(header, sortMap) {
|
|
231
|
+
let set = new Set(this.appliedFiltersArray);
|
|
232
|
+
let isSortMapForHeader0Active = sortMap.has(header[0]) && sortMap.get(header[0]) != SortTypeEnum.DEFAULT;
|
|
233
|
+
let isSortMapForHeader1Active = sortMap.has(header[1]) && sortMap.get(header[1]) != SortTypeEnum.DEFAULT;
|
|
234
|
+
if (header.length == 1) {
|
|
235
|
+
return (sortMap.size > 0 && isSortMapForHeader0Active) || set.has(header[0]);
|
|
236
|
+
}
|
|
237
|
+
return ((sortMap.size > 0 && sortMap.has(header[0]) && isSortMapForHeader0Active) ||
|
|
238
|
+
(sortMap.size > 0 && sortMap.has(header[1]) && isSortMapForHeader1Active) ||
|
|
239
|
+
set.has(header[0]) ||
|
|
240
|
+
set.has(header[1]));
|
|
241
|
+
}
|
|
242
|
+
clearColumnFilter() {
|
|
243
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
244
|
+
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
245
|
+
let appliedFilterSet = new Set(this.appliedFiltersArray);
|
|
246
|
+
appliedFilterSet.delete(this.selectedRadio);
|
|
247
|
+
this.appliedFiltersArray = [...appliedFilterSet];
|
|
248
|
+
}
|
|
249
|
+
if (this.annaSortService.columnSortState.has(this.selectedRadio)) {
|
|
250
|
+
this.annaSortService.columnSortState.delete(this.selectedRadio);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
setOptionValues(minValue, maxValue) {
|
|
254
|
+
return {
|
|
255
|
+
floor: minValue,
|
|
256
|
+
ceil: maxValue,
|
|
257
|
+
disabled: true,
|
|
258
|
+
translate: this.normalTranslateFunction,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
findUniqueDatesWithData(data) {
|
|
262
|
+
let uniqueDates = uniq(data.map((u) => u['date']));
|
|
263
|
+
let uniqueDatesInNgbDateFormat = [];
|
|
264
|
+
uniqueDates.forEach((date) => {
|
|
265
|
+
uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(dayjs(date, 'MM/DD/YY').format('MM/DD/YYYY')));
|
|
266
|
+
});
|
|
267
|
+
return uniqueDatesInNgbDateFormat;
|
|
268
|
+
}
|
|
269
|
+
reOrderAppliedFiltersArray(isHierarchialUserFiltered, date) {
|
|
270
|
+
let isFiltered = true;
|
|
271
|
+
isFiltered = this.checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date);
|
|
272
|
+
this.removeOrChangeLatestFilterIndex(isFiltered);
|
|
273
|
+
}
|
|
274
|
+
checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date) {
|
|
275
|
+
if (this.selectedRadio == 'user' && !this.tooltipMap.has('user')) {
|
|
276
|
+
isFiltered = cloneDeep(isHierarchialUserFiltered);
|
|
277
|
+
}
|
|
278
|
+
else if (this.selectedRadio == 'StartTimeForFilter' ||
|
|
279
|
+
this.selectedRadio == 'EndTimeForFilter' ||
|
|
280
|
+
this.selectedRadio == 'startTimeForFilter' ||
|
|
281
|
+
this.selectedRadio == 'endTimeForFilter' ||
|
|
282
|
+
this.selectedRadio == 'time' ||
|
|
283
|
+
this.selectedRadio == 'timeoutTime' ||
|
|
284
|
+
this.selectedRadio == 'OtherAvailableSpotsTableStartTime' ||
|
|
285
|
+
this.selectedRadio == 'OtherAvailableSpotsTableEndTime' ||
|
|
286
|
+
this.selectedRadio == 'start_time_for_filter' ||
|
|
287
|
+
this.selectedRadio == 'end_time_for_filter' ||
|
|
288
|
+
this.selectedRadio == 'startEndTimeMulti') {
|
|
289
|
+
isFiltered =
|
|
290
|
+
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
|
|
291
|
+
!this.includeZeroTime ||
|
|
292
|
+
!this.includeMultiTime;
|
|
293
|
+
}
|
|
294
|
+
else if (this.selectedRadio == 'startEndTime' || this.selectedRadio == 'TimeBand') {
|
|
295
|
+
isFiltered =
|
|
296
|
+
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
|
|
297
|
+
!this.includeZeroTime ||
|
|
298
|
+
!this.includeMultiTime;
|
|
299
|
+
}
|
|
300
|
+
else if (this.sliderSet.has(this.selectedRadio)) {
|
|
301
|
+
isFiltered =
|
|
302
|
+
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.sliderData);
|
|
303
|
+
if (this.selectedRadio == 'postedAdu' && this.subRadioButton == 'notRequired') {
|
|
304
|
+
isFiltered = true;
|
|
305
|
+
}
|
|
306
|
+
if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
307
|
+
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
else if (this.selectedRadio == 'startDate' ||
|
|
311
|
+
this.selectedRadio == 'endDate' ||
|
|
312
|
+
this.selectedRadio == 'period' ||
|
|
313
|
+
this.selectedRadio == 'AirDate' ||
|
|
314
|
+
this.selectedRadio == 'timeoutDate' ||
|
|
315
|
+
this.selectedRadio === 'flightStartDate' ||
|
|
316
|
+
this.selectedRadio === 'flightEndDate' ||
|
|
317
|
+
this.selectedRadio == 'date' ||
|
|
318
|
+
this.selectedRadio == 'revisionStartDate' ||
|
|
319
|
+
this.selectedRadio == 'GeneratedOn' ||
|
|
320
|
+
this.selectedRadio == 'Week') {
|
|
321
|
+
isFiltered =
|
|
322
|
+
!isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.flightDateRange);
|
|
323
|
+
if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
324
|
+
this.tooltipSelectedMap.delete(this.selectedRadio);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
let totalOptionsCount = this.tooltipMap.get(this.selectedRadio).filter((x) => !x.isHidden).length;
|
|
329
|
+
let selectedOptionsCount = this.tooltipMap
|
|
330
|
+
.get(this.selectedRadio)
|
|
331
|
+
.filter((x) => !x.isHidden && x.isSelected).length;
|
|
332
|
+
isFiltered = selectedOptionsCount > 0 && selectedOptionsCount != totalOptionsCount ? true : false;
|
|
333
|
+
}
|
|
334
|
+
return isFiltered;
|
|
335
|
+
}
|
|
336
|
+
removeOrChangeLatestFilterIndex(isFiltered) {
|
|
337
|
+
let set = new Set(this.appliedFiltersArray);
|
|
338
|
+
if (isFiltered && !set.has(this.selectedRadio)) {
|
|
339
|
+
set.add(this.selectedRadio);
|
|
340
|
+
}
|
|
341
|
+
else if (isFiltered && set.has(this.selectedRadio)) {
|
|
342
|
+
set.delete(this.selectedRadio);
|
|
343
|
+
set.add(this.selectedRadio);
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
set.delete(this.selectedRadio);
|
|
347
|
+
}
|
|
348
|
+
this.appliedFiltersArray = [...set];
|
|
349
|
+
}
|
|
350
|
+
checkIfSortingIsAppliedThenSortTheData(originalData) {
|
|
351
|
+
if (!this.annaSortService?.columnSortState)
|
|
352
|
+
return originalData;
|
|
353
|
+
for (let [key, value] of this.annaSortService.columnSortState.entries()) {
|
|
354
|
+
if (value == 'ASC') {
|
|
355
|
+
originalData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(true, originalData, key));
|
|
356
|
+
}
|
|
357
|
+
else if (value == 'DESC') {
|
|
358
|
+
originalData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(false, originalData, key));
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return originalData;
|
|
362
|
+
}
|
|
363
|
+
filterData(originalData, keyToSkip, isLurCsrPage = false) {
|
|
364
|
+
let filteredData = [...originalData];
|
|
365
|
+
if (!isLurCsrPage) {
|
|
366
|
+
filteredData = this.checkIfSortingIsAppliedThenSortTheData(originalData);
|
|
367
|
+
}
|
|
368
|
+
this.tooltipSelectedMap.forEach((value, key) => {
|
|
369
|
+
if (key != keyToSkip && originalData.length > 0 && Object.keys(originalData[0]).includes(key)) {
|
|
370
|
+
if (this.sliderSet.has(key)) {
|
|
371
|
+
filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
|
|
372
|
+
}
|
|
373
|
+
else if (key === 'startDate' ||
|
|
374
|
+
key === 'endDate' ||
|
|
375
|
+
key === 'AirDate' ||
|
|
376
|
+
key === 'timeoutDate' ||
|
|
377
|
+
key === 'flightStartDate' ||
|
|
378
|
+
key === 'flightEndDate' ||
|
|
379
|
+
key == 'date' ||
|
|
380
|
+
key == 'Date' ||
|
|
381
|
+
key == 'revisionStartDate' ||
|
|
382
|
+
key == 'GeneratedOn' ||
|
|
383
|
+
key === 'Week' ||
|
|
384
|
+
key === 'ViolatedSpotDate' ||
|
|
385
|
+
key === 'ViolatingSpotDate') {
|
|
386
|
+
filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
|
|
387
|
+
}
|
|
388
|
+
else if (key === 'period') {
|
|
389
|
+
filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
|
|
390
|
+
}
|
|
391
|
+
else if (key === 'StartTimeForFilter' ||
|
|
392
|
+
key === 'EndTimeForFilter' ||
|
|
393
|
+
key == 'timeoutTime' ||
|
|
394
|
+
key === 'startTimeForFilter' ||
|
|
395
|
+
key === 'endTimeForFilter' ||
|
|
396
|
+
key === 'OtherAvailableSpotsTableStartTime' ||
|
|
397
|
+
key == 'OtherAvailableSpotsTableEndTime' ||
|
|
398
|
+
key === 'start_time_for_filter' ||
|
|
399
|
+
key === 'end_time_for_filter' ||
|
|
400
|
+
key == 'time') {
|
|
401
|
+
filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
|
|
402
|
+
}
|
|
403
|
+
else if (key === 'startEndTimeMulti' || key == 'startEndTime' || key === 'TimeBand') {
|
|
404
|
+
filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
|
|
405
|
+
}
|
|
406
|
+
else if (value.length > 0) {
|
|
407
|
+
filteredData = filteredData.filter((u) => value.includes(u[key]));
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
return filteredData;
|
|
412
|
+
}
|
|
413
|
+
returnOrdersInTheRange(order, range, key) {
|
|
414
|
+
let isDateBetweenTheSelectedRange = dayjs(order[key]).isBetween(range.minSelectedDate, range.maxSelectedDate);
|
|
415
|
+
let isDateSameAsTheMinSelectedDate = dayjs(order[key]).isSame(range.minSelectedDate);
|
|
416
|
+
let isDateSameAsTheMaxSelectedDate = dayjs(order[key]).isSame(range.maxSelectedDate);
|
|
417
|
+
return isDateBetweenTheSelectedRange || isDateSameAsTheMinSelectedDate || isDateSameAsTheMaxSelectedDate;
|
|
418
|
+
}
|
|
419
|
+
returnDataForTimeRange(obj, selectedData) {
|
|
420
|
+
let format = 'HH:mm:ss';
|
|
421
|
+
let selectedStartDate = dayjs(selectedData.startTime, format);
|
|
422
|
+
let selectedEndDate = dayjs(selectedData.endTime, format);
|
|
423
|
+
let startTime = dayjs(obj.startTime, format);
|
|
424
|
+
let endTime = dayjs(obj.endTime, format);
|
|
425
|
+
let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedStartDate);
|
|
426
|
+
let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedStartDate, selectedEndDate);
|
|
427
|
+
let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedEndDate);
|
|
428
|
+
let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedStartDate, selectedEndDate);
|
|
429
|
+
return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
430
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
|
|
431
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
432
|
+
(isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
|
|
433
|
+
}
|
|
434
|
+
returnDataForFromAndToTimeRange(obj, selectedData, key) {
|
|
435
|
+
let format = 'MM/DD/YYYY HH:mm:ss';
|
|
436
|
+
let selectedFromTime = dayjs('01/01/2001 ' + selectedData.fromTime, format);
|
|
437
|
+
let selectedToTime = dayjs('01/01/2001 ' + selectedData.toTime, format);
|
|
438
|
+
let objTime = obj[key];
|
|
439
|
+
if (['', '-', null].includes(objTime)) {
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
if (selectedData.includeMulti && obj[key] == '<multi>') {
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
if (!selectedData.includeMulti && obj[key] == '<multi>') {
|
|
446
|
+
return false;
|
|
447
|
+
}
|
|
448
|
+
if (selectedData.includeZero && obj[key] == '0') {
|
|
449
|
+
return true;
|
|
450
|
+
}
|
|
451
|
+
if (!selectedData.includeZero && obj[key] == '0') {
|
|
452
|
+
return false;
|
|
453
|
+
}
|
|
454
|
+
if (!selectedData.includeTimeRange) {
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
let dayjsTime = dayjs('01/01/2001 ' + objTime, format);
|
|
458
|
+
let isObjTimeSameAsSelectedFromTime = dayjsTime.isSame(selectedFromTime);
|
|
459
|
+
let isObjTimeSameAsSelectedToTime = dayjsTime.isSame(selectedToTime);
|
|
460
|
+
let isObjTimeBetweenSelectedFromTimeAndToTime = dayjsTime.isBetween(selectedFromTime, selectedToTime);
|
|
461
|
+
return (isObjTimeSameAsSelectedFromTime ||
|
|
462
|
+
isObjTimeSameAsSelectedToTime ||
|
|
463
|
+
isObjTimeBetweenSelectedFromTimeAndToTime);
|
|
464
|
+
}
|
|
465
|
+
returnDataForStartAndEndTimeRange(obj, selectedData, key) {
|
|
466
|
+
let format = 'MM/DD/YYYY HH:mm:ss';
|
|
467
|
+
let selectedFromTime = dayjs('01/01/2001 ' + selectedData.fromTime, format);
|
|
468
|
+
let selectedToTime = dayjs('01/01/2001 ' + selectedData.toTime, format);
|
|
469
|
+
if (selectedData.includeMulti && obj[key][0] == '<multi>') {
|
|
470
|
+
return true;
|
|
471
|
+
}
|
|
472
|
+
if (!selectedData.includeMulti && obj[key][0] == '<multi>') {
|
|
473
|
+
return false;
|
|
474
|
+
}
|
|
475
|
+
if (selectedData.includeZero && obj[key][0] == '0') {
|
|
476
|
+
return true;
|
|
477
|
+
}
|
|
478
|
+
if (!selectedData.includeZero && obj[key][0] == '0') {
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
if (!selectedData.includeTimeRange) {
|
|
482
|
+
return false;
|
|
483
|
+
}
|
|
484
|
+
let startTime = dayjs('01/01/2001 ' + obj[key][1], format);
|
|
485
|
+
let endTime = dayjs('01/01/2001 ' + obj[key][2], format);
|
|
486
|
+
let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedFromTime);
|
|
487
|
+
let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedFromTime, selectedToTime);
|
|
488
|
+
let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedToTime);
|
|
489
|
+
let isEndTimeBetweenSelectedStartAndEndTime = endTime.isBetween(selectedFromTime, selectedToTime);
|
|
490
|
+
return ((isStartTimeBetweenSelectedStartAndEndTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
491
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeSameAsSelectedEndTime) ||
|
|
492
|
+
(isStartTimeSameAsSelectedStartTime && isEndTimeBetweenSelectedStartAndEndTime) ||
|
|
493
|
+
(isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
|
|
494
|
+
}
|
|
495
|
+
getDataInTheDateRange(obj, value, key) {
|
|
496
|
+
let parsingFormat;
|
|
497
|
+
if (key === 'period') {
|
|
498
|
+
parsingFormat = 'YYYY-MM-DD';
|
|
499
|
+
let dayjsStartDate = dayjs(obj.startDate);
|
|
500
|
+
let dayjsEndDate = dayjs(obj.endDate);
|
|
501
|
+
let startDateIsBetweenSelDate = dayjsStartDate.isBetween(value.fromDate, value.toDate);
|
|
502
|
+
let endDateIsBetweenSelDate = dayjsEndDate.isBetween(value.fromDate, value.toDate);
|
|
503
|
+
let startDateIsSameAsSelStartDate = value.fromDate.isSame(dayjsStartDate);
|
|
504
|
+
let endDateIsSameAsSelEndDate = value.toDate.isSame(dayjsEndDate);
|
|
505
|
+
return ((startDateIsBetweenSelDate || startDateIsSameAsSelStartDate) &&
|
|
506
|
+
(endDateIsBetweenSelDate || endDateIsSameAsSelEndDate));
|
|
507
|
+
}
|
|
508
|
+
else if (key === 'AirDate' ||
|
|
509
|
+
key === 'flightStartDate' ||
|
|
510
|
+
key === 'flightEndDate' ||
|
|
511
|
+
key === 'Week' ||
|
|
512
|
+
key === 'timeoutDate') {
|
|
513
|
+
parsingFormat = 'MM/DD/YYYY';
|
|
514
|
+
let dateIsBetweenSelDate = dayjs(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
|
|
515
|
+
let dateIsSameAsSelStartDate = dayjs(obj[key], parsingFormat).isSame(value.minSelectedDate);
|
|
516
|
+
let dateIsSameAsSelEndDate = dayjs(obj[key], parsingFormat).isSame(value.maxSelectedDate);
|
|
517
|
+
return dateIsBetweenSelDate || dateIsSameAsSelStartDate || dateIsSameAsSelEndDate;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
initializeTimeFilterData(clonedData, key = 'startEndTime') {
|
|
521
|
+
let startTimeArr = map(clonedData, 'startTime');
|
|
522
|
+
let endTimeArr = map(clonedData, 'endTime');
|
|
523
|
+
startTimeArr.sort((a, b) => {
|
|
524
|
+
return this.dateTimeFormatService.sortByTimeAscending(a, b);
|
|
525
|
+
});
|
|
526
|
+
endTimeArr.sort((a, b) => {
|
|
527
|
+
return this.dateTimeFormatService.sortByTimeDescending(a, b);
|
|
528
|
+
});
|
|
529
|
+
let initialStartEndTime = {
|
|
530
|
+
startTime: startTimeArr[0],
|
|
531
|
+
endTime: endTimeArr[0],
|
|
532
|
+
};
|
|
533
|
+
this.initialValueMap.set(key, initialStartEndTime);
|
|
534
|
+
}
|
|
535
|
+
returnColumnFilterStatus(data, headerName) {
|
|
536
|
+
if (headerName == 'startEndTime') {
|
|
537
|
+
let time = data.map((u) => u[headerName][0]);
|
|
538
|
+
let uniqTime = uniq(time);
|
|
539
|
+
return uniqTime.length == 0;
|
|
540
|
+
}
|
|
541
|
+
return uniq(data.map((u) => u[headerName])).length > 1 ? false : true;
|
|
542
|
+
}
|
|
543
|
+
getFilterOptionsData(data, clonedData, key) {
|
|
544
|
+
let appliedFilterSet = new Set(this.appliedFiltersArray);
|
|
545
|
+
key = key ? key : this.selectedRadio;
|
|
546
|
+
if (appliedFilterSet.has(key)) {
|
|
547
|
+
return this.filterData(clonedData, key);
|
|
548
|
+
}
|
|
549
|
+
else {
|
|
550
|
+
return data;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
reOrderAppliedFiltersState(clonedData, value) {
|
|
554
|
+
let isFiltered = true;
|
|
555
|
+
isFiltered = this.checkIfFilterIsApplied(clonedData, value);
|
|
556
|
+
this.removeOrChangeLatestFilterIndex(isFiltered);
|
|
557
|
+
return isFiltered;
|
|
558
|
+
}
|
|
559
|
+
checkIfFilterIsApplied(clonedData, value) {
|
|
560
|
+
let initialValueOfColumn = sortBy(clonedData.map((item) => item[this.selectedRadio]));
|
|
561
|
+
let currentValueOfColumn = sortBy(this.applyFilter(clonedData, value).map((item) => item[this.selectedRadio]));
|
|
562
|
+
return !isEqual(initialValueOfColumn, currentValueOfColumn);
|
|
563
|
+
}
|
|
564
|
+
applyFilter(data, value) {
|
|
565
|
+
let filteredData = data;
|
|
566
|
+
let key = this.selectedRadio;
|
|
567
|
+
if (this.sliderSet.has(key)) {
|
|
568
|
+
filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
|
|
569
|
+
}
|
|
570
|
+
else if (key === 'startDate' ||
|
|
571
|
+
key === 'endDate' ||
|
|
572
|
+
key === 'AirDate' ||
|
|
573
|
+
key === 'timeoutDate' ||
|
|
574
|
+
key === 'flightStartDate' ||
|
|
575
|
+
key === 'flightEndDate' ||
|
|
576
|
+
key == 'date' ||
|
|
577
|
+
key == 'Date' ||
|
|
578
|
+
key == 'revisionStartDate' ||
|
|
579
|
+
key == 'GeneratedOn' ||
|
|
580
|
+
key === 'Week' ||
|
|
581
|
+
key === 'ViolatedSpotDate' ||
|
|
582
|
+
key === 'ViolatingSpotDate') {
|
|
583
|
+
filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
|
|
584
|
+
}
|
|
585
|
+
else if (key === 'period') {
|
|
586
|
+
filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
|
|
587
|
+
}
|
|
588
|
+
else if (key === 'StartTimeForFilter' ||
|
|
589
|
+
key === 'EndTimeForFilter' ||
|
|
590
|
+
key == 'timeoutTime' ||
|
|
591
|
+
key === 'startTimeForFilter' ||
|
|
592
|
+
key === 'endTimeForFilter' ||
|
|
593
|
+
key === 'start_time_for_filter' ||
|
|
594
|
+
key === 'end_time_for_filter' ||
|
|
595
|
+
key == 'time' ||
|
|
596
|
+
key == 'OtherAvailableSpotsTableStartTime' ||
|
|
597
|
+
key == 'OtherAvailableSpotsTableEndTime') {
|
|
598
|
+
filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
|
|
599
|
+
}
|
|
600
|
+
else if (key === 'startEndTimeMulti' || key == 'startEndTime' || key === 'TimeBand') {
|
|
601
|
+
filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
|
|
602
|
+
}
|
|
603
|
+
else if (value.length > 0) {
|
|
604
|
+
filteredData = filteredData.filter((u) => value.includes(u[key]));
|
|
605
|
+
}
|
|
606
|
+
return filteredData;
|
|
607
|
+
}
|
|
608
|
+
isObjectInTheRange(obj, value, key) {
|
|
609
|
+
let objVal = obj[key];
|
|
610
|
+
let dayjsDate = dayjs(objVal);
|
|
611
|
+
if (typeof value.fromDate === 'string' && typeof value.toDate === 'string') {
|
|
612
|
+
value.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.fromDate, 'DD/MM/YYYY')));
|
|
613
|
+
value.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.toDate, 'DD/MM/YYYY')));
|
|
614
|
+
}
|
|
615
|
+
let isDateSameAsStartOfTheRange = value.fromDate.isSame(objVal);
|
|
616
|
+
let isDateSameAsEndOfTheRange = value.toDate.isSame(objVal);
|
|
617
|
+
let isDateBetweenTheStartAndEndOfRange = dayjsDate.isBetween(value.fromDate, value.toDate);
|
|
618
|
+
return isDateSameAsStartOfTheRange || isDateSameAsEndOfTheRange || isDateBetweenTheStartAndEndOfRange;
|
|
619
|
+
}
|
|
620
|
+
updateStateOfTheCurrentFilterTab(sortMap) {
|
|
621
|
+
let activeKey = this.selectedRadio;
|
|
622
|
+
let keyArr = [];
|
|
623
|
+
Object.keys(this.isFilterSortActive).forEach((key) => {
|
|
624
|
+
if (key.includes(activeKey)) {
|
|
625
|
+
keyArr = key.split(',');
|
|
626
|
+
this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
|
|
627
|
+
}
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
updateStateOfAllTheKeys(sortMap) {
|
|
631
|
+
Object.keys(this.isFilterSortActive).forEach((key) => {
|
|
632
|
+
let keyArr = key.split(',');
|
|
633
|
+
this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
incrementHour(value) {
|
|
637
|
+
if (value == '') {
|
|
638
|
+
value = 1;
|
|
639
|
+
}
|
|
640
|
+
else if (parseInt(value) < 12) {
|
|
641
|
+
value = parseInt(value) + 1;
|
|
642
|
+
}
|
|
643
|
+
else {
|
|
644
|
+
value = 1;
|
|
645
|
+
}
|
|
646
|
+
return value;
|
|
647
|
+
}
|
|
648
|
+
decrementHour(value) {
|
|
649
|
+
if (value == '') {
|
|
650
|
+
value = 12;
|
|
651
|
+
}
|
|
652
|
+
else if (parseInt(value) > 1) {
|
|
653
|
+
value = parseInt(value) - 1;
|
|
654
|
+
}
|
|
655
|
+
else {
|
|
656
|
+
value = 12;
|
|
657
|
+
}
|
|
658
|
+
return value;
|
|
659
|
+
}
|
|
660
|
+
incrementMinute(value) {
|
|
661
|
+
// increment to nearest proper interval(15,30,45)
|
|
662
|
+
let min = parseInt(value);
|
|
663
|
+
if (min <= 14) {
|
|
664
|
+
value = '15';
|
|
665
|
+
}
|
|
666
|
+
else if (min >= 15 && min <= 29) {
|
|
667
|
+
value = '30';
|
|
668
|
+
}
|
|
669
|
+
else if (min >= 30 && min <= 44) {
|
|
670
|
+
value = '45';
|
|
671
|
+
}
|
|
672
|
+
else if (min >= 45) {
|
|
673
|
+
value = '00';
|
|
674
|
+
}
|
|
675
|
+
return value;
|
|
676
|
+
}
|
|
677
|
+
decrementMinute(value) {
|
|
678
|
+
let min = parseInt(value);
|
|
679
|
+
if (min > 0 && min <= 15) {
|
|
680
|
+
value = '00';
|
|
681
|
+
}
|
|
682
|
+
else if (min >= 16 && min <= 30) {
|
|
683
|
+
value = '15';
|
|
684
|
+
}
|
|
685
|
+
else if (min >= 31 && min <= 45) {
|
|
686
|
+
value = '30';
|
|
687
|
+
}
|
|
688
|
+
else if (min > 45 || min == 0) {
|
|
689
|
+
value = '45';
|
|
690
|
+
}
|
|
691
|
+
return value;
|
|
692
|
+
}
|
|
693
|
+
//========================================Checkbox method=============================================================//
|
|
694
|
+
disableActiveFilterClearButton() {
|
|
695
|
+
let selectedFilterSet = new Set(this.appliedFiltersArray);
|
|
696
|
+
let currentColumnSortFilter = this.getColumnSortStateForSelectedRadio();
|
|
697
|
+
let isSortPresent = this.annaSortService.columnSortState &&
|
|
698
|
+
this.annaSortService.columnSortState.size > 0 &&
|
|
699
|
+
currentColumnSortFilter != SortTypeEnum.DEFAULT;
|
|
700
|
+
return !(selectedFilterSet.has(this.selectedRadio) || isSortPresent);
|
|
701
|
+
}
|
|
702
|
+
getColumnSortStateForSelectedRadio() {
|
|
703
|
+
let currentColumnSortFilter = this.annaSortService.columnSortState &&
|
|
704
|
+
this.annaSortService.columnSortState.has(this.selectedRadio) &&
|
|
705
|
+
this.annaSortService.columnSortState.get(this.selectedRadio);
|
|
706
|
+
currentColumnSortFilter = currentColumnSortFilter ? currentColumnSortFilter : SortTypeEnum.DEFAULT;
|
|
707
|
+
return currentColumnSortFilter;
|
|
708
|
+
}
|
|
709
|
+
createListForCheckboxFilter(header, optionData) {
|
|
710
|
+
let tooltipOptions = this.getTooltipModelFromOptionData(optionData, header);
|
|
711
|
+
this.selectUnselectListCheckbox(tooltipOptions, header);
|
|
712
|
+
this.formatNullOptionToSpecifiedString(tooltipOptions, '-');
|
|
713
|
+
return tooltipOptions;
|
|
714
|
+
}
|
|
715
|
+
getTooltipModelFromOptionData(optionData, header) {
|
|
716
|
+
let uniqOptionData = uniq(optionData.map((item) => item[header]));
|
|
717
|
+
return uniqOptionData.map((item, index) => new TooltipModel(item, index + 1));
|
|
718
|
+
}
|
|
719
|
+
selectUnselectListCheckbox(tooltipOptions, header) {
|
|
720
|
+
if (this.tooltipSelectedMap.has(header)) {
|
|
721
|
+
let selectedValueSet = new Set(this.tooltipSelectedMap.get(header));
|
|
722
|
+
tooltipOptions.forEach((item) => (item.isSelected = selectedValueSet.has(item.value) ? true : false));
|
|
723
|
+
}
|
|
724
|
+
else {
|
|
725
|
+
tooltipOptions.forEach((item) => (item.isSelected = true));
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
formatNullOptionToSpecifiedString(tooltipOptions, formattedString) {
|
|
729
|
+
let index = tooltipOptions.findIndex((item) => item.value == null);
|
|
730
|
+
if (index != -1) {
|
|
731
|
+
tooltipOptions[index].label = formattedString;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
getClonedTooltipAndTooltipOption(tooltipOptions, sortByString) {
|
|
735
|
+
let [selectedItems, unselectedItems] = this.getSelectedAndUnselectedItems(tooltipOptions);
|
|
736
|
+
let sortedSelectedItems = sortBy(selectedItems, sortByString);
|
|
737
|
+
let sortedUnselectedItems = sortBy(unselectedItems, sortByString);
|
|
738
|
+
let clonedTooltipOptions = [...sortedSelectedItems, ...sortedUnselectedItems];
|
|
739
|
+
let updatedTooltipOptions = cloneDeep(clonedTooltipOptions);
|
|
740
|
+
return [clonedTooltipOptions, updatedTooltipOptions, selectedItems, unselectedItems];
|
|
741
|
+
}
|
|
742
|
+
getHeightOfCheckboxTooltipFilter(dataLength, margin) {
|
|
743
|
+
return dataLength > 6 ? 200 : 26.03 * dataLength + margin * dataLength + margin;
|
|
744
|
+
}
|
|
745
|
+
unCheckAllCheckbox(tooltipOptions, clonedTooltipOptions) {
|
|
746
|
+
tooltipOptions.forEach((item) => {
|
|
747
|
+
item.isSelected = false;
|
|
748
|
+
let index = clonedTooltipOptions.findIndex((opt) => opt.id == item.id);
|
|
749
|
+
clonedTooltipOptions[index].isSelected = false;
|
|
750
|
+
});
|
|
751
|
+
}
|
|
752
|
+
selectAllCheckbox(tooltipOptions, clonedTooltipOptions) {
|
|
753
|
+
tooltipOptions.forEach((item) => {
|
|
754
|
+
item.isSelected = true;
|
|
755
|
+
let index = clonedTooltipOptions.findIndex((opt) => opt.id == item.id);
|
|
756
|
+
clonedTooltipOptions[index].isSelected = true;
|
|
757
|
+
});
|
|
758
|
+
}
|
|
759
|
+
selectUnselectCheckbox(data, clonedTooltipOptions) {
|
|
760
|
+
data.isSelected = !data.isSelected;
|
|
761
|
+
let index = clonedTooltipOptions.findIndex((item) => item.id == data.id);
|
|
762
|
+
clonedTooltipOptions[index].isSelected = data.isSelected;
|
|
763
|
+
}
|
|
764
|
+
getSelectedAndUnselectedItems(tooltipOptions) {
|
|
765
|
+
let selectedItems = tooltipOptions.filter((item) => item.isSelected);
|
|
766
|
+
let unselectedItems = tooltipOptions.filter((item) => !item.isSelected);
|
|
767
|
+
return [selectedItems, unselectedItems];
|
|
768
|
+
}
|
|
769
|
+
getCheckboxPreviousSelectedValue(clonedTableData) {
|
|
770
|
+
let previousSelectedValue = [];
|
|
771
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
772
|
+
previousSelectedValue = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
773
|
+
if (!this.initialValueMap.has(this.selectedRadio)) {
|
|
774
|
+
let initialValue = sortBy(uniq(clonedTableData.map((item) => item[this.selectedRadio])));
|
|
775
|
+
this.initialValueMap.set(this.selectedRadio, initialValue);
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
else if (this.initialValueMap.has(this.selectedRadio)) {
|
|
779
|
+
previousSelectedValue = this.initialValueMap.get(this.selectedRadio);
|
|
780
|
+
}
|
|
781
|
+
else {
|
|
782
|
+
previousSelectedValue = sortBy(uniq(clonedTableData.map((item) => item[this.selectedRadio])));
|
|
783
|
+
this.initialValueMap.set(this.selectedRadio, previousSelectedValue);
|
|
784
|
+
}
|
|
785
|
+
return previousSelectedValue;
|
|
786
|
+
}
|
|
787
|
+
getCheckboxCurrentSelectedValue(searchedString, tooltipOptions) {
|
|
788
|
+
let currentSelectedValue = [];
|
|
789
|
+
if (tooltipOptions) {
|
|
790
|
+
currentSelectedValue = sortBy(tooltipOptions.filter((item) => item.isSelected).map((item) => item.value));
|
|
791
|
+
if (!searchedString &&
|
|
792
|
+
currentSelectedValue.length == tooltipOptions.length &&
|
|
793
|
+
this.initialValueMap.has(this.selectedRadio)) {
|
|
794
|
+
currentSelectedValue = this.initialValueMap.get(this.selectedRadio);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
let blankIndex = currentSelectedValue.findIndex((item) => item == null);
|
|
798
|
+
if (blankIndex != -1) {
|
|
799
|
+
currentSelectedValue = sortBy(currentSelectedValue);
|
|
800
|
+
}
|
|
801
|
+
return currentSelectedValue;
|
|
802
|
+
}
|
|
803
|
+
checkIfSortingChanged(tempSortOrder) {
|
|
804
|
+
let currentColumnSortFilter = this.getColumnSortStateForSelectedRadio();
|
|
805
|
+
let isSortChanged = tempSortOrder != null && tempSortOrder != currentColumnSortFilter;
|
|
806
|
+
return isSortChanged;
|
|
807
|
+
}
|
|
808
|
+
getFilteredOptionAsBoldString(str, clonedTooltipOptions) {
|
|
809
|
+
let tooltipOptions = cloneDeep(clonedTooltipOptions.filter((item) => item.label.toString().toLowerCase().includes(str.toLowerCase())));
|
|
810
|
+
tooltipOptions.forEach((element) => {
|
|
811
|
+
element.label = this.boldString(element.label, str);
|
|
812
|
+
});
|
|
813
|
+
return tooltipOptions;
|
|
814
|
+
}
|
|
815
|
+
boldString(str, find) {
|
|
816
|
+
let indexes = this.getIndicesOf(find, str, false);
|
|
817
|
+
indexes.forEach((item, index) => {
|
|
818
|
+
let startIndex = item + index * 7; //Multiplying by 7 as there are 7char: <b></b>
|
|
819
|
+
let endIndex = startIndex + find.length;
|
|
820
|
+
let strToBeReplaced = str.substring(startIndex, endIndex);
|
|
821
|
+
str = str.replace(strToBeReplaced, '<b>' + strToBeReplaced + '</b>');
|
|
822
|
+
});
|
|
823
|
+
return str;
|
|
824
|
+
}
|
|
825
|
+
getIndicesOf(searchStr, str, caseSensitive) {
|
|
826
|
+
var searchStrLen = searchStr.length;
|
|
827
|
+
if (searchStrLen == 0) {
|
|
828
|
+
return [];
|
|
829
|
+
}
|
|
830
|
+
var startIndex = 0, index, indices = [];
|
|
831
|
+
if (!caseSensitive) {
|
|
832
|
+
str = str.toLowerCase();
|
|
833
|
+
searchStr = searchStr.toLowerCase();
|
|
834
|
+
}
|
|
835
|
+
while ((index = str.indexOf(searchStr, startIndex)) > -1) {
|
|
836
|
+
indices.push(index);
|
|
837
|
+
startIndex = index + searchStrLen;
|
|
838
|
+
}
|
|
839
|
+
return indices;
|
|
840
|
+
}
|
|
841
|
+
disableAllBtnsWhenThereAreNoFilteredResults() {
|
|
842
|
+
// [selectedCheckboxOptionsCount, disableCheckboxApply, disableClearAll, disableSelectAll];
|
|
843
|
+
return [0, true, true, true];
|
|
844
|
+
}
|
|
845
|
+
//============================================================Calendar filter===========================================================//
|
|
846
|
+
createRangeForTheDateFilter(optionData) {
|
|
847
|
+
let minMaxDate;
|
|
848
|
+
//When you want to use startDate and endDate combined as single column then use Period.
|
|
849
|
+
if (this.selectedRadio == 'period' ||
|
|
850
|
+
this.selectedRadio == 'buyerFlightDates' ||
|
|
851
|
+
this.selectedRadio == 'trafficFlightDates') {
|
|
852
|
+
minMaxDate = this.createStartEndDateRange(optionData);
|
|
853
|
+
}
|
|
854
|
+
else {
|
|
855
|
+
minMaxDate = this.returnMinAndMaxDate(optionData, this.selectedRadio);
|
|
856
|
+
}
|
|
857
|
+
return minMaxDate;
|
|
858
|
+
}
|
|
859
|
+
createStartEndDateRange(optionData) {
|
|
860
|
+
let minStartDate = this.returnMinAndMaxDate(optionData, 'startDate');
|
|
861
|
+
let maxEndDate = this.returnMinAndMaxDate(optionData, 'endDate');
|
|
862
|
+
return [minStartDate[0], maxEndDate[1]];
|
|
863
|
+
}
|
|
864
|
+
getMinAndMaxDateRangeForCalendar(minMaxDate, parsingFormat) {
|
|
865
|
+
let calendarMinEnabledDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
|
|
866
|
+
let calendarMaxEnabledDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
|
|
867
|
+
return [calendarMinEnabledDate, calendarMaxEnabledDate];
|
|
868
|
+
}
|
|
869
|
+
getSelectedDateForCalendar(minMaxDate, parsingFormat, minDate, maxDate) {
|
|
870
|
+
let selectedMinDate;
|
|
871
|
+
let selectedMaxDate;
|
|
872
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
873
|
+
let selectedDateObj = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
874
|
+
if (selectedDateObj.fromDate.isAfter(minMaxDate[0])) {
|
|
875
|
+
selectedMinDate = this.dateTimeFormatService.convertToNgbDate(selectedDateObj.fromDate, parsingFormat);
|
|
876
|
+
}
|
|
877
|
+
else {
|
|
878
|
+
selectedMinDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[0], parsingFormat);
|
|
879
|
+
}
|
|
880
|
+
if (selectedDateObj.toDate.isAfter(minMaxDate[1])) {
|
|
881
|
+
selectedMaxDate = this.dateTimeFormatService.convertToNgbDate(minMaxDate[1], parsingFormat);
|
|
882
|
+
}
|
|
883
|
+
else {
|
|
884
|
+
selectedMaxDate = this.dateTimeFormatService.convertToNgbDate(selectedDateObj.toDate, parsingFormat);
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
else {
|
|
888
|
+
selectedMinDate = cloneDeep(minDate);
|
|
889
|
+
selectedMaxDate = cloneDeep(maxDate);
|
|
890
|
+
}
|
|
891
|
+
return [selectedMinDate, selectedMaxDate];
|
|
892
|
+
}
|
|
893
|
+
getPreviousSelectedDatesForCalendar(optionData) {
|
|
894
|
+
let previousSelectedDate = { fromDate: null, toDate: null };
|
|
895
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
896
|
+
previousSelectedDate = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
897
|
+
if (!this.initialValueMap.has(this.selectedRadio)) {
|
|
898
|
+
this.setInitialValueMapForDateFilter(optionData);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
else if (this.initialValueMap.has(this.selectedRadio)) {
|
|
902
|
+
previousSelectedDate = this.initialValueMap.get(this.selectedRadio);
|
|
903
|
+
}
|
|
904
|
+
else {
|
|
905
|
+
this.setInitialValueMapForDateFilter(optionData);
|
|
906
|
+
previousSelectedDate = this.initialValueMap.get(this.selectedRadio);
|
|
907
|
+
}
|
|
908
|
+
return previousSelectedDate;
|
|
909
|
+
}
|
|
910
|
+
setInitialValueMapForDateFilter(optionData) {
|
|
911
|
+
let minMaxDate = this.createRangeForTheDateFilter(optionData);
|
|
912
|
+
let selectedDate = { fromDate: minMaxDate[0], toDate: minMaxDate[1] };
|
|
913
|
+
this.initialValueMap.set(this.selectedRadio, selectedDate);
|
|
914
|
+
}
|
|
915
|
+
getCurrentSelectedDatesForCalendar(currentSelectedDate, minDate, maxDate) {
|
|
916
|
+
let fromDate = {
|
|
917
|
+
year: currentSelectedDate.fromDate.year,
|
|
918
|
+
month: currentSelectedDate.fromDate.month,
|
|
919
|
+
day: currentSelectedDate.fromDate.day,
|
|
920
|
+
};
|
|
921
|
+
let toDate = {
|
|
922
|
+
year: currentSelectedDate.toDate.year,
|
|
923
|
+
month: currentSelectedDate.toDate.month,
|
|
924
|
+
day: currentSelectedDate.toDate.day,
|
|
925
|
+
};
|
|
926
|
+
if (isEqual(minDate, fromDate) && isEqual(maxDate, toDate) && this.initialValueMap.has(this.selectedRadio)) {
|
|
927
|
+
currentSelectedDate = this.initialValueMap.get(this.selectedRadio);
|
|
928
|
+
}
|
|
929
|
+
else {
|
|
930
|
+
currentSelectedDate.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(currentSelectedDate.fromDate));
|
|
931
|
+
currentSelectedDate.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(currentSelectedDate.toDate));
|
|
932
|
+
}
|
|
933
|
+
return currentSelectedDate;
|
|
934
|
+
}
|
|
935
|
+
//==================================================================SLIDER===========================================================//
|
|
936
|
+
getSliderTranslateFuncVal(header, currencySet) {
|
|
937
|
+
let translateFunc;
|
|
938
|
+
if (currencySet.has(header)) {
|
|
939
|
+
translateFunc = 'currency';
|
|
940
|
+
}
|
|
941
|
+
else if (header == 'postedAudPercent' || header == 'parentRowShares' || header == 'parentRowPutPercent') {
|
|
942
|
+
translateFunc = 'percent';
|
|
943
|
+
}
|
|
944
|
+
else {
|
|
945
|
+
translateFunc = 'normal';
|
|
946
|
+
}
|
|
947
|
+
return translateFunc;
|
|
948
|
+
}
|
|
949
|
+
getSliderOptions(optionsData, translateFunc, header) {
|
|
950
|
+
let minValue = this.returnMaxAndMinValue(optionsData, header, true);
|
|
951
|
+
let maxValue = this.returnMaxAndMinValue(optionsData, header, false);
|
|
952
|
+
let obj = this.setOptionValues(minValue, maxValue);
|
|
953
|
+
if (translateFunc === 'normal') {
|
|
954
|
+
obj.translate = this.normalTranslateFunction;
|
|
955
|
+
}
|
|
956
|
+
else if (translateFunc === 'percent') {
|
|
957
|
+
obj.translate = this.percentTranslateFunction;
|
|
958
|
+
}
|
|
959
|
+
else if (translateFunc === 'currency') {
|
|
960
|
+
obj.translate = this.currencyTranslateFunction;
|
|
961
|
+
}
|
|
962
|
+
return obj;
|
|
963
|
+
}
|
|
964
|
+
setSelectedRangeForSlider(header, options) {
|
|
965
|
+
let sliderMinValue;
|
|
966
|
+
let sliderMaxValue;
|
|
967
|
+
if (this.tooltipSelectedMap.has(header)) {
|
|
968
|
+
let selectedObj = this.tooltipSelectedMap.get(header);
|
|
969
|
+
sliderMinValue = selectedObj.min < options.floor ? options.floor : selectedObj.min;
|
|
970
|
+
sliderMaxValue = selectedObj.max < options.ceil ? selectedObj.max : options.ceil;
|
|
971
|
+
}
|
|
972
|
+
else {
|
|
973
|
+
sliderMinValue = options.floor;
|
|
974
|
+
sliderMaxValue = options.ceil;
|
|
975
|
+
}
|
|
976
|
+
return [sliderMinValue, sliderMaxValue];
|
|
977
|
+
}
|
|
978
|
+
isValueInRange(options, val) {
|
|
979
|
+
return options.floor <= val && val <= options.ceil;
|
|
980
|
+
}
|
|
981
|
+
getPreviousSelectedValueForSlider(clonedData) {
|
|
982
|
+
let previousSliderData = { min: '', max: '' };
|
|
983
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
984
|
+
previousSliderData = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
985
|
+
if (!this.initialValueMap.has(this.selectedRadio)) {
|
|
986
|
+
this.setInitialValueMapForSliderFilter(clonedData);
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
else if (this.initialValueMap.has(this.selectedRadio)) {
|
|
990
|
+
previousSliderData = this.initialValueMap.get(this.selectedRadio);
|
|
991
|
+
}
|
|
992
|
+
else {
|
|
993
|
+
this.setInitialValueMapForSliderFilter(clonedData);
|
|
994
|
+
previousSliderData = this.initialValueMap.get(this.selectedRadio);
|
|
995
|
+
}
|
|
996
|
+
return previousSliderData;
|
|
997
|
+
}
|
|
998
|
+
setInitialValueMapForSliderFilter(clonedData) {
|
|
999
|
+
let minValue = this.returnMaxAndMinValue(clonedData, this.selectedRadio, true);
|
|
1000
|
+
let maxValue = this.returnMaxAndMinValue(clonedData, this.selectedRadio, false);
|
|
1001
|
+
let sliderData = { min: minValue, max: maxValue };
|
|
1002
|
+
this.initialValueMap.set(this.selectedRadio, sliderData);
|
|
1003
|
+
}
|
|
1004
|
+
getCurrentSelectedValueForSlider(minEnteredVal, maxEnteredVal, options) {
|
|
1005
|
+
let currentSliderData = { min: null, max: null };
|
|
1006
|
+
currentSliderData.max = maxEnteredVal;
|
|
1007
|
+
currentSliderData.min = minEnteredVal;
|
|
1008
|
+
if (currentSliderData.min == options.floor &&
|
|
1009
|
+
currentSliderData.max == options.ceil &&
|
|
1010
|
+
this.initialValueMap.has(this.selectedRadio)) {
|
|
1011
|
+
currentSliderData = this.initialValueMap.get(this.selectedRadio);
|
|
1012
|
+
}
|
|
1013
|
+
return currentSliderData;
|
|
1014
|
+
}
|
|
1015
|
+
//==============================================================TIME====================================================================//
|
|
1016
|
+
getSelectedTimeRange(header, clonedData) {
|
|
1017
|
+
let selectedFromTime;
|
|
1018
|
+
let selectedToTime;
|
|
1019
|
+
if (this.tooltipSelectedMap.has(header)) {
|
|
1020
|
+
selectedFromTime = this.tooltipSelectedMap.get(header).fromTime;
|
|
1021
|
+
selectedToTime = this.tooltipSelectedMap.get(header).toTime;
|
|
1022
|
+
}
|
|
1023
|
+
else {
|
|
1024
|
+
this.setInitialValueMapForTimeFilter(clonedData, header);
|
|
1025
|
+
selectedFromTime = this.initialValueMap.get(header).fromTime;
|
|
1026
|
+
selectedToTime = this.initialValueMap.get(header).toTime;
|
|
1027
|
+
}
|
|
1028
|
+
if (selectedFromTime != undefined || selectedToTime != undefined) {
|
|
1029
|
+
selectedFromTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedFromTime, true);
|
|
1030
|
+
selectedToTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedToTime, true);
|
|
1031
|
+
}
|
|
1032
|
+
else {
|
|
1033
|
+
selectedFromTime = ['-', '-', '-'];
|
|
1034
|
+
selectedToTime = ['-', '-', '-'];
|
|
1035
|
+
}
|
|
1036
|
+
return [selectedFromTime, selectedToTime];
|
|
1037
|
+
}
|
|
1038
|
+
setInitialValueMapForTimeFilter(clonedData, key) {
|
|
1039
|
+
if (key == 'startEndTime' || key == 'TimeBand') {
|
|
1040
|
+
this.setInitialValueForStartAndEndTimeRange(clonedData, key);
|
|
1041
|
+
}
|
|
1042
|
+
else {
|
|
1043
|
+
this.setInitialValueForStartOrEndTimeRange(clonedData, key);
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
//use for filter where we have start and end time range in one filter
|
|
1047
|
+
//startEndTime: ["6 - 7A", "06: 00 : 00" , "07:00:00"]
|
|
1048
|
+
setInitialValueForStartAndEndTimeRange(clonedData, key) {
|
|
1049
|
+
let includeMulti = clonedData.findIndex((obj) => obj[key][0] == '<multi>') != -1;
|
|
1050
|
+
let includeZero = clonedData.findIndex((obj) => obj[key][0] == '0') != -1;
|
|
1051
|
+
let includeTimeRange = clonedData.findIndex((obj) => obj[key][0] != '0' && obj[key][0] != '<multi>') != -1;
|
|
1052
|
+
let filteredStartTime = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj['startTime']));
|
|
1053
|
+
let filteredEndTime = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj['endTime']));
|
|
1054
|
+
let startTimeArr = map(filteredStartTime, 'startTime');
|
|
1055
|
+
let endTimeArr = map(filteredEndTime, 'endTime');
|
|
1056
|
+
startTimeArr.sort((a, b) => {
|
|
1057
|
+
return this.dateTimeFormatService.sortByTimeAscending(a, b);
|
|
1058
|
+
});
|
|
1059
|
+
endTimeArr.sort((a, b) => {
|
|
1060
|
+
return this.dateTimeFormatService.sortByTimeDescending(a, b);
|
|
1061
|
+
});
|
|
1062
|
+
let obj = {
|
|
1063
|
+
fromTime: startTimeArr[0],
|
|
1064
|
+
toTime: endTimeArr[0],
|
|
1065
|
+
includeMulti: includeMulti,
|
|
1066
|
+
includeZero: includeZero,
|
|
1067
|
+
includeTimeRange: includeTimeRange,
|
|
1068
|
+
};
|
|
1069
|
+
this.initialValueMap.set(key, obj);
|
|
1070
|
+
}
|
|
1071
|
+
//use for the filters where we have different filter for start and end time
|
|
1072
|
+
//startTime: "06:00:00"
|
|
1073
|
+
setInitialValueForStartOrEndTimeRange(clonedData, key) {
|
|
1074
|
+
let includeMulti = clonedData.findIndex((obj) => obj[key] == '<multi>') != -1;
|
|
1075
|
+
let includeZero = clonedData.findIndex((obj) => obj[key] == '0') != -1;
|
|
1076
|
+
let includeTimeRange = clonedData.findIndex((obj) => obj[key] != '0' && obj[key] != '<multi>') != -1;
|
|
1077
|
+
let data = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj[key]));
|
|
1078
|
+
let timeArr = map(data, key);
|
|
1079
|
+
timeArr.sort((a, b) => {
|
|
1080
|
+
return this.dateTimeFormatService.sortByTimeAscending(a, b);
|
|
1081
|
+
});
|
|
1082
|
+
let obj = {
|
|
1083
|
+
fromTime: timeArr[0],
|
|
1084
|
+
toTime: timeArr[timeArr.length - 1],
|
|
1085
|
+
includeMulti: includeMulti,
|
|
1086
|
+
includeZero: includeZero,
|
|
1087
|
+
includeTimeRange: includeTimeRange,
|
|
1088
|
+
};
|
|
1089
|
+
this.initialValueMap.set(key, obj);
|
|
1090
|
+
}
|
|
1091
|
+
selectUnselectTimeFilterCheckbox(key, optionsData) {
|
|
1092
|
+
let showMultiTimeCheckbox = false;
|
|
1093
|
+
let showZeroTimeCheckbox = false;
|
|
1094
|
+
let showEnterTimeCheckbox = false;
|
|
1095
|
+
let multiTimeCheckboxChecked = false;
|
|
1096
|
+
let zeroTimeCheckboxChecked = false;
|
|
1097
|
+
let enterTimeCheckboxChecked = false;
|
|
1098
|
+
let selectedTimeObj;
|
|
1099
|
+
if (this.tooltipSelectedMap.has(key)) {
|
|
1100
|
+
selectedTimeObj = this.tooltipSelectedMap.get(key);
|
|
1101
|
+
}
|
|
1102
|
+
else {
|
|
1103
|
+
selectedTimeObj = this.initialValueMap.get(key);
|
|
1104
|
+
}
|
|
1105
|
+
let timeArr;
|
|
1106
|
+
if (key == 'startEndTime' || key == 'TimeBand') {
|
|
1107
|
+
timeArr = optionsData.map((item) => item[key][0]);
|
|
1108
|
+
}
|
|
1109
|
+
else {
|
|
1110
|
+
timeArr = optionsData.map((item) => item[key]);
|
|
1111
|
+
}
|
|
1112
|
+
if (timeArr.findIndex((val) => val == '0') != -1) {
|
|
1113
|
+
showZeroTimeCheckbox = true;
|
|
1114
|
+
zeroTimeCheckboxChecked = selectedTimeObj.includeZero;
|
|
1115
|
+
}
|
|
1116
|
+
if (timeArr.findIndex((val) => val == '<multi>') != -1) {
|
|
1117
|
+
showMultiTimeCheckbox = true;
|
|
1118
|
+
multiTimeCheckboxChecked = selectedTimeObj.includeMulti;
|
|
1119
|
+
}
|
|
1120
|
+
if (showZeroTimeCheckbox || showMultiTimeCheckbox) {
|
|
1121
|
+
showEnterTimeCheckbox = true;
|
|
1122
|
+
}
|
|
1123
|
+
if (timeArr.findIndex((val) => val != '<multi>' && val != '0') != -1) {
|
|
1124
|
+
enterTimeCheckboxChecked = selectedTimeObj?.includeTimeRange;
|
|
1125
|
+
}
|
|
1126
|
+
return {
|
|
1127
|
+
showMultiTimeCheckbox: showMultiTimeCheckbox,
|
|
1128
|
+
showZeroTimeCheckbox: showZeroTimeCheckbox,
|
|
1129
|
+
showEnterTimeCheckbox: showEnterTimeCheckbox,
|
|
1130
|
+
multiTimeCheckboxChecked: multiTimeCheckboxChecked,
|
|
1131
|
+
zeroTimeCheckboxChecked: zeroTimeCheckboxChecked,
|
|
1132
|
+
enterTimeCheckboxChecked: enterTimeCheckboxChecked,
|
|
1133
|
+
};
|
|
1134
|
+
}
|
|
1135
|
+
checkIfStartTimeIsAfterEndTime(startTime, endTime) {
|
|
1136
|
+
let timeFormat = 'HH:mm:ss';
|
|
1137
|
+
let startTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(startTime[0] + ':' + startTime[1] + ' ' + startTime[2], true);
|
|
1138
|
+
let startTime24HrFormat = startTime24HrFormatArr[0] + ':' + startTime24HrFormatArr[1] + ':00';
|
|
1139
|
+
let endTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(endTime[0] + ':' + endTime[1] + ' ' + endTime[2], true);
|
|
1140
|
+
let endTime24HrFormat = endTime24HrFormatArr[0] + ':' + endTime24HrFormatArr[1] + ':00';
|
|
1141
|
+
return dayjs(startTime24HrFormat, timeFormat).isAfter(dayjs(endTime24HrFormat, timeFormat));
|
|
1142
|
+
}
|
|
1143
|
+
getPreviousSelectedTimeFilter() {
|
|
1144
|
+
let previousSelectedTimeFilter;
|
|
1145
|
+
if (this.tooltipSelectedMap.has(this.selectedRadio)) {
|
|
1146
|
+
previousSelectedTimeFilter = this.tooltipSelectedMap.get(this.selectedRadio);
|
|
1147
|
+
}
|
|
1148
|
+
else if (this.initialValueMap.has(this.selectedRadio)) {
|
|
1149
|
+
previousSelectedTimeFilter = this.initialValueMap.get(this.selectedRadio);
|
|
1150
|
+
}
|
|
1151
|
+
return previousSelectedTimeFilter;
|
|
1152
|
+
}
|
|
1153
|
+
getCurrentSelectedTimeFilter(startTime, endTime, includeMulti, includeZero, includeTimeRange) {
|
|
1154
|
+
let currentSelectedTimeFilter;
|
|
1155
|
+
let fromTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(startTime[0] + ':' + startTime[1] + ' ' + startTime[2], true);
|
|
1156
|
+
let fromTime24HrFormat = fromTime24HrFormatArr[0] + ':' + fromTime24HrFormatArr[1] + ':00';
|
|
1157
|
+
let toTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(endTime[0] + ':' + endTime[1] + ' ' + endTime[2], true);
|
|
1158
|
+
let toTime24HrFormat = toTime24HrFormatArr[0] + ':' + toTime24HrFormatArr[1] + ':00';
|
|
1159
|
+
currentSelectedTimeFilter = {
|
|
1160
|
+
fromTime: fromTime24HrFormat,
|
|
1161
|
+
toTime: toTime24HrFormat,
|
|
1162
|
+
includeMulti: includeMulti,
|
|
1163
|
+
includeZero: includeZero,
|
|
1164
|
+
includeTimeRange: includeTimeRange,
|
|
1165
|
+
};
|
|
1166
|
+
return currentSelectedTimeFilter;
|
|
1167
|
+
}
|
|
1168
|
+
incrementHourInput(arr) {
|
|
1169
|
+
if (arr[0] == '') {
|
|
1170
|
+
arr[0] = 1;
|
|
1171
|
+
}
|
|
1172
|
+
else if (parseInt(arr[0]) < 12) {
|
|
1173
|
+
arr[0] = parseInt(arr[0]) + 1;
|
|
1174
|
+
}
|
|
1175
|
+
else {
|
|
1176
|
+
arr[0] = 1;
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
decrementHourInput(arr) {
|
|
1180
|
+
if (arr[0] == '') {
|
|
1181
|
+
arr[0] = 12;
|
|
1182
|
+
}
|
|
1183
|
+
else if (parseInt(arr[0]) > 1) {
|
|
1184
|
+
arr[0] = parseInt(arr[0]) - 1;
|
|
1185
|
+
}
|
|
1186
|
+
else {
|
|
1187
|
+
arr[0] = 12;
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
incrementMinuteInput(arr) {
|
|
1191
|
+
// increment to nearest proper interval(15,30,45)
|
|
1192
|
+
let min = parseInt(arr[1]);
|
|
1193
|
+
if (min <= 14) {
|
|
1194
|
+
arr[1] = '15';
|
|
1195
|
+
}
|
|
1196
|
+
else if (min >= 15 && min <= 29) {
|
|
1197
|
+
arr[1] = '30';
|
|
1198
|
+
}
|
|
1199
|
+
else if (min >= 30 && min <= 44) {
|
|
1200
|
+
arr[1] = '45';
|
|
1201
|
+
}
|
|
1202
|
+
else if (min >= 45) {
|
|
1203
|
+
arr[1] = '00';
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1206
|
+
decrementMinuteInput(arr) {
|
|
1207
|
+
let min = parseInt(arr[1]);
|
|
1208
|
+
if (min > 0 && min <= 15) {
|
|
1209
|
+
arr[1] = '00';
|
|
1210
|
+
}
|
|
1211
|
+
else if (min >= 16 && min <= 30) {
|
|
1212
|
+
arr[1] = '15';
|
|
1213
|
+
}
|
|
1214
|
+
else if (min >= 31 && min <= 45) {
|
|
1215
|
+
arr[1] = '30';
|
|
1216
|
+
}
|
|
1217
|
+
else if (min > 45 || min == 0) {
|
|
1218
|
+
arr[1] = '45';
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
incrementOrDecrementHour(increment, time) {
|
|
1222
|
+
if (increment) {
|
|
1223
|
+
this.incrementHourInput(time);
|
|
1224
|
+
}
|
|
1225
|
+
else {
|
|
1226
|
+
this.decrementHourInput(time);
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
incrementOrDecrementMin(increment, time) {
|
|
1230
|
+
if (increment) {
|
|
1231
|
+
this.incrementMinuteInput(time);
|
|
1232
|
+
}
|
|
1233
|
+
else {
|
|
1234
|
+
this.decrementMinuteInput(time);
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
isHourValueInvalid(hr) {
|
|
1238
|
+
return hr.length == 0 || !+hr || 1 > parseInt(hr) || parseInt(hr) > 12 || hr.includes('.');
|
|
1239
|
+
}
|
|
1240
|
+
isMinuteValueInvalid(min) {
|
|
1241
|
+
return (min.length != 2 || (!+min && min != '00') || 0 > parseInt(min) || parseInt(min) > 59 || min.includes('.'));
|
|
1242
|
+
}
|
|
1243
|
+
//=============================================================SORT======================================================================//
|
|
1244
|
+
updateSortMap(tempSortOrder, tableData, isLurAndCsrComponent) {
|
|
1245
|
+
this.annaSortService.columnSortState = new Map();
|
|
1246
|
+
this.annaSortService.columnSortState.set(this.selectedRadio, tempSortOrder);
|
|
1247
|
+
let sortedTableData = this.annaSortService.applySorting(this.selectedRadio, tempSortOrder, tableData, isLurAndCsrComponent);
|
|
1248
|
+
return sortedTableData;
|
|
1249
|
+
}
|
|
1250
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }, { token: i2.AnnaSortService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1251
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, providedIn: 'root' }); }
|
|
1252
|
+
}
|
|
1253
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, decorators: [{
|
|
1254
|
+
type: Injectable,
|
|
1255
|
+
args: [{
|
|
1256
|
+
providedIn: 'root',
|
|
1257
|
+
}]
|
|
1258
|
+
}], ctorParameters: function () { return [{ type: i1.AnnaDateTimeFormatService }, { type: i2.AnnaSortService }]; } });
|
|
1259
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLE1BQU0sTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQVksWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFbkUsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFLNUQsTUFBTSxPQUFPLGlCQUFpQjthQXNDWixlQUFVLEdBQUcsRUFBRSxBQUFMLENBQU07SUFJOUIsWUFDWSxxQkFBZ0QsRUFDaEQsZUFBZ0M7UUFEaEMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUEyQjtRQUNoRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUEzQzVDLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFjL0Isd0JB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RSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqRixJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUzRyxJQUFJLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEgsSUFBSSxlQUFlLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1RyxJQUFJLFlBQVksR0FBRyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdkQsSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVqRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMs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QUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FDNUcsQ0FBQztJQUNOLENBQUM7SUFFRCwySUFBMkk7SUFDM0ksYUFBYSxDQUFDLGFBQXVCLEVBQUUsU0FBZ0IsRUFBRSxvQkFBNkI7UUFDbEYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM1RSxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FDbkQsSUFBSSxDQUFDLGFBQWEsRUFDbEIsYUFBYSxFQUNiLFNBQVMsRUFDVCxvQkFBb0IsQ0FDdkIsQ0FBQztRQUNGLE9BQU8sZUFBZSxDQUFDO0lBQzNCLENBQUM7K0dBcDdDUSxpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZkLE1BQU07OzRGQUVULGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyIGltcG9ydCBzdGF0ZW1lbnRzXG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXItc2xpZGVyL25neC1zbGlkZXInO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vLyBUaGlyZCBwYXJ0eSBpbXBvcnQgc3RhdGVtZW50c1xuaW1wb3J0IHsgbWluLCBtYXgsIG1hcCwgc29ydEJ5LCB1bmlxLCBjbG9uZURlZXAsIGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCBDdXN0b21QYXJzZUZvcm1hdCBmcm9tICdkYXlqcy9wbHVnaW4vY3VzdG9tUGFyc2VGb3JtYXQnO1xuaW1wb3J0IG1pbk1heCBmcm9tICdkYXlqcy9wbHVnaW4vbWluTWF4JztcbmltcG9ydCBpc0JldHdlZW4gZnJvbSAnZGF5anMvcGx1Z2luL2lzQmV0d2Vlbic7XG5pbXBvcnQgeyBTb3J0VHlwZSwgU29ydFR5cGVFbnVtIH0gZnJvbSAnLi4vbW9kZWxzL2FubmEtc29ydC5tb2RlbCc7XG5cbi8vIFVzZXIgZGVmaW5lZCBpbXBvcnQgc3RhdGVtZW50c1xuaW1wb3J0IHsgQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSwgTmdiRGF0ZVR5cGUgfSBmcm9tICcuL2FubmEtZGF0ZS10aW1lLWZvcm1hdC5zZXJ2aWNlJztcbmltcG9ydCB7IEFubmFTb3J0U2VydmljZSB9IGZyb20gJy4vYW5uYS1zb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9vbHRpcE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2FubmEtdG9vbHRpcC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEFubmFGaWx0ZXJTZXJ2aWNlIHtcbiAgICB0b29sdGlwTWFwID0gbmV3IE1hcCgpO1xuICAgIHRvb2x0aXBTZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTtcbiAgICBpbml0aWFsVmFsdWVNYXA6IE1hcDxzdHJpbmcsIGFueT47XG4gICAgdHJhbnNsYXRlRnVuYzogc3RyaW5nO1xuICAgIHNlbGVjdGVkUmFkaW86IHN0cmluZztcbiAgICBzdWJSYWRpb0J1dHRvbjogc3RyaW5nO1xuXG4gICAgY2FsZW5kYXJTZXQ6IFNldDxzdHJpbmc+O1xuICAgIHNsaWRlclNldDogU2V0PHN0cmluZz47XG4gICAgdGltZVNldDogU2V0PHN0cmluZz47XG5cbiAgICBpbmNsdWRlTXVsdGlUaW1lOiBib29sZWFuO1xuICAgIGluY2x1ZGVaZXJvVGltZTogYm9vbGVhbjtcbiAgICBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFuO1xuXG4gICAgYXBwbGllZEZpbHRlcnNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICBmbGlnaHREYXRlUmFuZ2U6IHsgbWluU2VsZWN0ZWREYXRlOiBhbnk7IG1heFNlbGVjdGVkRGF0ZTogYW55IH07XG4gICAgc2xpZGVyRGF0YTogeyBtaW46IGFueTsgbWF4OiBhbnkgfTtcbiAgICBuZ3hTbGlkZXJPYmo6IE9wdGlvbnM7XG4gICAgc2xpZGVyQ3VycmVuY3lTZXQgPSBuZXcgU2V0KFtcbiAgICAgICAgJ2Jvb2tlZCcsXG4gICAgICAgICdjcHAnLFxuICAgICAgICAnY3BtJyxcbiAgICAgICAgJ3JjdlByZWVtcHQnLFxuICAgICAgICAnb3NQcmVlbXB0JyxcbiAgICAgICAgJ3Bvc3RlZEFkdScsXG4gICAgICAgICdzY2hlZHVsZWRBZHUnLFxuICAgICAgICAnYXVkaWVuY2VEZWZpY2l0JyxcbiAgICAgICAgJ1JhdGUnLFxuICAgICAgICAndXNlckFEVXMnLFxuICAgICAgICAnYnV5ZXJDaGFuZ2VzJyxcbiAgICAgICAgJ3VzZXJDaGFuZ2VzJyxcbiAgICAgICAgJ3VzZXJNRycsXG4gICAgICAgICd1ZFZhbHVlJyxcbiAgICAgICAgJ29kVmFsdWUnLFxuICAgIF0pO1xuXG4gICAgcHVibGljIHN0YXRpYyBidWZmZXJTaXplID0gMjA7XG4gICAgaXNGaWx0ZXJTb3J0QWN0aXZlOiBhbnkgPSB7fTtcbiAgICByZXNldEZpbHRlclNvcnRBY3RpdmVTdGF0dXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlOiBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFubmFTb3J0U2VydmljZTogQW5uYVNvcnRTZXJ2aWNlLFxuICAgICkge1xuICAgICAgICBkYXlqcy5leHRlbmQobWluTWF4KTtcbiAgICAgICAgZGF5anMuZXh0ZW5kKGlzQmV0d2Vlbik7XG4gICAgICAgIGRheWpzLmV4dGVuZChDdXN0b21QYXJzZUZvcm1hdCk7XG4gICAgICAgIGNvbnN0IHNsaWRlckFyciA9IFtcbiAgICAgICAgICAgICdyY3ZQcmVlbXB0JyxcbiAgICAgICAgICAgICdvc1ByZWVtcHQnLFxuICAgICAgICAgICAgJ3JjdlVuZGVyRGx5JyxcbiAgICAgICAgICAgICdwb3N0ZWRBdWRQZXJjZW50JyxcbiAgICAgICAgICAgICdib29rZWQnLFxuICAgICAgICAgICAgJ3Nwb3RzJyxcbiAgICAgICAgICAgICdncnAnLFxuICAgICAgICAgICAgJ2NwcCcsXG4gICAgICAgICAgICAnaW1wcycsXG4gICAgICAgICAgICAnY3BtJyxcbiAgICAgICAgICAgICdvc1VuZGVyRGx5JyxcbiAgICAgICAgICAgICd0b3RhbFdlZWtzJyxcbiAgICAgICAgICAgICdXZWVrTnVtYmVyJyxcbiAgICAgICAgICAgICdSYXRlJyxcbiAgICAgICAgICAgICdPcmRlcmVkUmF0aW5nc09ySW1wcmVzc2lvbnMnLFxuICAgICAgICAgICAgJ1Bvc3RlZFJhdGluZ3NPckltcHJlc3Npb25zJyxcbiAgICAgICAgICAgICxcbiAgICAgICAgICAgICdwb3N0ZWRBdWRQZXJjZW50JyxcbiAgICAgICAgICAgICdwb3N0ZWRBZHUnLFxuICAgICAgICAgICAgJ3NjaGVkdWxlZEFkdScsXG4gICAgICAgICAgICAnYXVkaWVuY2VEZWZpY2l0JyxcbiAgICAgICAgICAgICdvZmZlcmVkTUdzJyxcbiAgICAgICAgICAgICdvdXRzdGFuZGluZ1BFJyxcbiAgICAgICAgICAgICdvZmZlcmVkQURVcycsXG4gICAgICAgICAgICAndWREZWZpY2l0VmFsdWUnLFxuICAgICAgICAgICAgJ2Jvb2tlZFZhbHVlJyxcbiAgICAgICAgICAgICdib29rZWRTcG90cycsXG4gICAgICAgICAgICAndXNlckNoYW5nZXMnLFxuICAgICAgICAgICAgJ1VER3JwJyxcbiAgICAgICAgICAgICdVREltcHMnLFxuICAgICAgICAgICAgJ09ER3JwJyxcbiAgICAgICAgICAgICdPREltcHMnLFxuICAgICAgICAgICAgJ3VkSW1wc1BlcmNlbnQnLFxuICAgICAgICAgICAgJ3VkR3JwUGVyY2VudCcsXG4gICAgICAgICAgICAnb2RJbXBzUGVyY2VudCcsXG4gICAgICAgICAgICAnb2RHcnBQZXJjZW50JyxcbiAgICAgICAgICAgICd1c2VyQURVcycsXG4gICAgICAgICAgICAnYnV5ZXJDaGFuZ2VzJyxcbiAgICAgICAgICAgICd1c2VyQ2hhbmdlcycsXG4gICAgICAgICAgICAndXNlck1HJyxcbiAgICAgICAgICAgICdXZWVrbHlBVVInLFxuICAgICAgICAgICAgJ1dlZWtseUFVUmF0aW5nT3JJbXByZXNzaW9ucycsXG4gICAgICAgICAgICAnTUdzVmFsdWUnLFxuICAgICAgICAgICAgJ0FEVXNWYWx1ZScsXG4gICAgICAgICAgICAnVXNlckNyZWRpdGVkVmFsdWUnLFxuICAgICAgICAgICAgJ1VzZXJVbnJlc29sdmVkVmFsdWUnLFxuICAgICAgICAgICAgJ0J1eWVyQWRkZWRWYWx1ZScsXG4gICAgICAgICAgICAnQnV5ZXJEZWxldGVkVmFsdWUnLFxuICAgICAgICAgICAgJ0J1eWVyQ2hhbmdlc1ZhbHVlJyxcbiAgICAgICAgICAgICdVc2VyQ2hhbmdlc1ZhbHVlJyxcbiAgICAgICAgICAgICdCb29rZWRHUlBPcklNUFMnLFxuICAgICAgICAgICAgJ0Jvb2tlZENQUE9yQ1BNJyxcbiAgICAgICAgICAgICdCb29rZWRWYWx1ZScsXG4gICAgICAgICAgICAnQm9va2VkU3BvdHMnLFxuICAgICAgICAgICAgJ0Jvb2tlZFJhdGUnLFxuICAgICAgICAgICAgJ0Jvb2tlZFJURycsXG4gICAgICAgICAgICAnQm9va2VkSU1QUycsXG4gICAgICAgICAgICAnQVVSVEcnLFxuICAgICAgICAgICAgJ0FVUlRHJyxcbiAgICAgICAgICAgICdQb3N0ZWRSYXRpbmcnLFxuICAgICAgICAgICAgJ1Bvc3RlZEltcHJlc3Npb25zJyxcbiAgICAgICAgICAgICdOb3JtYWxpemVkT3JkZXJlZFJhdGluZycsXG4gICAgICAgICAgICAnTm9ybWFsaXplZE9yZGVyZWRJbXByZXNzaW9ucycsXG4gICAgICAgICAgICAnTm9ybWFsaXplZFBvc3RlZFJhdGluZycsXG4gICAgICAgICAgICAnTm9ybWFsaXplZFBvc3RlZEltcHJlc3Npb25zJyxcbiAgICAgICAgICAgICdCb29rZWRHUlAnLFxuICAgICAgICAgICAgJ0Jvb2tlZElNUFNSZXZUYWInLFxuICAgICAgICAgICAgJ0Jvb2tlZENQUCcsXG4gICAgICAgICAgICAnQm9va2VkQ1BNJyxcbiAgICAgICAgICAgICdBVUlNUFMnLFxuICAgICAgICAgICAgJ2Jvb2tlZEFtb3VudFZhbHVlJyxcbiAgICAgICAgICAgICdlcXVpdmFsaXplZEJvb2tlZEFtb3VudFZhbHVlJyxcbiAgICAgICAgICAgICdJTVBTJyxcbiAgICAgICAgICAgICd1ZFZhbHVlJyxcbiAgICAgICAgICAgICdvZFZhbHVlJyxcbiAgICAgICAgICAgICdWaW9sYXRlZEJvb2tlZFZhbHVlJyxcbiAgICAgICAgICAgICdWaW9sYXRlZEJvb2tlZEVVUlZhbHVlJyxcbiAgICAgICAgICAgICdWaW9sYXRpbmdCb29rZWRFVVJWYWx1ZScsXG4gICAgICAgICAgICAnVmlvbGF0aW5nQm9va2VkVmFsdWUnLFxuICAgICAgICAgICAgJ1JlYmF0ZScsXG4gICAgICAgICAgICAnT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlV2Vla2x5QVVSJyxcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUnRnJyxcbiAgICAgICAgICAgICdwYXJlbnRSb3dQb3N0ZWRSdGcnLFxuICAgICAgICAgICAgJ3BhcmVudFJvd1JvbGxpbmdBdmVyYWdlUnRnJyxcbiAgICAgICAgICAgICdwYXJlbnRSb3dTdGF0aW9uRXN0aW1hdGVzUnRnJyxcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzSW1wcycsXG4gICAgICAgICAgICAncGFyZW50Um93UG9zdGVkSW1wcycsXG4gICAgICAgICAgICAncGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VJbXBzJyxcbiAgICAgICAgICAgICdwYXJlbnRSb3dTdGF0aW9uRXN0aW1hdGVzSW1wcycsXG4gICAgICAgICAgICAncGFyZW50Um93QW5uYUVzdGltYXRlc1NoYXJlJyxcbiAgICAgICAgICAgICdwYXJlbnRSb3dQb3N0ZWRTaGFyZScsXG4gICAgICAgICAgICAncGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VTaGFyZScsXG4gICAgICAgICAgICAncGFyZW50Um93QW5uYUVzdGltYXRlc1B1dFBlcicsXG4gICAgICAgICAgICAncGFyZW50Um93UG9zdGVkUHV0UGVyJyxcbiAgICAgICAgICAgICdwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVB1dFBlcicsXG4gICAgICAgICAgICAncGFyZW50Um93QW5uYUVzdGltYXRlc1B1dCcsXG4gICAgICAgICAgICAncGFyZW50Um93UG9zdGVkUHV0JyxcbiAgICAgICAgICAgICdwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVB1dCcsXG4gICAgICAgICAgICAnUHJvamVjdGVkSW1wcmVzc2lvbnMnLFxuICAgICAgICAgICAgJ1Byb2plY3RlZFJ0ZycsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyQXJyID0gW1xuICAgICAgICAgICAgJ3BlcmlvZCcsXG4gICAgICAgICAgICAnQWlyRGF0ZScsXG4gICAgICAgICAgICAnZmxpZ2h0U3RhcnREYXRlJyxcbiAgICAgICAgICAgICdmbGlnaHRFbmREYXRlJyxcbiAgICAgICAgICAgICdkYXRlJyxcbiAgICAgICAgICAgICdzdGFydERhdGUnLFxuICAgICAgICAgICAgJ2VuZERhdGUnLFxuICAgICAgICAgICAgJ3JldmlzaW9uU3RhcnREYXRlJyxcbiAgICAgICAgICAgICdHZW5lcmF0ZWRPbicsXG4gICAgICAgICAgICAnV2VlaycsXG4gICAgICAgICAgICAndGltZW91dERhdGUnLFxuICAgICAgICAgICAgJ1Zpb2xhdGluZ1Nwb3REYXRlJyxcbiAgICAgICAgICAgICdWaW9sYXRlZFNwb3REYXRlJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgdGltZUFyciA9IFtcbiAgICAgICAgICAgICdTdGFydFRpbWVGb3JGaWx0ZXInLFxuICAgICAgICAgICAgJ0VuZFRpbWVGb3JGaWx0ZXInLFxuICAgICAgICAgICAgJ3RpbWUnLFxuICAgICAgICAgICAgJ3N0YXJ0VGltZUZvckZpbHRlcicsXG4gICAgICAgICAgICAnZW5kVGltZUZvckZpbHRlcicsXG4gICAgICAgICAgICAnc3RhcnRfdGltZV9mb3JfZmlsdGVyJyxcbiAgICAgICAgICAgICdlbmRfdGltZV9mb3JfZmlsdGVyJyxcbiAgICAgICAgICAgICdzdGFydEVuZFRpbWVNdWx0aScsXG4gICAgICAgICAgICAnc3RhcnRFbmRUaW1lJyxcbiAgICAgICAgICAgICd0aW1lb3V0VGltZScsXG4gICAgICAgICAgICAnT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lJyxcbiAgICAgICAgICAgICdPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVFbmRUaW1lJyxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5zbGlkZXJTZXQgPSBuZXcgU2V0KHNsaWRlckFycik7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXQgPSBuZXcgU2V0KGNhbGVuZGFyQXJyKTtcbiAgICAgICAgdGhpcy50aW1lU2V0ID0gbmV3IFNldCh0aW1lQXJyKTtcbiAgICB9XG5cbiAgICByZXR1cm5NYXhBbmRNaW5WYWx1ZShkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcsIGlzTWluOiBib29sZWFuKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhWycnLCAnLScsIG51bGxdLmluY2x1ZGVzKG9ialtrZXldKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGRhdGEubWFwKCh4KSA9PiB4W2tleV0pO1xuICAgICAgICBsZXQgdmFsdWVUb1JldHVybiA9IGlzTWluID8gbWluKHZhbHVlcykgOiBtYXgodmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlVG9SZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuTWluQW5kTWF4RGF0ZShkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcbiAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKChvYmopID0+ICFbJycsICctJywgbnVsbF0uaW5jbHVkZXMob2JqW2tleV0pKTtcbiAgICAgICAgbGV0IERhdGVBcnIgPSBkYXRhLm1hcCgob2JqKSA9PiBkYXlqcyhvYmpba2V5XSkpO1xuICAgICAgICBsZXQgbWluRGF0ZSA9IGRheWpzLm1pbihEYXRlQXJyKTtcbiAgICAgICAgbGV0IG1heERhdGUgPSBkYXlqcy5tYXgoRGF0ZUFycik7XG5cbiAgICAgICAgcmV0dXJuIFttaW5EYXRlLCBtYXhEYXRlXTtcbiAgICB9XG5cbiAgICBpc1Rvb2x0aXBBY3RpdmUoaGVhZGVyOiBzdHJpbmdbXSwgc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBzZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xuICAgICAgICBsZXQgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclswXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzBdKSAhPSBTb3J0VHlwZUVudW0uREVGQVVMVDtcbiAgICAgICAgbGV0IGlzU29ydE1hcEZvckhlYWRlcjFBY3RpdmUgPSBzb3J0TWFwLmhhcyhoZWFkZXJbMV0pICYmIHNvcnRNYXAuZ2V0KGhlYWRlclsxXSkgIT0gU29ydFR5cGVFbnVtLkRFRkFVTFQ7XG5cbiAgICAgICAgaWYgKGhlYWRlci5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIChzb3J0TWFwLnNpemUgPiAwICYmIGlzU29ydE1hcEZvckhlYWRlcjBBY3RpdmUpIHx8IHNldC5oYXMoaGVhZGVyWzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmhhcyhoZWFkZXJbMF0pICYmIGlzU29ydE1hcEZvckhlYWRlcjBBY3RpdmUpIHx8XG4gICAgICAgICAgICAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmhhcyhoZWFkZXJbMV0pICYmIGlzU29ydE1hcEZvckhlYWRlcjFBY3RpdmUpIHx8XG4gICAgICAgICAgICBzZXQuaGFzKGhlYWRlclswXSkgfHxcbiAgICAgICAgICAgIHNldC5oYXMoaGVhZGVyWzFdKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNsZWFyQ29sdW1uRmlsdGVyKCkge1xuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuICAgICAgICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xuICAgICAgICAgICAgYXBwbGllZEZpbHRlclNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSA9IFsuLi5hcHBsaWVkRmlsdGVyU2V0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmbG9vcjogbWluVmFsdWUsXG4gICAgICAgICAgICBjZWlsOiBtYXhWYWx1ZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgICAgdHJhbnNsYXRlOiB0aGlzLm5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgICBpZiAoTWF0aC5hYnMoZGF0YSkgPj0gMTAwMCkge1xuICAgICAgICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSAoTWF0aC5hYnMoZGF0YSkgLyAxMDAwKS50b0ZpeGVkKDEpICsgJ2slJztcbiAgICAgICAgICAgIHJldHVybiBpc05lZ1ZhbCA/ICctJyArIHZhbCA6IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xuICAgICAgICAgICAgbGV0IGlzV2hvbGVOdW0gPSBwYXJzZUludChkYXRhLnRvU3RyaW5nKCkpID09IGRhdGE7XG4gICAgICAgICAgICBsZXQgdmFsID0gaXNXaG9sZU51bSA/IE1hdGguYWJzKGRhdGEpLnRvU3RyaW5nKCkgOiBNYXRoLmFicyhkYXRhKS50b0ZpeGVkKDEpO1xuICAgICAgICAgICAgcmV0dXJuIGlzTmVnVmFsID8gJy0nICsgdmFsICsgJyUnIDogdmFsICsgJyUnO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGN1cnJlbmN5VHJhbnNsYXRlRnVuY3Rpb24gPSAoZGF0YTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGRhdGEpID49IDEwMDApIHtcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xuICAgICAgICAgICAgY29uc3QgdmFsID0gJyQnICsgKE1hdGguYWJzKGRhdGEpIC8gMTAwMCkudG9GaXhlZCgxKSArICdrJztcbiAgICAgICAgICAgIHJldHVybiBpc05lZ1ZhbCA/ICctJyArIHZhbCA6IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xuICAgICAgICAgICAgbGV0IGlzV2hvbGVOdW0gPSBwYXJzZUludChkYXRhLnRvU3RyaW5nKCkpID09IGRhdGE7XG4gICAgICAgICAgICBsZXQgdmFsID0gaXNXaG9sZU51bSA/IE1hdGguYWJzKGRhdGEpLnRvU3RyaW5nKCkgOiBNYXRoLmFicyhkYXRhKS50b0ZpeGVkKDEpO1xuICAgICAgICAgICAgcmV0dXJuIGlzTmVnVmFsID8gJy0kJyArIHZhbCA6ICckJyArIHZhbDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBub3JtYWxUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgICBpZiAoZGF0YSA+PSAxMDAwKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSAoZGF0YSAvIDEwMDApLnRvRml4ZWQoMSkgKyAnayc7XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgIT0gTWF0aC5mbG9vcihkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEudG9GaXhlZCgxKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfTtcblxuICAgIGZpbmRVbmlxdWVEYXRlc1dpdGhEYXRhKGRhdGE6IGFueVtdKSB7XG4gICAgICAgIGxldCB1bmlxdWVEYXRlcyA9IHVuaXEoZGF0YS5tYXAoKHUpID0+IHVbJ2RhdGUnXSkpO1xuICAgICAgICBsZXQgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ6IE5nYkRhdGVUeXBlW10gPSBbXTtcbiAgICAgICAgdW5pcXVlRGF0ZXMuZm9yRWFjaCgoZGF0ZTogYW55KSA9PiB7XG4gICAgICAgICAgICB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdC5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGVTdGFuZGFyZEZvcm1hdChkYXlqcyhkYXRlLCAnTU0vREQvWVknKS5mb3JtYXQoJ01NL0REL1lZWVknKSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0O1xuICAgIH1cblxuICAgIHJlT3JkZXJBcHBsaWVkRmlsdGVyc0FycmF5KGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcbiAgICAgICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xuICAgICAgICBpc0ZpbHRlcmVkID0gdGhpcy5jaGVja0lmRGF0YUlzRmlsdGVyZWQoaXNGaWx0ZXJlZCwgaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZCwgZGF0ZSk7XG4gICAgICAgIHRoaXMucmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkKTtcbiAgICB9XG5cbiAgICBjaGVja0lmRGF0YUlzRmlsdGVyZWQoaXNGaWx0ZXJlZDogYm9vbGVhbiwgaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZDogYm9vbGVhbiwgZGF0ZT86IGFueSkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09ICd1c2VyJyAmJiAhdGhpcy50b29sdGlwTWFwLmhhcygndXNlcicpKSB7XG4gICAgICAgICAgICBpc0ZpbHRlcmVkID0gY2xvbmVEZWVwKGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdTdGFydFRpbWVGb3JGaWx0ZXInIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ0VuZFRpbWVGb3JGaWx0ZXInIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3N0YXJ0VGltZUZvckZpbHRlcicgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnZW5kVGltZUZvckZpbHRlcicgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAndGltZScgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAndGltZW91dFRpbWUnIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ090aGVyQXZhaWxhYmxlU3BvdHNUYWJsZVN0YXJ0VGltZScgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlRW5kVGltZScgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnc3RhcnRfdGltZV9mb3JfZmlsdGVyJyB8fFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdlbmRfdGltZV9mb3JfZmlsdGVyJyB8fFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdzdGFydEVuZFRpbWVNdWx0aSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cbiAgICAgICAgICAgICAgICAhaXNFcXVhbChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxuICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHxcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlTXVsdGlUaW1lO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnc3RhcnRFbmRUaW1lJyB8fCB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ1RpbWVCYW5kJykge1xuICAgICAgICAgICAgaXNGaWx0ZXJlZCA9XG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcbiAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgIXRoaXMuaW5jbHVkZVplcm9UaW1lIHx8XG4gICAgICAgICAgICAgICAgIXRoaXMuaW5jbHVkZU11bHRpVGltZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNsaWRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xuICAgICAgICAgICAgaXNGaWx0ZXJlZCA9XG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcbiAgICAgICAgICAgICAgICApICYmICFpc0VxdWFsKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLnNsaWRlckRhdGEpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAncG9zdGVkQWR1JyAmJiB0aGlzLnN1YlJhZGlvQnV0dG9uID09ICdub3RSZXF1aXJlZCcpIHtcbiAgICAgICAgICAgICAgICBpc0ZpbHRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdzdGFydERhdGUnIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ2VuZERhdGUnIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3BlcmlvZCcgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnQWlyRGF0ZScgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAndGltZW91dERhdGUnIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09ICdmbGlnaHRTdGFydERhdGUnIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09ICdmbGlnaHRFbmREYXRlJyB8fFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdkYXRlJyB8fFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdyZXZpc2lvblN0YXJ0RGF0ZScgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnR2VuZXJhdGVkT24nIHx8XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ1dlZWsnXG4gICAgICAgICkge1xuICAgICAgICAgICAgaXNGaWx0ZXJlZCA9XG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcbiAgICAgICAgICAgICAgICApICYmICFpc0VxdWFsKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLCB0aGlzLmZsaWdodERhdGVSYW5nZSk7XG4gICAgICAgICAgICBpZiAoIWlzRmlsdGVyZWQgJiYgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0b3RhbE9wdGlvbnNDb3VudCA9IHRoaXMudG9vbHRpcE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKS5maWx0ZXIoKHg6IGFueSkgPT4gIXguaXNIaWRkZW4pLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnNDb3VudCA9IHRoaXMudG9vbHRpcE1hcFxuICAgICAgICAgICAgICAgIC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHg6IGFueSkgPT4gIXguaXNIaWRkZW4gJiYgeC5pc1NlbGVjdGVkKS5sZW5ndGg7XG4gICAgICAgICAgICBpc0ZpbHRlcmVkID0gc2VsZWN0ZWRPcHRpb25zQ291bnQgPiAwICYmIHNlbGVjdGVkT3B0aW9uc0NvdW50ICE9IHRvdGFsT3B0aW9uc0NvdW50ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0ZpbHRlcmVkO1xuICAgIH1cblxuICAgIHJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZDogYm9vbGVhbikge1xuICAgICAgICBsZXQgc2V0ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xuXG4gICAgICAgIGlmIChpc0ZpbHRlcmVkICYmICFzZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZpbHRlcmVkICYmIHNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xuICAgICAgICAgICAgc2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuICAgICAgICAgICAgc2V0LmFkZCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSA9IFsuLi5zZXRdO1xuICAgIH1cblxuICAgIGNoZWNrSWZTb3J0aW5nSXNBcHBsaWVkVGhlblNvcnRUaGVEYXRhKG9yaWdpbmFsRGF0YTogYW55W10pIHtcbiAgICAgICAgaWYgKCF0aGlzLmFubmFTb3J0U2VydmljZT8uY29sdW1uU29ydFN0YXRlKSByZXR1cm4gb3JpZ2luYWxEYXRhO1xuICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09ICdBU0MnKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxEYXRhID0gY2xvbmVEZWVwKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UodHJ1ZSwgb3JpZ2luYWxEYXRhLCBrZXkpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICdERVNDJykge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRGF0YSA9IGNsb25lRGVlcChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydERhdGFGb3JDb21wb25lbnRPdGhlclRoYW5MdXJBbmRDc3JQYWdlKGZhbHNlLCBvcmlnaW5hbERhdGEsIGtleSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxEYXRhO1xuICAgIH1cblxuICAgIGZpbHRlckRhdGEob3JpZ2luYWxEYXRhOiBhbnlbXSwga2V5VG9Ta2lwOiBzdHJpbmcsIGlzTHVyQ3NyUGFnZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBmaWx0ZXJlZERhdGEgPSBbLi4ub3JpZ2luYWxEYXRhXTtcbiAgICAgICAgaWYgKCFpc0x1ckNzclBhZ2UpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IHRoaXMuY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWRUaGVuU29ydFRoZURhdGEob3JpZ2luYWxEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9IGtleVRvU2tpcCAmJiBvcmlnaW5hbERhdGEubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhvcmlnaW5hbERhdGFbMF0pLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zbGlkZXJTZXQuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdzdGFydERhdGUnIHx8XG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ2VuZERhdGUnIHx8XG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ0FpckRhdGUnIHx8XG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ3RpbWVvdXREYXRlJyB8fFxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdmbGlnaHRTdGFydERhdGUnIHx8XG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ2ZsaWdodEVuZERhdGUnIHx8XG4gICAgICAgICAgICAgICAgICAgIGtleSA9PSAnZGF0ZScgfHxcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICdEYXRlJyB8fFxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ3JldmlzaW9uU3RhcnREYXRlJyB8fFxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ0dlbmVyYXRlZE9uJyB8fFxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdXZWVrJyB8fFxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdWaW9sYXRlZFNwb3REYXRlJyB8fFxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdWaW9sYXRpbmdTcG90RGF0ZSdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmlzT2JqZWN0SW5UaGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3BlcmlvZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmdldERhdGFJblRoZURhdGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdTdGFydFRpbWVGb3JGaWx0ZXInIHx8XG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ0VuZFRpbWVGb3JGaWx0ZXInIHx8XG4gICAgICAgICAgICAgICAgICAgIGtleSA9PSAndGltZW91dFRpbWUnIHx8XG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ3N0YXJ0VGltZUZvckZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnZW5kVGltZUZvckZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lJyB8fFxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ090aGVyQXZhaWxhYmxlU3BvdHNUYWJsZUVuZFRpbWUnIHx8XG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ3N0YXJ0X3RpbWVfZm9yX2ZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnZW5kX3RpbWVfZm9yX2ZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICd0aW1lJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvckZyb21BbmRUb1RpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3N0YXJ0RW5kVGltZU11bHRpJyB8fCBrZXkgPT0gJ3N0YXJ0RW5kVGltZScgfHwga2V5ID09PSAnVGltZUJhbmQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKHUpID0+IHZhbHVlLmluY2x1ZGVzKHVba2V5XSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZERhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuT3JkZXJzSW5UaGVSYW5nZShvcmRlcjogYW55LCByYW5nZTogYW55LCBrZXk6IGFueSkge1xuICAgICAgICBsZXQgaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgPSBkYXlqcyhvcmRlcltrZXldKS5pc0JldHdlZW4ocmFuZ2UubWluU2VsZWN0ZWREYXRlLCByYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xuICAgICAgICBsZXQgaXNEYXRlU2FtZUFzVGhlTWluU2VsZWN0ZWREYXRlID0gZGF5anMob3JkZXJba2V5XSkuaXNTYW1lKHJhbmdlLm1pblNlbGVjdGVkRGF0ZSk7XG4gICAgICAgIGxldCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGUgPSBkYXlqcyhvcmRlcltrZXldKS5pc1NhbWUocmFuZ2UubWF4U2VsZWN0ZWREYXRlKTtcbiAgICAgICAgcmV0dXJuIGlzRGF0ZUJldHdlZW5UaGVTZWxlY3RlZFJhbmdlIHx8IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSB8fCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuRGF0YUZvclRpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnkpIHtcbiAgICAgICAgbGV0IGZvcm1hdCA9ICdISDptbTpzcyc7XG4gICAgICAgIGxldCBzZWxlY3RlZFN0YXJ0RGF0ZSA9IGRheWpzKHNlbGVjdGVkRGF0YS5zdGFydFRpbWUsIGZvcm1hdCk7XG4gICAgICAgIGxldCBzZWxlY3RlZEVuZERhdGUgPSBkYXlqcyhzZWxlY3RlZERhdGEuZW5kVGltZSwgZm9ybWF0KTtcbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IGRheWpzKG9iai5zdGFydFRpbWUsIGZvcm1hdCk7XG4gICAgICAgIGxldCBlbmRUaW1lID0gZGF5anMob2JqLmVuZFRpbWUsIGZvcm1hdCk7XG5cbiAgICAgICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkU3RhcnREYXRlKTtcbiAgICAgICAgbGV0IGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lID0gc3RhcnRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZFN0YXJ0RGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcbiAgICAgICAgbGV0IGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSA9IGVuZFRpbWUuaXNTYW1lKHNlbGVjdGVkRW5kRGF0ZSk7XG4gICAgICAgIGxldCBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBlbmRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZFN0YXJ0RGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSkgfHxcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuRGF0YUZvckZyb21BbmRUb1RpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnksIGtleTogYW55KSB7XG4gICAgICAgIGxldCBmb3JtYXQgPSAnTU0vREQvWVlZWSBISDptbTpzcyc7XG4gICAgICAgIGxldCBzZWxlY3RlZEZyb21UaW1lID0gZGF5anMoJzAxLzAxLzIwMDEgJyArIHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcbiAgICAgICAgbGV0IHNlbGVjdGVkVG9UaW1lID0gZGF5anMoJzAxLzAxLzIwMDEgJyArIHNlbGVjdGVkRGF0YS50b1RpbWUsIGZvcm1hdCk7XG4gICAgICAgIGxldCBvYmpUaW1lID0gb2JqW2tleV07XG5cbiAgICAgICAgaWYgKFsnJywgJy0nLCBudWxsXS5pbmNsdWRlcyhvYmpUaW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09ICc8bXVsdGk+Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldID09ICc8bXVsdGk+Jykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT0gJzAnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlWmVybyAmJiBvYmpba2V5XSA9PSAnMCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGF5anNUaW1lID0gZGF5anMoJzAxLzAxLzIwMDEgJyArIG9ialRpbWUsIGZvcm1hdCk7XG5cbiAgICAgICAgbGV0IGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkRnJvbVRpbWUgPSBkYXlqc1RpbWUuaXNTYW1lKHNlbGVjdGVkRnJvbVRpbWUpO1xuICAgICAgICBsZXQgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRUb1RpbWUgPSBkYXlqc1RpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcbiAgICAgICAgbGV0IGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lID0gZGF5anNUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkRnJvbVRpbWUgfHxcbiAgICAgICAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkVG9UaW1lIHx8XG4gICAgICAgICAgICBpc09ialRpbWVCZXR3ZWVuU2VsZWN0ZWRGcm9tVGltZUFuZFRvVGltZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBmb3JtYXQgPSAnTU0vREQvWVlZWSBISDptbTpzcyc7XG4gICAgICAgIGxldCBzZWxlY3RlZEZyb21UaW1lID0gZGF5anMoJzAxLzAxLzIwMDEgJyArIHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcbiAgICAgICAgbGV0IHNlbGVjdGVkVG9UaW1lID0gZGF5anMoJzAxLzAxLzIwMDEgJyArIHNlbGVjdGVkRGF0YS50b1RpbWUsIGZvcm1hdCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRGF0YS5pbmNsdWRlTXVsdGkgJiYgb2JqW2tleV1bMF0gPT0gJzxtdWx0aT4nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XVswXSA9PSAnPG11bHRpPicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV1bMF0gPT0gJzAnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldWzBdID09ICcwJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVRpbWVSYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IGRheWpzKCcwMS8wMS8yMDAxICcgKyBvYmpba2V5XVsxXSwgZm9ybWF0KTtcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgb2JqW2tleV1bMl0sIGZvcm1hdCk7XG5cbiAgICAgICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkRnJvbVRpbWUpO1xuICAgICAgICBsZXQgaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBzdGFydFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcbiAgICAgICAgbGV0IGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSA9IGVuZFRpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcbiAgICAgICAgbGV0IGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IGVuZFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSkgfHxcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iajogYW55LCB2YWx1ZTogYW55LCBrZXk6IGFueSkge1xuICAgICAgICBsZXQgcGFyc2luZ0Zvcm1hdDogc3RyaW5nO1xuICAgICAgICBpZiAoa2V5ID09PSAncGVyaW9kJykge1xuICAgICAgICAgICAgcGFyc2luZ0Zvcm1hdCA9ICdZWVlZLU1NLUREJztcblxuICAgICAgICAgICAgbGV0IGRheWpzU3RhcnREYXRlID0gZGF5anMob2JqLnN0YXJ0RGF0ZSk7XG4gICAgICAgICAgICBsZXQgZGF5anNFbmREYXRlID0gZGF5anMob2JqLmVuZERhdGUpO1xuXG4gICAgICAgICAgICBsZXQgc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzU3RhcnREYXRlLmlzQmV0d2Vlbih2YWx1ZS5mcm9tRGF0ZSwgdmFsdWUudG9EYXRlKTtcbiAgICAgICAgICAgIGxldCBlbmREYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzRW5kRGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XG5cbiAgICAgICAgICAgIGxldCBzdGFydERhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSA9IHZhbHVlLmZyb21EYXRlLmlzU2FtZShkYXlqc1N0YXJ0RGF0ZSk7XG4gICAgICAgICAgICBsZXQgZW5kRGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUoZGF5anNFbmREYXRlKTtcblxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAoc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBzdGFydERhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSkgJiZcbiAgICAgICAgICAgICAgICAoZW5kRGF0ZUlzQmV0d2VlblNlbERhdGUgfHwgZW5kRGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBrZXkgPT09ICdBaXJEYXRlJyB8fFxuICAgICAgICAgICAga2V5ID09PSAnZmxpZ2h0U3RhcnREYXRlJyB8fFxuICAgICAgICAgICAga2V5ID09PSAnZmxpZ2h0RW5kRGF0ZScgfHxcbiAgICAgICAgICAgIGtleSA9PT0gJ1dlZWsnIHx8XG4gICAgICAgICAgICBrZXkgPT09ICd0aW1lb3V0RGF0ZSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBwYXJzaW5nRm9ybWF0ID0gJ01NL0REL1lZWVknO1xuICAgICAgICAgICAgbGV0IGRhdGVJc0JldHdlZW5TZWxEYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzQmV0d2VlbihcbiAgICAgICAgICAgICAgICB2YWx1ZS5taW5TZWxlY3RlZERhdGUsXG4gICAgICAgICAgICAgICAgdmFsdWUubWF4U2VsZWN0ZWREYXRlLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGV0IGRhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSA9IGRheWpzKG9ialtrZXldLCBwYXJzaW5nRm9ybWF0KS5pc1NhbWUodmFsdWUubWluU2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgIGxldCBkYXRlSXNTYW1lQXNTZWxFbmREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5tYXhTZWxlY3RlZERhdGUpO1xuXG4gICAgICAgICAgICByZXR1cm4gZGF0ZUlzQmV0d2VlblNlbERhdGUgfHwgZGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlIHx8IGRhdGVJc1NhbWVBc1NlbEVuZERhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdGlhbGl6ZVRpbWVGaWx0ZXJEYXRhKGNsb25lZERhdGE6IGFueVtdLCBrZXkgPSAnc3RhcnRFbmRUaW1lJykge1xuICAgICAgICBsZXQgc3RhcnRUaW1lQXJyID0gbWFwKGNsb25lZERhdGEsICdzdGFydFRpbWUnKTtcbiAgICAgICAgbGV0IGVuZFRpbWVBcnIgPSBtYXAoY2xvbmVkRGF0YSwgJ2VuZFRpbWUnKTtcblxuICAgICAgICBzdGFydFRpbWVBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBlbmRUaW1lQXJyLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZURlc2NlbmRpbmcoYSwgYik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBpbml0aWFsU3RhcnRFbmRUaW1lID0ge1xuICAgICAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWVBcnJbMF0sXG4gICAgICAgICAgICBlbmRUaW1lOiBlbmRUaW1lQXJyWzBdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBpbml0aWFsU3RhcnRFbmRUaW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm5Db2x1bW5GaWx0ZXJTdGF0dXMoZGF0YTogYW55W10sIGhlYWRlck5hbWU6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBpZiAoaGVhZGVyTmFtZSA9PSAnc3RhcnRFbmRUaW1lJykge1xuICAgICAgICAgICAgbGV0IHRpbWUgPSBkYXRhLm1hcCgodSkgPT4gdVtoZWFkZXJOYW1lXVswXSk7XG4gICAgICAgICAgICBsZXQgdW5pcVRpbWUgPSB1bmlxKHRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHVuaXFUaW1lLmxlbmd0aCA9PSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuaXEoZGF0YS5tYXAoKHUpID0+IHVbaGVhZGVyTmFtZV0pKS5sZW5ndGggPiAxID8gZmFsc2UgOiB0cnVlO1xuICAgIH1cblxuICAgIGdldEZpbHRlck9wdGlvbnNEYXRhKGRhdGE6IGFueVtdLCBjbG9uZWREYXRhOiBhbnlbXSwga2V5Pzogc3RyaW5nKSB7XG4gICAgICAgIGxldCBhcHBsaWVkRmlsdGVyU2V0ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xuICAgICAgICBrZXkgPSBrZXkgPyBrZXkgOiB0aGlzLnNlbGVjdGVkUmFkaW87XG4gICAgICAgIGlmIChhcHBsaWVkRmlsdGVyU2V0LmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJEYXRhKGNsb25lZERhdGEsIGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlT3JkZXJBcHBsaWVkRmlsdGVyc1N0YXRlKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGxldCBpc0ZpbHRlcmVkID0gdHJ1ZTtcbiAgICAgICAgaXNGaWx0ZXJlZCA9IHRoaXMuY2hlY2tJZkZpbHRlcklzQXBwbGllZChjbG9uZWREYXRhLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMucmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkKTtcbiAgICAgICAgcmV0dXJuIGlzRmlsdGVyZWQ7XG4gICAgfVxuXG4gICAgY2hlY2tJZkZpbHRlcklzQXBwbGllZChjbG9uZWREYXRhOiBhbnlbXSwgdmFsdWU6IGFueSkge1xuICAgICAgICBsZXQgaW5pdGlhbFZhbHVlT2ZDb2x1bW4gPSBzb3J0QnkoY2xvbmVkRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpO1xuICAgICAgICBsZXQgY3VycmVudFZhbHVlT2ZDb2x1bW4gPSBzb3J0QnkodGhpcy5hcHBseUZpbHRlcihjbG9uZWREYXRhLCB2YWx1ZSkubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKTtcbiAgICAgICAgcmV0dXJuICFpc0VxdWFsKGluaXRpYWxWYWx1ZU9mQ29sdW1uLCBjdXJyZW50VmFsdWVPZkNvbHVtbik7XG4gICAgfVxuXG4gICAgYXBwbHlGaWx0ZXIoZGF0YTogYW55W10sIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgbGV0IGZpbHRlcmVkRGF0YSA9IGRhdGE7XG4gICAgICAgIGxldCBrZXkgPSB0aGlzLnNlbGVjdGVkUmFkaW87XG4gICAgICAgIGlmICh0aGlzLnNsaWRlclNldC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGtleSA9PT0gJ3N0YXJ0RGF0ZScgfHxcbiAgICAgICAgICAgIGtleSA9PT0gJ2VuZERhdGUnIHx8XG4gICAgICAgICAgICBrZXkgPT09ICdBaXJEYXRlJyB8fFxuICAgICAgICAgICAga2V5ID09PSAndGltZW91dERhdGUnIHx8XG4gICAgICAgICAgICBrZXkgPT09ICdmbGlnaHRTdGFydERhdGUnIHx8XG4gICAgICAgICAgICBrZXkgPT09ICdmbGlnaHRFbmREYXRlJyB8fFxuICAgICAgICAgICAga2V5ID09ICdkYXRlJyB8fFxuICAgICAgICAgICAga2V5ID09ICdEYXRlJyB8fFxuICAgICAgICAgICAga2V5ID09ICdyZXZpc2lvblN0YXJ0RGF0ZScgfHxcbiAgICAgICAgICAgIGtleSA9PSAnR2VuZXJhdGVkT24nIHx8XG4gICAgICAgICAgICBrZXkgPT09ICdXZWVrJyB8fFxuICAgICAgICAgICAga2V5ID09PSAnVmlvbGF0ZWRTcG90RGF0ZScgfHxcbiAgICAgICAgICAgIGtleSA9PT0gJ1Zpb2xhdGluZ1Nwb3REYXRlJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5pc09iamVjdEluVGhlUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncGVyaW9kJykge1xuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmdldERhdGFJblRoZURhdGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGtleSA9PT0gJ1N0YXJ0VGltZUZvckZpbHRlcicgfHxcbiAgICAgICAgICAgIGtleSA9PT0gJ0VuZFRpbWVGb3JGaWx0ZXInIHx8XG4gICAgICAgICAgICBrZXkgPT0gJ3RpbWVvdXRUaW1lJyB8fFxuICAgICAgICAgICAga2V5ID09PSAnc3RhcnRUaW1lRm9yRmlsdGVyJyB8fFxuICAgICAgICAgICAga2V5ID09PSAnZW5kVGltZUZvckZpbHRlcicgfHxcbiAgICAgICAgICAgIGtleSA9PT0gJ3N0YXJ0X3RpbWVfZm9yX2ZpbHRlcicgfHxcbiAgICAgICAgICAgIGtleSA9PT0gJ2VuZF90aW1lX2Zvcl9maWx0ZXInIHx8XG4gICAgICAgICAgICBrZXkgPT0gJ3RpbWUnIHx8XG4gICAgICAgICAgICBrZXkgPT0gJ090aGVyQXZhaWxhYmxlU3BvdHNUYWJsZVN0YXJ0VGltZScgfHxcbiAgICAgICAgICAgIGtleSA9PSAnT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlRW5kVGltZSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvckZyb21BbmRUb1RpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdGFydEVuZFRpbWVNdWx0aScgfHwga2V5ID09ICdzdGFydEVuZFRpbWUnIHx8IGtleSA9PT0gJ1RpbWVCYW5kJykge1xuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKCh1KSA9PiB2YWx1ZS5pbmNsdWRlcyh1W2tleV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xuICAgIH1cblxuICAgIGlzT2JqZWN0SW5UaGVSYW5nZShvYmo6IGFueSwgdmFsdWU6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IG9ialZhbCA9IG9ialtrZXldO1xuICAgICAgICBsZXQgZGF5anNEYXRlID0gZGF5anMob2JqVmFsKTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mcm9tRGF0ZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlLnRvRGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlLmZyb21EYXRlID0gZGF5anMoXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZSh2YWx1ZS5mcm9tRGF0ZSwgJ0REL01NL1lZWVknKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHZhbHVlLnRvRGF0ZSA9IGRheWpzKFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUodmFsdWUudG9EYXRlLCAnREQvTU0vWVlZWScpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpc0RhdGVTYW1lQXNTdGFydE9mVGhlUmFuZ2UgPSB2YWx1ZS5mcm9tRGF0ZS5pc1NhbWUob2JqVmFsKTtcbiAgICAgICAgbGV0IGlzRGF0ZVNhbWVBc0VuZE9mVGhlUmFuZ2UgPSB2YWx1ZS50b0RhdGUuaXNTYW1lKG9ialZhbCk7XG4gICAgICAgIGxldCBpc0RhdGVCZXR3ZWVuVGhlU3RhcnRBbmRFbmRPZlJhbmdlID0gZGF5anNEYXRlLmlzQmV0d2Vlbih2YWx1ZS5mcm9tRGF0ZSwgdmFsdWUudG9EYXRlKTtcbiAgICAgICAgcmV0dXJuIGlzRGF0ZVNhbWVBc1N0YXJ0T2ZUaGVSYW5nZSB8fCBpc0RhdGVTYW1lQXNFbmRPZlRoZVJhbmdlIHx8IGlzRGF0ZUJldHdlZW5UaGVTdGFydEFuZEVuZE9mUmFuZ2U7XG4gICAgfVxuXG4gICAgdXBkYXRlU3RhdGVPZlRoZUN1cnJlbnRGaWx0ZXJUYWIoc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KSB7XG4gICAgICAgIGxldCBhY3RpdmVLZXkgPSB0aGlzLnNlbGVjdGVkUmFkaW87XG4gICAgICAgIGxldCBrZXlBcnI6IHN0cmluZ1tdID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoYWN0aXZlS2V5KSkge1xuICAgICAgICAgICAgICAgIGtleUFyciA9IGtleS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlW2tleV0gPSB0aGlzLmlzVG9vbHRpcEFjdGl2ZShrZXlBcnIsIHNvcnRNYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVTdGF0ZU9mQWxsVGhlS2V5cyhzb3J0TWFwOiBNYXA8c3RyaW5nLCBTb3J0VHlwZT4pIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5pc0ZpbHRlclNvcnRBY3RpdmUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgbGV0IGtleUFyciA9IGtleS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgdGhpcy5pc0ZpbHRlclNvcnRBY3RpdmVba2V5XSA9IHRoaXMuaXNUb29sdGlwQWN0aXZlKGtleUFyciwgc29ydE1hcCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluY3JlbWVudEhvdXIodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodmFsdWUgPT0gJycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gMTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludCh2YWx1ZSkgPCAxMikge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSkgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBkZWNyZW1lbnRIb3VyKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgaWYgKHZhbHVlID09ICcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IDEyO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KHZhbHVlKSA+IDEpIHtcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpIC0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gMTI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGluY3JlbWVudE1pbnV0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIC8vIGluY3JlbWVudCB0byBuZWFyZXN0IHByb3BlciBpbnRlcnZhbCgxNSwzMCw0NSlcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgaWYgKG1pbiA8PSAxNCkge1xuICAgICAgICAgICAgdmFsdWUgPSAnMTUnO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAxNSAmJiBtaW4gPD0gMjkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gJzMwJztcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMzAgJiYgbWluIDw9IDQ0KSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICc0NSc7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDQ1KSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICcwMCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGRlY3JlbWVudE1pbnV0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIGxldCBtaW4gPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgIGlmIChtaW4gPiAwICYmIG1pbiA8PSAxNSkge1xuICAgICAgICAgICAgdmFsdWUgPSAnMDAnO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAxNiAmJiBtaW4gPD0gMzApIHtcbiAgICAgICAgICAgIHZhbHVlID0gJzE1JztcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMzEgJiYgbWluIDw9IDQ1KSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICczMCc7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gNDUgfHwgbWluID09IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gJzQ1JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Q2hlY2tib3ggbWV0aG9kPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXG5cbiAgICBkaXNhYmxlQWN0aXZlRmlsdGVyQ2xlYXJCdXR0b24oKSB7XG4gICAgICAgIGxldCBzZWxlY3RlZEZpbHRlclNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcblxuICAgICAgICBsZXQgY3VycmVudENvbHVtblNvcnRGaWx0ZXIgPSB0aGlzLmdldENvbHVtblNvcnRTdGF0ZUZvclNlbGVjdGVkUmFkaW8oKTtcbiAgICAgICAgbGV0IGlzU29ydFByZXNlbnQgPVxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlICYmXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuc2l6ZSA+IDAgJiZcbiAgICAgICAgICAgIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyICE9IFNvcnRUeXBlRW51bS5ERUZBVUxUO1xuXG4gICAgICAgIHJldHVybiAhKHNlbGVjdGVkRmlsdGVyU2V0Lmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pIHx8IGlzU29ydFByZXNlbnQpO1xuICAgIH1cblxuICAgIGdldENvbHVtblNvcnRTdGF0ZUZvclNlbGVjdGVkUmFkaW8oKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID1cbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSAmJlxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pICYmXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XG4gICAgICAgIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gY3VycmVudENvbHVtblNvcnRGaWx0ZXIgPyBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA6IFNvcnRUeXBlRW51bS5ERUZBVUxUO1xuICAgICAgICByZXR1cm4gY3VycmVudENvbHVtblNvcnRGaWx0ZXI7XG4gICAgfVxuXG4gICAgY3JlYXRlTGlzdEZvckNoZWNrYm94RmlsdGVyKGhlYWRlcjogc3RyaW5nLCBvcHRpb25EYXRhOiBhbnlbXSkge1xuICAgICAgICBsZXQgdG9vbHRpcE9wdGlvbnMgPSB0aGlzLmdldFRvb2x0aXBNb2RlbEZyb21PcHRpb25EYXRhKG9wdGlvbkRhdGEsIGhlYWRlcik7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RVbnNlbGVjdExpc3RDaGVja2JveCh0b29sdGlwT3B0aW9ucywgaGVhZGVyKTtcbiAgICAgICAgdGhpcy5mb3JtYXROdWxsT3B0aW9uVG9TcGVjaWZpZWRTdHJpbmcodG9vbHRpcE9wdGlvbnMsICctJyk7XG5cbiAgICAgICAgcmV0dXJuIHRvb2x0aXBPcHRpb25zO1xuICAgIH1cblxuICAgIGdldFRvb2x0aXBNb2RlbEZyb21PcHRpb25EYXRhKG9wdGlvbkRhdGE6IGFueVtdLCBoZWFkZXI6IHN0cmluZykge1xuICAgICAgICBsZXQgdW5pcU9wdGlvbkRhdGEgPSB1bmlxKG9wdGlvbkRhdGEubWFwKChpdGVtKSA9PiBpdGVtW2hlYWRlcl0pKTtcbiAgICAgICAgcmV0dXJuIHVuaXFPcHRpb25EYXRhLm1hcCgoaXRlbSwgaW5kZXgpID0+IG5ldyBUb29sdGlwTW9kZWwoaXRlbSwgaW5kZXggKyAxKSk7XG4gICAgfVxuXG4gICAgc2VsZWN0VW5zZWxlY3RMaXN0Q2hlY2tib3godG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBoZWFkZXI6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGhlYWRlcikpIHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFZhbHVlU2V0ID0gbmV3IFNldCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKSk7XG4gICAgICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5pc1NlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZVNldC5oYXMoaXRlbS52YWx1ZSkgPyB0cnVlIDogZmFsc2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmlzU2VsZWN0ZWQgPSB0cnVlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtYXROdWxsT3B0aW9uVG9TcGVjaWZpZWRTdHJpbmcodG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBmb3JtYXR0ZWRTdHJpbmc6IHN0cmluZykge1xuICAgICAgICBsZXQgaW5kZXggPSB0b29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XG4gICAgICAgICAgICB0b29sdGlwT3B0aW9uc1tpbmRleF0ubGFiZWwgPSBmb3JtYXR0ZWRTdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDbG9uZWRUb29sdGlwQW5kVG9vbHRpcE9wdGlvbih0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIHNvcnRCeVN0cmluZzogc3RyaW5nKSB7XG4gICAgICAgIGxldCBbc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEl0ZW1zXSA9IHRoaXMuZ2V0U2VsZWN0ZWRBbmRVbnNlbGVjdGVkSXRlbXModG9vbHRpcE9wdGlvbnMpO1xuICAgICAgICBsZXQgc29ydGVkU2VsZWN0ZWRJdGVtcyA9IHNvcnRCeShzZWxlY3RlZEl0ZW1zLCBzb3J0QnlTdHJpbmcpO1xuICAgICAgICBsZXQgc29ydGVkVW5zZWxlY3RlZEl0ZW1zID0gc29ydEJ5KHVuc2VsZWN0ZWRJdGVtcywgc29ydEJ5U3RyaW5nKTtcblxuICAgICAgICBsZXQgY2xvbmVkVG9vbHRpcE9wdGlvbnMgPSBbLi4uc29ydGVkU2VsZWN0ZWRJdGVtcywgLi4uc29ydGVkVW5zZWxlY3RlZEl0ZW1zXTtcbiAgICAgICAgbGV0IHVwZGF0ZWRUb29sdGlwT3B0aW9ucyA9IGNsb25lRGVlcChjbG9uZWRUb29sdGlwT3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIFtjbG9uZWRUb29sdGlwT3B0aW9ucywgdXBkYXRlZFRvb2x0aXBPcHRpb25zLCBzZWxlY3RlZEl0ZW1zLCB1bnNlbGVjdGVkSXRlbXNdO1xuICAgIH1cblxuICAgIGdldEhlaWdodE9mQ2hlY2tib3hUb29sdGlwRmlsdGVyKGRhdGFMZW5ndGg6IG51bWJlciwgbWFyZ2luOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFMZW5ndGggPiA2ID8gMjAwIDogMjYuMDMgKiBkYXRhTGVuZ3RoICsgbWFyZ2luICogZGF0YUxlbmd0aCArIG1hcmdpbjtcbiAgICB9XG5cbiAgICB1bkNoZWNrQWxsQ2hlY2tib3godG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcbiAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBjbG9uZWRUb29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKG9wdCkgPT4gb3B0LmlkID09IGl0ZW0uaWQpO1xuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnNbaW5kZXhdLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2VsZWN0QWxsQ2hlY2tib3godG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcbiAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGNsb25lZFRvb2x0aXBPcHRpb25zLmZpbmRJbmRleCgob3B0KSA9PiBvcHQuaWQgPT0gaXRlbS5pZCk7XG4gICAgICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9uc1tpbmRleF0uaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNlbGVjdFVuc2VsZWN0Q2hlY2tib3goZGF0YTogVG9vbHRpcE1vZGVsLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcbiAgICAgICAgZGF0YS5pc1NlbGVjdGVkID0gIWRhdGEuaXNTZWxlY3RlZDtcbiAgICAgICAgbGV0IGluZGV4ID0gY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09IGRhdGEuaWQpO1xuICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9uc1tpbmRleF0uaXNTZWxlY3RlZCA9IGRhdGEuaXNTZWxlY3RlZDtcbiAgICB9XG5cbiAgICBnZXRTZWxlY3RlZEFuZFVuc2VsZWN0ZWRJdGVtcyh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkSXRlbXMgPSB0b29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaXNTZWxlY3RlZCk7XG4gICAgICAgIGxldCB1bnNlbGVjdGVkSXRlbXMgPSB0b29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmlzU2VsZWN0ZWQpO1xuXG4gICAgICAgIHJldHVybiBbc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEl0ZW1zXTtcbiAgICB9XG5cbiAgICBnZXRDaGVja2JveFByZXZpb3VzU2VsZWN0ZWRWYWx1ZShjbG9uZWRUYWJsZURhdGE6IGFueVtdKSB7XG4gICAgICAgIGxldCBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluaXRpYWxWYWx1ZSA9IHNvcnRCeSh1bmlxKGNsb25lZFRhYmxlRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBpbml0aWFsVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IHNvcnRCeSh1bmlxKGNsb25lZFRhYmxlRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1bdGhpcy5zZWxlY3RlZFJhZGlvXSkpKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZFZhbHVlO1xuICAgIH1cblxuICAgIGdldENoZWNrYm94Q3VycmVudFNlbGVjdGVkVmFsdWUoc2VhcmNoZWRTdHJpbmc6IHN0cmluZywgdG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XG4gICAgICAgIGxldCBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IFtdO1xuXG4gICAgICAgIGlmICh0b29sdGlwT3B0aW9ucykge1xuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUgPSBzb3J0QnkodG9vbHRpcE9wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzU2VsZWN0ZWQpLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSkpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXNlYXJjaGVkU3RyaW5nICYmXG4gICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUubGVuZ3RoID09IHRvb2x0aXBPcHRpb25zLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJsYW5rSW5kZXggPSBjdXJyZW50U2VsZWN0ZWRWYWx1ZS5maW5kSW5kZXgoKGl0ZW06IHN0cmluZykgPT4gaXRlbSA9PSBudWxsKTtcbiAgICAgICAgaWYgKGJsYW5rSW5kZXggIT0gLTEpIHtcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gc29ydEJ5KGN1cnJlbnRTZWxlY3RlZFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBjaGVja0lmU29ydGluZ0NoYW5nZWQodGVtcFNvcnRPcmRlcjogU29ydFR5cGUpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gdGhpcy5nZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk7XG5cbiAgICAgICAgbGV0IGlzU29ydENoYW5nZWQgPSB0ZW1wU29ydE9yZGVyICE9IG51bGwgJiYgdGVtcFNvcnRPcmRlciAhPSBjdXJyZW50Q29sdW1uU29ydEZpbHRlcjtcbiAgICAgICAgcmV0dXJuIGlzU29ydENoYW5nZWQ7XG4gICAgfVxuXG4gICAgZ2V0RmlsdGVyZWRPcHRpb25Bc0JvbGRTdHJpbmcoc3RyOiBzdHJpbmcsIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xuICAgICAgICBsZXQgdG9vbHRpcE9wdGlvbnMgPSBjbG9uZURlZXAoXG4gICAgICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubGFiZWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHN0ci50b0xvd2VyQ2FzZSgpKSksXG4gICAgICAgICk7XG4gICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQubGFiZWwgPSB0aGlzLmJvbGRTdHJpbmcoZWxlbWVudC5sYWJlbCwgc3RyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRvb2x0aXBPcHRpb25zO1xuICAgIH1cblxuICAgIGJvbGRTdHJpbmcoc3RyOiBzdHJpbmcsIGZpbmQ6IHN0cmluZykge1xuICAgICAgICBsZXQgaW5kZXhlcyA9IHRoaXMuZ2V0SW5kaWNlc09mKGZpbmQsIHN0ciwgZmFsc2UpO1xuXG4gICAgICAgIGluZGV4ZXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gaXRlbSArIGluZGV4ICogNzsgLy9NdWx0aXBseWluZyBieSA3IGFzIHRoZXJlIGFyZSA3Y2hhcjogPGI+PC9iPlxuICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIGZpbmQubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IHN0clRvQmVSZXBsYWNlZCA9IHN0ci5zdWJzdHJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2Uoc3RyVG9CZVJlcGxhY2VkLCAnPGI+JyArIHN0clRvQmVSZXBsYWNlZCArICc8L2I+Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIGdldEluZGljZXNPZihzZWFyY2hTdHI6IHN0cmluZywgc3RyOiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU6IGJvb2xlYW4pIHtcbiAgICAgICAgdmFyIHNlYXJjaFN0ckxlbiA9IHNlYXJjaFN0ci5sZW5ndGg7XG4gICAgICAgIGlmIChzZWFyY2hTdHJMZW4gPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdGFydEluZGV4ID0gMCxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgaW5kaWNlcyA9IFtdO1xuICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHtcbiAgICAgICAgICAgIHN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgc2VhcmNoU3RyID0gc2VhcmNoU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKChpbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0ciwgc3RhcnRJbmRleCkpID4gLTEpIHtcbiAgICAgICAgICAgIGluZGljZXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICBzdGFydEluZGV4ID0gaW5kZXggKyBzZWFyY2hTdHJMZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGljZXM7XG4gICAgfVxuXG4gICAgZGlzYWJsZUFsbEJ0bnNXaGVuVGhlcmVBcmVOb0ZpbHRlcmVkUmVzdWx0cygpOiBbbnVtYmVyLCBib29sZWFuLCBib29sZWFuLCBib29sZWFuXSB7XG4gICAgICAgIC8vIFtzZWxlY3RlZENoZWNrYm94T3B0aW9uc0NvdW50LCBkaXNhYmxlQ2hlY2tib3hBcHBseSwgZGlzYWJsZUNsZWFyQWxsLCBkaXNhYmxlU2VsZWN0QWxsXTtcbiAgICAgICAgcmV0dXJuIFswLCB0cnVlLCB0cnVlLCB0cnVlXTtcbiAgICB9XG5cbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PUNhbGVuZGFyIGZpbHRlcj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cbiAgICBjcmVhdGVSYW5nZUZvclRoZURhdGVGaWx0ZXIob3B0aW9uRGF0YTogYW55W10pIHtcbiAgICAgICAgbGV0IG1pbk1heERhdGU7XG4gICAgICAgIC8vV2hlbiB5b3Ugd2FudCB0byB1c2Ugc3RhcnREYXRlIGFuZCBlbmREYXRlIGNvbWJpbmVkIGFzIHNpbmdsZSBjb2x1bW4gdGhlbiB1c2UgUGVyaW9kLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3BlcmlvZCcgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnYnV5ZXJGbGlnaHREYXRlcycgfHxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAndHJhZmZpY0ZsaWdodERhdGVzJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIG1pbk1heERhdGUgPSB0aGlzLmNyZWF0ZVN0YXJ0RW5kRGF0ZVJhbmdlKG9wdGlvbkRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWluTWF4RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShvcHRpb25EYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1pbk1heERhdGU7XG4gICAgfVxuXG4gICAgY3JlYXRlU3RhcnRFbmREYXRlUmFuZ2Uob3B0aW9uRGF0YTogYW55W10pIHtcbiAgICAgICAgbGV0IG1pblN0YXJ0RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShvcHRpb25EYXRhLCAnc3RhcnREYXRlJyk7XG4gICAgICAgIGxldCBtYXhFbmREYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKG9wdGlvbkRhdGEsICdlbmREYXRlJyk7XG4gICAgICAgIHJldHVybiBbbWluU3RhcnREYXRlWzBdLCBtYXhFbmREYXRlWzFdXTtcbiAgICB9XG5cbiAgICBnZXRNaW5BbmRNYXhEYXRlUmFuZ2VGb3JDYWxlbmRhcihtaW5NYXhEYXRlOiBhbnlbXSwgcGFyc2luZ0Zvcm1hdDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjYWxlbmRhck1pbkVuYWJsZWREYXRlID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShtaW5NYXhEYXRlWzBdLCBwYXJzaW5nRm9ybWF0KTtcbiAgICAgICAgbGV0IGNhbGVuZGFyTWF4RW5hYmxlZERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0sIHBhcnNpbmdGb3JtYXQpO1xuICAgICAgICByZXR1cm4gW2NhbGVuZGFyTWluRW5hYmxlZERhdGUsIGNhbGVuZGFyTWF4RW5hYmxlZERhdGVdO1xuICAgIH1cblxuICAgIGdldFNlbGVjdGVkRGF0ZUZvckNhbGVuZGFyKG1pbk1heERhdGU6IGFueVtdLCBwYXJzaW5nRm9ybWF0OiBzdHJpbmcsIG1pbkRhdGU6IE5nYkRhdGVUeXBlLCBtYXhEYXRlOiBOZ2JEYXRlVHlwZSkge1xuICAgICAgICBsZXQgc2VsZWN0ZWRNaW5EYXRlO1xuICAgICAgICBsZXQgc2VsZWN0ZWRNYXhEYXRlO1xuXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZU9iaiA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlT2JqLmZyb21EYXRlLmlzQWZ0ZXIobWluTWF4RGF0ZVswXSkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1pbkRhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHNlbGVjdGVkRGF0ZU9iai5mcm9tRGF0ZSwgcGFyc2luZ0Zvcm1hdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkTWluRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVswXSwgcGFyc2luZ0Zvcm1hdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGVPYmoudG9EYXRlLmlzQWZ0ZXIobWluTWF4RGF0ZVsxXSkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0sIHBhcnNpbmdGb3JtYXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHNlbGVjdGVkRGF0ZU9iai50b0RhdGUsIHBhcnNpbmdGb3JtYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0ZWRNaW5EYXRlID0gY2xvbmVEZWVwKG1pbkRhdGUpO1xuICAgICAgICAgICAgc2VsZWN0ZWRNYXhEYXRlID0gY2xvbmVEZWVwKG1heERhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtzZWxlY3RlZE1pbkRhdGUsIHNlbGVjdGVkTWF4RGF0ZV07XG4gICAgfVxuXG4gICAgZ2V0UHJldmlvdXNTZWxlY3RlZERhdGVzRm9yQ2FsZW5kYXIob3B0aW9uRGF0YTogYW55W10pIHtcbiAgICAgICAgbGV0IHByZXZpb3VzU2VsZWN0ZWREYXRlOiB7IGZyb21EYXRlOiBhbnk7IHRvRGF0ZTogYW55IH0gPSB7IGZyb21EYXRlOiBudWxsLCB0b0RhdGU6IG51bGwgfTtcblxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWREYXRlID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvckRhdGVGaWx0ZXIob3B0aW9uRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWREYXRlID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvckRhdGVGaWx0ZXIob3B0aW9uRGF0YSk7XG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRGF0ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzU2VsZWN0ZWREYXRlO1xuICAgIH1cblxuICAgIHNldEluaXRpYWxWYWx1ZU1hcEZvckRhdGVGaWx0ZXIob3B0aW9uRGF0YTogYW55W10pIHtcbiAgICAgICAgbGV0IG1pbk1heERhdGUgPSB0aGlzLmNyZWF0ZVJhbmdlRm9yVGhlRGF0ZUZpbHRlcihvcHRpb25EYXRhKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWREYXRlID0geyBmcm9tRGF0ZTogbWluTWF4RGF0ZVswXSwgdG9EYXRlOiBtaW5NYXhEYXRlWzFdIH07XG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHNlbGVjdGVkRGF0ZSk7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkRGF0ZXNGb3JDYWxlbmRhcihjdXJyZW50U2VsZWN0ZWREYXRlOiBhbnksIG1pbkRhdGU6IE5nYkRhdGVUeXBlLCBtYXhEYXRlOiBOZ2JEYXRlVHlwZSkge1xuICAgICAgICBsZXQgZnJvbURhdGUgPSB7XG4gICAgICAgICAgICB5ZWFyOiBjdXJyZW50U2VsZWN0ZWREYXRlLmZyb21EYXRlLnllYXIsXG4gICAgICAgICAgICBtb250aDogY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZS5tb250aCxcbiAgICAgICAgICAgIGRheTogY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZS5kYXksXG4gICAgICAgIH07XG4gICAgICAgIGxldCB0b0RhdGUgPSB7XG4gICAgICAgICAgICB5ZWFyOiBjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZS55ZWFyLFxuICAgICAgICAgICAgbW9udGg6IGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlLm1vbnRoLFxuICAgICAgICAgICAgZGF5OiBjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZS5kYXksXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGlzRXF1YWwobWluRGF0ZSwgZnJvbURhdGUpICYmIGlzRXF1YWwobWF4RGF0ZSwgdG9EYXRlKSAmJiB0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkRGF0ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZSA9IGRheWpzKFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUgPSBkYXlqcyhcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudFNlbGVjdGVkRGF0ZTtcbiAgICB9XG5cbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVNMSURFUj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cblxuICAgIGdldFNsaWRlclRyYW5zbGF0ZUZ1bmNWYWwoaGVhZGVyOiBzdHJpbmcsIGN1cnJlbmN5U2V0OiBTZXQ8c3RyaW5nPikge1xuICAgICAgICBsZXQgdHJhbnNsYXRlRnVuYztcblxuICAgICAgICBpZiAoY3VycmVuY3lTZXQuaGFzKGhlYWRlcikpIHtcbiAgICAgICAgICAgIHRyYW5zbGF0ZUZ1bmMgPSAnY3VycmVuY3knO1xuICAgICAgICB9IGVsc2UgaWYgKGhlYWRlciA9PSAncG9zdGVkQXVkUGVyY2VudCcgfHwgaGVhZGVyID09ICdwYXJlbnRSb3dTaGFyZXMnIHx8IGhlYWRlciA9PSAncGFyZW50Um93UHV0UGVyY2VudCcpIHtcbiAgICAgICAgICAgIHRyYW5zbGF0ZUZ1bmMgPSAncGVyY2VudCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmFuc2xhdGVGdW5jID0gJ25vcm1hbCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlRnVuYztcbiAgICB9XG5cbiAgICBnZXRTbGlkZXJPcHRpb25zKG9wdGlvbnNEYXRhOiBhbnlbXSwgdHJhbnNsYXRlRnVuYzogc3RyaW5nLCBoZWFkZXI6IHN0cmluZykge1xuICAgICAgICBsZXQgbWluVmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKG9wdGlvbnNEYXRhLCBoZWFkZXIsIHRydWUpO1xuICAgICAgICBsZXQgbWF4VmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKG9wdGlvbnNEYXRhLCBoZWFkZXIsIGZhbHNlKTtcblxuICAgICAgICBsZXQgb2JqID0gdGhpcy5zZXRPcHRpb25WYWx1ZXMobWluVmFsdWUsIG1heFZhbHVlKTtcblxuICAgICAgICBpZiAodHJhbnNsYXRlRnVuYyA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLm5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09ICdwZXJjZW50Jykge1xuICAgICAgICAgICAgb2JqLnRyYW5zbGF0ZSA9IHRoaXMucGVyY2VudFRyYW5zbGF0ZUZ1bmN0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09ICdjdXJyZW5jeScpIHtcbiAgICAgICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLmN1cnJlbmN5VHJhbnNsYXRlRnVuY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHNldFNlbGVjdGVkUmFuZ2VGb3JTbGlkZXIoaGVhZGVyOiBzdHJpbmcsIG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHNsaWRlck1pblZhbHVlO1xuICAgICAgICBsZXQgc2xpZGVyTWF4VmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKSB7XG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRPYmogPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKTtcbiAgICAgICAgICAgIHNsaWRlck1pblZhbHVlID0gc2VsZWN0ZWRPYmoubWluIDwgb3B0aW9ucy5mbG9vciA/IG9wdGlvbnMuZmxvb3IgOiBzZWxlY3RlZE9iai5taW47XG4gICAgICAgICAgICBzbGlkZXJNYXhWYWx1ZSA9IHNlbGVjdGVkT2JqLm1heCA8IG9wdGlvbnMuY2VpbCA/IHNlbGVjdGVkT2JqLm1heCA6IG9wdGlvbnMuY2VpbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNsaWRlck1pblZhbHVlID0gb3B0aW9ucy5mbG9vcjtcbiAgICAgICAgICAgIHNsaWRlck1heFZhbHVlID0gb3B0aW9ucy5jZWlsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtzbGlkZXJNaW5WYWx1ZSwgc2xpZGVyTWF4VmFsdWVdO1xuICAgIH1cblxuICAgIGlzVmFsdWVJblJhbmdlKG9wdGlvbnM6IE9wdGlvbnMsIHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZsb29yIDw9IHZhbCAmJiB2YWwgPD0gb3B0aW9ucy5jZWlsO1xuICAgIH1cblxuICAgIGdldFByZXZpb3VzU2VsZWN0ZWRWYWx1ZUZvclNsaWRlcihjbG9uZWREYXRhOiBhbnlbXSkge1xuICAgICAgICBsZXQgcHJldmlvdXNTbGlkZXJEYXRhOiB7IG1pbjogYW55OyBtYXg6IGFueSB9ID0geyBtaW46ICcnLCBtYXg6ICcnIH07XG5cbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XG4gICAgICAgICAgICBwcmV2aW91c1NsaWRlckRhdGEgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhKTtcbiAgICAgICAgICAgIHByZXZpb3VzU2xpZGVyRGF0YSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzU2xpZGVyRGF0YTtcbiAgICB9XG5cbiAgICBzZXRJbml0aWFsVmFsdWVNYXBGb3JTbGlkZXJGaWx0ZXIoY2xvbmVkRGF0YTogYW55W10pIHtcbiAgICAgICAgbGV0IG1pblZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShjbG9uZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIHRydWUpO1xuICAgICAgICBsZXQgbWF4VmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKGNsb25lZERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbywgZmFsc2UpO1xuICAgICAgICBsZXQgc2xpZGVyRGF0YSA9IHsgbWluOiBtaW5WYWx1ZSwgbWF4OiBtYXhWYWx1ZSB9O1xuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBzbGlkZXJEYXRhKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRWYWx1ZUZvclNsaWRlcihtaW5FbnRlcmVkVmFsOiBudW1iZXIsIG1heEVudGVyZWRWYWw6IG51bWJlciwgb3B0aW9uczogT3B0aW9ucykge1xuICAgICAgICBsZXQgY3VycmVudFNsaWRlckRhdGE6IHsgbWluOiBhbnk7IG1heDogYW55IH0gPSB7IG1pbjogbnVsbCwgbWF4OiBudWxsIH07XG4gICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1heCA9IG1heEVudGVyZWRWYWw7XG4gICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1pbiA9IG1pbkVudGVyZWRWYWw7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWluID09IG9wdGlvbnMuZmxvb3IgJiZcbiAgICAgICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1heCA9PSBvcHRpb25zLmNlaWwgJiZcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pXG4gICAgICAgICkge1xuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJyZW50U2xpZGVyRGF0YTtcbiAgICB9XG5cbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09VElNRT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cbiAgICBnZXRTZWxlY3RlZFRpbWVSYW5nZShoZWFkZXI6IHN0cmluZywgY2xvbmVkRGF0YTogYW55W10pIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkRnJvbVRpbWU6IGFueVtdO1xuICAgICAgICBsZXQgc2VsZWN0ZWRUb1RpbWU6IGFueVtdO1xuXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoaGVhZGVyKSkge1xuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpLmZyb21UaW1lO1xuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKS50b1RpbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclRpbWVGaWx0ZXIoY2xvbmVkRGF0YSwgaGVhZGVyKTtcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQoaGVhZGVyKS5mcm9tVGltZTtcbiAgICAgICAgICAgIHNlbGVjdGVkVG9UaW1lID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KGhlYWRlcikudG9UaW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRnJvbVRpbWUgIT0gdW5kZWZpbmVkIHx8IHNlbGVjdGVkVG9UaW1lICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuZm9ybWF0VG9Ud2VsdmVIcnMoc2VsZWN0ZWRGcm9tVGltZSwgdHJ1ZSk7XG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuZm9ybWF0VG9Ud2VsdmVIcnMoc2VsZWN0ZWRUb1RpbWUsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0ZWRGcm9tVGltZSA9IFsnLScsICctJywgJy0nXTtcbiAgICAgICAgICAgIHNlbGVjdGVkVG9UaW1lID0gWyctJywgJy0nLCAnLSddO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZV07XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhbFZhbHVlTWFwRm9yVGltZUZpbHRlcihjbG9uZWREYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGtleSA9PSAnc3RhcnRFbmRUaW1lJyB8fCBrZXkgPT0gJ1RpbWVCYW5kJykge1xuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShjbG9uZWREYXRhLCBrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVGb3JTdGFydE9yRW5kVGltZVJhbmdlKGNsb25lZERhdGEsIGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL3VzZSBmb3IgZmlsdGVyIHdoZXJlIHdlIGhhdmUgc3RhcnQgYW5kIGVuZCB0aW1lIHJhbmdlIGluIG9uZSBmaWx0ZXJcbiAgICAvL3N0YXJ0RW5kVGltZTogW1wiNiAtIDdBXCIsIFwiMDY6IDAwIDogMDBcIiAsIFwiMDc6MDA6MDBcIl1cbiAgICBzZXRJbml0aWFsVmFsdWVGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShjbG9uZWREYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGluY2x1ZGVNdWx0aSA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldWzBdID09ICc8bXVsdGk+JykgIT0gLTE7XG4gICAgICAgIGxldCBpbmNsdWRlWmVybyA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldWzBdID09ICcwJykgIT0gLTE7XG4gICAgICAgIGxldCBpbmNsdWRlVGltZVJhbmdlID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV1bMF0gIT0gJzAnICYmIG9ialtrZXldWzBdICE9ICc8bXVsdGk+JykgIT0gLTE7XG5cbiAgICAgICAgbGV0IGZpbHRlcmVkU3RhcnRUaW1lID0gY2xvbmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gIVsnJywgJy0nLCBudWxsLCAnMCcsICc8bXVsdGk+J10uaW5jbHVkZXMob2JqWydzdGFydFRpbWUnXSkpO1xuICAgICAgICBsZXQgZmlsdGVyZWRFbmRUaW1lID0gY2xvbmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gIVsnJywgJy0nLCBudWxsLCAnMCcsICc8bXVsdGk+J10uaW5jbHVkZXMob2JqWydlbmRUaW1lJ10pKTtcblxuICAgICAgICBsZXQgc3RhcnRUaW1lQXJyID0gbWFwKGZpbHRlcmVkU3RhcnRUaW1lLCAnc3RhcnRUaW1lJyk7XG4gICAgICAgIGxldCBlbmRUaW1lQXJyID0gbWFwKGZpbHRlcmVkRW5kVGltZSwgJ2VuZFRpbWUnKTtcblxuICAgICAgICBzdGFydFRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVBc2NlbmRpbmcoYSwgYik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGVuZFRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgZnJvbVRpbWU6IHN0YXJ0VGltZUFyclswXSxcbiAgICAgICAgICAgIHRvVGltZTogZW5kVGltZUFyclswXSxcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxuICAgICAgICAgICAgaW5jbHVkZVplcm86IGluY2x1ZGVaZXJvLFxuICAgICAgICAgICAgaW5jbHVkZVRpbWVSYW5nZTogaW5jbHVkZVRpbWVSYW5nZSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBvYmopO1xuICAgIH1cblxuICAgIC8vdXNlIGZvciB0aGUgZmlsdGVycyB3aGVyZSB3ZSBoYXZlIGRpZmZlcmVudCBmaWx0ZXIgZm9yIHN0YXJ0IGFuZCBlbmQgdGltZVxuICAgIC8vc3RhcnRUaW1lOiBcIjA2OjAwOjAwXCJcbiAgICBzZXRJbml0aWFsVmFsdWVGb3JTdGFydE9yRW5kVGltZVJhbmdlKGNsb25lZERhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xuICAgICAgICBsZXQgaW5jbHVkZU11bHRpID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV0gPT0gJzxtdWx0aT4nKSAhPSAtMTtcbiAgICAgICAgbGV0IGluY2x1ZGVaZXJvID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV0gPT0gJzAnKSAhPSAtMTtcbiAgICAgICAgbGV0IGluY2x1ZGVUaW1lUmFuZ2UgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XSAhPSAnMCcgJiYgb2JqW2tleV0gIT0gJzxtdWx0aT4nKSAhPSAtMTtcblxuICAgICAgICBsZXQgZGF0YSA9IGNsb25lZERhdGEuZmlsdGVyKChvYmopID0+ICFbJycsICctJywgbnVsbCwgJzAnLCAnPG11bHRpPiddLmluY2x1ZGVzKG9ialtrZXldKSk7XG5cbiAgICAgICAgbGV0IHRpbWVBcnIgPSBtYXAoZGF0YSwga2V5KTtcbiAgICAgICAgdGltZUFyci5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIGZyb21UaW1lOiB0aW1lQXJyWzBdLFxuICAgICAgICAgICAgdG9UaW1lOiB0aW1lQXJyW3RpbWVBcnIubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICBpbmNsdWRlTXVsdGk6IGluY2x1ZGVNdWx0aSxcbiAgICAgICAgICAgIGluY2x1ZGVaZXJvOiBpbmNsdWRlWmVybyxcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGluY2x1ZGVUaW1lUmFuZ2UsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgb2JqKTtcbiAgICB9XG5cbiAgICBzZWxlY3RVbnNlbGVjdFRpbWVGaWx0ZXJDaGVja2JveChrZXk6IHN0cmluZywgb3B0aW9uc0RhdGE6IGFueVtdKSB7XG4gICAgICAgIGxldCBzaG93TXVsdGlUaW1lQ2hlY2tib3ggPSBmYWxzZTtcbiAgICAgICAgbGV0IHNob3daZXJvVGltZUNoZWNrYm94ID0gZmFsc2U7XG4gICAgICAgIGxldCBzaG93RW50ZXJUaW1lQ2hlY2tib3ggPSBmYWxzZTtcbiAgICAgICAgbGV0IG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgemVyb1RpbWVDaGVja2JveENoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZFRpbWVPYmo7XG5cbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFRpbWVPYmogPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGVkVGltZU9iaiA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldChrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRpbWVBcnI6IHN0cmluZ1tdO1xuICAgICAgICBpZiAoa2V5ID09ICdzdGFydEVuZFRpbWUnIHx8IGtleSA9PSAnVGltZUJhbmQnKSB7XG4gICAgICAgICAgICB0aW1lQXJyID0gb3B0aW9uc0RhdGEubWFwKChpdGVtKSA9PiBpdGVtW2tleV1bMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGltZUFyciA9IG9wdGlvbnNEYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVtrZXldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aW1lQXJyLmZpbmRJbmRleCgodmFsKSA9PiB2YWwgPT0gJzAnKSAhPSAtMSkge1xuICAgICAgICAgICAgc2hvd1plcm9UaW1lQ2hlY2tib3ggPSB0cnVlO1xuICAgICAgICAgICAgemVyb1RpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZFRpbWVPYmouaW5jbHVkZVplcm87XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGltZUFyci5maW5kSW5kZXgoKHZhbCkgPT4gdmFsID09ICc8bXVsdGk+JykgIT0gLTEpIHtcbiAgICAgICAgICAgIHNob3dNdWx0aVRpbWVDaGVja2JveCA9IHRydWU7XG4gICAgICAgICAgICBtdWx0aVRpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZFRpbWVPYmouaW5jbHVkZU11bHRpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNob3daZXJvVGltZUNoZWNrYm94IHx8IHNob3dNdWx0aVRpbWVDaGVja2JveCkge1xuICAgICAgICAgICAgc2hvd0VudGVyVGltZUNoZWNrYm94ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aW1lQXJyLmZpbmRJbmRleCgodmFsKSA9PiB2YWwgIT0gJzxtdWx0aT4nICYmIHZhbCAhPSAnMCcpICE9IC0xKSB7XG4gICAgICAgICAgICBlbnRlclRpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZFRpbWVPYmo/LmluY2x1ZGVUaW1lUmFuZ2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2hvd011bHRpVGltZUNoZWNrYm94OiBzaG93TXVsdGlUaW1lQ2hlY2tib3gsXG4gICAgICAgICAgICBzaG93WmVyb1RpbWVDaGVja2JveDogc2hvd1plcm9UaW1lQ2hlY2tib3gsXG4gICAgICAgICAgICBzaG93RW50ZXJUaW1lQ2hlY2tib3g6IHNob3dFbnRlclRpbWVDaGVja2JveCxcbiAgICAgICAgICAgIG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZDogbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkLFxuICAgICAgICAgICAgemVyb1RpbWVDaGVja2JveENoZWNrZWQ6IHplcm9UaW1lQ2hlY2tib3hDaGVja2VkLFxuICAgICAgICAgICAgZW50ZXJUaW1lQ2hlY2tib3hDaGVja2VkOiBlbnRlclRpbWVDaGVja2JveENoZWNrZWQsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY2hlY2tJZlN0YXJ0VGltZUlzQWZ0ZXJFbmRUaW1lKHN0YXJ0VGltZTogc3RyaW5nW10sIGVuZFRpbWU6IHN0cmluZ1tdKSB7XG4gICAgICAgIGxldCB0aW1lRm9ybWF0ID0gJ0hIOm1tOnNzJztcblxuICAgICAgICBsZXQgc3RhcnRUaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXG4gICAgICAgICAgICBzdGFydFRpbWVbMF0gKyAnOicgKyBzdGFydFRpbWVbMV0gKyAnICcgKyBzdGFydFRpbWVbMl0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgICBsZXQgc3RhcnRUaW1lMjRIckZvcm1hdCA9IHN0YXJ0VGltZTI0SHJGb3JtYXRBcnJbMF0gKyAnOicgKyBzdGFydFRpbWUyNEhyRm9ybWF0QXJyWzFdICsgJzowMCc7XG4gICAgICAgIGxldCBlbmRUaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXG4gICAgICAgICAgICBlbmRUaW1lWzBdICsgJzonICsgZW5kVGltZVsxXSArICcgJyArIGVuZFRpbWVbMl0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgICBsZXQgZW5kVGltZTI0SHJGb3JtYXQgPSBlbmRUaW1lMjRIckZvcm1hdEFyclswXSArICc6JyArIGVuZFRpbWUyNEhyRm9ybWF0QXJyWzFdICsgJzowMCc7XG4gICAgICAgIHJldHVybiBkYXlqcyhzdGFydFRpbWUyNEhyRm9ybWF0LCB0aW1lRm9ybWF0KS5pc0FmdGVyKGRheWpzKGVuZFRpbWUyNEhyRm9ybWF0LCB0aW1lRm9ybWF0KSk7XG4gICAgfVxuXG4gICAgZ2V0UHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIoKSB7XG4gICAgICAgIGxldCBwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlcjtcblxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXI7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkVGltZUZpbHRlcihcbiAgICAgICAgc3RhcnRUaW1lOiBzdHJpbmdbXSxcbiAgICAgICAgZW5kVGltZTogc3RyaW5nW10sXG4gICAgICAgIGluY2x1ZGVNdWx0aTogYm9vbGVhbixcbiAgICAgICAgaW5jbHVkZVplcm86IGJvb2xlYW4sXG4gICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGJvb2xlYW4sXG4gICAgKSB7XG4gICAgICAgIGxldCBjdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyO1xuXG4gICAgICAgIGxldCBmcm9tVGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxuICAgICAgICAgICAgc3RhcnRUaW1lWzBdICsgJzonICsgc3RhcnRUaW1lWzFdICsgJyAnICsgc3RhcnRUaW1lWzJdLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGZyb21UaW1lMjRIckZvcm1hdCA9IGZyb21UaW1lMjRIckZvcm1hdEFyclswXSArICc6JyArIGZyb21UaW1lMjRIckZvcm1hdEFyclsxXSArICc6MDAnO1xuXG4gICAgICAgIGxldCB0b1RpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcbiAgICAgICAgICAgIGVuZFRpbWVbMF0gKyAnOicgKyBlbmRUaW1lWzFdICsgJyAnICsgZW5kVGltZVsyXSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICk7XG4gICAgICAgIGxldCB0b1RpbWUyNEhyRm9ybWF0ID0gdG9UaW1lMjRIckZvcm1hdEFyclswXSArICc6JyArIHRvVGltZTI0SHJGb3JtYXRBcnJbMV0gKyAnOjAwJztcblxuICAgICAgICBjdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyID0ge1xuICAgICAgICAgICAgZnJvbVRpbWU6IGZyb21UaW1lMjRIckZvcm1hdCxcbiAgICAgICAgICAgIHRvVGltZTogdG9UaW1lMjRIckZvcm1hdCxcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxuICAgICAgICAgICAgaW5jbHVkZVplcm86IGluY2x1ZGVaZXJvLFxuICAgICAgICAgICAgaW5jbHVkZVRpbWVSYW5nZTogaW5jbHVkZVRpbWVSYW5nZSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFNlbGVjdGVkVGltZUZpbHRlcjtcbiAgICB9XG5cbiAgICBpbmNyZW1lbnRIb3VySW5wdXQoYXJyOiBhbnlbXSkge1xuICAgICAgICBpZiAoYXJyWzBdID09ICcnKSB7XG4gICAgICAgICAgICBhcnJbMF0gPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KGFyclswXSkgPCAxMikge1xuICAgICAgICAgICAgYXJyWzBdID0gcGFyc2VJbnQoYXJyWzBdKSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcnJbMF0gPSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVjcmVtZW50SG91cklucHV0KGFycjogYW55W10pIHtcbiAgICAgICAgaWYgKGFyclswXSA9PSAnJykge1xuICAgICAgICAgICAgYXJyWzBdID0gMTI7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQoYXJyWzBdKSA+IDEpIHtcbiAgICAgICAgICAgIGFyclswXSA9IHBhcnNlSW50KGFyclswXSkgLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyWzBdID0gMTI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbmNyZW1lbnRNaW51dGVJbnB1dChhcnI6IGFueVtdKSB7XG4gICAgICAgIC8vIGluY3JlbWVudCB0byBuZWFyZXN0IHByb3BlciBpbnRlcnZhbCgxNSwzMCw0NSlcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KGFyclsxXSk7XG4gICAgICAgIGlmIChtaW4gPD0gMTQpIHtcbiAgICAgICAgICAgIGFyclsxXSA9ICcxNSc7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDE1ICYmIG1pbiA8PSAyOSkge1xuICAgICAgICAgICAgYXJyWzFdID0gJzMwJztcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMzAgJiYgbWluIDw9IDQ0KSB7XG4gICAgICAgICAgICBhcnJbMV0gPSAnNDUnO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSA0NSkge1xuICAgICAgICAgICAgYXJyWzFdID0gJzAwJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlY3JlbWVudE1pbnV0ZUlucHV0KGFycjogYW55KSB7XG4gICAgICAgIGxldCBtaW4gPSBwYXJzZUludChhcnJbMV0pO1xuICAgICAgICBpZiAobWluID4gMCAmJiBtaW4gPD0gMTUpIHtcbiAgICAgICAgICAgIGFyclsxXSA9ICcwMCc7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDE2ICYmIG1pbiA8PSAzMCkge1xuICAgICAgICAgICAgYXJyWzFdID0gJzE1JztcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMzEgJiYgbWluIDw9IDQ1KSB7XG4gICAgICAgICAgICBhcnJbMV0gPSAnMzAnO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+IDQ1IHx8IG1pbiA9PSAwKSB7XG4gICAgICAgICAgICBhcnJbMV0gPSAnNDUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5jcmVtZW50T3JEZWNyZW1lbnRIb3VyKGluY3JlbWVudDogYm9vbGVhbiwgdGltZTogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRIb3VySW5wdXQodGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudEhvdXJJbnB1dCh0aW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluY3JlbWVudE9yRGVjcmVtZW50TWluKGluY3JlbWVudDogYm9vbGVhbiwgdGltZTogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRNaW51dGVJbnB1dCh0aW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50TWludXRlSW5wdXQodGltZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0hvdXJWYWx1ZUludmFsaWQoaHI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gaHIubGVuZ3RoID09IDAgfHwgIStociB8fCAxID4gcGFyc2VJbnQoaHIpIHx8IHBhcnNlSW50KGhyKSA+IDEyIHx8IGhyLmluY2x1ZGVzKCcuJyk7XG4gICAgfVxuXG4gICAgaXNNaW51dGVWYWx1ZUludmFsaWQobWluOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG1pbi5sZW5ndGggIT0gMiB8fCAoISttaW4gJiYgbWluICE9ICcwMCcpIHx8IDAgPiBwYXJzZUludChtaW4pIHx8IHBhcnNlSW50KG1pbikgPiA1OSB8fCBtaW4uaW5jbHVkZXMoJy4nKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVNPUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cbiAgICB1cGRhdGVTb3J0TWFwKHRlbXBTb3J0T3JkZXI6IFNvcnRUeXBlLCB0YWJsZURhdGE6IGFueVtdLCBpc0x1ckFuZENzckNvbXBvbmVudDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCB0ZW1wU29ydE9yZGVyKTtcbiAgICAgICAgbGV0IHNvcnRlZFRhYmxlRGF0YSA9IHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmFwcGx5U29ydGluZyhcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyxcbiAgICAgICAgICAgIHRlbXBTb3J0T3JkZXIsXG4gICAgICAgICAgICB0YWJsZURhdGEsXG4gICAgICAgICAgICBpc0x1ckFuZENzckNvbXBvbmVudCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHNvcnRlZFRhYmxlRGF0YTtcbiAgICB9XG59XG4iXX0=
|