@eqproject/eqp-dynamic-module 2.6.43 → 2.6.44

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.
@@ -0,0 +1,178 @@
1
+ import { Injectable } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class dbDateService {
4
+ //#region datetime
5
+ /**
6
+ * Parse date to visualize as a string
7
+ */
8
+ parseDate(date) {
9
+ let newYear = date.getFullYear();
10
+ let newMonth = date.getMonth() + 1;
11
+ let newMonthString;
12
+ if (newMonth < 10) {
13
+ newMonthString = "0" + newMonth.toString();
14
+ }
15
+ else {
16
+ newMonthString = newMonth.toString();
17
+ }
18
+ let newDay = date.getDate();
19
+ let newDayString;
20
+ if (newDay < 10) {
21
+ newDayString = "0" + newDay.toString();
22
+ }
23
+ else {
24
+ newDayString = newDay.toString();
25
+ }
26
+ let newHour = date.getHours();
27
+ let newHourString;
28
+ if (newHour < 10) {
29
+ newHourString = "0" + newHour.toString();
30
+ }
31
+ else {
32
+ newHourString = newHour.toString();
33
+ }
34
+ let newMinute = date.getMinutes();
35
+ let newMinuteString;
36
+ if (newMinute < 10) {
37
+ newMinuteString = "0" + newMinute.toString();
38
+ }
39
+ else {
40
+ newMinuteString = newMinute.toString();
41
+ }
42
+ let dateString = newDayString + "/" + newMonthString + "/" + newYear.toString() + " " + newHourString + ":" + newMinuteString;
43
+ return dateString;
44
+ }
45
+ parseTime(date) {
46
+ let newHour = date.getHours();
47
+ let newHourString;
48
+ if (newHour < 10) {
49
+ newHourString = "0" + newHour.toString();
50
+ }
51
+ else {
52
+ newHourString = newHour.toString();
53
+ }
54
+ let newMinute = date.getMinutes();
55
+ let newMinuteString;
56
+ if (newMinute < 10) {
57
+ newMinuteString = "0" + newMinute.toString();
58
+ }
59
+ else {
60
+ newMinuteString = newMinute.toString();
61
+ }
62
+ let timeString = newHourString + ":" + newMinuteString;
63
+ return timeString;
64
+ }
65
+ addZeroesOnData(numero) {
66
+ let numerostring = "";
67
+ if (numero < 10) {
68
+ numerostring = "0" + numero.toString();
69
+ }
70
+ else {
71
+ numerostring = numero.toString();
72
+ }
73
+ return numerostring;
74
+ }
75
+ parseDatefromDB(dirtyDateMeasurement) {
76
+ if (this.isDateFromServer(dirtyDateMeasurement)) {
77
+ let dirtyDate = dirtyDateMeasurement.toString().split("T");
78
+ let dirtyHour = dirtyDate[1].split(".");
79
+ let yearMonthDay = dirtyDate[0].split("-");
80
+ let hourMinuteSecond = dirtyHour[0].split(":");
81
+ let date = new Date(parseInt(yearMonthDay[0]), parseInt(yearMonthDay[1]) - 1, parseInt(yearMonthDay[2]), parseInt(hourMinuteSecond[0]), parseInt(hourMinuteSecond[1]));
82
+ let gmtString = date.toString().split(" ")[5].split("T")[1];
83
+ let hour = "";
84
+ let minute = "";
85
+ for (let j = 0; j < gmtString.length; j++) {
86
+ if (j == 0) {
87
+ hour += gmtString[j];
88
+ minute += gmtString[j];
89
+ }
90
+ if (j > 0 && j < 3) {
91
+ hour += gmtString[j];
92
+ }
93
+ if (j > 2) {
94
+ minute += gmtString[j];
95
+ }
96
+ }
97
+ let hourInt = parseInt(hour);
98
+ let minuteInt = parseInt(minute);
99
+ let newDate = new Date(parseInt(yearMonthDay[0]), parseInt(yearMonthDay[1]) - 1, parseInt(yearMonthDay[2]), parseInt(hourMinuteSecond[0]) + hourInt, parseInt(hourMinuteSecond[1]) + minuteInt);
100
+ return newDate;
101
+ }
102
+ else if (this.isDateInstance(dirtyDateMeasurement)) {
103
+ return dirtyDateMeasurement;
104
+ }
105
+ else {
106
+ throw new Error("Not Conversion Date in parseDatefromDB");
107
+ }
108
+ }
109
+ isDateFromServer(date) {
110
+ const isoDateFormat = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,7})?(Z)?$/;
111
+ return typeof date === 'string' && isoDateFormat.test(date);
112
+ }
113
+ isDateInstance(date) {
114
+ return date instanceof Date;
115
+ }
116
+ parseDatefromDBMilliseconds(dirtyDateMeasurement) {
117
+ let dirtyDate = dirtyDateMeasurement.toString().split("T");
118
+ let dirtyHour = dirtyDate[1].split(".");
119
+ let yearMonthDay = dirtyDate[0].split("-");
120
+ let hourMinuteSecond = dirtyHour[0].split(":");
121
+ let date = new Date(parseInt(yearMonthDay[0]), parseInt(yearMonthDay[1]) - 1, parseInt(yearMonthDay[2]), parseInt(hourMinuteSecond[0]), parseInt(hourMinuteSecond[1]));
122
+ let gmtString = date.toString().split(" ")[5].split("T")[1];
123
+ let hour = "";
124
+ let minute = "";
125
+ for (let j = 0; j < gmtString.length; j++) {
126
+ if (j == 0) {
127
+ hour += gmtString[j];
128
+ minute += gmtString[j];
129
+ }
130
+ if (j > 0 && j < 3) {
131
+ hour += gmtString[j];
132
+ }
133
+ if (j > 2) {
134
+ minute += gmtString[j];
135
+ }
136
+ }
137
+ let hourInt = parseInt(hour);
138
+ let minuteInt = parseInt(minute);
139
+ let newDate = new Date(parseInt(yearMonthDay[0]), parseInt(yearMonthDay[1]) - 1, parseInt(yearMonthDay[2]), parseInt(hourMinuteSecond[0]) + hourInt, parseInt(hourMinuteSecond[1]) + minuteInt, parseInt(hourMinuteSecond[2]), parseInt(dirtyHour[1]));
140
+ return newDate;
141
+ }
142
+ prepareHourforDB(dirtyHour) {
143
+ let hourMinutes = dirtyHour.toString().split(":");
144
+ let date = new Date();
145
+ date.setHours(parseInt(hourMinutes[0]));
146
+ date.setMinutes(parseInt(hourMinutes[1]));
147
+ date.setSeconds(0);
148
+ date.setMilliseconds(0);
149
+ return date;
150
+ }
151
+ parseForHour(allMinutes) {
152
+ let dirtyHours = allMinutes / 60;
153
+ let hours = Math.floor(dirtyHours);
154
+ let dirtyMinutes = dirtyHours - hours;
155
+ let minutes = this.roundDecimals(dirtyMinutes * 0.6, 2);
156
+ let finalHours = hours + minutes;
157
+ return finalHours;
158
+ }
159
+ //#endregion datetime
160
+ /**
161
+ * Rounds a number to the our preferred number of decimal places.
162
+ * @param number the number we want to round
163
+ * @param decimals how many decimal places we want the rounded number to have
164
+ * @returns the rounded number
165
+ */
166
+ roundDecimals(number, decimals) {
167
+ return Number(number.toFixed(decimals));
168
+ }
169
+ }
170
+ dbDateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: dbDateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
171
+ dbDateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: dbDateService, providedIn: "root" });
172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: dbDateService, decorators: [{
173
+ type: Injectable,
174
+ args: [{
175
+ providedIn: "root",
176
+ }]
177
+ }] });
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGItZGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvc2VydmljZXMvZGItZGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTNDLE1BQU0sT0FBTyxhQUFhO0lBRXRCLGtCQUFrQjtJQUNsQjs7T0FFRztJQUNILFNBQVMsQ0FBQyxJQUFVO1FBQ2hCLElBQUksT0FBTyxHQUFXLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QyxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLElBQUksY0FBc0IsQ0FBQztRQUMzQixJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUU7WUFDZixjQUFjLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUM5QzthQUFNO1lBQ0gsY0FBYyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN4QztRQUNELElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxJQUFJLFlBQW9CLENBQUM7UUFDekIsSUFBSSxNQUFNLEdBQUcsRUFBRSxFQUFFO1lBQ2IsWUFBWSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDMUM7YUFBTTtZQUNILFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDcEM7UUFDRCxJQUFJLE9BQU8sR0FBVyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEMsSUFBSSxhQUFxQixDQUFDO1FBQzFCLElBQUksT0FBTyxHQUFHLEVBQUUsRUFBRTtZQUNkLGFBQWEsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQzVD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Ozs7OztPQUtHO0lBQ0gsYUFBYSxDQUFDLE1BQWMsRUFBRSxRQUFnQjtRQUMxQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7MkdBNUtRLGFBQWE7K0dBQWIsYUFBYSxjQUZWLE1BQU07NEZBRVQsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxuICB9KVxyXG5leHBvcnQgY2xhc3MgZGJEYXRlU2VydmljZSB7XHJcblxyXG4gICAgLy8jcmVnaW9uIGRhdGV0aW1lXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlIGRhdGUgdG8gdmlzdWFsaXplIGFzIGEgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHBhcnNlRGF0ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbmV3WWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgIGxldCBuZXdNb250aDogbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTtcclxuICAgICAgICBsZXQgbmV3TW9udGhTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAobmV3TW9udGggPCAxMCkge1xyXG4gICAgICAgICAgICBuZXdNb250aFN0cmluZyA9IFwiMFwiICsgbmV3TW9udGgudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdNb250aFN0cmluZyA9IG5ld01vbnRoLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBuZXdEYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgIGxldCBuZXdEYXlTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAobmV3RGF5IDwgMTApIHtcclxuICAgICAgICAgICAgbmV3RGF5U3RyaW5nID0gXCIwXCIgKyBuZXdEYXkudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdEYXlTdHJpbmcgPSBuZXdEYXkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG5ld0hvdXI6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKTtcclxuICAgICAgICBsZXQgbmV3SG91clN0cmluZzogc3RyaW5nO1xyXG4gICAgICAgIGlmIChuZXdIb3VyIDwgMTApIHtcclxuICAgICAgICAgICAgbmV3SG91clN0cmluZyA9IFwiMFwiICsgbmV3SG91ci50b1N0cmluZygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5ld0hvdXJTdHJpbmcgPSBuZXdIb3VyLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBuZXdNaW51dGU6IG51bWJlciA9IGRhdGUuZ2V0TWludXRlcygpO1xyXG4gICAgICAgIGxldCBuZXdNaW51dGVTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAobmV3TWludXRlIDwgMTApIHtcclxuICAgICAgICAgICAgbmV3TWludXRlU3RyaW5nID0gXCIwXCIgKyBuZXdNaW51dGUudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdNaW51dGVTdHJpbmcgPSBuZXdNaW51dGUudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRhdGVTdHJpbmcgPSBuZXdEYXlTdHJpbmcgKyBcIi9cIiArIG5ld01vbnRoU3RyaW5nICsgXCIvXCIgKyBuZXdZZWFyLnRvU3RyaW5nKCkgKyBcIiBcIiArIG5ld0hvdXJTdHJpbmcgKyBcIjpcIiArIG5ld01pbnV0ZVN0cmluZztcclxuICAgICAgICByZXR1cm4gZGF0ZVN0cmluZ1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlVGltZShkYXRlOiBEYXRlKTogc3RyaW5nIHsgLy8gcGFyc2UgZGF0ZSB0byBnZXQgb25seSB0aGUgdGltZVxyXG4gICAgICAgIGxldCBuZXdIb3VyOiBudW1iZXIgPSBkYXRlLmdldEhvdXJzKCk7XHJcbiAgICAgICAgbGV0IG5ld0hvdXJTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAobmV3SG91ciA8IDEwKSB7XHJcbiAgICAgICAgICAgIG5ld0hvdXJTdHJpbmcgPSBcIjBcIiArIG5ld0hvdXIudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdIb3VyU3RyaW5nID0gbmV3SG91ci50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbmV3TWludXRlOiBudW1iZXIgPSBkYXRlLmdldE1pbnV0ZXMoKTtcclxuICAgICAgICBsZXQgbmV3TWludXRlU3RyaW5nOiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKG5ld01pbnV0ZSA8IDEwKSB7XHJcbiAgICAgICAgICAgIG5ld01pbnV0ZVN0cmluZyA9IFwiMFwiICsgbmV3TWludXRlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbmV3TWludXRlU3RyaW5nID0gbmV3TWludXRlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0aW1lU3RyaW5nID0gbmV3SG91clN0cmluZyArIFwiOlwiICsgbmV3TWludXRlU3RyaW5nO1xyXG4gICAgICAgIHJldHVybiB0aW1lU3RyaW5nXHJcbiAgICB9XHJcblxyXG4gICAgYWRkWmVyb2VzT25EYXRhKG51bWVybzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbnVtZXJvc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBpZiAobnVtZXJvIDwgMTApIHtcclxuICAgICAgICAgICAgbnVtZXJvc3RyaW5nID0gXCIwXCIgKyBudW1lcm8udG9TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBudW1lcm9zdHJpbmcgPSBudW1lcm8udG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bWVyb3N0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZURhdGVmcm9tREIoZGlydHlEYXRlTWVhc3VyZW1lbnQpOiBEYXRlIHtcclxuICAgICAgICBpZiAodGhpcy5pc0RhdGVGcm9tU2VydmVyKGRpcnR5RGF0ZU1lYXN1cmVtZW50KSkge1xyXG4gICAgICAgICAgICBsZXQgZGlydHlEYXRlOiBzdHJpbmdbXSA9IGRpcnR5RGF0ZU1lYXN1cmVtZW50LnRvU3RyaW5nKCkuc3BsaXQoXCJUXCIpO1xyXG4gICAgICAgICAgICBsZXQgZGlydHlIb3VyOiBzdHJpbmdbXSA9IGRpcnR5RGF0ZVsxXS5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgICAgIGxldCB5ZWFyTW9udGhEYXk6IHN0cmluZ1tdID0gZGlydHlEYXRlWzBdLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICAgICAgbGV0IGhvdXJNaW51dGVTZWNvbmQ6IHN0cmluZ1tdID0gZGlydHlIb3VyWzBdLnNwbGl0KFwiOlwiKTtcclxuICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZShwYXJzZUludCh5ZWFyTW9udGhEYXlbMF0pLCBwYXJzZUludCh5ZWFyTW9udGhEYXlbMV0pIC0gMSwgcGFyc2VJbnQoeWVhck1vbnRoRGF5WzJdKSwgcGFyc2VJbnQoaG91ck1pbnV0ZVNlY29uZFswXSksIHBhcnNlSW50KGhvdXJNaW51dGVTZWNvbmRbMV0pKTtcclxuICAgICAgICAgICAgbGV0IGdtdFN0cmluZyA9IGRhdGUudG9TdHJpbmcoKS5zcGxpdChcIiBcIilbNV0uc3BsaXQoXCJUXCIpWzFdO1xyXG4gICAgICAgICAgICBsZXQgaG91cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgbGV0IG1pbnV0ZTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBnbXRTdHJpbmcubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChqID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBob3VyICs9IGdtdFN0cmluZ1tqXTtcclxuICAgICAgICAgICAgICAgICAgICBtaW51dGUgKz0gZ210U3RyaW5nW2pdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGogPiAwICYmIGogPCAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaG91ciArPSBnbXRTdHJpbmdbal07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaiA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW51dGUgKz0gZ210U3RyaW5nW2pdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBob3VySW50ID0gcGFyc2VJbnQoaG91cik7XHJcbiAgICAgICAgICAgIGxldCBtaW51dGVJbnQgPSBwYXJzZUludChtaW51dGUpO1xyXG4gICAgICAgICAgICBsZXQgbmV3RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KHllYXJNb250aERheVswXSksIHBhcnNlSW50KHllYXJNb250aERheVsxXSkgLSAxLCBwYXJzZUludCh5ZWFyTW9udGhEYXlbMl0pLCBwYXJzZUludChob3VyTWludXRlU2Vjb25kWzBdKSArIGhvdXJJbnQsIHBhcnNlSW50KGhvdXJNaW51dGVTZWNvbmRbMV0pICsgbWludXRlSW50KTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld0RhdGVcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc0RhdGVJbnN0YW5jZShkaXJ0eURhdGVNZWFzdXJlbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRpcnR5RGF0ZU1lYXN1cmVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IENvbnZlcnNpb24gRGF0ZSBpbiBwYXJzZURhdGVmcm9tREJcIilcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlzRGF0ZUZyb21TZXJ2ZXIoZGF0ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgaXNvRGF0ZUZvcm1hdCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezEsN30pPyhaKT8kLztcclxuICAgICAgICByZXR1cm4gdHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnICYmIGlzb0RhdGVGb3JtYXQudGVzdChkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0RhdGVJbnN0YW5jZShkYXRlOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZGF0ZSBpbnN0YW5jZW9mIERhdGU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHBhcnNlRGF0ZWZyb21EQk1pbGxpc2Vjb25kcyhkaXJ0eURhdGVNZWFzdXJlbWVudCk6IERhdGUgeyAvL2dldCBhIGRhdGUgR01UIGluIGFuZ3VsYXIgZm9ybWF0IGZyb20gREIgKG1pbGxpc2Vjb25kIHByZWNpc2lvbilcclxuICAgICAgICBsZXQgZGlydHlEYXRlOiBzdHJpbmdbXSA9IGRpcnR5RGF0ZU1lYXN1cmVtZW50LnRvU3RyaW5nKCkuc3BsaXQoXCJUXCIpO1xyXG4gICAgICAgIGxldCBkaXJ0eUhvdXI6IHN0cmluZ1tdID0gZGlydHlEYXRlWzFdLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBsZXQgeWVhck1vbnRoRGF5OiBzdHJpbmdbXSA9IGRpcnR5RGF0ZVswXS5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgbGV0IGhvdXJNaW51dGVTZWNvbmQ6IHN0cmluZ1tdID0gZGlydHlIb3VyWzBdLnNwbGl0KFwiOlwiKTtcclxuICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KHllYXJNb250aERheVswXSksIHBhcnNlSW50KHllYXJNb250aERheVsxXSkgLSAxLCBwYXJzZUludCh5ZWFyTW9udGhEYXlbMl0pLCBwYXJzZUludChob3VyTWludXRlU2Vjb25kWzBdKSwgcGFyc2VJbnQoaG91ck1pbnV0ZVNlY29uZFsxXSkpO1xyXG4gICAgICAgIGxldCBnbXRTdHJpbmcgPSBkYXRlLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpWzVdLnNwbGl0KFwiVFwiKVsxXTtcclxuICAgICAgICBsZXQgaG91cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBsZXQgbWludXRlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ210U3RyaW5nLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGlmIChqID09IDApIHtcclxuICAgICAgICAgICAgICAgIGhvdXIgKz0gZ210U3RyaW5nW2pdO1xyXG4gICAgICAgICAgICAgICAgbWludXRlICs9IGdtdFN0cmluZ1tqXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaiA+IDAgJiYgaiA8IDMpIHtcclxuICAgICAgICAgICAgICAgIGhvdXIgKz0gZ210U3RyaW5nW2pdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChqID4gMikge1xyXG4gICAgICAgICAgICAgICAgbWludXRlICs9IGdtdFN0cmluZ1tqXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaG91ckludCA9IHBhcnNlSW50KGhvdXIpO1xyXG4gICAgICAgIGxldCBtaW51dGVJbnQgPSBwYXJzZUludChtaW51dGUpO1xyXG4gICAgICAgIGxldCBuZXdEYXRlOiBEYXRlID0gbmV3IERhdGUocGFyc2VJbnQoeWVhck1vbnRoRGF5WzBdKSwgcGFyc2VJbnQoeWVhck1vbnRoRGF5WzFdKSAtIDEsIHBhcnNlSW50KHllYXJNb250aERheVsyXSksIHBhcnNlSW50KGhvdXJNaW51dGVTZWNvbmRbMF0pICsgaG91ckludCwgcGFyc2VJbnQoaG91ck1pbnV0ZVNlY29uZFsxXSkgKyBtaW51dGVJbnQsIHBhcnNlSW50KGhvdXJNaW51dGVTZWNvbmRbMl0pLCBwYXJzZUludChkaXJ0eUhvdXJbMV0pKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ld0RhdGVcclxuICAgIH1cclxuXHJcbiAgICBwcmVwYXJlSG91cmZvckRCKGRpcnR5SG91cjogRGF0ZSk6IERhdGUge1xyXG4gICAgICAgIGxldCBob3VyTWludXRlcyA9IGRpcnR5SG91ci50b1N0cmluZygpLnNwbGl0KFwiOlwiKVxyXG4gICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICBkYXRlLnNldEhvdXJzKHBhcnNlSW50KGhvdXJNaW51dGVzWzBdKSlcclxuICAgICAgICBkYXRlLnNldE1pbnV0ZXMocGFyc2VJbnQoaG91ck1pbnV0ZXNbMV0pKVxyXG4gICAgICAgIGRhdGUuc2V0U2Vjb25kcygwKVxyXG4gICAgICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKDApXHJcbiAgICAgICAgcmV0dXJuIGRhdGVcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZUZvckhvdXIoYWxsTWludXRlczogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgZGlydHlIb3VycyA9IGFsbE1pbnV0ZXMgLyA2MDtcclxuICAgICAgICBsZXQgaG91cnMgPSBNYXRoLmZsb29yKGRpcnR5SG91cnMpO1xyXG4gICAgICAgIGxldCBkaXJ0eU1pbnV0ZXMgPSBkaXJ0eUhvdXJzIC0gaG91cnM7XHJcbiAgICAgICAgbGV0IG1pbnV0ZXMgPSB0aGlzLnJvdW5kRGVjaW1hbHMoZGlydHlNaW51dGVzICogMC42LCAyKTtcclxuICAgICAgICBsZXQgZmluYWxIb3VycyA9IGhvdXJzICsgbWludXRlcztcclxuICAgICAgICByZXR1cm4gZmluYWxIb3Vyc1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uIGRhdGV0aW1lXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUm91bmRzIGEgbnVtYmVyIHRvIHRoZSBvdXIgcHJlZmVycmVkIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy5cclxuICAgICAqIEBwYXJhbSBudW1iZXIgdGhlIG51bWJlciB3ZSB3YW50IHRvIHJvdW5kXHJcbiAgICAgKiBAcGFyYW0gZGVjaW1hbHMgaG93IG1hbnkgZGVjaW1hbCBwbGFjZXMgd2Ugd2FudCB0aGUgcm91bmRlZCBudW1iZXIgdG8gaGF2ZVxyXG4gICAgICogQHJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyXHJcbiAgICAgKi9cclxuICAgIHJvdW5kRGVjaW1hbHMobnVtYmVyOiBudW1iZXIsIGRlY2ltYWxzOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIobnVtYmVyLnRvRml4ZWQoZGVjaW1hbHMpKTtcclxuICAgIH1cclxufSJdfQ==