raise-common-lib 0.0.248 → 0.0.249
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -57
- package/bundles/raise-common-lib.umd.js +1937 -12
- package/bundles/raise-common-lib.umd.js.map +1 -1
- package/bundles/raise-common-lib.umd.min.js +1 -1
- package/bundles/raise-common-lib.umd.min.js.map +1 -1
- package/esm2015/lib/common-grid/index.component.js +210 -8
- package/esm2015/lib/date-tree-filter/date-tree-filter-popover/index.component.js +761 -0
- package/esm2015/lib/date-tree-filter/date-tree-filter.helper.js +679 -0
- package/esm2015/lib/raise-common-lib.module.js +4 -1
- package/esm2015/public-api.js +3 -1
- package/esm2015/raise-common-lib.js +2 -2
- package/esm5/lib/common-grid/index.component.js +244 -8
- package/esm5/lib/date-tree-filter/date-tree-filter-popover/index.component.js +902 -0
- package/esm5/lib/date-tree-filter/date-tree-filter.helper.js +787 -0
- package/esm5/lib/raise-common-lib.module.js +4 -1
- package/esm5/public-api.js +3 -1
- package/esm5/raise-common-lib.js +2 -2
- package/fesm2015/raise-common-lib.js +1649 -9
- package/fesm2015/raise-common-lib.js.map +1 -1
- package/fesm5/raise-common-lib.js +1931 -10
- package/fesm5/raise-common-lib.js.map +1 -1
- package/lib/common-grid/index.component.d.ts +30 -1
- package/lib/date-tree-filter/date-tree-filter-popover/index.component.d.ts +46 -0
- package/lib/date-tree-filter/date-tree-filter.helper.d.ts +54 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/raise-common-lib.metadata.json +1 -1
- package/src/assets/img/arrow_right.svg +4 -4
- package/src/assets/img/calendar-disabled.svg +6 -6
- package/src/assets/img/calendar.svg +6 -6
- package/src/assets/img/calendar_arrow_left.svg +3 -3
- package/src/assets/img/calendar_arrow_right.svg +3 -3
- package/src/assets/img/checked-vector.svg +3 -3
- package/src/assets/img/dialog-close.svg +4 -4
- package/src/assets/img/dialog-grow.svg +6 -6
- package/src/assets/img/dialog-shrink.svg +6 -6
- package/src/assets/img/plus.svg +4 -4
- package/src/assets/img/raise_logo_main_new.svg +27 -27
- package/src/assets/img/search.svg +4 -4
- package/src/assets/img/shrink-icon.svg +6 -6
- package/src/assets/img/time-disabled.svg +4 -4
- package/src/assets/img/time.svg +4 -4
- package/src/assets/img/toolbar-action-addFolder.svg +17 -17
- package/src/assets/img/toolbar-action-calculator.svg +11 -11
- package/src/assets/img/toolbar-action-collapse.svg +7 -7
- package/src/assets/img/toolbar-action-combine.svg +4 -4
- package/src/assets/img/toolbar-action-edit.svg +4 -4
- package/src/assets/img/toolbar-action-expand.svg +7 -7
- package/src/assets/img/toolbar-action-folderMove.svg +8 -8
- package/src/assets/img/toolbar-action-lock.svg +6 -6
- package/src/assets/img/toolbar-action-preview.svg +7 -7
- package/src/assets/img/toolbar-action-publish.svg +5 -5
- package/src/assets/img/toolbar-action-reminders.svg +10 -10
- package/src/assets/img/toolbar-action-rename.svg +7 -7
- package/src/assets/img/toolbar-action-saveSequence.svg +5 -5
- package/src/assets/img/toolbar-action-send-file.svg +5 -5
- package/src/assets/img/toolbar-action-settle.svg +7 -7
- package/src/assets/img/toolbar-action-share.svg +5 -5
- package/src/assets/img/toolbar-action-submitForApproval.svg +4 -4
- package/src/assets/img/toolbar-action-sync.svg +4 -4
- package/src/assets/img/toolbar-action-template.svg +6 -6
- package/src/assets/img/toolbar-action-workflow.svg +9 -9
|
@@ -0,0 +1,679 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview added by tsickle
|
|
3
|
+
* Generated from: lib/date-tree-filter/date-tree-filter.helper.ts
|
|
4
|
+
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
+
*/
|
|
6
|
+
import moment from "moment";
|
|
7
|
+
/**
|
|
8
|
+
* @record
|
|
9
|
+
*/
|
|
10
|
+
export function DateTreeFilterSetupOptions() { }
|
|
11
|
+
if (false) {
|
|
12
|
+
/** @type {?} */
|
|
13
|
+
DateTreeFilterSetupOptions.prototype.rows;
|
|
14
|
+
/** @type {?} */
|
|
15
|
+
DateTreeFilterSetupOptions.prototype.fields;
|
|
16
|
+
/** @type {?} */
|
|
17
|
+
DateTreeFilterSetupOptions.prototype.hints;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @record
|
|
21
|
+
*/
|
|
22
|
+
export function DateTreeFilterHelperOptions() { }
|
|
23
|
+
if (false) {
|
|
24
|
+
/** @type {?} */
|
|
25
|
+
DateTreeFilterHelperOptions.prototype.getTranslation;
|
|
26
|
+
/** @type {?} */
|
|
27
|
+
DateTreeFilterHelperOptions.prototype.getPopoverElement;
|
|
28
|
+
/** @type {?} */
|
|
29
|
+
DateTreeFilterHelperOptions.prototype.getGridElement;
|
|
30
|
+
/** @type {?} */
|
|
31
|
+
DateTreeFilterHelperOptions.prototype.applyRows;
|
|
32
|
+
/** @type {?|undefined} */
|
|
33
|
+
DateTreeFilterHelperOptions.prototype.parseDateValue;
|
|
34
|
+
/** @type {?|undefined} */
|
|
35
|
+
DateTreeFilterHelperOptions.prototype.dateFormats;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @record
|
|
39
|
+
*/
|
|
40
|
+
export function RsCommonGridDateTreeFactoryHost() { }
|
|
41
|
+
if (false) {
|
|
42
|
+
/** @type {?} */
|
|
43
|
+
RsCommonGridDateTreeFactoryHost.prototype.translation;
|
|
44
|
+
/** @type {?} */
|
|
45
|
+
RsCommonGridDateTreeFactoryHost.prototype.dateTreePopoverRef;
|
|
46
|
+
/** @type {?} */
|
|
47
|
+
RsCommonGridDateTreeFactoryHost.prototype.grid;
|
|
48
|
+
}
|
|
49
|
+
/** @type {?} */
|
|
50
|
+
export const DATE_TREE_DEFAULT_DATE_FORMATS = [
|
|
51
|
+
"YYYY-MM-DD",
|
|
52
|
+
"MM/DD/YYYY",
|
|
53
|
+
"DD/MM/YYYY",
|
|
54
|
+
"YYYY/MM/DD",
|
|
55
|
+
"DD-MMM-YYYY",
|
|
56
|
+
"MMM DD, YYYY",
|
|
57
|
+
];
|
|
58
|
+
export class DateTreeFilterHelper {
|
|
59
|
+
/**
|
|
60
|
+
* @param {?} options
|
|
61
|
+
*/
|
|
62
|
+
constructor(options) {
|
|
63
|
+
this.popoverVisible = false;
|
|
64
|
+
this.popoverField = "";
|
|
65
|
+
this.popoverStyle = {};
|
|
66
|
+
this.selectedByField = {};
|
|
67
|
+
this.fieldLabelMap = {};
|
|
68
|
+
this.dateFields = [];
|
|
69
|
+
this.sourceRows = [];
|
|
70
|
+
this.defaultDateFormats = [
|
|
71
|
+
"YYYY-MM-DD",
|
|
72
|
+
"MM/DD/YYYY",
|
|
73
|
+
"DD/MM/YYYY",
|
|
74
|
+
"YYYY/MM/DD",
|
|
75
|
+
"DD-MMM-YYYY",
|
|
76
|
+
"DD-MMM-YYYY hh:mm A",
|
|
77
|
+
"MMM DD, YYYY",
|
|
78
|
+
moment.ISO_8601,
|
|
79
|
+
];
|
|
80
|
+
this.options = options;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* @param {?} config
|
|
84
|
+
* @return {?}
|
|
85
|
+
*/
|
|
86
|
+
setup(config) {
|
|
87
|
+
/** @type {?} */
|
|
88
|
+
var rows = config && config.rows ? config.rows : [];
|
|
89
|
+
/** @type {?} */
|
|
90
|
+
var fields = config && config.fields ? config.fields : [];
|
|
91
|
+
/** @type {?} */
|
|
92
|
+
var hints = config && config.hints ? config.hints : [];
|
|
93
|
+
this.sourceRows = rows;
|
|
94
|
+
this.dateFields = this.resolveDateTreeFieldsByHints(fields, hints);
|
|
95
|
+
this.fieldLabelMap = {};
|
|
96
|
+
(fields || []).forEach((/**
|
|
97
|
+
* @param {?} item
|
|
98
|
+
* @return {?}
|
|
99
|
+
*/
|
|
100
|
+
(item) => {
|
|
101
|
+
if (!item || !item.columnName) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.fieldLabelMap[item.columnName] =
|
|
105
|
+
item.columnDisplayName || item.columnName;
|
|
106
|
+
}));
|
|
107
|
+
this.apply();
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* @param {?} args
|
|
111
|
+
* @return {?}
|
|
112
|
+
*/
|
|
113
|
+
handleGridActionBegin(args) {
|
|
114
|
+
/** @type {?} */
|
|
115
|
+
var requestType = this.getRequestType(args);
|
|
116
|
+
if (requestType === "filterchoicerequest" ||
|
|
117
|
+
requestType === "filtersearchbegin") {
|
|
118
|
+
args.filterChoiceCount = 15000;
|
|
119
|
+
}
|
|
120
|
+
if (requestType !== "filterbeforeopen") {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
/** @type {?} */
|
|
124
|
+
var columnName = this.resolveActionColumnName(args);
|
|
125
|
+
if (!this.isDateTreeField(columnName)) {
|
|
126
|
+
this.close();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
args.cancel = true;
|
|
130
|
+
this.open(columnName);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* @param {?} selectionMap
|
|
134
|
+
* @return {?}
|
|
135
|
+
*/
|
|
136
|
+
updateSelection(selectionMap) {
|
|
137
|
+
this.selectedByField = selectionMap || {};
|
|
138
|
+
this.apply();
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* @return {?}
|
|
142
|
+
*/
|
|
143
|
+
close() {
|
|
144
|
+
if (!this.popoverVisible) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
this.popoverVisible = false;
|
|
148
|
+
this.popoverField = "";
|
|
149
|
+
this.popoverStyle = {};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* @param {?} event
|
|
153
|
+
* @return {?}
|
|
154
|
+
*/
|
|
155
|
+
handleDocumentMouseDown(event) {
|
|
156
|
+
if (!this.popoverVisible) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
/** @type {?} */
|
|
160
|
+
var target = (/** @type {?} */ (event.target));
|
|
161
|
+
if (!target) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (this.isInsidePopover(target) || this.isDateFilterMenuItem(target)) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
this.close();
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* @param {?} event
|
|
171
|
+
* @return {?}
|
|
172
|
+
*/
|
|
173
|
+
handleDocumentMouseOver(event) {
|
|
174
|
+
if (!this.popoverVisible) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
/** @type {?} */
|
|
178
|
+
var target = (/** @type {?} */ (event.target));
|
|
179
|
+
if (!target) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (this.isInsidePopover(target)) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
/** @type {?} */
|
|
186
|
+
var menuItem = (/** @type {?} */ (target.closest(".e-menu-item")));
|
|
187
|
+
if (menuItem) {
|
|
188
|
+
if (!this.isDateFilterMenuItem(menuItem)) {
|
|
189
|
+
this.close();
|
|
190
|
+
}
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
/** @type {?} */
|
|
194
|
+
var otherFilterTarget = (/** @type {?} */ (target.closest(".e-filtermenudiv, .e-headercell .e-columnmenu, .e-columnmenu, .e-contextmenu")));
|
|
195
|
+
if (otherFilterTarget && !this.isDateFilterMenuItem(otherFilterTarget)) {
|
|
196
|
+
this.close();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* @return {?}
|
|
201
|
+
*/
|
|
202
|
+
updatePosition() {
|
|
203
|
+
if (!this.popoverVisible) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
/** @type {?} */
|
|
207
|
+
var anchor = this.findDateFilterAnchorElement();
|
|
208
|
+
if (anchor) {
|
|
209
|
+
/** @type {?} */
|
|
210
|
+
var rect = anchor.getBoundingClientRect();
|
|
211
|
+
/** @type {?} */
|
|
212
|
+
var viewportWidth = window.innerWidth || document.documentElement.clientWidth;
|
|
213
|
+
/** @type {?} */
|
|
214
|
+
var viewportHeight = window.innerHeight || document.documentElement.clientHeight;
|
|
215
|
+
/** @type {?} */
|
|
216
|
+
var popoverElement = this.options.getPopoverElement
|
|
217
|
+
? this.options.getPopoverElement()
|
|
218
|
+
: null;
|
|
219
|
+
/** @type {?} */
|
|
220
|
+
var popoverWidth = popoverElement && popoverElement.offsetWidth
|
|
221
|
+
? popoverElement.offsetWidth
|
|
222
|
+
: 300;
|
|
223
|
+
/** @type {?} */
|
|
224
|
+
var popoverHeight = popoverElement && popoverElement.offsetHeight
|
|
225
|
+
? popoverElement.offsetHeight
|
|
226
|
+
: 420;
|
|
227
|
+
/** @type {?} */
|
|
228
|
+
var edgeGap = 8;
|
|
229
|
+
/** @type {?} */
|
|
230
|
+
var anchorGap = 8;
|
|
231
|
+
/** @type {?} */
|
|
232
|
+
var top = rect.top - 6;
|
|
233
|
+
/** @type {?} */
|
|
234
|
+
var left = rect.right + anchorGap;
|
|
235
|
+
if (left + popoverWidth > viewportWidth - edgeGap) {
|
|
236
|
+
left = rect.left - popoverWidth - anchorGap;
|
|
237
|
+
}
|
|
238
|
+
if (left < edgeGap) {
|
|
239
|
+
left = edgeGap;
|
|
240
|
+
}
|
|
241
|
+
if (left + popoverWidth > viewportWidth - edgeGap) {
|
|
242
|
+
left = Math.max(edgeGap, viewportWidth - popoverWidth - edgeGap);
|
|
243
|
+
}
|
|
244
|
+
if (top + popoverHeight > viewportHeight - edgeGap) {
|
|
245
|
+
top = Math.max(edgeGap, viewportHeight - popoverHeight - edgeGap);
|
|
246
|
+
}
|
|
247
|
+
this.popoverStyle = {
|
|
248
|
+
position: "fixed",
|
|
249
|
+
left: left + "px",
|
|
250
|
+
top: top + "px",
|
|
251
|
+
};
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
/** @type {?} */
|
|
255
|
+
var gridElement = this.options.getGridElement
|
|
256
|
+
? this.options.getGridElement()
|
|
257
|
+
: null;
|
|
258
|
+
if (gridElement && gridElement.getBoundingClientRect) {
|
|
259
|
+
/** @type {?} */
|
|
260
|
+
var fallbackRect = gridElement.getBoundingClientRect();
|
|
261
|
+
this.popoverStyle = {
|
|
262
|
+
position: "fixed",
|
|
263
|
+
left: Math.max(8, fallbackRect.right - 312) + "px",
|
|
264
|
+
top: Math.max(8, fallbackRect.top + 8) + "px",
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* @private
|
|
270
|
+
* @param {?} field
|
|
271
|
+
* @return {?}
|
|
272
|
+
*/
|
|
273
|
+
open(field) {
|
|
274
|
+
this.popoverField = field;
|
|
275
|
+
this.popoverVisible = true;
|
|
276
|
+
this.updatePosition();
|
|
277
|
+
setTimeout((/**
|
|
278
|
+
* @return {?}
|
|
279
|
+
*/
|
|
280
|
+
() => this.updatePosition()), 50);
|
|
281
|
+
setTimeout((/**
|
|
282
|
+
* @return {?}
|
|
283
|
+
*/
|
|
284
|
+
() => this.updatePosition()), 150);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* @private
|
|
288
|
+
* @return {?}
|
|
289
|
+
*/
|
|
290
|
+
apply() {
|
|
291
|
+
/** @type {?} */
|
|
292
|
+
var filteredRows = this.filterRowsBySelectedDateTree(this.sourceRows || []);
|
|
293
|
+
this.options.applyRows(filteredRows);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* @private
|
|
297
|
+
* @param {?} args
|
|
298
|
+
* @return {?}
|
|
299
|
+
*/
|
|
300
|
+
getRequestType(args) {
|
|
301
|
+
if (!args || !args.requestType) {
|
|
302
|
+
return "";
|
|
303
|
+
}
|
|
304
|
+
return String(args.requestType).trim().toLowerCase();
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* @private
|
|
308
|
+
* @param {?} args
|
|
309
|
+
* @return {?}
|
|
310
|
+
*/
|
|
311
|
+
resolveActionColumnName(args) {
|
|
312
|
+
if (!args) {
|
|
313
|
+
return "";
|
|
314
|
+
}
|
|
315
|
+
return (args.columnName ||
|
|
316
|
+
args.field ||
|
|
317
|
+
args.currentFilteringColumn ||
|
|
318
|
+
(args.column && (args.column.field || args.column.columnName)) ||
|
|
319
|
+
"");
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* @private
|
|
323
|
+
* @param {?} fields
|
|
324
|
+
* @param {?} hints
|
|
325
|
+
* @return {?}
|
|
326
|
+
*/
|
|
327
|
+
resolveDateTreeFieldsByHints(fields, hints) {
|
|
328
|
+
/** @type {?} */
|
|
329
|
+
var normalizedHints = (hints || [])
|
|
330
|
+
.filter((/**
|
|
331
|
+
* @param {?} item
|
|
332
|
+
* @return {?}
|
|
333
|
+
*/
|
|
334
|
+
(item) => !!item))
|
|
335
|
+
.map((/**
|
|
336
|
+
* @param {?} item
|
|
337
|
+
* @return {?}
|
|
338
|
+
*/
|
|
339
|
+
(item) => String(item).trim().toLowerCase()));
|
|
340
|
+
if (!fields || !fields.length || !normalizedHints.length) {
|
|
341
|
+
return [];
|
|
342
|
+
}
|
|
343
|
+
return fields
|
|
344
|
+
.filter((/**
|
|
345
|
+
* @param {?} item
|
|
346
|
+
* @return {?}
|
|
347
|
+
*/
|
|
348
|
+
(item) => {
|
|
349
|
+
if (!item || !item.columnName) {
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
/** @type {?} */
|
|
353
|
+
var columnName = String(item.columnName || "").toLowerCase();
|
|
354
|
+
/** @type {?} */
|
|
355
|
+
var displayName = String(item.columnDisplayName || "").toLowerCase();
|
|
356
|
+
return normalizedHints.some((/**
|
|
357
|
+
* @param {?} hint
|
|
358
|
+
* @return {?}
|
|
359
|
+
*/
|
|
360
|
+
(hint) => {
|
|
361
|
+
return (columnName === hint ||
|
|
362
|
+
displayName === hint ||
|
|
363
|
+
(hint.length >= 3 &&
|
|
364
|
+
(columnName.indexOf(hint) > -1 ||
|
|
365
|
+
displayName.indexOf(hint) > -1)));
|
|
366
|
+
}));
|
|
367
|
+
}))
|
|
368
|
+
.map((/**
|
|
369
|
+
* @param {?} item
|
|
370
|
+
* @return {?}
|
|
371
|
+
*/
|
|
372
|
+
(item) => item.columnName));
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* @private
|
|
376
|
+
* @param {?} field
|
|
377
|
+
* @return {?}
|
|
378
|
+
*/
|
|
379
|
+
isDateTreeField(field) {
|
|
380
|
+
return this.dateFields.indexOf(field) > -1;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* @private
|
|
384
|
+
* @param {?} field
|
|
385
|
+
* @return {?}
|
|
386
|
+
*/
|
|
387
|
+
getFieldDaySelectionMap(field) {
|
|
388
|
+
if (!this.selectedByField[field]) {
|
|
389
|
+
this.selectedByField[field] = {};
|
|
390
|
+
}
|
|
391
|
+
return this.selectedByField[field];
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* @private
|
|
395
|
+
* @param {?} rows
|
|
396
|
+
* @param {?=} excludeField
|
|
397
|
+
* @return {?}
|
|
398
|
+
*/
|
|
399
|
+
filterRowsBySelectedDateTree(rows, excludeField) {
|
|
400
|
+
/** @type {?} */
|
|
401
|
+
var filteredRows = rows ? rows.slice() : [];
|
|
402
|
+
this.dateFields.forEach((/**
|
|
403
|
+
* @param {?} field
|
|
404
|
+
* @return {?}
|
|
405
|
+
*/
|
|
406
|
+
(field) => {
|
|
407
|
+
if (excludeField && field === excludeField) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
/** @type {?} */
|
|
411
|
+
var selectedMap = this.getFieldDaySelectionMap(field);
|
|
412
|
+
/** @type {?} */
|
|
413
|
+
var selectedKeys = Object.keys(selectedMap);
|
|
414
|
+
if (!selectedKeys.length) {
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
filteredRows = filteredRows.filter((/**
|
|
418
|
+
* @param {?} row
|
|
419
|
+
* @return {?}
|
|
420
|
+
*/
|
|
421
|
+
(row) => {
|
|
422
|
+
/** @type {?} */
|
|
423
|
+
var dayKey = this.getDayKeyByRowValue(row[field]);
|
|
424
|
+
return dayKey ? !!selectedMap[dayKey] : false;
|
|
425
|
+
}));
|
|
426
|
+
}));
|
|
427
|
+
return filteredRows;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* @private
|
|
431
|
+
* @param {?} value
|
|
432
|
+
* @return {?}
|
|
433
|
+
*/
|
|
434
|
+
getDayKeyByRowValue(value) {
|
|
435
|
+
/** @type {?} */
|
|
436
|
+
var date = this.parseDateValue(value);
|
|
437
|
+
if (!date) {
|
|
438
|
+
return "";
|
|
439
|
+
}
|
|
440
|
+
return this.toDayKey(date.getFullYear(), date.getMonth() + 1, date.getDate());
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* @private
|
|
444
|
+
* @param {?} value
|
|
445
|
+
* @return {?}
|
|
446
|
+
*/
|
|
447
|
+
parseDateValue(value) {
|
|
448
|
+
if (this.options.parseDateValue) {
|
|
449
|
+
return this.options.parseDateValue(value);
|
|
450
|
+
}
|
|
451
|
+
if (!value) {
|
|
452
|
+
return null;
|
|
453
|
+
}
|
|
454
|
+
if (value instanceof Date) {
|
|
455
|
+
return value;
|
|
456
|
+
}
|
|
457
|
+
/** @type {?} */
|
|
458
|
+
var formats = this.options && this.options.dateFormats && this.options.dateFormats.length
|
|
459
|
+
? this.options.dateFormats
|
|
460
|
+
: this.defaultDateFormats;
|
|
461
|
+
/** @type {?} */
|
|
462
|
+
var parsed = moment(value, formats, true);
|
|
463
|
+
if (parsed.isValid()) {
|
|
464
|
+
return parsed.toDate();
|
|
465
|
+
}
|
|
466
|
+
/** @type {?} */
|
|
467
|
+
var fallback = new Date(value);
|
|
468
|
+
return isNaN(fallback.getTime()) ? null : fallback;
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* @private
|
|
472
|
+
* @param {?} year
|
|
473
|
+
* @param {?} month
|
|
474
|
+
* @param {?} day
|
|
475
|
+
* @return {?}
|
|
476
|
+
*/
|
|
477
|
+
toDayKey(year, month, day) {
|
|
478
|
+
return year + "-" + this.pad2(month) + "-" + this.pad2(day);
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* @private
|
|
482
|
+
* @param {?} value
|
|
483
|
+
* @return {?}
|
|
484
|
+
*/
|
|
485
|
+
pad2(value) {
|
|
486
|
+
return value < 10 ? "0" + value : String(value);
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* @private
|
|
490
|
+
* @param {?} target
|
|
491
|
+
* @return {?}
|
|
492
|
+
*/
|
|
493
|
+
isInsidePopover(target) {
|
|
494
|
+
/** @type {?} */
|
|
495
|
+
var popoverElement = this.options.getPopoverElement
|
|
496
|
+
? this.options.getPopoverElement()
|
|
497
|
+
: null;
|
|
498
|
+
if (!target || !popoverElement) {
|
|
499
|
+
return false;
|
|
500
|
+
}
|
|
501
|
+
return popoverElement.contains(target);
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* @private
|
|
505
|
+
* @param {?} element
|
|
506
|
+
* @return {?}
|
|
507
|
+
*/
|
|
508
|
+
isDateFilterMenuItem(element) {
|
|
509
|
+
if (!element) {
|
|
510
|
+
return false;
|
|
511
|
+
}
|
|
512
|
+
/** @type {?} */
|
|
513
|
+
var menuItem = (/** @type {?} */ (element.closest(".e-menu-item")));
|
|
514
|
+
if (!menuItem) {
|
|
515
|
+
return false;
|
|
516
|
+
}
|
|
517
|
+
/** @type {?} */
|
|
518
|
+
var text = (menuItem.textContent || "").trim().toLowerCase();
|
|
519
|
+
/** @type {?} */
|
|
520
|
+
var translation = this.options.getTranslation
|
|
521
|
+
? this.options.getTranslation()
|
|
522
|
+
: null;
|
|
523
|
+
/** @type {?} */
|
|
524
|
+
var filterText = String((translation && translation.FILTER) || "filter")
|
|
525
|
+
.trim()
|
|
526
|
+
.toLowerCase();
|
|
527
|
+
if (!text) {
|
|
528
|
+
return false;
|
|
529
|
+
}
|
|
530
|
+
if (text.indexOf(filterText) > -1 || text.indexOf("filter") > -1) {
|
|
531
|
+
return true;
|
|
532
|
+
}
|
|
533
|
+
/** @type {?} */
|
|
534
|
+
var cls = (menuItem.className || "").toLowerCase();
|
|
535
|
+
return cls.indexOf("filter") > -1;
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* @private
|
|
539
|
+
* @return {?}
|
|
540
|
+
*/
|
|
541
|
+
findDateFilterAnchorElement() {
|
|
542
|
+
/** @type {?} */
|
|
543
|
+
var menuContainers = (/** @type {?} */ (Array.from(document.querySelectorAll(".e-columnmenu, .e-contextmenu"))));
|
|
544
|
+
/** @type {?} */
|
|
545
|
+
var visibleContainers = menuContainers.filter((/**
|
|
546
|
+
* @param {?} container
|
|
547
|
+
* @return {?}
|
|
548
|
+
*/
|
|
549
|
+
(container) => {
|
|
550
|
+
if (!container || !container.getBoundingClientRect) {
|
|
551
|
+
return false;
|
|
552
|
+
}
|
|
553
|
+
/** @type {?} */
|
|
554
|
+
var rect = container.getBoundingClientRect();
|
|
555
|
+
if (rect.width <= 0 || rect.height <= 0) {
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
/** @type {?} */
|
|
559
|
+
var style = window.getComputedStyle(container);
|
|
560
|
+
if (!style || style.display === "none" || style.visibility === "hidden") {
|
|
561
|
+
return false;
|
|
562
|
+
}
|
|
563
|
+
return true;
|
|
564
|
+
}));
|
|
565
|
+
if (!visibleContainers.length) {
|
|
566
|
+
return null;
|
|
567
|
+
}
|
|
568
|
+
/** @type {?} */
|
|
569
|
+
var currentContainer = visibleContainers[visibleContainers.length - 1];
|
|
570
|
+
/** @type {?} */
|
|
571
|
+
var menuItems = (/** @type {?} */ (Array.from(currentContainer.querySelectorAll(".e-menu-item"))));
|
|
572
|
+
/** @type {?} */
|
|
573
|
+
var visibleFilterItems = menuItems.filter((/**
|
|
574
|
+
* @param {?} item
|
|
575
|
+
* @return {?}
|
|
576
|
+
*/
|
|
577
|
+
(item) => {
|
|
578
|
+
if (!this.isDateFilterMenuItem(item)) {
|
|
579
|
+
return false;
|
|
580
|
+
}
|
|
581
|
+
if (!item.getBoundingClientRect) {
|
|
582
|
+
return false;
|
|
583
|
+
}
|
|
584
|
+
/** @type {?} */
|
|
585
|
+
var rect = item.getBoundingClientRect();
|
|
586
|
+
return rect.width > 0 && rect.height > 0;
|
|
587
|
+
}));
|
|
588
|
+
if (!visibleFilterItems.length) {
|
|
589
|
+
return null;
|
|
590
|
+
}
|
|
591
|
+
/** @type {?} */
|
|
592
|
+
var focusedItem = visibleFilterItems.find((/**
|
|
593
|
+
* @param {?} item
|
|
594
|
+
* @return {?}
|
|
595
|
+
*/
|
|
596
|
+
(item) => {
|
|
597
|
+
return (item.classList.contains("e-focused") ||
|
|
598
|
+
item.classList.contains("e-selected") ||
|
|
599
|
+
item.classList.contains("e-hover"));
|
|
600
|
+
}));
|
|
601
|
+
return focusedItem || visibleFilterItems[visibleFilterItems.length - 1];
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
if (false) {
|
|
605
|
+
/** @type {?} */
|
|
606
|
+
DateTreeFilterHelper.prototype.popoverVisible;
|
|
607
|
+
/** @type {?} */
|
|
608
|
+
DateTreeFilterHelper.prototype.popoverField;
|
|
609
|
+
/** @type {?} */
|
|
610
|
+
DateTreeFilterHelper.prototype.popoverStyle;
|
|
611
|
+
/** @type {?} */
|
|
612
|
+
DateTreeFilterHelper.prototype.selectedByField;
|
|
613
|
+
/** @type {?} */
|
|
614
|
+
DateTreeFilterHelper.prototype.fieldLabelMap;
|
|
615
|
+
/** @type {?} */
|
|
616
|
+
DateTreeFilterHelper.prototype.dateFields;
|
|
617
|
+
/**
|
|
618
|
+
* @type {?}
|
|
619
|
+
* @private
|
|
620
|
+
*/
|
|
621
|
+
DateTreeFilterHelper.prototype.sourceRows;
|
|
622
|
+
/**
|
|
623
|
+
* @type {?}
|
|
624
|
+
* @private
|
|
625
|
+
*/
|
|
626
|
+
DateTreeFilterHelper.prototype.options;
|
|
627
|
+
/**
|
|
628
|
+
* @type {?}
|
|
629
|
+
* @private
|
|
630
|
+
*/
|
|
631
|
+
DateTreeFilterHelper.prototype.defaultDateFormats;
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* @param {?} host
|
|
635
|
+
* @return {?}
|
|
636
|
+
*/
|
|
637
|
+
function resolveGridElement(host) {
|
|
638
|
+
if (!host || !host.grid) {
|
|
639
|
+
return null;
|
|
640
|
+
}
|
|
641
|
+
/** @type {?} */
|
|
642
|
+
var gridRef = host.grid;
|
|
643
|
+
if (gridRef.grid && gridRef.grid.element) {
|
|
644
|
+
return gridRef.grid.element;
|
|
645
|
+
}
|
|
646
|
+
if (gridRef.element) {
|
|
647
|
+
return gridRef.element;
|
|
648
|
+
}
|
|
649
|
+
return null;
|
|
650
|
+
}
|
|
651
|
+
/**
|
|
652
|
+
* @param {?} host
|
|
653
|
+
* @param {?} applyRows
|
|
654
|
+
* @param {?=} dateFormats
|
|
655
|
+
* @return {?}
|
|
656
|
+
*/
|
|
657
|
+
export function createRsCommonGridDateTreeHelper(host, applyRows, dateFormats) {
|
|
658
|
+
return new DateTreeFilterHelper({
|
|
659
|
+
getTranslation: (/**
|
|
660
|
+
* @return {?}
|
|
661
|
+
*/
|
|
662
|
+
() => (host ? host.translation : null)),
|
|
663
|
+
getPopoverElement: (/**
|
|
664
|
+
* @return {?}
|
|
665
|
+
*/
|
|
666
|
+
() => host && host.dateTreePopoverRef
|
|
667
|
+
? host.dateTreePopoverRef.nativeElement
|
|
668
|
+
: null),
|
|
669
|
+
getGridElement: (/**
|
|
670
|
+
* @return {?}
|
|
671
|
+
*/
|
|
672
|
+
() => resolveGridElement(host)),
|
|
673
|
+
applyRows: applyRows,
|
|
674
|
+
dateFormats: dateFormats && dateFormats.length
|
|
675
|
+
? dateFormats
|
|
676
|
+
: DATE_TREE_DEFAULT_DATE_FORMATS,
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10cmVlLWZpbHRlci5oZWxwZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9yYWlzZS1jb21tb24tbGliLyIsInNvdXJjZXMiOlsibGliL2RhdGUtdHJlZS1maWx0ZXIvZGF0ZS10cmVlLWZpbHRlci5oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7QUFFNUIsZ0RBSUM7OztJQUhDLDBDQUFZOztJQUNaLDRDQUFjOztJQUNkLDJDQUFnQjs7Ozs7QUFHbEIsaURBT0M7OztJQU5DLHFEQUEwQjs7SUFDMUIsd0RBQXFDOztJQUNyQyxxREFBa0M7O0lBQ2xDLGdEQUFpQzs7SUFDakMscURBQXNDOztJQUN0QyxrREFBdUI7Ozs7O0FBR3pCLHFEQUlDOzs7SUFIQyxzREFBaUI7O0lBQ2pCLDZEQUF3Qjs7SUFDeEIsK0NBQVU7OztBQUdaLE1BQU0sT0FBTyw4QkFBOEIsR0FBRztJQUM1QyxZQUFZO0lBQ1osWUFBWTtJQUNaLFlBQVk7SUFDWixZQUFZO0lBQ1osYUFBYTtJQUNiLGNBQWM7Q0FDZjtBQUVELE1BQU0sT0FBTyxvQkFBb0I7Ozs7SUFxQi9CLFlBQVksT0FBb0M7UUFwQnpDLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFZixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLHVCQUFrQixHQUFHO1lBQzNCLFlBQVk7WUFDWixZQUFZO1lBQ1osWUFBWTtZQUNaLFlBQVk7WUFDWixhQUFhO1lBQ2IscUJBQXFCO1lBQ3JCLGNBQWM7WUFDZCxNQUFNLENBQUMsUUFBUTtTQUNoQixDQUFDO1FBR0EsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7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O1FBQzlDLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLFdBQVcsRUFDVCxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU07WUFDL0IsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsOEJBQThCO0tBQ3JDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVRyZWVGaWx0ZXJTZXR1cE9wdGlvbnMge1xyXG4gIHJvd3M6IGFueVtdO1xyXG4gIGZpZWxkczogYW55W107XHJcbiAgaGludHM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGVUcmVlRmlsdGVySGVscGVyT3B0aW9ucyB7XHJcbiAgZ2V0VHJhbnNsYXRpb246ICgpID0+IGFueTtcclxuICBnZXRQb3BvdmVyRWxlbWVudDogKCkgPT4gSFRNTEVsZW1lbnQ7XHJcbiAgZ2V0R3JpZEVsZW1lbnQ6ICgpID0+IEhUTUxFbGVtZW50O1xyXG4gIGFwcGx5Um93czogKHJvd3M6IGFueVtdKSA9PiB2b2lkO1xyXG4gIHBhcnNlRGF0ZVZhbHVlPzogKHZhbHVlOiBhbnkpID0+IERhdGU7XHJcbiAgZGF0ZUZvcm1hdHM/OiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSc0NvbW1vbkdyaWREYXRlVHJlZUZhY3RvcnlIb3N0IHtcclxuICB0cmFuc2xhdGlvbjogYW55O1xyXG4gIGRhdGVUcmVlUG9wb3ZlclJlZjogYW55O1xyXG4gIGdyaWQ6IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERBVEVfVFJFRV9ERUZBVUxUX0RBVEVfRk9STUFUUyA9IFtcclxuICBcIllZWVktTU0tRERcIixcclxuICBcIk1NL0REL1lZWVlcIixcclxuICBcIkREL01NL1lZWVlcIixcclxuICBcIllZWVkvTU0vRERcIixcclxuICBcIkRELU1NTS1ZWVlZXCIsXHJcbiAgXCJNTU0gREQsIFlZWVlcIixcclxuXTtcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRlVHJlZUZpbHRlckhlbHBlciB7XHJcbiAgcHVibGljIHBvcG92ZXJWaXNpYmxlID0gZmFsc2U7XHJcbiAgcHVibGljIHBvcG92ZXJGaWVsZCA9IFwiXCI7XHJcbiAgcHVibGljIHBvcG92ZXJTdHlsZSA9IHt9O1xyXG4gIHB1YmxpYyBzZWxlY3RlZEJ5RmllbGQgPSB7fTtcclxuICBwdWJsaWMgZmllbGRMYWJlbE1hcCA9IHt9O1xyXG4gIHB1YmxpYyBkYXRlRmllbGRzID0gW107XHJcblxyXG4gIHByaXZhdGUgc291cmNlUm93cyA9IFtdO1xyXG4gIHByaXZhdGUgb3B0aW9uczogRGF0ZVRyZWVGaWx0ZXJIZWxwZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgZGVmYXVsdERhdGVGb3JtYXRzID0gW1xyXG4gICAgXCJZWVlZLU1NLUREXCIsXHJcbiAgICBcIk1NL0REL1lZWVlcIixcclxuICAgIFwiREQvTU0vWVlZWVwiLFxyXG4gICAgXCJZWVlZL01NL0REXCIsXHJcbiAgICBcIkRELU1NTS1ZWVlZXCIsXHJcbiAgICBcIkRELU1NTS1ZWVlZIGhoOm1tIEFcIixcclxuICAgIFwiTU1NIERELCBZWVlZXCIsXHJcbiAgICBtb21lbnQuSVNPXzg2MDEsXHJcbiAgXTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGF0ZVRyZWVGaWx0ZXJIZWxwZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldHVwKGNvbmZpZzogRGF0ZVRyZWVGaWx0ZXJTZXR1cE9wdGlvbnMpIHtcclxuICAgIHZhciByb3dzID0gY29uZmlnICYmIGNvbmZpZy5yb3dzID8gY29uZmlnLnJvd3MgOiBbXTtcclxuICAgIHZhciBmaWVsZHMgPSBjb25maWcgJiYgY29uZmlnLmZpZWxkcyA/IGNvbmZpZy5maWVsZHMgOiBbXTtcclxuICAgIHZhciBoaW50cyA9IGNvbmZpZyAmJiBjb25maWcuaGludHMgPyBjb25maWcuaGludHMgOiBbXTtcclxuICAgIHRoaXMuc291cmNlUm93cyA9IHJvd3M7XHJcbiAgICB0aGlzLmRhdGVGaWVsZHMgPSB0aGlzLnJlc29sdmVEYXRlVHJlZUZpZWxkc0J5SGludHMoZmllbGRzLCBoaW50cyk7XHJcbiAgICB0aGlzLmZpZWxkTGFiZWxNYXAgPSB7fTtcclxuICAgIChmaWVsZHMgfHwgW10pLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmNvbHVtbk5hbWUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5maWVsZExhYmVsTWFwW2l0ZW0uY29sdW1uTmFtZV0gPVxyXG4gICAgICAgIGl0ZW0uY29sdW1uRGlzcGxheU5hbWUgfHwgaXRlbS5jb2x1bW5OYW1lO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFwcGx5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlR3JpZEFjdGlvbkJlZ2luKGFyZ3M6IGFueSkge1xyXG4gICAgdmFyIHJlcXVlc3RUeXBlID0gdGhpcy5nZXRSZXF1ZXN0VHlwZShhcmdzKTtcclxuICAgIGlmIChcclxuICAgICAgcmVxdWVzdFR5cGUgPT09IFwiZmlsdGVyY2hvaWNlcmVxdWVzdFwiIHx8XHJcbiAgICAgIHJlcXVlc3RUeXBlID09PSBcImZpbHRlcnNlYXJjaGJlZ2luXCJcclxuICAgICkge1xyXG4gICAgICBhcmdzLmZpbHRlckNob2ljZUNvdW50ID0gMTUwMDA7XHJcbiAgICB9XHJcbiAgICBpZiAocmVxdWVzdFR5cGUgIT09IFwiZmlsdGVyYmVmb3Jlb3BlblwiKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHZhciBjb2x1bW5OYW1lID0gdGhpcy5yZXNvbHZlQWN0aW9uQ29sdW1uTmFtZShhcmdzKTtcclxuICAgIGlmICghdGhpcy5pc0RhdGVUcmVlRmllbGQoY29sdW1uTmFtZSkpIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhcmdzLmNhbmNlbCA9IHRydWU7XHJcbiAgICB0aGlzLm9wZW4oY29sdW1uTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbk1hcDogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQnlGaWVsZCA9IHNlbGVjdGlvbk1hcCB8fCB7fTtcclxuICAgIHRoaXMuYXBwbHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSgpIHtcclxuICAgIGlmICghdGhpcy5wb3BvdmVyVmlzaWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvcG92ZXJWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLnBvcG92ZXJGaWVsZCA9IFwiXCI7XHJcbiAgICB0aGlzLnBvcG92ZXJTdHlsZSA9IHt9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZURvY3VtZW50TW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMucG9wb3ZlclZpc2libGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzSW5zaWRlUG9wb3Zlcih0YXJnZXQpIHx8IHRoaXMuaXNEYXRlRmlsdGVyTWVudUl0ZW0odGFyZ2V0KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRG9jdW1lbnRNb3VzZU92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5wb3BvdmVyVmlzaWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNJbnNpZGVQb3BvdmVyKHRhcmdldCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIG1lbnVJdGVtID0gdGFyZ2V0LmNsb3Nlc3QoXCIuZS1tZW51LWl0ZW1cIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAobWVudUl0ZW0pIHtcclxuICAgICAgaWYgKCF0aGlzLmlzRGF0ZUZpbHRlck1lbnVJdGVtKG1lbnVJdGVtKSkge1xyXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB2YXIgb3RoZXJGaWx0ZXJUYXJnZXQgPSB0YXJnZXQuY2xvc2VzdChcclxuICAgICAgXCIuZS1maWx0ZXJtZW51ZGl2LCAuZS1oZWFkZXJjZWxsIC5lLWNvbHVtbm1lbnUsIC5lLWNvbHVtbm1lbnUsIC5lLWNvbnRleHRtZW51XCJcclxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAob3RoZXJGaWx0ZXJUYXJnZXQgJiYgIXRoaXMuaXNEYXRlRmlsdGVyTWVudUl0ZW0ob3RoZXJGaWx0ZXJUYXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVQb3NpdGlvbigpIHtcclxuICAgIGlmICghdGhpcy5wb3BvdmVyVmlzaWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB2YXIgYW5jaG9yID0gdGhpcy5maW5kRGF0ZUZpbHRlckFuY2hvckVsZW1lbnQoKTtcclxuICAgIGlmIChhbmNob3IpIHtcclxuICAgICAgdmFyIHJlY3QgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHZhciB2aWV3cG9ydFdpZHRoID1cclxuICAgICAgICB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICAgIHZhciB2aWV3cG9ydEhlaWdodCA9XHJcbiAgICAgICAgd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIHZhciBwb3BvdmVyRWxlbWVudCA9IHRoaXMub3B0aW9ucy5nZXRQb3BvdmVyRWxlbWVudFxyXG4gICAgICAgID8gdGhpcy5vcHRpb25zLmdldFBvcG92ZXJFbGVtZW50KClcclxuICAgICAgICA6IG51bGw7XHJcbiAgICAgIHZhciBwb3BvdmVyV2lkdGggPVxyXG4gICAgICAgIHBvcG92ZXJFbGVtZW50ICYmIHBvcG92ZXJFbGVtZW50Lm9mZnNldFdpZHRoXHJcbiAgICAgICAgICA/IHBvcG92ZXJFbGVtZW50Lm9mZnNldFdpZHRoXHJcbiAgICAgICAgICA6IDMwMDtcclxuICAgICAgdmFyIHBvcG92ZXJIZWlnaHQgPVxyXG4gICAgICAgIHBvcG92ZXJFbGVtZW50ICYmIHBvcG92ZXJFbGVtZW50Lm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgPyBwb3BvdmVyRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgIDogNDIwO1xyXG4gICAgICB2YXIgZWRnZUdhcCA9IDg7XHJcbiAgICAgIHZhciBhbmNob3JHYXAgPSA4O1xyXG4gICAgICB2YXIgdG9wID0gcmVjdC50b3AgLSA2O1xyXG4gICAgICB2YXIgbGVmdCA9IHJlY3QucmlnaHQgKyBhbmNob3JHYXA7XHJcblxyXG4gICAgICBpZiAobGVmdCArIHBvcG92ZXJXaWR0aCA+IHZpZXdwb3J0V2lkdGggLSBlZGdlR2FwKSB7XHJcbiAgICAgICAgbGVmdCA9IHJlY3QubGVmdCAtIHBvcG92ZXJXaWR0aCAtIGFuY2hvckdhcDtcclxuICAgICAgfVxyXG4gICAgICBpZiAobGVmdCA8IGVkZ2VHYXApIHtcclxuICAgICAgICBsZWZ0ID0gZWRnZUdhcDtcclxuICAgICAgfVxyXG4gICAgICBpZiAobGVmdCArIHBvcG92ZXJXaWR0aCA+IHZpZXdwb3J0V2lkdGggLSBlZGdlR2FwKSB7XHJcbiAgICAgICAgbGVmdCA9IE1hdGgubWF4KGVkZ2VHYXAsIHZpZXdwb3J0V2lkdGggLSBwb3BvdmVyV2lkdGggLSBlZGdlR2FwKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodG9wICsgcG9wb3ZlckhlaWdodCA+IHZpZXdwb3J0SGVpZ2h0IC0gZWRnZUdhcCkge1xyXG4gICAgICAgIHRvcCA9IE1hdGgubWF4KGVkZ2VHYXAsIHZpZXdwb3J0SGVpZ2h0IC0gcG9wb3ZlckhlaWdodCAtIGVkZ2VHYXApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucG9wb3ZlclN0eWxlID0ge1xyXG4gICAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCIsXHJcbiAgICAgICAgbGVmdDogbGVmdCArIFwicHhcIixcclxuICAgICAgICB0b3A6IHRvcCArIFwicHhcIixcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIGdyaWRFbGVtZW50ID0gdGhpcy5vcHRpb25zLmdldEdyaWRFbGVtZW50XHJcbiAgICAgID8gdGhpcy5vcHRpb25zLmdldEdyaWRFbGVtZW50KClcclxuICAgICAgOiBudWxsO1xyXG4gICAgaWYgKGdyaWRFbGVtZW50ICYmIGdyaWRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xyXG4gICAgICB2YXIgZmFsbGJhY2tSZWN0ID0gZ3JpZEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMucG9wb3ZlclN0eWxlID0ge1xyXG4gICAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCIsXHJcbiAgICAgICAgbGVmdDogTWF0aC5tYXgoOCwgZmFsbGJhY2tSZWN0LnJpZ2h0IC0gMzEyKSArIFwicHhcIixcclxuICAgICAgICB0b3A6IE1hdGgubWF4KDgsIGZhbGxiYWNrUmVjdC50b3AgKyA4KSArIFwicHhcIixcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbihmaWVsZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnBvcG92ZXJGaWVsZCA9IGZpZWxkO1xyXG4gICAgdGhpcy5wb3BvdmVyVmlzaWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlUG9zaXRpb24oKSwgNTApO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVBvc2l0aW9uKCksIDE1MCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5KCkge1xyXG4gICAgdmFyIGZpbHRlcmVkUm93cyA9IHRoaXMuZmlsdGVyUm93c0J5U2VsZWN0ZWREYXRlVHJlZShcclxuICAgICAgdGhpcy5zb3VyY2VSb3dzIHx8IFtdXHJcbiAgICApO1xyXG4gICAgdGhpcy5vcHRpb25zLmFwcGx5Um93cyhmaWx0ZXJlZFJvd3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSZXF1ZXN0VHlwZShhcmdzKSB7XHJcbiAgICBpZiAoIWFyZ3MgfHwgIWFyZ3MucmVxdWVzdFR5cGUpIHtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU3RyaW5nKGFyZ3MucmVxdWVzdFR5cGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNvbHZlQWN0aW9uQ29sdW1uTmFtZShhcmdzKSB7XHJcbiAgICBpZiAoIWFyZ3MpIHtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBhcmdzLmNvbHVtbk5hbWUgfHxcclxuICAgICAgYXJncy5maWVsZCB8fFxyXG4gICAgICBhcmdzLmN1cnJlbnRGaWx0ZXJpbmdDb2x1bW4gfHxcclxuICAgICAgKGFyZ3MuY29sdW1uICYmIChhcmdzLmNvbHVtbi5maWVsZCB8fCBhcmdzLmNvbHVtbi5jb2x1bW5OYW1lKSkgfHxcclxuICAgICAgXCJcIlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzb2x2ZURhdGVUcmVlRmllbGRzQnlIaW50cyhmaWVsZHM6IGFueVtdLCBoaW50czogc3RyaW5nW10pIHtcclxuICAgIHZhciBub3JtYWxpemVkSGludHMgPSAoaGludHMgfHwgW10pXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICEhaXRlbSlcclxuICAgICAgLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcclxuICAgIGlmICghZmllbGRzIHx8ICFmaWVsZHMubGVuZ3RoIHx8ICFub3JtYWxpemVkSGludHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIHJldHVybiBmaWVsZHNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICghaXRlbSB8fCAhaXRlbS5jb2x1bW5OYW1lKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjb2x1bW5OYW1lID0gU3RyaW5nKGl0ZW0uY29sdW1uTmFtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IFN0cmluZyhpdGVtLmNvbHVtbkRpc3BsYXlOYW1lIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRIaW50cy5zb21lKChoaW50KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBjb2x1bW5OYW1lID09PSBoaW50IHx8XHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lID09PSBoaW50IHx8XHJcbiAgICAgICAgICAgIChoaW50Lmxlbmd0aCA+PSAzICYmXHJcbiAgICAgICAgICAgICAgKGNvbHVtbk5hbWUuaW5kZXhPZihoaW50KSA+IC0xIHx8XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZS5pbmRleE9mKGhpbnQpID4gLTEpKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5jb2x1bW5OYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNEYXRlVHJlZUZpZWxkKGZpZWxkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGVGaWVsZHMuaW5kZXhPZihmaWVsZCkgPiAtMTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAoZmllbGQ6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQnlGaWVsZFtmaWVsZF0pIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEJ5RmllbGRbZmllbGRdID0ge307XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEJ5RmllbGRbZmllbGRdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJSb3dzQnlTZWxlY3RlZERhdGVUcmVlKHJvd3M6IGFueVtdLCBleGNsdWRlRmllbGQ/OiBzdHJpbmcpIHtcclxuICAgIHZhciBmaWx0ZXJlZFJvd3MgPSByb3dzID8gcm93cy5zbGljZSgpIDogW107XHJcbiAgICB0aGlzLmRhdGVGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKGV4Y2x1ZGVGaWVsZCAmJiBmaWVsZCA9PT0gZXhjbHVkZUZpZWxkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBzZWxlY3RlZE1hcCA9IHRoaXMuZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAoZmllbGQpO1xyXG4gICAgICB2YXIgc2VsZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoc2VsZWN0ZWRNYXApO1xyXG4gICAgICBpZiAoIXNlbGVjdGVkS2V5cy5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZmlsdGVyZWRSb3dzID0gZmlsdGVyZWRSb3dzLmZpbHRlcigocm93KSA9PiB7XHJcbiAgICAgICAgdmFyIGRheUtleSA9IHRoaXMuZ2V0RGF5S2V5QnlSb3dWYWx1ZShyb3dbZmllbGRdKTtcclxuICAgICAgICByZXR1cm4gZGF5S2V5ID8gISFzZWxlY3RlZE1hcFtkYXlLZXldIDogZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZmlsdGVyZWRSb3dzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXlLZXlCeVJvd1ZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIHZhciBkYXRlID0gdGhpcy5wYXJzZURhdGVWYWx1ZSh2YWx1ZSk7XHJcbiAgICBpZiAoIWRhdGUpIHtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50b0RheUtleShcclxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICBkYXRlLmdldE1vbnRoKCkgKyAxLFxyXG4gICAgICBkYXRlLmdldERhdGUoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VEYXRlVmFsdWUodmFsdWU6IGFueSk6IERhdGUge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYXJzZURhdGVWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBhcnNlRGF0ZVZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICAgIHZhciBmb3JtYXRzID1cclxuICAgICAgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5kYXRlRm9ybWF0cyAmJiB0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdHMubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdHNcclxuICAgICAgICA6IHRoaXMuZGVmYXVsdERhdGVGb3JtYXRzO1xyXG4gICAgdmFyIHBhcnNlZCA9IG1vbWVudCh2YWx1ZSwgZm9ybWF0cywgdHJ1ZSk7XHJcbiAgICBpZiAocGFyc2VkLmlzVmFsaWQoKSkge1xyXG4gICAgICByZXR1cm4gcGFyc2VkLnRvRGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgdmFyIGZhbGxiYWNrID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgcmV0dXJuIGlzTmFOKGZhbGxiYWNrLmdldFRpbWUoKSkgPyBudWxsIDogZmFsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvRGF5S2V5KHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB5ZWFyICsgXCItXCIgKyB0aGlzLnBhZDIobW9udGgpICsgXCItXCIgKyB0aGlzLnBhZDIoZGF5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFkMih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgPCAxMCA/IFwiMFwiICsgdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0luc2lkZVBvcG92ZXIodGFyZ2V0OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgdmFyIHBvcG92ZXJFbGVtZW50ID0gdGhpcy5vcHRpb25zLmdldFBvcG92ZXJFbGVtZW50XHJcbiAgICAgID8gdGhpcy5vcHRpb25zLmdldFBvcG92ZXJFbGVtZW50KClcclxuICAgICAgOiBudWxsO1xyXG4gICAgaWYgKCF0YXJnZXQgfHwgIXBvcG92ZXJFbGVtZW50KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBwb3BvdmVyRWxlbWVudC5jb250YWlucyh0YXJnZXQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0RhdGVGaWx0ZXJNZW51SXRlbShlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHZhciBtZW51SXRlbSA9IGVsZW1lbnQuY2xvc2VzdChcIi5lLW1lbnUtaXRlbVwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghbWVudUl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdmFyIHRleHQgPSAobWVudUl0ZW0udGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB2YXIgdHJhbnNsYXRpb24gPSB0aGlzLm9wdGlvbnMuZ2V0VHJhbnNsYXRpb25cclxuICAgICAgPyB0aGlzLm9wdGlvbnMuZ2V0VHJhbnNsYXRpb24oKVxyXG4gICAgICA6IG51bGw7XHJcbiAgICB2YXIgZmlsdGVyVGV4dCA9IFN0cmluZygodHJhbnNsYXRpb24gJiYgdHJhbnNsYXRpb24uRklMVEVSKSB8fCBcImZpbHRlclwiKVxyXG4gICAgICAudHJpbSgpXHJcbiAgICAgIC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKCF0ZXh0KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0ZXh0LmluZGV4T2YoZmlsdGVyVGV4dCkgPiAtMSB8fCB0ZXh0LmluZGV4T2YoXCJmaWx0ZXJcIikgPiAtMSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHZhciBjbHMgPSAobWVudUl0ZW0uY2xhc3NOYW1lIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gY2xzLmluZGV4T2YoXCJmaWx0ZXJcIikgPiAtMTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZERhdGVGaWx0ZXJBbmNob3JFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgIHZhciBtZW51Q29udGFpbmVycyA9IEFycmF5LmZyb20oXHJcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuZS1jb2x1bW5tZW51LCAuZS1jb250ZXh0bWVudVwiKVxyXG4gICAgKSBhcyBIVE1MRWxlbWVudFtdO1xyXG4gICAgdmFyIHZpc2libGVDb250YWluZXJzID0gbWVudUNvbnRhaW5lcnMuZmlsdGVyKChjb250YWluZXIpID0+IHtcclxuICAgICAgaWYgKCFjb250YWluZXIgfHwgIWNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGlmIChyZWN0LndpZHRoIDw9IDAgfHwgcmVjdC5oZWlnaHQgPD0gMCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xyXG4gICAgICBpZiAoIXN0eWxlIHx8IHN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8IHN0eWxlLnZpc2liaWxpdHkgPT09IFwiaGlkZGVuXCIpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9KTtcclxuICAgIGlmICghdmlzaWJsZUNvbnRhaW5lcnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdmFyIGN1cnJlbnRDb250YWluZXIgPSB2aXNpYmxlQ29udGFpbmVyc1t2aXNpYmxlQ29udGFpbmVycy5sZW5ndGggLSAxXTtcclxuICAgIHZhciBtZW51SXRlbXMgPSBBcnJheS5mcm9tKFxyXG4gICAgICBjdXJyZW50Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuZS1tZW51LWl0ZW1cIilcclxuICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcclxuICAgIHZhciB2aXNpYmxlRmlsdGVySXRlbXMgPSBtZW51SXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5pc0RhdGVGaWx0ZXJNZW51SXRlbShpdGVtKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciByZWN0ID0gaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgcmV0dXJuIHJlY3Qud2lkdGggPiAwICYmIHJlY3QuaGVpZ2h0ID4gMDtcclxuICAgIH0pO1xyXG4gICAgaWYgKCF2aXNpYmxlRmlsdGVySXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdmFyIGZvY3VzZWRJdGVtID0gdmlzaWJsZUZpbHRlckl0ZW1zLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBpdGVtLmNsYXNzTGlzdC5jb250YWlucyhcImUtZm9jdXNlZFwiKSB8fFxyXG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFwiZS1zZWxlY3RlZFwiKSB8fFxyXG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFwiZS1ob3ZlclwiKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZm9jdXNlZEl0ZW0gfHwgdmlzaWJsZUZpbHRlckl0ZW1zW3Zpc2libGVGaWx0ZXJJdGVtcy5sZW5ndGggLSAxXTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVHcmlkRWxlbWVudChob3N0OiBSc0NvbW1vbkdyaWREYXRlVHJlZUZhY3RvcnlIb3N0KTogSFRNTEVsZW1lbnQge1xyXG4gIGlmICghaG9zdCB8fCAhaG9zdC5ncmlkKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgdmFyIGdyaWRSZWYgPSBob3N0LmdyaWQ7XHJcbiAgaWYgKGdyaWRSZWYuZ3JpZCAmJiBncmlkUmVmLmdyaWQuZWxlbWVudCkge1xyXG4gICAgcmV0dXJuIGdyaWRSZWYuZ3JpZC5lbGVtZW50O1xyXG4gIH1cclxuICBpZiAoZ3JpZFJlZi5lbGVtZW50KSB7XHJcbiAgICByZXR1cm4gZ3JpZFJlZi5lbGVtZW50O1xyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJzQ29tbW9uR3JpZERhdGVUcmVlSGVscGVyKFxyXG4gIGhvc3Q6IFJzQ29tbW9uR3JpZERhdGVUcmVlRmFjdG9yeUhvc3QsXHJcbiAgYXBwbHlSb3dzOiAocm93czogYW55W10pID0+IHZvaWQsXHJcbiAgZGF0ZUZvcm1hdHM/OiBzdHJpbmdbXVxyXG4pIHtcclxuICByZXR1cm4gbmV3IERhdGVUcmVlRmlsdGVySGVscGVyKHtcclxuICAgIGdldFRyYW5zbGF0aW9uOiAoKSA9PiAoaG9zdCA/IGhvc3QudHJhbnNsYXRpb24gOiBudWxsKSxcclxuICAgIGdldFBvcG92ZXJFbGVtZW50OiAoKSA9PlxyXG4gICAgICBob3N0ICYmIGhvc3QuZGF0ZVRyZWVQb3BvdmVyUmVmXHJcbiAgICAgICAgPyBob3N0LmRhdGVUcmVlUG9wb3ZlclJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgOiBudWxsLFxyXG4gICAgZ2V0R3JpZEVsZW1lbnQ6ICgpID0+IHJlc29sdmVHcmlkRWxlbWVudChob3N0KSxcclxuICAgIGFwcGx5Um93czogYXBwbHlSb3dzLFxyXG4gICAgZGF0ZUZvcm1hdHM6XHJcbiAgICAgIGRhdGVGb3JtYXRzICYmIGRhdGVGb3JtYXRzLmxlbmd0aFxyXG4gICAgICAgID8gZGF0ZUZvcm1hdHNcclxuICAgICAgICA6IERBVEVfVFJFRV9ERUZBVUxUX0RBVEVfRk9STUFUUyxcclxuICB9KTtcclxufVxyXG4iXX0=
|