ontotext-reusable-ui-components
Version:
Unified reusable UI components designed for the Ontotext ecosystem.
101 lines • 16 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { FormControl } from '@angular/forms';
import { map, startWith } from 'rxjs/operators';
import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
import { SearchFieldConfiguration } from '../models/search-field-configuration';
export class SearchComponent {
constructor() {
/**
* On search event emitter.
*/
this.onSearch = new EventEmitter();
/**
* On key press emitter.
*/
this.onKeyPress = new EventEmitter();
this.stateCtrl = new FormControl();
this.selectable = SearchFieldConfiguration.selectable;
this.removable = SearchFieldConfiguration.removable;
this.separatorKeysCodes = SearchFieldConfiguration.separatorKeysCodes;
this.defaultSearchResultMappingFunction = (data) => data;
}
ngOnInit() {
this.states.subscribe((states) => {
this._states = states;
});
this.subscribeAutocompleteFilter();
this.currentTemplate = this.autocompleteOptionTemplate;
this.searchResultMappingFunction = this.searchResultMappingFunction || this.defaultSearchResultMappingFunction;
}
ngOnChanges(changes) {
var _a;
if ((_a = changes === null || changes === void 0 ? void 0 : changes.preselectedStatesList) === null || _a === void 0 ? void 0 : _a.currentValue) {
this.statesList = new Set([...this.preselectedStatesList]);
}
}
subscribeAutocompleteFilter() {
const enableAutocomplete = this.enableInnerAutocompleteFiltration || false;
if (enableAutocomplete) {
this.filteredStates = this.stateCtrl.valueChanges
.pipe(startWith(''), map((state) => state ? this.filterStates(state) : []));
}
else {
this.filteredStates = this.states;
}
}
filterStates(value) {
const filterValue = typeof value === 'string' ? value.toLowerCase() : value;
return this._states.filter((state) => state.label.toLowerCase().indexOf(filterValue) === 0);
}
add(event) {
const input = event.input;
const value = (event.value || '').trim();
if (value) {
this.statesList.add(value);
}
if (input) {
input.value = '';
}
this.stateCtrl.setValue(null);
this.autocomplete.closePanel();
}
remove(state) {
this.statesList.delete(state);
this.stateCtrl.setValue(null);
}
selected(event) {
this.statesList.add(event.option.value);
this.statesInput.nativeElement.value = '';
this.stateCtrl.setValue(null);
}
search() {
this.onSearch.emit([...this.statesList].map((state) => {
if (state.label) {
return this.searchResultMappingFunction(state);
}
return state;
}));
}
onInputChange(value) {
this.onKeyPress.emit(value);
}
}
SearchComponent.decorators = [
{ type: Component, args: [{
selector: 'app-search',
template: "<div class=\"search-field-component\" appCypressData=\"search-field-component\">\n <div class=\"selection-list\">\n <mat-form-field class=\"state-selection-list\">\n <mat-chip-list #selectionList aria-label=\"Search selection\" appCypressData=\"search-field-selection\">\n <mat-chip\n *ngFor=\"let state of statesList; let index = index\"\n [selectable]=\"selectable\"\n [removable]=\"removable\"\n (removed)=\"remove(state)\"\n [ngClass]=\"state.label ? 'state-suggestion' : 'state-free-text'\"\n [attr.appCypressData]=\"'state-selection-' + index\">\n {{state.label || state}}\n <mat-icon matChipRemove *ngIf=\"removable\" [attr.appCypressData]=\"'state-cancel-' + index\">cancel</mat-icon>\n </mat-chip>\n <input\n placeholder=\"{{'ONTO_SEARCH.SEARCH_PLACEHOLDER' | transloco}}\"\n #statesInput\n [formControl]=\"stateCtrl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"selectionList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"add($event)\"\n (input)=\"onInputChange($event.target.value)\"\n appCypressData=\"search-field-input\">\n </mat-chip-list>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n <mat-option class=\"state-option\" *ngFor=\"let state of filteredStates | async; let index = index\" [value]=\"state\">\n <ng-container *ngTemplateOutlet=\"currentTemplate; context: {$implicit: {state: state, index: index}}\">\n </ng-container>\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n <button class=\"search-field-button\" mat-raised-button (click)=\"search()\"\n appCypressData=\"search-field-button\">{{'ONTO_SEARCH.BUTTON.SEARCH' | transloco}}</button>\n</div>\n",
styles: [".search-field-component{align-items:center;box-sizing:border-box;display:flex;flex-direction:row;height:100%;place-content:center space-between;width:100%}.search-field-component .selection-list{box-sizing:border-box;flex:1 1 100%;max-width:100%}.search-field-component .state-selection-list{display:inherit}button.search-field-button{margin-left:1em}.state-option{height:auto;line-height:1.5em;padding:1em 0;word-wrap:break-word}"]
},] }
];
SearchComponent.propDecorators = {
states: [{ type: Input }],
preselectedStatesList: [{ type: Input }],
autocompleteOptionTemplate: [{ type: Input }],
enableInnerAutocompleteFiltration: [{ type: Input }],
searchResultMappingFunction: [{ type: Input }],
onSearch: [{ type: Output }],
onKeyPress: [{ type: Output }],
statesInput: [{ type: ViewChild, args: ['statesInput',] }],
autocomplete: [{ type: ViewChild, args: [MatAutocompleteTrigger,] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIvb3B0L2plbmtpbnNfam9icy93b3Jrc3BhY2UvcmV1c2FibGUtdWktY29tcG9uZW50cy1yZWxlYXNlL3Byb2plY3RzL29udG8tc2VhcmNoL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9vbnRvLXNlYXJjaC1maWVsZC9zZWFyY2gvc2VhcmNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQStCLHNCQUFzQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEcsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFROUUsTUFBTSxPQUFPLGVBQWU7SUFMNUI7UUF5QkU7O1dBRUc7UUFFSSxhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFN0Q7O1dBRUc7UUFFSSxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFNeEQsY0FBUyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFJOUIsZUFBVSxHQUFZLHdCQUF3QixDQUFDLFVBQVUsQ0FBQztRQUMxRCxjQUFTLEdBQVksd0JBQXdCLENBQUMsU0FBUyxDQUFDO1FBQ3hELHVCQUFrQixHQUFHLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDO1FBRWhFLHVDQUFrQyxHQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUEyRW5FLENBQUM7SUF6RVEsUUFBUTtRQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUVuQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQztRQUN2RCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixJQUFJLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztJQUNqSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCOztRQUNoQyxVQUFJLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxxQkFBcUIsMENBQUUsWUFBWSxFQUFFO1lBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDO0lBRU8sMkJBQTJCO1FBQ2pDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxJQUFJLEtBQUssQ0FBQztRQUMzRSxJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO2lCQUM1QyxJQUFJLENBQ0QsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUNiLEdBQUcsQ0FBQyxDQUFDLEtBQW9CLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMvRTthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFhO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDNUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVNLEdBQUcsQ0FBQyxLQUF3QjtRQUNqQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzFCLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV6QyxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxLQUFLLEVBQUU7WUFDVCxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztTQUNsQjtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxLQUFVO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBbUM7UUFDakQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNwRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDaEQ7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU0sYUFBYSxDQUFDLEtBQVU7UUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQzs7O1lBM0hGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsbTVEQUFzQzs7YUFFdkM7OztxQkFFRSxLQUFLO29DQUlMLEtBQUs7eUNBTUwsS0FBSztnREFHTCxLQUFLOzBDQUdMLEtBQUs7dUJBTUwsTUFBTTt5QkFNTixNQUFNOzBCQUdOLFNBQVMsU0FBQyxhQUFhOzJCQUN2QixTQUFTLFNBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7bWFwLCBzdGFydFdpdGh9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TWF0Q2hpcElucHV0RXZlbnR9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7U2VhcmNoRmllbGRDb25maWd1cmF0aW9ufSBmcm9tICcuLi9tb2RlbHMvc2VhcmNoLWZpZWxkLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtTZWFyY2hGaWVsZE1vZGVsfSBmcm9tICcuLi9tb2RlbHMvc2VhcmNoLWZpZWxkLW1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNlYXJjaCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2guY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWFyY2guY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKVxuICBwcml2YXRlIHN0YXRlczogT2JzZXJ2YWJsZTxTZWFyY2hGaWVsZE1vZGVsW10+O1xuICBwcml2YXRlIF9zdGF0ZXM6IFNlYXJjaEZpZWxkTW9kZWxbXTtcblxuICBASW5wdXQoKVxuICBwcml2YXRlIHByZXNlbGVjdGVkU3RhdGVzTGlzdDogYW55W107XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB0ZW1wbGF0ZSByZWZlcmVuY2UuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KClcbiAgcHJpdmF0ZSBlbmFibGVJbm5lckF1dG9jb21wbGV0ZUZpbHRyYXRpb246IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHJpdmF0ZSBzZWFyY2hSZXN1bHRNYXBwaW5nRnVuY3Rpb246IGFueTtcblxuICAvKipcbiAgICogT24gc2VhcmNoIGV2ZW50IGVtaXR0ZXIuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIG9uU2VhcmNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBPbiBrZXkgcHJlc3MgZW1pdHRlci5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb25LZXlQcmVzczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKCdzdGF0ZXNJbnB1dCcpIHN0YXRlc0lucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpIGF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcblxuICBwdWJsaWMgc3RhdGVzTGlzdDogU2V0PGFueT47XG4gIHB1YmxpYyBzdGF0ZUN0cmwgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAgcHVibGljIGZpbHRlcmVkU3RhdGVzOiBPYnNlcnZhYmxlPGFueVtdPjtcbiAgcHVibGljIGN1cnJlbnRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBwdWJsaWMgc2VsZWN0YWJsZTogYm9vbGVhbiA9IFNlYXJjaEZpZWxkQ29uZmlndXJhdGlvbi5zZWxlY3RhYmxlO1xuICBwdWJsaWMgcmVtb3ZhYmxlOiBib29sZWFuID0gU2VhcmNoRmllbGRDb25maWd1cmF0aW9uLnJlbW92YWJsZTtcbiAgcHVibGljIHNlcGFyYXRvcktleXNDb2RlcyA9IFNlYXJjaEZpZWxkQ29uZmlndXJhdGlvbi5zZXBhcmF0b3JLZXlzQ29kZXM7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0U2VhcmNoUmVzdWx0TWFwcGluZ0Z1bmN0aW9uOiBhbnkgPSAoZGF0YSkgPT4gZGF0YTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZXMuc3Vic2NyaWJlKChzdGF0ZXMpID0+IHtcbiAgICAgIHRoaXMuX3N0YXRlcyA9IHN0YXRlcztcbiAgICB9KTtcblxuICAgIHRoaXMuc3Vic2NyaWJlQXV0b2NvbXBsZXRlRmlsdGVyKCk7XG5cbiAgICB0aGlzLmN1cnJlbnRUZW1wbGF0ZSA9IHRoaXMuYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRNYXBwaW5nRnVuY3Rpb24gPSB0aGlzLnNlYXJjaFJlc3VsdE1hcHBpbmdGdW5jdGlvbiB8fCB0aGlzLmRlZmF1bHRTZWFyY2hSZXN1bHRNYXBwaW5nRnVuY3Rpb247XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXM/LnByZXNlbGVjdGVkU3RhdGVzTGlzdD8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLnN0YXRlc0xpc3QgPSBuZXcgU2V0PGFueT4oWy4uLnRoaXMucHJlc2VsZWN0ZWRTdGF0ZXNMaXN0XSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVBdXRvY29tcGxldGVGaWx0ZXIoKTogdm9pZCB7XG4gICAgY29uc3QgZW5hYmxlQXV0b2NvbXBsZXRlID0gdGhpcy5lbmFibGVJbm5lckF1dG9jb21wbGV0ZUZpbHRyYXRpb24gfHwgZmFsc2U7XG4gICAgaWYgKGVuYWJsZUF1dG9jb21wbGV0ZSkge1xuICAgICAgdGhpcy5maWx0ZXJlZFN0YXRlcyA9IHRoaXMuc3RhdGVDdHJsLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBzdGFydFdpdGgoJycpLFxuICAgICAgICAgICAgICBtYXAoKHN0YXRlOiBzdHJpbmcgfCBudWxsKSA9PiBzdGF0ZSA/IHRoaXMuZmlsdGVyU3RhdGVzKHN0YXRlKSA6IFtdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRTdGF0ZXMgPSB0aGlzLnN0YXRlcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbHRlclN0YXRlcyh2YWx1ZTogc3RyaW5nKTogYW55W10ge1xuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVzLmZpbHRlcigoc3RhdGUpID0+IHN0YXRlLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmaWx0ZXJWYWx1ZSkgPT09IDApO1xuICB9XG5cbiAgcHVibGljIGFkZChldmVudDogTWF0Q2hpcElucHV0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LmlucHV0O1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuc3RhdGVzTGlzdC5hZGQodmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChpbnB1dCkge1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlQ3RybC5zZXRWYWx1ZShudWxsKTtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZVBhbmVsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlKHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlc0xpc3QuZGVsZXRlKHN0YXRlKTtcbiAgICB0aGlzLnN0YXRlQ3RybC5zZXRWYWx1ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGVzTGlzdC5hZGQoZXZlbnQub3B0aW9uLnZhbHVlKTtcbiAgICB0aGlzLnN0YXRlc0lucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB0aGlzLnN0YXRlQ3RybC5zZXRWYWx1ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5vblNlYXJjaC5lbWl0KFsuLi50aGlzLnN0YXRlc0xpc3RdLm1hcCgoc3RhdGUpID0+IHtcbiAgICAgIGlmIChzdGF0ZS5sYWJlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hSZXN1bHRNYXBwaW5nRnVuY3Rpb24oc3RhdGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBvbklucHV0Q2hhbmdlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uS2V5UHJlc3MuZW1pdCh2YWx1ZSk7XG4gIH1cbn1cbiJdfQ==