@byuhbll/components 5.0.1 → 6.0.0-rc.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/fesm2022/byuhbll-components.mjs +98 -107
- package/fesm2022/byuhbll-components.mjs.map +1 -1
- package/lib/ss-search-bar/advanced-search/advanced-search.component.d.ts +1 -4
- package/lib/ss-search-bar/models/advanced-search.model.d.ts +3 -3
- package/lib/ss-search-bar/models/search-scope.model.d.ts +1 -1
- package/lib/ss-search-bar/simple-search/simple-search.component.d.ts +1 -1
- package/lib/status-button/status-button.component.d.ts +1 -1
- package/package.json +4 -6
- package/esm2022/byuhbll-components.mjs +0 -5
- package/esm2022/lib/animations/animations.mjs +0 -22
- package/esm2022/lib/checkbox/checkbox.component.mjs +0 -15
- package/esm2022/lib/contact-utils.mjs +0 -41
- package/esm2022/lib/copy-tooltip/copy-tooltip.component.mjs +0 -49
- package/esm2022/lib/expand-collapse/expand-collapse.component.mjs +0 -31
- package/esm2022/lib/hbll-footer/hbll-footer.component.mjs +0 -111
- package/esm2022/lib/hbll-header/hbll-header.component.mjs +0 -142
- package/esm2022/lib/hbll-header/models/library-hours.mjs +0 -2
- package/esm2022/lib/hbll-header/nav-bar/nav-bar.component.mjs +0 -352
- package/esm2022/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.mjs +0 -57
- package/esm2022/lib/hbll-header/pipes/library-hours.pipe.mjs +0 -31
- package/esm2022/lib/hbll-header/pipes/truncate.pipe.mjs +0 -17
- package/esm2022/lib/header-with-impersonation/header-with-impersonation.component.mjs +0 -41
- package/esm2022/lib/impersonate-modal/impersonate-modal.component.mjs +0 -190
- package/esm2022/lib/impersonation-banner/impersonation-banner.component.mjs +0 -151
- package/esm2022/lib/impersonation-banner/models/application-access.mjs +0 -7
- package/esm2022/lib/impersonation-banner/models/person-summary.mjs +0 -15
- package/esm2022/lib/models/token-payload.mjs +0 -2
- package/esm2022/lib/multi-select/multi-select.component.mjs +0 -115
- package/esm2022/lib/pipes/hbll-item-type-icon.pipe.mjs +0 -128
- package/esm2022/lib/snackbar/snackbar.component.mjs +0 -151
- package/esm2022/lib/snackbar/snackbar.service.mjs +0 -90
- package/esm2022/lib/ss-search-bar/advanced-search/advanced-search.component.mjs +0 -273
- package/esm2022/lib/ss-search-bar/constants.mjs +0 -153
- package/esm2022/lib/ss-search-bar/date-range/date-range.component.mjs +0 -71
- package/esm2022/lib/ss-search-bar/models/advanced-search.model.mjs +0 -5
- package/esm2022/lib/ss-search-bar/models/search-config.model.mjs +0 -2
- package/esm2022/lib/ss-search-bar/models/search-scope.model.mjs +0 -3
- package/esm2022/lib/ss-search-bar/pipes/advanced-field-warning.pipe.mjs +0 -34
- package/esm2022/lib/ss-search-bar/pipes/advanced-queries.pipe.mjs +0 -33
- package/esm2022/lib/ss-search-bar/pipes/field-by-scope.pipe.mjs +0 -27
- package/esm2022/lib/ss-search-bar/simple-search/simple-search.component.mjs +0 -87
- package/esm2022/lib/ss-search-bar/ss-search-bar.component.mjs +0 -98
- package/esm2022/lib/ss-search-bar/utils.mjs +0 -16
- package/esm2022/lib/status-button/status-button.component.mjs +0 -104
- package/esm2022/lib/utils.mjs +0 -7
- package/esm2022/public-api.mjs +0 -19
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, ViewChild, inject, } from '@angular/core';
|
|
2
|
-
import { NonNullableFormBuilder, ReactiveFormsModule, Validators, } from '@angular/forms';
|
|
3
|
-
import { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';
|
|
4
|
-
import { filter, startWith, tap } from 'rxjs/operators';
|
|
5
|
-
import { isAdvancedSearchFieldOption, isAdvancedSearchLocalFieldOption, isAdvancedSearchExternalFieldOption, } from '../models/advanced-search.model';
|
|
6
|
-
import { Subscription } from 'rxjs';
|
|
7
|
-
import { validateDateRangeFields } from '../utils';
|
|
8
|
-
import { CommonModule } from '@angular/common';
|
|
9
|
-
import { ADVANCED_SEARCH_FIELD_MAP, ADVANCED_SEARCH_OPTIONS, ADVANCED_SEARCH_QUALIFIER_MAP, ADVANCED_SEARCH_QUERIES_LIMIT, } from '../constants';
|
|
10
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
11
|
-
import { HbllMultiSelectComponent } from '../../multi-select/multi-select.component';
|
|
12
|
-
import { HbllCheckboxComponent } from '../../checkbox/checkbox.component';
|
|
13
|
-
import { DateRangeComponent } from '../date-range/date-range.component';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "@angular/common";
|
|
16
|
-
import * as i2 from "@angular/forms";
|
|
17
|
-
import * as i3 from "@angular/material/tooltip";
|
|
18
|
-
const DATE_VALIDATOR_REGEX = '^[0-9]{4}$';
|
|
19
|
-
export class AdvancedSearchComponent {
|
|
20
|
-
constructor() {
|
|
21
|
-
this.fb = inject(NonNullableFormBuilder);
|
|
22
|
-
this.advancedSearch = new EventEmitter();
|
|
23
|
-
this.subscription = new Subscription();
|
|
24
|
-
/**
|
|
25
|
-
* Takes a `FormGroup` and syncs up the `field` and `qualifier` values.
|
|
26
|
-
* After syncing, when the `field` value changes, the `qualifier` value will update appropriately.
|
|
27
|
-
*/
|
|
28
|
-
this.syncUpFieldAndQualifier = (fg, scope) => {
|
|
29
|
-
this.subscription.add(fg.controls.field.valueChanges
|
|
30
|
-
.pipe(filter(() => scope === 'local'), tap((val) => fg.controls.qualifier.setValue(ADVANCED_SEARCH_OPTIONS.qualifiers[val][0])))
|
|
31
|
-
.subscribe());
|
|
32
|
-
};
|
|
33
|
-
this.advancedSearchForm = this.fb.group({
|
|
34
|
-
queries: this.fb.array([], [Validators.maxLength(ADVANCED_SEARCH_QUERIES_LIMIT)]),
|
|
35
|
-
types: [[]],
|
|
36
|
-
collections: [[]],
|
|
37
|
-
languages: [[]],
|
|
38
|
-
date: this.fb.group({
|
|
39
|
-
from: ['', [Validators.maxLength(4), Validators.pattern(DATE_VALIDATOR_REGEX)]],
|
|
40
|
-
to: ['', [Validators.maxLength(4), Validators.pattern(DATE_VALIDATOR_REGEX)]],
|
|
41
|
-
}, { validators: validateDateRangeFields() }),
|
|
42
|
-
limitResults: this.fb.group({
|
|
43
|
-
peerReviewed: [false],
|
|
44
|
-
}),
|
|
45
|
-
expandResults: this.fb.group({
|
|
46
|
-
applyEquivalentSubjects: [false],
|
|
47
|
-
fullText: [false],
|
|
48
|
-
}),
|
|
49
|
-
});
|
|
50
|
-
this.isSubmitted = false;
|
|
51
|
-
this.advancedSearchOptions = ADVANCED_SEARCH_OPTIONS;
|
|
52
|
-
this.advancedSearchFieldMap = ADVANCED_SEARCH_FIELD_MAP;
|
|
53
|
-
this.advancedSearchQualifierMap = ADVANCED_SEARCH_QUALIFIER_MAP;
|
|
54
|
-
/**
|
|
55
|
-
* Add a query to `queries` `FormArray`. This FormGroup has an additional `boolean` control.
|
|
56
|
-
*/
|
|
57
|
-
this.addQuery = () => {
|
|
58
|
-
this.queries.push(this.fb.group({
|
|
59
|
-
boolean: [ADVANCED_SEARCH_OPTIONS.boolean[0]],
|
|
60
|
-
field: [
|
|
61
|
-
ADVANCED_SEARCH_OPTIONS.fields[0],
|
|
62
|
-
],
|
|
63
|
-
qualifier: [
|
|
64
|
-
ADVANCED_SEARCH_OPTIONS.qualifiers[ADVANCED_SEARCH_OPTIONS.localFields[0]][0],
|
|
65
|
-
],
|
|
66
|
-
query: ['', Validators.required],
|
|
67
|
-
}));
|
|
68
|
-
this.syncUpFieldAndQualifier(this.queries.at(-1), this.config.scope);
|
|
69
|
-
};
|
|
70
|
-
this.removeQuery = (i) => {
|
|
71
|
-
this.queries.removeAt(i);
|
|
72
|
-
};
|
|
73
|
-
/**
|
|
74
|
-
* Prepares appropriate query params before performing a local advanced search.
|
|
75
|
-
*/
|
|
76
|
-
this.doLocalAdvancedSearch = () => {
|
|
77
|
-
this.doAdvancedSearch({
|
|
78
|
-
localAdvancedSearch: {
|
|
79
|
-
...this.config.localAdvancedSearch,
|
|
80
|
-
creationDate: this.gatherToAndFromValues(),
|
|
81
|
-
selectedLanguages: this.languages.value,
|
|
82
|
-
selectedResourceTypes: this.types.value,
|
|
83
|
-
selectedCollections: this.collections.value,
|
|
84
|
-
},
|
|
85
|
-
});
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* Prepares appropriate query params before performing an external advanced search.
|
|
89
|
-
*/
|
|
90
|
-
this.doExternalAdvancedSearch = () => {
|
|
91
|
-
this.doAdvancedSearch({
|
|
92
|
-
externalAdvancedSearch: {
|
|
93
|
-
...this.config.externalAdvancedSearch,
|
|
94
|
-
datePublished: this.gatherToAndFromValues(),
|
|
95
|
-
selectedLanguages: this.languages.value,
|
|
96
|
-
limitResults: {
|
|
97
|
-
peerReviewed: this.peerReviewed.value,
|
|
98
|
-
},
|
|
99
|
-
expandResults: {
|
|
100
|
-
applyEquivalentSubjects: this.applyEquivalentSubjects.value,
|
|
101
|
-
fullText: this.fullText.value,
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
};
|
|
106
|
-
/**
|
|
107
|
-
* Compares 'from' and 'to' to ensure 'to' is >= to 'from', else swaps them.
|
|
108
|
-
*/
|
|
109
|
-
this.gatherToAndFromValues = () => {
|
|
110
|
-
const from = this.from.value
|
|
111
|
-
? parseInt(this.from.value) <= parseInt(this.to.value)
|
|
112
|
-
? this.from.value
|
|
113
|
-
: this.to.value
|
|
114
|
-
: '';
|
|
115
|
-
const to = this.to.value
|
|
116
|
-
? parseInt(this.to.value) >= parseInt(this.from.value)
|
|
117
|
-
? this.to.value
|
|
118
|
-
: this.from.value
|
|
119
|
-
: '';
|
|
120
|
-
return { from, to };
|
|
121
|
-
};
|
|
122
|
-
/**
|
|
123
|
-
* Verifies that there is a query to use, gathers all other query parameters needed, then performs an advanced search via `router.navigate()`.
|
|
124
|
-
* @param {Record<string, string>} queryParams base set of query params to navigate with
|
|
125
|
-
*/
|
|
126
|
-
this.doAdvancedSearch = (updatedProps) => {
|
|
127
|
-
this.isSubmitted = true;
|
|
128
|
-
// Don't perform a search unless there is at least one query
|
|
129
|
-
if (this.queries.at(0).controls.query.invalid &&
|
|
130
|
-
!this.queries.value.some((v) => !!v.query)) {
|
|
131
|
-
this.showSearchValidationToolTip();
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
// Don't perform a search unless the date form is valid
|
|
135
|
-
if (this.advancedSearchForm.controls.date.invalid)
|
|
136
|
-
return;
|
|
137
|
-
this.advancedSearch.emit({
|
|
138
|
-
...this.config,
|
|
139
|
-
...updatedProps,
|
|
140
|
-
advancedSearchQueryRows: this.queries.value,
|
|
141
|
-
});
|
|
142
|
-
this.isSubmitted = false;
|
|
143
|
-
};
|
|
144
|
-
this.showSearchValidationToolTip = () => {
|
|
145
|
-
this.searchInput.nativeElement.focus();
|
|
146
|
-
this.inputTooltip.disabled = false;
|
|
147
|
-
this.inputTooltip.show();
|
|
148
|
-
};
|
|
149
|
-
this.setupForm = () => {
|
|
150
|
-
this.queries.clear();
|
|
151
|
-
// Always keep at least two queries available
|
|
152
|
-
this.addQuery();
|
|
153
|
-
this.addQuery();
|
|
154
|
-
// Ensure validation tooltip closes when uses enters a query
|
|
155
|
-
this.subscription.add(this.queries
|
|
156
|
-
.at(0)
|
|
157
|
-
.controls.query.valueChanges.pipe(startWith(''))
|
|
158
|
-
.pipe(filter(() => !!this.inputTooltip))
|
|
159
|
-
.subscribe(() => (this.inputTooltip.disabled = true)));
|
|
160
|
-
// If no `q{NUM}` use `q` for first query
|
|
161
|
-
if (!this.config.advancedSearchQueryRows.length)
|
|
162
|
-
this.queries.at(0).controls.query.setValue(this.config.q);
|
|
163
|
-
this.config.advancedSearchQueryRows.forEach((queryRow, i) => {
|
|
164
|
-
// Add a query form control for every q{num} key after the first.
|
|
165
|
-
let queryControl = null;
|
|
166
|
-
if (i === 0 || i === 1) {
|
|
167
|
-
queryControl = this.queries.at(i);
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
this.addQuery();
|
|
171
|
-
queryControl = this.queries.at(-1);
|
|
172
|
-
}
|
|
173
|
-
// Add the query value.
|
|
174
|
-
queryControl.controls.query.setValue(queryRow.query);
|
|
175
|
-
// Add the field value, if available.
|
|
176
|
-
if (queryRow.field && // Only set the field if the value belongs to the current scope
|
|
177
|
-
(isAdvancedSearchFieldOption(queryRow.field) ||
|
|
178
|
-
(this.config.scope === 'local'
|
|
179
|
-
? isAdvancedSearchLocalFieldOption(queryRow.field)
|
|
180
|
-
: isAdvancedSearchExternalFieldOption(queryRow.field))))
|
|
181
|
-
queryControl.controls.field.setValue(queryRow.field);
|
|
182
|
-
else
|
|
183
|
-
queryControl.controls.field.setValue(this.advancedSearchOptions.fields[0]);
|
|
184
|
-
// Add the qualifier value, if available and a local search.
|
|
185
|
-
if (this.config.scope === 'local' && queryRow.qualifier)
|
|
186
|
-
queryControl.controls.qualifier.setValue(queryRow.qualifier ||
|
|
187
|
-
this.advancedSearchOptions.qualifiers[queryControl.controls.field.value]);
|
|
188
|
-
// Add the boolean, if available and not the first query.
|
|
189
|
-
if (i !== 0 && queryRow.boolean)
|
|
190
|
-
queryControl.controls.boolean.setValue(queryRow.boolean);
|
|
191
|
-
});
|
|
192
|
-
if (this.config.scope === 'local') {
|
|
193
|
-
this.types.setValue(this.config.localAdvancedSearch.selectedResourceTypes);
|
|
194
|
-
this.collections.setValue(this.config.localAdvancedSearch.selectedCollections);
|
|
195
|
-
this.languages.setValue(this.config.localAdvancedSearch.selectedLanguages);
|
|
196
|
-
this.from.setValue(this.config.localAdvancedSearch.creationDate.from);
|
|
197
|
-
this.to.setValue(this.config.localAdvancedSearch.creationDate.to);
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
this.languages.setValue(this.config.externalAdvancedSearch
|
|
201
|
-
.selectedLanguages);
|
|
202
|
-
this.from.setValue(this.config.externalAdvancedSearch.datePublished.from);
|
|
203
|
-
this.to.setValue(this.config.externalAdvancedSearch.datePublished.to);
|
|
204
|
-
this.peerReviewed.setValue(this.config.externalAdvancedSearch.limitResults.peerReviewed);
|
|
205
|
-
this.applyEquivalentSubjects.setValue(this.config.externalAdvancedSearch.expandResults.applyEquivalentSubjects);
|
|
206
|
-
this.fullText.setValue(this.config.externalAdvancedSearch.expandResults.fullText);
|
|
207
|
-
}
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
set config(config) {
|
|
211
|
-
this._config = config;
|
|
212
|
-
this.setupForm();
|
|
213
|
-
}
|
|
214
|
-
get config() {
|
|
215
|
-
return this._config;
|
|
216
|
-
}
|
|
217
|
-
ngOnDestroy() {
|
|
218
|
-
this.subscription.unsubscribe();
|
|
219
|
-
}
|
|
220
|
-
get queries() {
|
|
221
|
-
return this.advancedSearchForm.controls.queries;
|
|
222
|
-
}
|
|
223
|
-
get types() {
|
|
224
|
-
return this.advancedSearchForm.controls.types;
|
|
225
|
-
}
|
|
226
|
-
get collections() {
|
|
227
|
-
return this.advancedSearchForm.controls.collections;
|
|
228
|
-
}
|
|
229
|
-
get languages() {
|
|
230
|
-
return this.advancedSearchForm.controls.languages;
|
|
231
|
-
}
|
|
232
|
-
get from() {
|
|
233
|
-
return this.advancedSearchForm.controls.date.controls.from;
|
|
234
|
-
}
|
|
235
|
-
get to() {
|
|
236
|
-
return this.advancedSearchForm.controls.date.controls.to;
|
|
237
|
-
}
|
|
238
|
-
get peerReviewed() {
|
|
239
|
-
return this.advancedSearchForm.controls.limitResults.controls.peerReviewed;
|
|
240
|
-
}
|
|
241
|
-
get fullText() {
|
|
242
|
-
return this.advancedSearchForm.controls.expandResults.controls.fullText;
|
|
243
|
-
}
|
|
244
|
-
get applyEquivalentSubjects() {
|
|
245
|
-
return this.advancedSearchForm.controls.expandResults.controls.applyEquivalentSubjects;
|
|
246
|
-
}
|
|
247
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
248
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: AdvancedSearchComponent, isStandalone: true, selector: "lib-ss-advanced-search", inputs: { config: "config" }, outputs: { advancedSearch: "advancedSearch" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "inputTooltip", first: true, predicate: MatTooltip, descendants: true }], ngImport: i0, template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"ss-adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"ss-adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"ss-hidden\">Field {{ queryIndex }}</label>\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"ss-hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"ss-hidden\">Query {{ queryIndex }}</label>\n <div class=\"ss-query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"ss-row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"ss-other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"advancedSearchOptions.types[config.institution]\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"advancedSearchOptions.collections[config.institution]\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-multi-select>\n </div>\n </div>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Creation Date' }\"\n ></ng-container>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"ss-checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"ss-checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-checkbox [isChecked]=\"peerReviewed.value\"></lib-checkbox>\n <span class=\"ss-label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"ss-checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply equivalent subjects -->\n <label class=\"ss-checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-checkbox [isChecked]=\"applyEquivalentSubjects.value\"></lib-checkbox>\n <span class=\"ss-label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"ss-checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-checkbox [isChecked]=\"fullText.value\"></lib-checkbox>\n <span class=\"ss-label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Date Published' }\"\n ></ng-container>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n }\n </div>\n <div id=\"advSearchFooter\">\n <a [href]=\"'https://lib.byu.edu/browse/' + config.institution\">Alphabetic Browse</a>\n <button\n class=\"pill-btn--components\"\n [ngClass]=\"{\n ensign: config.institution === 'ensign',\n }\"\n type=\"submit\"\n data-testid=\"advSearchSubmitButton\"\n >\n Search\n </button>\n </div>\n</form>\n\n<ng-template #languageBlock>\n <div>\n <h4>Language</h4>\n <lib-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-multi-select>\n </div>\n</ng-template>\n<ng-template #dateBlock let-header=\"header\">\n <div id=\"dateOptions\" class=\"external\">\n <h4>{{ header }}</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n</ng-template>\n", styles: ["button.ensign{background-color:#2b6042!important;border-color:#2a6142}button.ensign:hover{background-color:#357551!important}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{outline-color:#3a6093}.ss-select-wrapper{position:relative}.ss-select-wrapper select{cursor:pointer;padding-right:2em}.ss-select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}.pill-btn--components{background-color:#4070b0;font-size:1em;transition:all .15s;color:#fff;cursor:pointer;font-weight:600;text-align:center}.pill-btn--components:disabled{color:#707070;background-color:#e6e6e6;pointer-events:none}.pill-btn--components:hover{background-color:#6892ca;color:#fff}.destructive.pill-btn--components{background-color:#b04940}.destructive.pill-btn--components:hover{background-color:#c7574d}.pill-btn--components{border-radius:100em;padding:.4em 1.3em}:host{box-sizing:border-box}:host *{box-sizing:inherit}.ss-select-wrapper{margin-right:.3em}.ss-row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.ss-row-cancel:hover{color:#666}.ss-row-cancel .ss-icon{font-size:1em}.ss-hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.ss-adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em;margin-top:0}h4{margin-bottom:.3em;font-weight:600}#dateOptions h4{margin-bottom:.8em}.ss-adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.ss-query-input{display:inline-block;width:100%;margin-top:.25rem}.ss-query-input input{width:100%}.ss-other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.ss-other-options label{margin-right:.625rem}.ss-checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.ss-checkbox-label:not(:last-of-type){margin-bottom:.75em}.ss-checkbox-label .ss-label-text{margin-top:-.1em;margin-left:.45em}.ss-checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:space-between;align-items:center;font-size:1.2em}#advSearchFooter a{font-size:.8em}@media screen and (min-width: 615px){.ss-adv-search-row{flex-wrap:nowrap}.ss-other-options{grid-template-columns:repeat(2,1fr)}.ss-query-input{margin-top:0}#dateOptions .external{grid-column:span 2}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: HbllMultiSelectComponent, selector: "lib-multi-select", inputs: ["allOptions", "label", "selectedKeys"], outputs: ["selectedKeysChange"] }, { kind: "component", type: HbllCheckboxComponent, selector: "lib-checkbox", inputs: ["isChecked"] }, { kind: "component", type: DateRangeComponent, selector: "lib-date-range", inputs: ["from", "to"], outputs: ["validDateChange", "fromChange", "toChange"] }] }); }
|
|
249
|
-
}
|
|
250
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AdvancedSearchComponent, decorators: [{
|
|
251
|
-
type: Component,
|
|
252
|
-
args: [{ selector: 'lib-ss-advanced-search', standalone: true, imports: [
|
|
253
|
-
CommonModule,
|
|
254
|
-
ReactiveFormsModule,
|
|
255
|
-
MatTooltipModule,
|
|
256
|
-
MatIconModule,
|
|
257
|
-
HbllMultiSelectComponent,
|
|
258
|
-
HbllCheckboxComponent,
|
|
259
|
-
DateRangeComponent,
|
|
260
|
-
], template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"ss-adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"ss-adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"ss-hidden\">Field {{ queryIndex }}</label>\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"ss-hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"ss-hidden\">Query {{ queryIndex }}</label>\n <div class=\"ss-query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"ss-row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"ss-other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"advancedSearchOptions.types[config.institution]\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"advancedSearchOptions.collections[config.institution]\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-multi-select>\n </div>\n </div>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Creation Date' }\"\n ></ng-container>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"ss-checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"ss-checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-checkbox [isChecked]=\"peerReviewed.value\"></lib-checkbox>\n <span class=\"ss-label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"ss-checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply equivalent subjects -->\n <label class=\"ss-checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-checkbox [isChecked]=\"applyEquivalentSubjects.value\"></lib-checkbox>\n <span class=\"ss-label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"ss-checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-checkbox [isChecked]=\"fullText.value\"></lib-checkbox>\n <span class=\"ss-label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Date Published' }\"\n ></ng-container>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n }\n </div>\n <div id=\"advSearchFooter\">\n <a [href]=\"'https://lib.byu.edu/browse/' + config.institution\">Alphabetic Browse</a>\n <button\n class=\"pill-btn--components\"\n [ngClass]=\"{\n ensign: config.institution === 'ensign',\n }\"\n type=\"submit\"\n data-testid=\"advSearchSubmitButton\"\n >\n Search\n </button>\n </div>\n</form>\n\n<ng-template #languageBlock>\n <div>\n <h4>Language</h4>\n <lib-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-multi-select>\n </div>\n</ng-template>\n<ng-template #dateBlock let-header=\"header\">\n <div id=\"dateOptions\" class=\"external\">\n <h4>{{ header }}</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n</ng-template>\n", styles: ["button.ensign{background-color:#2b6042!important;border-color:#2a6142}button.ensign:hover{background-color:#357551!important}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{outline-color:#3a6093}.ss-select-wrapper{position:relative}.ss-select-wrapper select{cursor:pointer;padding-right:2em}.ss-select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}.pill-btn--components{background-color:#4070b0;font-size:1em;transition:all .15s;color:#fff;cursor:pointer;font-weight:600;text-align:center}.pill-btn--components:disabled{color:#707070;background-color:#e6e6e6;pointer-events:none}.pill-btn--components:hover{background-color:#6892ca;color:#fff}.destructive.pill-btn--components{background-color:#b04940}.destructive.pill-btn--components:hover{background-color:#c7574d}.pill-btn--components{border-radius:100em;padding:.4em 1.3em}:host{box-sizing:border-box}:host *{box-sizing:inherit}.ss-select-wrapper{margin-right:.3em}.ss-row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.ss-row-cancel:hover{color:#666}.ss-row-cancel .ss-icon{font-size:1em}.ss-hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.ss-adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em;margin-top:0}h4{margin-bottom:.3em;font-weight:600}#dateOptions h4{margin-bottom:.8em}.ss-adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.ss-query-input{display:inline-block;width:100%;margin-top:.25rem}.ss-query-input input{width:100%}.ss-other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.ss-other-options label{margin-right:.625rem}.ss-checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.ss-checkbox-label:not(:last-of-type){margin-bottom:.75em}.ss-checkbox-label .ss-label-text{margin-top:-.1em;margin-left:.45em}.ss-checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:space-between;align-items:center;font-size:1.2em}#advSearchFooter a{font-size:.8em}@media screen and (min-width: 615px){.ss-adv-search-row{flex-wrap:nowrap}.ss-other-options{grid-template-columns:repeat(2,1fr)}.ss-query-input{margin-top:0}#dateOptions .external{grid-column:span 2}}\n"] }]
|
|
261
|
-
}], propDecorators: { config: [{
|
|
262
|
-
type: Input,
|
|
263
|
-
args: [{ required: true }]
|
|
264
|
-
}], advancedSearch: [{
|
|
265
|
-
type: Output
|
|
266
|
-
}], searchInput: [{
|
|
267
|
-
type: ViewChild,
|
|
268
|
-
args: ['searchInput']
|
|
269
|
-
}], inputTooltip: [{
|
|
270
|
-
type: ViewChild,
|
|
271
|
-
args: [MatTooltip]
|
|
272
|
-
}] } });
|
|
273
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zcy1zZWFyY2gtYmFyL2FkdmFuY2VkLXNlYXJjaC9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvYWR2YW5jZWQtc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFTSCwyQkFBMkIsRUFDM0IsZ0NBQWdDLEVBQ2hDLG1DQUFtQyxHQUN0QyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQ2hDLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxhQUFhLEVB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ZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEZvcm1Db250cm9sLFxuICAgIEZvcm1Hcm91cCxcbiAgICBOb25OdWxsYWJsZUZvcm1CdWlsZGVyLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCwgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgZmlsdGVyLCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAgQWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvbixcbiAgICBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyLFxuICAgIEFkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvbixcbiAgICBBZHZhbmNlZFNlYXJjaFF1ZXJ5Um93LFxuICAgIEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb24sXG4gICAgaXNBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uLFxuICAgIGlzQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uLFxuICAgIGlzQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxufSBmcm9tICcuLi9tb2RlbHMvYWR2YW5jZWQtc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdmFsaWRhdGVEYXRlUmFuZ2VGaWVsZHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBRFZBTkNFRF9TRUFSQ0hfRklFTERfTUFQLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9RVUVSSUVTX0xJTUlULFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGJsbENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVSYW5nZUNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtcmFuZ2UvZGF0ZS1yYW5nZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VhcmNoQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL3NlYXJjaC1jb25maWcubW9kZWwnO1xuXG50eXBlIFF1ZXJ5Um93ID0ge1xuICAgIGJvb2xlYW46IEZvcm1Db250cm9sPEFkdmFuY2VkU2VhcmNoQm9vbGVhbk9wdGlvbj47XG4gICAgZmllbGQ6IEZvcm1Db250cm9sPFxuICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb25cbiAgICAgICAgfCBBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb25cbiAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEV4dGVybmFsRmllbGRPcHRpb25cbiAgICA+O1xuICAgIHF1YWxpZmllcjogRm9ybUNvbnRyb2w8QWR2YW5jZWRTZWFyY2hRdWFsaWZpZXJPcHRpb24+O1xuICAgIHF1ZXJ5OiBGb3JtQ29udHJvbDxzdHJpbmc+O1xufTtcblxuY29uc3QgREFURV9WQUxJREFUT1JfUkVHRVggPSAnXlswLTldezR9JCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLXNzLWFkdmFuY2VkLXNlYXJjaCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50LnNjc3MnXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcbiAgICAgICAgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50LFxuICAgICAgICBIYmxsQ2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIERhdGVSYW5nZUNvbXBvbmVudCxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFNlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmYiA9IGluamVjdChOb25OdWxsYWJsZUZvcm1CdWlsZGVyKTtcbiAgICBwcml2YXRlIF9jb25maWchOiBTZWFyY2hDb25maWc7XG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc2V0IGNvbmZpZyhjb25maWc6IFNlYXJjaENvbmZpZykge1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuc2V0dXBGb3JtKCk7XG4gICAgfVxuICAgIGdldCBjb25maWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gICAgfVxuICAgIEBPdXRwdXQoKSBhZHZhbmNlZFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VhcmNoQ29uZmlnPigpO1xuXG4gICAgLy8gVGhvdWdoIG11bHRpcGxlIGluc3RhbmNlcyBleGlzdHMsIHRoaXMgcmVwcmVzZW50IHF1ZXJ5IDEuXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXQnKSBwcml2YXRlIHNlYXJjaElucHV0ITogRWxlbWVudFJlZjtcbiAgICAvLyBUaGUgdG9vbHRpcCBpcyBkaXNhYmxlZCBpbiB0aGUgdGVtcGxhdGUuXG4gICAgLy8gSXQgaXMgZW5hYmxlZCBhbmQgZGlzcGxheWVkIGlmIGEgdXNlciBzZWFyY2hlcyBhZ2FpbnN0IGFuIGVtcHR5IHF1ZXJ5IChzaW1wbGUgb3IgcTEpLlxuICAgIC8vIEFueSBjaGFuZ2UgdG8gdGhlIHNlYXJjaCBmaWVsZCBkaXNhYmxlcyB0aGUgdG9vbHRpcC5cbiAgICBAVmlld0NoaWxkKE1hdFRvb2x0aXApIHByaXZhdGUgaW5wdXRUb29sdGlwITogTWF0VG9vbHRpcDtcblxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSBgRm9ybUdyb3VwYCBhbmQgc3luY3MgdXAgdGhlIGBmaWVsZGAgYW5kIGBxdWFsaWZpZXJgIHZhbHVlcy5cbiAgICAgKiBBZnRlciBzeW5jaW5nLCB3aGVuIHRoZSBgZmllbGRgIHZhbHVlIGNoYW5nZXMsIHRoZSBgcXVhbGlmaWVyYCB2YWx1ZSB3aWxsIHVwZGF0ZSBhcHByb3ByaWF0ZWx5LlxuICAgICAqL1xuICAgIHByaXZhdGUgc3luY1VwRmllbGRBbmRRdWFsaWZpZXIgPSAoXG4gICAgICAgIGZnOiBGb3JtR3JvdXA8e1xuICAgICAgICAgICAgYm9vbGVhbjogRm9ybUNvbnRyb2w7XG4gICAgICAgICAgICBmaWVsZDogRm9ybUNvbnRyb2w7XG4gICAgICAgICAgICBxdWFsaWZpZXI6IEZvcm1Db250cm9sO1xuICAgICAgICAgICAgcXVlcnk6IEZvcm1Db250cm9sO1xuICAgICAgICB9PixcbiAgICAgICAgc2NvcGU6IFNlYXJjaENvbmZpZ1snc2NvcGUnXSxcbiAgICApID0+IHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgZmcuY29udHJvbHMuZmllbGQudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiBzY29wZSA9PT0gJ2xvY2FsJyksXG4gICAgICAgICAgICAgICAgICAgIHRhcCgodmFsOiBBZHZhbmNlZFNlYXJjaFF1YWxpZmllcikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZnLmNvbnRyb2xzLnF1YWxpZmllci5zZXRWYWx1ZShBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5xdWFsaWZpZXJzW3ZhbF1bMF0pLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCksXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBhZHZhbmNlZFNlYXJjaEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgcXVlcmllczogdGhpcy5mYi5hcnJheTxGb3JtR3JvdXA8UXVlcnlSb3c+PihcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKEFEVkFOQ0VEX1NFQVJDSF9RVUVSSUVTX0xJTUlUKV0sXG4gICAgICAgICksXG4gICAgICAgIHR5cGVzOiBbW10gYXMgc3RyaW5nW11dLFxuICAgICAgICBjb2xsZWN0aW9uczogW1tdIGFzIHN0cmluZ1tdXSxcbiAgICAgICAgbGFuZ3VhZ2VzOiBbW10gYXMgQWR2YW5jZWRTZWFyY2hMYW5ndWFnZU9wdGlvbltdXSxcbiAgICAgICAgZGF0ZTogdGhpcy5mYi5ncm91cChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmcm9tOiBbJycsIFtWYWxpZGF0b3JzLm1heExlbmd0aCg0KSwgVmFsaWRhdG9ycy5wYXR0ZXJuKERBVEVfVkFMSURBVE9SX1JFR0VYKV1dLFxuICAgICAgICAgICAgICAgIHRvOiBbJycsIFtWYWxpZGF0b3JzLm1heExlbmd0aCg0KSwgVmFsaWRhdG9ycy5wYXR0ZXJuKERBVEVfVkFMSURBVE9SX1JFR0VYKV1dLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgdmFsaWRhdG9yczogdmFsaWRhdGVEYXRlUmFuZ2VGaWVsZHMoKSB9LFxuICAgICAgICApLFxuICAgICAgICBsaW1pdFJlc3VsdHM6IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgcGVlclJldmlld2VkOiBbZmFsc2VdLFxuICAgICAgICB9KSxcbiAgICAgICAgZXhwYW5kUmVzdWx0czogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBhcHBseUVxdWl2YWxlbnRTdWJqZWN0czogW2ZhbHNlXSxcbiAgICAgICAgICAgIGZ1bGxUZXh0OiBbZmFsc2VdLFxuICAgICAgICB9KSxcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCBpc1N1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBhZHZhbmNlZFNlYXJjaE9wdGlvbnMgPSBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUztcbiAgICBwcm90ZWN0ZWQgYWR2YW5jZWRTZWFyY2hGaWVsZE1hcCA9IEFEVkFOQ0VEX1NFQVJDSF9GSUVMRF9NQVA7XG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyTWFwID0gQURWQU5DRURfU0VBUkNIX1FVQUxJRklFUl9NQVA7XG5cbiAgICBnZXQgcXVlcmllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLnF1ZXJpZXM7XG4gICAgfVxuICAgIGdldCB0eXBlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLnR5cGVzO1xuICAgIH1cbiAgICBnZXQgY29sbGVjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5jb2xsZWN0aW9ucztcbiAgICB9XG4gICAgZ2V0IGxhbmd1YWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmxhbmd1YWdlcztcbiAgICB9XG4gICAgZ2V0IGZyb20oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5kYXRlLmNvbnRyb2xzLmZyb207XG4gICAgfVxuICAgIGdldCB0bygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmRhdGUuY29udHJvbHMudG87XG4gICAgfVxuICAgIGdldCBwZWVyUmV2aWV3ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5saW1pdFJlc3VsdHMuY29udHJvbHMucGVlclJldmlld2VkO1xuICAgIH1cbiAgICBnZXQgZnVsbFRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5leHBhbmRSZXN1bHRzLmNvbnRyb2xzLmZ1bGxUZXh0O1xuICAgIH1cbiAgICBnZXQgYXBwbHlFcXVpdmFsZW50U3ViamVjdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5leHBhbmRSZXN1bHRzLmNvbnRyb2xzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIHF1ZXJ5IHRvIGBxdWVyaWVzYCBgRm9ybUFycmF5YC4gVGhpcyBGb3JtR3JvdXAgaGFzIGFuIGFkZGl0aW9uYWwgYGJvb2xlYW5gIGNvbnRyb2wuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFkZFF1ZXJ5ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJpZXMucHVzaChcbiAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgIGJvb2xlYW46IFtBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5ib29sZWFuWzBdIGFzIEFkdmFuY2VkU2VhcmNoQm9vbGVhbk9wdGlvbl0sXG4gICAgICAgICAgICAgICAgZmllbGQ6IFtcbiAgICAgICAgICAgICAgICAgICAgQURWQU5DRURfU0VBUkNIX09QVElPTlMuZmllbGRzWzBdIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvbixcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHF1YWxpZmllcjogW1xuICAgICAgICAgICAgICAgICAgICBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5xdWFsaWZpZXJzW1xuICAgICAgICAgICAgICAgICAgICAgICAgQURWQU5DRURfU0VBUkNIX09QVElPTlMubG9jYWxGaWVsZHNbMF1cbiAgICAgICAgICAgICAgICAgICAgXVswXSBhcyBBZHZhbmNlZFNlYXJjaFF1YWxpZmllck9wdGlvbixcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3luY1VwRmllbGRBbmRRdWFsaWZpZXIodGhpcy5xdWVyaWVzLmF0KC0xKSwgdGhpcy5jb25maWcuc2NvcGUpO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlUXVlcnkgPSAoaTogbnVtYmVyKSA9PiB7XG4gICAgICAgIHRoaXMucXVlcmllcy5yZW1vdmVBdChpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgYXBwcm9wcmlhdGUgcXVlcnkgcGFyYW1zIGJlZm9yZSBwZXJmb3JtaW5nIGEgbG9jYWwgYWR2YW5jZWQgc2VhcmNoLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkb0xvY2FsQWR2YW5jZWRTZWFyY2ggPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9BZHZhbmNlZFNlYXJjaCh7XG4gICAgICAgICAgICBsb2NhbEFkdmFuY2VkU2VhcmNoOiB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaCxcbiAgICAgICAgICAgICAgICBjcmVhdGlvbkRhdGU6IHRoaXMuZ2F0aGVyVG9BbmRGcm9tVmFsdWVzKCksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRMYW5ndWFnZXM6IHRoaXMubGFuZ3VhZ2VzLnZhbHVlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUmVzb3VyY2VUeXBlczogdGhpcy50eXBlcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENvbGxlY3Rpb25zOiB0aGlzLmNvbGxlY3Rpb25zLnZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGFwcHJvcHJpYXRlIHF1ZXJ5IHBhcmFtcyBiZWZvcmUgcGVyZm9ybWluZyBhbiBleHRlcm5hbCBhZHZhbmNlZCBzZWFyY2guXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGRvRXh0ZXJuYWxBZHZhbmNlZFNlYXJjaCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb0FkdmFuY2VkU2VhcmNoKHtcbiAgICAgICAgICAgIGV4dGVybmFsQWR2YW5jZWRTZWFyY2g6IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLFxuICAgICAgICAgICAgICAgIGRhdGVQdWJsaXNoZWQ6IHRoaXMuZ2F0aGVyVG9BbmRGcm9tVmFsdWVzKCksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRMYW5ndWFnZXM6IHRoaXMubGFuZ3VhZ2VzLnZhbHVlLFxuICAgICAgICAgICAgICAgIGxpbWl0UmVzdWx0czoge1xuICAgICAgICAgICAgICAgICAgICBwZWVyUmV2aWV3ZWQ6IHRoaXMucGVlclJldmlld2VkLnZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXhwYW5kUmVzdWx0czoge1xuICAgICAgICAgICAgICAgICAgICBhcHBseUVxdWl2YWxlbnRTdWJqZWN0czogdGhpcy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZnVsbFRleHQ6IHRoaXMuZnVsbFRleHQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAgIENvbXBhcmVzICdmcm9tJyBhbmQgJ3RvJyB0byBlbnN1cmUgJ3RvJyBpcyA+PSB0byAnZnJvbScsIGVsc2Ugc3dhcHMgdGhlbS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdhdGhlclRvQW5kRnJvbVZhbHVlcyA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZnJvbSA9IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLmZyb20udmFsdWUpIDw9IHBhcnNlSW50KHRoaXMudG8udmFsdWUpXG4gICAgICAgICAgICAgICAgPyB0aGlzLmZyb20udmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMudG8udmFsdWVcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGNvbnN0IHRvID0gdGhpcy50by52YWx1ZVxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnRvLnZhbHVlKSA+PSBwYXJzZUludCh0aGlzLmZyb20udmFsdWUpXG4gICAgICAgICAgICAgICAgPyB0aGlzLnRvLnZhbHVlXG4gICAgICAgICAgICAgICAgOiB0aGlzLmZyb20udmFsdWVcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIHJldHVybiB7IGZyb20sIHRvIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlcmUgaXMgYSBxdWVyeSB0byB1c2UsIGdhdGhlcnMgYWxsIG90aGVyIHF1ZXJ5IHBhcmFtZXRlcnMgbmVlZGVkLCB0aGVuIHBlcmZvcm1zIGFuIGFkdmFuY2VkIHNlYXJjaCB2aWEgYHJvdXRlci5uYXZpZ2F0ZSgpYC5cbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IHF1ZXJ5UGFyYW1zIGJhc2Ugc2V0IG9mIHF1ZXJ5IHBhcmFtcyB0byBuYXZpZ2F0ZSB3aXRoXG4gICAgICovXG4gICAgcHJpdmF0ZSBkb0FkdmFuY2VkU2VhcmNoID0gKHVwZGF0ZWRQcm9wczogUGFydGlhbDxTZWFyY2hDb25maWc+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICAvLyBEb24ndCBwZXJmb3JtIGEgc2VhcmNoIHVubGVzcyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcXVlcnlcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5xdWVyaWVzLmF0KDApLmNvbnRyb2xzLnF1ZXJ5LmludmFsaWQgJiZcbiAgICAgICAgICAgICF0aGlzLnF1ZXJpZXMudmFsdWUuc29tZSgodikgPT4gISF2LnF1ZXJ5KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlYXJjaFZhbGlkYXRpb25Ub29sVGlwKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG9uJ3QgcGVyZm9ybSBhIHNlYXJjaCB1bmxlc3MgdGhlIGRhdGUgZm9ybSBpcyB2YWxpZFxuICAgICAgICBpZiAodGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZGF0ZS5pbnZhbGlkKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5hZHZhbmNlZFNlYXJjaC5lbWl0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgICAgLi4udXBkYXRlZFByb3BzLFxuICAgICAgICAgICAgYWR2YW5jZWRTZWFyY2hRdWVyeVJvd3M6IHRoaXMucXVlcmllcy52YWx1ZSBhcyBBZHZhbmNlZFNlYXJjaFF1ZXJ5Um93W10sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzU3VibWl0dGVkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2hvd1NlYXJjaFZhbGlkYXRpb25Ub29sVGlwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuc2hvdygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNldHVwRm9ybSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyaWVzLmNsZWFyKCk7XG4gICAgICAgIC8vIEFsd2F5cyBrZWVwIGF0IGxlYXN0IHR3byBxdWVyaWVzIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLmFkZFF1ZXJ5KCk7XG4gICAgICAgIHRoaXMuYWRkUXVlcnkoKTtcblxuICAgICAgICAvLyBFbnN1cmUgdmFsaWRhdGlvbiB0b29sdGlwIGNsb3NlcyB3aGVuIHVzZXMgZW50ZXJzIGEgcXVlcnlcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgdGhpcy5xdWVyaWVzXG4gICAgICAgICAgICAgICAgLmF0KDApXG4gICAgICAgICAgICAgICAgLmNvbnRyb2xzLnF1ZXJ5LnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCgnJykpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgpID0+ICEhdGhpcy5pbnB1dFRvb2x0aXApKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gKHRoaXMuaW5wdXRUb29sdGlwLmRpc2FibGVkID0gdHJ1ZSkpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIElmIG5vIGBxe05VTX1gIHVzZSBgcWAgZm9yIGZpcnN0IHF1ZXJ5XG4gICAgICAgIGlmICghdGhpcy5jb25maWcuYWR2YW5jZWRTZWFyY2hRdWVyeVJvd3MubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5xdWVyaWVzLmF0KDApLmNvbnRyb2xzLnF1ZXJ5LnNldFZhbHVlKHRoaXMuY29uZmlnLnEpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnLmFkdmFuY2VkU2VhcmNoUXVlcnlSb3dzLmZvckVhY2goKHF1ZXJ5Um93LCBpKSA9PiB7XG4gICAgICAgICAgICAvLyBBZGQgYSBxdWVyeSBmb3JtIGNvbnRyb2wgZm9yIGV2ZXJ5IHF7bnVtfSBrZXkgYWZ0ZXIgdGhlIGZpcnN0LlxuICAgICAgICAgICAgbGV0IHF1ZXJ5Q29udHJvbCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCB8fCBpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sID0gdGhpcy5xdWVyaWVzLmF0KGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFF1ZXJ5KCk7XG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sID0gdGhpcy5xdWVyaWVzLmF0KC0xKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBxdWVyeSB2YWx1ZS5cbiAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5xdWVyeS5zZXRWYWx1ZShxdWVyeVJvdy5xdWVyeSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgZmllbGQgdmFsdWUsIGlmIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBxdWVyeVJvdy5maWVsZCAmJiAvLyBPbmx5IHNldCB0aGUgZmllbGQgaWYgdGhlIHZhbHVlIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgICAgICAgICAgICAoaXNBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uKHF1ZXJ5Um93LmZpZWxkKSB8fFxuICAgICAgICAgICAgICAgICAgICAodGhpcy5jb25maWcuc2NvcGUgPT09ICdsb2NhbCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gaXNBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb24ocXVlcnlSb3cuZmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlzQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uKHF1ZXJ5Um93LmZpZWxkKSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLmZpZWxkLnNldFZhbHVlKHF1ZXJ5Um93LmZpZWxkKTtcbiAgICAgICAgICAgIGVsc2UgcXVlcnlDb250cm9sLmNvbnRyb2xzLmZpZWxkLnNldFZhbHVlKHRoaXMuYWR2YW5jZWRTZWFyY2hPcHRpb25zLmZpZWxkc1swXSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgcXVhbGlmaWVyIHZhbHVlLCBpZiBhdmFpbGFibGUgYW5kIGEgbG9jYWwgc2VhcmNoLlxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnNjb3BlID09PSAnbG9jYWwnICYmIHF1ZXJ5Um93LnF1YWxpZmllcilcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMucXVhbGlmaWVyLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVJvdy5xdWFsaWZpZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZWRTZWFyY2hPcHRpb25zLnF1YWxpZmllcnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLmZpZWxkLnZhbHVlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGJvb2xlYW4sIGlmIGF2YWlsYWJsZSBhbmQgbm90IHRoZSBmaXJzdCBxdWVyeS5cbiAgICAgICAgICAgIGlmIChpICE9PSAwICYmIHF1ZXJ5Um93LmJvb2xlYW4pXG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLmJvb2xlYW4uc2V0VmFsdWUocXVlcnlSb3cuYm9vbGVhbik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5jb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZXMuc2V0VmFsdWUodGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaC5zZWxlY3RlZFJlc291cmNlVHlwZXMpO1xuICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9ucy5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLnNlbGVjdGVkQ29sbGVjdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZXMuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaC5zZWxlY3RlZExhbmd1YWdlcyBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW10sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mcm9tLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guY3JlYXRpb25EYXRlLmZyb20pO1xuICAgICAgICAgICAgdGhpcy50by5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLmNyZWF0aW9uRGF0ZS50byk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlcy5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoXG4gICAgICAgICAgICAgICAgICAgIC5zZWxlY3RlZExhbmd1YWdlcyBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW10sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mcm9tLnNldFZhbHVlKHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2guZGF0ZVB1Ymxpc2hlZC5mcm9tKTtcbiAgICAgICAgICAgIHRoaXMudG8uc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5kYXRlUHVibGlzaGVkLnRvKTtcbiAgICAgICAgICAgIHRoaXMucGVlclJldmlld2VkLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2gubGltaXRSZXN1bHRzLnBlZXJSZXZpZXdlZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2guZXhwYW5kUmVzdWx0cy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZ1bGxUZXh0LnNldFZhbHVlKHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2guZXhwYW5kUmVzdWx0cy5mdWxsVGV4dCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiPGZvcm1cbiAgICBkYXRhLXRlc3RpZD1cImFkdmFuY2VkU2VhcmNoRm9ybVwiXG4gICAgKHN1Ym1pdCk9XCJjb25maWcuc2NvcGUgPT09ICdsb2NhbCcgPyBkb0xvY2FsQWR2YW5jZWRTZWFyY2goKSA6IGRvRXh0ZXJuYWxBZHZhbmNlZFNlYXJjaCgpXCJcbiAgICBbZm9ybUdyb3VwXT1cImFkdmFuY2VkU2VhcmNoRm9ybVwiXG4gICAgY2xhc3M9XCJzcy1hZHYtc2VhcmNoLXdyYXBwZXJcIlxuPlxuICAgIDxoMz5BZHZhbmNlZCBTZWFyY2g8L2gzPlxuICAgIDwhLS0gUXVlcmllcyAtLT5cbiAgICBAZm9yIChxdWVyeSBvZiBxdWVyaWVzLmNvbnRyb2xzOyB0cmFjayAkaW5kZXg7IGxldCBxdWVyeUluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcy1hZHYtc2VhcmNoLXJvd1wiIFtmb3JtR3JvdXBdPVwicXVlcnlcIj5cbiAgICAgICAgICAgIDwhLS0gQm9vbGVhbiBvcGVyYXRvciAtLT5cbiAgICAgICAgICAgIDwhLS0gQWRkIGJvb2xlYW4gZm9yIGVhY2ggcm93IGV4Y2VwdCBmb3IgZmlyc3QgLS0+XG4gICAgICAgICAgICBAaWYgKCEkZmlyc3QpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Mtc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidib29sZWFuJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInYm9vbGVhbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2Jvb2xlYW4nICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGJvb2xlYW4gb2YgYWR2YW5jZWRTZWFyY2hPcHRpb25zLmJvb2xlYW47IHRyYWNrIGJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImJvb2xlYW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYm9vbGVhbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gRmllbGQgLS0+XG4gICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZmllbGQnICsgcXVlcnlJbmRleFwiIGNsYXNzPVwic3MtaGlkZGVuXCI+RmllbGQge3sgcXVlcnlJbmRleCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Mtc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCInZmllbGQnICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2ZpZWxkJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGZpZWxkIG9mIGFkdmFuY2VkU2VhcmNoT3B0aW9ucy5maWVsZHM7IHRyYWNrIGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWR2YW5jZWRTZWFyY2hGaWVsZE1hcFtmaWVsZF0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxvcHRncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcuc2NvcGUgPT09ICdleHRlcm5hbCcgPyAnT25saW5lJyA6ICdMaWJyYXJ5JykgKyAnIFNwZWNpZmljJ1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFkdmFuY2VkU2VhcmNoT3B0aW9ucy5leHRlcm5hbEZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFkdmFuY2VkU2VhcmNoT3B0aW9ucy5sb2NhbEZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayBmaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJmaWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhZHZhbmNlZFNlYXJjaEZpZWxkTWFwW2ZpZWxkXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIFF1YWxpZmllcnMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBsb2NhbCBzZWFyY2hlcyAtLT5cbiAgICAgICAgICAgIEBpZiAoY29uZmlnLnNjb3BlID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ3F1YWxpZmllcicgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJzcy1oaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICA+TWF0Y2ggQ3JpdGVyaWEge3sgcXVlcnlJbmRleCB9fTwvbGFiZWxcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNzLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCIncXVhbGlmaWVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICRhbnkgYmVjYXVzZSBhIGZpZWxkIGNhbiB0ZWNobmljYWxseSBiZSBsb2NhbCBvciBleHRlcm5hbCwgdGhvdWdoIHRoaXMgYmxvY2sgaXMgc2NvcGVkIHN0cmljdGx5IHRvIGxvY2FsIGZpZWxkcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllciBvZiAkYW55KGFkdmFuY2VkU2VhcmNoT3B0aW9ucy5xdWFsaWZpZXJzKVtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkuY29udHJvbHMuZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIHF1YWxpZmllcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uSW5kZXggPSAkaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwicXVhbGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXggKyAnLW9wdGlvbicgKyBvcHRpb25JbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJGFueShhZHZhbmNlZFNlYXJjaFF1YWxpZmllck1hcClbcXVhbGlmaWVyXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gUXVlcnkgLS0+XG4gICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIncXVlcnknICsgcXVlcnlJbmRleFwiIGNsYXNzPVwic3MtaGlkZGVuXCI+UXVlcnkge3sgcXVlcnlJbmRleCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3MtcXVlcnktaW5wdXRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgI3NlYXJjaElucHV0XG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCIncXVlcnknICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ3F1ZXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRmlsbCBvdXQgdGhpcyBmaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2Fib3ZlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwRGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJpc1N1Ym1pdHRlZCAmJiBxdWVyaWVzLmF0KDApLmNvbnRyb2xzLnF1ZXJ5LmludmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaW52YWxpZElucHV0RGVzY1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghJGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNzLXJvdy1jYW5jZWxcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVF1ZXJ5KHF1ZXJ5SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2NhbmNlbFJvdycgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBzcy1pY29uXCI+IGNhbmNlbCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbiAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwiYWRkUXVlcnkoKVwiXG4gICAgICAgIGlkPVwiYWRkUXVlcnlCdG5cIlxuICAgICAgICBkYXRhLXRlc3RpZD1cImFkZFF1ZXJ5XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInF1ZXJpZXMubGVuZ3RoID4gMTFcIlxuICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHNzLWljb25cIj4gYWRkIDwvc3Bhbj5cbiAgICAgICAgQWRkIGEgcm93XG4gICAgPC9idXR0b24+XG4gICAgPCEtLSBPVEhFUiBPUFRJT05TIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzcy1vdGhlci1vcHRpb25zXCI+XG4gICAgICAgIDwhLS0gTE9DQUwgLS0+XG4gICAgICAgIEBpZiAoY29uZmlnLnNjb3BlID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICA8IS0tIFR5cGUgLS0+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwicmVzb3VyY2VUeXBlXCI+XG4gICAgICAgICAgICAgICAgPGg0PlJlc291cmNlIFR5cGU8L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1tdWx0aS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLW11bHRpLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidSZXNvdXJjZSBUeXBlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWxsT3B0aW9uc109XCJhZHZhbmNlZFNlYXJjaE9wdGlvbnMudHlwZXNbY29uZmlnLmluc3RpdHV0aW9uXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRLZXlzXT1cInR5cGVzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEtleXNDaGFuZ2UpPVwidHlwZXMuc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gQ29sbGVjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJjb2xsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkNvbGxlY3Rpb248L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1tdWx0aS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLW11bHRpLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDb2xsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWxsT3B0aW9uc109XCJhZHZhbmNlZFNlYXJjaE9wdGlvbnMuY29sbGVjdGlvbnNbY29uZmlnLmluc3RpdHV0aW9uXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRLZXlzXT1cImNvbGxlY3Rpb25zLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEtleXNDaGFuZ2UpPVwiY29sbGVjdGlvbnMuc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gTGFuZ3VhZ2UgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGFuZ3VhZ2VCbG9ja1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSBEYXRlIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGF0ZUJsb2NrOyBjb250ZXh0OiB7IGhlYWRlcjogJ0NyZWF0aW9uIERhdGUnIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG4gICAgICAgIDwhLS0gRVhURVJOQUwgLS0+XG4gICAgICAgIEBpZiAoY29uZmlnLnNjb3BlID09PSAnZXh0ZXJuYWwnKSB7XG4gICAgICAgICAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJsaW1pdFJlc3VsdHNcIiBjbGFzcz1cInNzLWNoZWNrYm94LXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8aDQ+Rm9yIEZld2VyIFJlc3VsdHMgVHJ5PC9oND5cbiAgICAgICAgICAgICAgICA8IS0tIFBlZXIgcmV2aWV3ZWQgLS0+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3MtY2hlY2tib3gtbGFiZWxcIiBmb3I9XCJwZWVyUmV2aWV3ZWRcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNzLWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInBlZXJSZXZpZXdlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCIncGVlclJldmlld2VkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cInBlZXJSZXZpZXdlZFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJwZWVyUmV2aWV3ZWQudmFsdWVcIj48L2xpYi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcy1sYWJlbC10ZXh0XCI+UGVlciByZXZpZXdlZCBqb3VybmFsIGFydGljbGVzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cImV4cGFuZFJlc3VsdHNcIiBjbGFzcz1cInNzLWNoZWNrYm94LXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8aDQ+Rm9yIE1vcmUgUmVzdWx0cyBUcnk8L2g0PlxuICAgICAgICAgICAgICAgIDwhLS0gQXBwbHkgZXF1aXZhbGVudCBzdWJqZWN0cyAtLT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzcy1jaGVja2JveC1sYWJlbFwiIGZvcj1cImFwcGx5RXF1aXZhbGVudFN1YmplY3RzXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcy1oaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInYXBwbHlFcXVpdmFsZW50U3ViamVjdHMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHNcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWNoZWNrYm94IFtpc0NoZWNrZWRdPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHMudmFsdWVcIj48L2xpYi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcy1sYWJlbC10ZXh0XCI+QXBwbHkgZXF1aXZhbGVudCBzdWJqZWN0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwhLS0gRnVsbCB0ZXh0IC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNzLWNoZWNrYm94LWxhYmVsXCIgZm9yPVwiZnVsbFRleHRcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNzLWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImZ1bGxUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidmdWxsVGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmdWxsVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJmdWxsVGV4dC52YWx1ZVwiPjwvbGliLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPkluY2x1ZGUgcmVzdWx0cyB0aGUgbGlicmFyeSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIERhdGUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlQmxvY2s7IGNvbnRleHQ6IHsgaGVhZGVyOiAnRGF0ZSBQdWJsaXNoZWQnIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSBMYW5ndWFnZSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYW5ndWFnZUJsb2NrXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiYWR2U2VhcmNoRm9vdGVyXCI+XG4gICAgICAgIDxhIFtocmVmXT1cIidodHRwczovL2xpYi5ieXUuZWR1L2Jyb3dzZS8nICsgY29uZmlnLmluc3RpdHV0aW9uXCI+QWxwaGFiZXRpYyBCcm93c2U8L2E+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicGlsbC1idG4tLWNvbXBvbmVudHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgIGVuc2lnbjogY29uZmlnLmluc3RpdHV0aW9uID09PSAnZW5zaWduJyxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImFkdlNlYXJjaFN1Ym1pdEJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIFNlYXJjaFxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZm9ybT5cblxuPG5nLXRlbXBsYXRlICNsYW5ndWFnZUJsb2NrPlxuICAgIDxkaXY+XG4gICAgICAgIDxoND5MYW5ndWFnZTwvaDQ+XG4gICAgICAgIDxsaWItbXVsdGktc2VsZWN0XG4gICAgICAgICAgICBbbGFiZWxdPVwiJ2xhbmd1YWdlJ1wiXG4gICAgICAgICAgICBbYWxsT3B0aW9uc109XCJhZHZhbmNlZFNlYXJjaE9wdGlvbnMubGFuZ3VhZ2VzXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZEtleXNdPVwibGFuZ3VhZ2VzLnZhbHVlXCJcbiAgICAgICAgICAgIChzZWxlY3RlZEtleXNDaGFuZ2UpPVwibGFuZ3VhZ2VzLnNldFZhbHVlKCRhbnkoJGV2ZW50KSlcIlxuICAgICAgICA+PC9saWItbXVsdGktc2VsZWN0PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGF0ZUJsb2NrIGxldC1oZWFkZXI9XCJoZWFkZXJcIj5cbiAgICA8ZGl2IGlkPVwiZGF0ZU9wdGlvbnNcIiBjbGFzcz1cImV4dGVybmFsXCI+XG4gICAgICAgIDxoND57eyBoZWFkZXIgfX08L2g0PlxuICAgICAgICA8bGliLWRhdGUtcmFuZ2VcbiAgICAgICAgICAgIFtmcm9tXT1cImZyb20udmFsdWVcIlxuICAgICAgICAgICAgW3RvXT1cInRvLnZhbHVlXCJcbiAgICAgICAgICAgIChmcm9tQ2hhbmdlKT1cImZyb20uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAodG9DaGFuZ2UpPVwidG8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgID48L2xpYi1kYXRlLXJhbmdlPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
export const ADVANCED_SEARCH_QUALIFIER_MAP = {
|
|
2
|
-
contains: 'contains',
|
|
3
|
-
begins_with: 'begins with',
|
|
4
|
-
exact: 'is (exact)',
|
|
5
|
-
index: 'browse value',
|
|
6
|
-
subject_lc: 'LC browse',
|
|
7
|
-
subject_expanded: 'expanded browse',
|
|
8
|
-
};
|
|
9
|
-
export const ADVANCED_SEARCH_FIELD_MAP = {
|
|
10
|
-
abstract: 'Abstract',
|
|
11
|
-
any: 'Any Field',
|
|
12
|
-
callNumber: 'Call Number',
|
|
13
|
-
contributor: 'Contributor',
|
|
14
|
-
creator: 'Author/Creator',
|
|
15
|
-
genre: 'Genre',
|
|
16
|
-
isbn: 'ISBN',
|
|
17
|
-
issn: 'ISSN',
|
|
18
|
-
series: 'Series',
|
|
19
|
-
source: 'Source',
|
|
20
|
-
subject: 'Subject',
|
|
21
|
-
title: 'Title',
|
|
22
|
-
};
|
|
23
|
-
export const ADVANCED_SEARCH_QUERIES_LIMIT = 12;
|
|
24
|
-
export const ADVANCED_SEARCH_OPTIONS = {
|
|
25
|
-
boolean: ['AND', 'OR', 'NOT'],
|
|
26
|
-
// In SS-api, the EDS key for all fields is `allText`, however this is the default and is never used in the URL, so we omit it here.
|
|
27
|
-
fields: ['any', 'title', 'creator', 'subject', 'issn', 'isbn'],
|
|
28
|
-
localFields: ['callNumber', 'contributor', 'genre', 'series'],
|
|
29
|
-
externalFields: ['source', 'abstract'],
|
|
30
|
-
qualifiers: {
|
|
31
|
-
any: ['contains'],
|
|
32
|
-
title: ['contains', 'exact', 'begins_with', 'index'],
|
|
33
|
-
callNumber: ['contains', 'exact', 'begins_with', 'index'],
|
|
34
|
-
creator: ['contains', 'exact', 'begins_with', 'index'],
|
|
35
|
-
contributor: ['contains', 'exact'],
|
|
36
|
-
isbn: ['contains', 'exact'],
|
|
37
|
-
issn: ['contains', 'exact'],
|
|
38
|
-
genre: ['contains', 'exact'],
|
|
39
|
-
subject: ['contains', 'exact', 'subject_lc', 'subject_expanded'],
|
|
40
|
-
series: ['contains', 'exact'],
|
|
41
|
-
},
|
|
42
|
-
resultsPerPage: ['10', '20', '50', '100'],
|
|
43
|
-
types: {
|
|
44
|
-
byu: {
|
|
45
|
-
book: 'Books',
|
|
46
|
-
sound_recording: 'Sound Recordings',
|
|
47
|
-
image: 'Images',
|
|
48
|
-
periodical: 'Periodicals',
|
|
49
|
-
map: 'Maps',
|
|
50
|
-
score: 'Music Scores',
|
|
51
|
-
newspaper: 'Newspapers',
|
|
52
|
-
dissertation: 'Theses & Dissertations',
|
|
53
|
-
video: 'Videos',
|
|
54
|
-
},
|
|
55
|
-
law: { book: 'Books' },
|
|
56
|
-
ensign: {
|
|
57
|
-
book: 'Books',
|
|
58
|
-
sound_recording: 'Sound Recordings',
|
|
59
|
-
journal: 'Periodicals',
|
|
60
|
-
magazine: 'Magazines',
|
|
61
|
-
video: 'Videos',
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
collections: {
|
|
65
|
-
byu: {
|
|
66
|
-
lee: 'BYU Library',
|
|
67
|
-
'lee -- asian': 'Asian',
|
|
68
|
-
'lee -- general': 'General Collection',
|
|
69
|
-
'lee -- govdocs': 'Government Documents',
|
|
70
|
-
'lee -- humanities': 'Humanities',
|
|
71
|
-
'lee -- juvenile': 'Juvenile',
|
|
72
|
-
'lee -- maps': 'Maps',
|
|
73
|
-
'lee -- media_center': 'Media Center',
|
|
74
|
-
'lee -- music': 'Music & Dance',
|
|
75
|
-
'lee -- periodicals': 'Periodicals',
|
|
76
|
-
'lee -- popular': 'Popular Reading',
|
|
77
|
-
'lee -- religion_famhist': 'Religion & Family History',
|
|
78
|
-
'lee -- science_engineering': 'Science & Engineering',
|
|
79
|
-
'lee -- social_science': 'Social Science',
|
|
80
|
-
'lee -- special_collections': 'Special Collections',
|
|
81
|
-
},
|
|
82
|
-
law: {
|
|
83
|
-
'law -- iclrs': 'Law & Religion Studies',
|
|
84
|
-
'law -- main': 'Main Collection',
|
|
85
|
-
'law -- media': 'Media',
|
|
86
|
-
'law -- reserve': 'Reserve',
|
|
87
|
-
'law -- self_help': 'Self Help',
|
|
88
|
-
'law -- study_guides': 'Study Guides',
|
|
89
|
-
},
|
|
90
|
-
ensign: {
|
|
91
|
-
'ldsbc -- audio_books': 'Audio Books',
|
|
92
|
-
'ldsbc -- display': 'Display Shelves',
|
|
93
|
-
'ldsbc -- fiction': 'Fiction',
|
|
94
|
-
'ldsbc -- films': 'Feature Films',
|
|
95
|
-
'ldsbc -- stacks': 'General Collection',
|
|
96
|
-
'ldsbc -- news_magazines': 'News Magazines',
|
|
97
|
-
'ldsbc -- non_feature_films': 'Non Feature Films',
|
|
98
|
-
'ldsbc -- oversize': 'Oversize',
|
|
99
|
-
'ldsbc -- paralegal': 'Paralegal',
|
|
100
|
-
'ldsbc -- periodicals': 'Periodicals',
|
|
101
|
-
'ldsbc -- reference': 'Reference',
|
|
102
|
-
'ldsbc -- reserve': 'Reserve',
|
|
103
|
-
},
|
|
104
|
-
},
|
|
105
|
-
languages: {
|
|
106
|
-
eng: 'English',
|
|
107
|
-
ara: 'Arabic',
|
|
108
|
-
chi: 'Chinese',
|
|
109
|
-
ces: 'Czech',
|
|
110
|
-
dan: 'Danish',
|
|
111
|
-
dut: 'Dutch',
|
|
112
|
-
fin: 'Finnish',
|
|
113
|
-
fre: 'French',
|
|
114
|
-
ger: 'German',
|
|
115
|
-
gre: 'Greek, Modern',
|
|
116
|
-
heb: 'Hebrew',
|
|
117
|
-
hin: 'Hindi',
|
|
118
|
-
hun: 'Hungarian',
|
|
119
|
-
ice: 'Icelandic',
|
|
120
|
-
ita: 'Italian',
|
|
121
|
-
jpn: 'Japanese',
|
|
122
|
-
kor: 'Korean',
|
|
123
|
-
lat: 'Latin',
|
|
124
|
-
nor: 'Norwegian',
|
|
125
|
-
pol: 'Polish',
|
|
126
|
-
por: 'Portuguese',
|
|
127
|
-
pan: 'Punjabi',
|
|
128
|
-
rum: 'Romanian',
|
|
129
|
-
rus: 'Russian',
|
|
130
|
-
spa: 'Spanish',
|
|
131
|
-
swe: 'Swedish',
|
|
132
|
-
wel: 'Welsh',
|
|
133
|
-
yid: 'Yiddish',
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
export const PRIMARY_BLUE = 'rgba(63, 112, 176, 1)';
|
|
137
|
-
export const PRIMARY_BLUE_HOVER = 'hsl(214, 48%, 60%, 1)';
|
|
138
|
-
export const PRIMARY_LIGHT_BLUE = 'rgba(223, 233, 247, 1)';
|
|
139
|
-
export const PRIMARY_PURPLE = '#8772A6';
|
|
140
|
-
export const PRIMARY_PURPLE_HOVER = '#7C659F';
|
|
141
|
-
export const DESTRUCTIVE_RED = 'hsl(5, 47%, 47%, 1)';
|
|
142
|
-
export const DESTRUCTIVE_RED_HOVER = 'hsl(5, 47%, 50%, 1)';
|
|
143
|
-
export const SECONDARY_TEXT_GRAY = 'rgba(112, 112, 112, 1)';
|
|
144
|
-
export const LIGHT_GRAY = 'rgba(230, 230, 230, 1)';
|
|
145
|
-
export const DROP_SHADOW_DARK_BLUE = 'rgba(51, 62, 77, 0.16)';
|
|
146
|
-
export const TEXT_SEMIBOLD = '600';
|
|
147
|
-
export const TEXT_BOLD = '700';
|
|
148
|
-
export const ANIMATION_LENGTH_STD = '0.15s';
|
|
149
|
-
export const LINE_HEIGHT_STD = '1.4';
|
|
150
|
-
export const CONTEXTUAL_SELECTOR_HEIGHT = '4.5rem';
|
|
151
|
-
export const CONTENT_MAX_WIDTH = '75rem';
|
|
152
|
-
export const CONTENT_PADDING = '5.4rem';
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHO0lBQ3pDLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLEtBQUssRUFBRSxZQUFZO0lBQ25CLEtBQUssRUFBRSxjQUFjO0lBQ3JCLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLGdCQUFnQixFQUFFLGlCQUFpQjtDQUM3QixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUc7SUFDckMsUUFBUSxFQUFFLFVBQVU7SUFDcEIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsVUFBVSxFQUFFLGFBQWE7SUFDekIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsT0FBTyxFQUFFLGdCQUFnQjtJQUN6QixLQUFLLEVBQUUsT0FBTztJQUNkLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixNQUFNLEVBQUUsUUFBUTtJQUNoQixPQUFPLEVBQUUsU0FBUztJQUNsQixLQUFLLEVBQUUsT0FBTztDQUNSLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDbkMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7SUFDN0Isb0lBQW9JO0lBQ3BJLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQzlELFdBQVcsRUFBRSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFFBQVEs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LHFCQUFxQixDQUFDO0FBQ3JELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0FBQzNELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDO0FBQzVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDL0IsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxDQUFDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsUUFBUSxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUN6QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IEFEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQID0ge1xuICAgIGNvbnRhaW5zOiAnY29udGFpbnMnLFxuICAgIGJlZ2luc193aXRoOiAnYmVnaW5zIHdpdGgnLFxuICAgIGV4YWN0OiAnaXMgKGV4YWN0KScsXG4gICAgaW5kZXg6ICdicm93c2UgdmFsdWUnLFxuICAgIHN1YmplY3RfbGM6ICdMQyBicm93c2UnLFxuICAgIHN1YmplY3RfZXhwYW5kZWQ6ICdleHBhbmRlZCBicm93c2UnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IEFEVkFOQ0VEX1NFQVJDSF9GSUVMRF9NQVAgPSB7XG4gICAgYWJzdHJhY3Q6ICdBYnN0cmFjdCcsXG4gICAgYW55OiAnQW55IEZpZWxkJyxcbiAgICBjYWxsTnVtYmVyOiAnQ2FsbCBOdW1iZXInLFxuICAgIGNvbnRyaWJ1dG9yOiAnQ29udHJpYnV0b3InLFxuICAgIGNyZWF0b3I6ICdBdXRob3IvQ3JlYXRvcicsXG4gICAgZ2VucmU6ICdHZW5yZScsXG4gICAgaXNibjogJ0lTQk4nLFxuICAgIGlzc246ICdJU1NOJyxcbiAgICBzZXJpZXM6ICdTZXJpZXMnLFxuICAgIHNvdXJjZTogJ1NvdXJjZScsXG4gICAgc3ViamVjdDogJ1N1YmplY3QnLFxuICAgIHRpdGxlOiAnVGl0bGUnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IEFEVkFOQ0VEX1NFQVJDSF9RVUVSSUVTX0xJTUlUID0gMTI7XG5cbmV4cG9ydCBjb25zdCBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUyA9IHtcbiAgICBib29sZWFuOiBbJ0FORCcsICdPUicsICdOT1QnXSxcbiAgICAvLyBJbiBTUy1hcGksIHRoZSBFRFMga2V5IGZvciBhbGwgZmllbGRzIGlzIGBhbGxUZXh0YCwgaG93ZXZlciB0aGlzIGlzIHRoZSBkZWZhdWx0IGFuZCBpcyBuZXZlciB1c2VkIGluIHRoZSBVUkwsIHNvIHdlIG9taXQgaXQgaGVyZS5cbiAgICBmaWVsZHM6IFsnYW55JywgJ3RpdGxlJywgJ2NyZWF0b3InLCAnc3ViamVjdCcsICdpc3NuJywgJ2lzYm4nXSxcbiAgICBsb2NhbEZpZWxkczogWydjYWxsTnVtYmVyJywgJ2NvbnRyaWJ1dG9yJywgJ2dlbnJlJywgJ3NlcmllcyddLFxuICAgIGV4dGVybmFsRmllbGRzOiBbJ3NvdXJjZScsICdhYnN0cmFjdCddLFxuICAgIHF1YWxpZmllcnM6IHtcbiAgICAgICAgYW55OiBbJ2NvbnRhaW5zJ10sXG4gICAgICAgIHRpdGxlOiBbJ2NvbnRhaW5zJywgJ2V4YWN0JywgJ2JlZ2luc193aXRoJywgJ2luZGV4J10sXG4gICAgICAgIGNhbGxOdW1iZXI6IFsnY29udGFpbnMnLCAnZXhhY3QnLCAnYmVnaW5zX3dpdGgnLCAnaW5kZXgnXSxcbiAgICAgICAgY3JlYXRvcjogWydjb250YWlucycsICdleGFjdCcsICdiZWdpbnNfd2l0aCcsICdpbmRleCddLFxuICAgICAgICBjb250cmlidXRvcjogWydjb250YWlucycsICdleGFjdCddLFxuICAgICAgICBpc2JuOiBbJ2NvbnRhaW5zJywgJ2V4YWN0J10sXG4gICAgICAgIGlzc246IFsnY29udGFpbnMnLCAnZXhhY3QnXSxcbiAgICAgICAgZ2VucmU6IFsnY29udGFpbnMnLCAnZXhhY3QnXSxcbiAgICAgICAgc3ViamVjdDogWydjb250YWlucycsICdleGFjdCcsICdzdWJqZWN0X2xjJywgJ3N1YmplY3RfZXhwYW5kZWQnXSxcbiAgICAgICAgc2VyaWVzOiBbJ2NvbnRhaW5zJywgJ2V4YWN0J10sXG4gICAgfSxcbiAgICByZXN1bHRzUGVyUGFnZTogWycxMCcsICcyMCcsICc1MCcsICcxMDAnXSxcbiAgICB0eXBlczoge1xuICAgICAgICBieXU6IHtcbiAgICAgICAgICAgIGJvb2s6ICdCb29rcycsXG4gICAgICAgICAgICBzb3VuZF9yZWNvcmRpbmc6ICdTb3VuZCBSZWNvcmRpbmdzJyxcbiAgICAgICAgICAgIGltYWdlOiAnSW1hZ2VzJyxcbiAgICAgICAgICAgIHBlcmlvZGljYWw6ICdQZXJpb2RpY2FscycsXG4gICAgICAgICAgICBtYXA6ICdNYXBzJyxcbiAgICAgICAgICAgIHNjb3JlOiAnTXVzaWMgU2NvcmVzJyxcbiAgICAgICAgICAgIG5ld3NwYXBlcjogJ05ld3NwYXBlcnMnLFxuICAgICAgICAgICAgZGlzc2VydGF0aW9uOiAnVGhlc2VzICYgRGlzc2VydGF0aW9ucycsXG4gICAgICAgICAgICB2aWRlbzogJ1ZpZGVvcycsXG4gICAgICAgIH0sXG4gICAgICAgIGxhdzogeyBib29rOiAnQm9va3MnIH0sXG4gICAgICAgIGVuc2lnbjoge1xuICAgICAgICAgICAgYm9vazogJ0Jvb2tzJyxcbiAgICAgICAgICAgIHNvdW5kX3JlY29yZGluZzogJ1NvdW5kIFJlY29yZGluZ3MnLFxuICAgICAgICAgICAgam91cm5hbDogJ1BlcmlvZGljYWxzJyxcbiAgICAgICAgICAgIG1hZ2F6aW5lOiAnTWFnYXppbmVzJyxcbiAgICAgICAgICAgIHZpZGVvOiAnVmlkZW9zJyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIGNvbGxlY3Rpb25zOiB7XG4gICAgICAgIGJ5dToge1xuICAgICAgICAgICAgbGVlOiAnQllVIExpYnJhcnknLFxuICAgICAgICAgICAgJ2xlZSAtLSBhc2lhbic6ICdBc2lhbicsXG4gICAgICAgICAgICAnbGVlIC0tIGdlbmVyYWwnOiAnR2VuZXJhbCBDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICdsZWUgLS0gZ292ZG9jcyc6ICdHb3Zlcm5tZW50IERvY3VtZW50cycsXG4gICAgICAgICAgICAnbGVlIC0tIGh1bWFuaXRpZXMnOiAnSHVtYW5pdGllcycsXG4gICAgICAgICAgICAnbGVlIC0tIGp1dmVuaWxlJzogJ0p1dmVuaWxlJyxcbiAgICAgICAgICAgICdsZWUgLS0gbWFwcyc6ICdNYXBzJyxcbiAgICAgICAgICAgICdsZWUgLS0gbWVkaWFfY2VudGVyJzogJ01lZGlhIENlbnRlcicsXG4gICAgICAgICAgICAnbGVlIC0tIG11c2ljJzogJ011c2ljICYgRGFuY2UnLFxuICAgICAgICAgICAgJ2xlZSAtLSBwZXJpb2RpY2Fscyc6ICdQZXJpb2RpY2FscycsXG4gICAgICAgICAgICAnbGVlIC0tIHBvcHVsYXInOiAnUG9wdWxhciBSZWFkaW5nJyxcbiAgICAgICAgICAgICdsZWUgLS0gcmVsaWdpb25fZmFtaGlzdCc6ICdSZWxpZ2lvbiAmIEZhbWlseSBIaXN0b3J5JyxcbiAgICAgICAgICAgICdsZWUgLS0gc2NpZW5jZV9lbmdpbmVlcmluZyc6ICdTY2llbmNlICYgRW5naW5lZXJpbmcnLFxuICAgICAgICAgICAgJ2xlZSAtLSBzb2NpYWxfc2NpZW5jZSc6ICdTb2NpYWwgU2NpZW5jZScsXG4gICAgICAgICAgICAnbGVlIC0tIHNwZWNpYWxfY29sbGVjdGlvbnMnOiAnU3BlY2lhbCBDb2xsZWN0aW9ucycsXG4gICAgICAgIH0sXG4gICAgICAgIGxhdzoge1xuICAgICAgICAgICAgJ2xhdyAtLSBpY2xycyc6ICdMYXcgJiBSZWxpZ2lvbiBTdHVkaWVzJyxcbiAgICAgICAgICAgICdsYXcgLS0gbWFpbic6ICdNYWluIENvbGxlY3Rpb24nLFxuICAgICAgICAgICAgJ2xhdyAtLSBtZWRpYSc6ICdNZWRpYScsXG4gICAgICAgICAgICAnbGF3IC0tIHJlc2VydmUnOiAnUmVzZXJ2ZScsXG4gICAgICAgICAgICAnbGF3IC0tIHNlbGZfaGVscCc6ICdTZWxmIEhlbHAnLFxuICAgICAgICAgICAgJ2xhdyAtLSBzdHVkeV9ndWlkZXMnOiAnU3R1ZHkgR3VpZGVzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZW5zaWduOiB7XG4gICAgICAgICAgICAnbGRzYmMgLS0gYXVkaW9fYm9va3MnOiAnQXVkaW8gQm9va3MnLFxuICAgICAgICAgICAgJ2xkc2JjIC0tIGRpc3BsYXknOiAnRGlzcGxheSBTaGVsdmVzJyxcbiAgICAgICAgICAgICdsZHNiYyAtLSBmaWN0aW9uJzogJ0ZpY3Rpb24nLFxuICAgICAgICAgICAgJ2xkc2JjIC0tIGZpbG1zJzogJ0ZlYXR1cmUgRmlsbXMnLFxuICAgICAgICAgICAgJ2xkc2JjIC0tIHN0YWNrcyc6ICdHZW5lcmFsIENvbGxlY3Rpb24nLFxuICAgICAgICAgICAgJ2xkc2JjIC0tIG5ld3NfbWFnYXppbmVzJzogJ05ld3MgTWFnYXppbmVzJyxcbiAgICAgICAgICAgICdsZHNiYyAtLSBub25fZmVhdHVyZV9maWxtcyc6ICdOb24gRmVhdHVyZSBGaWxtcycsXG4gICAgICAgICAgICAnbGRzYmMgLS0gb3ZlcnNpemUnOiAnT3ZlcnNpemUnLFxuICAgICAgICAgICAgJ2xkc2JjIC0tIHBhcmFsZWdhbCc6ICdQYXJhbGVnYWwnLFxuICAgICAgICAgICAgJ2xkc2JjIC0tIHBlcmlvZGljYWxzJzogJ1BlcmlvZGljYWxzJyxcbiAgICAgICAgICAgICdsZHNiYyAtLSByZWZlcmVuY2UnOiAnUmVmZXJlbmNlJyxcbiAgICAgICAgICAgICdsZHNiYyAtLSByZXNlcnZlJzogJ1Jlc2VydmUnLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbGFuZ3VhZ2VzOiB7XG4gICAgICAgIGVuZzogJ0VuZ2xpc2gnLFxuICAgICAgICBhcmE6ICdBcmFiaWMnLFxuICAgICAgICBjaGk6ICdDaGluZXNlJyxcbiAgICAgICAgY2VzOiAnQ3plY2gnLFxuICAgICAgICBkYW46ICdEYW5pc2gnLFxuICAgICAgICBkdXQ6ICdEdXRjaCcsXG4gICAgICAgIGZpbjogJ0Zpbm5pc2gnLFxuICAgICAgICBmcmU6ICdGcmVuY2gnLFxuICAgICAgICBnZXI6ICdHZXJtYW4nLFxuICAgICAgICBncmU6ICdHcmVlaywgTW9kZXJuJyxcbiAgICAgICAgaGViOiAnSGVicmV3JyxcbiAgICAgICAgaGluOiAnSGluZGknLFxuICAgICAgICBodW46ICdIdW5nYXJpYW4nLFxuICAgICAgICBpY2U6ICdJY2VsYW5kaWMnLFxuICAgICAgICBpdGE6ICdJdGFsaWFuJyxcbiAgICAgICAganBuOiAnSmFwYW5lc2UnLFxuICAgICAgICBrb3I6ICdLb3JlYW4nLFxuICAgICAgICBsYXQ6ICdMYXRpbicsXG4gICAgICAgIG5vcjogJ05vcndlZ2lhbicsXG4gICAgICAgIHBvbDogJ1BvbGlzaCcsXG4gICAgICAgIHBvcjogJ1BvcnR1Z3Vlc2UnLFxuICAgICAgICBwYW46ICdQdW5qYWJpJyxcbiAgICAgICAgcnVtOiAnUm9tYW5pYW4nLFxuICAgICAgICBydXM6ICdSdXNzaWFuJyxcbiAgICAgICAgc3BhOiAnU3BhbmlzaCcsXG4gICAgICAgIHN3ZTogJ1N3ZWRpc2gnLFxuICAgICAgICB3ZWw6ICdXZWxzaCcsXG4gICAgICAgIHlpZDogJ1lpZGRpc2gnLFxuICAgIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUFJJTUFSWV9CTFVFID0gJ3JnYmEoNjMsIDExMiwgMTc2LCAxKSc7XG5leHBvcnQgY29uc3QgUFJJTUFSWV9CTFVFX0hPVkVSID0gJ2hzbCgyMTQsIDQ4JSwgNjAlLCAxKSc7XG5leHBvcnQgY29uc3QgUFJJTUFSWV9MSUdIVF9CTFVFID0gJ3JnYmEoMjIzLCAyMzMsIDI0NywgMSknO1xuZXhwb3J0IGNvbnN0IFBSSU1BUllfUFVSUExFID0gJyM4NzcyQTYnO1xuZXhwb3J0IGNvbnN0IFBSSU1BUllfUFVSUExFX0hPVkVSID0gJyM3QzY1OUYnO1xuZXhwb3J0IGNvbnN0IERFU1RSVUNUSVZFX1JFRCA9ICdoc2woNSwgNDclLCA0NyUsIDEpJztcbmV4cG9ydCBjb25zdCBERVNUUlVDVElWRV9SRURfSE9WRVIgPSAnaHNsKDUsIDQ3JSwgNTAlLCAxKSc7XG5leHBvcnQgY29uc3QgU0VDT05EQVJZX1RFWFRfR1JBWSA9ICdyZ2JhKDExMiwgMTEyLCAxMTIsIDEpJztcbmV4cG9ydCBjb25zdCBMSUdIVF9HUkFZID0gJ3JnYmEoMjMwLCAyMzAsIDIzMCwgMSknO1xuZXhwb3J0IGNvbnN0IERST1BfU0hBRE9XX0RBUktfQkxVRSA9ICdyZ2JhKDUxLCA2MiwgNzcsIDAuMTYpJztcbmV4cG9ydCBjb25zdCBURVhUX1NFTUlCT0xEID0gJzYwMCc7XG5leHBvcnQgY29uc3QgVEVYVF9CT0xEID0gJzcwMCc7XG5leHBvcnQgY29uc3QgQU5JTUFUSU9OX0xFTkdUSF9TVEQgPSAnMC4xNXMnO1xuZXhwb3J0IGNvbnN0IExJTkVfSEVJR0hUX1NURCA9ICcxLjQnO1xuZXhwb3J0IGNvbnN0IENPTlRFWFRVQUxfU0VMRUNUT1JfSEVJR0hUID0gJzQuNXJlbSc7XG5leHBvcnQgY29uc3QgQ09OVEVOVF9NQVhfV0lEVEggPSAnNzVyZW0nO1xuZXhwb3J0IGNvbnN0IENPTlRFTlRfUEFERElORyA9ICc1LjRyZW0nO1xuIl19
|