ng-select2-component 8.0.2 → 8.0.6

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.
@@ -1,1385 +1,1500 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * Generated from: lib/select2.component.ts
4
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
- */
6
- import { ViewportRuler } from '@angular/cdk/scrolling';
7
- import { Attribute, ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, Optional, Output, Self, TemplateRef, ViewChild, ViewChildren, } from '@angular/core';
8
- import { FormGroupDirective, NgControl, NgForm } from '@angular/forms';
9
- import { Subject } from 'rxjs';
10
- import { timeout } from './select2-const';
11
- import { Select2Utils } from './select2-utils';
12
- /** @type {?} */
13
- let nextUniqueId = 0;
14
- /** @type {?} */
15
- const displaySearchStatusList = ['default', 'hidden', 'always'];
16
- export class Select2 {
17
- /**
18
- * @param {?} _viewportRuler
19
- * @param {?} _changeDetectorRef
20
- * @param {?} _parentForm
21
- * @param {?} _parentFormGroup
22
- * @param {?} _control
23
- * @param {?} tabIndex
24
- */
25
- constructor(_viewportRuler, _changeDetectorRef, _parentForm, _parentFormGroup, _control, tabIndex) {
26
- this._viewportRuler = _viewportRuler;
27
- this._changeDetectorRef = _changeDetectorRef;
28
- this._parentForm = _parentForm;
29
- this._parentFormGroup = _parentFormGroup;
30
- this._control = _control;
31
- this.minCharForSearch = 0;
32
- this.limitSelection = 0;
33
- /**
34
- * use the material style
35
- */
36
- this.styleMode = 'default';
37
- /**
38
- * infinite scroll distance
39
- */
40
- this.infiniteScrollDistance = 1.5;
41
- /**
42
- * infinite scroll distance
43
- */
44
- this.infiniteScrollThrottle = 150;
45
- /**
46
- * the max height of the results container when opening the select
47
- */
48
- this.resultMaxHeight = '200px';
49
- this.update = new EventEmitter();
50
- this.open = new EventEmitter();
51
- this.close = new EventEmitter();
52
- this.focus = new EventEmitter();
53
- this.blur = new EventEmitter();
54
- this.search = new EventEmitter();
55
- this.scroll = new EventEmitter();
56
- this.removeOption = new EventEmitter();
57
- this.option = null;
58
- this.isOpen = false;
59
- /**
60
- * Whether the element is focused or not.
61
- */
62
- this.focused = false;
63
- this.hoveringValue = null;
64
- this.innerSearchText = '';
65
- this._stateChanges = new Subject();
66
- this._disabled = false;
67
- this._required = false;
68
- this._readonly = false;
69
- this._multiple = false;
70
- this._overlay = false;
71
- this._resettable = false;
72
- this._hideSelectedItems = false;
73
- this._clickDetection = false;
74
- this._uid = `select2-${nextUniqueId++}`;
75
- this._infiniteScroll = true;
76
- /**
77
- * View -> model callback called when select has been touched
78
- */
79
- this._onTouched = (/**
80
- * @return {?}
81
- */
82
- () => {
83
- // do nothing
84
- });
85
- /**
86
- * View -> model callback called when value changes
87
- */
88
- this._onChange = (/**
89
- * @return {?}
90
- */
91
- () => {
92
- // do nothing
93
- });
94
- this.id = this.id;
95
- this._tabIndex = parseInt(tabIndex, 10) || 0;
96
- if (this._control) {
97
- this._control.valueAccessor = this;
98
- }
99
- this._clickDetectionFc = this.clickDetection.bind(this);
100
- }
101
- /**
102
- * @return {?}
103
- */
104
- get multiple() { return this._multiple; }
105
- /**
106
- * @param {?} value
107
- * @return {?}
108
- */
109
- set multiple(value) { this._multiple = this._coerceBooleanProperty(value); this.ngOnInit(); }
110
- /**
111
- * use the material style
112
- * @return {?}
113
- */
114
- get overlay() { return this._overlay; }
115
- /**
116
- * @param {?} value
117
- * @return {?}
118
- */
119
- set overlay(value) { this._overlay = this._coerceBooleanProperty(value); }
120
- /**
121
- * infinite scroll activated
122
- * @return {?}
123
- */
124
- get infiniteScroll() { return this._infiniteScroll; }
125
- /**
126
- * @param {?} value
127
- * @return {?}
128
- */
129
- set infiniteScroll(value) { this._infiniteScroll = this._coerceBooleanProperty(value); }
130
- /**
131
- * @return {?}
132
- */
133
- get select2Options() {
134
- return this.multiple ? (/** @type {?} */ (this.option)) : null;
135
- }
136
- /**
137
- * @return {?}
138
- */
139
- get select2Option() {
140
- return this.multiple ? null : (/** @type {?} */ (this.option));
141
- }
142
- /**
143
- * @return {?}
144
- */
145
- get searchText() {
146
- return this.innerSearchText;
147
- }
148
- /**
149
- * @param {?} text
150
- * @return {?}
151
- */
152
- set searchText(text) {
153
- if (this.customSearchEnabled) {
154
- this.search.emit({
155
- component: this,
156
- value: this._value,
157
- search: text
158
- });
159
- }
160
- this.innerSearchText = text;
161
- }
162
- /**
163
- * minimal data of show the search field
164
- * @return {?}
165
- */
166
- get minCountForSearch() {
167
- return this._minCountForSearch;
168
- }
169
- /**
170
- * @param {?} value
171
- * @return {?}
172
- */
173
- set minCountForSearch(value) {
174
- this._minCountForSearch = value;
175
- this.updateSearchBox();
176
- }
177
- /**
178
- * Unique id of the element.
179
- * @return {?}
180
- */
181
- get id() { return this._id; }
182
- /**
183
- * @param {?} value
184
- * @return {?}
185
- */
186
- set id(value) { this._id = value || this._uid; }
187
- /**
188
- * Whether the element is required.
189
- * @return {?}
190
- */
191
- get required() { return this._required; }
192
- /**
193
- * @param {?} value
194
- * @return {?}
195
- */
196
- set required(value) { this._required = this._coerceBooleanProperty(value); }
197
- /**
198
- * Whether selected items should be hidden.
199
- * @return {?}
200
- */
201
- get disabled() { return this._control ? this._control.disabled : this._disabled; }
202
- /**
203
- * @param {?} value
204
- * @return {?}
205
- */
206
- set disabled(value) { this._disabled = this._coerceBooleanProperty(value); }
207
- /**
208
- * Whether items are hidden when has.
209
- * @return {?}
210
- */
211
- get hideSelectedItems() { return this._hideSelectedItems; }
212
- /**
213
- * @param {?} value
214
- * @return {?}
215
- */
216
- set hideSelectedItems(value) { this._hideSelectedItems = this._coerceBooleanProperty(value); }
217
- /**
218
- * Whether the element is readonly.
219
- * @return {?}
220
- */
221
- get readonly() { return this._readonly; }
222
- /**
223
- * @param {?} value
224
- * @return {?}
225
- */
226
- set readonly(value) { this._readonly = this._coerceBooleanProperty(value); }
227
- /**
228
- * The input element's value.
229
- * @return {?}
230
- */
231
- get value() {
232
- return this._value;
233
- }
234
- /**
235
- * @param {?} value
236
- * @return {?}
237
- */
238
- set value(value) {
239
- if (this.testValueChange(this._value, value)) {
240
- setTimeout((/**
241
- * @return {?}
242
- */
243
- () => {
244
- this._value = value;
245
- this.writeValue(value);
246
- }), 10);
247
- }
248
- }
249
- /**
250
- * Tab index for the select2 element.
251
- * @return {?}
252
- */
253
- get tabIndex() {
254
- return this.disabled ? -1 : this._tabIndex;
255
- }
256
- /**
257
- * @param {?} value
258
- * @return {?}
259
- */
260
- set tabIndex(value) {
261
- if (typeof value !== 'undefined') {
262
- this._tabIndex = value;
263
- }
264
- }
265
- /**
266
- * reset with no selected value
267
- * @return {?}
268
- */
269
- get resettable() { return this._resettable; }
270
- /**
271
- * @param {?} value
272
- * @return {?}
273
- */
274
- set resettable(value) { this._resettable = this._coerceBooleanProperty(value); }
275
- /**
276
- * @return {?}
277
- */
278
- get ariaInvalid() {
279
- return this._isErrorState();
280
- }
281
- /**
282
- * @return {?}
283
- */
284
- get classMaterial() {
285
- return this.styleMode === 'material';
286
- }
287
- /**
288
- * @return {?}
289
- */
290
- get classNostyle() {
291
- return this.styleMode === 'noStyle';
292
- }
293
- /**
294
- * @return {?}
295
- */
296
- get select2above() {
297
- return this.listPosition === 'above';
298
- }
299
- /**
300
- * @private
301
- * @return {?}
302
- */
303
- get resultsElement() {
304
- return this.resultContainer.nativeElement;
305
- }
306
- /**
307
- * @return {?}
308
- */
309
- ngOnInit() {
310
- this._viewportRuler.change(100).subscribe((/**
311
- * @return {?}
312
- */
313
- () => {
314
- if (this.isOpen) {
315
- this.triggerRect();
316
- }
317
- }));
318
- /** @type {?} */
319
- const option = Select2Utils.getOptionsByValue(this.data, this._control ? this._control.value : this.value, this.multiple);
320
- if (option !== null) {
321
- this.option = option;
322
- }
323
- if (!Array.isArray(option)) {
324
- this.hoveringValue = (/** @type {?} */ (this.value));
325
- }
326
- this.updateSearchBox();
327
- }
328
- /**
329
- * @return {?}
330
- */
331
- ngAfterViewInit() {
332
- this.selectionElement = this.selection.nativeElement;
333
- this.triggerRect();
334
- }
335
- /**
336
- * @return {?}
337
- */
338
- ngDoCheck() {
339
- this.updateSearchBox();
340
- this._dirtyCheckNativeValue();
341
- if (this._triggerRect && this.overlayWidth !== this._triggerRect.width) {
342
- this.overlayWidth = this._triggerRect.width;
343
- }
344
- }
345
- /**
346
- * @return {?}
347
- */
348
- ngOnDestroy() {
349
- window.document.body.removeEventListener('click', this._clickDetectionFc);
350
- }
351
- /**
352
- * @return {?}
353
- */
354
- updateSearchBox() {
355
- /** @type {?} */
356
- const hidden = this.customSearchEnabled
357
- ? false
358
- : Select2Utils.isSearchboxHiddex(this.data, this._minCountForSearch);
359
- if (this.isSearchboxHidden !== hidden) {
360
- this.isSearchboxHidden = hidden;
361
- }
362
- }
363
- /**
364
- * @return {?}
365
- */
366
- hideSearch() {
367
- /** @type {?} */
368
- const displaySearchStatus = displaySearchStatusList.indexOf(this.displaySearchStatus) > -1
369
- ? this.displaySearchStatus
370
- : 'default';
371
- return (displaySearchStatus === 'default' && this.isSearchboxHidden) || displaySearchStatus === 'hidden';
372
- }
373
- /**
374
- * @param {?} option
375
- * @return {?}
376
- */
377
- getOptionStyle(option) {
378
- return 'select2-results__option ' +
379
- (option.hide ? 'select2-results__option--hide ' : '') +
380
- (option.value === this.hoveringValue ? 'select2-results__option--highlighted ' : '') +
381
- (option.classes || '');
382
- }
383
- /**
384
- * @param {?} option
385
- * @return {?}
386
- */
387
- mouseenter(option) {
388
- if (!option.disabled) {
389
- this.hoveringValue = option.value;
390
- }
391
- }
392
- /**
393
- * @param {?} option
394
- * @return {?}
395
- */
396
- click(option) {
397
- if (this.testSelection(option)) {
398
- this.select(option);
399
- }
400
- }
401
- /**
402
- * @param {?} e
403
- * @return {?}
404
- */
405
- reset(e) {
406
- this.select(null);
407
- e.preventDefault();
408
- e.stopPropagation();
409
- }
410
- /**
411
- * @param {?} event
412
- * @return {?}
413
- */
414
- prevChange(event) {
415
- event.stopPropagation();
416
- }
417
- /**
418
- * @return {?}
419
- */
420
- toggleOpenAndClose() {
421
- if (this.disabled) {
422
- return;
423
- }
424
- this._focus(true);
425
- this.isOpen = !this.isOpen;
426
- if (this.isOpen) {
427
- this.triggerRect();
428
- this.innerSearchText = '';
429
- this.updateFilteredData();
430
- this._focusSearchboxOrResultsElement();
431
- setTimeout((/**
432
- * @return {?}
433
- */
434
- () => {
435
- if (this.option) {
436
- /** @type {?} */
437
- const option = this.option instanceof Array ? this.option[0] : this.option;
438
- this.updateScrollFromOption(option);
439
- }
440
- else {
441
- this.resultsElement.scrollTop = 0;
442
- }
443
- }));
444
- this.open.emit(this);
445
- }
446
- else {
447
- this.close.emit(this);
448
- }
449
- if (this.isOpen && !this._clickDetection) {
450
- setTimeout((/**
451
- * @return {?}
452
- */
453
- () => {
454
- window.document.body.addEventListener('click', this._clickDetectionFc, false);
455
- this._clickDetection = true;
456
- }), timeout);
457
- }
458
- this._changeDetectorRef.markForCheck();
459
- }
460
- /**
461
- * @param {?} option
462
- * @param {?} defaut
463
- * @return {?}
464
- */
465
- hasTemplate(option, defaut) {
466
- return this.templates instanceof TemplateRef
467
- || this.templates && this.templates[option.templateId] instanceof TemplateRef
468
- || this.templates && this.templates[defaut] instanceof TemplateRef;
469
- }
470
- /**
471
- * @param {?} option
472
- * @param {?} defaut
473
- * @return {?}
474
- */
475
- getTemplate(option, defaut) {
476
- if (this.hasTemplate(option, defaut)) {
477
- return this.templates[option.templateId]
478
- || this.templates[defaut]
479
- || this.templates;
480
- }
481
- return undefined;
482
- }
483
- /**
484
- * @return {?}
485
- */
486
- triggerRect() {
487
- this._triggerRect = this.selectionElement.getBoundingClientRect();
488
- }
489
- /**
490
- * @private
491
- * @param {?} option
492
- * @return {?}
493
- */
494
- testSelection(option) {
495
- if (option.disabled) {
496
- return false;
497
- }
498
- if (!this.multiple ||
499
- !this.limitSelection ||
500
- Array.isArray(this._value) && this._value.length < this.limitSelection) {
501
- return true;
502
- }
503
- return false;
504
- }
505
- /**
506
- * @private
507
- * @param {?} value1
508
- * @param {?} value2
509
- * @return {?}
510
- */
511
- testValueChange(value1, value2) {
512
- if ((value1 === null || value1 === undefined) && (value2 === null || value2 === undefined) ||
513
- value1 === value2) {
514
- return false;
515
- }
516
- if (this.multiple
517
- && value1 && ((/** @type {?} */ (value1))).length
518
- && value2 && ((/** @type {?} */ (value2))).length
519
- && ((/** @type {?} */ (value1))).length === ((/** @type {?} */ (value2))).length) {
520
- for (const e1 of ((/** @type {?} */ (value1)))) {
521
- /** @type {?} */
522
- const test = ((/** @type {?} */ (value2))).indexOf(e1) > -1;
523
- if (!test) {
524
- return true;
525
- }
526
- }
527
- return false;
528
- }
529
- return true;
530
- }
531
- /**
532
- * @private
533
- * @return {?}
534
- */
535
- updateFilteredData() {
536
- setTimeout((/**
537
- * @return {?}
538
- */
539
- () => {
540
- /** @type {?} */
541
- let result = this.data;
542
- if (this.multiple && this.hideSelectedItems) {
543
- result = Select2Utils.getFilteredSelectedData(result, this.option);
544
- }
545
- if (!this.customSearchEnabled && this.searchText && this.searchText.length >= +this.minCharForSearch) {
546
- result = Select2Utils.getFilteredData(result, this.searchText, this.editPattern);
547
- }
548
- if (Select2Utils.valueIsNotInFilteredData(result, this.hoveringValue)) {
549
- this.hoveringValue = Select2Utils.getFirstAvailableOption(result);
550
- }
551
- this.filteredData = result;
552
- this._changeDetectorRef.markForCheck();
553
- }));
554
- }
555
- /**
556
- * @private
557
- * @param {?} e
558
- * @return {?}
559
- */
560
- clickDetection(e) {
561
- if (!this.ifParentContainsClass((/** @type {?} */ (e.target)), 'selection')) {
562
- if (this.isOpen && !this.ifParentContainsClass((/** @type {?} */ (e.target)), 'select2-dropdown')) {
563
- this.toggleOpenAndClose();
564
- }
565
- if (!this.ifParentContainsId((/** @type {?} */ (e.target)), this._id)) {
566
- this.clickExit();
567
- }
568
- }
569
- else if (this.isOpen && !this.ifParentContainsId((/** @type {?} */ (e.target)), this._id)) {
570
- this.toggleOpenAndClose();
571
- this.clickExit();
572
- }
573
- }
574
- /**
575
- * @private
576
- * @return {?}
577
- */
578
- clickExit() {
579
- this._focus(false);
580
- window.document.body.removeEventListener('click', this._clickDetectionFc);
581
- this._clickDetection = false;
582
- }
583
- /**
584
- * @private
585
- * @param {?} element
586
- * @param {?} cssClass
587
- * @return {?}
588
- */
589
- ifParentContainsClass(element, cssClass) {
590
- return this.getParentElementByClass(element, cssClass) !== null;
591
- }
592
- /**
593
- * @private
594
- * @param {?} element
595
- * @param {?} id
596
- * @return {?}
597
- */
598
- ifParentContainsId(element, id) {
599
- return this.getParentElementById(element, id) !== null;
600
- }
601
- /**
602
- * @private
603
- * @param {?} element
604
- * @param {?} cssClass
605
- * @return {?}
606
- */
607
- getParentElementByClass(element, cssClass) {
608
- if (this.containClasses(element, cssClass.trim().split(/\s+/))) {
609
- return element;
610
- }
611
- return element.parentElement
612
- ? this.getParentElementByClass(element.parentElement, cssClass)
613
- : null;
614
- }
615
- /**
616
- * @private
617
- * @param {?} element
618
- * @param {?} id
619
- * @return {?}
620
- */
621
- getParentElementById(element, id) {
622
- if (element.id === id) {
623
- return element;
624
- }
625
- return element.parentElement
626
- ? this.getParentElementById(element.parentElement, id)
627
- : null;
628
- }
629
- /**
630
- * @private
631
- * @param {?} element
632
- * @param {?} cssClasses
633
- * @return {?}
634
- */
635
- containClasses(element, cssClasses) {
636
- if (!element.classList) {
637
- return false;
638
- }
639
- for (const cssClass of cssClasses) {
640
- if (!element.classList.contains(cssClass)) {
641
- return false;
642
- }
643
- }
644
- return true;
645
- }
646
- /**
647
- * @return {?}
648
- */
649
- focusin() {
650
- if (this.disabled) {
651
- return;
652
- }
653
- this._focus(true);
654
- }
655
- /**
656
- * @return {?}
657
- */
658
- focusout() {
659
- if (this.selectionElement && !this.selectionElement.classList.contains('select2-focused')) {
660
- this._focus(false);
661
- this._onTouched();
662
- }
663
- }
664
- /**
665
- * @private
666
- * @return {?}
667
- */
668
- moveUp() {
669
- this.updateScrollFromOption(Select2Utils.getPreviousOption(this.filteredData, this.hoveringValue));
670
- }
671
- /**
672
- * @private
673
- * @return {?}
674
- */
675
- moveDown() {
676
- this.updateScrollFromOption(Select2Utils.getNextOption(this.filteredData, this.hoveringValue));
677
- }
678
- /**
679
- * @private
680
- * @param {?} option
681
- * @return {?}
682
- */
683
- updateScrollFromOption(option) {
684
- if (option) {
685
- this.hoveringValue = option.value;
686
- /** @type {?} */
687
- const domElement = this.results.find((/**
688
- * @param {?} r
689
- * @return {?}
690
- */
691
- r => r.nativeElement.innerText.trim() === option.label));
692
- if (domElement) {
693
- this.resultsElement.scrollTop = 0;
694
- /** @type {?} */
695
- const listClientRect = this.resultsElement.getBoundingClientRect();
696
- /** @type {?} */
697
- const optionClientRect = domElement.nativeElement.getBoundingClientRect();
698
- this.resultsElement.scrollTop = optionClientRect.top - listClientRect.top;
699
- }
700
- }
701
- }
702
- /**
703
- * @private
704
- * @return {?}
705
- */
706
- selectByEnter() {
707
- if (this.hoveringValue) {
708
- /** @type {?} */
709
- const option = Select2Utils.getOptionByValue(this.data, this.hoveringValue);
710
- this.select(option);
711
- }
712
- }
713
- /**
714
- * @param {?} option
715
- * @return {?}
716
- */
717
- select(option) {
718
- /** @type {?} */
719
- let value;
720
- if (option !== null) {
721
- if (this.multiple) {
722
- /** @type {?} */
723
- const options = (/** @type {?} */ (this.option));
724
- /** @type {?} */
725
- const index = options.findIndex((/**
726
- * @param {?} op
727
- * @return {?}
728
- */
729
- op => op.value === option.value));
730
- if (index === -1) {
731
- options.push(option);
732
- }
733
- else {
734
- options.splice(index, 1);
735
- }
736
- value = ((/** @type {?} */ (this.option))).map((/**
737
- * @param {?} op
738
- * @return {?}
739
- */
740
- op => op.value));
741
- }
742
- else {
743
- this.option = option;
744
- if (this.isOpen) {
745
- this.isOpen = false;
746
- this.close.emit(this);
747
- if (this.selectionElement) {
748
- this.selectionElement.focus();
749
- }
750
- }
751
- value = this.option.value;
752
- }
753
- }
754
- else {
755
- this.option = null;
756
- }
757
- if (this.multiple && this.hideSelectedItems) {
758
- this.updateFilteredData();
759
- }
760
- if (this._control) {
761
- this._onChange(value);
762
- }
763
- else {
764
- this._value = value;
765
- }
766
- this.update.emit({
767
- component: this,
768
- value: value,
769
- options: Array.isArray(this.option) ? this.option : (this.option ? [this.option] : null)
770
- });
771
- }
772
- /**
773
- * @param {?} e
774
- * @return {?}
775
- */
776
- keyDown(e) {
777
- if (this._testKey(e, ['ArrowDown', 40])) {
778
- this.moveDown();
779
- e.preventDefault();
780
- }
781
- else if (this._testKey(e, ['ArrowUp', 38])) {
782
- this.moveUp();
783
- e.preventDefault();
784
- }
785
- else if (this._testKey(e, ['Enter', 13])) {
786
- this.selectByEnter();
787
- e.preventDefault();
788
- }
789
- else if (this._testKey(e, ['Escape', 'Tab', 9, 27]) && this.isOpen) {
790
- this.toggleOpenAndClose();
791
- this._focus(false);
792
- }
793
- }
794
- /**
795
- * @param {?} e
796
- * @return {?}
797
- */
798
- openKey(e) {
799
- if (this._testKey(e, ['ArrowDown', 'ArrowUp', 'Enter', 40, 38, 13])) {
800
- this.toggleOpenAndClose();
801
- e.preventDefault();
802
- }
803
- else if (this._testKey(e, ['Escape', 'Tab', 9, 27])) {
804
- this._focus(false);
805
- this._onTouched();
806
- }
807
- }
808
- /**
809
- * @param {?} _index
810
- * @param {?} item
811
- * @return {?}
812
- */
813
- trackBy(_index, item) {
814
- return item.value;
815
- }
816
- /**
817
- * @param {?} e
818
- * @return {?}
819
- */
820
- searchUpdate(e) {
821
- this.searchText = ((/** @type {?} */ (e.target))).value;
822
- this.updateFilteredData();
823
- }
824
- /**
825
- * @param {?} option
826
- * @return {?}
827
- */
828
- isSelected(option) {
829
- return Select2Utils.isSelected(this.option, option, this.multiple);
830
- }
831
- /**
832
- * @param {?} option
833
- * @return {?}
834
- */
835
- isDisabled(option) {
836
- return option.disabled ? 'true' : 'false';
837
- }
838
- /**
839
- * @param {?} e
840
- * @param {?} option
841
- * @return {?}
842
- */
843
- removeSelection(e, option) {
844
- Select2Utils.removeSelection(this.option, option);
845
- if (this.multiple && this.hideSelectedItems) {
846
- this.updateFilteredData();
847
- }
848
- /** @type {?} */
849
- const value = ((/** @type {?} */ (this.option))).map((/**
850
- * @param {?} op
851
- * @return {?}
852
- */
853
- op => op.value));
854
- if (this._control) {
855
- this._onChange(value);
856
- }
857
- else {
858
- this._value = value;
859
- }
860
- this.update.emit({
861
- component: this,
862
- value: value,
863
- options: Array.isArray(this.option) ? this.option : (this.option ? [this.option] : null)
864
- });
865
- this.removeOption.emit({
866
- component: this,
867
- value: value,
868
- removedOption: option
869
- });
870
- e.preventDefault();
871
- e.stopPropagation();
872
- if (this.isOpen) {
873
- this._focusSearchboxOrResultsElement();
874
- }
875
- }
876
- /**
877
- * Sets the model value. Implemented as part of ControlValueAccessor.
878
- * @param {?} value
879
- * @return {?}
880
- */
881
- writeValue(value) {
882
- this._setSelectionByValue(value);
883
- }
884
- /**
885
- * Saves a callback function to be invoked when the select's value
886
- * changes from user input. Part of the ControlValueAccessor interface
887
- * required to integrate with Angular's core forms API.
888
- *
889
- * @param {?} fn Callback to be triggered when the value changes.
890
- * @return {?}
891
- */
892
- registerOnChange(fn) {
893
- this._onChange = fn;
894
- }
895
- /**
896
- * Saves a callback function to be invoked when the select is blurred
897
- * by the user. Part of the ControlValueAccessor interface required
898
- * to integrate with Angular's core forms API.
899
- *
900
- * @param {?} fn Callback to be triggered when the component has been touched.
901
- * @return {?}
902
- */
903
- registerOnTouched(fn) {
904
- this._onTouched = fn;
905
- }
906
- /**
907
- * Sets whether the component should be disabled.
908
- * Implemented as part of ControlValueAccessor.
909
- * @param {?} isDisabled
910
- * @return {?}
911
- */
912
- setDisabledState(isDisabled) {
913
- this.disabled = isDisabled;
914
- }
915
- /**
916
- * @return {?}
917
- */
918
- _isErrorState() {
919
- /** @type {?} */
920
- const isInvalid = this._control && this._control.invalid;
921
- /** @type {?} */
922
- const isTouched = this._control && this._control.touched;
923
- /** @type {?} */
924
- const isSubmitted = (this._parentFormGroup && this._parentFormGroup.submitted) ||
925
- (this._parentForm && this._parentForm.submitted);
926
- return !!(isInvalid && (isTouched || isSubmitted));
927
- }
928
- /**
929
- * @private
930
- * @param {?} event
931
- * @param {?=} refs
932
- * @return {?}
933
- */
934
- _testKey(event, refs = []) {
935
- return this._isKey(this._getKey(event), refs);
936
- }
937
- /**
938
- * @private
939
- * @param {?} event
940
- * @return {?}
941
- */
942
- _getKey(event) {
943
- /** @type {?} */
944
- let code;
945
- if (event.key !== undefined) {
946
- code = event.key;
947
- }
948
- else if (event['keyIdentifier'] !== undefined) {
949
- code = event['keyIdentifier'];
950
- }
951
- else if (event['keyCode'] !== undefined) {
952
- code = event['keyCode'];
953
- }
954
- else {
955
- event.preventDefault();
956
- }
957
- return code;
958
- }
959
- /**
960
- * @private
961
- * @param {?} code
962
- * @param {?=} refs
963
- * @return {?}
964
- */
965
- _isKey(code, refs = []) {
966
- return refs && refs.length > 0
967
- ? refs.indexOf(code) !== -1
968
- : false;
969
- }
970
- /**
971
- * Sets the selected option based on a value. If no option can be
972
- * found with the designated value, the select trigger is cleared.
973
- * @private
974
- * @param {?} value
975
- * @return {?}
976
- */
977
- _setSelectionByValue(value) {
978
- if (this.option || (value !== undefined && value !== null)) {
979
- /** @type {?} */
980
- const isArray = Array.isArray(value);
981
- if (this.multiple && value && !isArray) {
982
- throw new Error('Non array value.');
983
- }
984
- else if (this.data) {
985
- if (this.multiple) {
986
- this.option = []; // if value is null, then empty option and return
987
- if (isArray) {
988
- // value is not null. Preselect value
989
- /** @type {?} */
990
- const selectedValues = Select2Utils.getOptionsByValue(this.data, value, this.multiple);
991
- selectedValues.map((/**
992
- * @param {?} item
993
- * @return {?}
994
- */
995
- item => this.select(item)));
996
- }
997
- }
998
- else {
999
- this.select(Select2Utils.getOptionByValue(this.data, value));
1000
- }
1001
- }
1002
- else if (this._control) {
1003
- this._control.viewToModelUpdate(value);
1004
- }
1005
- this._changeDetectorRef.markForCheck();
1006
- }
1007
- }
1008
- /**
1009
- * Does some manual dirty checking on the native input `value` property.
1010
- * @private
1011
- * @return {?}
1012
- */
1013
- _dirtyCheckNativeValue() {
1014
- /** @type {?} */
1015
- const newValue = this.value;
1016
- if (this._previousNativeValue !== newValue) {
1017
- this._previousNativeValue = newValue;
1018
- this._stateChanges.next();
1019
- }
1020
- }
1021
- /**
1022
- * @private
1023
- * @param {?} value
1024
- * @return {?}
1025
- */
1026
- _coerceBooleanProperty(value) {
1027
- return value != null && `${value}` !== 'false';
1028
- }
1029
- /**
1030
- * @private
1031
- * @return {?}
1032
- */
1033
- _focusSearchboxOrResultsElement() {
1034
- if (!this.isSearchboxHidden) {
1035
- setTimeout((/**
1036
- * @return {?}
1037
- */
1038
- () => {
1039
- if (this.searchInput && this.searchInput.nativeElement) {
1040
- console.log(this.searchInput.nativeElement);
1041
- this.searchInput.nativeElement.focus();
1042
- }
1043
- }));
1044
- }
1045
- else {
1046
- if (this.resultsElement) {
1047
- this.resultsElement.focus();
1048
- }
1049
- }
1050
- }
1051
- /**
1052
- * @private
1053
- * @param {?} state
1054
- * @return {?}
1055
- */
1056
- _focus(state) {
1057
- if (!state && this.focused) {
1058
- this.focused = state;
1059
- this.blur.emit(this);
1060
- }
1061
- else if (state && !this.focused) {
1062
- this.focused = state;
1063
- this.focus.emit(this);
1064
- }
1065
- }
1066
- /**
1067
- * @param {?} way
1068
- * @return {?}
1069
- */
1070
- onScroll(way) {
1071
- this.scroll.emit({
1072
- component: this,
1073
- way,
1074
- search: this.innerSearchText
1075
- });
1076
- }
1077
- }
1078
- Select2.decorators = [
1079
- { type: Component, args: [{
1080
- selector: 'select2',
1081
- template: "<div class=\"select2-label\"\n (click)=\"toggleOpenAndClose()\">\n <ng-content select=\"select2-label\"></ng-content>\n <span *ngIf=\"required\"\n class=\"select2-required\"></span>\n</div>\n<div class=\"select2 select2-container select2-container--default select2-container--focus\"\n [class.select2-container--below]=\"!select2above\"\n [class.select2-container--above]=\"select2above\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-container--disabled]=\"disabled\">\n <div class=\"selection\"\n #selection\n #trigger=\"cdkOverlayOrigin\"\n [attr.tabindex]=\"!this.isOpen ? tabIndex : '-1'\"\n (click)=\"toggleOpenAndClose()\"\n (focus)=\"focusin()\"\n (blur)=\"focusout()\"\n (keydown)=\"openKey($event)\"\n cdkOverlayOrigin\n [class.select2-focused]=\"focused\">\n <div class=\"select2-selection\"\n [class.select2-selection--multiple]=\"multiple\"\n [class.select2-selection--single]=\"!multiple\"\n role=\"combobox\">\n <span *ngIf=\"!multiple\"\n class=\"select2-selection__rendered\"\n [title]=\"select2Option?.label || ''\">\n <span *ngIf=\"!select2Option\">&nbsp;</span>\n <span *ngIf=\"select2Option\"\n [innerHTML]=\"select2Option.label\"></span>\n <span [class.select2-selection__placeholder__option]=\"option\"\n class=\"select2-selection__placeholder\">{{placeholder}}</span>\n </span>\n <span (click)=\"reset($event)\"\n *ngIf=\"!multiple && resettable && select2Option\"\n class=\"select2-selection__reset\"\n role=\"presentation\">\u00D7</span>\n <span *ngIf=\"!multiple\"\n class=\"select2-selection__arrow\"\n role=\"presentation\">\n </span>\n <ul *ngIf=\"multiple\"\n class=\"select2-selection__rendered\">\n <span [class.select2-selection__placeholder__option]=\"select2Options?.length > 0\"\n class=\"select2-selection__placeholder\">{{placeholder}}</span>\n <li *ngFor=\"let op of option; trackBy: trackBy\"\n class=\"select2-selection__choice\"\n [title]=\"op.label\">\n <span (click)=\"removeSelection($event, op)\"\n class=\"select2-selection__choice__remove\"\n role=\"presentation\">\u00D7</span>\n <span [innerHTML]=\"op.label\"></span>\n </li>\n </ul>\n </div>\n </div>\n <ng-container *ngIf=\"!overlay\">\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n </ng-container>\n\n <div class=\"select2-subscript-wrapper\">\n <ng-content select=\"select2-hint\"></ng-content>\n </div>\n</div>\n\n<ng-template cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"select2-overlay-backdrop\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"this.isOpen && overlay\"\n [cdkConnectedOverlayMinWidth]=\"overlayWidth\"\n (backdropClick)=\"toggleOpenAndClose()\">\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n</ng-template>\n\n<ng-template #containerTemplate>\n <div class=\"select2-container select2-container--default select2-container-dropdown\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-overlay]=\"overlay\">\n <div class=\"select2-dropdown\"\n [class.select2-dropdown--below]=\"!select2above\"\n [class.select2-dropdown--above]=\"select2above\">\n <div class=\"select2-search select2-search--dropdown\"\n [class.select2-search--hide]=\"hideSearch()\">\n <input #searchInput\n [id]=\"id + '-search-field'\"\n [value]=\"searchText\"\n (keydown)=\"keyDown($event)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-search__field\"\n type=\"search\"\n role=\"textbox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n [attr.tabindex]=\"this.isOpen ? tabIndex : '-1'\">\n </div>\n <div class=\"select2-results\">\n <ul #results\n class=\"select2-results__options\"\n [style.max-height]=\"resultMaxHeight\"\n role=\"tree\"\n tabindex=\"-1\"\n infiniteScroll\n [infiniteScrollDisabled]=\"!infiniteScroll && !isOpen\"\n [infiniteScrollDistance]=\"infiniteScrollDistance\"\n [infiniteScrollThrottle]=\"infiniteScrollThrottle\"\n [infiniteScrollContainer]=\"results\"\n (scrolled)=\"onScroll('down')\"\n (scrolledUp)=\"onScroll('up')\"\n (keydown)=\"keyDown($event)\">\n <ng-container *ngFor=\"let groupOrOption of filteredData; index as i; trackBy:trackBy\">\n <li *ngIf=\"groupOrOption.options\"\n class=\"select2-results__option\"\n role=\"group\">\n <strong *ngIf=\"!hasTemplate(groupOrOption, 'group'); else optGroup\"\n [attr.class]=\"'select2-results__group' + (groupOrOption.classes ? ' ' + groupOrOption.classes : '')\"\n [innerHTML]=\"groupOrOption.label\"></strong>\n <ng-template #optGroup>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'group'); context: groupOrOption\">\n </ng-container>\n </ng-template>\n\n <ul class=\"select2-results__options select2-results__options--nested\">\n <li *ngFor=\"let option of groupOrOption.options; index as j; trackBy:trackBy\"\n #result\n [id]=\"option.id || id + '-option-' + i + '-' + j\"\n [class]=\"getOptionStyle(option)\"\n role=\"treeitem\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isDisabled(option)\"\n (mouseenter)=\"mouseenter(option)\"\n (click)=\"click(option)\">\n <div *ngIf=\"!hasTemplate(option, 'option'); else liGroup\"\n class=\"select2-label-content\"\n [innerHTML]=\"option.label\"></div>\n <ng-template #liGroup>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(option, 'option'); context: option\">\n </ng-container>\n </ng-template>\n </li>\n </ul>\n </li>\n <li *ngIf=\"!groupOrOption.options\"\n #result\n [id]=\"groupOrOption.id || id + '-option-' + i\"\n [class]=\"getOptionStyle(groupOrOption)\"\n role=\"treeitem\"\n [attr.aria-selected]=\"isSelected(groupOrOption)\"\n [attr.aria-disabled]=\"isDisabled(groupOrOption)\"\n (mouseenter)=\"mouseenter(groupOrOption)\"\n (click)=\"click(groupOrOption)\">\n <div *ngIf=\"!hasTemplate(groupOrOption, 'option'); else li\"\n [innerHTML]=\"groupOrOption.label\"\n class=\"select2-label-content\"></div>\n <ng-template #li>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\">\n </ng-container>\n </ng-template>\n </li>\n </ng-container>\n <li class=\"select2-no-result select2-results__option\"\n *ngIf=\"!filteredData?.length && noResultMessage\"\n [innerHTML]=\"noResultMessage\"></li>\n </ul>\n </div>\n </div>\n </div>\n</ng-template>\n",
1082
- styles: [".select2-label{color:#000;color:var(--select2-label-text-color,#000)}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;width:100%}.select2-container .select2-container-dropdown{opacity:0;position:absolute;width:0}.select2-container .select2-selection--single{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;flex:1 1 auto;overflow:hidden;padding:0 0 0 8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container .select2-selection--multiple{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{border:none;box-sizing:border-box;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background:#fff;background:var(--select2-dropdown-background,#fff);border:1px solid #aaa;border:1px solid var(--select2-dropdown-border-color,#aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius,4px);box-sizing:border-box;display:block;height:0;overflow:hidden;position:absolute;width:100%;z-index:1051}.select2-dropdown .select2-label-content{display:contents}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;color:#000;color:var(--select2-option-text-color,#000);padding:6px;user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container.select2-container-dropdown.select2-container--open{opacity:1;width:100%}.select2-container--open .select2-dropdown{height:auto;overflow:auto}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;bottom:27px;display:flex;flex-direction:column-reverse}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{box-sizing:border-box;padding:4px;width:100%}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{background:#fff;border:0;display:block;filter:alpha(opacity=0);height:auto;left:0;margin:0;min-height:100%;min-width:100%;opacity:0;padding:0;position:fixed;top:0;width:auto;z-index:99}.select2-required:before{color:red;color:var(--select2-required-color,red);content:\"*\"}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background:#fff;background:var(--select2-selection-background,#fff);border:1px solid #aaa;border:1px solid var(--select2-selection-border-color,#aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius,4px);display:flex}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;color:var(--select2-selection-text-color,#444);line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999;color:var(--select2-placeholder-color,#999)}.select2-container--default .select2-selection--single .select2-selection__placeholder span{overflow:hidden;text-overflow:ellipsis;text-overflow:var(--select2-placeholder-overflow,ellipsis);white-space:nowrap}.select2-container--default .select2-selection--single .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--single .select2-selection__arrow,.select2-container--default .select2-selection--single .select2-selection__reset{align-items:center;display:flex;justify-content:center;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow:before{border-bottom:0 solid var(--select2-arrow-color,#888);border-color:#888 transparent;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--select2-arrow-color,#888);content:\" \";height:0;width:0}.select2-container--default .select2-selection--single .select2-selection__reset{color:#999;color:var(--select2-reset-color,#999)}.select2-container--default.select2-container--disabled .select2-selection--single{background:#eee;background:var(--select2-selection-disabled-background,#eee);cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow:before{border-bottom-color:var(--select2-arrow-color,#888);border-color:transparent transparent #888;border-right-color:transparent;border-top-color:transparent;border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background:#fff;background:var(--select2-selection-background,#fff);border:1px solid #aaa;border:1px solid var(--select2-selection-border-color,#aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius,4px);cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;flex:1 1 auto;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;color:var(--select2-placeholder-color,#999);display:block;float:left;margin-top:5px;overflow:hidden;text-overflow:ellipsis;text-overflow:var(--select2-placeholder-overflow,ellipsis);white-space:nowrap;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background:#e4e4e4;background:var(--select2-selection-choice-background,#e4e4e4);border:1px solid #aaa;border:1px solid var(--select2-selection-choice-border-color,#aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius,4px);color:#000;color:var(--select2-selection-choice-text-color,#000);cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;color:var(--select2-selection-choice-close-color,#999);cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333;color:var(--select2-selection-choice-hover-close-color,#333)}.select2-container--default.select2-container--focused .select2-selection--multiple,.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple,.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single{border:1px solid #000;border:1px solid var(--select2-selection-focus-border-color,#000);outline:none}.select2-container--default.select2-container--disabled .select2-selection--multiple{background:#eee;background:var(--select2-selection-disabled-background,#eee);cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{background:#fff;background:1px solid var(--select2-search-background,#fff);border:1px solid #aaa;border:1px solid var(--select2-search-border-color,#aaa);border-radius:0;border-radius:var(--select2-search-border-radius,0)}.select2-container--default .select2-search--inline .select2-search__field{-webkit-appearance:textfield;background:transparent;border:none;box-shadow:none;outline:none}.select2-container--default .select2-results>.select2-results__options{overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{background:transparent;background:var(--select2-option-disabled-background,transparent);color:#999;color:var(--select2-option-disabled-text-color,#999)}.select2-container--default .select2-results__option[aria-selected=true]{background:#ddd;background:var(--select2-option-selected-background,#ddd);color:#000;color:var(--select2-option-selected-text-color,#000)}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background:#5897fb;background:var(--select2-option-highlighted-background,#5897fb);color:#fff;color:var(--select2-option-highlighted-text-color,#fff)}.select2-container--default .select2-results__option--hide{display:none}.select2-container--default .select2-results__group{background:transparent;background:var(--select2-option-group-background,transparent);color:grey;color:var(--select2-option-group-text-color,grey);cursor:default;display:block;padding:6px}.select2-no-result{color:#888;color:var(--select2-no-result-color,#888);font-style:italic;font-style:var(--select2-font-style-color,italic)}:host.nostyle .select2-dropdown{border-color:transparent}:host.nostyle .select2-container--default .select2-focused .select2-selection--multiple,:host.nostyle .select2-container--default .select2-focused .select2-selection--single,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.nostyle .select2-selection--multiple,:host.nostyle .select2-selection--single{background:transparent;border-color:transparent}:host.material{display:inline-block;width:300px}:host.material>.select2-container{padding-bottom:1.29688em;vertical-align:inherit}:host.material>.select2-container .selection{align-items:baseline;border-top:.84375em solid transparent;display:inline-flex;height:auto;padding:.4375em 0;width:100%}:host.material .select2-container--default .select2-selection--multiple,:host.material .select2-container--default .select2-selection--single{border:0;border-radius:0;box-sizing:border-box;height:24px;width:100%}:host.material .select2-container--default .select2-selection--multiple:before,:host.material .select2-container--default .select2-selection--single:before{background:#ddd;background:var(--select2-material-underline,#ddd);bottom:1.65em;content:\" \";display:block;height:1px;position:absolute;width:100%}:host.material .select2-container--default .select2-selection--multiple:after,:host.material .select2-container--default .select2-selection--single:after{background:#5a419e;background:var(--select2-material-underline-active,#5a419e);bottom:1.63em;content:\" \";display:block;height:2px;left:50%;position:absolute;transition:none;width:0}:host.material .select2-container--default .select2-selection--multiple .select2-selection__rendered,:host.material .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:inherit;padding-left:1px}:host.material .select2-container--default .select2-selection--multiple .select2-selection__placeholder,:host.material .select2-container--default .select2-selection--single .select2-selection__placeholder{color:rgba(0,0,0,.38);color:var(--select2-material-placeholder-color,rgba(0,0,0,.38));display:block;left:0;position:absolute;top:20px;transform-origin:0 21px;transition:transform .3s}:host.material .select2-container--default .select2-container--open{bottom:1.6em;left:0}:host.material .select2-container--default .select2-selection__placeholder__option{transform:translateY(-1.5em) scale(.75) perspective(100px) translateZ(.001px);width:133.33333%}:host.material .select2-container--default .select2-selection__arrow{top:20px}:host.material .select2-container--default.select2-container--open .select2-selection--multiple:after,:host.material .select2-container--default.select2-container--open .select2-selection--single:after,:host.material .select2-container--default .select2-focused .select2-selection--multiple:after,:host.material .select2-container--default .select2-focused .select2-selection--single:after{left:0;transition:width .3s cubic-bezier(.12,1,.77,1),left .3s cubic-bezier(.12,1,.77,1);width:100%}:host.material .select2-container--default .select2-dropdown{border:0;border-radius:0;box-shadow:0 5px 5px rgba(0,0,0,.5)}:host.material .select2-container--default .select2-results__option--highlighted[aria-selected],:host.material .select2-container--default .select2-results__option[aria-selected=true]{background:rgba(0,0,0,.04);background:var(--select2-material-option-selected-background,rgba(0,0,0,.04));color:#000;color:var(--select2-material-option-highlighted-text-color,#000)}:host.material .select2-container--default .select2-results__option[aria-selected=true]{color:#ff5722;color:var(--select2-material-option-selected-text-color,#ff5722)}:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple,:host.material .select2-container--default.select2-container--disabled .select2-selection--single{background:transparent}:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple:before,:host.material .select2-container--default.select2-container--disabled .select2-selection--single:before{background:linear-gradient(90deg,rgba(0,0,0,.26) 0,rgba(0,0,0,.26) 33%,transparent 0);background:var(--select2-material-underline-disabled,linear-gradient(90deg,rgba(0,0,0,.26) 0,rgba(0,0,0,.26) 33%,transparent 0));background-position:0 bottom;background-repeat:repeat-x;background-size:4px 1px}:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:after,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:before,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:after,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:before{background:red;background:var(--select2-material-underline-invalid,red)}:host.material:not(.select2-container--open) .select2-focused .select2-selection--multiple,:host.material:not(.select2-container--open) .select2-focused .select2-selection--single{border:0}:host.material .select2-subscript-wrapper{color:#888;color:var(--select2-hint-text-color,#888);font-size:75%;position:absolute;top:calc(100% - 1.72917em)}::ng-deep .select2-overlay-backdrop{background:rgba(0,0,0,.32);background:var(--select2-overlay-backdrop,transparent)}@supports (-moz-appearance:none){select2.material .select2-container--default .select2-selection--multiple,select2.material .select2-container--default .select2-selection--single{height:26px}}@supports (-ms-scroll-limit:0){select2.material .select2-container--default .select2-selection--multiple,select2.material .select2-container--default .select2-selection--single{height:25px}}"]
1083
- }] }
1084
- ];
1085
- /** @nocollapse */
1086
- Select2.ctorParameters = () => [
1087
- { type: ViewportRuler },
1088
- { type: ChangeDetectorRef },
1089
- { type: NgForm, decorators: [{ type: Optional }] },
1090
- { type: FormGroupDirective, decorators: [{ type: Optional }] },
1091
- { type: NgControl, decorators: [{ type: Self }, { type: Optional }] },
1092
- { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] }
1093
- ];
1094
- Select2.propDecorators = {
1095
- data: [{ type: Input }],
1096
- minCharForSearch: [{ type: Input }],
1097
- displaySearchStatus: [{ type: Input }],
1098
- placeholder: [{ type: Input }],
1099
- customSearchEnabled: [{ type: Input }],
1100
- limitSelection: [{ type: Input }],
1101
- listPosition: [{ type: Input }],
1102
- multiple: [{ type: Input }],
1103
- overlay: [{ type: Input }],
1104
- styleMode: [{ type: Input }],
1105
- noResultMessage: [{ type: Input }],
1106
- infiniteScrollDistance: [{ type: Input }],
1107
- infiniteScrollThrottle: [{ type: Input }],
1108
- infiniteScroll: [{ type: Input }],
1109
- editPattern: [{ type: Input }],
1110
- templates: [{ type: Input }],
1111
- resultMaxHeight: [{ type: Input }],
1112
- update: [{ type: Output }],
1113
- open: [{ type: Output }],
1114
- close: [{ type: Output }],
1115
- focus: [{ type: Output }],
1116
- blur: [{ type: Output }],
1117
- search: [{ type: Output }],
1118
- scroll: [{ type: Output }],
1119
- removeOption: [{ type: Output }],
1120
- minCountForSearch: [{ type: Input }],
1121
- id: [{ type: Input }, { type: HostBinding, args: ['id',] }],
1122
- required: [{ type: Input }],
1123
- disabled: [{ type: Input }],
1124
- hideSelectedItems: [{ type: Input }],
1125
- readonly: [{ type: Input }],
1126
- value: [{ type: Input }],
1127
- tabIndex: [{ type: Input }],
1128
- resettable: [{ type: Input }],
1129
- ariaInvalid: [{ type: HostBinding, args: ['attr.aria-invalid',] }],
1130
- classMaterial: [{ type: HostBinding, args: ['class.material',] }],
1131
- classNostyle: [{ type: HostBinding, args: ['class.nostyle',] }],
1132
- select2above: [{ type: HostBinding, args: ['class.select2-above',] }],
1133
- selection: [{ type: ViewChild, args: ['selection', { static: true },] }],
1134
- resultContainer: [{ type: ViewChild, args: ['results',] }],
1135
- results: [{ type: ViewChildren, args: ['result',] }],
1136
- searchInput: [{ type: ViewChild, args: ['searchInput',] }]
1137
- };
1138
- if (false) {
1139
- /**
1140
- * data of options & optiongrps
1141
- * @type {?}
1142
- */
1143
- Select2.prototype.data;
1144
- /** @type {?} */
1145
- Select2.prototype.minCharForSearch;
1146
- /** @type {?} */
1147
- Select2.prototype.displaySearchStatus;
1148
- /** @type {?} */
1149
- Select2.prototype.placeholder;
1150
- /** @type {?} */
1151
- Select2.prototype.customSearchEnabled;
1152
- /** @type {?} */
1153
- Select2.prototype.limitSelection;
1154
- /** @type {?} */
1155
- Select2.prototype.listPosition;
1156
- /**
1157
- * use the material style
1158
- * @type {?}
1159
- */
1160
- Select2.prototype.styleMode;
1161
- /**
1162
- * message when no result
1163
- * @type {?}
1164
- */
1165
- Select2.prototype.noResultMessage;
1166
- /**
1167
- * infinite scroll distance
1168
- * @type {?}
1169
- */
1170
- Select2.prototype.infiniteScrollDistance;
1171
- /**
1172
- * infinite scroll distance
1173
- * @type {?}
1174
- */
1175
- Select2.prototype.infiniteScrollThrottle;
1176
- /**
1177
- * use it for change the pattern of the filter search
1178
- * @type {?}
1179
- */
1180
- Select2.prototype.editPattern;
1181
- /**
1182
- * template for formating
1183
- * @type {?}
1184
- */
1185
- Select2.prototype.templates;
1186
- /**
1187
- * the max height of the results container when opening the select
1188
- * @type {?}
1189
- */
1190
- Select2.prototype.resultMaxHeight;
1191
- /** @type {?} */
1192
- Select2.prototype.update;
1193
- /** @type {?} */
1194
- Select2.prototype.open;
1195
- /** @type {?} */
1196
- Select2.prototype.close;
1197
- /** @type {?} */
1198
- Select2.prototype.focus;
1199
- /** @type {?} */
1200
- Select2.prototype.blur;
1201
- /** @type {?} */
1202
- Select2.prototype.search;
1203
- /** @type {?} */
1204
- Select2.prototype.scroll;
1205
- /** @type {?} */
1206
- Select2.prototype.removeOption;
1207
- /** @type {?} */
1208
- Select2.prototype.option;
1209
- /** @type {?} */
1210
- Select2.prototype.isOpen;
1211
- /** @type {?} */
1212
- Select2.prototype.searchStyle;
1213
- /**
1214
- * Whether the element is focused or not.
1215
- * @type {?}
1216
- */
1217
- Select2.prototype.focused;
1218
- /** @type {?} */
1219
- Select2.prototype.filteredData;
1220
- /** @type {?} */
1221
- Select2.prototype.overlayWidth;
1222
- /** @type {?} */
1223
- Select2.prototype._triggerRect;
1224
- /**
1225
- * @type {?}
1226
- * @private
1227
- */
1228
- Select2.prototype._minCountForSearch;
1229
- /**
1230
- * @type {?}
1231
- * @private
1232
- */
1233
- Select2.prototype.selection;
1234
- /**
1235
- * @type {?}
1236
- * @private
1237
- */
1238
- Select2.prototype.resultContainer;
1239
- /**
1240
- * @type {?}
1241
- * @private
1242
- */
1243
- Select2.prototype.results;
1244
- /**
1245
- * @type {?}
1246
- * @private
1247
- */
1248
- Select2.prototype.searchInput;
1249
- /**
1250
- * @type {?}
1251
- * @private
1252
- */
1253
- Select2.prototype.hoveringValue;
1254
- /**
1255
- * @type {?}
1256
- * @private
1257
- */
1258
- Select2.prototype.innerSearchText;
1259
- /**
1260
- * @type {?}
1261
- * @private
1262
- */
1263
- Select2.prototype.isSearchboxHidden;
1264
- /**
1265
- * @type {?}
1266
- * @private
1267
- */
1268
- Select2.prototype.selectionElement;
1269
- /**
1270
- * @type {?}
1271
- * @private
1272
- */
1273
- Select2.prototype._stateChanges;
1274
- /**
1275
- * Tab index for the element.
1276
- * @type {?}
1277
- * @private
1278
- */
1279
- Select2.prototype._tabIndex;
1280
- /**
1281
- * @type {?}
1282
- * @private
1283
- */
1284
- Select2.prototype._disabled;
1285
- /**
1286
- * @type {?}
1287
- * @private
1288
- */
1289
- Select2.prototype._required;
1290
- /**
1291
- * @type {?}
1292
- * @private
1293
- */
1294
- Select2.prototype._readonly;
1295
- /**
1296
- * @type {?}
1297
- * @private
1298
- */
1299
- Select2.prototype._multiple;
1300
- /**
1301
- * @type {?}
1302
- * @private
1303
- */
1304
- Select2.prototype._overlay;
1305
- /**
1306
- * @type {?}
1307
- * @private
1308
- */
1309
- Select2.prototype._resettable;
1310
- /**
1311
- * @type {?}
1312
- * @private
1313
- */
1314
- Select2.prototype._hideSelectedItems;
1315
- /**
1316
- * @type {?}
1317
- * @private
1318
- */
1319
- Select2.prototype._clickDetection;
1320
- /**
1321
- * @type {?}
1322
- * @private
1323
- */
1324
- Select2.prototype._clickDetectionFc;
1325
- /**
1326
- * @type {?}
1327
- * @private
1328
- */
1329
- Select2.prototype._id;
1330
- /**
1331
- * @type {?}
1332
- * @private
1333
- */
1334
- Select2.prototype._uid;
1335
- /**
1336
- * @type {?}
1337
- * @private
1338
- */
1339
- Select2.prototype._value;
1340
- /**
1341
- * @type {?}
1342
- * @private
1343
- */
1344
- Select2.prototype._previousNativeValue;
1345
- /**
1346
- * @type {?}
1347
- * @private
1348
- */
1349
- Select2.prototype._infiniteScroll;
1350
- /**
1351
- * View -> model callback called when select has been touched
1352
- * @type {?}
1353
- * @private
1354
- */
1355
- Select2.prototype._onTouched;
1356
- /**
1357
- * View -> model callback called when value changes
1358
- * @type {?}
1359
- * @private
1360
- */
1361
- Select2.prototype._onChange;
1362
- /**
1363
- * @type {?}
1364
- * @protected
1365
- */
1366
- Select2.prototype._viewportRuler;
1367
- /**
1368
- * @type {?}
1369
- * @private
1370
- */
1371
- Select2.prototype._changeDetectorRef;
1372
- /**
1373
- * @type {?}
1374
- * @private
1375
- */
1376
- Select2.prototype._parentForm;
1377
- /**
1378
- * @type {?}
1379
- * @private
1380
- */
1381
- Select2.prototype._parentFormGroup;
1382
- /** @type {?} */
1383
- Select2.prototype._control;
1384
- }
1385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Mi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovcGl0Y2gvbmctc2VsZWN0Mi9wcm9qZWN0cy9uZy1zZWxlY3QyLWNvbXBvbmVudC9zcmMvIiwic291cmNlcyI6WyJsaWIvc2VsZWN0Mi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdkQsT0FBTyxFQUNZLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQVcsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQ3pGLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxHQUN2RSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUsxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0lBRTNDLFlBQVksR0FBRyxDQUFDOztNQUVkLHVCQUF1QixHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7QUFPL0QsTUFBTSxPQUFPLE9BQU87Ozs7Ozs7OztJQXlOaEIsWUFDYyxjQUE2QixFQUMvQixrQkFBcUMsRUFDekIsV0FBbUIsRUFDbkIsZ0JBQW9DLEVBQzdCLFFBQW1CLEVBQ3ZCLFFBQWdCO1FBTDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQy9CLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBbUI7UUFDekIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFvQjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FB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QzFCLDRCQUEwQjs7Ozs7SUFDMUIsNEJBQTBCOzs7OztJQUMxQiw0QkFBMEI7Ozs7O0lBQzFCLDJCQUF5Qjs7Ozs7SUFDekIsOEJBQTRCOzs7OztJQUM1QixxQ0FBbUM7Ozs7O0lBQ25DLGtDQUFnQzs7Ozs7SUFDaEMsb0NBQW1EOzs7OztJQUNuRCxzQkFBb0I7Ozs7O0lBQ3BCLHVCQUEyQzs7Ozs7SUFDM0MseUJBQW1DOzs7OztJQUNuQyx1Q0FBaUQ7Ozs7O0lBQ2pELGtDQUErQjs7Ozs7O0lBcUIvQiw2QkFFQzs7Ozs7O0lBR0QsNEJBRUM7Ozs7O0lBekJHLGlDQUF1Qzs7Ozs7SUFDdkMscUNBQTZDOzs7OztJQUM3Qyw4QkFBdUM7Ozs7O0lBQ3ZDLG1DQUF3RDs7SUFDeEQsMkJBQThDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmlld3BvcnRSdWxlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50UmVmLCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCwgQXR0cmlidXRlLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBEb0NoZWNrLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LFxuICAgIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgU2VsZiwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5nQ29udHJvbCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICcuL3NlbGVjdDItY29uc3QnO1xuaW1wb3J0IHtcbiAgICBTZWxlY3QyRGF0YSwgU2VsZWN0Mkdyb3VwLCBTZWxlY3QyT3B0aW9uLCBTZWxlY3QyUmVtb3ZlRXZlbnQsIFNlbGVjdDJTY3JvbGxFdmVudCwgU2VsZWN0MlNlYXJjaEV2ZW50LFxuICAgIFNlbGVjdDJVcGRhdGVFdmVudCwgU2VsZWN0MlVwZGF0ZVZhbHVlLCBTZWxlY3QyVmFsdWUsXG59IGZyb20gJy4vc2VsZWN0Mi1pbnRlcmZhY2VzJztcbmltcG9ydCB7IFNlbGVjdDJVdGlscyB9IGZyb20gJy4vc2VsZWN0Mi11dGlscyc7XG5cbmxldCBuZXh0VW5pcXVlSWQgPSAwO1xuXG5jb25zdCBkaXNwbGF5U2VhcmNoU3RhdHVzTGlzdCA9IFsnZGVmYXVsdCcsICdoaWRkZW4nLCAnYWx3YXlzJ107XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2VsZWN0MicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdDIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NlbGVjdDIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3QyIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95LCBEb0NoZWNrLCBBZnRlclZpZXdJbml0IHtcblxuICAgIC8qKiBkYXRhIG9mIG9wdGlvbnMgJiBvcHRpb25ncnBzICovXG4gICAgQElucHV0KCkgZGF0YSE6IFNlbGVjdDJEYXRhO1xuICAgIEBJbnB1dCgpIG1pbkNoYXJGb3JTZWFyY2ggPSAwO1xuICAgIEBJbnB1dCgpIGRpc3BsYXlTZWFyY2hTdGF0dXM6ICdkZWZhdWx0JyB8ICdoaWRkZW4nIHwgJ2Fsd2F5cyc7XG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICBASW5wdXQoKSBjdXN0b21TZWFyY2hFbmFibGVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGxpbWl0U2VsZWN0aW9uID0gMDtcbiAgICBASW5wdXQoKSBsaXN0UG9zaXRpb246ICdhYm92ZScgfCAnYmVsb3cnO1xuXG4gICAgQElucHV0KClcbiAgICBnZXQgbXVsdGlwbGUoKTogYW55IHsgcmV0dXJuIHRoaXMuX211bHRpcGxlOyB9XG4gICAgc2V0IG11bHRpcGxlKHZhbHVlOiBhbnkpIHsgdGhpcy5fbXVsdGlwbGUgPSB0aGlzLl9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB0aGlzLm5nT25Jbml0KCk7IH1cblxuICAgIC8qKiB1c2UgdGhlIG1hdGVyaWFsIHN0eWxlICovXG4gICAgQElucHV0KClcbiAgICBnZXQgb3ZlcmxheSgpOiBhbnkgeyByZXR1cm4gdGhpcy5fb3ZlcmxheTsgfVxuICAgIHNldCBvdmVybGF5KHZhbHVlOiBhbnkpIHsgdGhpcy5fb3ZlcmxheSA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH1cblxuICAgIC8qKiB1c2UgdGhlIG1hdGVyaWFsIHN0eWxlICovXG4gICAgQElucHV0KCkgc3R5bGVNb2RlOiAnbWF0ZXJpYWwnIHwgJ25vU3R5bGUnIHwgJ2RlZmF1bHQnID0gJ2RlZmF1bHQnO1xuXG4gICAgLyoqIG1lc3NhZ2Ugd2hlbiBubyByZXN1bHQgKi9cbiAgICBASW5wdXQoKSBub1Jlc3VsdE1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKiBpbmZpbml0ZSBzY3JvbGwgZGlzdGFuY2UgKi9cbiAgICBASW5wdXQoKSBpbmZpbml0ZVNjcm9sbERpc3RhbmNlID0gMS41O1xuXG4gICAgLyoqIGluZmluaXRlIHNjcm9sbCBkaXN0YW5jZSAqL1xuICAgIEBJbnB1dCgpIGluZmluaXRlU2Nyb2xsVGhyb3R0bGUgPSAxNTA7XG5cbiAgICAvKiogaW5maW5pdGUgc2Nyb2xsIGFjdGl2YXRlZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGluZmluaXRlU2Nyb2xsKCk6IGFueSB7IHJldHVybiB0aGlzLl9pbmZpbml0ZVNjcm9sbDsgfVxuICAgIHNldCBpbmZpbml0ZVNjcm9sbCh2YWx1ZTogYW55KSB7IHRoaXMuX2luZmluaXRlU2Nyb2xsID0gdGhpcy5fY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfVxuXG4gICAgLyoqIHVzZSBpdCBmb3IgY2hhbmdlIHRoZSBwYXR0ZXJuIG9mIHRoZSBmaWx0ZXIgc2VhcmNoICovXG4gICAgQElucHV0KCkgZWRpdFBhdHRlcm46IChzdHI6IHN0cmluZykgPT4gc3RyaW5nO1xuXG4gICAgLyoqIHRlbXBsYXRlIGZvciBmb3JtYXRpbmcgKi9cbiAgICBASW5wdXQoKSB0ZW1wbGF0ZXM6IChUZW1wbGF0ZVJlZjxhbnk+IHwgeyBba2V5OiBzdHJpbmddOiBUZW1wbGF0ZVJlZjxhbnk+IH0pO1xuXG5cbiAgICAvKiogdGhlIG1heCBoZWlnaHQgb2YgdGhlIHJlc3VsdHMgY29udGFpbmVyIHdoZW4gb3BlbmluZyB0aGUgc2VsZWN0ICovXG4gICAgQElucHV0KCkgcmVzdWx0TWF4SGVpZ2h0ID0gJzIwMHB4JztcblxuICAgIEBPdXRwdXQoKSB1cGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdDJVcGRhdGVFdmVudDxTZWxlY3QyVXBkYXRlVmFsdWU+PigpO1xuICAgIEBPdXRwdXQoKSBvcGVuID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyPigpO1xuICAgIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdDI+KCk7XG4gICAgQE91dHB1dCgpIGJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdDI+KCk7XG4gICAgQE91dHB1dCgpIHNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlNlYXJjaEV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG4gICAgQE91dHB1dCgpIHNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlNjcm9sbEV2ZW50PigpO1xuICAgIEBPdXRwdXQoKSByZW1vdmVPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdDJSZW1vdmVFdmVudDxTZWxlY3QyVXBkYXRlVmFsdWU+PigpO1xuXG4gICAgb3B0aW9uOiBTZWxlY3QyT3B0aW9uIHwgU2VsZWN0Mk9wdGlvbltdIHwgbnVsbCA9IG51bGw7XG4gICAgaXNPcGVuID0gZmFsc2U7XG4gICAgc2VhcmNoU3R5bGU6IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIGZvY3VzZWQgb3Igbm90LiAqL1xuICAgIGZvY3VzZWQgPSBmYWxzZTtcblxuICAgIGZpbHRlcmVkRGF0YTogU2VsZWN0MkRhdGE7XG5cbiAgICBnZXQgc2VsZWN0Mk9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gdGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbltdIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0Mk9wdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyBudWxsIDogdGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgc2VhcmNoVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJTZWFyY2hUZXh0O1xuICAgIH1cblxuICAgIHNldCBzZWFyY2hUZXh0KHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21TZWFyY2hFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5lbWl0KHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbHVlLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogdGV4dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbm5lclNlYXJjaFRleHQgPSB0ZXh0O1xuICAgIH1cblxuICAgIC8qKiBtaW5pbWFsIGRhdGEgb2Ygc2hvdyB0aGUgc2VhcmNoIGZpZWxkICovXG4gICAgQElucHV0KClcbiAgICBnZXQgbWluQ291bnRGb3JTZWFyY2goKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbkNvdW50Rm9yU2VhcmNoO1xuICAgIH1cblxuICAgIHNldCBtaW5Db3VudEZvclNlYXJjaCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21pbkNvdW50Rm9yU2VhcmNoID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlU2VhcmNoQm94KCk7XG4gICAgfVxuXG4gICAgLyoqIFVuaXF1ZSBpZCBvZiB0aGUgZWxlbWVudC4gKi9cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnaWQnKVxuICAgIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMuX2lkOyB9XG4gICAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5faWQgPSB2YWx1ZSB8fCB0aGlzLl91aWQ7IH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIHJlcXVpcmVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHJlcXVpcmVkKCkgeyByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7IH1cbiAgICBzZXQgcmVxdWlyZWQodmFsdWU6IGFueSkgeyB0aGlzLl9yZXF1aXJlZCA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH1cblxuICAgIC8qKiBXaGV0aGVyIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgQElucHV0KClcbiAgICBnZXQgZGlzYWJsZWQoKSB7IHJldHVybiB0aGlzLl9jb250cm9sID8gdGhpcy5fY29udHJvbC5kaXNhYmxlZCA6IHRoaXMuX2Rpc2FibGVkOyB9XG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBhbnkpIHsgdGhpcy5fZGlzYWJsZWQgPSB0aGlzLl9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9XG5cbiAgICAvKiogV2hldGhlciBpdGVtcyBhcmUgaGlkZGVuIHdoZW4gaGFzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGhpZGVTZWxlY3RlZEl0ZW1zKCkgeyByZXR1cm4gdGhpcy5faGlkZVNlbGVjdGVkSXRlbXM7IH1cbiAgICBzZXQgaGlkZVNlbGVjdGVkSXRlbXModmFsdWU6IGFueSkgeyB0aGlzLl9oaWRlU2VsZWN0ZWRJdGVtcyA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH1cblxuICAgIC8qKiBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIHJlYWRvbmx5LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHJlYWRvbmx5KCkgeyByZXR1cm4gdGhpcy5fcmVhZG9ubHk7IH1cbiAgICBzZXQgcmVhZG9ubHkodmFsdWU6IGFueSkgeyB0aGlzLl9yZWFkb25seSA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH1cblxuICAgIC8qKiBUaGUgaW5wdXQgZWxlbWVudCdzIHZhbHVlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBTZWxlY3QyVXBkYXRlVmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMudGVzdFZhbHVlQ2hhbmdlKHRoaXMuX3ZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUYWIgaW5kZXggZm9yIHRoZSBzZWxlY3QyIGVsZW1lbnQuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgdGFiSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAtMSA6IHRoaXMuX3RhYkluZGV4O1xuICAgIH1cblxuICAgIHNldCB0YWJJbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl90YWJJbmRleCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIHJlc2V0IHdpdGggbm8gc2VsZWN0ZWQgdmFsdWUgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCByZXNldHRhYmxlKCkgeyByZXR1cm4gdGhpcy5fcmVzZXR0YWJsZTsgfVxuICAgIHNldCByZXNldHRhYmxlKHZhbHVlOiBhbnkpIHsgdGhpcy5fcmVzZXR0YWJsZSA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWludmFsaWQnKVxuICAgIGdldCBhcmlhSW52YWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRXJyb3JTdGF0ZSgpO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWF0ZXJpYWwnKVxuICAgIGdldCBjbGFzc01hdGVyaWFsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZU1vZGUgPT09ICdtYXRlcmlhbCc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ub3N0eWxlJylcbiAgICBnZXQgY2xhc3NOb3N0eWxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZU1vZGUgPT09ICdub1N0eWxlJztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNlbGVjdDItYWJvdmUnKVxuICAgIGdldCBzZWxlY3QyYWJvdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RQb3NpdGlvbiA9PT0gJ2Fib3ZlJztcbiAgICB9XG5cbiAgICBvdmVybGF5V2lkdGg6IG51bWJlcjtcbiAgICBfdHJpZ2dlclJlY3Q6IENsaWVudFJlY3Q7XG5cbiAgICBwcml2YXRlIF9taW5Db3VudEZvclNlYXJjaD86IG51bWJlciB8IHN0cmluZztcblxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdGlvbicsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgc2VsZWN0aW9uOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ3Jlc3VsdHMnKSBwcml2YXRlIHJlc3VsdENvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkcmVuKCdyZXN1bHQnKSBwcml2YXRlIHJlc3VsdHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgICBwcml2YXRlIGhvdmVyaW5nVmFsdWU6IFNlbGVjdDJWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAgIHByaXZhdGUgaW5uZXJTZWFyY2hUZXh0ID0gJyc7XG4gICAgcHJpdmF0ZSBpc1NlYXJjaGJveEhpZGRlbjogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgc2VsZWN0aW9uRWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICBwcml2YXRlIGdldCByZXN1bHRzRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3N0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogVGFiIGluZGV4IGZvciB0aGUgZWxlbWVudC4gKi9cbiAgICBwcml2YXRlIF90YWJJbmRleDogbnVtYmVyO1xuXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3JlYWRvbmx5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbXVsdGlwbGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9vdmVybGF5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfcmVzZXR0YWJsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2hpZGVTZWxlY3RlZEl0ZW1zID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY2xpY2tEZXRlY3Rpb24gPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jbGlja0RldGVjdGlvbkZjOiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIF9pZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX3VpZCA9IGBzZWxlY3QyLSR7bmV4dFVuaXF1ZUlkKyt9YDtcbiAgICBwcml2YXRlIF92YWx1ZTogU2VsZWN0MlVwZGF0ZVZhbHVlO1xuICAgIHByaXZhdGUgX3ByZXZpb3VzTmF0aXZlVmFsdWU6IFNlbGVjdDJVcGRhdGVWYWx1ZTtcbiAgICBwcml2YXRlIF9pbmZpbml0ZVNjcm9sbCA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIF92aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxuICAgICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICAgICAgIEBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIF9jb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3RhYmluZGV4JykgdGFiSW5kZXg6IHN0cmluZ1xuICAgICkge1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5pZDtcbiAgICAgICAgdGhpcy5fdGFiSW5kZXggPSBwYXJzZUludCh0YWJJbmRleCwgMTApIHx8IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbGlja0RldGVjdGlvbkZjID0gdGhpcy5jbGlja0RldGVjdGlvbi5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHNlbGVjdCBoYXMgYmVlbiB0b3VjaGVkICovXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLyoqIFZpZXcgLT4gbW9kZWwgY2FsbGJhY2sgY2FsbGVkIHdoZW4gdmFsdWUgY2hhbmdlcyAqL1xuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLl92aWV3cG9ydFJ1bGVyLmNoYW5nZSgxMDApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJSZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IFNlbGVjdDJVdGlscy5nZXRPcHRpb25zQnlWYWx1ZShcbiAgICAgICAgICAgIHRoaXMuZGF0YSxcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLnZhbHVlIDogdGhpcy52YWx1ZSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG9wdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJpbmdWYWx1ZSA9IHRoaXMudmFsdWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU2VhcmNoQm94KCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkVsZW1lbnQgPSB0aGlzLnNlbGVjdGlvbi5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnRyaWdnZXJSZWN0KCk7XG4gICAgfVxuXG4gICAgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVNlYXJjaEJveCgpO1xuICAgICAgICB0aGlzLl9kaXJ0eUNoZWNrTmF0aXZlVmFsdWUoKTtcbiAgICAgICAgaWYgKHRoaXMuX3RyaWdnZXJSZWN0ICYmIHRoaXMub3ZlcmxheVdpZHRoICE9PSB0aGlzLl90cmlnZ2VyUmVjdC53aWR0aCkge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5V2lkdGggPSB0aGlzLl90cmlnZ2VyUmVjdC53aWR0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrRGV0ZWN0aW9uRmMpO1xuICAgIH1cblxuICAgIHVwZGF0ZVNlYXJjaEJveCgpIHtcbiAgICAgICAgY29uc3QgaGlkZGVuID0gdGhpcy5jdXN0b21TZWFyY2hFbmFibGVkXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IFNlbGVjdDJVdGlscy5pc1NlYXJjaGJveEhpZGRleCh0aGlzLmRhdGEsIHRoaXMuX21pbkNvdW50Rm9yU2VhcmNoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWFyY2hib3hIaWRkZW4gIT09IGhpZGRlbikge1xuICAgICAgICAgICAgdGhpcy5pc1NlYXJjaGJveEhpZGRlbiA9IGhpZGRlbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhpZGVTZWFyY2goKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlTZWFyY2hTdGF0dXMgPSBkaXNwbGF5U2VhcmNoU3RhdHVzTGlzdC5pbmRleE9mKHRoaXMuZGlzcGxheVNlYXJjaFN0YXR1cykgPiAtMVxuICAgICAgICAgICAgPyB0aGlzLmRpc3BsYXlTZWFyY2hTdGF0dXNcbiAgICAgICAgICAgIDogJ2RlZmF1bHQnO1xuICAgICAgICByZXR1cm4gKGRpc3BsYXlTZWFyY2hTdGF0dXMgPT09ICdkZWZhdWx0JyAmJiB0aGlzLmlzU2VhcmNoYm94SGlkZGVuKSB8fCBkaXNwbGF5U2VhcmNoU3RhdHVzID09PSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBnZXRPcHRpb25TdHlsZShvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgcmV0dXJuICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbiAnICtcbiAgICAgICAgICAgIChvcHRpb24uaGlkZSA/ICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbi0taGlkZSAnIDogJycpICtcbiAgICAgICAgICAgIChvcHRpb24udmFsdWUgPT09IHRoaXMuaG92ZXJpbmdWYWx1ZSA/ICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbi0taGlnaGxpZ2h0ZWQgJyA6ICcnKSArXG4gICAgICAgICAgICAob3B0aW9uLmNsYXNzZXMgfHwgJycpO1xuICAgIH1cblxuICAgIG1vdXNlZW50ZXIob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nVmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGljayhvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMudGVzdFNlbGVjdGlvbihvcHRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdChvcHRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXQoZTogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLnNlbGVjdChudWxsKTtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJldkNoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlT3BlbkFuZENsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZvY3VzKHRydWUpO1xuICAgICAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcblxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlY3QoKTtcbiAgICAgICAgICAgIHRoaXMuaW5uZXJTZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNTZWFyY2hib3hPclJlc3VsdHNFbGVtZW50KCk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb246IFNlbGVjdDJPcHRpb24gPSB0aGlzLm9wdGlvbiBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5vcHRpb25bMF0gOiB0aGlzLm9wdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxGcm9tT3B0aW9uKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vcGVuLmVtaXQodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc09wZW4gJiYgIXRoaXMuX2NsaWNrRGV0ZWN0aW9uKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrRGV0ZWN0aW9uRmMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0RldGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGhhc1RlbXBsYXRlKG9wdGlvbjogKFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyR3JvdXApLCBkZWZhdXQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZXMgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZlxuICAgICAgICAgICAgfHwgdGhpcy50ZW1wbGF0ZXMgJiYgdGhpcy50ZW1wbGF0ZXNbb3B0aW9uLnRlbXBsYXRlSWRdIGluc3RhbmNlb2YgVGVtcGxhdGVSZWZcbiAgICAgICAgICAgIHx8IHRoaXMudGVtcGxhdGVzICYmIHRoaXMudGVtcGxhdGVzW2RlZmF1dF0gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbiAgICB9XG5cbiAgICBnZXRUZW1wbGF0ZShvcHRpb246IChTZWxlY3QyT3B0aW9uIHwgU2VsZWN0Mkdyb3VwKSwgZGVmYXV0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVGVtcGxhdGUob3B0aW9uLCBkZWZhdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZXNbb3B0aW9uLnRlbXBsYXRlSWRdXG4gICAgICAgICAgICAgICAgfHwgdGhpcy50ZW1wbGF0ZXNbZGVmYXV0XVxuICAgICAgICAgICAgICAgIHx8IHRoaXMudGVtcGxhdGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdHJpZ2dlclJlY3QoKSB7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJSZWN0ID0gdGhpcy5zZWxlY3Rpb25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGVzdFNlbGVjdGlvbihvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKG9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMubXVsdGlwbGUgfHxcbiAgICAgICAgICAgICF0aGlzLmxpbWl0U2VsZWN0aW9uIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSAmJiB0aGlzLl92YWx1ZS5sZW5ndGggPCB0aGlzLmxpbWl0U2VsZWN0aW9uXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGVzdFZhbHVlQ2hhbmdlKHZhbHVlMTogU2VsZWN0MlVwZGF0ZVZhbHVlLCB2YWx1ZTI6IFNlbGVjdDJVcGRhdGVWYWx1ZSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodmFsdWUxID09PSBudWxsIHx8IHZhbHVlMSA9PT0gdW5kZWZpbmVkKSAmJiAodmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdW5kZWZpbmVkKSB8fFxuICAgICAgICAgICAgdmFsdWUxID09PSB2YWx1ZTJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGVcbiAgICAgICAgICAgICYmIHZhbHVlMSAmJiAodmFsdWUxIGFzIFNlbGVjdDJWYWx1ZVtdKS5sZW5ndGhcbiAgICAgICAgICAgICYmIHZhbHVlMiAmJiAodmFsdWUyIGFzIFNlbGVjdDJWYWx1ZVtdKS5sZW5ndGhcbiAgICAgICAgICAgICYmICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pLmxlbmd0aCA9PT0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlMSBvZiAodmFsdWUxIGFzIFNlbGVjdDJWYWx1ZVtdKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3QgPSAodmFsdWUyIGFzIFNlbGVjdDJWYWx1ZVtdKS5pbmRleE9mKGUxKSA+IC0xO1xuICAgICAgICAgICAgICAgIGlmICghdGVzdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJlZERhdGEoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZGF0YTtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuaGlkZVNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBTZWxlY3QyVXRpbHMuZ2V0RmlsdGVyZWRTZWxlY3RlZERhdGEocmVzdWx0LCB0aGlzLm9wdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5jdXN0b21TZWFyY2hFbmFibGVkICYmIHRoaXMuc2VhcmNoVGV4dCAmJiB0aGlzLnNlYXJjaFRleHQubGVuZ3RoID49ICt0aGlzLm1pbkNoYXJGb3JTZWFyY2gpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBTZWxlY3QyVXRpbHMuZ2V0RmlsdGVyZWREYXRhKHJlc3VsdCwgdGhpcy5zZWFyY2hUZXh0LCB0aGlzLmVkaXRQYXR0ZXJuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFNlbGVjdDJVdGlscy52YWx1ZUlzTm90SW5GaWx0ZXJlZERhdGEocmVzdWx0LCB0aGlzLmhvdmVyaW5nVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3ZlcmluZ1ZhbHVlID0gU2VsZWN0MlV0aWxzLmdldEZpcnN0QXZhaWxhYmxlT3B0aW9uKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gcmVzdWx0O1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xpY2tEZXRlY3Rpb24oZTogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuaWZQYXJlbnRDb250YWluc0NsYXNzKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCAnc2VsZWN0aW9uJykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiAhdGhpcy5pZlBhcmVudENvbnRhaW5zQ2xhc3MoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQsICdzZWxlY3QyLWRyb3Bkb3duJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5BbmRDbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmlmUGFyZW50Q29udGFpbnNJZChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5faWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja0V4aXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzT3BlbiAmJiAhdGhpcy5pZlBhcmVudENvbnRhaW5zSWQoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuX2lkKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tFeGl0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNsaWNrRXhpdCgpIHtcbiAgICAgICAgdGhpcy5fZm9jdXMoZmFsc2UpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrRGV0ZWN0aW9uRmMpO1xuICAgICAgICB0aGlzLl9jbGlja0RldGVjdGlvbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaWZQYXJlbnRDb250YWluc0NsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjc3NDbGFzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmVudEVsZW1lbnRCeUNsYXNzKGVsZW1lbnQsIGNzc0NsYXNzKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlmUGFyZW50Q29udGFpbnNJZChlbGVtZW50OiBIVE1MRWxlbWVudCwgaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJlbnRFbGVtZW50QnlJZChlbGVtZW50LCBpZCkgIT09IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQYXJlbnRFbGVtZW50QnlDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY3NzQ2xhc3M6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5DbGFzc2VzKGVsZW1lbnQsIGNzc0NsYXNzLnRyaW0oKS5zcGxpdCgvXFxzKy8pKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgICAgICAgPyB0aGlzLmdldFBhcmVudEVsZW1lbnRCeUNsYXNzKGVsZW1lbnQucGFyZW50RWxlbWVudCwgY3NzQ2xhc3MpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQYXJlbnRFbGVtZW50QnlJZChlbGVtZW50OiBIVE1MRWxlbWVudCwgaWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGlmIChlbGVtZW50LmlkID09PSBpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgICAgICAgPyB0aGlzLmdldFBhcmVudEVsZW1lbnRCeUlkKGVsZW1lbnQucGFyZW50RWxlbWVudCwgaWQpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb250YWluQ2xhc3NlcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY3NzQ2xhc3Nlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY3NzQ2xhc3Mgb2YgY3NzQ2xhc3Nlcykge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjc3NDbGFzcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9jdXNpbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mb2N1cyh0cnVlKTtcbiAgICB9XG5cbiAgICBmb2N1c291dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRWxlbWVudCAmJiAhdGhpcy5zZWxlY3Rpb25FbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0Mi1mb2N1c2VkJykpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtb3ZlVXAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihTZWxlY3QyVXRpbHMuZ2V0UHJldmlvdXNPcHRpb24odGhpcy5maWx0ZXJlZERhdGEsIHRoaXMuaG92ZXJpbmdWYWx1ZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZURvd24oKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihTZWxlY3QyVXRpbHMuZ2V0TmV4dE9wdGlvbih0aGlzLmZpbHRlcmVkRGF0YSwgdGhpcy5ob3ZlcmluZ1ZhbHVlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxGcm9tT3B0aW9uKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nVmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gdGhpcy5yZXN1bHRzLmZpbmQociA9PiByLm5hdGl2ZUVsZW1lbnQuaW5uZXJUZXh0LnRyaW0oKSA9PT0gb3B0aW9uLmxhYmVsKTtcbiAgICAgICAgICAgIGlmIChkb21FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RDbGllbnRSZWN0ID0gdGhpcy5yZXN1bHRzRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25DbGllbnRSZWN0ID0gZG9tRWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c0VsZW1lbnQuc2Nyb2xsVG9wID0gb3B0aW9uQ2xpZW50UmVjdC50b3AgLSBsaXN0Q2xpZW50UmVjdC50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEJ5RW50ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmhvdmVyaW5nVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IFNlbGVjdDJVdGlscy5nZXRPcHRpb25CeVZhbHVlKHRoaXMuZGF0YSwgdGhpcy5ob3ZlcmluZ1ZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KG9wdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3Qob3B0aW9uOiBTZWxlY3QyT3B0aW9uIHwgbnVsbCkge1xuICAgICAgICBsZXQgdmFsdWU6IGFueTtcbiAgICAgICAgaWYgKG9wdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbltdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3AgPT4gb3AudmFsdWUgPT09IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gKHRoaXMub3B0aW9uIGFzIFNlbGVjdDJPcHRpb25bXSkubWFwKG9wID0+IG9wLnZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb24gPSBvcHRpb247XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLm9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuaGlkZVNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlLmVtaXQoe1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6ICh0aGlzLm9wdGlvbiA/IFt0aGlzLm9wdGlvbl0gOiBudWxsKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBrZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Rlc3RLZXkoZSwgWydBcnJvd0Rvd24nLCA0MF0pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVEb3duKCk7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGVzdEtleShlLCBbJ0Fycm93VXAnLCAzOF0pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVVcCgpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZSwgWydFbnRlcicsIDEzXSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QnlFbnRlcigpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZSwgWydFc2NhcGUnLCAnVGFiJywgOSwgMjddKSAmJiB0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9wZW5LZXkoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5fdGVzdEtleShlLCBbJ0Fycm93RG93bicsICdBcnJvd1VwJywgJ0VudGVyJywgNDAsIDM4LCAxM10pKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5BbmRDbG9zZSgpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZSwgWydFc2NhcGUnLCAnVGFiJywgOSwgMjddKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFja0J5KF9pbmRleDogbnVtYmVyLCBpdGVtOiBTZWxlY3QyT3B0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuXG4gICAgc2VhcmNoVXBkYXRlKGU6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEoKTtcbiAgICB9XG5cbiAgICBpc1NlbGVjdGVkKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICByZXR1cm4gU2VsZWN0MlV0aWxzLmlzU2VsZWN0ZWQodGhpcy5vcHRpb24sIG9wdGlvbiwgdGhpcy5tdWx0aXBsZSk7XG4gICAgfVxuXG4gICAgaXNEaXNhYmxlZChvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi5kaXNhYmxlZCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgcmVtb3ZlU2VsZWN0aW9uKGU6IE1vdXNlRXZlbnQsIG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBTZWxlY3QyVXRpbHMucmVtb3ZlU2VsZWN0aW9uKHRoaXMub3B0aW9uLCBvcHRpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuaGlkZVNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW10pLm1hcChvcCA9PiBvcC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZS5lbWl0KHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb24pID8gdGhpcy5vcHRpb24gOiAodGhpcy5vcHRpb24gPyBbdGhpcy5vcHRpb25dIDogbnVsbClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVtb3ZlT3B0aW9uLmVtaXQoe1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgcmVtb3ZlZE9wdGlvbjogb3B0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzU2VhcmNoYm94T3JSZXN1bHRzRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbW9kZWwgdmFsdWUuIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICovXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzZWxlY3QncyB2YWx1ZVxuICAgICAqIGNoYW5nZXMgZnJvbSB1c2VyIGlucHV0LiBQYXJ0IG9mIHRoZSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgICAgKiByZXF1aXJlZCB0byBpbnRlZ3JhdGUgd2l0aCBBbmd1bGFyJ3MgY29yZSBmb3JtcyBBUEkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc2VsZWN0IGlzIGJsdXJyZWRcbiAgICAgKiBieSB0aGUgdXNlci4gUGFydCBvZiB0aGUgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlIHJlcXVpcmVkXG4gICAgICogdG8gaW50ZWdyYXRlIHdpdGggQW5ndWxhcidzIGNvcmUgZm9ybXMgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gdG91Y2hlZC5cbiAgICAgKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgICogQHBhcmFtIGlzRGlzYWJsZWRcbiAgICAgKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgX2lzRXJyb3JTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbnZhbGlkID0gdGhpcy5fY29udHJvbCAmJiB0aGlzLl9jb250cm9sLmludmFsaWQ7XG4gICAgICAgIGNvbnN0IGlzVG91Y2hlZCA9IHRoaXMuX2NvbnRyb2wgJiYgdGhpcy5fY29udHJvbC50b3VjaGVkO1xuICAgICAgICBjb25zdCBpc1N1Ym1pdHRlZCA9ICh0aGlzLl9wYXJlbnRGb3JtR3JvdXAgJiYgdGhpcy5fcGFyZW50Rm9ybUdyb3VwLnN1Ym1pdHRlZCkgfHxcbiAgICAgICAgICAgICh0aGlzLl9wYXJlbnRGb3JtICYmIHRoaXMuX3BhcmVudEZvcm0uc3VibWl0dGVkKTtcblxuICAgICAgICByZXR1cm4gISEoaXNJbnZhbGlkICYmIChpc1RvdWNoZWQgfHwgaXNTdWJtaXR0ZWQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF90ZXN0S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCByZWZzOiAobnVtYmVyIHwgc3RyaW5nKVtdID0gW10pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzS2V5KHRoaXMuX2dldEtleShldmVudCksIHJlZnMpO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBfZ2V0S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICAgICAgbGV0IGNvZGU6IG51bWJlciB8IHN0cmluZztcblxuICAgICAgICBpZiAoZXZlbnQua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvZGUgPSBldmVudC5rZXk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRbJ2tleUlkZW50aWZpZXInXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb2RlID0gZXZlbnRbJ2tleUlkZW50aWZpZXInXTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudFsna2V5Q29kZSddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvZGUgPSBldmVudFsna2V5Q29kZSddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2lzS2V5KGNvZGU6IG51bWJlciB8IHN0cmluZywgcmVmczogKG51bWJlciB8IHN0cmluZylbXSA9IFtdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiByZWZzICYmIHJlZnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyByZWZzLmluZGV4T2YoY29kZSkgIT09IC0xXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNlbGVjdGVkIG9wdGlvbiBiYXNlZCBvbiBhIHZhbHVlLiBJZiBubyBvcHRpb24gY2FuIGJlXG4gICAgICogZm91bmQgd2l0aCB0aGUgZGVzaWduYXRlZCB2YWx1ZSwgdGhlIHNlbGVjdCB0cmlnZ2VyIGlzIGNsZWFyZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0U2VsZWN0aW9uQnlWYWx1ZSh2YWx1ZTogYW55IHwgYW55W10pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uIHx8ICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSkge1xuICAgICAgICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdmFsdWUgJiYgIWlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbiBhcnJheSB2YWx1ZS4nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb24gPSBbXTsgLy8gaWYgdmFsdWUgaXMgbnVsbCwgdGhlbiBlbXB0eSBvcHRpb24gYW5kIHJldHVyblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgbm90IG51bGwuIFByZXNlbGVjdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXM6IGFueSA9IFNlbGVjdDJVdGlscy5nZXRPcHRpb25zQnlWYWx1ZSh0aGlzLmRhdGEsIHZhbHVlLCB0aGlzLm11bHRpcGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0+IHRoaXMuc2VsZWN0KGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5kYXRhLCB2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY29udHJvbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wudmlld1RvTW9kZWxVcGRhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBEb2VzIHNvbWUgbWFudWFsIGRpcnR5IGNoZWNraW5nIG9uIHRoZSBuYXRpdmUgaW5wdXQgYHZhbHVlYCBwcm9wZXJ0eS4gKi9cbiAgICBwcml2YXRlIF9kaXJ0eUNoZWNrTmF0aXZlVmFsdWUoKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy52YWx1ZTtcblxuICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNOYXRpdmVWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBgJHt2YWx1ZX1gICE9PSAnZmFsc2UnO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2ZvY3VzU2VhcmNoYm94T3JSZXN1bHRzRWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VhcmNoYm94SGlkZGVuKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dCAmJiB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXN1bHRzRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c0VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2ZvY3VzKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghc3RhdGUgJiYgdGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBzdGF0ZTtcbiAgICAgICAgICAgIHRoaXMuYmx1ci5lbWl0KHRoaXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlICYmICF0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IHN0YXRlO1xuICAgICAgICAgICAgdGhpcy5mb2N1cy5lbWl0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TY3JvbGwod2F5OiAndXAnIHwgJ2Rvd24nKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsLmVtaXQoe1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgd2F5LFxuICAgICAgICAgICAgc2VhcmNoOiB0aGlzLmlubmVyU2VhcmNoVGV4dFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: lib/select2.component.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import { CdkConnectedOverlay, } from '@angular/cdk/overlay';
7
+ import { ViewportRuler } from '@angular/cdk/scrolling';
8
+ import { Attribute, ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, Optional, Output, Self, TemplateRef, ViewChild, ViewChildren, } from '@angular/core';
9
+ import { FormGroupDirective, NgControl, NgForm } from '@angular/forms';
10
+ import { Subject } from 'rxjs';
11
+ import { timeout } from './select2-const';
12
+ import { Select2Utils } from './select2-utils';
13
+ /** @type {?} */
14
+ let nextUniqueId = 0;
15
+ /** @type {?} */
16
+ const displaySearchStatusList = ['default', 'hidden', 'always'];
17
+ export class Select2 {
18
+ /**
19
+ * @param {?} _viewportRuler
20
+ * @param {?} _changeDetectorRef
21
+ * @param {?} _parentForm
22
+ * @param {?} _parentFormGroup
23
+ * @param {?} _control
24
+ * @param {?} tabIndex
25
+ */
26
+ constructor(_viewportRuler, _changeDetectorRef, _parentForm, _parentFormGroup, _control, tabIndex) {
27
+ this._viewportRuler = _viewportRuler;
28
+ this._changeDetectorRef = _changeDetectorRef;
29
+ this._parentForm = _parentForm;
30
+ this._parentFormGroup = _parentFormGroup;
31
+ this._control = _control;
32
+ this.minCharForSearch = 0;
33
+ this.limitSelection = 0;
34
+ this.listPosition = 'below';
35
+ /**
36
+ * use the material style
37
+ */
38
+ this.styleMode = 'default';
39
+ /**
40
+ * infinite scroll distance
41
+ */
42
+ this.infiniteScrollDistance = 1.5;
43
+ /**
44
+ * infinite scroll distance
45
+ */
46
+ this.infiniteScrollThrottle = 150;
47
+ /**
48
+ * the max height of the results container when opening the select
49
+ */
50
+ this.resultMaxHeight = '200px';
51
+ this.update = new EventEmitter();
52
+ this.open = new EventEmitter();
53
+ this.close = new EventEmitter();
54
+ this.focus = new EventEmitter();
55
+ this.blur = new EventEmitter();
56
+ this.search = new EventEmitter();
57
+ this.scroll = new EventEmitter();
58
+ this.removeOption = new EventEmitter();
59
+ this.option = null;
60
+ this.isOpen = false;
61
+ /**
62
+ * Whether the element is focused or not.
63
+ */
64
+ this.focused = false;
65
+ this.hoveringValue = null;
66
+ this.innerSearchText = '';
67
+ this._stateChanges = new Subject();
68
+ this._disabled = false;
69
+ this._required = false;
70
+ this._readonly = false;
71
+ this._multiple = false;
72
+ this._overlay = false;
73
+ this._resettable = false;
74
+ this._hideSelectedItems = false;
75
+ this._clickDetection = false;
76
+ this._uid = `select2-${nextUniqueId++}`;
77
+ this._infiniteScroll = true;
78
+ /**
79
+ * View -> model callback called when select has been touched
80
+ */
81
+ this._onTouched = (/**
82
+ * @return {?}
83
+ */
84
+ () => {
85
+ // do nothing
86
+ });
87
+ /**
88
+ * View -> model callback called when value changes
89
+ */
90
+ this._onChange = (/**
91
+ * @return {?}
92
+ */
93
+ () => {
94
+ // do nothing
95
+ });
96
+ this.id = this.id;
97
+ this._tabIndex = parseInt(tabIndex, 10) || 0;
98
+ if (this._control) {
99
+ this._control.valueAccessor = this;
100
+ }
101
+ this._clickDetectionFc = this.clickDetection.bind(this);
102
+ }
103
+ /**
104
+ * data of options & optiongrps
105
+ * @param {?} data
106
+ * @return {?}
107
+ */
108
+ set data(data) {
109
+ this._data = data;
110
+ this.updateFilteredData();
111
+ }
112
+ /**
113
+ * @return {?}
114
+ */
115
+ get multiple() {
116
+ return this._multiple;
117
+ }
118
+ /**
119
+ * @param {?} value
120
+ * @return {?}
121
+ */
122
+ set multiple(value) {
123
+ this._multiple = this._coerceBooleanProperty(value);
124
+ this.ngOnInit();
125
+ }
126
+ /**
127
+ * use the material style
128
+ * @return {?}
129
+ */
130
+ get overlay() {
131
+ return this._overlay;
132
+ }
133
+ /**
134
+ * @param {?} value
135
+ * @return {?}
136
+ */
137
+ set overlay(value) {
138
+ this._overlay = this._coerceBooleanProperty(value);
139
+ }
140
+ /**
141
+ * infinite scroll activated
142
+ * @return {?}
143
+ */
144
+ get infiniteScroll() {
145
+ return this._infiniteScroll;
146
+ }
147
+ /**
148
+ * @param {?} value
149
+ * @return {?}
150
+ */
151
+ set infiniteScroll(value) {
152
+ this._infiniteScroll = this._coerceBooleanProperty(value);
153
+ }
154
+ /**
155
+ * @return {?}
156
+ */
157
+ get select2Options() {
158
+ return this.multiple ? ((/** @type {?} */ (this.option))) : null;
159
+ }
160
+ /**
161
+ * @return {?}
162
+ */
163
+ get select2Option() {
164
+ return this.multiple ? null : ((/** @type {?} */ (this.option)));
165
+ }
166
+ /**
167
+ * @return {?}
168
+ */
169
+ get searchText() {
170
+ return this.innerSearchText;
171
+ }
172
+ /**
173
+ * @param {?} text
174
+ * @return {?}
175
+ */
176
+ set searchText(text) {
177
+ if (this.customSearchEnabled) {
178
+ this.search.emit({
179
+ component: this,
180
+ value: this._value,
181
+ search: text,
182
+ });
183
+ }
184
+ this.innerSearchText = text;
185
+ }
186
+ /**
187
+ * minimal data of show the search field
188
+ * @return {?}
189
+ */
190
+ get minCountForSearch() {
191
+ return this._minCountForSearch;
192
+ }
193
+ /**
194
+ * @param {?} value
195
+ * @return {?}
196
+ */
197
+ set minCountForSearch(value) {
198
+ this._minCountForSearch = value;
199
+ this.updateSearchBox();
200
+ }
201
+ /**
202
+ * Unique id of the element.
203
+ * @return {?}
204
+ */
205
+ get id() {
206
+ return this._id;
207
+ }
208
+ /**
209
+ * @param {?} value
210
+ * @return {?}
211
+ */
212
+ set id(value) {
213
+ this._id = value || this._uid;
214
+ }
215
+ /**
216
+ * Whether the element is required.
217
+ * @return {?}
218
+ */
219
+ get required() {
220
+ return this._required;
221
+ }
222
+ /**
223
+ * @param {?} value
224
+ * @return {?}
225
+ */
226
+ set required(value) {
227
+ this._required = this._coerceBooleanProperty(value);
228
+ }
229
+ /**
230
+ * Whether selected items should be hidden.
231
+ * @return {?}
232
+ */
233
+ get disabled() {
234
+ return this._control ? this._control.disabled : this._disabled;
235
+ }
236
+ /**
237
+ * @param {?} value
238
+ * @return {?}
239
+ */
240
+ set disabled(value) {
241
+ this._disabled = this._coerceBooleanProperty(value);
242
+ }
243
+ /**
244
+ * Whether items are hidden when has.
245
+ * @return {?}
246
+ */
247
+ get hideSelectedItems() {
248
+ return this._hideSelectedItems;
249
+ }
250
+ /**
251
+ * @param {?} value
252
+ * @return {?}
253
+ */
254
+ set hideSelectedItems(value) {
255
+ this._hideSelectedItems = this._coerceBooleanProperty(value);
256
+ }
257
+ /**
258
+ * Whether the element is readonly.
259
+ * @return {?}
260
+ */
261
+ get readonly() {
262
+ return this._readonly;
263
+ }
264
+ /**
265
+ * @param {?} value
266
+ * @return {?}
267
+ */
268
+ set readonly(value) {
269
+ this._readonly = this._coerceBooleanProperty(value);
270
+ }
271
+ /**
272
+ * The input element's value.
273
+ * @return {?}
274
+ */
275
+ get value() {
276
+ return this._value;
277
+ }
278
+ /**
279
+ * @param {?} value
280
+ * @return {?}
281
+ */
282
+ set value(value) {
283
+ if (this.testValueChange(this._value, value)) {
284
+ setTimeout((/**
285
+ * @return {?}
286
+ */
287
+ () => {
288
+ this._value = value;
289
+ this.writeValue(value);
290
+ }), 10);
291
+ }
292
+ }
293
+ /**
294
+ * Tab index for the select2 element.
295
+ * @return {?}
296
+ */
297
+ get tabIndex() {
298
+ return this.disabled ? -1 : this._tabIndex;
299
+ }
300
+ /**
301
+ * @param {?} value
302
+ * @return {?}
303
+ */
304
+ set tabIndex(value) {
305
+ if (typeof value !== 'undefined') {
306
+ this._tabIndex = value;
307
+ }
308
+ }
309
+ /**
310
+ * reset with no selected value
311
+ * @return {?}
312
+ */
313
+ get resettable() {
314
+ return this._resettable;
315
+ }
316
+ /**
317
+ * @param {?} value
318
+ * @return {?}
319
+ */
320
+ set resettable(value) {
321
+ this._resettable = this._coerceBooleanProperty(value);
322
+ }
323
+ /**
324
+ * @return {?}
325
+ */
326
+ get ariaInvalid() {
327
+ return this._isErrorState();
328
+ }
329
+ /**
330
+ * @return {?}
331
+ */
332
+ get classMaterial() {
333
+ return this.styleMode === 'material';
334
+ }
335
+ /**
336
+ * @return {?}
337
+ */
338
+ get classNostyle() {
339
+ return this.styleMode === 'noStyle';
340
+ }
341
+ /**
342
+ * @return {?}
343
+ */
344
+ get select2above() {
345
+ return !this.overlay ? this.listPosition === 'above' : this._isAbobeOverlay();
346
+ }
347
+ /**
348
+ * @return {?}
349
+ */
350
+ get _positions() {
351
+ if (this.listPosition === 'auto') {
352
+ [
353
+ {
354
+ originX: 'start',
355
+ originY: 'bottom',
356
+ overlayX: 'start',
357
+ overlayY: 'bottom',
358
+ },
359
+ {
360
+ originX: 'start',
361
+ originY: 'top',
362
+ overlayX: 'start',
363
+ overlayY: 'top',
364
+ },
365
+ ];
366
+ }
367
+ else {
368
+ return null;
369
+ }
370
+ }
371
+ /**
372
+ * @private
373
+ * @return {?}
374
+ */
375
+ get resultsElement() {
376
+ var _a;
377
+ return (_a = this.resultContainer) === null || _a === void 0 ? void 0 : _a.nativeElement;
378
+ }
379
+ /**
380
+ * @return {?}
381
+ */
382
+ ngOnInit() {
383
+ this._viewportRuler.change(100).subscribe((/**
384
+ * @return {?}
385
+ */
386
+ () => {
387
+ if (this.isOpen) {
388
+ this.triggerRect();
389
+ }
390
+ }));
391
+ /** @type {?} */
392
+ const option = Select2Utils.getOptionsByValue(this._data, this._control ? this._control.value : this.value, this.multiple);
393
+ if (option !== null) {
394
+ this.option = option;
395
+ }
396
+ if (!Array.isArray(option)) {
397
+ this.hoveringValue = (/** @type {?} */ (this.value));
398
+ }
399
+ this.updateSearchBox();
400
+ }
401
+ /**
402
+ * @return {?}
403
+ */
404
+ ngAfterViewInit() {
405
+ this.cdkConnectedOverlay.positionChange.subscribe((/**
406
+ * @param {?} posChange
407
+ * @return {?}
408
+ */
409
+ (posChange) => {
410
+ var _a;
411
+ if (this.listPosition === 'auto' && ((_a = posChange.connectionPair) === null || _a === void 0 ? void 0 : _a.originY) &&
412
+ this._overlayPosition !== posChange.connectionPair.originY) {
413
+ this.triggerRect();
414
+ this._overlayPosition = posChange.connectionPair.originY;
415
+ this._changeDetectorRef.detectChanges();
416
+ }
417
+ }));
418
+ this.selectionElement = this.selection.nativeElement;
419
+ this.triggerRect();
420
+ }
421
+ /**
422
+ * @return {?}
423
+ */
424
+ ngDoCheck() {
425
+ var _a;
426
+ this.updateSearchBox();
427
+ this._dirtyCheckNativeValue();
428
+ if (this._triggerRect) {
429
+ if (this.overlayWidth !== this._triggerRect.width) {
430
+ this.overlayWidth = this._triggerRect.width;
431
+ }
432
+ if (((_a = this._dropdownRect) === null || _a === void 0 ? void 0 : _a.height) > 0 && this.overlayHeight !== this._dropdownRect.height) {
433
+ this.overlayHeight = this.listPosition === 'auto' ? this._dropdownRect.height : 0;
434
+ }
435
+ }
436
+ }
437
+ /**
438
+ * @return {?}
439
+ */
440
+ ngOnDestroy() {
441
+ window.document.body.removeEventListener('click', this._clickDetectionFc);
442
+ }
443
+ /**
444
+ * @return {?}
445
+ */
446
+ updateSearchBox() {
447
+ /** @type {?} */
448
+ const hidden = this.customSearchEnabled
449
+ ? false
450
+ : Select2Utils.isSearchboxHiddex(this._data, this._minCountForSearch);
451
+ if (this.isSearchboxHidden !== hidden) {
452
+ this.isSearchboxHidden = hidden;
453
+ }
454
+ }
455
+ /**
456
+ * @return {?}
457
+ */
458
+ hideSearch() {
459
+ /** @type {?} */
460
+ const displaySearchStatus = displaySearchStatusList.indexOf(this.displaySearchStatus) > -1 ? this.displaySearchStatus : 'default';
461
+ return (displaySearchStatus === 'default' && this.isSearchboxHidden) || displaySearchStatus === 'hidden';
462
+ }
463
+ /**
464
+ * @param {?} option
465
+ * @return {?}
466
+ */
467
+ getOptionStyle(option) {
468
+ return ('select2-results__option ' +
469
+ (option.hide ? 'select2-results__option--hide ' : '') +
470
+ (option.value === this.hoveringValue ? 'select2-results__option--highlighted ' : '') +
471
+ (option.classes || ''));
472
+ }
473
+ /**
474
+ * @param {?} option
475
+ * @return {?}
476
+ */
477
+ mouseenter(option) {
478
+ if (!option.disabled) {
479
+ this.hoveringValue = option.value;
480
+ }
481
+ }
482
+ /**
483
+ * @param {?} option
484
+ * @return {?}
485
+ */
486
+ click(option) {
487
+ if (this.testSelection(option)) {
488
+ this.select(option);
489
+ }
490
+ }
491
+ /**
492
+ * @param {?} e
493
+ * @return {?}
494
+ */
495
+ reset(e) {
496
+ this.select(null);
497
+ e.preventDefault();
498
+ e.stopPropagation();
499
+ }
500
+ /**
501
+ * @param {?} event
502
+ * @return {?}
503
+ */
504
+ prevChange(event) {
505
+ event.stopPropagation();
506
+ }
507
+ /**
508
+ * @return {?}
509
+ */
510
+ toggleOpenAndClose() {
511
+ if (this.disabled) {
512
+ return;
513
+ }
514
+ this._focus(true);
515
+ this.isOpen = !this.isOpen;
516
+ if (this.isOpen) {
517
+ this.innerSearchText = '';
518
+ this.updateFilteredData();
519
+ this._focusSearchboxOrResultsElement();
520
+ setTimeout((/**
521
+ * @return {?}
522
+ */
523
+ () => {
524
+ if (this.option) {
525
+ /** @type {?} */
526
+ const option = this.option instanceof Array ? this.option[0] : this.option;
527
+ this.updateScrollFromOption(option);
528
+ }
529
+ else if (this.resultsElement) {
530
+ this.resultsElement.scrollTop = 0;
531
+ }
532
+ setTimeout((/**
533
+ * @return {?}
534
+ */
535
+ () => {
536
+ var _a, _b;
537
+ this.triggerRect();
538
+ (_b = (_a = this.cdkConnectedOverlay) === null || _a === void 0 ? void 0 : _a.overlayRef) === null || _b === void 0 ? void 0 : _b.updatePosition();
539
+ }), 100);
540
+ }));
541
+ this.open.emit(this);
542
+ }
543
+ else {
544
+ this.close.emit(this);
545
+ }
546
+ if (this.isOpen && !this._clickDetection) {
547
+ setTimeout((/**
548
+ * @return {?}
549
+ */
550
+ () => {
551
+ window.document.body.addEventListener('click', this._clickDetectionFc, false);
552
+ this._clickDetection = true;
553
+ }), timeout);
554
+ }
555
+ this._changeDetectorRef.markForCheck();
556
+ }
557
+ /**
558
+ * @param {?} option
559
+ * @param {?} defaut
560
+ * @return {?}
561
+ */
562
+ hasTemplate(option, defaut) {
563
+ var _a, _b;
564
+ return (this.templates instanceof TemplateRef ||
565
+ ((_a = this.templates) === null || _a === void 0 ? void 0 : _a[option.templateId]) instanceof TemplateRef ||
566
+ ((_b = this.templates) === null || _b === void 0 ? void 0 : _b[defaut]) instanceof TemplateRef);
567
+ }
568
+ /**
569
+ * @param {?} option
570
+ * @param {?} defaut
571
+ * @return {?}
572
+ */
573
+ getTemplate(option, defaut) {
574
+ return this.hasTemplate(option, defaut)
575
+ ? this.templates[option.templateId] || this.templates[defaut] || this.templates
576
+ : undefined;
577
+ }
578
+ /**
579
+ * @return {?}
580
+ */
581
+ triggerRect() {
582
+ var _a;
583
+ this._triggerRect = this.selectionElement.getBoundingClientRect();
584
+ this._dropdownRect = ((_a = this.dropdown) === null || _a === void 0 ? void 0 : _a.nativeElement) ? this.dropdown.nativeElement.getBoundingClientRect()
585
+ : undefined;
586
+ }
587
+ /**
588
+ * @private
589
+ * @param {?} option
590
+ * @return {?}
591
+ */
592
+ testSelection(option) {
593
+ if (option.disabled) {
594
+ return false;
595
+ }
596
+ if (!this.multiple ||
597
+ !this.limitSelection ||
598
+ (Array.isArray(this._value) && this._value.length < this.limitSelection)) {
599
+ return true;
600
+ }
601
+ return false;
602
+ }
603
+ /**
604
+ * @private
605
+ * @param {?} value1
606
+ * @param {?} value2
607
+ * @return {?}
608
+ */
609
+ testValueChange(value1, value2) {
610
+ var _a, _b;
611
+ if (((value1 === null || value1 === undefined) && (value2 === null || value2 === undefined)) ||
612
+ value1 === value2) {
613
+ return false;
614
+ }
615
+ if (this.multiple && ((_a = ((/** @type {?} */ (value1)))) === null || _a === void 0 ? void 0 : _a.length) && ((_b = ((/** @type {?} */ (value2)))) === null || _b === void 0 ? void 0 : _b.length) &&
616
+ ((/** @type {?} */ (value1))).length === ((/** @type {?} */ (value2))).length) {
617
+ for (const e1 of (/** @type {?} */ (value1))) {
618
+ /** @type {?} */
619
+ const test = ((/** @type {?} */ (value2))).indexOf(e1) > -1;
620
+ if (!test) {
621
+ return true;
622
+ }
623
+ }
624
+ return false;
625
+ }
626
+ return true;
627
+ }
628
+ /**
629
+ * @private
630
+ * @return {?}
631
+ */
632
+ updateFilteredData() {
633
+ setTimeout((/**
634
+ * @return {?}
635
+ */
636
+ () => {
637
+ /** @type {?} */
638
+ let result = this._data;
639
+ if (this.multiple && this.hideSelectedItems) {
640
+ result = Select2Utils.getFilteredSelectedData(result, this.option);
641
+ }
642
+ if (!this.customSearchEnabled && this.searchText && this.searchText.length >= +this.minCharForSearch) {
643
+ result = Select2Utils.getFilteredData(result, this.searchText, this.editPattern);
644
+ }
645
+ if (Select2Utils.valueIsNotInFilteredData(result, this.hoveringValue)) {
646
+ this.hoveringValue = Select2Utils.getFirstAvailableOption(result);
647
+ }
648
+ this.filteredData = result;
649
+ this._changeDetectorRef.markForCheck();
650
+ }));
651
+ }
652
+ /**
653
+ * @private
654
+ * @param {?} e
655
+ * @return {?}
656
+ */
657
+ clickDetection(e) {
658
+ if (!this.ifParentContainsClass((/** @type {?} */ (e.target)), 'selection')) {
659
+ if (this.isOpen && !this.ifParentContainsClass((/** @type {?} */ (e.target)), 'select2-dropdown')) {
660
+ this.toggleOpenAndClose();
661
+ }
662
+ if (!this.ifParentContainsId((/** @type {?} */ (e.target)), this._id)) {
663
+ this.clickExit();
664
+ }
665
+ }
666
+ else if (this.isOpen && !this.ifParentContainsId((/** @type {?} */ (e.target)), this._id)) {
667
+ this.toggleOpenAndClose();
668
+ this.clickExit();
669
+ }
670
+ }
671
+ /**
672
+ * @private
673
+ * @return {?}
674
+ */
675
+ clickExit() {
676
+ this._focus(false);
677
+ window.document.body.removeEventListener('click', this._clickDetectionFc);
678
+ this._clickDetection = false;
679
+ }
680
+ /**
681
+ * @private
682
+ * @param {?} element
683
+ * @param {?} cssClass
684
+ * @return {?}
685
+ */
686
+ ifParentContainsClass(element, cssClass) {
687
+ return this.getParentElementByClass(element, cssClass) !== null;
688
+ }
689
+ /**
690
+ * @private
691
+ * @param {?} element
692
+ * @param {?} id
693
+ * @return {?}
694
+ */
695
+ ifParentContainsId(element, id) {
696
+ return this.getParentElementById(element, id) !== null;
697
+ }
698
+ /**
699
+ * @private
700
+ * @param {?} element
701
+ * @param {?} cssClass
702
+ * @return {?}
703
+ */
704
+ getParentElementByClass(element, cssClass) {
705
+ if (this.containClasses(element, cssClass.trim().split(/\s+/))) {
706
+ return element;
707
+ }
708
+ return element.parentElement ? this.getParentElementByClass(element.parentElement, cssClass) : null;
709
+ }
710
+ /**
711
+ * @private
712
+ * @param {?} element
713
+ * @param {?} id
714
+ * @return {?}
715
+ */
716
+ getParentElementById(element, id) {
717
+ if (element.id === id) {
718
+ return element;
719
+ }
720
+ return element.parentElement ? this.getParentElementById(element.parentElement, id) : null;
721
+ }
722
+ /**
723
+ * @private
724
+ * @param {?} element
725
+ * @param {?} cssClasses
726
+ * @return {?}
727
+ */
728
+ containClasses(element, cssClasses) {
729
+ if (!element.classList) {
730
+ return false;
731
+ }
732
+ for (const cssClass of cssClasses) {
733
+ if (!element.classList.contains(cssClass)) {
734
+ return false;
735
+ }
736
+ }
737
+ return true;
738
+ }
739
+ /**
740
+ * @return {?}
741
+ */
742
+ focusin() {
743
+ if (this.disabled) {
744
+ return;
745
+ }
746
+ this._focus(true);
747
+ }
748
+ /**
749
+ * @return {?}
750
+ */
751
+ focusout() {
752
+ if (this.selectionElement && !this.selectionElement.classList.contains('select2-focused')) {
753
+ this._focus(false);
754
+ this._onTouched();
755
+ }
756
+ }
757
+ /**
758
+ * @private
759
+ * @return {?}
760
+ */
761
+ moveUp() {
762
+ this.updateScrollFromOption(Select2Utils.getPreviousOption(this.filteredData, this.hoveringValue));
763
+ }
764
+ /**
765
+ * @private
766
+ * @return {?}
767
+ */
768
+ moveDown() {
769
+ this.updateScrollFromOption(Select2Utils.getNextOption(this.filteredData, this.hoveringValue));
770
+ }
771
+ /**
772
+ * @private
773
+ * @param {?} option
774
+ * @return {?}
775
+ */
776
+ updateScrollFromOption(option) {
777
+ if (option) {
778
+ this.hoveringValue = option.value;
779
+ /** @type {?} */
780
+ const domElement = this.results.find((/**
781
+ * @param {?} r
782
+ * @return {?}
783
+ */
784
+ r => r.nativeElement.innerText.trim() === option.label));
785
+ if (domElement && this.resultsElement) {
786
+ this.resultsElement.scrollTop = 0;
787
+ /** @type {?} */
788
+ const listClientRect = this.resultsElement.getBoundingClientRect();
789
+ /** @type {?} */
790
+ const optionClientRect = domElement.nativeElement.getBoundingClientRect();
791
+ this.resultsElement.scrollTop = optionClientRect.top - listClientRect.top;
792
+ }
793
+ }
794
+ }
795
+ /**
796
+ * @private
797
+ * @return {?}
798
+ */
799
+ selectByEnter() {
800
+ if (this.hoveringValue) {
801
+ /** @type {?} */
802
+ const option = Select2Utils.getOptionByValue(this._data, this.hoveringValue);
803
+ this.select(option);
804
+ }
805
+ }
806
+ /**
807
+ * @param {?} option
808
+ * @return {?}
809
+ */
810
+ select(option) {
811
+ /** @type {?} */
812
+ let value;
813
+ if (option !== null) {
814
+ if (this.multiple) {
815
+ /** @type {?} */
816
+ const options = (/** @type {?} */ (this.option));
817
+ /** @type {?} */
818
+ const index = options.findIndex((/**
819
+ * @param {?} op
820
+ * @return {?}
821
+ */
822
+ op => op.value === option.value));
823
+ if (index === -1) {
824
+ options.push(option);
825
+ }
826
+ else {
827
+ options.splice(index, 1);
828
+ }
829
+ value = ((/** @type {?} */ (this.option))).map((/**
830
+ * @param {?} op
831
+ * @return {?}
832
+ */
833
+ op => op.value));
834
+ }
835
+ else {
836
+ this.option = option;
837
+ if (this.isOpen) {
838
+ this.isOpen = false;
839
+ this.close.emit(this);
840
+ if (this.selectionElement) {
841
+ this.selectionElement.focus();
842
+ }
843
+ }
844
+ value = this.option.value;
845
+ }
846
+ }
847
+ else {
848
+ this.option = null;
849
+ }
850
+ if (this.multiple && this.hideSelectedItems) {
851
+ this.updateFilteredData();
852
+ }
853
+ if (this._control) {
854
+ this._onChange(value);
855
+ }
856
+ else {
857
+ this._value = value;
858
+ }
859
+ this.update.emit({
860
+ component: this,
861
+ value: value,
862
+ options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
863
+ });
864
+ }
865
+ /**
866
+ * @param {?} e
867
+ * @return {?}
868
+ */
869
+ keyDown(e) {
870
+ if (this._testKey(e, ['ArrowDown', 40])) {
871
+ this.moveDown();
872
+ e.preventDefault();
873
+ }
874
+ else if (this._testKey(e, ['ArrowUp', 38])) {
875
+ this.moveUp();
876
+ e.preventDefault();
877
+ }
878
+ else if (this._testKey(e, ['Enter', 13])) {
879
+ this.selectByEnter();
880
+ e.preventDefault();
881
+ }
882
+ else if (this._testKey(e, ['Escape', 'Tab', 9, 27]) && this.isOpen) {
883
+ this.toggleOpenAndClose();
884
+ this._focus(false);
885
+ }
886
+ }
887
+ /**
888
+ * @param {?} e
889
+ * @return {?}
890
+ */
891
+ openKey(e) {
892
+ if (this._testKey(e, ['ArrowDown', 'ArrowUp', 'Enter', 40, 38, 13])) {
893
+ this.toggleOpenAndClose();
894
+ e.preventDefault();
895
+ }
896
+ else if (this._testKey(e, ['Escape', 'Tab', 9, 27])) {
897
+ this._focus(false);
898
+ this._onTouched();
899
+ }
900
+ }
901
+ /**
902
+ * @param {?} _index
903
+ * @param {?} item
904
+ * @return {?}
905
+ */
906
+ trackBy(_index, item) {
907
+ return item.value;
908
+ }
909
+ /**
910
+ * @param {?} e
911
+ * @return {?}
912
+ */
913
+ searchUpdate(e) {
914
+ this.searchText = ((/** @type {?} */ (e.target))).value;
915
+ this.updateFilteredData();
916
+ }
917
+ /**
918
+ * @param {?} option
919
+ * @return {?}
920
+ */
921
+ isSelected(option) {
922
+ return Select2Utils.isSelected(this.option, option, this.multiple);
923
+ }
924
+ /**
925
+ * @param {?} option
926
+ * @return {?}
927
+ */
928
+ isDisabled(option) {
929
+ return option.disabled ? 'true' : 'false';
930
+ }
931
+ /**
932
+ * @param {?} e
933
+ * @param {?} option
934
+ * @return {?}
935
+ */
936
+ removeSelection(e, option) {
937
+ Select2Utils.removeSelection(this.option, option);
938
+ if (this.multiple && this.hideSelectedItems) {
939
+ this.updateFilteredData();
940
+ }
941
+ /** @type {?} */
942
+ const value = ((/** @type {?} */ (this.option))).map((/**
943
+ * @param {?} op
944
+ * @return {?}
945
+ */
946
+ op => op.value));
947
+ if (this._control) {
948
+ this._onChange(value);
949
+ }
950
+ else {
951
+ this._value = value;
952
+ }
953
+ this.update.emit({
954
+ component: this,
955
+ value: value,
956
+ options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
957
+ });
958
+ this.removeOption.emit({
959
+ component: this,
960
+ value: value,
961
+ removedOption: option,
962
+ });
963
+ e.preventDefault();
964
+ e.stopPropagation();
965
+ if (this.isOpen) {
966
+ this._focusSearchboxOrResultsElement();
967
+ }
968
+ }
969
+ /**
970
+ * Sets the model value. Implemented as part of ControlValueAccessor.
971
+ * @param {?} value
972
+ * @return {?}
973
+ */
974
+ writeValue(value) {
975
+ this._setSelectionByValue(value);
976
+ }
977
+ /**
978
+ * Saves a callback function to be invoked when the select's value
979
+ * changes from user input. Part of the ControlValueAccessor interface
980
+ * required to integrate with Angular's core forms API.
981
+ *
982
+ * @param {?} fn Callback to be triggered when the value changes.
983
+ * @return {?}
984
+ */
985
+ registerOnChange(fn) {
986
+ this._onChange = fn;
987
+ }
988
+ /**
989
+ * Saves a callback function to be invoked when the select is blurred
990
+ * by the user. Part of the ControlValueAccessor interface required
991
+ * to integrate with Angular's core forms API.
992
+ *
993
+ * @param {?} fn Callback to be triggered when the component has been touched.
994
+ * @return {?}
995
+ */
996
+ registerOnTouched(fn) {
997
+ this._onTouched = fn;
998
+ }
999
+ /**
1000
+ * Sets whether the component should be disabled.
1001
+ * Implemented as part of ControlValueAccessor.
1002
+ * @param {?} isDisabled
1003
+ * @return {?}
1004
+ */
1005
+ setDisabledState(isDisabled) {
1006
+ this.disabled = isDisabled;
1007
+ }
1008
+ /**
1009
+ * @param {?} way
1010
+ * @return {?}
1011
+ */
1012
+ onScroll(way) {
1013
+ this.scroll.emit({
1014
+ component: this,
1015
+ way,
1016
+ search: this.innerSearchText,
1017
+ });
1018
+ }
1019
+ /**
1020
+ * @return {?}
1021
+ */
1022
+ _isErrorState() {
1023
+ /** @type {?} */
1024
+ const isInvalid = this._control && this._control.invalid;
1025
+ /** @type {?} */
1026
+ const isTouched = this._control && this._control.touched;
1027
+ /** @type {?} */
1028
+ const isSubmitted = (this._parentFormGroup && this._parentFormGroup.submitted) ||
1029
+ (this._parentForm && this._parentForm.submitted);
1030
+ return !!(isInvalid && (isTouched || isSubmitted));
1031
+ }
1032
+ /**
1033
+ * @private
1034
+ * @param {?} event
1035
+ * @param {?=} refs
1036
+ * @return {?}
1037
+ */
1038
+ _testKey(event, refs = []) {
1039
+ return this._isKey(this._getKey(event), refs);
1040
+ }
1041
+ /**
1042
+ * @private
1043
+ * @param {?} event
1044
+ * @return {?}
1045
+ */
1046
+ _getKey(event) {
1047
+ /** @type {?} */
1048
+ let code;
1049
+ if (event.key !== undefined) {
1050
+ code = event.key;
1051
+ }
1052
+ else if (event['keyIdentifier'] !== undefined) {
1053
+ code = event['keyIdentifier'];
1054
+ }
1055
+ else if (event['keyCode'] !== undefined) {
1056
+ code = event['keyCode'];
1057
+ }
1058
+ else {
1059
+ event.preventDefault();
1060
+ }
1061
+ return code;
1062
+ }
1063
+ /**
1064
+ * @private
1065
+ * @param {?} code
1066
+ * @param {?=} refs
1067
+ * @return {?}
1068
+ */
1069
+ _isKey(code, refs = []) {
1070
+ return refs && refs.length > 0 ? refs.indexOf(code) !== -1 : false;
1071
+ }
1072
+ /**
1073
+ * Sets the selected option based on a value. If no option can be
1074
+ * found with the designated value, the select trigger is cleared.
1075
+ * @private
1076
+ * @param {?} value
1077
+ * @return {?}
1078
+ */
1079
+ _setSelectionByValue(value) {
1080
+ if (this.option || (value !== undefined && value !== null)) {
1081
+ /** @type {?} */
1082
+ const isArray = Array.isArray(value);
1083
+ if (this.multiple && value && !isArray) {
1084
+ throw new Error('Non array value.');
1085
+ }
1086
+ else if (this._data) {
1087
+ if (this.multiple) {
1088
+ this.option = []; // if value is null, then empty option and return
1089
+ if (isArray) {
1090
+ // value is not null. Preselect value
1091
+ /** @type {?} */
1092
+ const selectedValues = Select2Utils.getOptionsByValue(this._data, value, this.multiple);
1093
+ selectedValues.map((/**
1094
+ * @param {?} item
1095
+ * @return {?}
1096
+ */
1097
+ item => this.select(item)));
1098
+ }
1099
+ }
1100
+ else {
1101
+ this.select(Select2Utils.getOptionByValue(this._data, value));
1102
+ }
1103
+ }
1104
+ else if (this._control) {
1105
+ this._control.viewToModelUpdate(value);
1106
+ }
1107
+ this._changeDetectorRef.markForCheck();
1108
+ }
1109
+ }
1110
+ /**
1111
+ * Does some manual dirty checking on the native input `value` property.
1112
+ * @private
1113
+ * @return {?}
1114
+ */
1115
+ _dirtyCheckNativeValue() {
1116
+ /** @type {?} */
1117
+ const newValue = this.value;
1118
+ if (this._previousNativeValue !== newValue) {
1119
+ this._previousNativeValue = newValue;
1120
+ this._stateChanges.next();
1121
+ }
1122
+ }
1123
+ /**
1124
+ * @private
1125
+ * @param {?} value
1126
+ * @return {?}
1127
+ */
1128
+ _coerceBooleanProperty(value) {
1129
+ return value != null && `${value}` !== 'false';
1130
+ }
1131
+ /**
1132
+ * @private
1133
+ * @return {?}
1134
+ */
1135
+ _focusSearchboxOrResultsElement() {
1136
+ if (!this.isSearchboxHidden) {
1137
+ setTimeout((/**
1138
+ * @return {?}
1139
+ */
1140
+ () => {
1141
+ if (this.searchInput && this.searchInput.nativeElement) {
1142
+ this.searchInput.nativeElement.focus();
1143
+ }
1144
+ }));
1145
+ }
1146
+ else if (this.resultsElement) {
1147
+ this.resultsElement.focus();
1148
+ }
1149
+ }
1150
+ /**
1151
+ * @private
1152
+ * @param {?} state
1153
+ * @return {?}
1154
+ */
1155
+ _focus(state) {
1156
+ if (!state && this.focused) {
1157
+ this.focused = state;
1158
+ this.blur.emit(this);
1159
+ }
1160
+ else if (state && !this.focused) {
1161
+ this.focused = state;
1162
+ this.focus.emit(this);
1163
+ }
1164
+ }
1165
+ /**
1166
+ * @private
1167
+ * @return {?}
1168
+ */
1169
+ _isAbobeOverlay() {
1170
+ return this.overlay && this._overlayPosition && this.listPosition === 'auto'
1171
+ ? this._overlayPosition === 'top'
1172
+ : this.listPosition === 'above';
1173
+ }
1174
+ }
1175
+ Select2.decorators = [
1176
+ { type: Component, args: [{
1177
+ selector: 'select2',
1178
+ template: "<div class=\"select2-label\" (click)=\"toggleOpenAndClose()\">\n <ng-content select=\"select2-label\"></ng-content>\n <span *ngIf=\"required\" class=\"select2-required\"></span>\n</div>\n<div\n class=\"select2 select2-container select2-container--default select2-container--focus\"\n [class.select2-container--below]=\"!select2above\"\n [class.select2-container--above]=\"select2above\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-container--disabled]=\"disabled\"\n>\n <div\n class=\"selection\"\n #selection\n #trigger=\"cdkOverlayOrigin\"\n [attr.tabindex]=\"!this.isOpen ? tabIndex : '-1'\"\n (click)=\"toggleOpenAndClose()\"\n (focus)=\"focusin()\"\n (blur)=\"focusout()\"\n (keydown)=\"openKey($event)\"\n cdkOverlayOrigin\n [class.select2-focused]=\"focused\"\n >\n <div\n class=\"select2-selection\"\n [class.select2-selection--multiple]=\"multiple\"\n [class.select2-selection--single]=\"!multiple\"\n role=\"combobox\"\n >\n <span *ngIf=\"!multiple\" class=\"select2-selection__rendered\" [title]=\"select2Option?.label || ''\">\n <span *ngIf=\"!select2Option\">&nbsp;</span>\n <span *ngIf=\"select2Option\" [innerHTML]=\"select2Option.label\"></span>\n <span [class.select2-selection__placeholder__option]=\"option\" class=\"select2-selection__placeholder\">{{\n placeholder\n }}</span>\n </span>\n <span\n (click)=\"reset($event)\"\n *ngIf=\"!multiple && resettable && select2Option && !(disabled || readonly)\"\n class=\"select2-selection__reset\"\n role=\"presentation\"\n >\u00D7</span\n >\n <span *ngIf=\"!multiple\" class=\"select2-selection__arrow\" role=\"presentation\"> </span>\n <ul *ngIf=\"multiple\" class=\"select2-selection__rendered\">\n <span\n [class.select2-selection__placeholder__option]=\"select2Options?.length > 0\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n <li *ngFor=\"let op of option; trackBy: trackBy\" class=\"select2-selection__choice\" [title]=\"op.label\">\n <span\n *ngIf=\"!(disabled || readonly)\"\n (click)=\"removeSelection($event, op)\"\n class=\"select2-selection__choice__remove\"\n role=\"presentation\"\n >\u00D7</span\n >\n <span [innerHTML]=\"op.label\"></span>\n </li>\n </ul>\n </div>\n </div>\n <ng-container *ngIf=\"!overlay\">\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n </ng-container>\n\n <div class=\"select2-subscript-wrapper\">\n <ng-content select=\"select2-hint\"></ng-content>\n </div>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"select2-overlay-backdrop\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"this.isOpen && overlay\"\n [cdkConnectedOverlayMinWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHeight]=\"overlayHeight\"\n [cdkConnectedOverlayPositions]=\"_positions\"\n (backdropClick)=\"toggleOpenAndClose()\"\n>\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n</ng-template>\n\n<ng-template #containerTemplate>\n <div\n class=\"select2-container select2-container--default select2-container-dropdown\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-overlay]=\"overlay\"\n [class.select2-position-auto]=\"listPosition === 'auto'\"\n >\n <div\n #dropdown\n class=\"select2-dropdown\"\n [class.select2-dropdown--below]=\"!select2above\"\n [class.select2-dropdown--above]=\"select2above\"\n >\n <div class=\"select2-search select2-search--dropdown\" [class.select2-search--hide]=\"hideSearch()\">\n <input\n #searchInput\n [id]=\"id + '-search-field'\"\n [value]=\"searchText\"\n (keydown)=\"keyDown($event)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-search__field\"\n type=\"search\"\n role=\"textbox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n [attr.tabindex]=\"this.isOpen ? tabIndex : '-1'\"\n />\n </div>\n <div class=\"select2-results\">\n <ul\n #results\n class=\"select2-results__options\"\n [style.max-height]=\"resultMaxHeight\"\n role=\"tree\"\n tabindex=\"-1\"\n infiniteScroll\n [infiniteScrollDisabled]=\"!infiniteScroll && !isOpen\"\n [infiniteScrollDistance]=\"infiniteScrollDistance\"\n [infiniteScrollThrottle]=\"infiniteScrollThrottle\"\n [infiniteScrollContainer]=\"results\"\n (scrolled)=\"onScroll('down')\"\n (scrolledUp)=\"onScroll('up')\"\n (keydown)=\"keyDown($event)\"\n >\n <ng-container *ngFor=\"let groupOrOption of filteredData; index as i; trackBy: trackBy\">\n <li *ngIf=\"groupOrOption.options\" class=\"select2-results__option\" role=\"group\">\n <strong\n *ngIf=\"!hasTemplate(groupOrOption, 'group'); else optGroup\"\n [attr.class]=\"\n 'select2-results__group' +\n (groupOrOption.classes ? ' ' + groupOrOption.classes : '')\n \"\n [innerHTML]=\"groupOrOption.label\"\n ></strong>\n <ng-template #optGroup>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'group'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n\n <ul class=\"select2-results__options select2-results__options--nested\">\n <li\n *ngFor=\"let option of groupOrOption.options; index as j; trackBy: trackBy\"\n #result\n [id]=\"option.id || id + '-option-' + i + '-' + j\"\n [class]=\"getOptionStyle(option)\"\n role=\"treeitem\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isDisabled(option)\"\n (mouseenter)=\"mouseenter(option)\"\n (click)=\"click(option)\"\n >\n <div\n *ngIf=\"!hasTemplate(option, 'option'); else liGroup\"\n class=\"select2-label-content\"\n [innerHTML]=\"option.label\"\n ></div>\n <ng-template #liGroup>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(option, 'option'); context: option\"\n >\n </ng-container>\n </ng-template>\n </li>\n </ul>\n </li>\n <li\n *ngIf=\"!groupOrOption.options\"\n #result\n [id]=\"groupOrOption.id || id + '-option-' + i\"\n [class]=\"getOptionStyle(groupOrOption)\"\n role=\"treeitem\"\n [attr.aria-selected]=\"isSelected(groupOrOption)\"\n [attr.aria-disabled]=\"isDisabled(groupOrOption)\"\n (mouseenter)=\"mouseenter(groupOrOption)\"\n (click)=\"click(groupOrOption)\"\n >\n <div\n *ngIf=\"!hasTemplate(groupOrOption, 'option'); else li\"\n [innerHTML]=\"groupOrOption.label\"\n class=\"select2-label-content\"\n ></div>\n <ng-template #li>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n </li>\n </ng-container>\n <li\n class=\"select2-no-result select2-results__option\"\n *ngIf=\"!filteredData?.length && noResultMessage\"\n [innerHTML]=\"noResultMessage\"\n ></li>\n </ul>\n </div>\n </div>\n </div>\n</ng-template>\n",
1179
+ styles: [".select2-label{color:#000;color:var(--select2-label-text-color,#000)}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;width:100%}.select2-container .select2-container-dropdown{opacity:0;position:absolute;width:0}.select2-container .select2-selection--single{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;flex:1 1 auto;overflow:hidden;padding:0 0 0 8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container .select2-selection--multiple{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{border:none;box-sizing:border-box;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background:#fff;background:var(--select2-dropdown-background,#fff);border:1px solid #aaa;border:1px solid var(--select2-dropdown-border-color,#aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius,4px);box-sizing:border-box;display:block;height:0;overflow:hidden;position:absolute;width:100%;z-index:1051}.select2-dropdown .select2-label-content{display:contents}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;color:#000;color:var(--select2-option-text-color,#000);padding:6px;user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container.select2-container-dropdown.select2-container--open{opacity:1;width:100%}.select2-container--open .select2-dropdown{height:auto;overflow:auto}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;bottom:27px;display:flex;flex-direction:column-reverse}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{box-sizing:border-box;padding:4px;width:100%}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{background:#fff;border:0;display:block;filter:alpha(opacity=0);height:auto;left:0;margin:0;min-height:100%;min-width:100%;opacity:0;padding:0;position:fixed;top:0;width:auto;z-index:99}.select2-required:before{color:red;color:var(--select2-required-color,red);content:\"*\"}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background:#fff;background:var(--select2-selection-background,#fff);border:1px solid #aaa;border:1px solid var(--select2-selection-border-color,#aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius,4px);display:flex}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;color:var(--select2-selection-text-color,#444);line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999;color:var(--select2-placeholder-color,#999)}.select2-container--default .select2-selection--single .select2-selection__placeholder span{overflow:hidden;text-overflow:ellipsis;text-overflow:var(--select2-placeholder-overflow,ellipsis);white-space:nowrap}.select2-container--default .select2-selection--single .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--single .select2-selection__arrow,.select2-container--default .select2-selection--single .select2-selection__reset{align-items:center;display:flex;justify-content:center;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow:before{border-bottom:0 solid var(--select2-arrow-color,#888);border-color:#888 transparent;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--select2-arrow-color,#888);content:\" \";height:0;width:0}.select2-container--default .select2-selection--single .select2-selection__reset{color:#999;color:var(--select2-reset-color,#999)}.select2-container--default.select2-container--disabled .select2-selection--single{background:#eee;background:var(--select2-selection-disabled-background,#eee);cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow:before{border-bottom-color:var(--select2-arrow-color,#888);border-color:transparent transparent #888;border-right-color:transparent;border-top-color:transparent;border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background:#fff;background:var(--select2-selection-background,#fff);border:1px solid #aaa;border:1px solid var(--select2-selection-border-color,#aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius,4px);cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;flex:1 1 auto;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;color:var(--select2-placeholder-color,#999);display:block;float:left;margin-top:5px;overflow:hidden;text-overflow:ellipsis;text-overflow:var(--select2-placeholder-overflow,ellipsis);white-space:nowrap;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px;margin-top:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background:#e4e4e4;background:var(--select2-selection-choice-background,#e4e4e4);border:1px solid #aaa;border:1px solid var(--select2-selection-choice-border-color,#aaa);border-radius:4px;border-radius:var(--select2-selection-border-radius,4px);color:#000;color:var(--select2-selection-choice-text-color,#000);cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;color:var(--select2-selection-choice-close-color,#999);cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333;color:var(--select2-selection-choice-hover-close-color,#333)}.select2-container--default.select2-container--focused .select2-selection--multiple,.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple,.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single{border:1px solid #000;border:1px solid var(--select2-selection-focus-border-color,#000);outline:none}.select2-container--default.select2-container--disabled .select2-selection--multiple{background:#eee;background:var(--select2-selection-disabled-background,#eee);cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{background:#fff;background:1px solid var(--select2-search-background,#fff);border:1px solid #aaa;border:1px solid var(--select2-search-border-color,#aaa);border-radius:0;border-radius:var(--select2-search-border-radius,0)}.select2-container--default .select2-search--inline .select2-search__field{-webkit-appearance:textfield;background:transparent;border:none;box-shadow:none;outline:none}.select2-container--default .select2-results>.select2-results__options{overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{background:transparent;background:var(--select2-option-disabled-background,transparent);color:#999;color:var(--select2-option-disabled-text-color,#999)}.select2-container--default .select2-results__option[aria-selected=true]{background:#ddd;background:var(--select2-option-selected-background,#ddd);color:#000;color:var(--select2-option-selected-text-color,#000)}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background:#5897fb;background:var(--select2-option-highlighted-background,#5897fb);color:#fff;color:var(--select2-option-highlighted-text-color,#fff)}.select2-container--default .select2-results__option--hide{display:none}.select2-container--default .select2-results__group{background:transparent;background:var(--select2-option-group-background,transparent);color:grey;color:var(--select2-option-group-text-color,grey);cursor:default;display:block;padding:6px}.select2-no-result{color:#888;color:var(--select2-no-result-color,#888);font-style:italic;font-style:var(--select2-font-style-color,italic)}:host.nostyle .select2-dropdown{border-color:transparent}:host.nostyle .select2-container--default .select2-focused .select2-selection--multiple,:host.nostyle .select2-container--default .select2-focused .select2-selection--single,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.nostyle .select2-selection--multiple,:host.nostyle .select2-selection--single{background:transparent;border-color:transparent}:host.material{display:inline-block;width:300px}:host.material>.select2-container{padding-bottom:1.29688em;vertical-align:inherit}:host.material>.select2-container .selection{align-items:baseline;border-top:.84375em solid transparent;display:inline-flex;height:auto;padding:.4375em 0;width:100%}:host.material .select2-container--default .select2-selection--multiple,:host.material .select2-container--default .select2-selection--single{border:0;border-radius:0;box-sizing:border-box;height:24px;width:100%}:host.material .select2-container--default .select2-selection--multiple:before,:host.material .select2-container--default .select2-selection--single:before{background:#ddd;background:var(--select2-material-underline,#ddd);bottom:1.65em;content:\" \";display:block;height:1px;position:absolute;width:100%}:host.material .select2-container--default .select2-selection--multiple:after,:host.material .select2-container--default .select2-selection--single:after{background:#5a419e;background:var(--select2-material-underline-active,#5a419e);bottom:1.63em;content:\" \";display:block;height:2px;left:50%;position:absolute;transition:none;width:0}:host.material .select2-container--default .select2-selection--multiple .select2-selection__rendered,:host.material .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:inherit;padding-left:1px}:host.material .select2-container--default .select2-selection--multiple .select2-selection__placeholder,:host.material .select2-container--default .select2-selection--single .select2-selection__placeholder{color:rgba(0,0,0,.38);color:var(--select2-material-placeholder-color,rgba(0,0,0,.38));display:block;left:0;position:absolute;top:20px;transform-origin:0 21px;transition:transform .3s}:host.material .select2-container--default .select2-container--open{bottom:1.6em;left:0}:host.material .select2-container--default .select2-selection__placeholder__option{transform:translateY(-1.5em) scale(.75) perspective(100px) translateZ(.001px);width:133.33333%}:host.material .select2-container--default .select2-selection__arrow{top:20px}:host.material .select2-container--default.select2-container--open .select2-selection--multiple:after,:host.material .select2-container--default.select2-container--open .select2-selection--single:after,:host.material .select2-container--default .select2-focused .select2-selection--multiple:after,:host.material .select2-container--default .select2-focused .select2-selection--single:after{left:0;transition:width .3s cubic-bezier(.12,1,.77,1),left .3s cubic-bezier(.12,1,.77,1);width:100%}:host.material .select2-container--default .select2-dropdown{border:0;border-radius:0;box-shadow:0 5px 5px rgba(0,0,0,.5)}:host.material .select2-container--default .select2-results__option--highlighted[aria-selected],:host.material .select2-container--default .select2-results__option[aria-selected=true]{background:rgba(0,0,0,.04);background:var(--select2-material-option-selected-background,rgba(0,0,0,.04));color:#000;color:var(--select2-material-option-highlighted-text-color,#000)}:host.material .select2-container--default .select2-results__option[aria-selected=true]{color:#ff5722;color:var(--select2-material-option-selected-text-color,#ff5722)}:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple,:host.material .select2-container--default.select2-container--disabled .select2-selection--single{background:transparent}:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple:before,:host.material .select2-container--default.select2-container--disabled .select2-selection--single:before{background:linear-gradient(90deg,rgba(0,0,0,.26) 0,rgba(0,0,0,.26) 33%,transparent 0);background:var(--select2-material-underline-disabled,linear-gradient(90deg,rgba(0,0,0,.26) 0,rgba(0,0,0,.26) 33%,transparent 0));background-position:0 bottom;background-repeat:repeat-x;background-size:4px 1px}:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:after,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:before,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:after,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:before{background:red;background:var(--select2-material-underline-invalid,red)}:host.material:not(.select2-container--open) .select2-focused .select2-selection--multiple,:host.material:not(.select2-container--open) .select2-focused .select2-selection--single{border:0}:host.material .select2-subscript-wrapper{color:#888;color:var(--select2-hint-text-color,#888);font-size:75%;position:absolute;top:calc(100% - 1.72917em)}::ng-deep .select2-overlay-backdrop{background:rgba(0,0,0,.32);background:var(--select2-overlay-backdrop,transparent)}::ng-deep .cdk-overlay-container .select2-container .select2-dropdown.select2-dropdown--above{bottom:28px}::ng-deep .cdk-overlay-container .select2-container--open.select2-position-auto .select2-dropdown{margin-bottom:28px}::ng-deep .cdk-overlay-container .select2-container--open.select2-position-auto .select2-dropdown.select2-dropdown--above{bottom:0;margin-bottom:0;margin-top:28px}@supports (-moz-appearance:none){select2.material .select2-container--default .select2-selection--multiple,select2.material .select2-container--default .select2-selection--single{height:26px}}@supports (-ms-scroll-limit:0){select2.material .select2-container--default .select2-selection--multiple,select2.material .select2-container--default .select2-selection--single{height:25px}}"]
1180
+ }] }
1181
+ ];
1182
+ /** @nocollapse */
1183
+ Select2.ctorParameters = () => [
1184
+ { type: ViewportRuler },
1185
+ { type: ChangeDetectorRef },
1186
+ { type: NgForm, decorators: [{ type: Optional }] },
1187
+ { type: FormGroupDirective, decorators: [{ type: Optional }] },
1188
+ { type: NgControl, decorators: [{ type: Self }, { type: Optional }] },
1189
+ { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] }
1190
+ ];
1191
+ Select2.propDecorators = {
1192
+ data: [{ type: Input }],
1193
+ minCharForSearch: [{ type: Input }],
1194
+ displaySearchStatus: [{ type: Input }],
1195
+ placeholder: [{ type: Input }],
1196
+ customSearchEnabled: [{ type: Input }],
1197
+ limitSelection: [{ type: Input }],
1198
+ listPosition: [{ type: Input }],
1199
+ multiple: [{ type: Input }],
1200
+ overlay: [{ type: Input }],
1201
+ styleMode: [{ type: Input }],
1202
+ noResultMessage: [{ type: Input }],
1203
+ infiniteScrollDistance: [{ type: Input }],
1204
+ infiniteScrollThrottle: [{ type: Input }],
1205
+ infiniteScroll: [{ type: Input }],
1206
+ editPattern: [{ type: Input }],
1207
+ templates: [{ type: Input }],
1208
+ resultMaxHeight: [{ type: Input }],
1209
+ update: [{ type: Output }],
1210
+ open: [{ type: Output }],
1211
+ close: [{ type: Output }],
1212
+ focus: [{ type: Output }],
1213
+ blur: [{ type: Output }],
1214
+ search: [{ type: Output }],
1215
+ scroll: [{ type: Output }],
1216
+ removeOption: [{ type: Output }],
1217
+ minCountForSearch: [{ type: Input }],
1218
+ id: [{ type: Input }, { type: HostBinding, args: ['id',] }],
1219
+ required: [{ type: Input }],
1220
+ disabled: [{ type: Input }],
1221
+ hideSelectedItems: [{ type: Input }],
1222
+ readonly: [{ type: Input }],
1223
+ value: [{ type: Input }],
1224
+ tabIndex: [{ type: Input }],
1225
+ resettable: [{ type: Input }],
1226
+ ariaInvalid: [{ type: HostBinding, args: ['attr.aria-invalid',] }],
1227
+ classMaterial: [{ type: HostBinding, args: ['class.material',] }],
1228
+ classNostyle: [{ type: HostBinding, args: ['class.nostyle',] }],
1229
+ select2above: [{ type: HostBinding, args: ['class.select2-above',] }],
1230
+ cdkConnectedOverlay: [{ type: ViewChild, args: [CdkConnectedOverlay,] }],
1231
+ selection: [{ type: ViewChild, args: ['selection', { static: true },] }],
1232
+ resultContainer: [{ type: ViewChild, args: ['results',] }],
1233
+ results: [{ type: ViewChildren, args: ['result',] }],
1234
+ searchInput: [{ type: ViewChild, args: ['searchInput',] }],
1235
+ dropdown: [{ type: ViewChild, args: ['dropdown',] }]
1236
+ };
1237
+ if (false) {
1238
+ /** @type {?} */
1239
+ Select2.prototype._data;
1240
+ /** @type {?} */
1241
+ Select2.prototype.minCharForSearch;
1242
+ /** @type {?} */
1243
+ Select2.prototype.displaySearchStatus;
1244
+ /** @type {?} */
1245
+ Select2.prototype.placeholder;
1246
+ /** @type {?} */
1247
+ Select2.prototype.customSearchEnabled;
1248
+ /** @type {?} */
1249
+ Select2.prototype.limitSelection;
1250
+ /** @type {?} */
1251
+ Select2.prototype.listPosition;
1252
+ /**
1253
+ * use the material style
1254
+ * @type {?}
1255
+ */
1256
+ Select2.prototype.styleMode;
1257
+ /**
1258
+ * message when no result
1259
+ * @type {?}
1260
+ */
1261
+ Select2.prototype.noResultMessage;
1262
+ /**
1263
+ * infinite scroll distance
1264
+ * @type {?}
1265
+ */
1266
+ Select2.prototype.infiniteScrollDistance;
1267
+ /**
1268
+ * infinite scroll distance
1269
+ * @type {?}
1270
+ */
1271
+ Select2.prototype.infiniteScrollThrottle;
1272
+ /**
1273
+ * use it for change the pattern of the filter search
1274
+ * @type {?}
1275
+ */
1276
+ Select2.prototype.editPattern;
1277
+ /**
1278
+ * template for formating
1279
+ * @type {?}
1280
+ */
1281
+ Select2.prototype.templates;
1282
+ /**
1283
+ * the max height of the results container when opening the select
1284
+ * @type {?}
1285
+ */
1286
+ Select2.prototype.resultMaxHeight;
1287
+ /** @type {?} */
1288
+ Select2.prototype.update;
1289
+ /** @type {?} */
1290
+ Select2.prototype.open;
1291
+ /** @type {?} */
1292
+ Select2.prototype.close;
1293
+ /** @type {?} */
1294
+ Select2.prototype.focus;
1295
+ /** @type {?} */
1296
+ Select2.prototype.blur;
1297
+ /** @type {?} */
1298
+ Select2.prototype.search;
1299
+ /** @type {?} */
1300
+ Select2.prototype.scroll;
1301
+ /** @type {?} */
1302
+ Select2.prototype.removeOption;
1303
+ /** @type {?} */
1304
+ Select2.prototype.option;
1305
+ /** @type {?} */
1306
+ Select2.prototype.isOpen;
1307
+ /** @type {?} */
1308
+ Select2.prototype.searchStyle;
1309
+ /**
1310
+ * Whether the element is focused or not.
1311
+ * @type {?}
1312
+ */
1313
+ Select2.prototype.focused;
1314
+ /** @type {?} */
1315
+ Select2.prototype.filteredData;
1316
+ /** @type {?} */
1317
+ Select2.prototype.overlayWidth;
1318
+ /** @type {?} */
1319
+ Select2.prototype.overlayHeight;
1320
+ /** @type {?} */
1321
+ Select2.prototype._triggerRect;
1322
+ /** @type {?} */
1323
+ Select2.prototype._dropdownRect;
1324
+ /**
1325
+ * @type {?}
1326
+ * @private
1327
+ */
1328
+ Select2.prototype._minCountForSearch;
1329
+ /**
1330
+ * @type {?}
1331
+ * @private
1332
+ */
1333
+ Select2.prototype.cdkConnectedOverlay;
1334
+ /**
1335
+ * @type {?}
1336
+ * @private
1337
+ */
1338
+ Select2.prototype.selection;
1339
+ /**
1340
+ * @type {?}
1341
+ * @private
1342
+ */
1343
+ Select2.prototype.resultContainer;
1344
+ /**
1345
+ * @type {?}
1346
+ * @private
1347
+ */
1348
+ Select2.prototype.results;
1349
+ /**
1350
+ * @type {?}
1351
+ * @private
1352
+ */
1353
+ Select2.prototype.searchInput;
1354
+ /**
1355
+ * @type {?}
1356
+ * @private
1357
+ */
1358
+ Select2.prototype.dropdown;
1359
+ /**
1360
+ * @type {?}
1361
+ * @private
1362
+ */
1363
+ Select2.prototype.hoveringValue;
1364
+ /**
1365
+ * @type {?}
1366
+ * @private
1367
+ */
1368
+ Select2.prototype.innerSearchText;
1369
+ /**
1370
+ * @type {?}
1371
+ * @private
1372
+ */
1373
+ Select2.prototype.isSearchboxHidden;
1374
+ /**
1375
+ * @type {?}
1376
+ * @private
1377
+ */
1378
+ Select2.prototype.selectionElement;
1379
+ /**
1380
+ * @type {?}
1381
+ * @private
1382
+ */
1383
+ Select2.prototype._stateChanges;
1384
+ /**
1385
+ * Tab index for the element.
1386
+ * @type {?}
1387
+ * @private
1388
+ */
1389
+ Select2.prototype._tabIndex;
1390
+ /**
1391
+ * @type {?}
1392
+ * @private
1393
+ */
1394
+ Select2.prototype._disabled;
1395
+ /**
1396
+ * @type {?}
1397
+ * @private
1398
+ */
1399
+ Select2.prototype._required;
1400
+ /**
1401
+ * @type {?}
1402
+ * @private
1403
+ */
1404
+ Select2.prototype._readonly;
1405
+ /**
1406
+ * @type {?}
1407
+ * @private
1408
+ */
1409
+ Select2.prototype._multiple;
1410
+ /**
1411
+ * @type {?}
1412
+ * @private
1413
+ */
1414
+ Select2.prototype._overlay;
1415
+ /**
1416
+ * @type {?}
1417
+ * @private
1418
+ */
1419
+ Select2.prototype._resettable;
1420
+ /**
1421
+ * @type {?}
1422
+ * @private
1423
+ */
1424
+ Select2.prototype._hideSelectedItems;
1425
+ /**
1426
+ * @type {?}
1427
+ * @private
1428
+ */
1429
+ Select2.prototype._clickDetection;
1430
+ /**
1431
+ * @type {?}
1432
+ * @private
1433
+ */
1434
+ Select2.prototype._clickDetectionFc;
1435
+ /**
1436
+ * @type {?}
1437
+ * @private
1438
+ */
1439
+ Select2.prototype._id;
1440
+ /**
1441
+ * @type {?}
1442
+ * @private
1443
+ */
1444
+ Select2.prototype._uid;
1445
+ /**
1446
+ * @type {?}
1447
+ * @private
1448
+ */
1449
+ Select2.prototype._value;
1450
+ /**
1451
+ * @type {?}
1452
+ * @private
1453
+ */
1454
+ Select2.prototype._previousNativeValue;
1455
+ /**
1456
+ * @type {?}
1457
+ * @private
1458
+ */
1459
+ Select2.prototype._infiniteScroll;
1460
+ /**
1461
+ * @type {?}
1462
+ * @private
1463
+ */
1464
+ Select2.prototype._overlayPosition;
1465
+ /**
1466
+ * View -> model callback called when select has been touched
1467
+ * @type {?}
1468
+ * @private
1469
+ */
1470
+ Select2.prototype._onTouched;
1471
+ /**
1472
+ * View -> model callback called when value changes
1473
+ * @type {?}
1474
+ * @private
1475
+ */
1476
+ Select2.prototype._onChange;
1477
+ /**
1478
+ * @type {?}
1479
+ * @protected
1480
+ */
1481
+ Select2.prototype._viewportRuler;
1482
+ /**
1483
+ * @type {?}
1484
+ * @private
1485
+ */
1486
+ Select2.prototype._changeDetectorRef;
1487
+ /**
1488
+ * @type {?}
1489
+ * @private
1490
+ */
1491
+ Select2.prototype._parentForm;
1492
+ /**
1493
+ * @type {?}
1494
+ * @private
1495
+ */
1496
+ Select2.prototype._parentFormGroup;
1497
+ /** @type {?} */
1498
+ Select2.prototype._control;
1499
+ }
1500
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Mi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL21lZGlhL3plZmxpbmcvWkFJREUtNi9HaXQvbmctc2VsZWN0Mi9wcm9qZWN0cy9uZy1zZWxlY3QyLWNvbXBvbmVudC9zcmMvIiwic291cmNlcyI6WyJsaWIvc2VsZWN0Mi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0gsbUJBQW1CLEdBQ3RCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXZELE9BQU8sRUFDWSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFXLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUN6RixRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksR0FDdkUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFLMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztJQUUzQyxZQUFZLEdBQUcsQ0FBQzs7TUFFZCx1QkFBdUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO0FBTy9ELE1BQU0sT0FBTyxPQUFPOzs7Ozs7Ozs7SUE2UmhCLFlBQ2MsY0FBNkIsRUFDL0Isa0JBQXFDLEVBQ3pCLFdBQW1CLEVBQ25CLGdCQUFvQyxFQUM3QixRQUFtQixFQUN2QixRQUFnQjtRQUw3QixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUMvQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQ3pCLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQ25CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUFDN0IsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQTFSekMscUJBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBSXJCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLGlCQUFZLEdBQStCLE9BQU8sQ0FBQzs7OztRQXFCbkQsY0FBUyxHQUF1QyxTQUFTLENBQUM7Ozs7UUFNMUQsMkJBQXNCLEdBQUcsR0FBRyxDQUFDOzs7O1FBRzdCLDJCQUFzQixHQUFHLEdBQUcsQ0FBQzs7OztRQWtCN0Isb0JBQWUsR0FBRyxPQUFPLENBQUM7UUFFekIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUEwQyxDQUFDO1FBQ3BFLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ25DLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3BDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3BDLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ25DLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBMEMsQ0FBQztRQUNwRSxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDaEQsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBMEMsQ0FBQztRQUVwRixXQUFNLEdBQTJDLElBQUksQ0FBQztRQUN0RCxXQUFNLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWYsWUFBTyxHQUFHLEtBQUssQ0FBQztRQWlMUixrQkFBYSxHQUFvQyxJQUFJLENBQUM7UUFDdEQsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFTckIsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBS3BDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0Isb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFHeEIsU0FBSSxHQUFHLFdBQVcsWUFBWSxFQUFFLEVBQUUsQ0FBQztRQUduQyxvQkFBZSxHQUFHLElBQUksQ0FBQzs7OztRQXNCdkIsZUFBVTs7O1FBQUcsR0FBRyxFQUFFO1lBQ3RCLGFBQWE7UUFDakIsQ0FBQyxFQUFDOzs7O1FBR00sY0FBUzs7O1FBQXlCLEdBQUcsRUFBRTtZQUMzQyxhQUFhO1FBQ2pCLENBQUMsRUFBQztRQWxCRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDdEM7UUFFRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUQsQ0FBQzs7Ozs7O0lBelNELElBQWEsSUFBSSxDQUFDLElBQWlCO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7Ozs7SUFRRCxJQUNJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQzs7Ozs7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDOzs7OztJQUdELElBQ0ksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDOzs7OztJQUNELElBQUksT0FBTyxDQUFDLEtBQVU7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQzs7Ozs7SUFlRCxJQUNJLGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQzs7Ozs7SUFDRCxJQUFJLGNBQWMsQ0FBQyxLQUFVO1FBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlELENBQUM7Ozs7SUE2QkQsSUFBSSxjQUFjO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFBLElBQUksQ0FBQyxNQUFNLEVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ25FLENBQUM7Ozs7SUFFRCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBQSxJQUFJLENBQUMsTUFBTSxFQUFpQixDQUFDLENBQUM7SUFDakUsQ0FBQzs7OztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNoQyxDQUFDOzs7OztJQUVELElBQUksVUFBVSxDQUFDLElBQVk7UUFDdkIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ2IsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNsQixNQUFNLEVBQUUsSUFBSTthQUNmLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQzs7Ozs7SUFHRCxJQUNJLGlCQUFpQjtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNuQyxDQUFDOzs7OztJQUVELElBQUksaUJBQWlCLENBQUMsS0FBc0I7UUFDeEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7Ozs7SUFHRCxJQUVJLEVBQUU7UUFDRixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFDRCxJQUFJLEVBQUUsQ0FBQyxLQUFhO1FBQ2hCLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbEMsQ0FBQzs7Ozs7SUFHRCxJQUNJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQzs7Ozs7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hELENBQUM7Ozs7O0lBR0QsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNuRSxDQUFDOzs7OztJQUNELElBQUksUUFBUSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEQsQ0FBQzs7Ozs7SUFHRCxJQUNJLGlCQUFpQjtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNuQyxDQUFDOzs7OztJQUNELElBQUksaUJBQWlCLENBQUMsS0FBVTtRQUM1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Ozs7O0lBR0QsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7Ozs7O0lBQ0QsSUFBSSxRQUFRLENBQUMsS0FBVTtRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxDQUFDOzs7OztJQUdELElBQ0ksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDOzs7OztJQUVELElBQUksS0FBSyxDQUFDLEtBQXlCO1FBQy9CLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzFDLFVBQVU7OztZQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixDQUFDLEdBQUUsRUFBRSxDQUFDLENBQUM7U0FDVjtJQUNMLENBQUM7Ozs7O0lBR0QsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMvQyxDQUFDOzs7OztJQUVELElBQUksUUFBUSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDMUI7SUFDTCxDQUFDOzs7OztJQUdELElBQ0ksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDOzs7OztJQUNELElBQUksVUFBVSxDQUFDLEtBQVU7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQzs7OztJQUVELElBQ0ksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7Ozs7SUFFRCxJQUNJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDO0lBQ3pDLENBQUM7Ozs7SUFFRCxJQUNJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDO0lBQ3hDLENBQUM7Ozs7SUFFRCxJQUNJLFlBQVk7UUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNsRixDQUFDOzs7O0lBT0QsSUFBSSxVQUFVO1FBQ1YsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLE1BQU0sRUFBRTtZQUM5QjtnQkFDSTtvQkFDSSxPQUFPLEVBQUUsT0FBTztvQkFDaEIsT0FBTyxFQUFFLFFBQVE7b0JBQ2pCLFFBQVEsRUFBRSxPQUFPO29CQUNqQixRQUFRLEVBQUUsUUFBUTtpQkFDckI7Z0JBQ0Q7b0JBQ0ksT0FBTyxFQUFFLE9BQU87b0JBQ2hCLE9BQU8sRUFBRSxLQUFLO29CQUNkLFFBQVEsRUFBRSxPQUFPO29CQUNqQixRQUFRLEVBQUUsS0FBSztpQkFDbEI7YUFDSixDQUFDO1NBQ0w7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDOzs7OztJQW1CRCxJQUFZLGNBQWM7O1FBQ3RCLGFBQU8sSUFBSSxDQUFDLGVBQWUsMENBQUUsYUFBYSxDQUFDO0lBQy9DLENBQUM7Ozs7SUFtREQsUUFBUTtRQUNKLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVM7OztRQUFDLEdBQUcsRUFBRTtZQUMzQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3RCO1FBQ0wsQ0FBQyxFQUFDLENBQUM7O2NBRUcsTUFBTSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDekMsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FDaEI7UUFDRCxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDeEI7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLG1CQUFBLElBQUksQ0FBQyxLQUFLLEVBQXNCLENBQUM7U0FDekQ7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7OztJQUVELGVBQWU7UUFDWCxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLFNBQXlDLEVBQUUsRUFBRTs7WUFDNUYsSUFDSSxJQUFJLENBQUMsWUFBWSxLQUFLLE1BQU0sV0FDNUIsU0FBUyxDQUFDLGNBQWMsMENBQUUsT0FBTyxDQUFBO2dCQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQzVEO2dCQUNFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDM0M7UUFDTCxDQUFDLEVBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztRQUNyRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQzs7OztJQUVELFNBQVM7O1FBQ0wsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7Z0JBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7YUFDL0M7WUFDRCxJQUFJLE9BQUEsSUFBSSxDQUFDLGFBQWEsMENBQUUsTUFBTSxJQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO2dCQUNwRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JGO1NBQ0o7SUFDTCxDQUFDOzs7O0lBRUQsV0FBVztRQUNQLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM5RSxDQUFDOzs7O0lBRUQsZUFBZTs7Y0FDTCxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQjtZQUNuQyxDQUFDLENBQUMsS0FBSztZQUNQLENBQUMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDekUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssTUFBTSxFQUFFO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUM7U0FDbkM7SUFDTCxDQUFDOzs7O0lBRUQsVUFBVTs7Y0FDQSxtQkFBbUIsR0FDckIsdUJBQXVCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDekcsT0FBTyxDQUFDLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxtQkFBbUIsS0FBSyxRQUFRLENBQUM7SUFDN0csQ0FBQzs7Ozs7SUFFRCxjQUFjLENBQUMsTUFBcUI7UUFDaEMsT0FBTyxDQUNILDBCQUEwQjtZQUMxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckQsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEYsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUN6QixDQUFDO0lBQ04sQ0FBQzs7Ozs7SUFFRCxVQUFVLENBQUMsTUFBcUI7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQzs7Ozs7SUFFRCxLQUFLLENBQUMsTUFBcUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkI7SUFDTCxDQUFDOzs7OztJQUVELEtBQUssQ0FBQyxDQUFhO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsQixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3hCLENBQUM7Ozs7O0lBRUQsVUFBVSxDQUFDLEtBQVk7UUFDbkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLENBQUM7Ozs7SUFFRCxrQkFBa0I7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1lBRXZDLFVBQVU7OztZQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7OzBCQUNQLE1BQU0sR0FBa0IsSUFBSSxDQUFDLE1BQU0sWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNO29CQUN6RixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3ZDO3FCQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2lCQUNyQztnQkFDRCxVQUFVOzs7Z0JBQUMsR0FBRyxFQUFFOztvQkFDWixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ25CLFlBQUEsSUFBSSxDQUFDLG1CQUFtQiwwQ0FBRSxVQUFVLDBDQUFFLGNBQWMsR0FBRztnQkFDM0QsQ0FBQyxHQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxFQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QjthQUFNO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RDLFVBQVU7OztZQUFDLEdBQUcsRUFBRTtnQkFDWixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUNoQyxDQUFDLEdBQUUsT0FBTyxDQUFDLENBQUM7U0FDZjtRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQyxDQUFDOzs7Ozs7SUFFRCxXQUFXLENBQUMsTUFBb0MsRUFBRSxNQUFjOztRQUM1RCxPQUFPLENBQ0gsSUFBSSxDQUFDLFNBQVMsWUFBWSxXQUFXO1lBQ3JDLE9BQUEsSUFBSSxDQUFDLFNBQVMsMENBQUcsTUFBTSxDQUFDLFVBQVUsY0FBYSxXQUFXO1lBQzFELE9BQUEsSUFBSSxDQUFDLFNBQVMsMENBQUcsTUFBTSxjQUFhLFdBQVcsQ0FDbEQsQ0FBQztJQUNOLENBQUM7Ozs7OztJQUVELFdBQVcsQ0FBQyxNQUFvQyxFQUFFLE1BQWM7UUFDNUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVM7WUFDL0UsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwQixDQUFDOzs7O0lBRUQsV0FBVzs7UUFDUCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxhQUFhLEVBQzdDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRTtZQUNyRCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BCLENBQUM7Ozs7OztJQUVPLGFBQWEsQ0FBQyxNQUFxQjtRQUN2QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxJQUNJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDZCxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQ3BCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUMxRTtZQUNFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDOzs7Ozs7O0lBRU8sZUFBZSxDQUFDLE1BQTBCLEVBQUUsTUFBMEI7O1FBQzFFLElBQ0ksQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUM7WUFDeEYsTUFBTSxLQUFLLE1BQU0sRUFDbkI7WUFDRSxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQ0ksSUFBSSxDQUFDLFFBQVEsV0FDYixDQUFDLG1CQUFBLE1BQU0sRUFBa0IsQ0FBQywwQ0FBRSxNQUFNLENBQUEsV0FDbEMsQ0FBQyxtQkFBQSxNQUFNLEVBQWtCLENBQUMsMENBQUUsTUFBTSxDQUFBO1lBQ2xDLENBQUMsbUJBQUEsTUFBTSxFQUFrQixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsbUJBQUEsTUFBTSxFQUFrQixDQUFDLENBQUMsTUFBTSxFQUN6RTtZQUNFLEtBQUssTUFBTSxFQUFFLElBQUksbUJBQUEsTUFBTSxFQUFrQixFQUFFOztzQkFDakMsSUFBSSxHQUFHLENBQUMsbUJBQUEsTUFBTSxFQUFrQixDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDUCxPQUFPLElBQUksQ0FBQztpQkFDZjthQUNKO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7OztJQUVPLGtCQUFrQjtRQUN0QixVQUFVOzs7UUFBQyxHQUFHLEVBQUU7O2dCQUNSLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSztZQUN2QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUN6QyxNQUFNLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEU7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ2xHLE1BQU0sR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNwRjtZQUVELElBQUksWUFBWSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ25FLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3JFO1lBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNDLENBQUMsRUFBQyxDQUFDO0lBQ1AsQ0FBQzs7Ozs7O0lBRU8sY0FBYyxDQUFDLENBQWE7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBQSxDQUFDLENBQUMsTUFBTSxFQUFlLEVBQUUsV0FBVyxDQUFDLEVBQUU7WUFDbkUsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLG1CQUFBLENBQUMsQ0FBQyxNQUFNLEVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFO2dCQUN6RixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUM3QjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQUEsQ0FBQyxDQUFDLE1BQU0sRUFBZSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ3BCO1NBQ0o7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQUEsQ0FBQyxDQUFDLE1BQU0sRUFBZSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDcEI7SUFDTCxDQUFDOzs7OztJQUVPLFNBQVM7UUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUNqQyxDQUFDOzs7Ozs7O0lBRU8scUJBQXFCLENBQUMsT0FBb0IsRUFBRSxRQUFnQjtRQUNoRSxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDO0lBQ3BFLENBQUM7Ozs7Ozs7SUFFTyxrQkFBa0IsQ0FBQyxPQUFvQixFQUFFLEVBQVU7UUFDdkQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUMzRCxDQUFDOzs7Ozs7O0lBRU8sdUJBQXVCLENBQUMsT0FBb0IsRUFBRSxRQUFnQjtRQUNsRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUM1RCxPQUFPLE9BQU8sQ0FBQztTQUNsQjtRQUNELE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4RyxDQUFDOzs7Ozs7O0lBRU8sb0JBQW9CLENBQUMsT0FBb0IsRUFBRSxFQUFVO1FBQ3pELElBQUksT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbkIsT0FBTyxPQUFPLENBQUM7U0FDbEI7UUFDRCxPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0YsQ0FBQzs7Ozs7OztJQUVPLGNBQWMsQ0FBQyxPQUFvQixFQUFFLFVBQW9CO1FBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUU7WUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN2QyxPQUFPLEtBQUssQ0FBQzthQUNoQjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQzs7OztJQUVELE9BQU87UUFDSCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ0osSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3ZGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3JCO0lBQ0wsQ0FBQzs7Ozs7SUFFTyxNQUFNO1FBQ1YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7Ozs7O0lBRU8sUUFBUTtRQUNaLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDbkcsQ0FBQzs7Ozs7O0lBRU8sc0JBQXNCLENBQUMsTUFBcUI7UUFDaEQsSUFBSSxNQUFNLEVBQUU7WUFDUixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7O2tCQUM1QixVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJOzs7O1lBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFDO1lBQzVGLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQzs7c0JBQzVCLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixFQUFFOztzQkFDNUQsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRTtnQkFDekUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUM7YUFDN0U7U0FDSjtJQUNMLENBQUM7Ozs7O0lBRU8sYUFBYTtRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7O2tCQUNkLE1BQU0sR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQzVFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkI7SUFDTCxDQUFDOzs7OztJQUVELE1BQU0sQ0FBQyxNQUE0Qjs7WUFDM0IsS0FBVTtRQUNkLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtZQUNqQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7O3NCQUNULE9BQU8sR0FBRyxtQkFBQSxJQUFJLENBQUMsTUFBTSxFQUFtQjs7c0JBQ3hDLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUzs7OztnQkFBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBQztnQkFDaEUsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDeEI7cUJBQU07b0JBQ0gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzVCO2dCQUNELEtBQUssR0FBRyxDQUFDLG1CQUFBLElBQUksQ0FBQyxNQUFNLEVBQW1CLENBQUMsQ0FBQyxHQUFHOzs7O2dCQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBQyxDQUFDO2FBQ2hFO2lCQUFNO2dCQUNILElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUNyQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTt3QkFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO3FCQUNqQztpQkFDSjtnQkFDRCxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDN0I7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDdEI7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3pDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzdCO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QjthQUFNO1lBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDdkI7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLEtBQUs7WUFDWixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQ3pGLENBQUMsQ0FBQztJQUNQLENBQUM7Ozs7O0lBRUQsT0FBTyxDQUFDLENBQWdCO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3RCO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN0QjthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUN4QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3RCO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNsRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQzs7Ozs7SUFFRCxPQUFPLENBQUMsQ0FBZ0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNqRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdEI7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNyQjtJQUNMLENBQUM7Ozs7OztJQUVELE9BQU8sQ0FBQyxNQUFjLEVBQUUsSUFBbUI7UUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7Ozs7O0lBRUQsWUFBWSxDQUFDLENBQVE7UUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLG1CQUFBLENBQUMsQ0FBQyxNQUFNLEVBQW9CLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQzs7Ozs7SUFFRCxVQUFVLENBQUMsTUFBcUI7UUFDNUIsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RSxDQUFDOzs7OztJQUVELFVBQVUsQ0FBQyxNQUFxQjtRQUM1QixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQzlDLENBQUM7Ozs7OztJQUVELGVBQWUsQ0FBQyxDQUFhLEVBQUUsTUFBcUI7UUFDaEQsWUFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWxELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDekMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDN0I7O2NBRUssS0FBSyxHQUFHLENBQUMsbUJBQUEsSUFBSSxDQUFDLE1BQU0sRUFBbUIsQ0FBQyxDQUFDLEdBQUc7Ozs7UUFBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUM7UUFFbEUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QjthQUFNO1lBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDdkI7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLEtBQUs7WUFDWixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQ3pGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ25CLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLEtBQUs7WUFDWixhQUFhLEVBQUUsTUFBTTtTQUN4QixDQUFDLENBQUM7UUFFSCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXBCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1NBQzFDO0lBQ0wsQ0FBQzs7Ozs7O0lBTUQsVUFBVSxDQUFDLEtBQVU7UUFDakIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Ozs7Ozs7OztJQVNELGdCQUFnQixDQUFDLEVBQXdCO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7Ozs7Ozs7OztJQVNELGlCQUFpQixDQUFDLEVBQVk7UUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQzs7Ozs7OztJQU9ELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7Ozs7O0lBRUQsUUFBUSxDQUFDLEdBQWtCO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2IsU0FBUyxFQUFFLElBQUk7WUFDZixHQUFHO1lBQ0gsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQy9CLENBQUMsQ0FBQztJQUNQLENBQUM7Ozs7SUFFRCxhQUFhOztjQUNILFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTzs7Y0FDbEQsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPOztjQUNsRCxXQUFXLEdBQ2IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztZQUMxRCxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFFcEQsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDOzs7Ozs7O0lBRU8sUUFBUSxDQUFDLEtBQW9CLEVBQUUsT0FBNEIsRUFBRTtRQUNqRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDOzs7Ozs7SUFFTyxPQUFPLENBQUMsS0FBb0I7O1lBQzVCLElBQXFCO1FBRXpCLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDekIsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDcEI7YUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDN0MsSUFBSSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUNqQzthQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN2QyxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzNCO2FBQU07WUFDSCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDMUI7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7Ozs7O0lBRU8sTUFBTSxDQUFDLElBQXFCLEVBQUUsT0FBNEIsRUFBRTtRQUNoRSxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3ZFLENBQUM7Ozs7Ozs7O0lBTU8sb0JBQW9CLENBQUMsS0FBa0I7UUFDM0MsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLEVBQUU7O2tCQUNsRCxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDcEMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ3ZDO2lCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsaURBQWlEO29CQUNuRSxJQUFJLE9BQU8sRUFBRTs7OzhCQUVILGNBQWMsR0FBUSxZQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3QkFDNUYsY0FBYyxDQUFDLEdBQUc7Ozs7d0JBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUM7cUJBQ2pEO2lCQUNKO3FCQUFNO29CQUNILElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDakU7YUFDSjtpQkFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUM7WUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDMUM7SUFDTCxDQUFDOzs7Ozs7SUFHTyxzQkFBc0I7O2NBQ3BCLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSztRQUUzQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxRQUFRLEVBQUU7WUFDeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQztZQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzdCO0lBQ0wsQ0FBQzs7Ozs7O0lBRU8sc0JBQXNCLENBQUMsS0FBVTtRQUNyQyxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsS0FBSyxPQUFPLENBQUM7SUFDbkQsQ0FBQzs7Ozs7SUFFTywrQkFBK0I7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN6QixVQUFVOzs7WUFBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFO29CQUNwRCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDMUM7WUFDTCxDQUFDLEVBQUMsQ0FBQztTQUNOO2FBQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDL0I7SUFDTCxDQUFDOzs7Ozs7SUFFTyxNQUFNLENBQUMsS0FBYztRQUN6QixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEI7YUFBTSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7SUFDTCxDQUFDOzs7OztJQUVPLGVBQWU7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLE1BQU07WUFDeEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLE9BQU8sQ0FBQztJQUN4QyxDQUFDOzs7WUF6NEJKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsU0FBUztnQkFDbkIsbWhVQUF1Qzs7YUFFMUM7Ozs7WUF6QlEsYUFBYTtZQUdRLGlCQUFpQjtZQUdlLE1BQU0sdUJBb1QzRCxRQUFRO1lBcFRjLGtCQUFrQix1QkFxVHhDLFFBQVE7WUFyVGtDLFNBQVMsdUJBc1RuRCxJQUFJLFlBQUksUUFBUTt5Q0FDaEIsU0FBUyxTQUFDLFVBQVU7OzttQkEvUnhCLEtBQUs7K0JBSUwsS0FBSztrQ0FDTCxLQUFLOzBCQUNMLEtBQUs7a0NBQ0wsS0FBSzs2QkFDTCxLQUFLOzJCQUNMLEtBQUs7dUJBRUwsS0FBSztzQkFVTCxLQUFLO3dCQVNMLEtBQUs7OEJBR0wsS0FBSztxQ0FHTCxLQUFLO3FDQUdMLEtBQUs7NkJBR0wsS0FBSzswQkFTTCxLQUFLO3dCQUdMLEtBQUs7OEJBR0wsS0FBSztxQkFFTCxNQUFNO21CQUNOLE1BQU07b0JBQ04sTUFBTTtvQkFDTixNQUFNO21CQUNOLE1BQU07cUJBQ04sTUFBTTtxQkFDTixNQUFNOzJCQUNOLE1BQU07Z0NBbUNOLEtBQUs7aUJBV0wsS0FBSyxZQUNMLFdBQVcsU0FBQyxJQUFJO3VCQVNoQixLQUFLO3VCQVNMLEtBQUs7Z0NBU0wsS0FBSzt1QkFTTCxLQUFLO29CQVNMLEtBQUs7dUJBZUwsS0FBSzt5QkFZTCxLQUFLOzBCQVFMLFdBQVcsU0FBQyxtQkFBbUI7NEJBSy9CLFdBQVcsU0FBQyxnQkFBZ0I7MkJBSzVCLFdBQVcsU0FBQyxlQUFlOzJCQUszQixXQUFXLFNBQUMscUJBQXFCO2tDQWdDakMsU0FBUyxTQUFDLG1CQUFtQjt3QkFHN0IsU0FBUyxTQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7OEJBRXZDLFNBQVMsU0FBQyxTQUFTO3NCQUNuQixZQUFZLFNBQUMsUUFBUTswQkFDckIsU0FBUyxTQUFDLGFBQWE7dUJBQ3ZCLFNBQVMsU0FBQyxVQUFVOzs7O0lBM1ByQix3QkFBbUI7O0lBT25CLG1DQUE4Qjs7SUFDOUIsc0NBQThEOztJQUM5RCw4QkFBNkI7O0lBQzdCLHNDQUFzQzs7SUFDdEMsaUNBQTRCOztJQUM1QiwrQkFBNEQ7Ozs7O0lBcUI1RCw0QkFBbUU7Ozs7O0lBR25FLGtDQUFpQzs7Ozs7SUFHakMseUNBQXNDOzs7OztJQUd0Qyx5Q0FBc0M7Ozs7O0lBWXRDLDhCQUE4Qzs7Ozs7SUFHOUMsNEJBQTJFOzs7OztJQUczRSxrQ0FBbUM7O0lBRW5DLHlCQUE4RTs7SUFDOUUsdUJBQTZDOztJQUM3Qyx3QkFBOEM7O0lBQzlDLHdCQUE4Qzs7SUFDOUMsdUJBQTZDOztJQUM3Qyx5QkFBOEU7O0lBQzlFLHlCQUEwRDs7SUFDMUQsK0JBQW9GOztJQUVwRix5QkFBc0Q7O0lBQ3RELHlCQUFlOztJQUNmLDhCQUFvQjs7Ozs7SUFHcEIsMEJBQWdCOztJQUVoQiwrQkFBMEI7O0lBMEkxQiwrQkFBcUI7O0lBQ3JCLGdDQUFzQjs7SUFDdEIsK0JBQXlCOztJQUN6QixnQ0FBMEI7Ozs7O0lBc0IxQixxQ0FBNkM7Ozs7O0lBRTdDLHNDQUNpRDs7Ozs7SUFFakQsNEJBQzJDOzs7OztJQUMzQyxrQ0FBdUU7Ozs7O0lBQ3ZFLDBCQUErRDs7Ozs7SUFDL0QsOEJBQXVFOzs7OztJQUN2RSwyQkFBaUU7Ozs7O0lBRWpFLGdDQUE4RDs7Ozs7SUFDOUQsa0NBQTZCOzs7OztJQUM3QixvQ0FBbUM7Ozs7O0lBRW5DLG1DQUFzQzs7Ozs7SUFNdEMsZ0NBQTRDOzs7Ozs7SUFHNUMsNEJBQTBCOzs7OztJQUUxQiw0QkFBMEI7Ozs7O0lBQzFCLDRCQUEwQjs7Ozs7SUFDMUIsNEJBQTBCOzs7OztJQUMxQiw0QkFBMEI7Ozs7O0lBQzFCLDJCQUF5Qjs7Ozs7SUFDekIsOEJBQTRCOzs7OztJQUM1QixxQ0FBbUM7Ozs7O0lBQ25DLGtDQUFnQzs7Ozs7SUFDaEMsb0NBQW1EOzs7OztJQUNuRCxzQkFBb0I7Ozs7O0lBQ3BCLHVCQUEyQzs7Ozs7SUFDM0MseUJBQW1DOzs7OztJQUNuQyx1Q0FBaUQ7Ozs7O0lBQ2pELGtDQUErQjs7Ozs7SUFDL0IsbUNBQWdEOzs7Ozs7SUFxQmhELDZCQUVFOzs7Ozs7SUFHRiw0QkFFRTs7Ozs7SUF6QkUsaUNBQXVDOzs7OztJQUN2QyxxQ0FBNkM7Ozs7O0lBQzdDLDhCQUF1Qzs7Ozs7SUFDdkMsbUNBQXdEOztJQUN4RCwyQkFBOEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENka0Nvbm5lY3RlZE92ZXJsYXksIENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSwgQ29ubmVjdGVkUG9zaXRpb24sIFZlcnRpY2FsQ29ubmVjdGlvblBvcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVmlld3BvcnRSdWxlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50UmVmLCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCwgQXR0cmlidXRlLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBEb0NoZWNrLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LFxuICAgIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgU2VsZiwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5nQ29udHJvbCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICcuL3NlbGVjdDItY29uc3QnO1xuaW1wb3J0IHtcbiAgICBTZWxlY3QyRGF0YSwgU2VsZWN0Mkdyb3VwLCBTZWxlY3QyT3B0aW9uLCBTZWxlY3QyUmVtb3ZlRXZlbnQsIFNlbGVjdDJTY3JvbGxFdmVudCwgU2VsZWN0MlNlYXJjaEV2ZW50LFxuICAgIFNlbGVjdDJVcGRhdGVFdmVudCwgU2VsZWN0MlVwZGF0ZVZhbHVlLCBTZWxlY3QyVmFsdWUsXG59IGZyb20gJy4vc2VsZWN0Mi1pbnRlcmZhY2VzJztcbmltcG9ydCB7IFNlbGVjdDJVdGlscyB9IGZyb20gJy4vc2VsZWN0Mi11dGlscyc7XG5cbmxldCBuZXh0VW5pcXVlSWQgPSAwO1xuXG5jb25zdCBkaXNwbGF5U2VhcmNoU3RhdHVzTGlzdCA9IFsnZGVmYXVsdCcsICdoaWRkZW4nLCAnYWx3YXlzJ107XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2VsZWN0MicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdDIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NlbGVjdDIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0MiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uRGVzdHJveSwgRG9DaGVjaywgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgX2RhdGE6IFNlbGVjdDJEYXRhO1xuXG4gICAgLyoqIGRhdGEgb2Ygb3B0aW9ucyAmIG9wdGlvbmdycHMgKi9cbiAgICBASW5wdXQoKSBzZXQgZGF0YShkYXRhOiBTZWxlY3QyRGF0YSkge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEoKTtcbiAgICB9XG4gICAgQElucHV0KCkgbWluQ2hhckZvclNlYXJjaCA9IDA7XG4gICAgQElucHV0KCkgZGlzcGxheVNlYXJjaFN0YXR1czogJ2RlZmF1bHQnIHwgJ2hpZGRlbicgfCAnYWx3YXlzJztcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGN1c3RvbVNlYXJjaEVuYWJsZWQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbGltaXRTZWxlY3Rpb24gPSAwO1xuICAgIEBJbnB1dCgpIGxpc3RQb3NpdGlvbjogJ2Fib3ZlJyB8ICdiZWxvdycgfCAnYXV0bycgPSAnYmVsb3cnO1xuXG4gICAgQElucHV0KClcbiAgICBnZXQgbXVsdGlwbGUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX211bHRpcGxlO1xuICAgIH1cbiAgICBzZXQgbXVsdGlwbGUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9tdWx0aXBsZSA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgICAgIHRoaXMubmdPbkluaXQoKTtcbiAgICB9XG5cbiAgICAvKiogdXNlIHRoZSBtYXRlcmlhbCBzdHlsZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG92ZXJsYXkoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXk7XG4gICAgfVxuICAgIHNldCBvdmVybGF5KHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheSA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIHVzZSB0aGUgbWF0ZXJpYWwgc3R5bGUgKi9cbiAgICBASW5wdXQoKSBzdHlsZU1vZGU6ICdtYXRlcmlhbCcgfCAnbm9TdHlsZScgfCAnZGVmYXVsdCcgPSAnZGVmYXVsdCc7XG5cbiAgICAvKiogbWVzc2FnZSB3aGVuIG5vIHJlc3VsdCAqL1xuICAgIEBJbnB1dCgpIG5vUmVzdWx0TWVzc2FnZTogc3RyaW5nO1xuXG4gICAgLyoqIGluZmluaXRlIHNjcm9sbCBkaXN0YW5jZSAqL1xuICAgIEBJbnB1dCgpIGluZmluaXRlU2Nyb2xsRGlzdGFuY2UgPSAxLjU7XG5cbiAgICAvKiogaW5maW5pdGUgc2Nyb2xsIGRpc3RhbmNlICovXG4gICAgQElucHV0KCkgaW5maW5pdGVTY3JvbGxUaHJvdHRsZSA9IDE1MDtcblxuICAgIC8qKiBpbmZpbml0ZSBzY3JvbGwgYWN0aXZhdGVkICovXG4gICAgQElucHV0KClcbiAgICBnZXQgaW5maW5pdGVTY3JvbGwoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luZmluaXRlU2Nyb2xsO1xuICAgIH1cbiAgICBzZXQgaW5maW5pdGVTY3JvbGwodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9pbmZpbml0ZVNjcm9sbCA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIHVzZSBpdCBmb3IgY2hhbmdlIHRoZSBwYXR0ZXJuIG9mIHRoZSBmaWx0ZXIgc2VhcmNoICovXG4gICAgQElucHV0KCkgZWRpdFBhdHRlcm46IChzdHI6IHN0cmluZykgPT4gc3RyaW5nO1xuXG4gICAgLyoqIHRlbXBsYXRlIGZvciBmb3JtYXRpbmcgKi9cbiAgICBASW5wdXQoKSB0ZW1wbGF0ZXM6IFRlbXBsYXRlUmVmPGFueT4gfCB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT4gfTtcblxuICAgIC8qKiB0aGUgbWF4IGhlaWdodCBvZiB0aGUgcmVzdWx0cyBjb250YWluZXIgd2hlbiBvcGVuaW5nIHRoZSBzZWxlY3QgKi9cbiAgICBASW5wdXQoKSByZXN1bHRNYXhIZWlnaHQgPSAnMjAwcHgnO1xuXG4gICAgQE91dHB1dCgpIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlVwZGF0ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG4gICAgQE91dHB1dCgpIG9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdDI+KCk7XG4gICAgQE91dHB1dCgpIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyPigpO1xuICAgIEBPdXRwdXQoKSBmb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyU2VhcmNoRXZlbnQ8U2VsZWN0MlVwZGF0ZVZhbHVlPj4oKTtcbiAgICBAT3V0cHV0KCkgc2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyU2Nyb2xsRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIHJlbW92ZU9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlJlbW92ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG5cbiAgICBvcHRpb246IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyT3B0aW9uW10gfCBudWxsID0gbnVsbDtcbiAgICBpc09wZW4gPSBmYWxzZTtcbiAgICBzZWFyY2hTdHlsZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZm9jdXNlZCBvciBub3QuICovXG4gICAgZm9jdXNlZCA9IGZhbHNlO1xuXG4gICAgZmlsdGVyZWREYXRhOiBTZWxlY3QyRGF0YTtcblxuICAgIGdldCBzZWxlY3QyT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyAodGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbltdKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdDJPcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gbnVsbCA6ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uKTtcbiAgICB9XG5cbiAgICBnZXQgc2VhcmNoVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJTZWFyY2hUZXh0O1xuICAgIH1cblxuICAgIHNldCBzZWFyY2hUZXh0KHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21TZWFyY2hFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5lbWl0KHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbHVlLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogdGV4dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5uZXJTZWFyY2hUZXh0ID0gdGV4dDtcbiAgICB9XG5cbiAgICAvKiogbWluaW1hbCBkYXRhIG9mIHNob3cgdGhlIHNlYXJjaCBmaWVsZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1pbkNvdW50Rm9yU2VhcmNoKCk6IG51bWJlciB8IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5Db3VudEZvclNlYXJjaDtcbiAgICB9XG5cbiAgICBzZXQgbWluQ291bnRGb3JTZWFyY2godmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICB0aGlzLl9taW5Db3VudEZvclNlYXJjaCA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVNlYXJjaEJveCgpO1xuICAgIH1cblxuICAgIC8qKiBVbmlxdWUgaWQgb2YgdGhlIGVsZW1lbnQuICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2lkJylcbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9XG4gICAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5faWQgPSB2YWx1ZSB8fCB0aGlzLl91aWQ7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgcmVxdWlyZWQuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgcmVxdWlyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgICB9XG4gICAgc2V0IHJlcXVpcmVkKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSB0aGlzLl9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSBoaWRkZW4uICovXG4gICAgQElucHV0KClcbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250cm9sID8gdGhpcy5fY29udHJvbC5kaXNhYmxlZCA6IHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgaXRlbXMgYXJlIGhpZGRlbiB3aGVuIGhhcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBoaWRlU2VsZWN0ZWRJdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVTZWxlY3RlZEl0ZW1zO1xuICAgIH1cbiAgICBzZXQgaGlkZVNlbGVjdGVkSXRlbXModmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9oaWRlU2VsZWN0ZWRJdGVtcyA9IHRoaXMuX2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgcmVhZG9ubHkuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgcmVhZG9ubHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkb25seTtcbiAgICB9XG4gICAgc2V0IHJlYWRvbmx5KHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSB0aGlzLl9jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgaW5wdXQgZWxlbWVudCdzIHZhbHVlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBTZWxlY3QyVXBkYXRlVmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMudGVzdFZhbHVlQ2hhbmdlKHRoaXMuX3ZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUYWIgaW5kZXggZm9yIHRoZSBzZWxlY3QyIGVsZW1lbnQuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgdGFiSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAtMSA6IHRoaXMuX3RhYkluZGV4O1xuICAgIH1cblxuICAgIHNldCB0YWJJbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl90YWJJbmRleCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIHJlc2V0IHdpdGggbm8gc2VsZWN0ZWQgdmFsdWUgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCByZXNldHRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzZXR0YWJsZTtcbiAgICB9XG4gICAgc2V0IHJlc2V0dGFibGUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9yZXNldHRhYmxlID0gdGhpcy5fY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1pbnZhbGlkJylcbiAgICBnZXQgYXJpYUludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0Vycm9yU3RhdGUoKTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1hdGVyaWFsJylcbiAgICBnZXQgY2xhc3NNYXRlcmlhbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVNb2RlID09PSAnbWF0ZXJpYWwnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mubm9zdHlsZScpXG4gICAgZ2V0IGNsYXNzTm9zdHlsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVNb2RlID09PSAnbm9TdHlsZSc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZWxlY3QyLWFib3ZlJylcbiAgICBnZXQgc2VsZWN0MmFib3ZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMub3ZlcmxheSA/IHRoaXMubGlzdFBvc2l0aW9uID09PSAnYWJvdmUnIDogdGhpcy5faXNBYm9iZU92ZXJsYXkoKTtcbiAgICB9XG5cbiAgICBvdmVybGF5V2lkdGg6IG51bWJlcjtcbiAgICBvdmVybGF5SGVpZ2h0OiBudW1iZXI7XG4gICAgX3RyaWdnZXJSZWN0OiBDbGllbnRSZWN0O1xuICAgIF9kcm9wZG93blJlY3Q6IENsaWVudFJlY3Q7XG5cbiAgICBnZXQgX3Bvc2l0aW9ucygpOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICAgICAgaWYgKHRoaXMubGlzdFBvc2l0aW9uID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX21pbkNvdW50Rm9yU2VhcmNoPzogbnVtYmVyIHwgc3RyaW5nO1xuXG4gICAgQFZpZXdDaGlsZChDZGtDb25uZWN0ZWRPdmVybGF5KVxuICAgIHByaXZhdGUgY2RrQ29ubmVjdGVkT3ZlcmxheTogQ2RrQ29ubmVjdGVkT3ZlcmxheTtcblxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdGlvbicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb246IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoJ3Jlc3VsdHMnKSBwcml2YXRlIHJlc3VsdENvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgQFZpZXdDaGlsZHJlbigncmVzdWx0JykgcHJpdmF0ZSByZXN1bHRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXQnKSBwcml2YXRlIHNlYXJjaElucHV0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkKCdkcm9wZG93bicpIHByaXZhdGUgZHJvcGRvd246IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgcHJpdmF0ZSBob3ZlcmluZ1ZhbHVlOiBTZWxlY3QyVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgICBwcml2YXRlIGlubmVyU2VhcmNoVGV4dCA9ICcnO1xuICAgIHByaXZhdGUgaXNTZWFyY2hib3hIaWRkZW46IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHNlbGVjdGlvbkVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBnZXQgcmVzdWx0c0VsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBUYWIgaW5kZXggZm9yIHRoZSBlbGVtZW50LiAqL1xuICAgIHByaXZhdGUgX3RhYkluZGV4OiBudW1iZXI7XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3JlcXVpcmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfcmVhZG9ubHkgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9tdWx0aXBsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX292ZXJsYXkgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yZXNldHRhYmxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaGlkZVNlbGVjdGVkSXRlbXMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jbGlja0RldGVjdGlvbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NsaWNrRGV0ZWN0aW9uRmM6IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2lkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfdWlkID0gYHNlbGVjdDItJHtuZXh0VW5pcXVlSWQrK31gO1xuICAgIHByaXZhdGUgX3ZhbHVlOiBTZWxlY3QyVXBkYXRlVmFsdWU7XG4gICAgcHJpdmF0ZSBfcHJldmlvdXNOYXRpdmVWYWx1ZTogU2VsZWN0MlVwZGF0ZVZhbHVlO1xuICAgIHByaXZhdGUgX2luZmluaXRlU2Nyb2xsID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9vdmVybGF5UG9zaXRpb246IFZlcnRpY2FsQ29ubmVjdGlvblBvcztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgX3ZpZXdwb3J0UnVsZXI6IFZpZXdwb3J0UnVsZXIsXG4gICAgICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfcGFyZW50Rm9ybTogTmdGb3JtLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9wYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICAgICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgX2NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICAgICAgQEF0dHJpYnV0ZSgndGFiaW5kZXgnKSB0YWJJbmRleDogc3RyaW5nLFxuICAgICkge1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5pZDtcbiAgICAgICAgdGhpcy5fdGFiSW5kZXggPSBwYXJzZUludCh0YWJJbmRleCwgMTApIHx8IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbGlja0RldGVjdGlvbkZjID0gdGhpcy5jbGlja0RldGVjdGlvbi5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHNlbGVjdCBoYXMgYmVlbiB0b3VjaGVkICovXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfTtcblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHZhbHVlIGNoYW5nZXMgKi9cbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9O1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKDEwMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbnNCeVZhbHVlKFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLnZhbHVlIDogdGhpcy52YWx1ZSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nVmFsdWUgPSB0aGlzLnZhbHVlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVNlYXJjaEJveCgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5LnBvc2l0aW9uQ2hhbmdlLnN1YnNjcmliZSgocG9zQ2hhbmdlOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RQb3NpdGlvbiA9PT0gJ2F1dG8nICYmXG4gICAgICAgICAgICAgICAgcG9zQ2hhbmdlLmNvbm5lY3Rpb25QYWlyPy5vcmlnaW5ZICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVBvc2l0aW9uICE9PSBwb3NDaGFuZ2UuY29ubmVjdGlvblBhaXIub3JpZ2luWVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlQb3NpdGlvbiA9IHBvc0NoYW5nZS5jb25uZWN0aW9uUGFpci5vcmlnaW5ZO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25FbGVtZW50ID0gdGhpcy5zZWxlY3Rpb24ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVjdCgpO1xuICAgIH1cblxuICAgIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTZWFyY2hCb3goKTtcbiAgICAgICAgdGhpcy5fZGlydHlDaGVja05hdGl2ZVZhbHVlKCk7XG4gICAgICAgIGlmICh0aGlzLl90cmlnZ2VyUmVjdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheVdpZHRoICE9PSB0aGlzLl90cmlnZ2VyUmVjdC53aWR0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVdpZHRoID0gdGhpcy5fdHJpZ2dlclJlY3Qud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fZHJvcGRvd25SZWN0Py5oZWlnaHQgPiAwICYmIHRoaXMub3ZlcmxheUhlaWdodCAhPT0gdGhpcy5fZHJvcGRvd25SZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheUhlaWdodCA9IHRoaXMubGlzdFBvc2l0aW9uID09PSAnYXV0bycgPyB0aGlzLl9kcm9wZG93blJlY3QuaGVpZ2h0IDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrRGV0ZWN0aW9uRmMpO1xuICAgIH1cblxuICAgIHVwZGF0ZVNlYXJjaEJveCgpIHtcbiAgICAgICAgY29uc3QgaGlkZGVuID0gdGhpcy5jdXN0b21TZWFyY2hFbmFibGVkXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IFNlbGVjdDJVdGlscy5pc1NlYXJjaGJveEhpZGRleCh0aGlzLl9kYXRhLCB0aGlzLl9taW5Db3VudEZvclNlYXJjaCk7XG4gICAgICAgIGlmICh0aGlzLmlzU2VhcmNoYm94SGlkZGVuICE9PSBoaWRkZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaXNTZWFyY2hib3hIaWRkZW4gPSBoaWRkZW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoaWRlU2VhcmNoKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkaXNwbGF5U2VhcmNoU3RhdHVzID1cbiAgICAgICAgICAgIGRpc3BsYXlTZWFyY2hTdGF0dXNMaXN0LmluZGV4T2YodGhpcy5kaXNwbGF5U2VhcmNoU3RhdHVzKSA+IC0xID8gdGhpcy5kaXNwbGF5U2VhcmNoU3RhdHVzIDogJ2RlZmF1bHQnO1xuICAgICAgICByZXR1cm4gKGRpc3BsYXlTZWFyY2hTdGF0dXMgPT09ICdkZWZhdWx0JyAmJiB0aGlzLmlzU2VhcmNoYm94SGlkZGVuKSB8fCBkaXNwbGF5U2VhcmNoU3RhdHVzID09PSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBnZXRPcHRpb25TdHlsZShvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbiAnICtcbiAgICAgICAgICAgIChvcHRpb24uaGlkZSA/ICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbi0taGlkZSAnIDogJycpICtcbiAgICAgICAgICAgIChvcHRpb24udmFsdWUgPT09IHRoaXMuaG92ZXJpbmdWYWx1ZSA/ICdzZWxlY3QyLXJlc3VsdHNfX29wdGlvbi0taGlnaGxpZ2h0ZWQgJyA6ICcnKSArXG4gICAgICAgICAgICAob3B0aW9uLmNsYXNzZXMgfHwgJycpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbW91c2VlbnRlcihvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJpbmdWYWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsaWNrKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBpZiAodGhpcy50ZXN0U2VsZWN0aW9uKG9wdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KG9wdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldChlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0KG51bGwpO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBwcmV2Q2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICB0b2dnbGVPcGVuQW5kQ2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9jdXModHJ1ZSk7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuXG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5pbm5lclNlYXJjaFRleHQgPSAnJztcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c1NlYXJjaGJveE9yUmVzdWx0c0VsZW1lbnQoKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbjogU2VsZWN0Mk9wdGlvbiA9IHRoaXMub3B0aW9uIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLm9wdGlvblswXSA6IHRoaXMub3B0aW9uO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbEZyb21PcHRpb24ob3B0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdWx0c0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXk/Lm92ZXJsYXlSZWY/LnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vcGVuLmVtaXQodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc09wZW4gJiYgIXRoaXMuX2NsaWNrRGV0ZWN0aW9uKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrRGV0ZWN0aW9uRmMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0RldGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGhhc1RlbXBsYXRlKG9wdGlvbjogU2VsZWN0Mk9wdGlvbiB8IFNlbGVjdDJHcm91cCwgZGVmYXV0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgfHxcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzPy5bb3B0aW9uLnRlbXBsYXRlSWRdIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgfHxcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzPy5bZGVmYXV0XSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0VGVtcGxhdGUob3B0aW9uOiBTZWxlY3QyT3B0aW9uIHwgU2VsZWN0Mkdyb3VwLCBkZWZhdXQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNUZW1wbGF0ZShvcHRpb24sIGRlZmF1dClcbiAgICAgICAgICAgID8gdGhpcy50ZW1wbGF0ZXNbb3B0aW9uLnRlbXBsYXRlSWRdIHx8IHRoaXMudGVtcGxhdGVzW2RlZmF1dF0gfHwgdGhpcy50ZW1wbGF0ZXNcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRyaWdnZXJSZWN0KCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyUmVjdCA9IHRoaXMuc2VsZWN0aW9uRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5fZHJvcGRvd25SZWN0ID0gdGhpcy5kcm9wZG93bj8ubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgPyB0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGVzdFNlbGVjdGlvbihvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKG9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMubXVsdGlwbGUgfHxcbiAgICAgICAgICAgICF0aGlzLmxpbWl0U2VsZWN0aW9uIHx8XG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgJiYgdGhpcy5fdmFsdWUubGVuZ3RoIDwgdGhpcy5saW1pdFNlbGVjdGlvbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0ZXN0VmFsdWVDaGFuZ2UodmFsdWUxOiBTZWxlY3QyVXBkYXRlVmFsdWUsIHZhbHVlMjogU2VsZWN0MlVwZGF0ZVZhbHVlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICgodmFsdWUxID09PSBudWxsIHx8IHZhbHVlMSA9PT0gdW5kZWZpbmVkKSAmJiAodmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdW5kZWZpbmVkKSkgfHxcbiAgICAgICAgICAgIHZhbHVlMSA9PT0gdmFsdWUyXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGUgJiZcbiAgICAgICAgICAgICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pPy5sZW5ndGggJiZcbiAgICAgICAgICAgICh2YWx1ZTIgYXMgU2VsZWN0MlZhbHVlW10pPy5sZW5ndGggJiZcbiAgICAgICAgICAgICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pLmxlbmd0aCA9PT0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlMSBvZiB2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ID0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkuaW5kZXhPZihlMSkgPiAtMTtcbiAgICAgICAgICAgICAgICBpZiAoIXRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRmlsdGVyZWREYXRhKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9kYXRhO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5oaWRlU2VsZWN0ZWRJdGVtcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbGVjdDJVdGlscy5nZXRGaWx0ZXJlZFNlbGVjdGVkRGF0YShyZXN1bHQsIHRoaXMub3B0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1c3RvbVNlYXJjaEVuYWJsZWQgJiYgdGhpcy5zZWFyY2hUZXh0ICYmIHRoaXMuc2VhcmNoVGV4dC5sZW5ndGggPj0gK3RoaXMubWluQ2hhckZvclNlYXJjaCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbGVjdDJVdGlscy5nZXRGaWx0ZXJlZERhdGEocmVzdWx0LCB0aGlzLnNlYXJjaFRleHQsIHRoaXMuZWRpdFBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoU2VsZWN0MlV0aWxzLnZhbHVlSXNOb3RJbkZpbHRlcmVkRGF0YShyZXN1bHQsIHRoaXMuaG92ZXJpbmdWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvdmVyaW5nVmFsdWUgPSBTZWxlY3QyVXRpbHMuZ2V0Rmlyc3RBdmFpbGFibGVPcHRpb24ocmVzdWx0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSByZXN1bHQ7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGlja0RldGVjdGlvbihlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pZlBhcmVudENvbnRhaW5zQ2xhc3MoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQsICdzZWxlY3Rpb24nKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuICYmICF0aGlzLmlmUGFyZW50Q29udGFpbnNDbGFzcyhlLnRhcmdldCBhcyBIVE1MRWxlbWVudCwgJ3NlbGVjdDItZHJvcGRvd24nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlT3BlbkFuZENsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuaWZQYXJlbnRDb250YWluc0lkKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB0aGlzLl9pZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrRXhpdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNPcGVuICYmICF0aGlzLmlmUGFyZW50Q29udGFpbnNJZChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5faWQpKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5BbmRDbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5jbGlja0V4aXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2xpY2tFeGl0KCkge1xuICAgICAgICB0aGlzLl9mb2N1cyhmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xpY2tEZXRlY3Rpb25GYyk7XG4gICAgICAgIHRoaXMuX2NsaWNrRGV0ZWN0aW9uID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpZlBhcmVudENvbnRhaW5zQ2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNzc0NsYXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFyZW50RWxlbWVudEJ5Q2xhc3MoZWxlbWVudCwgY3NzQ2xhc3MpICE9PSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgaWZQYXJlbnRDb250YWluc0lkKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmVudEVsZW1lbnRCeUlkKGVsZW1lbnQsIGlkKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhcmVudEVsZW1lbnRCeUNsYXNzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjc3NDbGFzczogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbkNsYXNzZXMoZWxlbWVudCwgY3NzQ2xhc3MudHJpbSgpLnNwbGl0KC9cXHMrLykpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudC5wYXJlbnRFbGVtZW50ID8gdGhpcy5nZXRQYXJlbnRFbGVtZW50QnlDbGFzcyhlbGVtZW50LnBhcmVudEVsZW1lbnQsIGNzc0NsYXNzKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQYXJlbnRFbGVtZW50QnlJZChlbGVtZW50OiBIVE1MRWxlbWVudCwgaWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGlmIChlbGVtZW50LmlkID09PSBpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucGFyZW50RWxlbWVudCA/IHRoaXMuZ2V0UGFyZW50RWxlbWVudEJ5SWQoZWxlbWVudC5wYXJlbnRFbGVtZW50LCBpZCkgOiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29udGFpbkNsYXNzZXMoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNzc0NsYXNzZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNzc0NsYXNzIG9mIGNzc0NsYXNzZXMpIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY3NzQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvY3VzaW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9jdXModHJ1ZSk7XG4gICAgfVxuXG4gICAgZm9jdXNvdXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkVsZW1lbnQgJiYgIXRoaXMuc2VsZWN0aW9uRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdDItZm9jdXNlZCcpKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyhmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZVVwKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbEZyb21PcHRpb24oU2VsZWN0MlV0aWxzLmdldFByZXZpb3VzT3B0aW9uKHRoaXMuZmlsdGVyZWREYXRhLCB0aGlzLmhvdmVyaW5nVmFsdWUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmVEb3duKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbEZyb21PcHRpb24oU2VsZWN0MlV0aWxzLmdldE5leHRPcHRpb24odGhpcy5maWx0ZXJlZERhdGEsIHRoaXMuaG92ZXJpbmdWYWx1ZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5ob3ZlcmluZ1ZhbHVlID0gb3B0aW9uLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IHRoaXMucmVzdWx0cy5maW5kKHIgPT4gci5uYXRpdmVFbGVtZW50LmlubmVyVGV4dC50cmltKCkgPT09IG9wdGlvbi5sYWJlbCk7XG4gICAgICAgICAgICBpZiAoZG9tRWxlbWVudCAmJiB0aGlzLnJlc3VsdHNFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RDbGllbnRSZWN0ID0gdGhpcy5yZXN1bHRzRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25DbGllbnRSZWN0ID0gZG9tRWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c0VsZW1lbnQuc2Nyb2xsVG9wID0gb3B0aW9uQ2xpZW50UmVjdC50b3AgLSBsaXN0Q2xpZW50UmVjdC50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEJ5RW50ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmhvdmVyaW5nVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IFNlbGVjdDJVdGlscy5nZXRPcHRpb25CeVZhbHVlKHRoaXMuX2RhdGEsIHRoaXMuaG92ZXJpbmdWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdChvcHRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0KG9wdGlvbjogU2VsZWN0Mk9wdGlvbiB8IG51bGwpIHtcbiAgICAgICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgICAgIGlmIChvcHRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9uIGFzIFNlbGVjdDJPcHRpb25bXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wID0+IG9wLnZhbHVlID09PSBvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW10pLm1hcChvcCA9PiBvcC52YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5vcHRpb24udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLmhpZGVTZWxlY3RlZEl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZS5lbWl0KHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb24pID8gdGhpcy5vcHRpb24gOiB0aGlzLm9wdGlvbiA/IFt0aGlzLm9wdGlvbl0gOiBudWxsLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBrZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Rlc3RLZXkoZSwgWydBcnJvd0Rvd24nLCA0MF0pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVEb3duKCk7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGVzdEtleShlLCBbJ0Fycm93VXAnLCAzOF0pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVVcCgpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZSwgWydFbnRlcicsIDEzXSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QnlFbnRlcigpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZSwgWydFc2NhcGUnLCAnVGFiJywgOSwgMjddKSAmJiB0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9wZW5LZXkoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5fdGVzdEtleShlLCBbJ0Fycm93RG93bicsICdBcnJvd1VwJywgJ0VudGVyJywgNDAsIDM4LCAxM10pKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5BbmRDbG9zZSgpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZSwgWydFc2NhcGUnLCAnVGFiJywgOSwgMjddKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFja0J5KF9pbmRleDogbnVtYmVyLCBpdGVtOiBTZWxlY3QyT3B0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuXG4gICAgc2VhcmNoVXBkYXRlKGU6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEoKTtcbiAgICB9XG5cbiAgICBpc1NlbGVjdGVkKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICByZXR1cm4gU2VsZWN0MlV0aWxzLmlzU2VsZWN0ZWQodGhpcy5vcHRpb24sIG9wdGlvbiwgdGhpcy5tdWx0aXBsZSk7XG4gICAgfVxuXG4gICAgaXNEaXNhYmxlZChvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi5kaXNhYmxlZCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgcmVtb3ZlU2VsZWN0aW9uKGU6IE1vdXNlRXZlbnQsIG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBTZWxlY3QyVXRpbHMucmVtb3ZlU2VsZWN0aW9uKHRoaXMub3B0aW9uLCBvcHRpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuaGlkZVNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW10pLm1hcChvcCA9PiBvcC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZS5lbWl0KHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb24pID8gdGhpcy5vcHRpb24gOiB0aGlzLm9wdGlvbiA/IFt0aGlzLm9wdGlvbl0gOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZW1vdmVPcHRpb24uZW1pdCh7XG4gICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICByZW1vdmVkT3B0aW9uOiBvcHRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzU2VhcmNoYm94T3JSZXN1bHRzRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbW9kZWwgdmFsdWUuIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICovXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzZWxlY3QncyB2YWx1ZVxuICAgICAqIGNoYW5nZXMgZnJvbSB1c2VyIGlucHV0LiBQYXJ0IG9mIHRoZSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgICAgKiByZXF1aXJlZCB0byBpbnRlZ3JhdGUgd2l0aCBBbmd1bGFyJ3MgY29yZSBmb3JtcyBBUEkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc2VsZWN0IGlzIGJsdXJyZWRcbiAgICAgKiBieSB0aGUgdXNlci4gUGFydCBvZiB0aGUgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlIHJlcXVpcmVkXG4gICAgICogdG8gaW50ZWdyYXRlIHdpdGggQW5ndWxhcidzIGNvcmUgZm9ybXMgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gdG91Y2hlZC5cbiAgICAgKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgICogQHBhcmFtIGlzRGlzYWJsZWRcbiAgICAgKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgb25TY3JvbGwod2F5OiAndXAnIHwgJ2Rvd24nKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsLmVtaXQoe1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgd2F5LFxuICAgICAgICAgICAgc2VhcmNoOiB0aGlzLmlubmVyU2VhcmNoVGV4dCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2lzRXJyb3JTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbnZhbGlkID0gdGhpcy5fY29udHJvbCAmJiB0aGlzLl9jb250cm9sLmludmFsaWQ7XG4gICAgICAgIGNvbnN0IGlzVG91Y2hlZCA9IHRoaXMuX2NvbnRyb2wgJiYgdGhpcy5fY29udHJvbC50b3VjaGVkO1xuICAgICAgICBjb25zdCBpc1N1Ym1pdHRlZCA9XG4gICAgICAgICAgICAodGhpcy5fcGFyZW50Rm9ybUdyb3VwICYmIHRoaXMuX3BhcmVudEZvcm1Hcm91cC5zdWJtaXR0ZWQpIHx8XG4gICAgICAgICAgICAodGhpcy5fcGFyZW50Rm9ybSAmJiB0aGlzLl9wYXJlbnRGb3JtLnN1Ym1pdHRlZCk7XG5cbiAgICAgICAgcmV0dXJuICEhKGlzSW52YWxpZCAmJiAoaXNUb3VjaGVkIHx8IGlzU3VibWl0dGVkKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdGVzdEtleShldmVudDogS2V5Ym9hcmRFdmVudCwgcmVmczogKG51bWJlciB8IHN0cmluZylbXSA9IFtdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0tleSh0aGlzLl9nZXRLZXkoZXZlbnQpLCByZWZzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBudW1iZXIgfCBzdHJpbmcge1xuICAgICAgICBsZXQgY29kZTogbnVtYmVyIHwgc3RyaW5nO1xuXG4gICAgICAgIGlmIChldmVudC5rZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29kZSA9IGV2ZW50LmtleTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudFsna2V5SWRlbnRpZmllciddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvZGUgPSBldmVudFsna2V5SWRlbnRpZmllciddO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50WydrZXlDb2RlJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29kZSA9IGV2ZW50WydrZXlDb2RlJ107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNLZXkoY29kZTogbnVtYmVyIHwgc3RyaW5nLCByZWZzOiAobnVtYmVyIHwgc3RyaW5nKVtdID0gW10pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJlZnMgJiYgcmVmcy5sZW5ndGggPiAwID8gcmVmcy5pbmRleE9mKGNvZGUpICE9PSAtMSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNlbGVjdGVkIG9wdGlvbiBiYXNlZCBvbiBhIHZhbHVlLiBJZiBubyBvcHRpb24gY2FuIGJlXG4gICAgICogZm91bmQgd2l0aCB0aGUgZGVzaWduYXRlZCB2YWx1ZSwgdGhlIHNlbGVjdCB0cmlnZ2VyIGlzIGNsZWFyZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0U2VsZWN0aW9uQnlWYWx1ZSh2YWx1ZTogYW55IHwgYW55W10pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uIHx8ICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSkge1xuICAgICAgICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdmFsdWUgJiYgIWlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbiBhcnJheSB2YWx1ZS4nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uID0gW107IC8vIGlmIHZhbHVlIGlzIG51bGwsIHRoZW4gZW1wdHkgb3B0aW9uIGFuZCByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIG5vdCBudWxsLiBQcmVzZWxlY3QgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVzOiBhbnkgPSBTZWxlY3QyVXRpbHMuZ2V0T3B0aW9uc0J5VmFsdWUodGhpcy5fZGF0YSwgdmFsdWUsIHRoaXMubXVsdGlwbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMubWFwKGl0ZW0gPT4gdGhpcy5zZWxlY3QoaXRlbSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250cm9sLnZpZXdUb01vZGVsVXBkYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRG9lcyBzb21lIG1hbnVhbCBkaXJ0eSBjaGVja2luZyBvbiB0aGUgbmF0aXZlIGlucHV0IGB2YWx1ZWAgcHJvcGVydHkuICovXG4gICAgcHJpdmF0ZSBfZGlydHlDaGVja05hdGl2ZVZhbHVlKCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c05hdGl2ZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgYCR7dmFsdWV9YCAhPT0gJ2ZhbHNlJztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9mb2N1c1NlYXJjaGJveE9yUmVzdWx0c0VsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NlYXJjaGJveEhpZGRlbikge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQgJiYgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdWx0c0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c0VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2ZvY3VzKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghc3RhdGUgJiYgdGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBzdGF0ZTtcbiAgICAgICAgICAgIHRoaXMuYmx1ci5lbWl0KHRoaXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlICYmICF0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IHN0YXRlO1xuICAgICAgICAgICAgdGhpcy5mb2N1cy5lbWl0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNBYm9iZU92ZXJsYXkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm92ZXJsYXkgJiYgdGhpcy5fb3ZlcmxheVBvc2l0aW9uICYmIHRoaXMubGlzdFBvc2l0aW9uID09PSAnYXV0bydcbiAgICAgICAgICAgID8gdGhpcy5fb3ZlcmxheVBvc2l0aW9uID09PSAndG9wJ1xuICAgICAgICAgICAgOiB0aGlzLmxpc3RQb3NpdGlvbiA9PT0gJ2Fib3ZlJztcbiAgICB9XG59XG4iXX0=