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