@knora/search
Version:
Knora ui module: search
126 lines • 19.4 kB
JavaScript
import * as tslib_1 from "tslib";
import { Component, Inject, Input, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Constants } from '@knora/api';
import { ComparisonOperatorAndValue, Equals, Exists, GreaterThan, GreaterThanEquals, LessThan, LessThanEquals, Like, Match, NotEquals, Property } from '@knora/core';
// https://stackoverflow.com/questions/45661010/dynamic-nested-reactive-form-expressionchangedafterithasbeencheckederror
const resolvedPromise = Promise.resolve(null);
let SpecifyPropertyValueComponent = class SpecifyPropertyValueComponent {
constructor(fb) {
this.fb = fb;
this.Constants = Constants;
// available comparison operators for the property
this.comparisonOperators = [];
}
// setter method for the property chosen by the user
set property(prop) {
this.comparisonOperatorSelected = undefined; // reset to initial state
this._property = prop;
this.resetComparisonOperators(); // reset comparison operators for given property (overwriting any previous selection)
}
// getter method for this._property
get property() {
return this._property;
}
/**
* Resets the comparison operators for this._property.
*/
resetComparisonOperators() {
// depending on object class, set comparison operators and value entry field
if (this._property.isLinkProperty) {
this.propertyValueType = Constants.Resource;
}
else {
this.propertyValueType = this._property.objectType;
}
switch (this.propertyValueType) {
case Constants.TextValue:
this.comparisonOperators = [new Like(), new Match(), new Equals(), new NotEquals(), new Exists()];
break;
case Constants.BooleanValue:
case Constants.Resource:
case Constants.UriValue:
this.comparisonOperators = [new Equals(), new NotEquals(), new Exists()];
break;
case Constants.IntValue:
case Constants.DecimalValue:
case Constants.DateValue:
this.comparisonOperators = [new Equals(), new NotEquals(), new LessThan(), new LessThanEquals(), new GreaterThan(), new GreaterThanEquals(), new Exists()];
break;
case Constants.ListValue:
this.comparisonOperators = [new Equals(), new NotEquals(), new Exists()];
break;
case Constants.GeomValue:
case Constants.FileValue:
case Constants.AudioFileValue:
case Constants.StillImageFileValue:
case Constants.DDDFileValue:
case Constants.MovingImageFileValue:
case Constants.TextFileValue:
case Constants.ColorValue:
case Constants.IntervalValue:
this.comparisonOperators = [new Exists()];
break;
default:
console.log('ERROR: Unsupported value type ' + this._property.objectType);
}
}
ngOnChanges() {
// build a form for comparison operator selection
this.form = this.fb.group({
comparisonOperator: [null, Validators.required]
});
// store comparison operator when selected
this.form.valueChanges.subscribe((data) => {
this.comparisonOperatorSelected = data.comparisonOperator;
});
resolvedPromise.then(() => {
// remove from the parent form group (clean reset)
this.formGroup.removeControl('comparisonOperator');
// add form to the parent form group
this.formGroup.addControl('comparisonOperator', this.form);
});
}
/**
* Gets the specified comparison operator and value for the property.
*
* returns {ComparisonOperatorAndValue} the comparison operator and the specified value
*/
getComparisonOperatorAndValueLiteralForProperty() {
// return value (literal or IRI) from the child component
let value;
// comparison operator 'Exists' does not require a value
if (this.comparisonOperatorSelected.getClassName() !== 'Exists') {
value = this.propertyValueComponent.getValue();
}
// return the comparison operator and the specified value
return new ComparisonOperatorAndValue(this.comparisonOperatorSelected, value);
}
};
SpecifyPropertyValueComponent.ctorParameters = () => [
{ type: FormBuilder, decorators: [{ type: Inject, args: [FormBuilder,] }] }
];
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", FormGroup)
], SpecifyPropertyValueComponent.prototype, "formGroup", void 0);
tslib_1.__decorate([
ViewChild('propertyValue', { static: false }),
tslib_1.__metadata("design:type", Object)
], SpecifyPropertyValueComponent.prototype, "propertyValueComponent", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Property),
tslib_1.__metadata("design:paramtypes", [Property])
], SpecifyPropertyValueComponent.prototype, "property", null);
SpecifyPropertyValueComponent = tslib_1.__decorate([
Component({
selector: 'kui-specify-property-value',
template: "<mat-form-field class=\"search-operator-field small-field\" *ngIf=\"comparisonOperators?.length > 0\">\n <mat-select placeholder=\"Comparison Operator\" [formControl]=\"form.controls['comparisonOperator']\">\n <mat-option *ngFor=\"let compOp of comparisonOperators\" [value]=\"compOp\">{{ compOp.label }}</mat-option>\n </mat-select>\n</mat-form-field>\n\n<!-- select apt component for value specification using a switch case statement-->\n<span\n *ngIf=\"comparisonOperatorSelected !== undefined && comparisonOperatorSelected !== null && comparisonOperatorSelected.getClassName() != 'Exists'\"\n [ngSwitch]=\"propertyValueType\">\n <boolean-value #propertyValue [formGroup]=\"form\" *ngSwitchCase=\"Constants.BooleanValue\"></boolean-value>\n <date-value #propertyValue [formGroup]=\"form\" *ngSwitchCase=\"Constants.DateValue\"></date-value>\n <decimal-value #propertyValue [formGroup]=\"form\" *ngSwitchCase=\"Constants.DecimalValue\"></decimal-value>\n <integer-value #propertyValue [formGroup]=\"form\" *ngSwitchCase=\"Constants.IntValue\"></integer-value>\n <link-value #propertyValue [formGroup]=\"form\" [restrictResourceClass]=\"property.objectType\"\n *ngSwitchCase=\"Constants.Resource\"></link-value>\n <text-value #propertyValue [formGroup]=\"form\" *ngSwitchCase=\"Constants.TextValue\"></text-value>\n <uri-value #propertyValue [formGroup]=\"form\" *ngSwitchCase=\"Constants.UriValue\"></uri-value>\n <list-value #propertyValue [formGroup]=\"form\" [property]=\"property\" *ngSwitchCase=\"Constants.ListValue\">\n </list-value>\n\n <!-- TODO: Resource: handle linking properties with target class restriction: access property member to get objectClass via property() getter method -->\n <span *ngSwitchDefault=\"\">Not supported {{propertyValueType}}</span>\n</span>\n",
styles: [".search-operator-field{margin-right:8px}"]
}),
tslib_1.__param(0, Inject(FormBuilder)),
tslib_1.__metadata("design:paramtypes", [FormBuilder])
], SpecifyPropertyValueComponent);
export { SpecifyPropertyValueComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY2lmeS1wcm9wZXJ0eS12YWx1ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa25vcmEvc2VhcmNoLyIsInNvdXJjZXMiOlsibGliL2V4dGVuZGVkLXNlYXJjaC9zZWxlY3QtcHJvcGVydHkvc3BlY2lmeS1wcm9wZXJ0eS12YWx1ZS9zcGVjaWZ5LXByb3BlcnR5LXZhbHVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBc0IsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQXdCLE1BQU0sYUFBYSxDQUFDO0FBRS9NLHdIQUF3SDtBQUN4SCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBTzlDLElBQWEsNkJBQTZCLEdBQTFDLE1BQWEsNkJBQTZCO0lBbUN0QyxZQUF5QyxFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQWpDeEQsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQXdCdEIsa0RBQWtEO1FBQ2xELHdCQUFtQixHQUE4QixFQUFFLENBQUM7SUFTcEQsQ0FBQztJQTNCRCxvREFBb0Q7SUFFcEQsSUFBSSxRQUFRLENBQUMsSUFBYztRQUN2QixJQUFJLENBQUMsMEJBQTBCLEdBQUcsU0FBUyxDQUFDLENBQUMseUJBQXlCO1FBQ3RFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFD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NkNBQWEsV0FBVztHQW5DL0MsNkJBQTZCLENBcUl6QztTQXJJWSw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnQGtub3JhL2FwaSc7XG5pbXBvcnQgeyBDb21wYXJpc29uT3BlcmF0b3IsIENvbXBhcmlzb25PcGVyYXRvckFuZFZhbHVlLCBFcXVhbHMsIEV4aXN0cywgR3JlYXRlclRoYW4sIEdyZWF0ZXJUaGFuRXF1YWxzLCBMZXNzVGhhbiwgTGVzc1RoYW5FcXVhbHMsIExpa2UsIE1hdGNoLCBOb3RFcXVhbHMsIFByb3BlcnR5LCBQcm9wZXJ0eVZhbHVlLCBWYWx1ZSB9IGZyb20gJ0Brbm9yYS9jb3JlJztcblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDU2NjEwMTAvZHluYW1pYy1uZXN0ZWQtcmVhY3RpdmUtZm9ybS1leHByZXNzaW9uY2hhbmdlZGFmdGVyaXRoYXNiZWVuY2hlY2tlZGVycm9yXG5jb25zdCByZXNvbHZlZFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna3VpLXNwZWNpZnktcHJvcGVydHktdmFsdWUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zcGVjaWZ5LXByb3BlcnR5LXZhbHVlLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zcGVjaWZ5LXByb3BlcnR5LXZhbHVlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3BlY2lmeVByb3BlcnR5VmFsdWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXG4gICAgQ29uc3RhbnRzID0gQ29uc3RhbnRzO1xuXG4gICAgLy8gcGFyZW50IEZvcm1Hcm91cFxuICAgIEBJbnB1dCgpIGZvcm1Hcm91cDogRm9ybUdyb3VwO1xuXG4gICAgQFZpZXdDaGlsZCgncHJvcGVydHlWYWx1ZScsIHsgc3RhdGljOiBmYWxzZSB9KSBwcm9wZXJ0eVZhbHVlQ29tcG9uZW50OiBQcm9wZXJ0eVZhbHVlO1xuXG4gICAgLy8gc2V0dGVyIG1ldGhvZCBmb3IgdGhlIHByb3BlcnR5IGNob3NlbiBieSB0aGUgdXNlclxuICAgIEBJbnB1dCgpXG4gICAgc2V0IHByb3BlcnR5KHByb3A6IFByb3BlcnR5KSB7XG4gICAgICAgIHRoaXMuY29tcGFyaXNvbk9wZXJhdG9yU2VsZWN0ZWQgPSB1bmRlZmluZWQ7IC8vIHJlc2V0IHRvIGluaXRpYWwgc3RhdGVcbiAgICAgICAgdGhpcy5fcHJvcGVydHkgPSBwcm9wO1xuICAgICAgICB0aGlzLnJlc2V0Q29tcGFyaXNvbk9wZXJhdG9ycygpOyAvLyByZXNldCBjb21wYXJpc29uIG9wZXJhdG9ycyBmb3IgZ2l2ZW4gcHJvcGVydHkgKG92ZXJ3cml0aW5nIGFueSBwcmV2aW91cyBzZWxlY3Rpb24pXG4gICAgfVxuXG4gICAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgdGhpcy5fcHJvcGVydHlcbiAgICBnZXQgcHJvcGVydHkoKTogUHJvcGVydHkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcHJvcGVydHk6IFByb3BlcnR5O1xuXG4gICAgZm9ybTogRm9ybUdyb3VwO1xuXG4gICAgLy8gYXZhaWxhYmxlIGNvbXBhcmlzb24gb3BlcmF0b3JzIGZvciB0aGUgcHJvcGVydHlcbiAgICBjb21wYXJpc29uT3BlcmF0b3JzOiBBcnJheTxDb21wYXJpc29uT3BlcmF0b3I+ID0gW107XG5cbiAgICAvLyBjb21wYXJpc29uIG9wZXJhdG9yIHNlbGVjdGVkIGJ5IHRoZSB1c2VyXG4gICAgY29tcGFyaXNvbk9wZXJhdG9yU2VsZWN0ZWQ6IENvbXBhcmlzb25PcGVyYXRvcjtcblxuICAgIC8vIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eVxuICAgIHByb3BlcnR5VmFsdWVUeXBlO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChGb3JtQnVpbGRlcikgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIGZvciB0aGlzLl9wcm9wZXJ0eS5cbiAgICAgKi9cbiAgICByZXNldENvbXBhcmlzb25PcGVyYXRvcnMoKSB7XG5cbiAgICAgICAgLy8gZGVwZW5kaW5nIG9uIG9iamVjdCBjbGFzcywgc2V0IGNvbXBhcmlzb24gb3BlcmF0b3JzIGFuZCB2YWx1ZSBlbnRyeSBmaWVsZFxuICAgICAgICBpZiAodGhpcy5fcHJvcGVydHkuaXNMaW5rUHJvcGVydHkpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZVR5cGUgPSBDb25zdGFudHMuUmVzb3VyY2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3BlcnR5VmFsdWVUeXBlID0gdGhpcy5fcHJvcGVydHkub2JqZWN0VHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wcm9wZXJ0eVZhbHVlVHlwZSkge1xuXG4gICAgICAgICAgICBjYXNlIENvbnN0YW50cy5UZXh0VmFsdWU6XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wYXJpc29uT3BlcmF0b3JzID0gW25ldyBMaWtlKCksIG5ldyBNYXRjaCgpLCBuZXcgRXF1YWxzKCksIG5ldyBOb3RFcXVhbHMoKSwgbmV3IEV4aXN0cygpXTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuQm9vbGVhblZhbHVlOlxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuUmVzb3VyY2U6XG4gICAgICAgICAgICBjYXNlIENvbnN0YW50cy5VcmlWYWx1ZTpcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmlzb25PcGVyYXRvcnMgPSBbbmV3IEVxdWFscygpLCBuZXcgTm90RXF1YWxzKCksIG5ldyBFeGlzdHMoKV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkludFZhbHVlOlxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuRGVjaW1hbFZhbHVlOlxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuRGF0ZVZhbHVlOlxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFyaXNvbk9wZXJhdG9ycyA9IFtuZXcgRXF1YWxzKCksIG5ldyBOb3RFcXVhbHMoKSwgbmV3IExlc3NUaGFuKCksIG5ldyBMZXNzVGhhbkVxdWFscygpLCBuZXcgR3JlYXRlclRoYW4oKSwgbmV3IEdyZWF0ZXJUaGFuRXF1YWxzKCksIG5ldyBFeGlzdHMoKV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkxpc3RWYWx1ZTpcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmlzb25PcGVyYXRvcnMgPSBbbmV3IEVxdWFscygpLCBuZXcgTm90RXF1YWxzKCksIG5ldyBFeGlzdHMoKV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkdlb21WYWx1ZTpcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkZpbGVWYWx1ZTpcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkF1ZGlvRmlsZVZhbHVlOlxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuU3RpbGxJbWFnZUZpbGVWYWx1ZTpcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkREREZpbGVWYWx1ZTpcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLk1vdmluZ0ltYWdlRmlsZVZhbHVlOlxuICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuVGV4dEZpbGVWYWx1ZTpcbiAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkNvbG9yVmFsdWU6XG4gICAgICAgICAgICBjYXNlIENvbnN0YW50cy5JbnRlcnZhbFZhbHVlOlxuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFyaXNvbk9wZXJhdG9ycyA9IFtuZXcgRXhpc3RzKCldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogVW5zdXBwb3J0ZWQgdmFsdWUgdHlwZSAnICsgdGhpcy5fcHJvcGVydHkub2JqZWN0VHlwZSk7XG5cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoKSB7XG5cbiAgICAgICAgLy8gYnVpbGQgYSBmb3JtIGZvciBjb21wYXJpc29uIG9wZXJhdG9yIHNlbGVjdGlvblxuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHN0b3JlIGNvbXBhcmlzb24gb3BlcmF0b3Igd2hlbiBzZWxlY3RlZFxuICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wYXJpc29uT3BlcmF0b3JTZWxlY3RlZCA9IGRhdGEuY29tcGFyaXNvbk9wZXJhdG9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXNvbHZlZFByb21pc2UudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBwYXJlbnQgZm9ybSBncm91cCAoY2xlYW4gcmVzZXQpXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdjb21wYXJpc29uT3BlcmF0b3InKTtcblxuICAgICAgICAgICAgLy8gYWRkIGZvcm0gdG8gdGhlIHBhcmVudCBmb3JtIGdyb3VwXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5hZGRDb250cm9sKCdjb21wYXJpc29uT3BlcmF0b3InLCB0aGlzLmZvcm0pO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNwZWNpZmllZCBjb21wYXJpc29uIG9wZXJhdG9yIGFuZCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogcmV0dXJucyB7Q29tcGFyaXNvbk9wZXJhdG9yQW5kVmFsdWV9IHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAgICovXG4gICAgZ2V0Q29tcGFyaXNvbk9wZXJhdG9yQW5kVmFsdWVMaXRlcmFsRm9yUHJvcGVydHkoKTogQ29tcGFyaXNvbk9wZXJhdG9yQW5kVmFsdWUge1xuICAgICAgICAvLyByZXR1cm4gdmFsdWUgKGxpdGVyYWwgb3IgSVJJKSBmcm9tIHRoZSBjaGlsZCBjb21wb25lbnRcbiAgICAgICAgbGV0IHZhbHVlOiBWYWx1ZTtcblxuICAgICAgICAvLyBjb21wYXJpc29uIG9wZXJhdG9yICdFeGlzdHMnIGRvZXMgbm90IHJlcXVpcmUgYSB2YWx1ZVxuICAgICAgICBpZiAodGhpcy5jb21wYXJpc29uT3BlcmF0b3JTZWxlY3RlZC5nZXRDbGFzc05hbWUoKSAhPT0gJ0V4aXN0cycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wcm9wZXJ0eVZhbHVlQ29tcG9uZW50LmdldFZhbHVlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXR1cm4gdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgYW5kIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wYXJpc29uT3BlcmF0b3JBbmRWYWx1ZSh0aGlzLmNvbXBhcmlzb25PcGVyYXRvclNlbGVjdGVkLCB2YWx1ZSk7XG5cbiAgICB9XG5cbn1cblxuIl19