@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
170 lines • 21.8 kB
JavaScript
import { Component, Inject, Input, ViewChild } from '@angular/core';
import { NAE_SEARCH_CATEGORIES } from '../category-factory/search-categories-injection-token';
import { Query } from '../models/query/query';
import * as i0 from "@angular/core";
import * as i1 from "../../logger/services/logger.service";
import * as i2 from "../advanced-search-component-initialization-service/advanced-search-component-initialization.service";
import * as i3 from "../category-factory/category-factory";
/**
* Is responsible for the interactive creation of a single {@link ElementaryPredicate} object instance.
*/
export class AbstractSearchPredicateComponent {
_naeSearchCategories;
_logger;
_initializationService;
_categoryFactory;
/**
* Whether the contents displayed in this component can be edited by the user or not.
*
* Defaults to `true`
*/
editable = true;
predicate;
predicateId;
remove$;
/**
* Optional generator with prefilled values. Can be used to add prefilled predicate components to the search GUI.
*/
generator;
_selectedCategory;
_predicateChange;
_searchCategories;
constructor(_naeSearchCategories, _logger, _initializationService, _categoryFactory) {
this._naeSearchCategories = _naeSearchCategories;
this._logger = _logger;
this._initializationService = _initializationService;
this._categoryFactory = _categoryFactory;
}
ngOnInit() {
let found = false;
this._searchCategories = this._naeSearchCategories.map(category => {
// if the provided generator is the same class as one of the injected search categories
if (this.generator && this.generator.constructor === category) {
found = true;
this.categoryChanged(this.generator);
return this.generator;
}
return this._categoryFactory.get(category);
});
if (this.generator && !found) {
this._logger.error('Provided predicate generator is not an allowed category from the NAE_SEARCH_CATEGORIES injection token!'
+ ' Behavior in this case is undefined.');
}
this.predicate.setMetadataGenerator(() => {
if (!!this._selectedCategory) {
return this._selectedCategory.createMetadata();
}
return undefined;
});
this.predicate.setFilterTextSegmentsGenerator(() => {
if (!!this._selectedCategory) {
return this._selectedCategory.createFilterTextSegments();
}
return [];
});
}
ngOnDestroy() {
if (this._predicateChange && !this._predicateChange.closed) {
this._predicateChange.unsubscribe();
}
this._searchCategories.forEach(cat => {
if (cat !== this.generator) {
cat.destroy();
}
});
}
get searchCategories() {
return this._searchCategories;
}
set categoryInput(input) {
if (input && this._initializationService.isInitialized) {
setTimeout(() => {
input.focus();
input.open();
});
}
}
get selectedCategory() {
return this._selectedCategory;
}
set selectedCategory(newCategory) {
this.categoryChanged(newCategory);
}
/**
* Lambda that is used to preserve `this` reference in HTML binding.
*
* See [_renderSelection()]{@link AbstractSearchPredicateComponent#_renderSelection} for information about the transform function.
* @param option the {@link SearchAutocompleteOption} object that was selected in the autocomplete list.
*/
renderSelection = (option) => this._renderSelection(option);
remove() {
this.remove$.next(this.predicateId);
}
categoryChanged(newCategory) {
if (this.selectedCategory !== undefined) {
this.selectedCategory.reset();
}
this._selectedCategory = newCategory;
if (newCategory !== undefined) {
if (this._predicateChange) {
this._predicateChange.unsubscribe();
}
this._predicateChange = newCategory.generatedPredicate$.subscribe(predicate => this.processPredicateChange(predicate));
}
}
clearCategorySelection() {
if (!this.editable) {
return;
}
this.categoryChanged(undefined);
}
/**
* Transforms a {@link SearchAutocompleteOption} object into it's name.
* Used for displaying user selection in the input field, when an autocomplete option is selected.
* @param option the object we want to transform. It might not exist if user input doesn't match any autocomplete option
* @returns option name if it exists, empty string otherwise
*/
_renderSelection(option) {
return option ? option.text : '';
}
/**
* Notifies the `EditableElementaryPredicate` about changes to the predicate generated by the selected `Category`.
* @param newPredicate predicate generated by the selected `Category`
*/
processPredicateChange(newPredicate) {
if (newPredicate === undefined) {
this.predicate.query = Query.emptyQuery();
this._logger.debug('Editable query changed to empty query');
}
else {
this.predicate.query = newPredicate.query;
this._logger.debug(`Editable query changed to: ${newPredicate.query.value}`);
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractSearchPredicateComponent, deps: [{ token: NAE_SEARCH_CATEGORIES }, { token: i1.LoggerService }, { token: i2.AdvancedSearchComponentInitializationService }, { token: i3.CategoryFactory }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractSearchPredicateComponent, selector: "ncc-abstract-search-predicate", inputs: { editable: "editable", predicate: "predicate", predicateId: "predicateId", remove$: "remove$", generator: "generator" }, viewQueries: [{ propertyName: "categoryInput", first: true, predicate: ["categoryInput"], descendants: true }], ngImport: i0, template: '', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractSearchPredicateComponent, decorators: [{
type: Component,
args: [{
selector: 'ncc-abstract-search-predicate',
template: ''
}]
}], ctorParameters: () => [{ type: Array, decorators: [{
type: Inject,
args: [NAE_SEARCH_CATEGORIES]
}] }, { type: i1.LoggerService }, { type: i2.AdvancedSearchComponentInitializationService }, { type: i3.CategoryFactory }], propDecorators: { editable: [{
type: Input
}], predicate: [{
type: Input
}], predicateId: [{
type: Input
}], remove$: [{
type: Input
}], generator: [{
type: Input
}], categoryInput: [{
type: ViewChild,
args: ['categoryInput']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3Qtc2VhcmNoLXByZWRpY2F0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3NlYXJjaC9zZWFyY2gtcHJlZGljYXRlLWNvbXBvbmVudC9hYnN0cmFjdC1zZWFyY2gtcHJlZGljYXRlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQTJCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUzRixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1REFBdUQsQ0FBQztBQUk1RixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7Ozs7O0FBVTVDOztHQUVHO0FBS0gsTUFBTSxPQUFnQixnQ0FBZ0M7SUFzQlc7SUFDN0I7SUFDQTtJQUNBO0lBdkJoQzs7OztPQUlHO0lBQ00sUUFBUSxHQUFHLElBQUksQ0FBQztJQUNoQixTQUFTLENBQThCO0lBQ3ZDLFdBQVcsQ0FBUztJQUNwQixPQUFPLENBQWtCO0lBQ2xDOztPQUVHO0lBQ00sU0FBUyxDQUE0QjtJQUVwQyxpQkFBaUIsQ0FBZ0I7SUFFakMsZ0JBQWdCLENBQWU7SUFFL0IsaUJBQWlCLENBQXVCO0lBRWxELFlBQTZELG9CQUFnRCxFQUM3RSxPQUFzQixFQUN0QixzQkFBb0UsRUFDcEUsZ0JBQWlDO1FBSEoseUJBQW9CLEdBQXBCLG9CQUFvQixDQUE0QjtRQUM3RSxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3RCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBOEM7UUFDcEUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtJQUNqRSxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFB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OzRGQXRCakMsZ0NBQWdDLHVUQUZ4QyxFQUFFOzs0RkFFTSxnQ0FBZ0M7a0JBSnJELFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLCtCQUErQjtvQkFDekMsUUFBUSxFQUFFLEVBQUU7aUJBQ2Y7OzBCQXVCMEIsTUFBTTsyQkFBQyxxQkFBcUI7OEpBZjFDLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQThESyxhQUFhO3NCQUR2QixTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFR5cGUsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge05BRV9TRUFSQ0hfQ0FURUdPUklFU30gZnJvbSAnLi4vY2F0ZWdvcnktZmFjdG9yeS9zZWFyY2gtY2F0ZWdvcmllcy1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtDYXRlZ29yeX0gZnJvbSAnLi4vbW9kZWxzL2NhdGVnb3J5L2NhdGVnb3J5JztcbmltcG9ydCB7U2VhcmNoQXV0b2NvbXBsZXRlT3B0aW9ufSBmcm9tICcuLi9tb2RlbHMvY2F0ZWdvcnkvc2VhcmNoLWF1dG9jb21wbGV0ZS1vcHRpb24nO1xuaW1wb3J0IHtFbGVtZW50YXJ5UHJlZGljYXRlfSBmcm9tICcuLi9tb2RlbHMvcHJlZGljYXRlL2VsZW1lbnRhcnktcHJlZGljYXRlJztcbmltcG9ydCB7UXVlcnl9IGZyb20gJy4uL21vZGVscy9xdWVyeS9xdWVyeSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge01hdFNlbGVjdH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7RWRpdGFibGVFbGVtZW50YXJ5UHJlZGljYXRlfSBmcm9tICcuLi9tb2RlbHMvcHJlZGljYXRlL2VkaXRhYmxlLWVsZW1lbnRhcnktcHJlZGljYXRlJztcbmltcG9ydCB7XG4gICAgQWR2YW5jZWRTZWFyY2hDb21wb25lbnRJbml0aWFsaXphdGlvblNlcnZpY2Vcbn0gZnJvbSAnLi4vYWR2YW5jZWQtc2VhcmNoLWNvbXBvbmVudC1pbml0aWFsaXphdGlvbi1zZXJ2aWNlL2FkdmFuY2VkLXNlYXJjaC1jb21wb25lbnQtaW5pdGlhbGl6YXRpb24uc2VydmljZSc7XG5pbXBvcnQge0NhdGVnb3J5RmFjdG9yeX0gZnJvbSAnLi4vY2F0ZWdvcnktZmFjdG9yeS9jYXRlZ29yeS1mYWN0b3J5JztcblxuXG4vKipcbiAqIElzIHJlc3BvbnNpYmxlIGZvciB0aGUgaW50ZXJhY3RpdmUgY3JlYXRpb24gb2YgYSBzaW5nbGUge0BsaW5rIEVsZW1lbnRhcnlQcmVkaWNhdGV9IG9iamVjdCBpbnN0YW5jZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYWJzdHJhY3Qtc2VhcmNoLXByZWRpY2F0ZScsXG4gICAgdGVtcGxhdGU6ICcnXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VhcmNoUHJlZGljYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgY29udGVudHMgZGlzcGxheWVkIGluIHRoaXMgY29tcG9uZW50IGNhbiBiZSBlZGl0ZWQgYnkgdGhlIHVzZXIgb3Igbm90LlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gYHRydWVgXG4gICAgICovXG4gICAgQElucHV0KCkgZWRpdGFibGUgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHByZWRpY2F0ZTogRWRpdGFibGVFbGVtZW50YXJ5UHJlZGljYXRlO1xuICAgIEBJbnB1dCgpIHByZWRpY2F0ZUlkOiBudW1iZXI7XG4gICAgQElucHV0KCkgcmVtb3ZlJDogU3ViamVjdDxudW1iZXI+O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIGdlbmVyYXRvciB3aXRoIHByZWZpbGxlZCB2YWx1ZXMuIENhbiBiZSB1c2VkIHRvIGFkZCBwcmVmaWxsZWQgcHJlZGljYXRlIGNvbXBvbmVudHMgdG8gdGhlIHNlYXJjaCBHVUkuXG4gICAgICovXG4gICAgQElucHV0KCkgZ2VuZXJhdG9yOiBDYXRlZ29yeTxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gICAgcHJvdGVjdGVkIF9zZWxlY3RlZENhdGVnb3J5OiBDYXRlZ29yeTxhbnk+O1xuXG4gICAgcHJvdGVjdGVkIF9wcmVkaWNhdGVDaGFuZ2U6IFN1YnNjcmlwdGlvbjtcblxuICAgIHByb3RlY3RlZCBfc2VhcmNoQ2F0ZWdvcmllczogQXJyYXk8Q2F0ZWdvcnk8YW55Pj47XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoQEluamVjdChOQUVfU0VBUkNIX0NBVEVHT1JJRVMpIHByaXZhdGUgX25hZVNlYXJjaENhdGVnb3JpZXM6IEFycmF5PFR5cGU8Q2F0ZWdvcnk8YW55Pj4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9pbml0aWFsaXphdGlvblNlcnZpY2U6IEFkdmFuY2VkU2VhcmNoQ29tcG9uZW50SW5pdGlhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NhdGVnb3J5RmFjdG9yeTogQ2F0ZWdvcnlGYWN0b3J5KSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zZWFyY2hDYXRlZ29yaWVzID0gdGhpcy5fbmFlU2VhcmNoQ2F0ZWdvcmllcy5tYXAoY2F0ZWdvcnkgPT4ge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHByb3ZpZGVkIGdlbmVyYXRvciBpcyB0aGUgc2FtZSBjbGFzcyBhcyBvbmUgb2YgdGhlIGluamVjdGVkIHNlYXJjaCBjYXRlZ29yaWVzXG4gICAgICAgICAgICBpZiAodGhpcy5nZW5lcmF0b3IgJiYgdGhpcy5nZW5lcmF0b3IuY29uc3RydWN0b3IgPT09IGNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlDaGFuZ2VkKHRoaXMuZ2VuZXJhdG9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0b3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2F0ZWdvcnlGYWN0b3J5LmdldChjYXRlZ29yeSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmdlbmVyYXRvciAmJiAhZm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignUHJvdmlkZWQgcHJlZGljYXRlIGdlbmVyYXRvciBpcyBub3QgYW4gYWxsb3dlZCBjYXRlZ29yeSBmcm9tIHRoZSBOQUVfU0VBUkNIX0NBVEVHT1JJRVMgaW5qZWN0aW9uIHRva2VuISdcbiAgICAgICAgICAgICAgICArICcgQmVoYXZpb3IgaW4gdGhpcyBjYXNlIGlzIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJlZGljYXRlLnNldE1ldGFkYXRhR2VuZXJhdG9yKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghIXRoaXMuX3NlbGVjdGVkQ2F0ZWdvcnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRDYXRlZ29yeS5jcmVhdGVNZXRhZGF0YSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wcmVkaWNhdGUuc2V0RmlsdGVyVGV4dFNlZ21lbnRzR2VuZXJhdG9yKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghIXRoaXMuX3NlbGVjdGVkQ2F0ZWdvcnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRDYXRlZ29yeS5jcmVhdGVGaWx0ZXJUZXh0U2VnbWVudHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9wcmVkaWNhdGVDaGFuZ2UgJiYgIXRoaXMuX3ByZWRpY2F0ZUNoYW5nZS5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZWRpY2F0ZUNoYW5nZS51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NlYXJjaENhdGVnb3JpZXMuZm9yRWFjaChjYXQgPT4ge1xuICAgICAgICAgICAgaWYgKGNhdCAhPT0gdGhpcy5nZW5lcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBjYXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaENhdGVnb3JpZXMoKTogQXJyYXk8Q2F0ZWdvcnk8YW55Pj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoQ2F0ZWdvcmllcztcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKCdjYXRlZ29yeUlucHV0JylcbiAgICBwdWJsaWMgc2V0IGNhdGVnb3J5SW5wdXQoaW5wdXQ6IE1hdFNlbGVjdCkge1xuICAgICAgICBpZiAoaW5wdXQgJiYgdGhpcy5faW5pdGlhbGl6YXRpb25TZXJ2aWNlLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgaW5wdXQub3BlbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ2F0ZWdvcnkoKTogQ2F0ZWdvcnk8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZENhdGVnb3J5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRDYXRlZ29yeShuZXdDYXRlZ29yeTogQ2F0ZWdvcnk8YW55Pikge1xuICAgICAgICB0aGlzLmNhdGVnb3J5Q2hhbmdlZChuZXdDYXRlZ29yeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGFtYmRhIHRoYXQgaXMgdXNlZCB0byBwcmVzZXJ2ZSBgdGhpc2AgcmVmZXJlbmNlIGluIEhUTUwgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFNlZSBbX3JlbmRlclNlbGVjdGlvbigpXXtAbGluayBBYnN0cmFjdFNlYXJjaFByZWRpY2F0ZUNvbXBvbmVudCNfcmVuZGVyU2VsZWN0aW9ufSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZm9ybSBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIHRoZSB7QGxpbmsgU2VhcmNoQXV0b2NvbXBsZXRlT3B0aW9ufSBvYmplY3QgdGhhdCB3YXMgc2VsZWN0ZWQgaW4gdGhlIGF1dG9jb21wbGV0ZSBsaXN0LlxuICAgICAqL1xuICAgIHB1YmxpYyByZW5kZXJTZWxlY3Rpb24gPSAob3B0aW9uOiBTZWFyY2hBdXRvY29tcGxldGVPcHRpb248dW5rbm93bj4pID0+IHRoaXMuX3JlbmRlclNlbGVjdGlvbihvcHRpb24pO1xuXG4gICAgcHVibGljIHJlbW92ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW1vdmUkLm5leHQodGhpcy5wcmVkaWNhdGVJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhdGVnb3J5Q2hhbmdlZChuZXdDYXRlZ29yeTogQ2F0ZWdvcnk8YW55Pik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeS5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQ2F0ZWdvcnkgPSBuZXdDYXRlZ29yeTtcbiAgICAgICAgaWYgKG5ld0NhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcmVkaWNhdGVDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcmVkaWNhdGVDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3ByZWRpY2F0ZUNoYW5nZSA9IG5ld0NhdGVnb3J5LmdlbmVyYXRlZFByZWRpY2F0ZSQuc3Vic2NyaWJlKHByZWRpY2F0ZSA9PiB0aGlzLnByb2Nlc3NQcmVkaWNhdGVDaGFuZ2UocHJlZGljYXRlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJDYXRlZ29yeVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhdGVnb3J5Q2hhbmdlZCh1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybXMgYSB7QGxpbmsgU2VhcmNoQXV0b2NvbXBsZXRlT3B0aW9ufSBvYmplY3QgaW50byBpdCdzIG5hbWUuXG4gICAgICogVXNlZCBmb3IgZGlzcGxheWluZyB1c2VyIHNlbGVjdGlvbiBpbiB0aGUgaW5wdXQgZmllbGQsIHdoZW4gYW4gYXV0b2NvbXBsZXRlIG9wdGlvbiBpcyBzZWxlY3RlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIHRoZSBvYmplY3Qgd2Ugd2FudCB0byB0cmFuc2Zvcm0uIEl0IG1pZ2h0IG5vdCBleGlzdCBpZiB1c2VyIGlucHV0IGRvZXNuJ3QgbWF0Y2ggYW55IGF1dG9jb21wbGV0ZSBvcHRpb25cbiAgICAgKiBAcmV0dXJucyBvcHRpb24gbmFtZSBpZiBpdCBleGlzdHMsIGVtcHR5IHN0cmluZyBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3JlbmRlclNlbGVjdGlvbihvcHRpb246IFNlYXJjaEF1dG9jb21wbGV0ZU9wdGlvbjx1bmtub3duPik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24udGV4dCA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIHRoZSBgRWRpdGFibGVFbGVtZW50YXJ5UHJlZGljYXRlYCBhYm91dCBjaGFuZ2VzIHRvIHRoZSBwcmVkaWNhdGUgZ2VuZXJhdGVkIGJ5IHRoZSBzZWxlY3RlZCBgQ2F0ZWdvcnlgLlxuICAgICAqIEBwYXJhbSBuZXdQcmVkaWNhdGUgcHJlZGljYXRlIGdlbmVyYXRlZCBieSB0aGUgc2VsZWN0ZWQgYENhdGVnb3J5YFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzUHJlZGljYXRlQ2hhbmdlKG5ld1ByZWRpY2F0ZTogRWxlbWVudGFyeVByZWRpY2F0ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAobmV3UHJlZGljYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHJlZGljYXRlLnF1ZXJ5ID0gUXVlcnkuZW1wdHlRdWVyeSgpO1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdFZGl0YWJsZSBxdWVyeSBjaGFuZ2VkIHRvIGVtcHR5IHF1ZXJ5Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZWRpY2F0ZS5xdWVyeSA9IG5ld1ByZWRpY2F0ZS5xdWVyeTtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhgRWRpdGFibGUgcXVlcnkgY2hhbmdlZCB0bzogJHtuZXdQcmVkaWNhdGUucXVlcnkudmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=