UNPKG

@knora/search

Version:
115 lines 15 kB
import * as tslib_1 from "tslib"; import { Component, EventEmitter, Inject, Input, Output } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { KnoraApiConfig } from '@knora/api'; import { ExtendedSearchParams, KnoraApiConfigToken, SearchParamsService } from '@knora/core'; var ExpertSearchComponent = /** @class */ (function () { function ExpertSearchComponent(knoraApiConfig, fb, _route, _router, _searchParamsService) { this.knoraApiConfig = knoraApiConfig; this.fb = fb; this._route = _route; this._router = _router; this._searchParamsService = _searchParamsService; /** * @param gravsearch Send the gravsearch query back. */ this.gravsearch = new EventEmitter(); /** * @param {boolean} toggleExtendedSearchForm Trigger toggle for extended search form. */ this.toggleExpertSearchForm = new EventEmitter(); } ExpertSearchComponent.prototype.ngOnInit = function () { this.initForm(); }; /** * @ignore * Initiate the form with predefined Gravsearch query as example. */ ExpertSearchComponent.prototype.initForm = function () { this.expertSearchForm = this.fb.group({ gravquery: [ "\nPREFIX knora-api: <http://api.knora.org/ontology/knora-api/simple/v2#>\nPREFIX incunabula: <" + this.knoraApiConfig.apiUrl + "/ontology/0803/incunabula/simple/v2#>\n\nCONSTRUCT {\n ?book knora-api:isMainResource true .\n ?book incunabula:title ?title .\n\n} WHERE {\n ?book a incunabula:book .\n ?book incunabula:title ?title .\n}\n", Validators.required ] }); }; /** * @ignore * Send the gravsearch query to the result view, either through the route or by emitting the gravsearch as an output. */ ExpertSearchComponent.prototype.submitQuery = function () { var gravsearch = this.generateGravsearch(0); if (this.route) { this._router.navigate([this.route + '/extended/', gravsearch], { relativeTo: this._route }); } else { this.gravsearch.emit(gravsearch); } // toggle expert search form this.toggleExpertSearchForm.emit(true); }; /** * @ignore * Generate the whole gravsearch query matching the query given by the form. */ ExpertSearchComponent.prototype.generateGravsearch = function (offset) { if (offset === void 0) { offset = 0; } var queryTemplate = this.expertSearchForm.controls['gravquery'].value; // offset component of the Gravsearch query var offsetTemplate = "\n OFFSET " + offset + "\n "; // function that generates the same Gravsearch query with the given offset var generateGravsearchWithCustomOffset = function (localOffset) { var offsetCustomTemplate = "\n OFFSET " + localOffset + "\n "; return queryTemplate + offsetCustomTemplate; }; if (offset === 0) { // store the function so another Gravsearch query can be created with an increased offset this._searchParamsService.changeSearchParamsMsg(new ExtendedSearchParams(generateGravsearchWithCustomOffset)); } return queryTemplate + offsetTemplate; }; /** * @ignore * Reset the form to the initial state. */ ExpertSearchComponent.prototype.resetForm = function () { this.initForm(); }; ExpertSearchComponent.ctorParameters = function () { return [ { type: KnoraApiConfig, decorators: [{ type: Inject, args: [KnoraApiConfigToken,] }] }, { type: FormBuilder }, { type: ActivatedRoute }, { type: Router }, { type: SearchParamsService } ]; }; tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], ExpertSearchComponent.prototype, "route", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", Object) ], ExpertSearchComponent.prototype, "gravsearch", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", Object) ], ExpertSearchComponent.prototype, "toggleExpertSearchForm", void 0); ExpertSearchComponent = tslib_1.__decorate([ Component({ selector: 'kui-expert-search', template: "<div class=\"expert-search-container\">\n <!-- The integration in container like the accordeon expansion panel should be handled on app side\n <mat-expansion-panel [expanded]=\"true\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n Expert search\n </mat-panel-title>\n <mat-panel-description> </mat-panel-description>\n </mat-expansion-panel-header>\n -->\n <form [formGroup]=\"expertSearchForm\" class=\"expert-search-form kui-form-content\">\n <mat-form-field class=\"textarea-field large-field\">\n <textarea matInput formControlName=\"gravquery\" matTextareaAutosize matAutosizeMinRows=\"12\" matAutosizeMaxRows=\"24\"\n placeholder=\"Write your gravsearch query\"></textarea>\n </mat-form-field>\n\n <div class=\"kui-form-action\">\n <button class=\"reset\" mat-button type=\"button\" (click)=\"resetForm()\">\n Reset\n </button>\n <span class=\"fill-remaining-space\"></span>\n <button mat-raised-button color=\"primary\" type=\"submit\" [disabled]=\"!expertSearchForm.valid\"\n (click)=\"submitQuery()\">\n Search\n </button>\n </div>\n\n </form>\n\n <!-- </mat-expansion-panel> -->\n</div>\n", styles: [".expert-search-container .expert-search-form{min-width:150px;width:100%;margin:auto}.expert-search-container .expert-search-form .textarea-field{width:100%;display:block;margin-bottom:24px}.expert-search-container .expert-search-form .form-panel{width:100%}.mat-input-element{font-family:\"Courier New\",Courier,monospace}.form-content{margin:24px auto;width:472px}.form-content .large-field{min-width:472px}"] }), tslib_1.__param(0, Inject(KnoraApiConfigToken)), tslib_1.__metadata("design:paramtypes", [KnoraApiConfig, FormBuilder, ActivatedRoute, Router, SearchParamsService]) ], ExpertSearchComponent); return ExpertSearchComponent; }()); export { ExpertSearchComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZXJ0LXNlYXJjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa25vcmEvc2VhcmNoLyIsInNvdXJjZXMiOlsibGliL2V4cGVydC1zZWFyY2gvZXhwZXJ0LXNlYXJjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPN0Y7SUFvQkksK0JBQ3lDLGNBQThCLEVBQzNELEVBQWUsRUFDZixNQUFzQixFQUN0QixPQUFlLEVBQ2Ysb0JBQXlDO1FBSlosbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzNELE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtRQWxCckQ7O1dBRUc7UUFDTyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUdsRDs7V0FFRztRQUNPLDJCQUFzQixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFVM0QsQ0FBQztJQUVMLHdDQUFRLEdBQVI7UUFDSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHdDQUFRLEdBQWhCO1FBQ0ksSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2xDLFNBQVMsRUFBRTtnQkFDUCxtR0FFTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sK05BVS9DO2dCQUNlLFVBQVUsQ0FBQyxRQUFRO2FBQ3RCO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNILDJDQUFXLEdBQVg7UUFDSSxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUMvRjthQUFNO1lBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDcEM7UUFFRCw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssa0RBQWtCLEdBQTFCLFVBQTJCLE1BQWtCO1FBQWxCLHVCQUFBLEVBQUEsVUFBa0I7UUFDekMsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFeEUsMkNBQTJDO1FBQzNDLElBQU0sY0FBYyxHQUFHLHVCQUNiLE1BQU0sZ0JBQ2QsQ0FBQztRQUVILDBFQUEwRTtRQUMxRSxJQUFNLGtDQUFrQyxHQUFHLFVBQ3ZDLFdBQW1CO1lBRW5CLElBQU0sb0JBQW9CLEdBQUcsMkJBQ25CLFdBQVcsb0JBQ25CLENBQUM7WUFFSCxPQUFPLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQztRQUNoRCxDQUFDLENBQUM7UUFFRixJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDZCx5RkFBeUY7WUFDekYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUMzQyxJQUFJLG9CQUFvQixDQUFDLGtDQUFrQyxDQUFDLENBQy9ELENBQUM7U0FDTDtRQUNELE9BQU8sYUFBYSxHQUFHLGNBQWMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gseUNBQVMsR0FBVDtRQUNJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDOztnQkEzRndELGNBQWMsdUJBQWxFLE1BQU0sU0FBQyxtQkFBbUI7Z0JBQ2YsV0FBVztnQkFDUCxjQUFjO2dCQUNiLE1BQU07Z0JBQ08sbUJBQW1COztJQXBCNUM7UUFBUixLQUFLLEVBQUU7O3dEQUFRO0lBS047UUFBVCxNQUFNLEVBQUU7OzZEQUF5QztJQU14QztRQUFULE1BQU0sRUFBRTs7eUVBQXNEO0lBaEJ0RCxxQkFBcUI7UUFMakMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLG1CQUFtQjtZQUM3QixtdENBQTZDOztTQUVoRCxDQUFDO1FBc0JPLG1CQUFBLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2lEQUF5QixjQUFjO1lBQ3ZELFdBQVc7WUFDUCxjQUFjO1lBQ2IsTUFBTTtZQUNPLG1CQUFtQjtPQXpCNUMscUJBQXFCLENBaUhqQztJQUFELDRCQUFDO0NBQUEsQUFqSEQsSUFpSEM7U0FqSFkscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBLbm9yYUFwaUNvbmZpZyB9IGZyb20gJ0Brbm9yYS9hcGknO1xuaW1wb3J0IHsgRXh0ZW5kZWRTZWFyY2hQYXJhbXMsIEtub3JhQXBpQ29uZmlnVG9rZW4sIFNlYXJjaFBhcmFtc1NlcnZpY2UgfSBmcm9tICdAa25vcmEvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna3VpLWV4cGVydC1zZWFyY2gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9leHBlcnQtc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9leHBlcnQtc2VhcmNoLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRXhwZXJ0U2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gcm91dGUgUm91dGUgdG8gbmF2aWdhdGUgYWZ0ZXIgc2VhcmNoLiBUaGlzIHJvdXRlIHBhdGggc2hvdWxkIGNvbnRhaW4gYSBjb21wb25lbnQgZm9yIHNlYXJjaCByZXN1bHRzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHJvdXRlPztcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBncmF2c2VhcmNoIFNlbmQgdGhlIGdyYXZzZWFyY2ggcXVlcnkgYmFjay5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZ3JhdnNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSB0b2dnbGVFeHRlbmRlZFNlYXJjaEZvcm0gVHJpZ2dlciB0b2dnbGUgZm9yIGV4dGVuZGVkIHNlYXJjaCBmb3JtLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0b2dnbGVFeHBlcnRTZWFyY2hGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgZXhwZXJ0U2VhcmNoRm9ybTogRm9ybUdyb3VwO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoS25vcmFBcGlDb25maWdUb2tlbikgcHJpdmF0ZSBrbm9yYUFwaUNvbmZpZzogS25vcmFBcGlDb25maWcsXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIF9yb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIF9zZWFyY2hQYXJhbXNTZXJ2aWNlOiBTZWFyY2hQYXJhbXNTZXJ2aWNlXG4gICAgKSB7IH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmluaXRGb3JtKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqIEluaXRpYXRlIHRoZSBmb3JtIHdpdGggcHJlZGVmaW5lZCBHcmF2c2VhcmNoIHF1ZXJ5IGFzIGV4YW1wbGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbml0Rm9ybSgpIHtcbiAgICAgICAgdGhpcy5leHBlcnRTZWFyY2hGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBncmF2cXVlcnk6IFtcbiAgICAgICAgICAgICAgICBgXG5QUkVGSVgga25vcmEtYXBpOiA8aHR0cDovL2FwaS5rbm9yYS5vcmcvb250b2xvZ3kva25vcmEtYXBpL3NpbXBsZS92MiM+XG5QUkVGSVggaW5jdW5hYnVsYTogPCR7dGhpcy5rbm9yYUFwaUNvbmZpZy5hcGlVcmx9L29udG9sb2d5LzA4MDMvaW5jdW5hYnVsYS9zaW1wbGUvdjIjPlxuXG5DT05TVFJVQ1Qge1xuICAgID9ib29rIGtub3JhLWFwaTppc01haW5SZXNvdXJjZSB0cnVlIC5cbiAgICA/Ym9vayBpbmN1bmFidWxhOnRpdGxlID90aXRsZSAuXG5cbn0gV0hFUkUge1xuICAgID9ib29rIGEgaW5jdW5hYnVsYTpib29rIC5cbiAgICA/Ym9vayBpbmN1bmFidWxhOnRpdGxlID90aXRsZSAuXG59XG5gLFxuICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWRcbiAgICAgICAgICAgIF1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqIFNlbmQgdGhlIGdyYXZzZWFyY2ggcXVlcnkgdG8gdGhlIHJlc3VsdCB2aWV3LCBlaXRoZXIgdGhyb3VnaCB0aGUgcm91dGUgb3IgYnkgZW1pdHRpbmcgdGhlIGdyYXZzZWFyY2ggYXMgYW4gb3V0cHV0LlxuICAgICAqL1xuICAgIHN1Ym1pdFF1ZXJ5KCkge1xuICAgICAgICBjb25zdCBncmF2c2VhcmNoID0gdGhpcy5nZW5lcmF0ZUdyYXZzZWFyY2goMCk7XG5cbiAgICAgICAgaWYgKHRoaXMucm91dGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbdGhpcy5yb3V0ZSArICcvZXh0ZW5kZWQvJywgZ3JhdnNlYXJjaF0sIHsgcmVsYXRpdmVUbzogdGhpcy5fcm91dGUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyYXZzZWFyY2guZW1pdChncmF2c2VhcmNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvZ2dsZSBleHBlcnQgc2VhcmNoIGZvcm1cbiAgICAgICAgdGhpcy50b2dnbGVFeHBlcnRTZWFyY2hGb3JtLmVtaXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqIEdlbmVyYXRlIHRoZSB3aG9sZSBncmF2c2VhcmNoIHF1ZXJ5IG1hdGNoaW5nIHRoZSBxdWVyeSBnaXZlbiBieSB0aGUgZm9ybS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdlbmVyYXRlR3JhdnNlYXJjaChvZmZzZXQ6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBxdWVyeVRlbXBsYXRlID0gdGhpcy5leHBlcnRTZWFyY2hGb3JtLmNvbnRyb2xzWydncmF2cXVlcnknXS52YWx1ZTtcblxuICAgICAgICAvLyBvZmZzZXQgY29tcG9uZW50IG9mIHRoZSBHcmF2c2VhcmNoIHF1ZXJ5XG4gICAgICAgIGNvbnN0IG9mZnNldFRlbXBsYXRlID0gYFxuICAgICAgICAgT0ZGU0VUICR7b2Zmc2V0fVxuICAgICAgICAgYDtcblxuICAgICAgICAvLyBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyB0aGUgc2FtZSBHcmF2c2VhcmNoIHF1ZXJ5IHdpdGggdGhlIGdpdmVuIG9mZnNldFxuICAgICAgICBjb25zdCBnZW5lcmF0ZUdyYXZzZWFyY2hXaXRoQ3VzdG9tT2Zmc2V0ID0gKFxuICAgICAgICAgICAgbG9jYWxPZmZzZXQ6IG51bWJlclxuICAgICAgICApOiBzdHJpbmcgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0Q3VzdG9tVGVtcGxhdGUgPSBgXG4gICAgICAgICAgICAgT0ZGU0VUICR7bG9jYWxPZmZzZXR9XG4gICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5VGVtcGxhdGUgKyBvZmZzZXRDdXN0b21UZW1wbGF0ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAvLyBzdG9yZSB0aGUgZnVuY3Rpb24gc28gYW5vdGhlciBHcmF2c2VhcmNoIHF1ZXJ5IGNhbiBiZSBjcmVhdGVkIHdpdGggYW4gaW5jcmVhc2VkIG9mZnNldFxuICAgICAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zU2VydmljZS5jaGFuZ2VTZWFyY2hQYXJhbXNNc2coXG4gICAgICAgICAgICAgICAgbmV3IEV4dGVuZGVkU2VhcmNoUGFyYW1zKGdlbmVyYXRlR3JhdnNlYXJjaFdpdGhDdXN0b21PZmZzZXQpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVyeVRlbXBsYXRlICsgb2Zmc2V0VGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqIFJlc2V0IHRoZSBmb3JtIHRvIHRoZSBpbml0aWFsIHN0YXRlLlxuICAgICAqL1xuICAgIHJlc2V0Rm9ybSgpIHtcbiAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgIH1cbn1cbiJdfQ==