ngx-dropdown-list 1.1.0 → 1.2.0

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 (65) hide show
  1. package/README.md +2 -2
  2. package/esm2020/ngx-dropdown-list.mjs +5 -0
  3. package/esm2020/public_api.mjs +2 -0
  4. package/esm2020/src/ngx-dropdown-list/anchor/anchor.component.mjs +149 -0
  5. package/esm2020/src/ngx-dropdown-list/dropdown/dropdown.component.mjs +252 -0
  6. package/esm2020/src/ngx-dropdown-list/dropdown-list.component.mjs +233 -0
  7. package/esm2020/src/ngx-dropdown-list/dropdown-list.module.mjs +38 -0
  8. package/esm2020/src/ngx-dropdown-list/filter/input-filter.component.mjs +44 -0
  9. package/esm2020/src/ngx-dropdown-list/group-item/group-item.component.mjs +25 -0
  10. package/esm2020/src/ngx-dropdown-list/index.mjs +3 -0
  11. package/esm2020/src/ngx-dropdown-list/item/item.component.mjs +77 -0
  12. package/esm2020/src/ngx-dropdown-list/types/index.mjs +3 -0
  13. package/esm2020/src/ngx-dropdown-list/types/selection-group-items.types.mjs +2 -0
  14. package/esm2020/src/ngx-dropdown-list/types/selection-item.types.mjs +2 -0
  15. package/esm2020/src/ngx-dropdown-list/utils/util.mjs +59 -0
  16. package/fesm2015/ngx-dropdown-list.mjs +854 -0
  17. package/fesm2015/ngx-dropdown-list.mjs.map +1 -0
  18. package/fesm2020/ngx-dropdown-list.mjs +854 -0
  19. package/fesm2020/ngx-dropdown-list.mjs.map +1 -0
  20. package/ngx-dropdown-list.d.ts +1 -5
  21. package/package.json +26 -48
  22. package/src/ngx-dropdown-list/anchor/anchor.component.d.ts +6 -3
  23. package/src/ngx-dropdown-list/dropdown/dropdown.component.d.ts +5 -2
  24. package/src/ngx-dropdown-list/dropdown-list.component.d.ts +7 -4
  25. package/src/ngx-dropdown-list/dropdown-list.module.d.ts +12 -0
  26. package/src/ngx-dropdown-list/filter/input-filter.component.d.ts +3 -0
  27. package/src/ngx-dropdown-list/group-item/group-item.component.d.ts +3 -0
  28. package/src/ngx-dropdown-list/item/item.component.d.ts +3 -0
  29. package/bundles/ngx-dropdown-list.umd.js +0 -1180
  30. package/bundles/ngx-dropdown-list.umd.js.map +0 -1
  31. package/bundles/ngx-dropdown-list.umd.min.js +0 -2
  32. package/bundles/ngx-dropdown-list.umd.min.js.map +0 -1
  33. package/esm2015/ngx-dropdown-list.js +0 -14
  34. package/esm2015/public_api.js +0 -6
  35. package/esm2015/src/ngx-dropdown-list/anchor/anchor.component.js +0 -226
  36. package/esm2015/src/ngx-dropdown-list/dropdown/dropdown.component.js +0 -339
  37. package/esm2015/src/ngx-dropdown-list/dropdown-list.component.js +0 -290
  38. package/esm2015/src/ngx-dropdown-list/dropdown-list.module.js +0 -32
  39. package/esm2015/src/ngx-dropdown-list/filter/input-filter.component.js +0 -64
  40. package/esm2015/src/ngx-dropdown-list/group-item/group-item.component.js +0 -37
  41. package/esm2015/src/ngx-dropdown-list/index.js +0 -7
  42. package/esm2015/src/ngx-dropdown-list/item/item.component.js +0 -104
  43. package/esm2015/src/ngx-dropdown-list/types/index.js +0 -7
  44. package/esm2015/src/ngx-dropdown-list/types/selection-group-items.types.js +0 -16
  45. package/esm2015/src/ngx-dropdown-list/types/selection-item.types.js +0 -20
  46. package/esm2015/src/ngx-dropdown-list/utils/util.js +0 -73
  47. package/esm5/ngx-dropdown-list.js +0 -14
  48. package/esm5/public_api.js +0 -6
  49. package/esm5/src/ngx-dropdown-list/anchor/anchor.component.js +0 -272
  50. package/esm5/src/ngx-dropdown-list/dropdown/dropdown.component.js +0 -408
  51. package/esm5/src/ngx-dropdown-list/dropdown-list.component.js +0 -361
  52. package/esm5/src/ngx-dropdown-list/dropdown-list.module.js +0 -36
  53. package/esm5/src/ngx-dropdown-list/filter/input-filter.component.js +0 -79
  54. package/esm5/src/ngx-dropdown-list/group-item/group-item.component.js +0 -47
  55. package/esm5/src/ngx-dropdown-list/index.js +0 -7
  56. package/esm5/src/ngx-dropdown-list/item/item.component.js +0 -120
  57. package/esm5/src/ngx-dropdown-list/types/index.js +0 -7
  58. package/esm5/src/ngx-dropdown-list/types/selection-group-items.types.js +0 -16
  59. package/esm5/src/ngx-dropdown-list/types/selection-item.types.js +0 -20
  60. package/esm5/src/ngx-dropdown-list/utils/util.js +0 -96
  61. package/fesm2015/ngx-dropdown-list.js +0 -890
  62. package/fesm2015/ngx-dropdown-list.js.map +0 -1
  63. package/fesm5/ngx-dropdown-list.js +0 -1137
  64. package/fesm5/ngx-dropdown-list.js.map +0 -1
  65. package/ngx-dropdown-list.metadata.json +0 -1
