ps-toolkit-ui 1.20.91 → 1.21.32

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.
Files changed (169) hide show
  1. package/fesm2022/ps-toolkit-ui.mjs +9415 -0
  2. package/fesm2022/ps-toolkit-ui.mjs.map +1 -0
  3. package/package.json +16 -12
  4. package/types/ps-toolkit-ui.d.ts +1671 -0
  5. package/bundles/ps-toolkit-ui.umd.js +0 -10321
  6. package/bundles/ps-toolkit-ui.umd.js.map +0 -1
  7. package/bundles/ps-toolkit-ui.umd.min.js +0 -2
  8. package/bundles/ps-toolkit-ui.umd.min.js.map +0 -1
  9. package/esm2015/lib/classes/addModal.class.js +0 -36
  10. package/esm2015/lib/classes/chart.class.js +0 -165
  11. package/esm2015/lib/classes/currentDataClass.js +0 -17
  12. package/esm2015/lib/classes/enum.class.js +0 -253
  13. package/esm2015/lib/classes/excel.class.js +0 -56
  14. package/esm2015/lib/classes/form.class.js +0 -667
  15. package/esm2015/lib/classes/header.class.js +0 -16
  16. package/esm2015/lib/classes/helper.class.js +0 -650
  17. package/esm2015/lib/classes/lang.class.js +0 -35
  18. package/esm2015/lib/classes/login.class.js +0 -29
  19. package/esm2015/lib/classes/modal.class.js +0 -49
  20. package/esm2015/lib/classes/permission.class.js +0 -63
  21. package/esm2015/lib/classes/request.class.js +0 -155
  22. package/esm2015/lib/classes/safehtml.class.js +0 -17
  23. package/esm2015/lib/classes/safestyle.class.js +0 -17
  24. package/esm2015/lib/classes/sidebar.class.js +0 -16
  25. package/esm2015/lib/classes/steps.class.js +0 -45
  26. package/esm2015/lib/classes/string.class.js +0 -251
  27. package/esm2015/lib/classes/table.class.js +0 -593
  28. package/esm2015/lib/components/accordion/accordion.component.js +0 -45
  29. package/esm2015/lib/components/alert/alert.component.js +0 -39
  30. package/esm2015/lib/components/base.component.js +0 -54
  31. package/esm2015/lib/components/calendar/calendar.component.js +0 -98
  32. package/esm2015/lib/components/chart/chart.component.js +0 -17
  33. package/esm2015/lib/components/clock/clock.component.js +0 -33
  34. package/esm2015/lib/components/confirm/confirm.component.js +0 -50
  35. package/esm2015/lib/components/error/error.component.js +0 -26
  36. package/esm2015/lib/components/footer/footer.component.js +0 -23
  37. package/esm2015/lib/components/form/bank-card/form.bank-card.component.js +0 -200
  38. package/esm2015/lib/components/form/button/form.button.component.js +0 -68
  39. package/esm2015/lib/components/form/checkbox/form.checkbox.component.js +0 -67
  40. package/esm2015/lib/components/form/ckeditor/form.ckeditor.component.js +0 -90
  41. package/esm2015/lib/components/form/date/form.date.component.js +0 -314
  42. package/esm2015/lib/components/form/datetime/form.datetime.component.js +0 -106
  43. package/esm2015/lib/components/form/file/form.file.component.js +0 -124
  44. package/esm2015/lib/components/form/finger/form.finger.component.js +0 -140
  45. package/esm2015/lib/components/form/hidden/form.hidden.component.js +0 -31
  46. package/esm2015/lib/components/form/icon/form.icon.component.js +0 -84
  47. package/esm2015/lib/components/form/index/form.component.js +0 -51
  48. package/esm2015/lib/components/form/label/form.label.component.js +0 -32
  49. package/esm2015/lib/components/form/plaque/form.plaque.component.js +0 -258
  50. package/esm2015/lib/components/form/plaque/select/form.plaque.select.component.js +0 -468
  51. package/esm2015/lib/components/form/radio/form.radio.component.js +0 -82
  52. package/esm2015/lib/components/form/select/form.select.component.js +0 -452
  53. package/esm2015/lib/components/form/select/item/form.select.item.component.js +0 -27
  54. package/esm2015/lib/components/form/slide/form.slide.component.js +0 -84
  55. package/esm2015/lib/components/form/star/form.star.component.js +0 -66
  56. package/esm2015/lib/components/form/table/form.table.component.js +0 -96
  57. package/esm2015/lib/components/form/tag/form.tag.component.js +0 -100
  58. package/esm2015/lib/components/form/textarea/form.textarea.component.js +0 -83
  59. package/esm2015/lib/components/form/textbox/form.textbox.component.js +0 -227
  60. package/esm2015/lib/components/form/time/form.time.component.js +0 -149
  61. package/esm2015/lib/components/form/toggle/form.toggle.component.js +0 -72
  62. package/esm2015/lib/components/form/tree/form.tree.component.js +0 -157
  63. package/esm2015/lib/components/form/tree/item/form.tree.item.component.js +0 -50
  64. package/esm2015/lib/components/form/uploader/form.uploader.component.js +0 -159
  65. package/esm2015/lib/components/form/vehicle/form.vehicle.component.js +0 -104
  66. package/esm2015/lib/components/form/vehicle/search/form.vehicle.search.component.js +0 -237
  67. package/esm2015/lib/components/header/header.component.js +0 -28
  68. package/esm2015/lib/components/header/sub/sub.header.component.js +0 -14
  69. package/esm2015/lib/components/layout/layout.component.js +0 -18
  70. package/esm2015/lib/components/loading/loading.component.js +0 -22
  71. package/esm2015/lib/components/login/login.component.js +0 -159
  72. package/esm2015/lib/components/modal/modal.component.js +0 -25
  73. package/esm2015/lib/components/notfound/notfound.component.js +0 -29
  74. package/esm2015/lib/components/notification/notification.component.js +0 -14
  75. package/esm2015/lib/components/sidebar/item/sidebar.item.component.js +0 -55
  76. package/esm2015/lib/components/sidebar/sidebar.component.js +0 -98
  77. package/esm2015/lib/components/steps/steps.component.js +0 -88
  78. package/esm2015/lib/components/table/loading/table.loading.component.js +0 -17
  79. package/esm2015/lib/components/table/pagination/table.pagination.component.js +0 -84
  80. package/esm2015/lib/components/table/row/table.row.component.js +0 -450
  81. package/esm2015/lib/components/table/table.component.js +0 -240
  82. package/esm2015/lib/components/tooltip/tooltip.component.js +0 -19
  83. package/esm2015/lib/ps-toolkit-ui.module.js +0 -105
  84. package/esm2015/lib/services/config.service.js +0 -14
  85. package/esm2015/lib/services/sidebar.service.js +0 -21
  86. package/esm2015/ps-toolkit-ui.js +0 -21
  87. package/esm2015/public-api.js +0 -64
  88. package/fesm2015/ps-toolkit-ui.js +0 -8926
  89. package/fesm2015/ps-toolkit-ui.js.map +0 -1
  90. package/lib/classes/addModal.class.d.ts +0 -14
  91. package/lib/classes/chart.class.d.ts +0 -15
  92. package/lib/classes/currentDataClass.d.ts +0 -10
  93. package/lib/classes/enum.class.d.ts +0 -221
  94. package/lib/classes/excel.class.d.ts +0 -8
  95. package/lib/classes/form.class.d.ts +0 -193
  96. package/lib/classes/header.class.d.ts +0 -8
  97. package/lib/classes/helper.class.d.ts +0 -50
  98. package/lib/classes/lang.class.d.ts +0 -5
  99. package/lib/classes/login.class.d.ts +0 -21
  100. package/lib/classes/modal.class.d.ts +0 -19
  101. package/lib/classes/permission.class.d.ts +0 -35
  102. package/lib/classes/request.class.d.ts +0 -10
  103. package/lib/classes/safehtml.class.d.ts +0 -7
  104. package/lib/classes/safestyle.class.d.ts +0 -7
  105. package/lib/classes/sidebar.class.d.ts +0 -14
  106. package/lib/classes/steps.class.d.ts +0 -31
  107. package/lib/classes/string.class.d.ts +0 -249
  108. package/lib/classes/table.class.d.ts +0 -88
  109. package/lib/components/accordion/accordion.component.d.ts +0 -7
  110. package/lib/components/alert/alert.component.d.ts +0 -10
  111. package/lib/components/base.component.d.ts +0 -17
  112. package/lib/components/calendar/calendar.component.d.ts +0 -26
  113. package/lib/components/chart/chart.component.d.ts +0 -5
  114. package/lib/components/clock/clock.component.d.ts +0 -11
  115. package/lib/components/confirm/confirm.component.d.ts +0 -14
  116. package/lib/components/error/error.component.d.ts +0 -7
  117. package/lib/components/footer/footer.component.d.ts +0 -6
  118. package/lib/components/form/bank-card/form.bank-card.component.d.ts +0 -28
  119. package/lib/components/form/button/form.button.component.d.ts +0 -15
  120. package/lib/components/form/checkbox/form.checkbox.component.d.ts +0 -14
  121. package/lib/components/form/ckeditor/form.ckeditor.component.d.ts +0 -14
  122. package/lib/components/form/date/form.date.component.d.ts +0 -45
  123. package/lib/components/form/datetime/form.datetime.component.d.ts +0 -13
  124. package/lib/components/form/file/form.file.component.d.ts +0 -18
  125. package/lib/components/form/finger/form.finger.component.d.ts +0 -15
  126. package/lib/components/form/hidden/form.hidden.component.d.ts +0 -7
  127. package/lib/components/form/icon/form.icon.component.d.ts +0 -16
  128. package/lib/components/form/index/form.component.d.ts +0 -10
  129. package/lib/components/form/label/form.label.component.d.ts +0 -8
  130. package/lib/components/form/plaque/form.plaque.component.d.ts +0 -21
  131. package/lib/components/form/plaque/select/form.plaque.select.component.d.ts +0 -38
  132. package/lib/components/form/radio/form.radio.component.d.ts +0 -13
  133. package/lib/components/form/select/form.select.component.d.ts +0 -45
  134. package/lib/components/form/select/item/form.select.item.component.d.ts +0 -12
  135. package/lib/components/form/slide/form.slide.component.d.ts +0 -13
  136. package/lib/components/form/star/form.star.component.d.ts +0 -13
  137. package/lib/components/form/table/form.table.component.d.ts +0 -9
  138. package/lib/components/form/tag/form.tag.component.d.ts +0 -16
  139. package/lib/components/form/textarea/form.textarea.component.d.ts +0 -13
  140. package/lib/components/form/textbox/form.textbox.component.d.ts +0 -20
  141. package/lib/components/form/time/form.time.component.d.ts +0 -25
  142. package/lib/components/form/toggle/form.toggle.component.d.ts +0 -13
  143. package/lib/components/form/tree/form.tree.component.d.ts +0 -21
  144. package/lib/components/form/tree/item/form.tree.item.component.d.ts +0 -19
  145. package/lib/components/form/uploader/form.uploader.component.d.ts +0 -21
  146. package/lib/components/form/vehicle/form.vehicle.component.d.ts +0 -18
  147. package/lib/components/form/vehicle/search/form.vehicle.search.component.d.ts +0 -22
  148. package/lib/components/header/header.component.d.ts +0 -10
  149. package/lib/components/header/sub/sub.header.component.d.ts +0 -3
  150. package/lib/components/layout/layout.component.d.ts +0 -7
  151. package/lib/components/loading/loading.component.d.ts +0 -5
  152. package/lib/components/login/login.component.d.ts +0 -15
  153. package/lib/components/modal/modal.component.d.ts +0 -9
  154. package/lib/components/notfound/notfound.component.d.ts +0 -8
  155. package/lib/components/notification/notification.component.d.ts +0 -3
  156. package/lib/components/sidebar/item/sidebar.item.component.d.ts +0 -14
  157. package/lib/components/sidebar/sidebar.component.d.ts +0 -22
  158. package/lib/components/steps/steps.component.d.ts +0 -16
  159. package/lib/components/table/loading/table.loading.component.d.ts +0 -5
  160. package/lib/components/table/pagination/table.pagination.component.d.ts +0 -15
  161. package/lib/components/table/row/table.row.component.d.ts +0 -44
  162. package/lib/components/table/table.component.d.ts +0 -43
  163. package/lib/components/tooltip/tooltip.component.d.ts +0 -5
  164. package/lib/ps-toolkit-ui.module.d.ts +0 -4
  165. package/lib/services/config.service.d.ts +0 -6
  166. package/lib/services/sidebar.service.d.ts +0 -9
  167. package/ps-toolkit-ui.d.ts +0 -20
  168. package/ps-toolkit-ui.metadata.json +0 -1
  169. package/public-api.d.ts +0 -60
@@ -1,650 +0,0 @@
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] += '&lrm;';
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