ng2-iq-select2-exe 16.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +194 -0
- package/esm2022/lib/iq-select2/iq-select2-item.mjs +2 -0
- package/esm2022/lib/iq-select2/iq-select2.component.mjs +356 -0
- package/esm2022/lib/iq-select2/messages.mjs +8 -0
- package/esm2022/lib/iq-select2-results/iq-select2-results.component.mjs +82 -0
- package/esm2022/lib/iq-select2-template/iq-select2-template.directive.mjs +25 -0
- package/esm2022/lib/iq-select2.module.mjs +45 -0
- package/esm2022/ng2-iq-select2-exe.mjs +5 -0
- package/esm2022/public_api.mjs +10 -0
- package/fesm2022/ng2-iq-select2-exe.mjs +511 -0
- package/fesm2022/ng2-iq-select2-exe.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/iq-select2/iq-select2-item.d.ts +5 -0
- package/lib/iq-select2/iq-select2.component.d.ts +79 -0
- package/lib/iq-select2/messages.d.ts +9 -0
- package/lib/iq-select2-results/iq-select2-results.component.d.ts +24 -0
- package/lib/iq-select2-template/iq-select2-template.directive.d.ts +13 -0
- package/lib/iq-select2.module.d.ts +12 -0
- package/package.json +26 -0
- package/public_api.d.ts +6 -0
package/README.md
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# ng2-iq-select2
|
|
2
|
+
|
|
3
|
+
[](http://www.innqube.com/)
|
|
4
|
+
[](https://travis-ci.org/Innqube/ng2-iq-select2)
|
|
5
|
+
[](https://codecov.io/gh/Innqube/ng2-iq-select2)
|
|
6
|
+
[](https://codeclimate.com/github/Innqube/ng2-iq-select2)
|
|
7
|
+
|
|
8
|
+
Angular 2 native select 2 implementation based on bootstrap 4
|
|
9
|
+
|
|
10
|
+
* Easily filter on a remote webservice (can be used with a local list too)
|
|
11
|
+
* Works with ids or complete entities
|
|
12
|
+
* Single or multiple modes
|
|
13
|
+
* Forms integration
|
|
14
|
+
* MIT License
|
|
15
|
+
* Last bootstrap 3 compatible version is 7.0.0
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
[Take a look at the demo page](https://innqube.github.io/ng2-iq-select2-demo)
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
Usage example:
|
|
23
|
+
|
|
24
|
+
*app.module.ts*
|
|
25
|
+
```javascript
|
|
26
|
+
|
|
27
|
+
import { IqSelect2Module } from 'ng2-iq-select2';
|
|
28
|
+
|
|
29
|
+
@NgModule({
|
|
30
|
+
declarations: [..],
|
|
31
|
+
imports: [.., IqSelect2Module, ...],
|
|
32
|
+
providers: [..]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
*html file*
|
|
36
|
+
```html
|
|
37
|
+
<form [formGroup]="form">
|
|
38
|
+
<iq-select2 css="form-control input-sm"
|
|
39
|
+
formControlName="country"
|
|
40
|
+
[dataSourceProvider]="listCountries"
|
|
41
|
+
[selectedProvider]="loadFromIds"
|
|
42
|
+
[iqSelect2ItemAdapter]="adapter"></iq-select2>
|
|
43
|
+
</form>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
*html file (custom template)*
|
|
47
|
+
```html
|
|
48
|
+
<form [formGroup]="form">
|
|
49
|
+
<iq-select2 css="form-control input-sm"
|
|
50
|
+
formControlName="country"
|
|
51
|
+
[dataSourceProvider]="listCountries"
|
|
52
|
+
[selectedProvider]="loadFromIds"
|
|
53
|
+
[iqSelect2ItemAdapter]="adapter">
|
|
54
|
+
<div *iq-select2-template="let item = $entity; let i = $index">
|
|
55
|
+
<span [style.color]="item.color">[{{item.code}}]</span> {{item.name}}
|
|
56
|
+
</div>
|
|
57
|
+
</iq-select2>
|
|
58
|
+
</form>
|
|
59
|
+
```
|
|
60
|
+
> Exposed internal variable to bind `$item`, `$entity`, `$id`, `$index`
|
|
61
|
+
|
|
62
|
+
*example typescript file*
|
|
63
|
+
```javascript
|
|
64
|
+
export class Example {
|
|
65
|
+
form: FormGroup;
|
|
66
|
+
listCountries: (term: string) => Observable<Country[]>;
|
|
67
|
+
loadFromIds: (ids: string[]) => Observable<Country[]>;
|
|
68
|
+
adapter: (entity: Country) => IqSelect2Item;
|
|
69
|
+
//
|
|
70
|
+
constructor(private countriesService: CountryService,
|
|
71
|
+
private formBuilder: FormBuilder){
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
//
|
|
75
|
+
ngOnInit() {
|
|
76
|
+
this.listCountries = (term: string) => this.countriesService.listCountries(term);
|
|
77
|
+
this.loadFromIds = (ids: string[]) => this.countriesService.loadCountriesFromIds(ids);
|
|
78
|
+
this.adapter = (country: Country) => {
|
|
79
|
+
return {
|
|
80
|
+
id: country.id,
|
|
81
|
+
text: country.name,
|
|
82
|
+
entity: country
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
this.form = this.formBuilder.group({
|
|
86
|
+
country: null
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
*IqSelect2Item*
|
|
93
|
+
```javascript
|
|
94
|
+
interface IqSelect2Item {
|
|
95
|
+
id: string;
|
|
96
|
+
text: string;
|
|
97
|
+
entity?: any; // only needed when referenceMode === 'entity'
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
*Messages*
|
|
102
|
+
```javascript
|
|
103
|
+
export class Messages {
|
|
104
|
+
|
|
105
|
+
static readonly PARTIAL_COUNT_VAR; // Variable to be replaced by the amount of results being shown
|
|
106
|
+
static readonly TOTAL_COUNT_VAR; // Variable to be replaced by the total count of results
|
|
107
|
+
|
|
108
|
+
moreResultsAvailableMsg?: string;
|
|
109
|
+
noResultsAvailableMsg?: string;
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
Configuration options (Inputs and Outputs)
|
|
116
|
+
==========================================
|
|
117
|
+
|
|
118
|
+
*@Input()* **dataSourceProvider: (term: string, selected?: any[]) => Observable<IqSelect2Item<T>[]>**: the function to get the data based on user input. Selected ids or entities are provided in case you want to avoid getting those results again (this could be useful when setting the "resultsCount" property).
|
|
119
|
+
|
|
120
|
+
*@Input()* **selectedProvider: (ids: string[]) => Observable<IqSelect2Item<T>[]>**: the function to get previously selected data when referenceMode === 'id'
|
|
121
|
+
|
|
122
|
+
*@Input()* **iqSelect2ItemAdapter: (entity: T) => IqSelect2Item**: the function to adapt any entity to a IqSelect2Item
|
|
123
|
+
|
|
124
|
+
*@Input()* **referenceMode**: 'id' | 'entity'. Allows to specify if you need the whole entity or just the id.
|
|
125
|
+
|
|
126
|
+
*@Input()* **multiple**: 'true' | 'false'. Allows to select multiple options from the list. The form value is returned as an array.
|
|
127
|
+
|
|
128
|
+
*@Input()* **clientMode**: 'true' | 'false'. If set to true only one request will be sent to the data provider and subsequent searching will happen on the client.
|
|
129
|
+
|
|
130
|
+
*@Input()* **searchDelay**: ms until request is effectively triggered
|
|
131
|
+
|
|
132
|
+
*@Input()* **placeholder**: text to show until a search is performed
|
|
133
|
+
|
|
134
|
+
*@Input()* **disabled**: boolean to control the disabled state of the component
|
|
135
|
+
|
|
136
|
+
*@Input()* **minimumInputLength**: the minimum input length at which the component will request data to the provider
|
|
137
|
+
|
|
138
|
+
*@Input()* **resultsCount**: total count of results produced after entering the search term. A message suggesting further filtering will appear if the results count is greather than the result list shown
|
|
139
|
+
|
|
140
|
+
*@Input()* **messages: Messages**: class to provide custom messages to the component
|
|
141
|
+
|
|
142
|
+
*@Input()* **css**: css classes to be applied
|
|
143
|
+
|
|
144
|
+
*@Input()* **searchIcon**: css icon on the right of the input
|
|
145
|
+
|
|
146
|
+
*@Input()* **deleteIcon**: css icon to be used to remove selected option (In single mode)
|
|
147
|
+
|
|
148
|
+
*@Input()* **badgeColor**: badge bootstrap color: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark'
|
|
149
|
+
|
|
150
|
+
*@Output()* **onSelect(item: IqSelect2Item)**: event triggered when an item is selected
|
|
151
|
+
|
|
152
|
+
*@Output()* **onRemove(item: IqSelect2Item)**: event triggered when an item is removed
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
*Reference mode examples*
|
|
157
|
+
```javascript
|
|
158
|
+
// form.value example with referenceMode === 'id':
|
|
159
|
+
{
|
|
160
|
+
'item': 1
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// form.value example with referenceMode === 'entity':
|
|
164
|
+
{
|
|
165
|
+
'item': {
|
|
166
|
+
'id': 1,
|
|
167
|
+
'property1': 'value',
|
|
168
|
+
...
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// form.value example with referenceMode === 'id' and multiple === 'true':
|
|
173
|
+
{
|
|
174
|
+
'item': [1,2,3]
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// form.value example with referenceMode === 'entity' and multiple === 'true':
|
|
178
|
+
{
|
|
179
|
+
'item': [{
|
|
180
|
+
'id': 1,
|
|
181
|
+
'property1': 'value',
|
|
182
|
+
...
|
|
183
|
+
},{
|
|
184
|
+
'id': 2,
|
|
185
|
+
'property1': 'value2',
|
|
186
|
+
...
|
|
187
|
+
},{
|
|
188
|
+
'id': 3,
|
|
189
|
+
'property1': 'value3',
|
|
190
|
+
...
|
|
191
|
+
}]
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
```
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXEtc2VsZWN0Mi1pdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcyLWlxLXNlbGVjdDIvc3JjL2xpYi9pcS1zZWxlY3QyL2lxLXNlbGVjdDItaXRlbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJcVNlbGVjdDJJdGVtIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbiAgICBlbnRpdHk/OiBhbnk7XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { Component, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { IqSelect2ResultsComponent } from '../iq-select2-results/iq-select2-results.component';
|
|
3
|
+
import { UntypedFormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
import { Messages } from './messages';
|
|
5
|
+
import { of } from 'rxjs';
|
|
6
|
+
import { debounceTime, distinctUntilChanged, filter, map, mergeMap, switchMap, tap } from 'rxjs/operators';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
import * as i2 from "@angular/forms";
|
|
10
|
+
import * as i3 from "../iq-select2-results/iq-select2-results.component";
|
|
11
|
+
const KEY_CODE_DOWN_ARROW = 40;
|
|
12
|
+
const KEY_CODE_UP_ARROW = 38;
|
|
13
|
+
const KEY_CODE_ENTER = 13;
|
|
14
|
+
const KEY_CODE_TAB = 9;
|
|
15
|
+
const KEY_CODE_DELETE = 8;
|
|
16
|
+
const VALUE_ACCESSOR = {
|
|
17
|
+
provide: NG_VALUE_ACCESSOR,
|
|
18
|
+
useExisting: forwardRef(() => IqSelect2Component),
|
|
19
|
+
multi: true
|
|
20
|
+
};
|
|
21
|
+
const noop = () => {
|
|
22
|
+
};
|
|
23
|
+
export class IqSelect2Component {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.MORE_RESULTS_MSG = 'Showing ' + Messages.PARTIAL_COUNT_VAR + ' of ' + Messages.TOTAL_COUNT_VAR + ' results. Refine your search to show more results.';
|
|
26
|
+
this.NO_RESULTS_MSG = 'No results available';
|
|
27
|
+
this.referenceMode = 'id';
|
|
28
|
+
this.multiple = false;
|
|
29
|
+
this.searchDelay = 250;
|
|
30
|
+
this.placeholder = '';
|
|
31
|
+
this.minimumInputLength = 2;
|
|
32
|
+
this.disabled = false;
|
|
33
|
+
this.messages = {
|
|
34
|
+
moreResultsAvailableMsg: this.MORE_RESULTS_MSG,
|
|
35
|
+
noResultsAvailableMsg: this.NO_RESULTS_MSG
|
|
36
|
+
};
|
|
37
|
+
this.clientMode = false;
|
|
38
|
+
this.badgeColor = 'info';
|
|
39
|
+
this.onSelect = new EventEmitter();
|
|
40
|
+
this.onRemove = new EventEmitter();
|
|
41
|
+
this.term = new UntypedFormControl();
|
|
42
|
+
this.resultsVisible = false;
|
|
43
|
+
this.selectedItems = [];
|
|
44
|
+
this.searchFocused = false;
|
|
45
|
+
this.placeholderSelected = '';
|
|
46
|
+
this.onTouchedCallback = noop;
|
|
47
|
+
this.onChangeCallback = noop;
|
|
48
|
+
}
|
|
49
|
+
ngAfterViewInit() {
|
|
50
|
+
this.subscribeToChangesAndLoadDataFromObservable();
|
|
51
|
+
}
|
|
52
|
+
writeValue(selectedValues) {
|
|
53
|
+
if (selectedValues) {
|
|
54
|
+
if (this.referenceMode === 'id') {
|
|
55
|
+
this.populateItemsFromIds(selectedValues);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
this.populateItemsFromEntities(selectedValues);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
this.placeholderSelected = '';
|
|
63
|
+
this.selectedItems = [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
registerOnChange(fn) {
|
|
67
|
+
this.onChangeCallback = fn;
|
|
68
|
+
}
|
|
69
|
+
registerOnTouched(fn) {
|
|
70
|
+
this.onTouchedCallback = fn;
|
|
71
|
+
}
|
|
72
|
+
setDisabledState(isDisabled) {
|
|
73
|
+
this.disabled = isDisabled;
|
|
74
|
+
}
|
|
75
|
+
subscribeToChangesAndLoadDataFromObservable() {
|
|
76
|
+
const observable = this.term.valueChanges.pipe(debounceTime(this.searchDelay), distinctUntilChanged());
|
|
77
|
+
this.subscribeToResults(observable);
|
|
78
|
+
}
|
|
79
|
+
subscribeToResults(observable) {
|
|
80
|
+
observable.pipe(tap(() => this.resultsVisible = false), filter((term) => term.length >= this.minimumInputLength), switchMap(term => this.loadDataFromObservable(term)), map(items => items.filter(item => !(this.multiple && this.alreadySelected(item)))), tap(() => this.resultsVisible = this.searchFocused)).subscribe((items) => this.listData = items);
|
|
81
|
+
}
|
|
82
|
+
loadDataFromObservable(term) {
|
|
83
|
+
return this.clientMode ? this.fetchAndfilterLocalData(term) : this.fetchData(term);
|
|
84
|
+
}
|
|
85
|
+
fetchAndfilterLocalData(term) {
|
|
86
|
+
if (!this.fullDataList) {
|
|
87
|
+
return this.fetchData('').pipe(mergeMap((items) => {
|
|
88
|
+
this.fullDataList = items;
|
|
89
|
+
return this.filterLocalData(term);
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return this.filterLocalData(term);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
filterLocalData(term) {
|
|
97
|
+
return of(this.fullDataList.filter((item) => this.containsText(item, term)));
|
|
98
|
+
}
|
|
99
|
+
containsText(item, term) {
|
|
100
|
+
return item.text.toUpperCase().indexOf(term.toUpperCase()) !== -1;
|
|
101
|
+
}
|
|
102
|
+
fetchData(term) {
|
|
103
|
+
return this
|
|
104
|
+
.dataSourceProvider(term, this.buildValue())
|
|
105
|
+
.pipe(map((items) => this.adaptItems(items)));
|
|
106
|
+
}
|
|
107
|
+
adaptItems(items) {
|
|
108
|
+
const convertedItems = [];
|
|
109
|
+
items.map((item) => this.iqSelect2ItemAdapter(item))
|
|
110
|
+
.forEach((iqSelect2Item) => convertedItems.push(iqSelect2Item));
|
|
111
|
+
return convertedItems;
|
|
112
|
+
}
|
|
113
|
+
populateItemsFromEntities(selectedValues) {
|
|
114
|
+
if (this.multiple) {
|
|
115
|
+
this.handleMultipleWithEntities(selectedValues);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const iqSelect2Item = this.iqSelect2ItemAdapter(selectedValues);
|
|
119
|
+
this.selectedItems = [iqSelect2Item];
|
|
120
|
+
this.placeholderSelected = iqSelect2Item.text;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
handleMultipleWithEntities(selectedValues) {
|
|
124
|
+
this.selectedItems = [];
|
|
125
|
+
selectedValues.forEach((entity) => {
|
|
126
|
+
const item = this.iqSelect2ItemAdapter(entity);
|
|
127
|
+
const ids = this.getSelectedIds();
|
|
128
|
+
if (ids.indexOf(item.id) === -1) {
|
|
129
|
+
this.selectedItems.push(item);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
populateItemsFromIds(selectedValues) {
|
|
134
|
+
if (this.multiple) {
|
|
135
|
+
this.handleMultipleWithIds(selectedValues);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
this.handleSingleWithId(selectedValues);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
handleMultipleWithIds(selectedValues) {
|
|
142
|
+
if (selectedValues !== undefined && this.selectedProvider !== undefined) {
|
|
143
|
+
const uniqueIds = [];
|
|
144
|
+
selectedValues.forEach((id) => {
|
|
145
|
+
if (uniqueIds.indexOf(id) === -1) {
|
|
146
|
+
uniqueIds.push(id);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
this.selectedProvider(uniqueIds).subscribe((items) => {
|
|
150
|
+
this.selectedItems = items.map(this.iqSelect2ItemAdapter);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
handleSingleWithId(id) {
|
|
155
|
+
if (id !== undefined && this.selectedProvider !== undefined) {
|
|
156
|
+
this.selectedProvider([id]).subscribe((items) => {
|
|
157
|
+
items.forEach((item) => {
|
|
158
|
+
const iqSelect2Item = this.iqSelect2ItemAdapter(item);
|
|
159
|
+
this.selectedItems = [iqSelect2Item];
|
|
160
|
+
this.placeholderSelected = iqSelect2Item.text;
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
alreadySelected(item) {
|
|
166
|
+
let result = false;
|
|
167
|
+
this.selectedItems.forEach(selectedItem => {
|
|
168
|
+
if (selectedItem.id === item.id) {
|
|
169
|
+
result = true;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
onItemSelected(item) {
|
|
175
|
+
if (this.multiple) {
|
|
176
|
+
this.selectedItems.push(item);
|
|
177
|
+
const index = this.listData.indexOf(item, 0);
|
|
178
|
+
if (index > -1) {
|
|
179
|
+
this.listData.splice(index, 1);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
this.selectedItems.length = 0;
|
|
184
|
+
this.selectedItems.push(item);
|
|
185
|
+
}
|
|
186
|
+
this.onChangeCallback(this.buildValue());
|
|
187
|
+
this.term.patchValue('', { emitEvent: false });
|
|
188
|
+
setTimeout(() => this.focus(), 1);
|
|
189
|
+
this.resultsVisible = false;
|
|
190
|
+
this.onSelect.emit(item);
|
|
191
|
+
if (!this.multiple) {
|
|
192
|
+
this.placeholderSelected = item.text;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
getSelectedIds() {
|
|
196
|
+
if (this.multiple) {
|
|
197
|
+
const ids = [];
|
|
198
|
+
this.selectedItems.forEach(item => ids.push(item.id));
|
|
199
|
+
return ids;
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
return this.selectedItems.length === 0 ? null : this.selectedItems[0].id;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
getEntities() {
|
|
206
|
+
if (this.multiple) {
|
|
207
|
+
const entities = [];
|
|
208
|
+
this.selectedItems.forEach(item => {
|
|
209
|
+
entities.push(item.entity);
|
|
210
|
+
});
|
|
211
|
+
return entities;
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
return this.selectedItems.length === 0 ? null : this.selectedItems[0].entity;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
removeItem(item) {
|
|
218
|
+
const index = this.selectedItems.indexOf(item, 0);
|
|
219
|
+
if (index > -1) {
|
|
220
|
+
this.selectedItems.splice(index, 1);
|
|
221
|
+
}
|
|
222
|
+
this.onChangeCallback(this.buildValue());
|
|
223
|
+
this.onRemove.emit(item);
|
|
224
|
+
if (!this.multiple) {
|
|
225
|
+
this.placeholderSelected = '';
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
buildValue() {
|
|
229
|
+
return 'id' === this.referenceMode ? this.getSelectedIds() : this.getEntities();
|
|
230
|
+
}
|
|
231
|
+
onFocus() {
|
|
232
|
+
this.searchFocused = true;
|
|
233
|
+
}
|
|
234
|
+
onBlur() {
|
|
235
|
+
this.term.patchValue('', { emitEvent: false });
|
|
236
|
+
this.searchFocused = false;
|
|
237
|
+
this.resultsVisible = false;
|
|
238
|
+
this.onTouchedCallback();
|
|
239
|
+
}
|
|
240
|
+
focus() {
|
|
241
|
+
if (!this.disabled) {
|
|
242
|
+
this.termInput.nativeElement.focus();
|
|
243
|
+
this.resultsVisible = false;
|
|
244
|
+
}
|
|
245
|
+
this.searchFocused = !this.disabled;
|
|
246
|
+
}
|
|
247
|
+
focusAndShowResults() {
|
|
248
|
+
if (!this.disabled) {
|
|
249
|
+
this.termInput.nativeElement.focus();
|
|
250
|
+
this.subscribeToResults(of(''));
|
|
251
|
+
}
|
|
252
|
+
this.searchFocused = !this.disabled;
|
|
253
|
+
}
|
|
254
|
+
onKeyUp(ev) {
|
|
255
|
+
if (this.results) {
|
|
256
|
+
if (ev.keyCode === KEY_CODE_DOWN_ARROW) {
|
|
257
|
+
this.results.activeNext();
|
|
258
|
+
}
|
|
259
|
+
else if (ev.keyCode === KEY_CODE_UP_ARROW) {
|
|
260
|
+
this.results.activePrevious();
|
|
261
|
+
}
|
|
262
|
+
else if (ev.keyCode === KEY_CODE_ENTER) {
|
|
263
|
+
this.results.selectCurrentItem();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
if (this.minimumInputLength === 0) {
|
|
268
|
+
if (ev.keyCode === KEY_CODE_ENTER || ev.keyCode === KEY_CODE_DOWN_ARROW) {
|
|
269
|
+
this.focusAndShowResults();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
onKeyDown(ev) {
|
|
275
|
+
if (this.results) {
|
|
276
|
+
if (ev.keyCode === KEY_CODE_TAB) {
|
|
277
|
+
this.results.selectCurrentItem();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (ev.keyCode === KEY_CODE_DELETE) {
|
|
281
|
+
const textEntered = !this.term.value || this.term.value.length === 0;
|
|
282
|
+
if (textEntered && this.selectedItems.length > 0) {
|
|
283
|
+
this.removeItem(this.selectedItems[this.selectedItems.length - 1]);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
onKeyPress(ev) {
|
|
288
|
+
if (ev.keyCode === KEY_CODE_ENTER) {
|
|
289
|
+
ev.preventDefault();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
getCss() {
|
|
293
|
+
return 'select2-selection-container ' + (this.css === undefined ? '' : this.css);
|
|
294
|
+
}
|
|
295
|
+
getPlaceholder() {
|
|
296
|
+
return this.selectedItems.length > 0 ? this.placeholderSelected : this.placeholder;
|
|
297
|
+
}
|
|
298
|
+
getCountMessage() {
|
|
299
|
+
let msg = this.messages && this.messages.moreResultsAvailableMsg ? this.messages.moreResultsAvailableMsg : this.MORE_RESULTS_MSG;
|
|
300
|
+
msg = msg.replace(Messages.PARTIAL_COUNT_VAR, String(this.listData.length));
|
|
301
|
+
msg = msg.replace(Messages.TOTAL_COUNT_VAR, String(this.resultsCount - this.selectedItems.length));
|
|
302
|
+
return msg;
|
|
303
|
+
}
|
|
304
|
+
getBadgeColor() {
|
|
305
|
+
return this.multiple ? 'bg-' + this.badgeColor : '';
|
|
306
|
+
}
|
|
307
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: IqSelect2Component, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
308
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.4", type: IqSelect2Component, selector: "iq-select2", inputs: { dataSourceProvider: "dataSourceProvider", selectedProvider: "selectedProvider", iqSelect2ItemAdapter: "iqSelect2ItemAdapter", referenceMode: "referenceMode", multiple: "multiple", searchDelay: "searchDelay", css: "css", placeholder: "placeholder", minimumInputLength: "minimumInputLength", disabled: "disabled", searchIcon: "searchIcon", deleteIcon: "deleteIcon", messages: "messages", resultsCount: "resultsCount", clientMode: "clientMode", badgeColor: "badgeColor" }, outputs: { onSelect: "onSelect", onRemove: "onRemove" }, providers: [VALUE_ACCESSOR], viewQueries: [{ propertyName: "termInput", first: true, predicate: ["termInput"], descendants: true }, { propertyName: "results", first: true, predicate: ["results"], descendants: true }], ngImport: i0, template: "<div class=\"select2-container\">\r\n <ul (click)=\"focusAndShowResults()\"\r\n [class]=\"getCss()\"\r\n [class.simple-selection]=\"!multiple\"\r\n [class.multiple-selection]=\"multiple\"\r\n [class.search-focused]=\"searchFocused\"\r\n [class.readonly]=\"disabled\">\r\n\r\n <ng-container *ngIf=\"!searchFocused || multiple\">\r\n <li *ngFor=\"let item of selectedItems\"\r\n [class]=\"'select2-selected ' + getBadgeColor()\"\r\n [class.badge]=\"multiple\">\r\n\r\n <span class=\"selectedItemText\">{{item.text}}</span>\r\n <div *ngIf=\"!disabled\" class=\"select2-selection-remove\" (click)=\"removeItem(item)\">\r\n <i *ngIf=\"deleteIcon\" [class]=\"deleteIcon\"></i>\r\n <button *ngIf=\"!deleteIcon\" (click)=\"removeItem(item)\" type=\"button\" class=\"btn-close\" [class.btn-close-white]=\"multiple\" aria-label=\"Close\"></button>\r\n </div>\r\n\r\n </li>\r\n </ng-container>\r\n <li class=\"select2-input\">\r\n <input #termInput type=\"text\"\r\n [placeholder]=\"getPlaceholder()\"\r\n [formControl]=\"term\"\r\n [class.transparent]=\"!multiple && selectedItems.length > 0 && !searchFocused\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (keyup)=\"onKeyUp($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (keypress)=\"onKeyPress($event)\"\r\n *ngIf=\"!disabled\"/>\r\n </li>\r\n\r\n <div *ngIf=\"!disabled && (multiple || (!multiple && selectedItems.length === 0))\" class=\"caret\">\r\n <span *ngIf=\"!searchIcon\" class=\"caret-symbol\">▼</span>\r\n <span [class]=\"searchIcon\" *ngIf=\"searchIcon && minimumInputLength===0\"\r\n (click)=\"focusAndShowResults()\"></span>\r\n <span [class]=\"searchIcon\" *ngIf=\"searchIcon && minimumInputLength!==0\"></span>\r\n </div>\r\n\r\n </ul>\r\n\r\n <div class=\"results-container\" *ngIf=\"resultsVisible\">\r\n <span class=\"results-msg\" *ngIf=\"listData && (listData.length + selectedItems.length) < resultsCount\">\r\n {{getCountMessage()}}\r\n </span>\r\n <span class=\"results-msg no-results-msg\" *ngIf=\"searchFocused && listData && listData.length === 0\">\r\n {{messages && messages.noResultsAvailableMsg ? messages.noResultsAvailableMsg : NO_RESULTS_MSG}}\r\n </span>\r\n <iq-select2-results #results [selectedItems]=\"selectedItems\" [items]=\"listData\"\r\n (itemSelectedEvent)=\"onItemSelected($event);\"\r\n [templateRef]=\"templateRef\"\r\n [searchFocused]=\"searchFocused\"></iq-select2-results>\r\n </div>\r\n</div>\r\n", styles: ["ul{list-style-type:none;position:relative}ul li{display:inline-block}ul.simple-selection li{display:block}input{border:none;padding:0}input:focus{outline:none}.simple-selection input.transparent{opacity:0;position:absolute;inset:0 30px 0 0}.form-control-sm ul,.form-control-lg ul{padding:2px 8px}.caret{position:absolute;right:8px;font-size:8px;top:0;bottom:0;line-height:38px}.form-control-sm .caret{line-height:31px}.form-control-lg .caret{line-height:48px;right:12px}.select2-container{position:relative}.results-container{position:absolute;margin-top:-6px;width:100%;z-index:3}div.select2-selection-remove{position:absolute;right:10px;top:0;display:inline-block}.multiple-selection .select2-selected{margin:0 1px 2px;--bs-badge-font-size: 1em;display:inline-flex;align-items:center;gap:.2em}.multiple-selection div.select2-selection-remove{position:relative;right:initial}div.select2-selection-remove:hover{cursor:pointer}.multiple-selection div.select2-selection-remove{display:flex;align-items:center}div.select2-selection-remove .btn-close{width:.3em;height:.3em;padding:.2em}.select2-container .search-focused{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem #007bff40}.results-msg{display:block;position:relative;margin-top:-10px;margin-bottom:10px;font-size:.8em;padding:3px 5px;border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-bottom:1px solid #ced4da;background:#fafafa}.readonly{background-color:#eaecf0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.IqSelect2ResultsComponent, selector: "iq-select2-results", inputs: ["items", "searchFocused", "selectedItems", "templateRef"], outputs: ["itemSelectedEvent"] }] }); }
|
|
309
|
+
}
|
|
310
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.4", ngImport: i0, type: IqSelect2Component, decorators: [{
|
|
311
|
+
type: Component,
|
|
312
|
+
args: [{ selector: 'iq-select2', providers: [VALUE_ACCESSOR], template: "<div class=\"select2-container\">\r\n <ul (click)=\"focusAndShowResults()\"\r\n [class]=\"getCss()\"\r\n [class.simple-selection]=\"!multiple\"\r\n [class.multiple-selection]=\"multiple\"\r\n [class.search-focused]=\"searchFocused\"\r\n [class.readonly]=\"disabled\">\r\n\r\n <ng-container *ngIf=\"!searchFocused || multiple\">\r\n <li *ngFor=\"let item of selectedItems\"\r\n [class]=\"'select2-selected ' + getBadgeColor()\"\r\n [class.badge]=\"multiple\">\r\n\r\n <span class=\"selectedItemText\">{{item.text}}</span>\r\n <div *ngIf=\"!disabled\" class=\"select2-selection-remove\" (click)=\"removeItem(item)\">\r\n <i *ngIf=\"deleteIcon\" [class]=\"deleteIcon\"></i>\r\n <button *ngIf=\"!deleteIcon\" (click)=\"removeItem(item)\" type=\"button\" class=\"btn-close\" [class.btn-close-white]=\"multiple\" aria-label=\"Close\"></button>\r\n </div>\r\n\r\n </li>\r\n </ng-container>\r\n <li class=\"select2-input\">\r\n <input #termInput type=\"text\"\r\n [placeholder]=\"getPlaceholder()\"\r\n [formControl]=\"term\"\r\n [class.transparent]=\"!multiple && selectedItems.length > 0 && !searchFocused\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (keyup)=\"onKeyUp($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (keypress)=\"onKeyPress($event)\"\r\n *ngIf=\"!disabled\"/>\r\n </li>\r\n\r\n <div *ngIf=\"!disabled && (multiple || (!multiple && selectedItems.length === 0))\" class=\"caret\">\r\n <span *ngIf=\"!searchIcon\" class=\"caret-symbol\">▼</span>\r\n <span [class]=\"searchIcon\" *ngIf=\"searchIcon && minimumInputLength===0\"\r\n (click)=\"focusAndShowResults()\"></span>\r\n <span [class]=\"searchIcon\" *ngIf=\"searchIcon && minimumInputLength!==0\"></span>\r\n </div>\r\n\r\n </ul>\r\n\r\n <div class=\"results-container\" *ngIf=\"resultsVisible\">\r\n <span class=\"results-msg\" *ngIf=\"listData && (listData.length + selectedItems.length) < resultsCount\">\r\n {{getCountMessage()}}\r\n </span>\r\n <span class=\"results-msg no-results-msg\" *ngIf=\"searchFocused && listData && listData.length === 0\">\r\n {{messages && messages.noResultsAvailableMsg ? messages.noResultsAvailableMsg : NO_RESULTS_MSG}}\r\n </span>\r\n <iq-select2-results #results [selectedItems]=\"selectedItems\" [items]=\"listData\"\r\n (itemSelectedEvent)=\"onItemSelected($event);\"\r\n [templateRef]=\"templateRef\"\r\n [searchFocused]=\"searchFocused\"></iq-select2-results>\r\n </div>\r\n</div>\r\n", styles: ["ul{list-style-type:none;position:relative}ul li{display:inline-block}ul.simple-selection li{display:block}input{border:none;padding:0}input:focus{outline:none}.simple-selection input.transparent{opacity:0;position:absolute;inset:0 30px 0 0}.form-control-sm ul,.form-control-lg ul{padding:2px 8px}.caret{position:absolute;right:8px;font-size:8px;top:0;bottom:0;line-height:38px}.form-control-sm .caret{line-height:31px}.form-control-lg .caret{line-height:48px;right:12px}.select2-container{position:relative}.results-container{position:absolute;margin-top:-6px;width:100%;z-index:3}div.select2-selection-remove{position:absolute;right:10px;top:0;display:inline-block}.multiple-selection .select2-selected{margin:0 1px 2px;--bs-badge-font-size: 1em;display:inline-flex;align-items:center;gap:.2em}.multiple-selection div.select2-selection-remove{position:relative;right:initial}div.select2-selection-remove:hover{cursor:pointer}.multiple-selection div.select2-selection-remove{display:flex;align-items:center}div.select2-selection-remove .btn-close{width:.3em;height:.3em;padding:.2em}.select2-container .search-focused{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem #007bff40}.results-msg{display:block;position:relative;margin-top:-10px;margin-bottom:10px;font-size:.8em;padding:3px 5px;border-left:1px solid #ced4da;border-right:1px solid #ced4da;border-bottom:1px solid #ced4da;background:#fafafa}.readonly{background-color:#eaecf0}\n"] }]
|
|
313
|
+
}], ctorParameters: function () { return []; }, propDecorators: { dataSourceProvider: [{
|
|
314
|
+
type: Input
|
|
315
|
+
}], selectedProvider: [{
|
|
316
|
+
type: Input
|
|
317
|
+
}], iqSelect2ItemAdapter: [{
|
|
318
|
+
type: Input
|
|
319
|
+
}], referenceMode: [{
|
|
320
|
+
type: Input
|
|
321
|
+
}], multiple: [{
|
|
322
|
+
type: Input
|
|
323
|
+
}], searchDelay: [{
|
|
324
|
+
type: Input
|
|
325
|
+
}], css: [{
|
|
326
|
+
type: Input
|
|
327
|
+
}], placeholder: [{
|
|
328
|
+
type: Input
|
|
329
|
+
}], minimumInputLength: [{
|
|
330
|
+
type: Input
|
|
331
|
+
}], disabled: [{
|
|
332
|
+
type: Input
|
|
333
|
+
}], searchIcon: [{
|
|
334
|
+
type: Input
|
|
335
|
+
}], deleteIcon: [{
|
|
336
|
+
type: Input
|
|
337
|
+
}], messages: [{
|
|
338
|
+
type: Input
|
|
339
|
+
}], resultsCount: [{
|
|
340
|
+
type: Input
|
|
341
|
+
}], clientMode: [{
|
|
342
|
+
type: Input
|
|
343
|
+
}], badgeColor: [{
|
|
344
|
+
type: Input
|
|
345
|
+
}], onSelect: [{
|
|
346
|
+
type: Output
|
|
347
|
+
}], onRemove: [{
|
|
348
|
+
type: Output
|
|
349
|
+
}], termInput: [{
|
|
350
|
+
type: ViewChild,
|
|
351
|
+
args: ['termInput']
|
|
352
|
+
}], results: [{
|
|
353
|
+
type: ViewChild,
|
|
354
|
+
args: ['results']
|
|
355
|
+
}] } });
|
|
356
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXEtc2VsZWN0Mi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZzItaXEtc2VsZWN0Mi9zcmMvbGliL2lxLXNlbGVjdDIvaXEtc2VsZWN0Mi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZzItaXEtc2VsZWN0Mi9zcmMvbGliL2lxLXNlbGVjdDIvaXEtc2VsZWN0Mi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXhILE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQzdGLE9BQU8sRUFBdUIsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBRXpHLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBQy9CLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQzdCLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLE1BQU0sY0FBYyxHQUFHO0lBQ25CLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztJQUNqRCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFDRixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7QUFDbEIsQ0FBQyxDQUFDO0FBUUYsTUFBTSxPQUFPLGtCQUFrQjtJQXVDM0I7UUFyQ0EscUJBQWdCLEdBQUcsVUFBVSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDLGVBQWUsR0FBRyxvREFBb0QsQ0FBQztRQUN0SixtQkFBYyxHQUFHLHNCQUFzQixDQUFDO1FBSy9CLGtCQUFhLEdBQW9CLElBQUksQ0FBQztRQUN0QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGdCQUFXLEdBQUcsR0FBRyxDQUFDO1FBRWxCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLHVCQUFrQixHQUFHLENBQUMsQ0FBQztRQUN2QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLGFBQVEsR0FBYTtZQUMxQix1QkFBdUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQzlDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxjQUFjO1NBQzdDLENBQUM7UUFFTyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFDbkIsYUFBUSxHQUFnQyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUMxRSxhQUFRLEdBQWdDLElBQUksWUFBWSxFQUFpQixDQUFDO1FBSXBGLFNBQUksR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDaEMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFHdkIsa0JBQWEsR0FBb0IsRUFBRSxDQUFDO1FBQ3BDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ2Qsd0JBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLHNCQUFpQixHQUFlLElBQUksQ0FBQztRQUNyQyxxQkFBZ0IsR0FBcUIsSUFBSSxDQUFDO0lBRzFDLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELFVBQVUsQ0FBQyxjQUFtQjtRQUMxQixJQUFJLGNBQWMsRUFBRTtZQUNoQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO2dCQUM3QixJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDN0M7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ2xEO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBTztRQUNwQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFTywyQ0FBMkM7UUFDL0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUMxQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUM5QixvQkFBb0IsRUFBRSxDQUN6QixDQUFDO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxVQUE4QjtRQUNyRCxVQUFVLENBQUMsSUFBSSxDQUNYLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxFQUN0QyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQ3hELFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNwRCxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbEYsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUN0RCxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsSUFBWTtRQUN2QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRU8sdUJBQXVCLENBQUMsSUFBWTtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUMxQixRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUNMLENBQUM7U0FDTDthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFZO1FBQ2hDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVPLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBWTtRQUNuQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTyxTQUFTLENBQUMsSUFBWTtRQUMxQixPQUFPLElBQUk7YUFDTixrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxVQUFVLENBQUMsS0FBWTtRQUMzQixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDMUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQy9DLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sY0FBYyxDQUFDO0lBQzFCLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxjQUFtQjtRQUNqRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsMEJBQTBCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDbkQ7YUFBTTtZQUNILE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7U0FDakQ7SUFDTCxDQUFDO0lBRU8sMEJBQTBCLENBQUMsY0FBbUI7UUFDbEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzlCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFbEMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxjQUFtQjtRQUM1QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUMzQztJQUNMLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxjQUFtQjtRQUM3QyxJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtZQUNyRSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDckIsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUMxQixJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQzlCLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ3RCO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBWSxFQUFFLEVBQUU7Z0JBQ3hELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM5RCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEVBQU87UUFDOUIsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7WUFDekQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRTtnQkFDbkQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNuQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RELElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDckMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsSUFBbUI7UUFDdkMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3RDLElBQUksWUFBWSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUM3QixNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ2pCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQW1CO1FBQzlCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDWixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbEM7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQzdDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDeEM7SUFDTCxDQUFDO0lBRU8sY0FBYztRQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7WUFFekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXRELE9BQU8sR0FBRyxDQUFDO1NBQ2Q7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzVFO0lBQ0wsQ0FBQztJQUVPLFdBQVc7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFFcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzlCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxRQUFRLENBQUM7U0FDbkI7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ2hGO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFtQjtRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDWixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdkM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztTQUNqQztJQUNMLENBQUM7SUFFTyxVQUFVO1FBQ2QsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEYsQ0FBQztJQUVELE9BQU87UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7U0FDL0I7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsbUJBQW1CO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUVELE9BQU8sQ0FBQyxFQUFFO1FBQ04sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsSUFBSSxFQUFFLENBQUMsT0FBTyxLQUFLLG1CQUFtQixFQUFFO2dCQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQzdCO2lCQUFNLElBQUksRUFBRSxDQUFDLE9BQU8sS0FBSyxpQkFBaUIsRUFBRTtnQkFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUNqQztpQkFBTSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEtBQUssY0FBYyxFQUFFO2dCQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7YUFDcEM7U0FDSjthQUFNO1lBQ0gsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssQ0FBQyxFQUFFO2dCQUMvQixJQUFJLEVBQUUsQ0FBQyxPQUFPLEtBQUssY0FBYyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEtBQUssbUJBQW1CLEVBQUU7b0JBQ3JFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2lCQUM5QjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQUU7UUFDUixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCxJQUFJLEVBQUUsQ0FBQyxPQUFPLEtBQUssWUFBWSxFQUFFO2dCQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7YUFDcEM7U0FDSjtRQUVELElBQUksRUFBRSxDQUFDLE9BQU8sS0FBSyxlQUFlLEVBQUU7WUFDaEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JFLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEU7U0FDSjtJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsRUFBRTtRQUNULElBQUksRUFBRSxDQUFDLE9BQU8sS0FBSyxjQUFjLEVBQUU7WUFDL0IsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDRixPQUFPLDhCQUE4QixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxjQUFjO1FBQ1YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN2RixDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2pJLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVFLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ25HLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDeEQsQ0FBQzs4R0F2VlEsa0JBQWtCO2tHQUFsQixrQkFBa0IsOGpCQUZoQixDQUFDLGNBQWMsQ0FBQyx1TkN6Qi9CLG03RkF3REE7OzJGRDdCYSxrQkFBa0I7a0JBTjlCLFNBQVM7K0JBQ0ksWUFBWSxhQUdYLENBQUMsY0FBYyxDQUFDOzBFQU9sQixrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ3lCLFNBQVM7c0JBQXhDLFNBQVM7dUJBQUMsV0FBVztnQkFDQSxPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtJcVNlbGVjdDJJdGVtfSBmcm9tICcuL2lxLXNlbGVjdDItaXRlbSc7XHJcbmltcG9ydCB7SXFTZWxlY3QyUmVzdWx0c0NvbXBvbmVudH0gZnJvbSAnLi4vaXEtc2VsZWN0Mi1yZXN1bHRzL2lxLXNlbGVjdDItcmVzdWx0cy5jb21wb25lbnQnO1xyXG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBVbnR5cGVkRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7TWVzc2FnZXN9IGZyb20gJy4vbWVzc2FnZXMnO1xyXG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHN3aXRjaE1hcCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5jb25zdCBLRVlfQ09ERV9ET1dOX0FSUk9XID0gNDA7XHJcbmNvbnN0IEtFWV9DT0RFX1VQX0FSUk9XID0gMzg7XHJcbmNvbnN0IEtFWV9DT0RFX0VOVEVSID0gMTM7XHJcbmNvbnN0IEtFWV9DT0RFX1RBQiA9IDk7XHJcbmNvbnN0IEtFWV9DT0RFX0RFTEVURSA9IDg7XHJcbmNvbnN0IFZBTFVFX0FDQ0VTU09SID0ge1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJcVNlbGVjdDJDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWVcclxufTtcclxuY29uc3Qgbm9vcCA9ICgpID0+IHtcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdpcS1zZWxlY3QyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9pcS1zZWxlY3QyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2lxLXNlbGVjdDIuY29tcG9uZW50LmNzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbVkFMVUVfQUNDRVNTT1JdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJcVNlbGVjdDJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG4gICAgTU9SRV9SRVNVTFRTX01TRyA9ICdTaG93aW5nICcgKyBNZXNzYWdlcy5QQVJUSUFMX0NPVU5UX1ZBUiArICcgb2YgJyArIE1lc3NhZ2VzLlRPVEFMX0NPVU5UX1ZBUiArICcgcmVzdWx0cy4gUmVmaW5lIHlvdXIgc2VhcmNoIHRvIHNob3cgbW9yZSByZXN1bHRzLic7XHJcbiAgICBOT19SRVNVTFRTX01TRyA9ICdObyByZXN1bHRzIGF2YWlsYWJsZSc7XHJcblxyXG4gICAgQElucHV0KCkgZGF0YVNvdXJjZVByb3ZpZGVyOiAodGVybTogc3RyaW5nLCBzZWxlY3RlZD86IGFueVtdKSA9PiBPYnNlcnZhYmxlPGFueVtdPjtcclxuICAgIEBJbnB1dCgpIHNlbGVjdGVkUHJvdmlkZXI6IChpZHM6IHN0cmluZ1tdKSA9PiBPYnNlcnZhYmxlPGFueVtdPjtcclxuICAgIEBJbnB1dCgpIGlxU2VsZWN0Mkl0ZW1BZGFwdGVyOiAoZW50aXR5OiBhbnkpID0+IElxU2VsZWN0Mkl0ZW07XHJcbiAgICBASW5wdXQoKSByZWZlcmVuY2VNb2RlOiAnaWQnIHwgJ2VudGl0eScgPSAnaWQnO1xyXG4gICAgQElucHV0KCkgbXVsdGlwbGUgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHNlYXJjaERlbGF5ID0gMjUwO1xyXG4gICAgQElucHV0KCkgY3NzOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xyXG4gICAgQElucHV0KCkgbWluaW11bUlucHV0TGVuZ3RoID0gMjtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzZWFyY2hJY29uO1xyXG4gICAgQElucHV0KCkgZGVsZXRlSWNvbjtcclxuICAgIEBJbnB1dCgpIG1lc3NhZ2VzOiBNZXNzYWdlcyA9IHtcclxuICAgICAgICBtb3JlUmVzdWx0c0F2YWlsYWJsZU1zZzogdGhpcy5NT1JFX1JFU1VMVFNfTVNHLFxyXG4gICAgICAgIG5vUmVzdWx0c0F2YWlsYWJsZU1zZzogdGhpcy5OT19SRVNVTFRTX01TR1xyXG4gICAgfTtcclxuICAgIEBJbnB1dCgpIHJlc3VsdHNDb3VudDtcclxuICAgIEBJbnB1dCgpIGNsaWVudE1vZGUgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGJhZGdlQ29sb3IgPSAnaW5mbyc7XHJcbiAgICBAT3V0cHV0KCkgb25TZWxlY3Q6IEV2ZW50RW1pdHRlcjxJcVNlbGVjdDJJdGVtPiA9IG5ldyBFdmVudEVtaXR0ZXI8SXFTZWxlY3QySXRlbT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblJlbW92ZTogRXZlbnRFbWl0dGVyPElxU2VsZWN0Mkl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcjxJcVNlbGVjdDJJdGVtPigpO1xyXG4gICAgQFZpZXdDaGlsZCgndGVybUlucHV0JykgcHJpdmF0ZSB0ZXJtSW5wdXQ7XHJcbiAgICBAVmlld0NoaWxkKCdyZXN1bHRzJykgcmVzdWx0czogSXFTZWxlY3QyUmVzdWx0c0NvbXBvbmVudDtcclxuICAgIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgdGVybSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICAgIHJlc3VsdHNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICBsaXN0RGF0YTogSXFTZWxlY3QySXRlbVtdO1xyXG4gICAgZnVsbERhdGFMaXN0OiBJcVNlbGVjdDJJdGVtW107XHJcbiAgICBzZWxlY3RlZEl0ZW1zOiBJcVNlbGVjdDJJdGVtW10gPSBbXTtcclxuICAgIHNlYXJjaEZvY3VzZWQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgcGxhY2Vob2xkZXJTZWxlY3RlZCA9ICcnO1xyXG4gICAgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xyXG4gICAgb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9DaGFuZ2VzQW5kTG9hZERhdGFGcm9tT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHdyaXRlVmFsdWUoc2VsZWN0ZWRWYWx1ZXM6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChzZWxlY3RlZFZhbHVlcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VNb2RlID09PSAnaWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVsYXRlSXRlbXNGcm9tSWRzKHNlbGVjdGVkVmFsdWVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9wdWxhdGVJdGVtc0Zyb21FbnRpdGllcyhzZWxlY3RlZFZhbHVlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyU2VsZWN0ZWQgPSAnJztcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb0NoYW5nZXNBbmRMb2FkRGF0YUZyb21PYnNlcnZhYmxlKCkge1xyXG4gICAgICAgIGNvbnN0IG9ic2VydmFibGUgPSB0aGlzLnRlcm0udmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLnNlYXJjaERlbGF5KSxcclxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1Jlc3VsdHMob2JzZXJ2YWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb1Jlc3VsdHMob2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxzdHJpbmc+KTogdm9pZCB7XHJcbiAgICAgICAgb2JzZXJ2YWJsZS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5yZXN1bHRzVmlzaWJsZSA9IGZhbHNlKSxcclxuICAgICAgICAgICAgZmlsdGVyKCh0ZXJtKSA9PiB0ZXJtLmxlbmd0aCA+PSB0aGlzLm1pbmltdW1JbnB1dExlbmd0aCksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcCh0ZXJtID0+IHRoaXMubG9hZERhdGFGcm9tT2JzZXJ2YWJsZSh0ZXJtKSksXHJcbiAgICAgICAgICAgIG1hcChpdGVtcyA9PiBpdGVtcy5maWx0ZXIoaXRlbSA9PiAhKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5hbHJlYWR5U2VsZWN0ZWQoaXRlbSkpKSksXHJcbiAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLnJlc3VsdHNWaXNpYmxlID0gdGhpcy5zZWFyY2hGb2N1c2VkKVxyXG4gICAgICAgICkuc3Vic2NyaWJlKChpdGVtcykgPT4gdGhpcy5saXN0RGF0YSA9IGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWREYXRhRnJvbU9ic2VydmFibGUodGVybTogc3RyaW5nKTogT2JzZXJ2YWJsZTxJcVNlbGVjdDJJdGVtW10+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnRNb2RlID8gdGhpcy5mZXRjaEFuZGZpbHRlckxvY2FsRGF0YSh0ZXJtKSA6IHRoaXMuZmV0Y2hEYXRhKHRlcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmV0Y2hBbmRmaWx0ZXJMb2NhbERhdGEodGVybTogc3RyaW5nKTogT2JzZXJ2YWJsZTxJcVNlbGVjdDJJdGVtW10+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZnVsbERhdGFMaXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZldGNoRGF0YSgnJykucGlwZShcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKChpdGVtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnVsbERhdGFMaXN0ID0gaXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyTG9jYWxEYXRhKHRlcm0pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJMb2NhbERhdGEodGVybSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmlsdGVyTG9jYWxEYXRhKHRlcm06IHN0cmluZyk6IE9ic2VydmFibGU8SXFTZWxlY3QySXRlbVtdPiB7XHJcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMuZnVsbERhdGFMaXN0LmZpbHRlcigoaXRlbSkgPT4gdGhpcy5jb250YWluc1RleHQoaXRlbSwgdGVybSkpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbnRhaW5zVGV4dChpdGVtLCB0ZXJtOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaXRlbS50ZXh0LnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0ZXJtLnRvVXBwZXJDYXNlKCkpICE9PSAtMTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZldGNoRGF0YSh0ZXJtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPElxU2VsZWN0Mkl0ZW1bXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgICAgIC5kYXRhU291cmNlUHJvdmlkZXIodGVybSwgdGhpcy5idWlsZFZhbHVlKCkpXHJcbiAgICAgICAgICAgIC5waXBlKG1hcCgoaXRlbXM6IGFueVtdKSA9PiB0aGlzLmFkYXB0SXRlbXMoaXRlbXMpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGFwdEl0ZW1zKGl0ZW1zOiBhbnlbXSk6IElxU2VsZWN0Mkl0ZW1bXSB7XHJcbiAgICAgICAgY29uc3QgY29udmVydGVkSXRlbXMgPSBbXTtcclxuICAgICAgICBpdGVtcy5tYXAoKGl0ZW0pID0+IHRoaXMuaXFTZWxlY3QySXRlbUFkYXB0ZXIoaXRlbSkpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChpcVNlbGVjdDJJdGVtKSA9PiBjb252ZXJ0ZWRJdGVtcy5wdXNoKGlxU2VsZWN0Mkl0ZW0pKTtcclxuICAgICAgICByZXR1cm4gY29udmVydGVkSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwb3B1bGF0ZUl0ZW1zRnJvbUVudGl0aWVzKHNlbGVjdGVkVmFsdWVzOiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZU11bHRpcGxlV2l0aEVudGl0aWVzKHNlbGVjdGVkVmFsdWVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpcVNlbGVjdDJJdGVtID0gdGhpcy5pcVNlbGVjdDJJdGVtQWRhcHRlcihzZWxlY3RlZFZhbHVlcyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtpcVNlbGVjdDJJdGVtXTtcclxuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlclNlbGVjdGVkID0gaXFTZWxlY3QySXRlbS50ZXh0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZU11bHRpcGxlV2l0aEVudGl0aWVzKHNlbGVjdGVkVmFsdWVzOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICBzZWxlY3RlZFZhbHVlcy5mb3JFYWNoKChlbnRpdHkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXFTZWxlY3QySXRlbUFkYXB0ZXIoZW50aXR5KTtcclxuICAgICAgICAgICAgY29uc3QgaWRzID0gdGhpcy5nZXRTZWxlY3RlZElkcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlkcy5pbmRleE9mKGl0ZW0uaWQpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBvcHVsYXRlSXRlbXNGcm9tSWRzKHNlbGVjdGVkVmFsdWVzOiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZU11bHRpcGxlV2l0aElkcyhzZWxlY3RlZFZhbHVlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVTaW5nbGVXaXRoSWQoc2VsZWN0ZWRWYWx1ZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZU11bHRpcGxlV2l0aElkcyhzZWxlY3RlZFZhbHVlczogYW55KSB7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkVmFsdWVzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RlZFByb3ZpZGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgdW5pcXVlSWRzID0gW107XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzLmZvckVhY2goKGlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlSWRzLmluZGV4T2YoaWQpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkcy5wdXNoKGlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJvdmlkZXIodW5pcXVlSWRzKS5zdWJzY3JpYmUoKGl0ZW1zOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gaXRlbXMubWFwKHRoaXMuaXFTZWxlY3QySXRlbUFkYXB0ZXIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVTaW5nbGVXaXRoSWQoaWQ6IGFueSkge1xyXG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuc2VsZWN0ZWRQcm92aWRlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQcm92aWRlcihbaWRdKS5zdWJzY3JpYmUoKGl0ZW1zOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlxU2VsZWN0Mkl0ZW0gPSB0aGlzLmlxU2VsZWN0Mkl0ZW1BZGFwdGVyKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtpcVNlbGVjdDJJdGVtXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyU2VsZWN0ZWQgPSBpcVNlbGVjdDJJdGVtLnRleHQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWxyZWFkeVNlbGVjdGVkKGl0ZW06IElxU2VsZWN0Mkl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmZvckVhY2goc2VsZWN0ZWRJdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbS5pZCA9PT0gaXRlbS5pZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgb25JdGVtU2VsZWN0ZWQoaXRlbTogSXFTZWxlY3QySXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdERhdGEuaW5kZXhPZihpdGVtLCAwKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdERhdGEuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh0aGlzLmJ1aWxkVmFsdWUoKSk7XHJcbiAgICAgICAgdGhpcy50ZXJtLnBhdGNoVmFsdWUoJycsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzKCksIDEpO1xyXG4gICAgICAgIHRoaXMucmVzdWx0c1Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9uU2VsZWN0LmVtaXQoaXRlbSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXJTZWxlY3RlZCA9IGl0ZW0udGV4dDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTZWxlY3RlZElkcygpOiBhbnkge1xyXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaWRzLnB1c2goaXRlbS5pZCkpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGlkcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCA/IG51bGwgOiB0aGlzLnNlbGVjdGVkSXRlbXNbMF0uaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0RW50aXRpZXMoKTogYW55W10ge1xyXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVudGl0aWVzID0gW107XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIGVudGl0aWVzLnB1c2goaXRlbS5lbnRpdHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBlbnRpdGllcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCA/IG51bGwgOiB0aGlzLnNlbGVjdGVkSXRlbXNbMF0uZW50aXR5O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVJdGVtKGl0ZW06IElxU2VsZWN0Mkl0ZW0pIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGl0ZW0sIDApO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh0aGlzLmJ1aWxkVmFsdWUoKSk7XHJcbiAgICAgICAgdGhpcy5vblJlbW92ZS5lbWl0KGl0ZW0pO1xyXG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyU2VsZWN0ZWQgPSAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZFZhbHVlKCkge1xyXG4gICAgICAgIHJldHVybiAnaWQnID09PSB0aGlzLnJlZmVyZW5jZU1vZGUgPyB0aGlzLmdldFNlbGVjdGVkSWRzKCkgOiB0aGlzLmdldEVudGl0aWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Gb2N1cygpIHtcclxuICAgICAgICB0aGlzLnNlYXJjaEZvY3VzZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQmx1cigpIHtcclxuICAgICAgICB0aGlzLnRlcm0ucGF0Y2hWYWx1ZSgnJywge2VtaXRFdmVudDogZmFsc2V9KTtcclxuICAgICAgICB0aGlzLnNlYXJjaEZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlc3VsdHNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnRlcm1JbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c1Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hGb2N1c2VkID0gIXRoaXMuZGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXNBbmRTaG93UmVzdWx0cygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy50ZXJtSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvUmVzdWx0cyhvZignJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlYXJjaEZvY3VzZWQgPSAhdGhpcy5kaXNhYmxlZDtcclxuICAgIH1cclxuXHJcbiAgICBvbktleVVwKGV2KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0cykge1xyXG4gICAgICAgICAgICBpZiAoZXYua2V5Q29kZSA9PT0gS0VZX0NPREVfRE9XTl9BUlJPVykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLmFjdGl2ZU5leHQoKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID09PSBLRVlfQ09ERV9VUF9BUlJPVykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLmFjdGl2ZVByZXZpb3VzKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXYua2V5Q29kZSA9PT0gS0VZX0NPREVfRU5URVIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5zZWxlY3RDdXJyZW50SXRlbSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubWluaW11bUlucHV0TGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXYua2V5Q29kZSA9PT0gS0VZX0NPREVfRU5URVIgfHwgZXYua2V5Q29kZSA9PT0gS0VZX0NPREVfRE9XTl9BUlJPVykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNBbmRTaG93UmVzdWx0cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uS2V5RG93bihldikge1xyXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdHMpIHtcclxuICAgICAgICAgICAgaWYgKGV2LmtleUNvZGUgPT09IEtFWV9DT0RFX1RBQikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnNlbGVjdEN1cnJlbnRJdGVtKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldi5rZXlDb2RlID09PSBLRVlfQ09ERV9ERUxFVEUpIHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dEVudGVyZWQgPSAhdGhpcy50ZXJtLnZhbHVlIHx8IHRoaXMudGVybS52YWx1ZS5sZW5ndGggPT09IDA7XHJcbiAgICAgICAgICAgIGlmICh0ZXh0RW50ZXJlZCAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKHRoaXMuc2VsZWN0ZWRJdGVtc1t0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uS2V5UHJlc3MoZXYpIHtcclxuICAgICAgICBpZiAoZXYua2V5Q29kZSA9PT0gS0VZX0NPREVfRU5URVIpIHtcclxuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3NzKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdzZWxlY3QyLXNlbGVjdGlvbi1jb250YWluZXIgJyArICh0aGlzLmNzcyA9PT0gdW5kZWZpbmVkID8gJycgOiB0aGlzLmNzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgPyB0aGlzLnBsYWNlaG9sZGVyU2VsZWN0ZWQgOiB0aGlzLnBsYWNlaG9sZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvdW50TWVzc2FnZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBtc2cgPSB0aGlzLm1lc3NhZ2VzICYmIHRoaXMubWVzc2FnZXMubW9yZVJlc3VsdHNBdmFpbGFibGVNc2cgPyB0aGlzLm1lc3NhZ2VzLm1vcmVSZXN1bHRzQXZhaWxhYmxlTXNnIDogdGhpcy5NT1JFX1JFU1VMVFNfTVNHO1xyXG4gICAgICAgIG1zZyA9IG1zZy5yZXBsYWNlKE1lc3NhZ2VzLlBBUlRJQUxfQ09VTlRfVkFSLCBTdHJpbmcodGhpcy5saXN0RGF0YS5sZW5ndGgpKTtcclxuICAgICAgICBtc2cgPSBtc2cucmVwbGFjZShNZXNzYWdlcy5UT1RBTF9DT1VOVF9WQVIsIFN0cmluZyh0aGlzLnJlc3VsdHNDb3VudCAtIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGgpKTtcclxuICAgICAgICByZXR1cm4gbXNnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJhZGdlQ29sb3IoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/ICdiZy0nICsgdGhpcy5iYWRnZUNvbG9yIDogJyc7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJzZWxlY3QyLWNvbnRhaW5lclwiPlxyXG4gICAgPHVsIChjbGljayk9XCJmb2N1c0FuZFNob3dSZXN1bHRzKClcIlxyXG4gICAgICAgIFtjbGFzc109XCJnZXRDc3MoKVwiXHJcbiAgICAgICAgW2NsYXNzLnNpbXBsZS1zZWxlY3Rpb25dPVwiIW11bHRpcGxlXCJcclxuICAgICAgICBbY2xhc3MubXVsdGlwbGUtc2VsZWN0aW9uXT1cIm11bHRpcGxlXCJcclxuICAgICAgICBbY2xhc3Muc2VhcmNoLWZvY3VzZWRdPVwic2VhcmNoRm9jdXNlZFwiXHJcbiAgICAgICAgW2NsYXNzLnJlYWRvbmx5XT1cImRpc2FibGVkXCI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2VhcmNoRm9jdXNlZCB8fCBtdWx0aXBsZVwiPlxyXG4gICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ3NlbGVjdDItc2VsZWN0ZWQgJyArIGdldEJhZGdlQ29sb3IoKVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYmFkZ2VdPVwibXVsdGlwbGVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdGVkSXRlbVRleHRcIj57e2l0ZW0udGV4dH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFkaXNhYmxlZFwiIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb24tcmVtb3ZlXCIgKGNsaWNrKT1cInJlbW92ZUl0ZW0oaXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cImRlbGV0ZUljb25cIiBbY2xhc3NdPVwiZGVsZXRlSWNvblwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWRlbGV0ZUljb25cIiAoY2xpY2spPVwicmVtb3ZlSXRlbShpdGVtKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIFtjbGFzcy5idG4tY2xvc2Utd2hpdGVdPVwibXVsdGlwbGVcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJzZWxlY3QyLWlucHV0XCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCAjdGVybUlucHV0IHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRQbGFjZWhvbGRlcigpXCJcclxuICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ0ZXJtXCJcclxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy50cmFuc3BhcmVudF09XCIhbXVsdGlwbGUgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwICYmICFzZWFyY2hGb2N1c2VkXCJcclxuICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgKGtleXVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVkXCIvPlxyXG4gICAgICAgIDwvbGk+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhZGlzYWJsZWQgJiYgKG11bHRpcGxlIHx8ICghbXVsdGlwbGUgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDApKVwiIGNsYXNzPVwiY2FyZXRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2VhcmNoSWNvblwiIGNsYXNzPVwiY2FyZXQtc3ltYm9sXCI+JiM5NjYwOzwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cInNlYXJjaEljb25cIiAqbmdJZj1cInNlYXJjaEljb24gJiYgbWluaW11bUlucHV0TGVuZ3RoPT09MFwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb2N1c0FuZFNob3dSZXN1bHRzKClcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJzZWFyY2hJY29uXCIgKm5nSWY9XCJzZWFyY2hJY29uICYmIG1pbmltdW1JbnB1dExlbmd0aCE9PTBcIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC91bD5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicmVzdWx0cy1jb250YWluZXJcIiAqbmdJZj1cInJlc3VsdHNWaXNpYmxlXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXN1bHRzLW1zZ1wiICpuZ0lmPVwibGlzdERhdGEgJiYgKGxpc3REYXRhLmxlbmd0aCArIHNlbGVjdGVkSXRlbXMubGVuZ3RoKSA8IHJlc3VsdHNDb3VudFwiPlxyXG4gICAgICAgICAgICB7e2dldENvdW50TWVzc2FnZSgpfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXN1bHRzLW1zZyBuby1yZXN1bHRzLW1zZ1wiICpuZ0lmPVwic2VhcmNoRm9jdXNlZCAmJiBsaXN0RGF0YSAmJiBsaXN0RGF0YS5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICAgICAge3ttZXNzYWdlcyAmJiBtZXNzYWdlcy5ub1Jlc3VsdHNBdmFpbGFibGVNc2cgPyBtZXNzYWdlcy5ub1Jlc3VsdHNBdmFpbGFibGVNc2cgOiBOT19SRVNVTFRTX01TR319XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxpcS1zZWxlY3QyLXJlc3VsdHMgI3Jlc3VsdHMgW3NlbGVjdGVkSXRlbXNdPVwic2VsZWN0ZWRJdGVtc1wiIFtpdGVtc109XCJsaXN0RGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbVNlbGVjdGVkRXZlbnQpPVwib25JdGVtU2VsZWN0ZWQoJGV2ZW50KTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlUmVmXT1cInRlbXBsYXRlUmVmXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hGb2N1c2VkXT1cInNlYXJjaEZvY3VzZWRcIj48L2lxLXNlbGVjdDItcmVzdWx0cz5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Created by diego on 3/13/17.
|
|
3
|
+
*/
|
|
4
|
+
export class Messages {
|
|
5
|
+
static { this.PARTIAL_COUNT_VAR = '%PARTIAL_COUNT%'; }
|
|
6
|
+
static { this.TOTAL_COUNT_VAR = '%TOTAL_COUNT%'; }
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZzItaXEtc2VsZWN0Mi9zcmMvbGliL2lxLXNlbGVjdDIvbWVzc2FnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTthQUVELHNCQUFpQixHQUFHLGlCQUFpQixDQUFDO2FBQ3RDLG9CQUFlLEdBQUcsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGllZ28gb24gMy8xMy8xNy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNZXNzYWdlcyB7XHJcblxyXG4gICAgc3RhdGljIHJlYWRvbmx5IFBBUlRJQUxfQ09VTlRfVkFSID0gJyVQQVJUSUFMX0NPVU5UJSc7XHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgVE9UQUxfQ09VTlRfVkFSID0gJyVUT1RBTF9DT1VOVCUnO1xyXG5cclxuICAgIG1vcmVSZXN1bHRzQXZhaWxhYmxlTXNnPzogc3RyaW5nO1xyXG4gICAgbm9SZXN1bHRzQXZhaWxhYmxlTXNnPzogc3RyaW5nO1xyXG59XHJcbiJdfQ==
|