@@ -1,339 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
6
- import { clearAllSelection, getFirstSelectedItem, hasGroup, stopPropagationAndDefault } from '../utils/util';
7
- export class DropdownComponent {
8
- constructor() {
9
- /**
10
- * bind to [checkbox], the flag for multi-select (checkbox) mode.
11
- */
12
- this.checkbox = false;
13
- /**
14
- * bind to [filterBox] for displaying the filter input text box
15
- */
16
- this.filterBox = false;
17
- /**
18
- * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
19
- */
20
- this.allowClear = true;
21
- /**
22
- * bind to [formatNumber] for show formatted number text
23
- */
24
- this.formatNumber = false;
25
- /**
26
- * for 2-way binding of [selectedValue]
27
- */
28
- this.selectedValueChange = new EventEmitter(true);
29
- /**
30
- * [selectionChange] event that will be triggered when changing of the selection
31
- */
32
- this.selectionChange = new EventEmitter(true);
33
- /**
34
- * [dropdownBlur] event that will be triggered with (blur) of dropdown
35
- */
36
- this.dropdownBlur = new EventEmitter();
37
- /**
38
- * [itemClick] event that will be triggered when clicking the option of dropdown
39
- */
40
- this.itemClick = new EventEmitter();
41
- /**
42
- * flag of clicking dropdown. It's to prevent (blur) of dropdown from happening in checkbox mode.
43
- */
44
- this._clickedItems = false;
45
- }
46
- /**
47
- * @param {?} changes
48
- * @return {?}
49
- */
50
- ngOnChanges(changes) {
51
- if (changes.items) {
52
- this._checkSelectionChange(changes.items.previousValue, changes.items.currentValue);
53
- }
54
- }
55
- /**
56
- * triggered when clicking the dropdown
57
- * @param {?} event
58
- * @return {?}
59
- */
60
- onItemsClick(event) {
61
- if (event.offsetX > (event.target.clientWidth + event.target.clientLeft)) {
62
- stopPropagationAndDefault(event);
63
- return;
64
- }
65
- // should ignore clicking on filter
66
- if (this.checkbox && event.target.type !== 'text') {
67
- this._clickedItems = true;
68
- }
69
- }
70
- /**
71
- * triggered when clicking the item
72
- * @param {?} currentItem
73
- * @return {?}
74
- */
75
- onItemClick(currentItem) {
76
- if (!this.checkbox) {
77
- this.selectedValue = this._getItemValue(currentItem); // currentItem.value != null ? currentItem.value : currentItem.text;
78
- clearAllSelection(this.items);
79
- // set the selection of current one
80
- currentItem.selected = true;
81
- this.itemClick.emit(currentItem);
82
- this._onSelectionChange(this.selectedValue);
83
- }
84
- }
85
- /**
86
- * triggers with (blur) event of filter input box
87
- * @param {?} event
88
- * @return {?}
89
- */
90
- onFilterTextBlur(event) {
91
- this.dropdownBlur.emit(event);
92
- }
93
- /**
94
- * triggers with (blur) event of dropdown
95
- * @param {?} event
96
- * @return {?}
97
- */
98
- onItemsBlur(event) {
99
- if (this.checkbox) {
100
- if (this._clickedItems) {
101
- // in checkbox mode, this blur event will be ignored when clicking the dropdown (check the checkbox)
102
- event.target.focus();
103
- this._clickedItems = false;
104
- return;
105
- }
106
- }
107
- this.dropdownBlur.emit(event);
108
- }
109
- /**
110
- * toggle the selection when checking status changed (in checkbox mode)
111
- * @param {?} item
112
- * @return {?}
113
- */
114
- toggleSelection(item) {
115
- item.selected = !item.selected;
116
- this.selectionChange.emit(this._getItemValue(item)); // item.value != null ? item.value : item.text);
117
- }
118
- /**
119
- * items values list after applying the filter
120
- * @return {?}
121
- */
122
- get itemsValues() {
123
- /** @type {?} */
124
- let filter;
125
- if (this.filterValue) {
126
- filter = this.filterValue.toUpperCase();
127
- }
128
- if (filter == null) {
129
- return this.items;
130
- }
131
- if (!this.items || this.items.length === 0) {
132
- return [];
133
- }
134
- if (hasGroup(this.items)) {
135
- /** @type {?} */
136
- const items = [];
137
- this.items.forEach(groupItem => {
138
- if (groupItem.group != null && groupItem.group.toString().toUpperCase().includes(filter)) {
139
- // if groupItem contains the filters, the groupItem needs to be displayed as well
140
- items.push(groupItem);
141
- }
142
- else {
143
- /** @type {?} */
144
- const filteredItems = groupItem.items.filter(item => item.text != null && item.text.toString().toUpperCase().includes(filter));
145
- if (filteredItems && filteredItems.length > 0) {
146
- items.push({ group: groupItem.group, items: filteredItems });
147
- }
148
- }
149
- });
150
- return items;
151
- }
152
- else {
153
- return this.items.filter(item => (item.text != null && item.text.toString().toUpperCase().includes(filter)));
154
- }
155
- }
156
- /**
157
- * options CSS class
158
- * @return {?}
159
- */
160
- get optionsClass() {
161
- if (this.filterBox && !this.checkbox) {
162
- return 'options with-filter';
163
- }
164
- else {
165
- return 'options no-filter';
166
- }
167
- }
168
- /**
169
- * get item value. Return text if value is not available
170
- * @private
171
- * @param {?} item
172
- * @return {?}
173
- */
174
- _getItemValue(item) {
175
- return item ? item.value != null ? item.value : item.text : undefined;
176
- }
177
- /**
178
- * selection changed, emits events: (selectedValueChange) and (selectionChange);
179
- * @private
180
- * @param {?} value
181
- * @return {?}
182
- */
183
- _onSelectionChange(value) {
184
- this.selectedValueChange.emit(value);
185
- this.selectionChange.emit(value);
186
- }
187
- /**
188
- * check whether the selection is changed. Emits relative events when if changed.
189
- * @private
190
- * @param {?} previousValue
191
- * @param {?} currentValue
192
- * @return {?}
193
- */
194
- _checkSelectionChange(previousValue, currentValue) {
195
- /** @type {?} */
196
- const curSelectedItem = getFirstSelectedItem(currentValue);
197
- /** @type {?} */
198
- const lastSelectedItem = getFirstSelectedItem(previousValue);
199
- /** @type {?} */
200
- const curSelectedItemId = curSelectedItem ? curSelectedItem.id : undefined;
201
- /** @type {?} */
202
- const lastSelectedItemId = lastSelectedItem ? lastSelectedItem.id : undefined;
203
- if (curSelectedItemId !== lastSelectedItemId && !this.checkbox) {
204
- this._onSelectionChange(this._getItemValue(curSelectedItem));
205
- }
206
- }
207
- }
208
- DropdownComponent.decorators = [
209
- { type: Component, args: [{
210
- selector: 'dropdown',
211
- template: `
212
- <span #dropdown class="dropdown" tabindex="3" (mousedown)="onItemsClick($event)" (blur)="onItemsBlur($event)" *ngIf="!disabled" >
213
- <input-filter #filterInput tabindex="4" *ngIf="filterBox && !checkbox" [(filterValue)]="filterValue" (inputFilterBlur)="onFilterTextBlur($event)"></input-filter>
214
- <span #selectionOptions [ngClass]="optionsClass">
215
- <ng-container *ngFor="let item of itemsValues" >
216
- <ng-container *ngIf="item && item.group">
217
- <group-item [item]="item"></group-item>
218
- <item *ngFor="let subItem of item.items" (itemClick)="onItemClick(subItem)" (checkStatusChange)="toggleSelection(subItem)"
219
- [item]="subItem" [checkbox]="checkbox" [formatNumber]="formatNumber" [suffixText]="suffixText">
220
- </item>
221
- </ng-container>
222
- <ng-container *ngIf="item && !item.group">
223
- <item (itemClick)="onItemClick(item)" (checkStatusChange)="toggleSelection(item)"
224
- [item]="item" [checkbox]="checkbox" [formatNumber]="formatNumber" [suffixText]="suffixText">
225
- </item>
226
- </ng-container>
227
- </ng-container>
228
- </span>
229
- </span>
230
- `,
231
- styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.dropdown{width:100%;padding:0;display:none;margin:0;border:1px solid #66afe9;border-top:none;border-bottom:none;border-top-right-radius:0;border-top-left-radius:0;box-sizing:border-box;position:relative;z-index:999}.dropdown:focus{outline:0}.dropdown .options{width:calc(100% + 2px);left:0;box-sizing:border-box;background:#fff;position:absolute;max-height:228px;overflow-y:auto;overflow-x:hidden;border:1px solid #66afe9;border-top:none;border-bottom-right-radius:4px;border-bottom-left-radius:4px;margin-left:-1px;margin-right:-1px}.dropdown .with-filter{top:32px}.dropdown .no-filter{top:0}"]
232
- }] }
233
- ];
234
- DropdownComponent.propDecorators = {
235
- dropdownRef: [{ type: ViewChild, args: ['dropdown', { read: ElementRef },] }],
236
- filterInputRef: [{ type: ViewChild, args: ['filterInput', { read: ElementRef },] }],
237
- placeHolder: [{ type: Input }],
238
- items: [{ type: Input }],
239
- checkbox: [{ type: Input }],
240
- selectedValue: [{ type: Input }],
241
- filterBox: [{ type: Input }],
242
- suffixText: [{ type: Input }],
243
- disabled: [{ type: Input }],
244
- allowClear: [{ type: Input }],
245
- formatNumber: [{ type: Input }],
246
- selectedValueChange: [{ type: Output }],
247
- selectionChange: [{ type: Output }],
248
- dropdownBlur: [{ type: Output }],
249
- itemClick: [{ type: Output }]
250
- };
251
- if (false) {
252
- /**
253
- * Child element reference of dropdown
254
- * @type {?}
255
- */
256
- DropdownComponent.prototype.dropdownRef;
257
- /**
258
- * Child element reference of filter input text
259
- * @type {?}
260
- */
261
- DropdownComponent.prototype.filterInputRef;
262
- /**
263
- * bind to [placeHolder] for displaying the place holder string of the anchor.
264
- * @type {?}
265
- */
266
- DropdownComponent.prototype.placeHolder;
267
- /**
268
- * bind to [items] for the options/groups in the dropdown
269
- * @type {?}
270
- */
271
- DropdownComponent.prototype.items;
272
- /**
273
- * bind to [checkbox], the flag for multi-select (checkbox) mode.
274
- * @type {?}
275
- */
276
- DropdownComponent.prototype.checkbox;
277
- /**
278
- * bind to [selectedValue] for the value of the selected option from dropdown
279
- * @type {?}
280
- */
281
- DropdownComponent.prototype.selectedValue;
282
- /**
283
- * bind to [filterBox] for displaying the filter input text box
284
- * @type {?}
285
- */
286
- DropdownComponent.prototype.filterBox;
287
- /**
288
- * bind to [suffixText] for displaying the suffix of the selected text of anchor
289
- * @type {?}
290
- */
291
- DropdownComponent.prototype.suffixText;
292
- /**
293
- * bind to [disabled] for disabling the dropdown
294
- * @type {?}
295
- */
296
- DropdownComponent.prototype.disabled;
297
- /**
298
- * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
299
- * @type {?}
300
- */
301
- DropdownComponent.prototype.allowClear;
302
- /**
303
- * bind to [formatNumber] for show formatted number text
304
- * @type {?}
305
- */
306
- DropdownComponent.prototype.formatNumber;
307
- /**
308
- * for 2-way binding of [selectedValue]
309
- * @type {?}
310
- */
311
- DropdownComponent.prototype.selectedValueChange;
312
- /**
313
- * [selectionChange] event that will be triggered when changing of the selection
314
- * @type {?}
315
- */
316
- DropdownComponent.prototype.selectionChange;
317
- /**
318
- * [dropdownBlur] event that will be triggered with (blur) of dropdown
319
- * @type {?}
320
- */
321
- DropdownComponent.prototype.dropdownBlur;
322
- /**
323
- * [itemClick] event that will be triggered when clicking the option of dropdown
324
- * @type {?}
325
- */
326
- DropdownComponent.prototype.itemClick;
327
- /**
328
- * filter value
329
- * @type {?}
330
- */
331
- DropdownComponent.prototype.filterValue;
332
- /**
333
- * flag of clicking dropdown. It's to prevent (blur) of dropdown from happening in checkbox mode.
334
- * @type {?}
335
- * @private
336
- */
337
- DropdownComponent.prototype._clickedItems;
338
- }
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWRyb3Bkb3duLWxpc3QvIiwic291cmNlcyI6WyJzcmMvbmd4LWRyb3Bkb3duLWxpc3QvZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBaUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RILE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUEyQjNHLE1BQU0sT0FBTyxpQkFBaUI7SUF6QjlCOzs7O1FBNkNXLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFRakIsY0FBUyxHQUFHLEtBQUssQ0FBQzs7OztRQVlsQixlQUFVLEdBQUcsSUFBSSxDQUFDOzs7O1FBSWxCLGlCQUFZLEdBQUcsS0FBSyxDQUFDOzs7O1FBSXBCLHdCQUFtQixHQUFHLElBQUksWUFBWSxDQUFTLElBQUksQ0FBQyxDQUFDOzs7O1FBSXJELG9CQUFlLEdBQUcsSUFBSSxZQUFZLENBQU0sSUFBSSxDQUFDLENBQUM7Ozs7UUFJOUMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDOzs7O1FBSXZDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDOzs7O1FBUXRDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBeUloQyxDQUFDOzs7OztJQXZJQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3JGO0lBQ0gsQ0FBQzs7Ozs7O0lBS0QsWUFBWSxDQUFD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Ozs7SUFJN0Isa0NBQXNCOzs7OztJQUl0QixxQ0FBMEI7Ozs7O0lBSTFCLDBDQUE0Qjs7Ozs7SUFJNUIsc0NBQTJCOzs7OztJQUkzQix1Q0FBNEI7Ozs7O0lBSTVCLHFDQUEyQjs7Ozs7SUFJM0IsdUNBQTJCOzs7OztJQUkzQix5Q0FBOEI7Ozs7O0lBSTlCLGdEQUErRDs7Ozs7SUFJL0QsNENBQXdEOzs7OztJQUl4RCx5Q0FBaUQ7Ozs7O0lBSWpELHNDQUE4Qzs7Ozs7SUFJOUMsd0NBQW9COzs7Ozs7SUFJcEIsMENBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtjbGVhckFsbFNlbGVjdGlvbiwgZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0sIGhhc0dyb3VwLCBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0fSBmcm9tICcuLi91dGlscy91dGlsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHJvcGRvd24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxzcGFuICNkcm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCIgdGFiaW5kZXg9XCIzXCIgKG1vdXNlZG93bik9XCJvbkl0ZW1zQ2xpY2soJGV2ZW50KVwiIChibHVyKT1cIm9uSXRlbXNCbHVyKCRldmVudClcIiAqbmdJZj1cIiFkaXNhYmxlZFwiID5cbiAgICAgIDxpbnB1dC1maWx0ZXIgI2ZpbHRlcklucHV0IHRhYmluZGV4PVwiNFwiICpuZ0lmPVwiZmlsdGVyQm94ICYmICFjaGVja2JveFwiIFsoZmlsdGVyVmFsdWUpXT1cImZpbHRlclZhbHVlXCIgKGlucHV0RmlsdGVyQmx1cik9XCJvbkZpbHRlclRleHRCbHVyKCRldmVudClcIj48L2lucHV0LWZpbHRlcj5cbiAgICAgIDxzcGFuICNzZWxlY3Rpb25PcHRpb25zIFtuZ0NsYXNzXT1cIm9wdGlvbnNDbGFzc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zVmFsdWVzXCIgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtICYmIGl0ZW0uZ3JvdXBcIj5cbiAgICAgICAgICAgIDxncm91cC1pdGVtIFtpdGVtXT1cIml0ZW1cIj48L2dyb3VwLWl0ZW0+XG4gICAgICAgICAgICA8aXRlbSAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBpdGVtLml0ZW1zXCIgKGl0ZW1DbGljayk9XCJvbkl0ZW1DbGljayhzdWJJdGVtKVwiIChjaGVja1N0YXR1c0NoYW5nZSk9XCJ0b2dnbGVTZWxlY3Rpb24oc3ViSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwic3ViSXRlbVwiIFtjaGVja2JveF09XCJjaGVja2JveFwiIFtmb3JtYXROdW1iZXJdPVwiZm9ybWF0TnVtYmVyXCIgW3N1ZmZpeFRleHRdPVwic3VmZml4VGV4dFwiPlxuICAgICAgICAgICAgPC9pdGVtPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtICYmICFpdGVtLmdyb3VwXCI+XG4gICAgICAgICAgICA8aXRlbSAoaXRlbUNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCIgKGNoZWNrU3RhdHVzQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdGlvbihpdGVtKVwiXG4gICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCIgW2NoZWNrYm94XT1cImNoZWNrYm94XCIgW2Zvcm1hdE51bWJlcl09XCJmb3JtYXROdW1iZXJcIiBbc3VmZml4VGV4dF09XCJzdWZmaXhUZXh0XCI+XG4gICAgICAgICAgICA8L2l0ZW0+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnXVxufSlcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIENoaWxkIGVsZW1lbnQgcmVmZXJlbmNlIG9mIGRyb3Bkb3duXG4gICAqL1xuICBAVmlld0NoaWxkKCdkcm9wZG93bicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBkcm9wZG93blJlZjogRWxlbWVudFJlZjtcbiAgLyoqXG4gICAqIENoaWxkIGVsZW1lbnQgcmVmZXJlbmNlIG9mIGZpbHRlciBpbnB1dCB0ZXh0XG4gICAqL1xuICBAVmlld0NoaWxkKCdmaWx0ZXJJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBmaWx0ZXJJbnB1dFJlZjogRWxlbWVudFJlZjtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3BsYWNlSG9sZGVyXSBmb3IgZGlzcGxheWluZyB0aGUgcGxhY2UgaG9sZGVyIHN0cmluZyBvZiB0aGUgYW5jaG9yLlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2VIb2xkZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2l0ZW1zXSBmb3IgdGhlIG9wdGlvbnMvZ3JvdXBzIGluIHRoZSBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgaXRlbXM6IGFueVtdO1xuICAvKipcbiAgICogYmluZCB0byBbY2hlY2tib3hdLCB0aGUgZmxhZyBmb3IgbXVsdGktc2VsZWN0IChjaGVja2JveCkgbW9kZS5cbiAgICovXG4gIEBJbnB1dCgpIGNoZWNrYm94ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtzZWxlY3RlZFZhbHVlXSBmb3IgdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gZnJvbSBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRWYWx1ZTogYW55O1xuICAvKipcbiAgICogYmluZCB0byBbZmlsdGVyQm94XSBmb3IgZGlzcGxheWluZyB0aGUgZmlsdGVyIGlucHV0IHRleHQgYm94XG4gICAqL1xuICBASW5wdXQoKSBmaWx0ZXJCb3ggPSBmYWxzZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3N1ZmZpeFRleHRdIGZvciBkaXNwbGF5aW5nIHRoZSBzdWZmaXggb2YgdGhlIHNlbGVjdGVkIHRleHQgb2YgYW5jaG9yXG4gICAqL1xuICBASW5wdXQoKSBzdWZmaXhUZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtkaXNhYmxlZF0gZm9yIGRpc2FibGluZyB0aGUgZHJvcGRvd25cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogYmluZCB0byBbYWxsb3dDbGVhcl0gZm9yIGVuYWJsaW5nIHRoZSBjbGVhcmFuY2UgKGNsZWFyYW5jZSBpcyBub3QgYXZhaWFibGUgd2hlbiBjaGVja2JveCBpcyBlbmFibGVkKVxuICAgKi9cbiAgQElucHV0KCkgYWxsb3dDbGVhciA9IHRydWU7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtmb3JtYXROdW1iZXJdIGZvciBzaG93IGZvcm1hdHRlZCBudW1iZXIgdGV4dFxuICAgKi9cbiAgQElucHV0KCkgZm9ybWF0TnVtYmVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiBmb3IgMi13YXkgYmluZGluZyBvZiBbc2VsZWN0ZWRWYWx1ZV1cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KHRydWUpO1xuICAvKipcbiAgICogW3NlbGVjdGlvbkNoYW5nZV0gZXZlbnQgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNoYW5naW5nIG9mIHRoZSBzZWxlY3Rpb25cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4odHJ1ZSk7XG4gIC8qKlxuICAgKiBbZHJvcGRvd25CbHVyXSBldmVudCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdpdGggKGJsdXIpIG9mIGRyb3Bkb3duXG4gICAqL1xuICBAT3V0cHV0KCkgZHJvcGRvd25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKlxuICAgKiBbaXRlbUNsaWNrXSBldmVudCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIG9wdGlvbiBvZiBkcm9wZG93blxuICAgKi9cbiAgQE91dHB1dCgpIGl0ZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAvKipcbiAgICogZmlsdGVyIHZhbHVlXG4gICAqL1xuICBmaWx0ZXJWYWx1ZTogc3RyaW5nO1xuICAvKipcbiAgICogZmxhZyBvZiBjbGlja2luZyBkcm9wZG93bi4gSXQncyB0byBwcmV2ZW50IChibHVyKSBvZiBkcm9wZG93biBmcm9tIGhhcHBlbmluZyBpbiBjaGVja2JveCBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2xpY2tlZEl0ZW1zID0gZmFsc2U7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLml0ZW1zKSB7XG4gICAgICB0aGlzLl9jaGVja1NlbGVjdGlvbkNoYW5nZShjaGFuZ2VzLml0ZW1zLnByZXZpb3VzVmFsdWUsIGNoYW5nZXMuaXRlbXMuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGRyb3Bkb3duXG4gICAqL1xuICBvbkl0ZW1zQ2xpY2soZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudC5vZmZzZXRYID4gKGV2ZW50LnRhcmdldC5jbGllbnRXaWR0aCArIGV2ZW50LnRhcmdldC5jbGllbnRMZWZ0KSkge1xuICAgICAgc3RvcFByb3BhZ2F0aW9uQW5kRGVmYXVsdChldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHNob3VsZCBpZ25vcmUgY2xpY2tpbmcgb24gZmlsdGVyXG4gICAgaWYgKHRoaXMuY2hlY2tib3ggJiYgZXZlbnQudGFyZ2V0LnR5cGUgIT09ICd0ZXh0Jykge1xuICAgICAgdGhpcy5fY2xpY2tlZEl0ZW1zID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGl0ZW1cbiAgICovXG4gIG9uSXRlbUNsaWNrKGN1cnJlbnRJdGVtKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoZWNrYm94KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB0aGlzLl9nZXRJdGVtVmFsdWUoY3VycmVudEl0ZW0pOyAvLyBjdXJyZW50SXRlbS52YWx1ZSAhPSBudWxsID8gY3VycmVudEl0ZW0udmFsdWUgOiBjdXJyZW50SXRlbS50ZXh0O1xuICAgICAgY2xlYXJBbGxTZWxlY3Rpb24odGhpcy5pdGVtcyk7XG4gICAgICAvLyBzZXQgdGhlIHNlbGVjdGlvbiBvZiBjdXJyZW50IG9uZVxuICAgICAgY3VycmVudEl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pdGVtQ2xpY2suZW1pdChjdXJyZW50SXRlbSk7XG4gICAgICB0aGlzLl9vblNlbGVjdGlvbkNoYW5nZSh0aGlzLnNlbGVjdGVkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyB3aXRoIChibHVyKSBldmVudCBvZiBmaWx0ZXIgaW5wdXQgYm94XG4gICAqL1xuICBvbkZpbHRlclRleHRCbHVyKGV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kcm9wZG93bkJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcnMgd2l0aCAoYmx1cikgZXZlbnQgb2YgZHJvcGRvd25cbiAgICovXG4gIG9uSXRlbXNCbHVyKGV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tib3gpIHtcbiAgICAgIGlmICh0aGlzLl9jbGlja2VkSXRlbXMpIHtcbiAgICAgICAgLy8gaW4gY2hlY2tib3ggbW9kZSwgdGhpcyBibHVyIGV2ZW50IHdpbGwgYmUgaWdub3JlZCB3aGVuIGNsaWNraW5nIHRoZSBkcm9wZG93biAoY2hlY2sgdGhlIGNoZWNrYm94KVxuICAgICAgICBldmVudC50YXJnZXQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5fY2xpY2tlZEl0ZW1zID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcm9wZG93bkJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdG9nZ2xlIHRoZSBzZWxlY3Rpb24gd2hlbiBjaGVja2luZyBzdGF0dXMgY2hhbmdlZCAoaW4gY2hlY2tib3ggbW9kZSlcbiAgICovXG4gIHRvZ2dsZVNlbGVjdGlvbihpdGVtOiB7aWQ6IHN0cmluZywgdmFsdWU/OiBhbnksIHRleHQ6IGFueSwgc2VsZWN0ZWQ/OiBib29sZWFufSk6IHZvaWQge1xuICAgIGl0ZW0uc2VsZWN0ZWQgPSAhaXRlbS5zZWxlY3RlZDtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuX2dldEl0ZW1WYWx1ZShpdGVtKSk7IC8vIGl0ZW0udmFsdWUgIT0gbnVsbCA/IGl0ZW0udmFsdWUgOiBpdGVtLnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGl0ZW1zIHZhbHVlcyBsaXN0IGFmdGVyIGFwcGx5aW5nIHRoZSBmaWx0ZXJcbiAgICovXG4gIGdldCBpdGVtc1ZhbHVlcygpOiBhbnlbXSB7XG4gICAgbGV0IGZpbHRlcjtcbiAgICBpZiAodGhpcy5maWx0ZXJWYWx1ZSkge1xuICAgICAgZmlsdGVyID0gdGhpcy5maWx0ZXJWYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXM7XG4gICAgfVxuICAgIGlmICghdGhpcy5pdGVtcyB8fCB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoaGFzR3JvdXAodGhpcy5pdGVtcykpIHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICB0aGlzLml0ZW1zLmZvckVhY2goZ3JvdXBJdGVtID0+IHtcbiAgICAgICAgaWYgKGdyb3VwSXRlbS5ncm91cCAhPSBudWxsICYmIGdyb3VwSXRlbS5ncm91cC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSkge1xuICAgICAgICAgIC8vIGlmIGdyb3VwSXRlbSBjb250YWlucyB0aGUgZmlsdGVycywgdGhlIGdyb3VwSXRlbSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQgYXMgd2VsbFxuICAgICAgICAgIGl0ZW1zLnB1c2goZ3JvdXBJdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zID0gZ3JvdXBJdGVtLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0udGV4dCAhPSBudWxsICYmIGl0ZW0udGV4dC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSk7XG4gICAgICAgICAgaWYgKGZpbHRlcmVkSXRlbXMgJiYgZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtncm91cDogZ3JvdXBJdGVtLmdyb3VwLCBpdGVtczogZmlsdGVyZWRJdGVtc30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IChpdGVtLnRleHQgIT0gbnVsbCAmJiBpdGVtLnRleHQudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlcikpKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIG9wdGlvbnMgQ1NTIGNsYXNzXG4gICAqL1xuICBnZXQgb3B0aW9uc0NsYXNzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmlsdGVyQm94ICYmICF0aGlzLmNoZWNrYm94KSB7XG4gICAgICByZXR1cm4gJ29wdGlvbnMgd2l0aC1maWx0ZXInO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ29wdGlvbnMgbm8tZmlsdGVyJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGl0ZW0gdmFsdWUuIFJldHVybiB0ZXh0IGlmIHZhbHVlIGlzIG5vdCBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgX2dldEl0ZW1WYWx1ZShpdGVtKTogYW55IHtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0udmFsdWUgIT0gbnVsbCA/IGl0ZW0udmFsdWUgOiBpdGVtLnRleHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogc2VsZWN0aW9uIGNoYW5nZWQsIGVtaXRzIGV2ZW50czogKHNlbGVjdGVkVmFsdWVDaGFuZ2UpIGFuZCAoc2VsZWN0aW9uQ2hhbmdlKTtcbiAgICovXG4gIHByaXZhdGUgX29uU2VsZWN0aW9uQ2hhbmdlKHZhbHVlKSB7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyBjaGFuZ2VkLiBFbWl0cyByZWxhdGl2ZSBldmVudHMgd2hlbiBpZiBjaGFuZ2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2hlY2tTZWxlY3Rpb25DaGFuZ2UocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSB7XG4gICAgY29uc3QgY3VyU2VsZWN0ZWRJdGVtID0gZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0oY3VycmVudFZhbHVlKTtcbiAgICBjb25zdCBsYXN0U2VsZWN0ZWRJdGVtID0gZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0ocHJldmlvdXNWYWx1ZSk7XG4gICAgY29uc3QgY3VyU2VsZWN0ZWRJdGVtSWQgPSBjdXJTZWxlY3RlZEl0ZW0gPyBjdXJTZWxlY3RlZEl0ZW0uaWQgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFzdFNlbGVjdGVkSXRlbUlkID0gbGFzdFNlbGVjdGVkSXRlbSA/IGxhc3RTZWxlY3RlZEl0ZW0uaWQgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGN1clNlbGVjdGVkSXRlbUlkICE9PSBsYXN0U2VsZWN0ZWRJdGVtSWQgJiYgIXRoaXMuY2hlY2tib3gpIHtcbiAgICAgIHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlKHRoaXMuX2dldEl0ZW1WYWx1ZShjdXJTZWxlY3RlZEl0ZW0pKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==