ps-toolkit-ui 1.21.42 → 1.21.67
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/bundles/ps-toolkit-ui.umd.js +10322 -0
- package/bundles/ps-toolkit-ui.umd.js.map +1 -0
- package/bundles/ps-toolkit-ui.umd.min.js +2 -0
- package/bundles/ps-toolkit-ui.umd.min.js.map +1 -0
- package/esm2015/lib/classes/addModal.class.js +36 -0
- package/esm2015/lib/classes/chart.class.js +165 -0
- package/esm2015/lib/classes/currentDataClass.js +17 -0
- package/esm2015/lib/classes/enum.class.js +253 -0
- package/esm2015/lib/classes/excel.class.js +56 -0
- package/esm2015/lib/classes/form.class.js +667 -0
- package/esm2015/lib/classes/header.class.js +16 -0
- package/esm2015/lib/classes/helper.class.js +650 -0
- package/esm2015/lib/classes/lang.class.js +35 -0
- package/esm2015/lib/classes/login.class.js +29 -0
- package/esm2015/lib/classes/modal.class.js +49 -0
- package/esm2015/lib/classes/permission.class.js +63 -0
- package/esm2015/lib/classes/request.class.js +155 -0
- package/esm2015/lib/classes/safehtml.class.js +17 -0
- package/esm2015/lib/classes/safestyle.class.js +17 -0
- package/esm2015/lib/classes/sidebar.class.js +16 -0
- package/esm2015/lib/classes/steps.class.js +45 -0
- package/esm2015/lib/classes/string.class.js +251 -0
- package/esm2015/lib/classes/table.class.js +593 -0
- package/esm2015/lib/components/accordion/accordion.component.js +45 -0
- package/esm2015/lib/components/alert/alert.component.js +39 -0
- package/esm2015/lib/components/base.component.js +54 -0
- package/esm2015/lib/components/calendar/calendar.component.js +98 -0
- package/esm2015/lib/components/chart/chart.component.js +17 -0
- package/esm2015/lib/components/clock/clock.component.js +33 -0
- package/esm2015/lib/components/confirm/confirm.component.js +50 -0
- package/esm2015/lib/components/error/error.component.js +26 -0
- package/esm2015/lib/components/footer/footer.component.js +23 -0
- package/esm2015/lib/components/form/bank-card/form.bank-card.component.js +200 -0
- package/esm2015/lib/components/form/button/form.button.component.js +68 -0
- package/esm2015/lib/components/form/checkbox/form.checkbox.component.js +67 -0
- package/esm2015/lib/components/form/ckeditor/form.ckeditor.component.js +90 -0
- package/esm2015/lib/components/form/date/form.date.component.js +314 -0
- package/esm2015/lib/components/form/datetime/form.datetime.component.js +106 -0
- package/esm2015/lib/components/form/file/form.file.component.js +124 -0
- package/esm2015/lib/components/form/finger/form.finger.component.js +140 -0
- package/esm2015/lib/components/form/hidden/form.hidden.component.js +31 -0
- package/esm2015/lib/components/form/icon/form.icon.component.js +84 -0
- package/esm2015/lib/components/form/index/form.component.js +51 -0
- package/esm2015/lib/components/form/label/form.label.component.js +32 -0
- package/esm2015/lib/components/form/plaque/form.plaque.component.js +258 -0
- package/esm2015/lib/components/form/plaque/select/form.plaque.select.component.js +468 -0
- package/esm2015/lib/components/form/radio/form.radio.component.js +82 -0
- package/esm2015/lib/components/form/select/form.select.component.js +452 -0
- package/esm2015/lib/components/form/select/item/form.select.item.component.js +27 -0
- package/esm2015/lib/components/form/slide/form.slide.component.js +84 -0
- package/esm2015/lib/components/form/star/form.star.component.js +66 -0
- package/esm2015/lib/components/form/table/form.table.component.js +96 -0
- package/esm2015/lib/components/form/tag/form.tag.component.js +100 -0
- package/esm2015/lib/components/form/textarea/form.textarea.component.js +83 -0
- package/esm2015/lib/components/form/textbox/form.textbox.component.js +227 -0
- package/esm2015/lib/components/form/time/form.time.component.js +149 -0
- package/esm2015/lib/components/form/toggle/form.toggle.component.js +72 -0
- package/esm2015/lib/components/form/tree/form.tree.component.js +157 -0
- package/esm2015/lib/components/form/tree/item/form.tree.item.component.js +50 -0
- package/esm2015/lib/components/form/uploader/form.uploader.component.js +159 -0
- package/esm2015/lib/components/form/vehicle/form.vehicle.component.js +104 -0
- package/esm2015/lib/components/form/vehicle/search/form.vehicle.search.component.js +237 -0
- package/esm2015/lib/components/header/header.component.js +28 -0
- package/esm2015/lib/components/header/sub/sub.header.component.js +14 -0
- package/esm2015/lib/components/layout/layout.component.js +18 -0
- package/esm2015/lib/components/loading/loading.component.js +22 -0
- package/esm2015/lib/components/login/login.component.js +159 -0
- package/esm2015/lib/components/modal/modal.component.js +25 -0
- package/esm2015/lib/components/notfound/notfound.component.js +29 -0
- package/esm2015/lib/components/notification/notification.component.js +14 -0
- package/esm2015/lib/components/sidebar/item/sidebar.item.component.js +55 -0
- package/esm2015/lib/components/sidebar/sidebar.component.js +98 -0
- package/esm2015/lib/components/steps/steps.component.js +88 -0
- package/esm2015/lib/components/table/loading/table.loading.component.js +17 -0
- package/esm2015/lib/components/table/pagination/table.pagination.component.js +84 -0
- package/esm2015/lib/components/table/row/table.row.component.js +451 -0
- package/esm2015/lib/components/table/table.component.js +240 -0
- package/esm2015/lib/components/tooltip/tooltip.component.js +19 -0
- package/esm2015/lib/ps-toolkit-ui.module.js +105 -0
- package/esm2015/lib/services/config.service.js +14 -0
- package/esm2015/lib/services/sidebar.service.js +21 -0
- package/esm2015/ps-toolkit-ui.js +21 -0
- package/esm2015/public-api.js +64 -0
- package/fesm2015/ps-toolkit-ui.js +8927 -0
- package/fesm2015/ps-toolkit-ui.js.map +1 -0
- package/lib/classes/addModal.class.d.ts +14 -0
- package/lib/classes/chart.class.d.ts +15 -0
- package/lib/classes/currentDataClass.d.ts +10 -0
- package/lib/classes/enum.class.d.ts +221 -0
- package/lib/classes/excel.class.d.ts +8 -0
- package/lib/classes/form.class.d.ts +193 -0
- package/lib/classes/header.class.d.ts +8 -0
- package/lib/classes/helper.class.d.ts +50 -0
- package/lib/classes/lang.class.d.ts +5 -0
- package/lib/classes/login.class.d.ts +21 -0
- package/lib/classes/modal.class.d.ts +19 -0
- package/lib/classes/permission.class.d.ts +35 -0
- package/lib/classes/request.class.d.ts +10 -0
- package/lib/classes/safehtml.class.d.ts +7 -0
- package/lib/classes/safestyle.class.d.ts +7 -0
- package/lib/classes/sidebar.class.d.ts +14 -0
- package/lib/classes/steps.class.d.ts +31 -0
- package/lib/classes/string.class.d.ts +249 -0
- package/lib/classes/table.class.d.ts +88 -0
- package/lib/components/accordion/accordion.component.d.ts +7 -0
- package/lib/components/alert/alert.component.d.ts +10 -0
- package/lib/components/base.component.d.ts +17 -0
- package/lib/components/calendar/calendar.component.d.ts +26 -0
- package/lib/components/chart/chart.component.d.ts +5 -0
- package/lib/components/clock/clock.component.d.ts +11 -0
- package/lib/components/confirm/confirm.component.d.ts +14 -0
- package/lib/components/error/error.component.d.ts +7 -0
- package/lib/components/footer/footer.component.d.ts +6 -0
- package/lib/components/form/bank-card/form.bank-card.component.d.ts +28 -0
- package/lib/components/form/button/form.button.component.d.ts +15 -0
- package/lib/components/form/checkbox/form.checkbox.component.d.ts +14 -0
- package/lib/components/form/ckeditor/form.ckeditor.component.d.ts +14 -0
- package/lib/components/form/date/form.date.component.d.ts +45 -0
- package/lib/components/form/datetime/form.datetime.component.d.ts +13 -0
- package/lib/components/form/file/form.file.component.d.ts +18 -0
- package/lib/components/form/finger/form.finger.component.d.ts +15 -0
- package/lib/components/form/hidden/form.hidden.component.d.ts +7 -0
- package/lib/components/form/icon/form.icon.component.d.ts +16 -0
- package/lib/components/form/index/form.component.d.ts +10 -0
- package/lib/components/form/label/form.label.component.d.ts +8 -0
- package/lib/components/form/plaque/form.plaque.component.d.ts +21 -0
- package/lib/components/form/plaque/select/form.plaque.select.component.d.ts +38 -0
- package/lib/components/form/radio/form.radio.component.d.ts +13 -0
- package/lib/components/form/select/form.select.component.d.ts +45 -0
- package/lib/components/form/select/item/form.select.item.component.d.ts +12 -0
- package/lib/components/form/slide/form.slide.component.d.ts +13 -0
- package/lib/components/form/star/form.star.component.d.ts +13 -0
- package/lib/components/form/table/form.table.component.d.ts +9 -0
- package/lib/components/form/tag/form.tag.component.d.ts +16 -0
- package/lib/components/form/textarea/form.textarea.component.d.ts +13 -0
- package/lib/components/form/textbox/form.textbox.component.d.ts +20 -0
- package/lib/components/form/time/form.time.component.d.ts +25 -0
- package/lib/components/form/toggle/form.toggle.component.d.ts +13 -0
- package/lib/components/form/tree/form.tree.component.d.ts +21 -0
- package/lib/components/form/tree/item/form.tree.item.component.d.ts +19 -0
- package/lib/components/form/uploader/form.uploader.component.d.ts +21 -0
- package/lib/components/form/vehicle/form.vehicle.component.d.ts +18 -0
- package/lib/components/form/vehicle/search/form.vehicle.search.component.d.ts +22 -0
- package/lib/components/header/header.component.d.ts +10 -0
- package/lib/components/header/sub/sub.header.component.d.ts +3 -0
- package/lib/components/layout/layout.component.d.ts +7 -0
- package/lib/components/loading/loading.component.d.ts +5 -0
- package/lib/components/login/login.component.d.ts +15 -0
- package/lib/components/modal/modal.component.d.ts +9 -0
- package/lib/components/notfound/notfound.component.d.ts +8 -0
- package/lib/components/notification/notification.component.d.ts +3 -0
- package/lib/components/sidebar/item/sidebar.item.component.d.ts +14 -0
- package/lib/components/sidebar/sidebar.component.d.ts +22 -0
- package/lib/components/steps/steps.component.d.ts +16 -0
- package/lib/components/table/loading/table.loading.component.d.ts +5 -0
- package/lib/components/table/pagination/table.pagination.component.d.ts +15 -0
- package/lib/components/table/row/table.row.component.d.ts +44 -0
- package/lib/components/table/table.component.d.ts +43 -0
- package/lib/components/tooltip/tooltip.component.d.ts +5 -0
- package/lib/ps-toolkit-ui.module.d.ts +4 -0
- package/lib/services/config.service.d.ts +6 -0
- package/lib/services/sidebar.service.d.ts +9 -0
- package/package.json +12 -16
- package/ps-toolkit-ui.d.ts +20 -0
- package/ps-toolkit-ui.metadata.json +1 -0
- package/public-api.d.ts +60 -0
- package/fesm2022/ps-toolkit-ui.mjs +0 -9472
- package/fesm2022/ps-toolkit-ui.mjs.map +0 -1
- package/types/ps-toolkit-ui.d.ts +0 -1671
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
import { InputError, InputType, PermissionAccessTypeEnum, PermissionInputActionEnum, PermissionInputTypeEnum, PermissionTypeEnum } from './enum.class';
|
|
2
|
+
import * as moment from 'jalali-moment';
|
|
3
|
+
import * as $ from 'jquery';
|
|
4
|
+
import * as _ from 'lodash';
|
|
5
|
+
import { PermissionClass } from './permission.class';
|
|
6
|
+
// @dynamic
|
|
7
|
+
export class HelperClass {
|
|
8
|
+
static getLabel(inp) {
|
|
9
|
+
const n = inp.label != null ? inp.label : inp.name;
|
|
10
|
+
if (inp.error === InputError.Required) {
|
|
11
|
+
return inp.l('FormErrorRequired', n);
|
|
12
|
+
}
|
|
13
|
+
else if (inp.error === InputError.Invalid) {
|
|
14
|
+
return inp.l('FormErrorInvalid', n);
|
|
15
|
+
}
|
|
16
|
+
else if (inp.error === InputError.Length) {
|
|
17
|
+
return inp.l('FormErrorLength', [n, inp.minLength]);
|
|
18
|
+
}
|
|
19
|
+
else if (inp.error === InputError.MinLength) {
|
|
20
|
+
return inp.l('FormErrorMinLength', [n, inp.minLength]);
|
|
21
|
+
}
|
|
22
|
+
else if (inp.error === InputError.MaxLength) {
|
|
23
|
+
return inp.l('FormErrorMaxLength', [n, inp.maxLength]);
|
|
24
|
+
}
|
|
25
|
+
else if (inp.error === InputError.MinAmount) {
|
|
26
|
+
return inp.l('FormErrorMinAmount', [n, inp.minLength]);
|
|
27
|
+
}
|
|
28
|
+
else if (inp.error === InputError.MaxAmount) {
|
|
29
|
+
return inp.l('FormErrorMaxAmount', [n, inp.maxLength]);
|
|
30
|
+
}
|
|
31
|
+
else if (inp.error === InputError.Expired) {
|
|
32
|
+
return inp.l('FormErrorExpired', n);
|
|
33
|
+
}
|
|
34
|
+
else if (inp.error === InputError.Wrong) {
|
|
35
|
+
return inp.l('FormErrorWrong', n);
|
|
36
|
+
}
|
|
37
|
+
else if (inp.error === InputError.Error) {
|
|
38
|
+
return inp.l('FormError', n);
|
|
39
|
+
}
|
|
40
|
+
else if (inp.error === InputError.NotMatch) {
|
|
41
|
+
return inp.l('FormErrorNotMatch', inp.match.name);
|
|
42
|
+
}
|
|
43
|
+
else if (inp.error === InputError.Exist) {
|
|
44
|
+
return inp.l('FormErrorExist', n);
|
|
45
|
+
}
|
|
46
|
+
else if (inp.error === InputError.NotExist) {
|
|
47
|
+
return inp.l('FormErrorNotExist', n);
|
|
48
|
+
}
|
|
49
|
+
else if (inp.error === InputError.NotAllowed) {
|
|
50
|
+
return inp.l('FormErrorNotAllowed', [n, inp.allowed.join(', ')]);
|
|
51
|
+
}
|
|
52
|
+
else if (inp.error === InputError.MaxContent) {
|
|
53
|
+
return inp.l('FormErrorMaxContent', [n, inp.maxLength]);
|
|
54
|
+
}
|
|
55
|
+
else if (inp.error === InputError.Upload) {
|
|
56
|
+
return inp.l('FormErrorUpload', n);
|
|
57
|
+
}
|
|
58
|
+
const desc = inp.description !== null ? ' (' + inp.l(inp.description) + ')' : '';
|
|
59
|
+
return inp.l(n) + desc;
|
|
60
|
+
}
|
|
61
|
+
static nationalCodeNumValid(c) {
|
|
62
|
+
return HelperClass.nationalCodeValid(c) || HelperClass.nationalNumValid(c);
|
|
63
|
+
}
|
|
64
|
+
static economicNumValid(c) {
|
|
65
|
+
if (!c) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return c.length === 11 || (c.length === 14 && HelperClass.nationalCodeValid(c.substr(0, 10)));
|
|
69
|
+
}
|
|
70
|
+
static nationalCodeValid(c) {
|
|
71
|
+
if (!RegExp(/^\d{10}$/).test(c) || RegExp(/^(.)\1+$/).test(c)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
const check = parseInt(c[9], 10);
|
|
75
|
+
let sum = 0;
|
|
76
|
+
for (let i = 0; i < 9; ++i) {
|
|
77
|
+
sum += parseInt(c[i], 10) * (10 - i);
|
|
78
|
+
}
|
|
79
|
+
sum %= 11;
|
|
80
|
+
return (sum < 2 && check === sum) || (sum >= 2 && check + sum === 11);
|
|
81
|
+
}
|
|
82
|
+
static nationalNumValid(code) {
|
|
83
|
+
const l = code.length;
|
|
84
|
+
if (l < 11 || parseInt(code, 10) === 0) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
if (parseInt(code.substr(3, 6), 10) === 0) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
const c = parseInt(code.substr(10, 1), 10);
|
|
91
|
+
const d = parseInt(code.substr(9, 1), 10) + 2;
|
|
92
|
+
const z = [29, 27, 23, 19, 17];
|
|
93
|
+
let s = 0;
|
|
94
|
+
for (let i = 0; i < 10; i++) {
|
|
95
|
+
s += (d + parseInt(code.substr(i, 1), 10)) * z[i % 5];
|
|
96
|
+
}
|
|
97
|
+
s = s % 11;
|
|
98
|
+
if (s === 10) {
|
|
99
|
+
s = 0;
|
|
100
|
+
}
|
|
101
|
+
return c === s;
|
|
102
|
+
}
|
|
103
|
+
static plaqueValid(p, t) {
|
|
104
|
+
if (t === InputType.Plaque && !RegExp(/^[0-9]{2}_[ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]_[0-9]{3}_[0-9]{2}$/).test(p)) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
else if (t === InputType.PlaqueM && !RegExp(/^[0-9]{3}_[0-9]{5}$/).test(p)) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
static iso7064Mod97_10(iban) {
|
|
113
|
+
let remainder = iban;
|
|
114
|
+
while (remainder.length > 2) {
|
|
115
|
+
const block = remainder.slice(0, 9);
|
|
116
|
+
remainder = parseInt(block, 10) % 97 + remainder.slice(block.length);
|
|
117
|
+
}
|
|
118
|
+
return parseInt(remainder, 10) % 97;
|
|
119
|
+
}
|
|
120
|
+
static shebaValid(str) {
|
|
121
|
+
const pattern = /IR[0-9]{24}/;
|
|
122
|
+
if (!str.startsWith('IR')) {
|
|
123
|
+
str = 'IR' + str;
|
|
124
|
+
}
|
|
125
|
+
if (str.length !== 26) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
if (!pattern.test(str)) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
let newStr = str.substr(4);
|
|
132
|
+
const d1 = str.charCodeAt(0) - 65 + 10;
|
|
133
|
+
const d2 = str.charCodeAt(1) - 65 + 10;
|
|
134
|
+
newStr += d1.toString() + d2.toString() + str.substr(2, 2);
|
|
135
|
+
return this.iso7064Mod97_10(newStr) === 1;
|
|
136
|
+
}
|
|
137
|
+
static postalCodeValid(c) {
|
|
138
|
+
return RegExp(/^\b(?!(\d)\1{3})[13-9]{5}[0-9]{5}\b$/).test(c);
|
|
139
|
+
}
|
|
140
|
+
static random(length, upper = true, lower = true, num = true) {
|
|
141
|
+
let result = '';
|
|
142
|
+
const characters = `${upper ? 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' : ''}${lower ? 'abcdefghijklmnopqrstuvwxyz' : ''}${num ? '123456789' : ''}`;
|
|
143
|
+
const charactersLength = characters.length;
|
|
144
|
+
for (let i = 0; i < length; i++) {
|
|
145
|
+
result += characters.charAt(Math.floor(Math.random() * charactersLength));
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
static setCookie(name, value, days = 365) {
|
|
150
|
+
let expires = '';
|
|
151
|
+
if (days) {
|
|
152
|
+
const date = new Date();
|
|
153
|
+
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
|
154
|
+
expires = '; expires=' + date.toUTCString();
|
|
155
|
+
}
|
|
156
|
+
document.cookie = name + '=' + (value || '') + expires + '; path=/';
|
|
157
|
+
}
|
|
158
|
+
static getCookie(name, def = null) {
|
|
159
|
+
const nameEQ = name + '=';
|
|
160
|
+
const ca = document.cookie.split(';');
|
|
161
|
+
for (let c of ca) {
|
|
162
|
+
while (c.charAt(0) === ' ') {
|
|
163
|
+
c = c.substring(1, c.length);
|
|
164
|
+
}
|
|
165
|
+
if (c.indexOf(nameEQ) === 0) {
|
|
166
|
+
return c.substring(nameEQ.length, c.length);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return def;
|
|
170
|
+
}
|
|
171
|
+
static eraseCookie(name) {
|
|
172
|
+
document.cookie.split(';')
|
|
173
|
+
.forEach((c) => { document.cookie = c.replace(/^ +/, '').replace(/=.*/, '=;expires=' + new Date().toUTCString() + ';path=/'); });
|
|
174
|
+
}
|
|
175
|
+
static getDateDif(l, dt, c = 2) {
|
|
176
|
+
const d = parseInt(dt.substring(6, dt.length - 2), 10);
|
|
177
|
+
const now = moment.now();
|
|
178
|
+
const dif = (now - d) / 1000;
|
|
179
|
+
const h = Math.floor(dif / 3600);
|
|
180
|
+
const m = Math.floor(dif % 3600 / 60);
|
|
181
|
+
if (h < 24) {
|
|
182
|
+
let r = '';
|
|
183
|
+
if (h > 0) {
|
|
184
|
+
r += l('HourP', h.toString());
|
|
185
|
+
c--;
|
|
186
|
+
}
|
|
187
|
+
if (m > 0 && c > 0) {
|
|
188
|
+
if (r !== '') {
|
|
189
|
+
r += l('And');
|
|
190
|
+
}
|
|
191
|
+
r += l('MinuteP', m.toString());
|
|
192
|
+
}
|
|
193
|
+
r += r !== '' ? '' : l('AFew');
|
|
194
|
+
r += ' ' + l('Ago');
|
|
195
|
+
return r;
|
|
196
|
+
}
|
|
197
|
+
return '<span class="ltr d-ib">' + moment(d).locale('fa').format('jYYYY/jMM/jDD HH:mm') + '</span>';
|
|
198
|
+
}
|
|
199
|
+
static getRowEnum(l, e, dt) {
|
|
200
|
+
const v = e.find(x => x.Value === dt);
|
|
201
|
+
return `<span class="status ${v.Class}">` + l(v.Name) + '</span>';
|
|
202
|
+
}
|
|
203
|
+
static getNow() {
|
|
204
|
+
return moment.now();
|
|
205
|
+
}
|
|
206
|
+
static getInputDate(amount = 0, unit = 'month') {
|
|
207
|
+
return HelperClass.getMoment().add(amount, unit).locale('en').format('YYYY/MM/DD');
|
|
208
|
+
}
|
|
209
|
+
static getMoment(i = null, f = null) {
|
|
210
|
+
if (i == null) {
|
|
211
|
+
return moment();
|
|
212
|
+
}
|
|
213
|
+
return moment(i, f);
|
|
214
|
+
}
|
|
215
|
+
static getDateRemain(l, dt, c = 2) {
|
|
216
|
+
const d = parseInt(dt.substring(6, dt.length - 2), 10);
|
|
217
|
+
const now = moment.now();
|
|
218
|
+
const dif = (d - now) / 1000;
|
|
219
|
+
if (dif <= 0) {
|
|
220
|
+
return l('Ended');
|
|
221
|
+
}
|
|
222
|
+
const h = Math.floor(dif / 3600);
|
|
223
|
+
const m = Math.floor(dif % 3600 / 60);
|
|
224
|
+
if (h < 24) {
|
|
225
|
+
let r = '';
|
|
226
|
+
if (h > 0) {
|
|
227
|
+
r += l('HourP', h.toString());
|
|
228
|
+
c--;
|
|
229
|
+
}
|
|
230
|
+
if (m > 0 && c > 0) {
|
|
231
|
+
if (r !== '') {
|
|
232
|
+
r += l('And');
|
|
233
|
+
}
|
|
234
|
+
r += l('MinuteP', m.toString());
|
|
235
|
+
}
|
|
236
|
+
r += r !== '' ? '' : l('AFew');
|
|
237
|
+
r += ' ' + l('Later');
|
|
238
|
+
return r;
|
|
239
|
+
}
|
|
240
|
+
return '<span class="ltr d-ib">' + moment(d).locale('fa').format('jYYYY/jMM/jDD HH:mm') + '</span>';
|
|
241
|
+
}
|
|
242
|
+
static getDateRemainSec(dt) {
|
|
243
|
+
const d = parseInt(dt.substring(6, dt.length - 2), 10);
|
|
244
|
+
const now = moment.now();
|
|
245
|
+
return (d - now) / 1000;
|
|
246
|
+
}
|
|
247
|
+
static getDateRemainFull(l, dt, c = 2) {
|
|
248
|
+
let now = new Date();
|
|
249
|
+
const d = parseInt(dt.substring(6, dt.length - 2), 10);
|
|
250
|
+
let target = new Date(d);
|
|
251
|
+
let r = '';
|
|
252
|
+
const f = now > target;
|
|
253
|
+
if (f) {
|
|
254
|
+
r += l('Finished') + ' - ';
|
|
255
|
+
const tmp = target;
|
|
256
|
+
target = now;
|
|
257
|
+
now = tmp;
|
|
258
|
+
}
|
|
259
|
+
let years = target.getFullYear() - now.getFullYear();
|
|
260
|
+
let months = target.getMonth() - now.getMonth();
|
|
261
|
+
let days = target.getDate() - now.getDate();
|
|
262
|
+
let hours = target.getHours() - now.getHours();
|
|
263
|
+
let minutes = target.getMinutes() - now.getMinutes();
|
|
264
|
+
const seconds = target.getSeconds() - now.getSeconds();
|
|
265
|
+
if (seconds < 0) {
|
|
266
|
+
minutes--;
|
|
267
|
+
}
|
|
268
|
+
if (minutes < 0) {
|
|
269
|
+
minutes += 60;
|
|
270
|
+
hours--;
|
|
271
|
+
}
|
|
272
|
+
if (hours < 0) {
|
|
273
|
+
hours += 24;
|
|
274
|
+
days--;
|
|
275
|
+
}
|
|
276
|
+
if (days < 0) {
|
|
277
|
+
const prevMonth = new Date(target.getFullYear(), target.getMonth(), 0);
|
|
278
|
+
days += prevMonth.getDate();
|
|
279
|
+
months--;
|
|
280
|
+
}
|
|
281
|
+
if (months < 0) {
|
|
282
|
+
months += 12;
|
|
283
|
+
years--;
|
|
284
|
+
}
|
|
285
|
+
if (years > 0) {
|
|
286
|
+
r += l('YearP', years.toString());
|
|
287
|
+
c--;
|
|
288
|
+
}
|
|
289
|
+
if (months > 0 && c > 0) {
|
|
290
|
+
r += years > 0 ? l('And') : '';
|
|
291
|
+
r += l('MonthP', months.toString());
|
|
292
|
+
c--;
|
|
293
|
+
}
|
|
294
|
+
if (days > 0 && c > 0) {
|
|
295
|
+
r += years > 0 || months > 0 ? l('And') : '';
|
|
296
|
+
r += l('DayP', days.toString());
|
|
297
|
+
c--;
|
|
298
|
+
}
|
|
299
|
+
if (hours > 0 && c > 0) {
|
|
300
|
+
r += years > 0 || months > 0 || days > 0 ? l('And') : '';
|
|
301
|
+
r += l('HourP', hours.toString());
|
|
302
|
+
c--;
|
|
303
|
+
}
|
|
304
|
+
if (minutes > 0 && c > 0) {
|
|
305
|
+
r += years > 0 || months > 0 || days > 0 || hours > 0 ? l('And') : '';
|
|
306
|
+
r += l('MinuteP', minutes.toString());
|
|
307
|
+
c--;
|
|
308
|
+
}
|
|
309
|
+
r += (r !== '' ? '' : l('LessThanMinute')) + ' ' + (f ? l('Ago') : l('Later'));
|
|
310
|
+
return r;
|
|
311
|
+
}
|
|
312
|
+
static getDate(dt, format = 'jYYYY/jMM/jDD', locale = 'fa') {
|
|
313
|
+
try {
|
|
314
|
+
if (dt === null) {
|
|
315
|
+
return '';
|
|
316
|
+
}
|
|
317
|
+
let m;
|
|
318
|
+
if (typeof dt === 'string' && dt.length === 10) {
|
|
319
|
+
m = moment(dt, 'YYYY/MM/DD');
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
m = moment(parseInt(dt.substring(6, dt.length - 2), 10));
|
|
323
|
+
}
|
|
324
|
+
return m.locale(locale).format(format + 'z');
|
|
325
|
+
}
|
|
326
|
+
catch (e) {
|
|
327
|
+
return dt;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
static getTime(dt) {
|
|
331
|
+
try {
|
|
332
|
+
if (dt === null) {
|
|
333
|
+
return '';
|
|
334
|
+
}
|
|
335
|
+
const m = dt.TotalSeconds >= 0 ? 1 : -1;
|
|
336
|
+
const hours = ((dt.Days * m) * 24) + (dt.Hours * m);
|
|
337
|
+
const minute = dt.Minutes * m;
|
|
338
|
+
return `${(hours > 9 ? hours : `0${hours}`)}:${(minute > 9 ? minute : `0${minute}`)}`;
|
|
339
|
+
}
|
|
340
|
+
catch (e) {
|
|
341
|
+
return dt;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
static getDateTime(dt, format = 'jYYYY/jMM/jDD HH:mm') {
|
|
345
|
+
if (dt === null) {
|
|
346
|
+
return '';
|
|
347
|
+
}
|
|
348
|
+
const d = parseInt(dt.substring(6, dt.length - 2), 10);
|
|
349
|
+
return moment(d).locale('fa').format(format);
|
|
350
|
+
}
|
|
351
|
+
static toPrice(l, cv) {
|
|
352
|
+
return !isNaN(parseFloat(cv)) ? '<span class="ltr d-ib m-l-5-p">' + parseFloat(cv).toLocaleString() + '</span>' + l('Rial') : l(cv);
|
|
353
|
+
}
|
|
354
|
+
static getFileSize(bytes) {
|
|
355
|
+
const suffix = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
356
|
+
let dblSByte = bytes;
|
|
357
|
+
let i = 0;
|
|
358
|
+
for (; i < suffix.length && bytes >= 1024; i++, bytes /= 1024) {
|
|
359
|
+
dblSByte = bytes / 1024.0;
|
|
360
|
+
}
|
|
361
|
+
return `${dblSByte.toLocaleString('en-US', {
|
|
362
|
+
minimumFractionDigits: 0,
|
|
363
|
+
maximumFractionDigits: 1,
|
|
364
|
+
})} ${suffix[i]}`;
|
|
365
|
+
}
|
|
366
|
+
static getPDate(l, s) {
|
|
367
|
+
return s.replace(/Hour/g, l('Hour'))
|
|
368
|
+
.replace(/LessThanMinute/g, l('LessThanMinute'))
|
|
369
|
+
.replace(/Minute/g, l('Minute'))
|
|
370
|
+
.replace(/And/g, l('And'))
|
|
371
|
+
.replace(/AFew/g, l('AFew'))
|
|
372
|
+
.replace(/Finished/g, l('Finished'))
|
|
373
|
+
.replace(/Day/g, l('Day'))
|
|
374
|
+
.replace(/Later/g, l('Later'))
|
|
375
|
+
.replace(/Ago/g, l('Ago'));
|
|
376
|
+
}
|
|
377
|
+
static GetRemainDate(l, ts) {
|
|
378
|
+
if (ts.Tiks <= 0) {
|
|
379
|
+
return l('Finished');
|
|
380
|
+
}
|
|
381
|
+
let c = 0;
|
|
382
|
+
let result = '';
|
|
383
|
+
if (ts.Years > 0) {
|
|
384
|
+
result += l('YearP', ts.Years);
|
|
385
|
+
c++;
|
|
386
|
+
}
|
|
387
|
+
if (ts.Months > 0) {
|
|
388
|
+
result += c > 0 ? l('And') : '';
|
|
389
|
+
result += l('MonthP', ts.Months);
|
|
390
|
+
c++;
|
|
391
|
+
}
|
|
392
|
+
if (c < 2 && ts.Days > 0) {
|
|
393
|
+
result += c > 0 ? l('And') : '';
|
|
394
|
+
result += l('DayP', ts.Days);
|
|
395
|
+
c++;
|
|
396
|
+
}
|
|
397
|
+
if (c < 2 && ts.Hours > 0) {
|
|
398
|
+
result += c > 0 ? l('And') : '';
|
|
399
|
+
result += l('HourP', ts.Hours);
|
|
400
|
+
c++;
|
|
401
|
+
}
|
|
402
|
+
if (c < 2 && ts.Minutes > 0) {
|
|
403
|
+
result += c > 0 ? l('And') : '';
|
|
404
|
+
result += l('MinuteP', ts.Minutes);
|
|
405
|
+
}
|
|
406
|
+
result += result !== '' ? ' ' + l('Later') : l('LessThanMinute');
|
|
407
|
+
return result;
|
|
408
|
+
}
|
|
409
|
+
static clone(v) {
|
|
410
|
+
if (v == null) {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
const copy = new v.constructor();
|
|
414
|
+
Object.assign(copy, v);
|
|
415
|
+
return copy;
|
|
416
|
+
}
|
|
417
|
+
static cloneJson(inp) {
|
|
418
|
+
return JSON.parse(JSON.stringify(inp));
|
|
419
|
+
}
|
|
420
|
+
static getName(n) {
|
|
421
|
+
return n.replace(/ک/g, 'ك').replace(/ی/g, 'ي').replace(/آ/g, 'آ');
|
|
422
|
+
}
|
|
423
|
+
static addNotification(m, e = true) {
|
|
424
|
+
const id = HelperClass.random(20);
|
|
425
|
+
// tslint:disable-next-line
|
|
426
|
+
$('#Notifications').append('<div id="' + id + '" class="con"><div class="item ' + (e ? 'error' : 'success') + '"><i class="fas fa-times"></i><div>' + m + '</div></div></div>');
|
|
427
|
+
setTimeout(() => {
|
|
428
|
+
const d = $('#' + id);
|
|
429
|
+
d.fadeOut(300, () => {
|
|
430
|
+
d.remove();
|
|
431
|
+
});
|
|
432
|
+
}, 20000);
|
|
433
|
+
}
|
|
434
|
+
static checkCartDigit(code) {
|
|
435
|
+
const l = code.length;
|
|
436
|
+
if (l < 16 || parseInt(code.substr(1, 10), 10) === 0 ||
|
|
437
|
+
parseInt(code.substr(10, 6), 10) === 0) {
|
|
438
|
+
return false;
|
|
439
|
+
}
|
|
440
|
+
let s = 0;
|
|
441
|
+
for (let i = 0; i < 16; i++) {
|
|
442
|
+
const k = i % 2 === 0 ? 2 : 1;
|
|
443
|
+
const d = parseInt(code.substr(i, 1), 10) * k;
|
|
444
|
+
s += d > 9 ? d - 9 : d;
|
|
445
|
+
}
|
|
446
|
+
return s % 10 === 0;
|
|
447
|
+
}
|
|
448
|
+
static getData(key, state, parent) {
|
|
449
|
+
const data = [];
|
|
450
|
+
if (parent && parent.snapshot.data && parent.snapshot.data[key]) {
|
|
451
|
+
data.push(parent.snapshot.data[key].replace('{}', parent.snapshot.paramMap.params.id));
|
|
452
|
+
}
|
|
453
|
+
if (state && parent) {
|
|
454
|
+
data.push(...this.getData(key, state, state.firstChild(parent)));
|
|
455
|
+
}
|
|
456
|
+
return data;
|
|
457
|
+
}
|
|
458
|
+
static getColorByBgColor(bgColor) {
|
|
459
|
+
if (!bgColor) {
|
|
460
|
+
return '';
|
|
461
|
+
}
|
|
462
|
+
return (parseInt(bgColor.replace('#', ''), 16) > 0xffffff / 2) ? '#000' : '#fff';
|
|
463
|
+
}
|
|
464
|
+
static queryStringToJSON(qs = null) {
|
|
465
|
+
qs = qs || location.search.slice(1);
|
|
466
|
+
if (qs === '') {
|
|
467
|
+
return {};
|
|
468
|
+
}
|
|
469
|
+
const pairs = qs.split('&');
|
|
470
|
+
const result = {};
|
|
471
|
+
pairs.forEach((p) => {
|
|
472
|
+
const pair = p.split('=');
|
|
473
|
+
const key = pair[0].replace('%5B%5D', '');
|
|
474
|
+
const value = decodeURIComponent(pair[1] || '');
|
|
475
|
+
if (result[key]) {
|
|
476
|
+
if (Object.prototype.toString.call(result[key]) === '[object Array]') {
|
|
477
|
+
result[key].push(value);
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
result[key] = [result[key], value];
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
result[key] = value;
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
return JSON.parse(JSON.stringify(result));
|
|
488
|
+
}
|
|
489
|
+
static copyToClipboard(text) {
|
|
490
|
+
const input = document.createElement('input');
|
|
491
|
+
input.setAttribute('value', text);
|
|
492
|
+
document.body.appendChild(input);
|
|
493
|
+
input.select();
|
|
494
|
+
document.execCommand('copy');
|
|
495
|
+
document.body.removeChild(input);
|
|
496
|
+
}
|
|
497
|
+
static setBarcodeReader(inp) {
|
|
498
|
+
inp.button = 'blue';
|
|
499
|
+
const fn = inp.id + 'SetBarcodeScanValue';
|
|
500
|
+
inp.onClickButton = () => {
|
|
501
|
+
try {
|
|
502
|
+
// @ts-ignore
|
|
503
|
+
window.JSInterface.startBarcodeScan(fn);
|
|
504
|
+
}
|
|
505
|
+
catch (e) {
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
try {
|
|
509
|
+
// @ts-ignore
|
|
510
|
+
window[fn] = (s) => {
|
|
511
|
+
if (inp.type === InputType.Text) {
|
|
512
|
+
inp.setValue(s, false);
|
|
513
|
+
setTimeout(() => {
|
|
514
|
+
$('#' + inp.id + 'TextInput .control').click();
|
|
515
|
+
}, 100);
|
|
516
|
+
}
|
|
517
|
+
if (inp.onBarcodeReaderChange !== null) {
|
|
518
|
+
inp.onBarcodeReaderChange(s);
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
catch (e) {
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
static getRandomInt(min, max) {
|
|
526
|
+
return Math.floor(Math.random() * (max - min)) + min;
|
|
527
|
+
}
|
|
528
|
+
static fixChars(str) {
|
|
529
|
+
if (str == null) {
|
|
530
|
+
return null;
|
|
531
|
+
}
|
|
532
|
+
const arabicLetter = ['ي', 'ك', 'ة'];
|
|
533
|
+
const persianLetter = ['ی', 'ک', 'ه'];
|
|
534
|
+
for (let i = 0; i < 3; i++) {
|
|
535
|
+
const re = new RegExp(arabicLetter[i], 'g');
|
|
536
|
+
str = str.toString().replace(re, persianLetter[i]);
|
|
537
|
+
}
|
|
538
|
+
return str.toString()
|
|
539
|
+
.replace(/[۰-۹]/g, d => '۰۱۲۳۴۵۶۷۸۹'.indexOf(d))
|
|
540
|
+
.replace(/[٠-٩]/g, d => '٠١٢٣٤٥٦٧٨٩'.indexOf(d));
|
|
541
|
+
}
|
|
542
|
+
static ToReadablePlaque(p) {
|
|
543
|
+
const tn = p.split('_');
|
|
544
|
+
if (tn.length === 4) {
|
|
545
|
+
tn[1] += '‎';
|
|
546
|
+
tn[2] += ' |';
|
|
547
|
+
return tn.join(' ');
|
|
548
|
+
}
|
|
549
|
+
return tn.join(' ');
|
|
550
|
+
}
|
|
551
|
+
static getFileIcon(f) {
|
|
552
|
+
const fileIcons = {
|
|
553
|
+
jpeg: 'fad fa-file-image', jpg: 'fad fa-file-image', png: 'fad fa-file-image',
|
|
554
|
+
doc: 'fad fa-file-word', docx: 'fad fa-file-word',
|
|
555
|
+
xls: 'fad fa-file-excel', xlsx: 'fad fa-file-excel', csv: 'fad fa-file-csv',
|
|
556
|
+
ppt: 'fad fa-file-powerpoint', pptx: 'fad fa-file-powerpoint',
|
|
557
|
+
txt: 'fad fa-file-lines', pdf: 'fad fa-file-pdf', file: 'fad fa-file',
|
|
558
|
+
zip: 'fad fa-file-zipper', rar: 'fad fa-file-zipper'
|
|
559
|
+
};
|
|
560
|
+
const k = f.split('.').at(-1);
|
|
561
|
+
return fileIcons[k] ? fileIcons[k] : fileIcons.file;
|
|
562
|
+
}
|
|
563
|
+
static groupBy(data, iteratee) {
|
|
564
|
+
return _.groupBy(data, iteratee);
|
|
565
|
+
}
|
|
566
|
+
static getTablePermissions(l = true, i = true, u = true, d = true) {
|
|
567
|
+
const p = new PermissionClass();
|
|
568
|
+
p.Type = PermissionTypeEnum.Form;
|
|
569
|
+
const lAccess = new PermissionClass();
|
|
570
|
+
lAccess.Action = 'List';
|
|
571
|
+
lAccess.Type = PermissionTypeEnum.Access;
|
|
572
|
+
lAccess.AccessType = PermissionAccessTypeEnum.List;
|
|
573
|
+
lAccess.InputAction = PermissionInputActionEnum.None;
|
|
574
|
+
lAccess.InputType = PermissionInputTypeEnum.Icon;
|
|
575
|
+
const iAccess = new PermissionClass();
|
|
576
|
+
iAccess.Action = 'Insert';
|
|
577
|
+
iAccess.Type = PermissionTypeEnum.Access;
|
|
578
|
+
iAccess.InputAction = PermissionInputActionEnum.Modal;
|
|
579
|
+
iAccess.InputType = PermissionInputTypeEnum.Button;
|
|
580
|
+
iAccess.AccessType = PermissionAccessTypeEnum.Insert;
|
|
581
|
+
const uAccess = new PermissionClass();
|
|
582
|
+
uAccess.Action = 'Update';
|
|
583
|
+
uAccess.Type = PermissionTypeEnum.Option;
|
|
584
|
+
uAccess.InputAction = PermissionInputActionEnum.None;
|
|
585
|
+
uAccess.InputType = PermissionInputTypeEnum.Icon;
|
|
586
|
+
uAccess.AccessType = PermissionAccessTypeEnum.Update;
|
|
587
|
+
uAccess.Icon = 'fad fa-pen';
|
|
588
|
+
uAccess.Name = 'Update';
|
|
589
|
+
const dAccess = new PermissionClass();
|
|
590
|
+
dAccess.Action = 'Delete';
|
|
591
|
+
dAccess.Type = PermissionTypeEnum.Option;
|
|
592
|
+
dAccess.InputAction = PermissionInputActionEnum.None;
|
|
593
|
+
dAccess.InputType = PermissionInputTypeEnum.Icon;
|
|
594
|
+
dAccess.AccessType = PermissionAccessTypeEnum.Delete;
|
|
595
|
+
dAccess.Icon = 'fad fa-trash';
|
|
596
|
+
dAccess.Name = 'Delete';
|
|
597
|
+
p.Accesses = [];
|
|
598
|
+
if (l) {
|
|
599
|
+
p.Accesses.push(lAccess);
|
|
600
|
+
}
|
|
601
|
+
if (i) {
|
|
602
|
+
p.Accesses.push(iAccess);
|
|
603
|
+
}
|
|
604
|
+
if (u) {
|
|
605
|
+
p.Accesses.push(uAccess);
|
|
606
|
+
}
|
|
607
|
+
if (d) {
|
|
608
|
+
p.Accesses.push(dAccess);
|
|
609
|
+
}
|
|
610
|
+
return p;
|
|
611
|
+
}
|
|
612
|
+
static jsonToFormData(json, formData = new FormData(), parentKey = '') {
|
|
613
|
+
if (typeof json === 'object' && json !== null) {
|
|
614
|
+
Object.keys(json).forEach(key => {
|
|
615
|
+
const fullKey = parentKey ? `${parentKey}[${key}]` : key;
|
|
616
|
+
const value = json[key];
|
|
617
|
+
if (value === null) {
|
|
618
|
+
// اگر مقدار null است، آن را نادیده بگیر
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
else if (typeof value === 'object' && !Array.isArray(value)) {
|
|
622
|
+
// اگر آبجکت است، به صورت بازگشتی فراخوانی کن
|
|
623
|
+
this.jsonToFormData(value, formData, fullKey);
|
|
624
|
+
}
|
|
625
|
+
else if (Array.isArray(value)) {
|
|
626
|
+
// اگر آرایه است، هر عضو را جداگانه اضافه کن
|
|
627
|
+
value.forEach((item, index) => {
|
|
628
|
+
const arrayKey = `${fullKey}[${index}]`;
|
|
629
|
+
if (item === null) {
|
|
630
|
+
// اگر مقدار null است، آن را نادیده بگیر
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
else if (typeof item === 'object') {
|
|
634
|
+
this.jsonToFormData(item, formData, arrayKey);
|
|
635
|
+
}
|
|
636
|
+
else {
|
|
637
|
+
formData.append(arrayKey, item);
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
else {
|
|
642
|
+
// مقدار ساده را اضافه کن
|
|
643
|
+
formData.append(fullKey, value);
|
|
644
|
+
}
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
return formData;
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IkQ6L1BzVG9vbGtpdC9VSS9wcm9qZWN0cy9wcy10b29sa2l0LXVpL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jbGFzc2VzL2hlbHBlci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCx3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbkIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELFdBQVc7QUFDWCxNQUFNLE9BQU8sV0FBVztJQUN0QixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQWU7UUFDN0IsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDbkQsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDckMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO2FBQU0sSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUU7WUFDM0MsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO2FBQU0sSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDMUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLGlC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QUNiLEtBQUssRUFBRSxDQUFDO1NBQ1Q7UUFDRCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUM7WUFDWixDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNsQyxDQUFDLEVBQUUsQ0FBQztTQUNMO1FBQ0QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUM7WUFDdEIsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9CLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsRUFBRSxDQUFDO1NBQ0w7UUFDRCxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBQztZQUNwQixDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNoQyxDQUFDLEVBQUUsQ0FBQztTQUNMO1FBQ0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUM7WUFDckIsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNsQyxDQUFDLEVBQUUsQ0FBQztT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QUNSOzZCQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFOzRCQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7eUJBQy9DOzZCQUFNOzRCQUNMLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO3lCQUNqQztvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCx5QkFBeUI7b0JBQ3pCLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUNqQztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIElucHV0RXJyb3IsXHJcbiAgSW5wdXRUeXBlLCBNZXRob2QsXHJcbiAgUGVybWlzc2lvbkFjY2Vzc1R5cGVFbnVtLFxyXG4gIFBlcm1pc3Npb25JbnB1dEFjdGlvbkVudW0sXHJcbiAgUGVybWlzc2lvbklucHV0VHlwZUVudW0sXHJcbiAgUGVybWlzc2lvblR5cGVFbnVtXHJcbn0gZnJvbSAnLi9lbnVtLmNsYXNzJztcclxuaW1wb3J0IHtJbnB1dENsYXNzfSBmcm9tICcuL2Zvcm0uY2xhc3MnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnamFsYWxpLW1vbWVudCc7XHJcbmltcG9ydCAqIGFzICQgZnJvbSAnanF1ZXJ5JztcclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQge1Blcm1pc3Npb25DbGFzc30gZnJvbSAnLi9wZXJtaXNzaW9uLmNsYXNzJztcclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBIZWxwZXJDbGFzcyB7XHJcbiAgc3RhdGljIGdldExhYmVsKGlucDogSW5wdXRDbGFzcyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gaW5wLmxhYmVsICE9IG51bGwgPyBpbnAubGFiZWwgOiBpbnAubmFtZTtcclxuICAgIGlmIChpbnAuZXJyb3IgPT09IElucHV0RXJyb3IuUmVxdWlyZWQpIHtcclxuICAgICAgcmV0dXJuIGlucC5sKCdGb3JtRXJyb3JSZXF1aXJlZCcsIG4pO1xyXG4gICAgfSBlbHNlIGlmIChpbnAuZXJyb3IgPT09IElucHV0RXJyb3IuSW52YWxpZCkge1xyXG4gICAgICByZXR1cm4gaW5wLmwoJ0Zvcm1FcnJvckludmFsaWQnLCBuKTtcclxuICAgIH0gZWxzZSBpZiAoaW5wLmVycm9yID09PSBJbnB1dEVycm9yLkxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gaW5wLmwoJ0Zvcm1FcnJvckxlbmd0aCcsIFtuLCBpbnAubWluTGVuZ3RoXSk7XHJcbiAgICB9IGVsc2UgaWYgKGlucC5lcnJvciA9PT0gSW5wdXRFcnJvci5NaW5MZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGlucC5sKCdGb3JtRXJyb3JNaW5MZW5ndGgnLCBbbiwgaW5wLm1pbkxlbmd0aF0pO1xyXG4gICAgfSBlbHNlIGlmIChpbnAuZXJyb3IgPT09IElucHV0RXJyb3IuTWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBpbnAubCgnRm9ybUVycm9yTWF4TGVuZ3RoJywgW24sIGlucC5tYXhMZW5ndGhdKTtcclxuICAgIH0gZWxzZSBpZiAoaW5wLmVycm9yID09PSBJbnB1dEVycm9yLk1pbkFtb3VudCkge1xyXG4gICAgICByZXR1cm4gaW5wLmwoJ0Zvcm1FcnJvck1pbkFtb3VudCcsIFtuLCBpbnAubWluTGVuZ3RoXSk7XHJcbiAgICB9IGVsc2UgaWYgKGlucC5lcnJvciA9PT0gSW5wdXRFcnJvci5NYXhBbW91bnQpIHtcclxuICAgICAgcmV0dXJuIGlucC5sKCdGb3JtRXJyb3JNYXhBbW91bnQnLCBbbiwgaW5wLm1heExlbmd0aF0pO1xyXG4gICAgfSBlbHNlIGlmIChpbnAuZXJyb3IgPT09IElucHV0RXJyb3IuRXhwaXJlZCkge1xyXG4gICAgICByZXR1cm4gaW5wLmwoJ0Zvcm1FcnJvckV4cGlyZWQnLCBuKTtcclxuICAgIH0gZWxzZSBpZiAoaW5wLmVycm9yID09PSBJbnB1dEVycm9yLldyb25nKSB7XHJcbiAgICAgIHJldHVybiBpbnAubCgnRm9ybUVycm9yV3JvbmcnLCBuKTtcclxuICAgIH0gZWxzZSBpZiAoaW5wLmVycm9yID09PSBJbnB1dEVycm9yLkVycm9yKSB7XHJcbiAgICAgIHJldHVybiBpbnAubCgnRm9ybUVycm9yJywgbik7XHJcbiAgICB9IGVsc2UgaWYgKGlucC5lcnJvciA9PT0gSW5wdXRFcnJvci5Ob3RNYXRjaCkge1xyXG4gICAgICByZXR1cm4gaW5wLmwoJ0Zvcm1FcnJvck5vdE1hdGNoJywgaW5wLm1hdGNoLm5hbWUpO1xyXG4gICAgfSBlbHNlIGlmIChpbnAuZXJyb3IgPT09IElucHV0RXJyb3IuRXhpc3QpIHtcclxuICAgICAgcmV0dXJuIGlucC5sKCdGb3JtRXJyb3JFeGlzdCcsIG4pO1xyXG4gICAgfSBlbHNlIGlmIChpbnAuZXJyb3IgPT09IElucHV0RXJyb3IuTm90RXhpc3QpIHtcclxuICAgICAgcmV0dXJuIGlucC5sKCdGb3JtRXJyb3JOb3RFeGlzdCcsIG4pO1xyXG4gICAgfSBlbHNlIGlmIChpbnAuZXJyb3IgPT09IElucHV0RXJyb3IuTm90QWxsb3dlZCkge1xyXG4gICAgICByZXR1cm4gaW5wLmwoJ0Zvcm1FcnJvck5vdEFsbG93ZWQnLCBbbiwgaW5wLmFsbG93ZWQuam9pbignLCAnKV0pO1xyXG4gICAgfSBlbHNlIGlmIChpbnAuZXJyb3IgPT09IElucHV0RXJyb3IuTWF4Q29udGVudCkge1xyXG4gICAgICByZXR1cm4gaW5wLmwoJ0Zvcm1FcnJvck1heENvbnRlbnQnLCBbbiwgaW5wLm1heExlbmd0aF0pO1xyXG4gICAgfSBlbHNlIGlmIChpbnAuZXJyb3IgPT09IElucHV0RXJyb3IuVXBsb2FkKSB7XHJcbiAgICAgIHJldHVybiBpbnAubCgnRm9ybUVycm9yVXBsb2FkJywgbik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZXNjID0gaW5wLmRlc2NyaXB0aW9uICE9PSBudWxsID8gJyAoJyArIGlucC5sKGlucC5kZXNjcmlwdGlvbikgKyAnKScgOiAnJztcclxuICAgIHJldHVybiBpbnAubChuKSArIGRlc2M7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbmF0aW9uYWxDb2RlTnVtVmFsaWQoYyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEhlbHBlckNsYXNzLm5hdGlvbmFsQ29kZVZhbGlkKGMpIHx8IEhlbHBlckNsYXNzLm5hdGlvbmFsTnVtVmFsaWQoYyk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZWNvbm9taWNOdW1WYWxpZChjKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWMpe1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYy5sZW5ndGggPT09IDExIHx8IChjLmxlbmd0aCA9PT0gMTQgJiYgSGVscGVyQ2xhc3MubmF0aW9uYWxDb2RlVmFsaWQoYy5zdWJzdHIoMCwgMTApKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbmF0aW9uYWxDb2RlVmFsaWQoYyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFSZWdFeHAoL15cXGR7MTB9JC8pLnRlc3QoYykgfHwgUmVnRXhwKC9eKC4pXFwxKyQvKS50ZXN0KGMpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNoZWNrID0gcGFyc2VJbnQoY1s5XSwgMTApO1xyXG4gICAgbGV0IHN1bSA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7ICsraSkge1xyXG4gICAgICBzdW0gKz0gcGFyc2VJbnQoY1tpXSwgMTApICogKDEwIC0gaSk7XHJcbiAgICB9XHJcbiAgICBzdW0gJT0gMTE7XHJcbiAgICByZXR1cm4gKHN1bSA8IDIgJiYgY2hlY2sgPT09IHN1bSkgfHwgKHN1bSA+PSAyICYmIGNoZWNrICsgc3VtID09PSAxMSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbmF0aW9uYWxOdW1WYWxpZChjb2RlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBsID0gY29kZS5sZW5ndGg7XHJcblxyXG4gICAgaWYgKGwgPCAxMSB8fCBwYXJzZUludChjb2RlLCAxMCkgPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChwYXJzZUludChjb2RlLnN1YnN0cigzLCA2KSwgMTApID09PSAwKXtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYyA9IHBhcnNlSW50KGNvZGUuc3Vic3RyKDEwLCAxKSwgMTApO1xyXG4gICAgY29uc3QgZCA9IHBhcnNlSW50KGNvZGUuc3Vic3RyKDksIDEpLCAxMCkgKyAyO1xyXG4gICAgY29uc3QgeiA9IFsyOSwgMjcsIDIzLCAxOSwgMTddO1xyXG4gICAgbGV0IHMgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKXtcclxuICAgICAgcyArPSAoZCArIHBhcnNlSW50KGNvZGUuc3Vic3RyKGksIDEpLCAxMCkpICogeltpICUgNV07XHJcbiAgICB9XHJcbiAgICBzID0gcyAlIDExO1xyXG4gICAgaWYgKHMgPT09IDEwKXtcclxuICAgICAgcyA9IDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYyA9PT0gcztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBwbGFxdWVWYWxpZChwLCB0OiBJbnB1dFR5cGUpOiBib29sZWFuIHtcclxuICAgIGlmICh0ID09PSBJbnB1dFR5cGUuUGxhcXVlICYmICFSZWdFeHAoL15bMC05XXsyfV9b2KfYqNm+2KrYq9is2obYrdiu2K/YsNix2LLamNiz2LTYtdi22LfYuNi52LrZgdmC2qnar9mE2YXZhtmI2YfbjF1fWzAtOV17M31fWzAtOV17Mn0kLykudGVzdChwKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKHQgPT09IElucHV0VHlwZS5QbGFxdWVNICYmICFSZWdFeHAoL15bMC05XXszfV9bMC05XXs1fSQvKS50ZXN0KHApKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzbzcwNjRNb2Q5N18xMChpYmFuKTogbnVtYmVye1xyXG4gICAgbGV0IHJlbWFpbmRlciA9IGliYW47XHJcbiAgICB3aGlsZSAocmVtYWluZGVyLmxlbmd0aCA+IDIpe1xyXG4gICAgICBjb25zdCBibG9jayA9IHJlbWFpbmRlci5zbGljZSgwLCA5KTtcclxuICAgICAgcmVtYWluZGVyID0gcGFyc2VJbnQoYmxvY2ssIDEwKSAlIDk3ICsgcmVtYWluZGVyLnNsaWNlKGJsb2NrLmxlbmd0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhcnNlSW50KHJlbWFpbmRlciwgMTApICUgOTc7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2hlYmFWYWxpZChzdHIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBhdHRlcm4gPSAvSVJbMC05XXsyNH0vO1xyXG4gICAgaWYgKCFzdHIuc3RhcnRzV2l0aCgnSVInKSl7XHJcbiAgICAgIHN0ciA9ICdJUicgKyBzdHI7XHJcbiAgICB9XHJcbiAgICBpZiAoc3RyLmxlbmd0aCAhPT0gMjYpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcGF0dGVybi50ZXN0KHN0cikpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuZXdTdHIgPSBzdHIuc3Vic3RyKDQpO1xyXG4gICAgY29uc3QgZDEgPSBzdHIuY2hhckNvZGVBdCgwKSAtIDY1ICsgMTA7XHJcbiAgICBjb25zdCBkMiA9IHN0ci5jaGFyQ29kZUF0KDEpIC0gNjUgKyAxMDtcclxuICAgIG5ld1N0ciArPSBkMS50b1N0cmluZygpICsgZDIudG9TdHJpbmcoKSArIHN0ci5zdWJzdHIoMiwgMik7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaXNvNzA2NE1vZDk3XzEwKG5ld1N0cikgPT09IDE7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcG9zdGFsQ29kZVZhbGlkKGMpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBSZWdFeHAoL15cXGIoPyEoXFxkKVxcMXszfSlbMTMtOV17NX1bMC05XXs1fVxcYiQvKS50ZXN0KGMpO1xyXG4gIH1cclxuICBzdGF0aWMgcmFuZG9tKGxlbmd0aCwgdXBwZXIgPSB0cnVlLCBsb3dlciA9IHRydWUsIG51bSA9IHRydWUpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gICAgY29uc3QgY2hhcmFjdGVycyA9IGAke3VwcGVyID8gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyA6ICcnfSR7bG93ZXIgPyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIDogJyd9JHtudW0gPyAnMTIzNDU2Nzg5JyA6ICcnfWA7XHJcbiAgICBjb25zdCBjaGFyYWN0ZXJzTGVuZ3RoID0gY2hhcmFjdGVycy5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkge1xyXG4gICAgICByZXN1bHQgKz0gY2hhcmFjdGVycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcmFjdGVyc0xlbmd0aCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcbiAgc3RhdGljIHNldENvb2tpZShuYW1lLCB2YWx1ZSwgZGF5cyA9IDM2NSk6IHZvaWQge1xyXG4gICAgbGV0IGV4cGlyZXMgPSAnJztcclxuICAgIGlmIChkYXlzKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAoZGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApKTtcclxuICAgICAgZXhwaXJlcyA9ICc7IGV4cGlyZXM9JyArIGRhdGUudG9VVENTdHJpbmcoKTtcclxuICAgIH1cclxuICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAnPScgKyAodmFsdWUgfHwgJycpICArIGV4cGlyZXMgKyAnOyBwYXRoPS8nO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0Q29va2llKG5hbWUsIGRlZiA9IG51bGwpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbmFtZUVRID0gbmFtZSArICc9JztcclxuICAgIGNvbnN0IGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XHJcbiAgICBmb3IgKGxldCBjIG9mIGNhKSB7XHJcbiAgICAgIHdoaWxlIChjLmNoYXJBdCgwKSA9PT0gJyAnKXtcclxuICAgICAgICBjID0gYy5zdWJzdHJpbmcoMSwgYy5sZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCl7XHJcbiAgICAgICAgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlZjtcclxuICB9XHJcbiAgc3RhdGljIGVyYXNlQ29va2llKG5hbWUpOiB2b2lkIHtcclxuICAgIGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpXHJcbiAgICAgIC5mb3JFYWNoKChjKSA9PiB7IGRvY3VtZW50LmNvb2tpZSA9IGMucmVwbGFjZSgvXiArLywgJycpLnJlcGxhY2UoLz0uKi8sICc9O2V4cGlyZXM9JyArIG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSArICc7cGF0aD0vJyk7IH0pO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0RGF0ZURpZihsLCBkdDogc3RyaW5nLCBjID0gMik6IHN0cmluZ3tcclxuICAgIGNvbnN0IGQgPSBwYXJzZUludChkdC5zdWJzdHJpbmcoNiwgZHQubGVuZ3RoIC0gMiksIDEwKTtcclxuICAgIGNvbnN0IG5vdyA9IG1vbWVudC5ub3coKTtcclxuICAgIGNvbnN0IGRpZiA9IChub3cgLSBkKSAvIDEwMDA7XHJcbiAgICBjb25zdCBoID0gTWF0aC5mbG9vcihkaWYgLyAzNjAwKTtcclxuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKGRpZiAlIDM2MDAgLyA2MCk7XHJcbiAgICBpZiAoaCA8IDI0KVxyXG4gICAge1xyXG4gICAgICBsZXQgciA9ICcnO1xyXG4gICAgICBpZiAoaCA+IDApe1xyXG4gICAgICAgIHIgKz0gbCgnSG91clAnLCBoLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGMtLTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobSA+IDAgJiYgYyA+IDApe1xyXG4gICAgICAgIGlmIChyICE9PSAnJyl7XHJcbiAgICAgICAgICByICs9IGwoJ0FuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByICs9IGwoJ01pbnV0ZVAnLCBtLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHIgKz0gciAhPT0gJycgPyAnJyA6IGwoJ0FGZXcnKTtcclxuICAgICAgciArPSAnICcgKyBsKCdBZ28nKTtcclxuICAgICAgcmV0dXJuIHI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwibHRyIGQtaWJcIj4nICsgbW9tZW50KGQpLmxvY2FsZSgnZmEnKS5mb3JtYXQoJ2pZWVlZL2pNTS9qREQgSEg6bW0nKSArICc8L3NwYW4+JztcclxuICB9XHJcbiAgc3RhdGljIGdldFJvd0VudW0obCwgZSwgZHQpOiBzdHJpbmd7XHJcbiAgICBjb25zdCB2ID0gZS5maW5kKHggPT4geC5WYWx1ZSA9PT0gZHQpO1xyXG4gICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cInN0YXR1cyAke3YuQ2xhc3N9XCI+YCArIGwodi5OYW1lKSArICc8L3NwYW4+JztcclxuICB9XHJcbiAgc3RhdGljIGdldE5vdygpOiBhbnl7XHJcbiAgICByZXR1cm4gbW9tZW50Lm5vdygpO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0SW5wdXREYXRlKGFtb3VudDogbnVtYmVyID0gMCwgdW5pdDogc3RyaW5nID0gJ21vbnRoJyk6IGFueXtcclxuICAgIHJldHVybiBIZWxwZXJDbGFzcy5nZXRNb21lbnQoKS5hZGQoYW1vdW50LCB1bml0KS5sb2NhbGUoJ2VuJykuZm9ybWF0KCdZWVlZL01NL0REJyk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRNb21lbnQoaSA9IG51bGwsIGYgPSBudWxsKTogYW55e1xyXG4gICAgaWYgKGkgPT0gbnVsbCl7XHJcbiAgICAgIHJldHVybiBtb21lbnQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtb21lbnQoaSwgZik7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXREYXRlUmVtYWluKGwsIGR0OiBzdHJpbmcsIGMgPSAyKTogc3RyaW5ne1xyXG4gICAgY29uc3QgZCA9IHBhcnNlSW50KGR0LnN1YnN0cmluZyg2LCBkdC5sZW5ndGggLSAyKSwgMTApO1xyXG4gICAgY29uc3Qgbm93ID0gbW9tZW50Lm5vdygpO1xyXG4gICAgY29uc3QgZGlmID0gKGQgLSBub3cpIC8gMTAwMDtcclxuICAgIGlmIChkaWYgPD0gMClcclxuICAgIHtcclxuICAgICAgcmV0dXJuIGwoJ0VuZGVkJyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBoID0gTWF0aC5mbG9vcihkaWYgLyAzNjAwKTtcclxuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKGRpZiAlIDM2MDAgLyA2MCk7XHJcbiAgICBpZiAoaCA8IDI0KVxyXG4gICAge1xyXG4gICAgICBsZXQgciA9ICcnO1xyXG4gICAgICBpZiAoaCA+IDApe1xyXG4gICAgICAgIHIgKz0gbCgnSG91clAnLCBoLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGMtLTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobSA+IDAgJiYgYyA+IDApe1xyXG4gICAgICAgIGlmIChyICE9PSAnJyl7XHJcbiAgICAgICAgICByICs9IGwoJ0FuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByICs9IGwoJ01pbnV0ZVAnLCBtLnRvU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIHIgKz0gciAhPT0gJycgPyAnJyA6IGwoJ0FGZXcnKTtcclxuICAgICAgciArPSAnICcgKyBsKCdMYXRlcicpO1xyXG4gICAgICByZXR1cm4gcjtcclxuICAgIH1cclxuICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJsdHIgZC1pYlwiPicgKyBtb21lbnQoZCkubG9jYWxlKCdmYScpLmZvcm1hdCgnallZWVkvak1NL2pERCBISDptbScpICsgJzwvc3Bhbj4nO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0RGF0ZVJlbWFpblNlYyhkdDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGQgPSBwYXJzZUludChkdC5zdWJzdHJpbmcoNiwgZHQubGVuZ3RoIC0gMiksIDEwKTtcclxuICAgIGNvbnN0IG5vdyA9IG1vbWVudC5ub3coKTtcclxuICAgIHJldHVybiAoZCAtIG5vdykgLyAxMDAwO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0RGF0ZVJlbWFpbkZ1bGwobCwgZHQ6IHN0cmluZywgYyA9IDIpOiBzdHJpbmd7XHJcbiAgICBsZXQgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IGQgPSBwYXJzZUludChkdC5zdWJzdHJpbmcoNiwgZHQubGVuZ3RoIC0gMiksIDEwKTtcclxuICAgIGxldCB0YXJnZXQgPSBuZXcgRGF0ZShkKTtcclxuICAgIGxldCByID0gJyc7XHJcbiAgICBjb25zdCBmID0gbm93ID4gdGFyZ2V0O1xyXG4gICAgaWYgKGYpXHJcbiAgICB7XHJcbiAgICAgIHIgKz0gbCgnRmluaXNoZWQnKSArICcgLSAnO1xyXG4gICAgICBjb25zdCB0bXAgPSB0YXJnZXQ7XHJcbiAgICAgIHRhcmdldCA9IG5vdztcclxuICAgICAgbm93ID0gdG1wO1xyXG4gICAgfVxyXG4gICAgbGV0IHllYXJzID0gdGFyZ2V0LmdldEZ1bGxZZWFyKCkgLSBub3cuZ2V0RnVsbFllYXIoKTtcclxuICAgIGxldCBtb250aHMgPSB0YXJnZXQuZ2V0TW9udGgoKSAtIG5vdy5nZXRNb250aCgpO1xyXG4gICAgbGV0IGRheXMgPSB0YXJnZXQuZ2V0RGF0ZSgpIC0gbm93LmdldERhdGUoKTtcclxuICAgIGxldCBob3VycyA9IHRhcmdldC5nZXRIb3VycygpIC0gbm93LmdldEhvdXJzKCk7XHJcbiAgICBsZXQgbWludXRlcyA9IHRhcmdldC5nZXRNaW51dGVzKCkgLSBub3cuZ2V0TWludXRlcygpO1xyXG4gICAgY29uc3Qgc2Vjb25kcyA9IHRhcmdldC5nZXRTZWNvbmRzKCkgLSBub3cuZ2V0U2Vjb25kcygpO1xyXG4gICAgaWYgKHNlY29uZHMgPCAwKSB7XHJcbiAgICAgIG1pbnV0ZXMtLTtcclxuICAgIH1cclxuICAgIGlmIChtaW51dGVzIDwgMCkge1xyXG4gICAgICBtaW51dGVzICs9IDYwO1xyXG4gICAgICBob3Vycy0tO1xyXG4gICAgfVxyXG4gICAgaWYgKGhvdXJzIDwgMCkge1xyXG4gICAgICBob3VycyArPSAyNDtcclxuICAgICAgZGF5cy0tO1xyXG4gICAgfVxyXG4gICAgaWYgKGRheXMgPCAwKSB7XHJcbiAgICAgIGNvbnN0IHByZXZNb250aCA9IG5ldyBEYXRlKHRhcmdldC5nZXRGdWxsWWVhcigpLCB0YXJnZXQuZ2V0TW9udGgoKSwgMCk7XHJcbiAgICAgIGRheXMgKz0gcHJldk1vbnRoLmdldERhdGUoKTtcclxuICAgICAgbW9udGhzLS07XHJcbiAgICB9XHJcbiAgICBpZiAobW9udGhzIDwgMCkge1xyXG4gICAgICBtb250aHMgKz0gMTI7XHJcbiAgICAgIHllYXJzLS07XHJcbiAgICB9XHJcbiAgICBpZiAoeWVhcnMgPiAwKXtcclxuICAgICAgciArPSBsKCdZZWFyUCcsIHllYXJzLnRvU3RyaW5nKCkpO1xyXG4gICAgICBjLS07XHJcbiAgICB9XHJcbiAgICBpZiAobW9udGhzID4gMCAmJiBjID4gMCl7XHJcbiAgICAgIHIgKz0geWVhcnMgPiAwID8gbCgnQW5kJykgOiAnJztcclxuICAgICAgciArPSBsKCdNb250aFAnLCBtb250aHMudG9TdHJpbmcoKSk7XHJcbiAgICAgIGMtLTtcclxuICAgIH1cclxuICAgIGlmIChkYXlzID4gMCAmJiBjID4gMCl7XHJcbiAgICAgIHIgKz0geWVhcnMgPiAwIHx8IG1vbnRocyA+IDAgPyBsKCdBbmQnKSA6ICcnO1xyXG4gICAgICByICs9IGwoJ0RheVAnLCBkYXlzLnRvU3RyaW5nKCkpO1xyXG4gICAgICBjLS07XHJcbiAgICB9XHJcbiAgICBpZiAoaG91cnMgPiAwICYmIGMgPiAwKXtcclxuICAgICAgciArPSB5ZWFycyA+IDAgfHwgbW9udGhzID4gMCB8fCBkYXlzID4gMCA/IGwoJ0FuZCcpIDogJyc7XHJcbiAgICAgIHIgKz0gbCgnSG91clAnLCBob3Vycy50b1N0cmluZygpKTtcclxuICAgICAgYy0tO1xyXG4gICAgfVxyXG4gICAgaWYgKG1pbnV0ZXMgPiAwICYmIGMgPiAwKXtcclxuICAgICAgciArPSB5ZWFycyA+IDAgfHwgbW9udGhzID4gMCB8fCBkYXlzID4gMCB8fCBob3VycyA+IDAgPyBsKCdBbmQnKSA6ICcnO1xyXG4gICAgICByICs9IGwoJ01pbnV0ZVAnLCBtaW51dGVzLnRvU3RyaW5nKCkpO1xyXG4gICAgICBjLS07XHJcbiAgICB9XHJcbiAgICByICs9IChyICE9PSAnJyA/ICcnIDogbCgnTGVzc1RoYW5NaW51dGUnKSkgKyAnICcgKyAoZiA/IGwoJ0FnbycpIDogbCgnTGF0ZXInKSk7XHJcbiAgICByZXR1cm4gcjtcclxuICB9XHJcbiAgc3RhdGljIGdldERhdGUoZHQ6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcgPSAnallZWVkvak1NL2pERCcsIGxvY2FsZTogc3RyaW5nID0gJ2ZhJyk6IHN0cmluZ3tcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChkdCA9PT0gbnVsbCl7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBtO1xyXG4gICAgICBpZiAodHlwZW9mIGR0ID09PSAnc3RyaW5nJyAmJiBkdC5sZW5ndGggPT09IDEwKSB7XHJcbiAgICAgICAgbSA9IG1vbWVudChkdCwgJ1lZWVkvTU0vREQnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtID0gbW9tZW50KHBhcnNlSW50KGR0LnN1YnN0cmluZyg2LCBkdC5sZW5ndGggLSAyKSwgMTApKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbS5sb2NhbGUobG9jYWxlKS5mb3JtYXQoZm9ybWF0ICsgJ3onKTtcclxuICAgIH1jYXRjaCAoZSkge1xyXG4gICAgICByZXR1cm4gZHQ7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRUaW1lKGR0OiBhbnkpOiBzdHJpbmd7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoZHQgPT09IG51bGwpe1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBtID0gZHQuVG90YWxTZWNvbmRzID49IDAgPyAxIDogLTE7XHJcbiAgICAgIGNvbnN0IGhvdXJzID0gKChkdC5EYXlzICogbSkgKiAyNCkgKyAoZHQuSG91cnMgKiBtKTtcclxuICAgICAgY29uc3QgbWludXRlID0gZHQuTWludXRlcyAqIG07XHJcbiAgICAgIHJldHVybiBgJHsoaG91cnMgPiA5ID8gaG91cnMgOiBgMCR7aG91cnN9YCl9OiR7KG1pbnV0ZSA+IDkgPyBtaW51dGUgOiBgMCR7bWludXRlfWApfWA7XHJcbiAgICB9Y2F0Y2ggKGUpIHtcclxuICAgICAgcmV0dXJuIGR0O1xyXG4gICAgfVxyXG4gIH1cclxuICBzdGF0aWMgZ2V0RGF0ZVRpbWUoZHQ6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcgPSAnallZWVkvak1NL2pERCBISDptbScpOiBzdHJpbmd7XHJcbiAgICBpZiAoZHQgPT09IG51bGwpe1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkID0gcGFyc2VJbnQoZHQuc3Vic3RyaW5nKDYsIGR0Lmxlbmd0aCAtIDIpLCAxMCk7XHJcbiAgICByZXR1cm4gbW9tZW50KGQpLmxvY2FsZSgnZmEnKS5mb3JtYXQoZm9ybWF0KTtcclxuICB9XHJcbiAgc3RhdGljIHRvUHJpY2UobDogYW55LCBjdjogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdChjdikpID8gJzxzcGFuIGNsYXNzPVwibHRyIGQtaWIgbS1sLTUtcFwiPicgKyBwYXJzZUZsb2F0KGN2KS50b0xvY2FsZVN0cmluZygpICsgJzwvc3Bhbj4nICsgbCgnUmlhbCcpIDogbChjdik7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRGaWxlU2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHN1ZmZpeCA9IFsgJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTtcclxuICAgIGxldCBkYmxTQnl0ZSA9IGJ5dGVzO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yICg7IGkgPCBzdWZmaXgubGVuZ3RoICYmIGJ5dGVzID49IDEwMjQ7IGkrKywgYnl0ZXMgLz0gMTAyNClcclxuICAgIHtcclxuICAgICAgZGJsU0J5dGUgPSBieXRlcyAvIDEwMjQuMDtcclxuICAgIH1cclxuICAgIHJldHVybiBgJHtkYmxTQnl0ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7XHJcbiAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMCxcclxuICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAxLFxyXG4gICAgfSl9ICR7c3VmZml4W2ldfWA7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRQRGF0ZShsLCBzKTogc3RyaW5ne1xyXG4gICAgcmV0dXJuIHMucmVwbGFjZSgvSG91ci9nLCBsKCdIb3VyJykpXHJcbiAgICAgIC5yZXBsYWNlKC9MZXNzVGhhbk1pbnV0ZS9nLCBsKCdMZXNzVGhhbk1pbnV0ZScpKVxyXG4gICAgICAucmVwbGFjZSgvTWludXRlL2csIGwoJ01pbnV0ZScpKVxyXG4gICAgICAucmVwbGFjZSgvQW5kL2csIGwoJ0FuZCcpKVxyXG4gICAgICAucmVwbGFjZSgvQUZldy9nLCBsKCdBRmV3JykpXHJcbiAgICAgIC5yZXBsYWNlKC9GaW5pc2hlZC9nLCBsKCdGaW5pc2hlZCcpKVxyXG4gICAgICAucmVwbGFjZSgvRGF5L2csIGwoJ0RheScpKVxyXG4gICAgICAucmVwbGFjZSgvTGF0ZXIvZywgbCgnTGF0ZXInKSlcclxuICAgICAgLnJlcGxhY2UoL0Fnby9nLCBsKCdBZ28nKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhdGljIEdldFJlbWFpbkRhdGUobCwgdHMpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRzLlRpa3MgPD0gMCl7XHJcbiAgICAgIHJldHVybiBsKCdGaW5pc2hlZCcpO1xyXG4gICAgfVxyXG4gICAgbGV0IGMgPSAwO1xyXG4gICAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gICAgaWYgKHRzLlllYXJzID4gMCl7XHJcbiAgICAgIHJlc3VsdCArPSBsKCdZZWFyUCcsIHRzLlllYXJzKTtcclxuICAgICAgYysrO1xyXG4gICAgfVxyXG4gICAgaWYgKHRzLk1vbnRocyA+IDApe1xyXG4gICAgICByZXN1bHQgKz0gYyA+IDAgPyBsKCdBbmQnKSA6ICcnO1xyXG4gICAgICByZXN1bHQgKz0gbCgnTW9udGhQJywgdHMuTW9udGhzKTtcclxuICAgICAgYysrO1xyXG4gICAgfVxyXG4gICAgaWYgKGMgPCAyICYmIHRzLkRheXMgPiAwKXtcclxuICAgICAgcmVzdWx0ICs9IGMgPiAwID8gbCgnQW5kJykgOiAnJztcclxuICAgICAgcmVzdWx0ICs9IGwoJ0RheVAnLCB0cy5EYXlzKTtcclxuICAgICAgYysrO1xyXG4gICAgfVxyXG4gICAgaWYgKGMgPCAyICYmIHRzLkhvdXJzID4gMCl7XHJcbiAgICAgIHJlc3VsdCArPSBjID4gMCA/IGwoJ0FuZCcpIDogJyc7XHJcbiAgICAgIHJlc3VsdCArPSBsKCdIb3VyUCcsIHRzLkhvdXJzKTtcclxuICAgICAgYysrO1xyXG4gICAgfVxyXG4gICAgaWYgKGMgPCAyICYmIHRzLk1pbnV0ZXMgPiAwKXtcclxuICAgICAgcmVzdWx0ICs9IGMgPiAwID8gbCgnQW5kJykgOiAnJztcclxuICAgICAgcmVzdWx0ICs9IGwoJ01pbnV0ZVAnLCB0cy5NaW51dGVzKTtcclxuICAgIH1cclxuICAgIHJlc3VsdCArPSByZXN1bHQgIT09ICcnID8gJyAnICsgbCgnTGF0ZXInKSA6IGwoJ0xlc3NUaGFuTWludXRlJyk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNsb25lPFQ+KHY6IFQpOiBUIHtcclxuICAgIGlmICh2ID09IG51bGwpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb3B5ID0gbmV3ICh2LmNvbnN0cnVjdG9yIGFzIHsgbmV3KCkgfSkoKTtcclxuICAgIE9iamVjdC5hc3NpZ24oY29weSwgdik7XHJcbiAgICByZXR1cm4gY29weTtcclxuICB9XHJcbiAgc3RhdGljIGNsb25lSnNvbihpbnApOiBhbnkge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5wKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXROYW1lKG4pOiBzdHJpbmd7XHJcbiAgICByZXR1cm4gbi5yZXBsYWNlKC/aqS9nLCAn2YMnKS5yZXBsYWNlKC/bjC9nLCAn2YonKS5yZXBsYWNlKC/Yoi9nLCAn2KInKTtcclxuICB9XHJcbiAgc3RhdGljIGFkZE5vdGlmaWNhdGlvbihtLCBlID0gdHJ1ZSk6IHZvaWR7XHJcbiAgICBjb25zdCBpZCA9IEhlbHBlckNsYXNzLnJhbmRvbSgyMCk7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICQoJyNOb3RpZmljYXRpb25zJykuYXBwZW5kKCc8ZGl2IGlkPVwiJyArIGlkICsgJ1wiIGNsYXNzPVwiY29uXCI+PGRpdiBjbGFzcz1cIml0ZW0gJyArIChlID8gJ2Vycm9yJyA6ICdzdWNjZXNzJykgKyAnXCI+PGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+PGRpdj4nICsgbSArICc8L2Rpdj48L2Rpdj48L2Rpdj4nKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBkID0gJCgnIycgKyBpZCk7XHJcbiAgICAgIGQuZmFkZU91dCgzMDAsICgpID0+IHtcclxuICAgICAgICBkLnJlbW92ZSgpO1xyXG4gICAgICB9KTtcclxuICAgIH0sIDIwMDAwKTtcclxuICB9XHJcbiAgc3RhdGljIGNoZWNrQ2FydERpZ2l0KGNvZGUpOiBib29sZWFue1xyXG4gICAgY29uc3QgbCA9IGNvZGUubGVuZ3RoO1xyXG4gICAgaWYgKGwgPCAxNiB8fCBwYXJzZUludChjb2RlLnN1YnN0cigxLCAxMCksIDEwKSA9PT0gMCB8fFxyXG4gICAgICBwYXJzZUludChjb2RlLnN1YnN0cigxMCwgNiksIDEwKSA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgcyA9IDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspe1xyXG4gICAgICBjb25zdCBrID0gaSAlIDIgPT09IDAgPyAyIDogMTtcclxuICAgICAgY29uc3QgZCA9IHBhcnNlSW50KGNvZGUuc3Vic3RyKGksIDEpLCAxMCkgKiBrO1xyXG4gICAgICBzICs9IGQgPiA5ID8gZCAtIDkgOiBkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHMgJSAxMCA9PT0gMDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXREYXRhKGtleSwgc3RhdGUsIHBhcmVudCk6IGFueSB7XHJcbiAgICBjb25zdCBkYXRhID0gW107XHJcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5zbmFwc2hvdC5kYXRhICYmIHBhcmVudC5zbmFwc2hvdC5kYXRhW2tleV0pIHtcclxuICAgICAgZGF0YS5wdXNoKHBhcmVudC5zbmFwc2hvdC5kYXRhW2tleV0ucmVwbGFjZSgne30nLCBwYXJlbnQuc25hcHNob3QucGFyYW1NYXAucGFyYW1zLmlkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0YXRlICYmIHBhcmVudCkge1xyXG4gICAgICBkYXRhLnB1c2goLi4udGhpcy5nZXREYXRhKGtleSwgc3RhdGUsIHN0YXRlLmZpcnN0Q2hpbGQocGFyZW50KSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0Q29sb3JCeUJnQ29sb3IoYmdDb2xvcik6IHN0cmluZ3tcclxuICAgIGlmICghYmdDb2xvcikgeyByZXR1cm4gJyc7IH1cclxuICAgIHJldHVybiAocGFyc2VJbnQoYmdDb2xvci5yZXBsYWNlKCcjJywgJycpLCAxNikgPiAweGZmZmZmZiAvIDIpID8gJyMwMDAnIDogJyNmZmYnO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHF1ZXJ5U3RyaW5nVG9KU09OKHFzID0gbnVsbCk6IGFueSB7XHJcbiAgICBxcyA9IHFzIHx8IGxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKTtcclxuICAgIGlmIChxcyA9PT0gJycpe1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYWlycyA9IHFzLnNwbGl0KCcmJyk7XHJcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcclxuICAgIHBhaXJzLmZvckVhY2goKHApID0+IHtcclxuICAgICAgY29uc3QgcGFpciA9IHAuc3BsaXQoJz0nKTtcclxuICAgICAgY29uc3Qga2V5ID0gcGFpclswXS5yZXBsYWNlKCclNUIlNUQnLCAnJyk7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMV0gfHwgJycpO1xyXG5cclxuICAgICAgaWYgKCByZXN1bHRba2V5XSApIHtcclxuICAgICAgICBpZiAoIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCggcmVzdWx0W2tleV0gKSA9PT0gJ1tvYmplY3QgQXJyYXldJyApIHtcclxuICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2goIHZhbHVlICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc3VsdFtrZXldID0gWyByZXN1bHRba2V5XSwgdmFsdWUgXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcclxuICB9XHJcbiAgc3RhdGljIGNvcHlUb0NsaXBib2FyZCh0ZXh0KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdGV4dCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0KTtcclxuICAgIGlucHV0LnNlbGVjdCgpO1xyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW5wdXQpO1xyXG4gIH1cclxuICBzdGF0aWMgc2V0QmFyY29kZVJlYWRlcihpbnA6IElucHV0Q2xhc3MpOiB2b2lkIHtcclxuICAgIGlucC5idXR0b24gPSAnYmx1ZSc7XHJcbiAgICBjb25zdCBmbiA9IGlucC5pZCArICdTZXRCYXJjb2RlU2NhblZhbHVlJztcclxuICAgIGlucC5vbkNsaWNrQnV0dG9uID0gKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB3aW5kb3cuSlNJbnRlcmZhY2Uuc3RhcnRCYXJjb2RlU2Nhbihmbik7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgd2luZG93W2ZuXSA9IChzKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucC50eXBlID09PSBJbnB1dFR5cGUuVGV4dCkge1xyXG4gICAgICAgICAgaW5wLnNldFZhbHVlKHMsIGZhbHNlKTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAkKCcjJyArIGlucC5pZCArICdUZXh0SW5wdXQgLmNvbnRyb2wnKS5jbGljaygpO1xyXG4gICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlucC5vbkJhcmNvZGVSZWFkZXJDaGFuZ2UgIT09IG51bGwpe1xyXG4gICAgICAgICAgaW5wLm9uQmFyY29kZVJlYWRlckNoYW5nZShzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXRSYW5kb21JbnQobWluLCBtYXgpOiBudW1iZXJ7XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKSArIG1pbjtcclxuICB9XHJcbiAgc3RhdGljIGZpeENoYXJzKHN0cik6IHN0cmluZ3tcclxuICAgIGlmIChzdHIgPT0gbnVsbCl7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYXJhYmljTGV0dGVyID0gWyAn2YonLCAn2YMnLCAn2KknIF07XHJcbiAgICBjb25zdCBwZXJzaWFuTGV0dGVyID0gWyAn24wnLCAn2qknLCAn2YcnIF07XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKylcclxuICAgIHtcclxuICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGFyYWJpY0xldHRlcltpXSwgJ2cnKTtcclxuICAgICAgc3RyID0gc3RyLnRvU3RyaW5nKCkucmVwbGFjZShyZSwgcGVyc2lhbkxldHRlcltpXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyLnRvU3RyaW5nKClcclxuICAgICAgLnJlcGxhY2UoL1vbsC3buV0vZywgZCA9PiAn27Dbsduy27PbtNu127bbt9u427knLmluZGV4T2YoZCkpXHJcbiAgICAgIC5yZXBsYWNlKC9b2aAt2aldL2csIGQgPT4gJ9mg2aHZotmj2aTZpdmm2afZqNmpJy5pbmRleE9mKGQpKTtcclxuICB9XHJcbiAgc3RhdGljIFRvUmVhZGFibGVQbGFxdWUocCk6IHN0cmluZ3tcclxuICAgIGNvbnN0IHRuID0gcC5zcGxpdCgnXycpO1xyXG4gICAgaWYgKHRuLmxlbmd0aCA9PT0gNCl7XHJcbiAgICAgIHRuWzFdICs9ICcmbHJtOyc7XHJcbiAgICAgIHRuWzJdICs9ICcgfCc7XHJcbiAgICAgIHJldHVybiB0bi5qb2luKCcgJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG4uam9pbignICcpO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0RmlsZUljb24oZik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmaWxlSWNvbnMgPSB7XHJcbiAgICAgIGpwZWc6ICdmYWQgZmEtZmlsZS1pbWFnZScsIGpwZzogJ2ZhZCBmYS1maWxlLWltYWdlJywgcG5nOiAnZmFkIGZhLWZpbGUtaW1hZ2UnLFxyXG4gICAgICBkb2M6ICdmYWQgZmEtZmlsZS13b3JkJywgZG9jeDogJ2ZhZCBmYS1maWxlLXdvcmQnLFxyXG4gICAgICB4bHM6ICdmYWQgZmEtZmlsZS1leGNlbCcsIHhsc3g6ICdmYWQgZmEtZmlsZS1leGNlbCcsIGNzdjogJ2ZhZCBmYS1maWxlLWNzdicsXHJcbiAgICAgIHBwdDogJ2ZhZCBmYS1maWxlLXBvd2VycG9pbnQnLCBwcHR4OiAnZmFkIGZhLWZpbGUtcG93ZXJwb2ludCcsXHJcbiAgICAgIHR4dDogJ2ZhZCBmYS1maWxlLWxpbmVzJywgcGRmOiAnZmFkIGZhLWZpbGUtcGRmJywgZmlsZTogJ2ZhZCBmYS1maWxlJyxcclxuICAgICAgemlwOiAnZmFkIGZhLWZpbGUtemlwcGVyJywgcmFyOiAnZmFkIGZhLWZpbGUtemlwcGVyJ1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGsgPSBmLnNwbGl0KCcuJykuYXQoLTEpO1xyXG4gICAgcmV0dXJuIGZpbGVJY29uc1trXSA/IGZpbGVJY29uc1trXSA6IGZpbGVJY29ucy5maWxlO1xyXG4gIH1cclxuICBzdGF0aWMgZ3JvdXBCeShkYXRhLCBpdGVyYXRlZSk6IGFueXtcclxuICAgIHJldHVybiBfLmdyb3VwQnkoZGF0YSwgaXRlcmF0ZWUpO1xyXG4gIH1cclxuICBzdGF0aWMgZ2V0VGFibGVQZXJtaXNzaW9ucyhsID0gdHJ1ZSwgaSA9IHRydWUsIHUgPSB0cnVlLCBkID0gdHJ1ZSk6IFBlcm1pc3Npb25DbGFzcyB7XHJcbiAgICBjb25zdCBwID0gbmV3IFBlcm1pc3Npb25DbGFzcygpO1xyXG4gICAgcC5UeXBlID0gUGVybWlzc2lvblR5cGVFbnVtLkZvcm07XHJcbiAgICBjb25zdCBsQWNjZXNzID0gbmV3IFBlcm1pc3Npb25DbGFzcygpO1xyXG4gICAgbEFjY2Vzcy5BY3Rpb24gPSAnTGlzdCc7XHJcbiAgICBsQWNjZXNzLlR5cGUgPSBQZXJtaXNzaW9uVHlwZUVudW0uQWNjZXNzO1xyXG4gICAgbEFjY2Vzcy5BY2Nlc3NUeXBlID0gUGVybWlzc2lvbkFjY2Vzc1R5cGVFbnVtLkxpc3Q7XHJcbiAgICBsQWNjZXNzLklucHV0QWN0aW9uID0gUGVybWlzc2lvbklucHV0QWN0aW9uRW51bS5Ob25lO1xyXG4gICAgbEFjY2Vzcy5JbnB1dFR5cGUgPSBQZXJtaXNzaW9uSW5wdXRUeXBlRW51bS5JY29uO1xyXG4gICAgY29uc3QgaUFjY2VzcyA9IG5ldyBQZXJtaXNzaW9uQ2xhc3MoKTtcclxuICAgIGlBY2Nlc3MuQWN0aW9uID0gJ0luc2VydCc7XHJcbiAgICBpQWNjZXNzLlR5cGUgPSBQZXJtaXNzaW9uVHlwZUVudW0uQWNjZXNzO1xyXG4gICAgaUFjY2Vzcy5JbnB1dEFjdGlvbiA9IFBlcm1pc3Npb25JbnB1dEFjdGlvbkVudW0uTW9kYWw7XHJcbiAgICBpQWNjZXNzLklucHV0VHlwZSA9IFBlcm1pc3Npb25JbnB1dFR5cGVFbnVtLkJ1dHRvbjtcclxuICAgIGlBY2Nlc3MuQWNjZXNzVHlwZSA9IFBlcm1pc3Npb25BY2Nlc3NUeXBlRW51bS5JbnNlcnQ7XHJcbiAgICBjb25zdCB1QWNjZXNzID0gbmV3IFBlcm1pc3Npb25DbGFzcygpO1xyXG4gICAgdUFjY2Vzcy5BY3Rpb24gPSAnVXBkYXRlJztcclxuICAgIHVBY2Nlc3MuVHlwZSA9IFBlcm1pc3Npb25UeXBlRW51bS5PcHRpb247XHJcbiAgICB1QWNjZXNzLklucHV0QWN0aW9uID0gUGVybWlzc2lvbklucHV0QWN0aW9uRW51bS5Ob25lO1xyXG4gICAgdUFjY2Vzcy5JbnB1dFR5cGUgPSBQZXJtaXNzaW9uSW5wdXRUeXBlRW51bS5JY29uO1xyXG4gICAgdUFjY2Vzcy5BY2Nlc3NUeXBlID0gUGVybWlzc2lvbkFjY2Vzc1R5cGVFbnVtLlVwZGF0ZTtcclxuICAgIHVBY2Nlc3MuSWNvbiA9ICdmYWQgZmEtcGVuJztcclxuICAgIHVBY2Nlc3MuTmFtZSA9ICdVcGRhdGUnO1xyXG4gICAgY29uc3QgZEFjY2VzcyA9IG5ldyBQZXJtaXNzaW9uQ2xhc3MoKTtcclxuICAgIGRBY2Nlc3MuQWN0aW9uID0gJ0RlbGV0ZSc7XHJcbiAgICBkQWNjZXNzLlR5cGUgPSBQZXJtaXNzaW9uVHlwZUVudW0uT3B0aW9uO1xyXG4gICAgZEFjY2Vzcy5JbnB1dEFjdGlvbiA9IFBlcm1pc3Npb25JbnB1dEFjdGlvbkVudW0uTm9uZTtcclxuICAgIGRBY2Nlc3MuSW5wdXRUeXBlID0gUGVybWlzc2lvbklucHV0VHlwZUVudW0uSWNvbjtcclxuICAgIGRBY2Nlc3MuQWNjZXNzVHlwZSA9IFBlcm1pc3Npb25BY2Nlc3NUeXBlRW51bS5EZWxldGU7XHJcbiAgICBkQWNjZXNzLkljb24gPSAnZmFkIGZhLXRyYXNoJztcclxuICAgIGRBY2Nlc3MuTmFtZSA9ICdEZWxldGUnO1xyXG4gICAgcC5BY2Nlc3NlcyA9IFtdO1xyXG4gICAgaWYgKGwpIHtcclxuICAgICAgcC5BY2Nlc3Nlcy5wdXNoKGxBY2Nlc3MpO1xyXG4gICAgfVxyXG4gICAgaWYgKGkpIHtcclxuICAgICAgcC5BY2Nlc3Nlcy5wdXNoKGlBY2Nlc3MpO1xyXG4gICAgfVxyXG4gICAgaWYgKHUpIHtcclxuICAgICAgcC5BY2Nlc3Nlcy5wdXNoKHVBY2Nlc3MpO1xyXG4gICAgfVxyXG4gICAgaWYgKGQpIHtcclxuICAgICAgcC5BY2Nlc3Nlcy5wdXNoKGRBY2Nlc3MpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHA7XHJcbiAgfVxyXG4gIHN0YXRpYyBqc29uVG9Gb3JtRGF0YShqc29uLCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpLCBwYXJlbnRLZXkgPSAnJyk6IEZvcm1EYXRhIHtcclxuICAgIGlmICh0eXBlb2YganNvbiA9PT0gJ29iamVjdCcgJiYganNvbiAhPT0gbnVsbCkge1xyXG4gICAgICBPYmplY3Qua2V5cyhqc29uKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgY29uc3QgZnVsbEtleSA9IHBhcmVudEtleSA/IGAke3BhcmVudEtleX1bJHtrZXl9XWAgOiBrZXk7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBqc29uW2tleV07XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8g2Kfar9ixINmF2YLYr9in2LEgbnVsbCDYp9iz2KrYjCDYotmGINix2Kcg2YbYp9iv24zYr9mHINio2q/bjNixXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgLy8g2Kfar9ixINii2KjYrNqp2Kog2KfYs9iq2Iwg2KjZhyDYtdmI2LHYqiDYqNin2LLar9i02KrbjCDZgdix2KfYrtmI2KfZhtuMINqp2YZcclxuICAgICAgICAgIHRoaXMuanNvblRvRm9ybURhdGEodmFsdWUsIGZvcm1EYXRhLCBmdWxsS2V5KTtcclxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAvLyDYp9qv2LEg2KLYsdin24zZhyDYp9iz2KrYjCDZh9ixINi52LbZiCDYsdinINis2K/Yp9qv2KfZhtmHINin2LbYp9mB2Ycg2qnZhlxyXG4gICAgICAgICAgdmFsdWUuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYXJyYXlLZXkgPSBgJHtmdWxsS2V5fVske2luZGV4fV1gO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIC8vINin2q/YsSDZhdmC2K/Yp9ixIG51bGwg2KfYs9iq2Iwg2KLZhiDYsdinINmG2KfYr9uM2K/ZhyDYqNqv24zYsVxyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICB0aGlzLmpzb25Ub0Zvcm1EYXRhKGl0ZW0sIGZvcm1EYXRhLCBhcnJheUtleSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGFycmF5S2V5LCBpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vINmF2YLYr9in2LEg2LPYp9iv2Ycg2LHYpyDYp9i22KfZgdmHINqp2YZcclxuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChmdWxsS2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtRGF0YTtcclxuICB9XHJcbn1cclxuIl19
|