@knora/viewer
Version:
Knora ui module: viewer
254 lines • 34.9 kB
JavaScript
import * as tslib_1 from "tslib";
import { Component, Inject, Input } from '@angular/core';
import { PageEvent } from '@angular/material';
import { ActivatedRoute, Params, Router } from '@angular/router';
import { ApiResponseError, CountQueryResponse, IResourceClassAndPropertyDefinitions, KnoraApiConnection, ReadResource } from '@knora/api';
import { ExtendedSearchParams, KnoraApiConnectionToken, SearchParamsService } from '@knora/core';
/**
* The search-results gets the search mode and parameters from routes or inputs,
* and returns the corresponding resources that are displayed in a list or a grid.
* The results can be filtered by project.
*/
var SearchResultsComponent = /** @class */ (function () {
function SearchResultsComponent(knoraApiConnection, _route,
// private _searchService: SearchService,
_searchParamsService, _router) {
this.knoraApiConnection = knoraApiConnection;
this._route = _route;
this._searchParamsService = _searchParamsService;
this._router = _router;
/**
* @param {boolean} [complexView] If true it shows 3 ways to display the search results: list or grid or table
*
*/
this.complexView = false;
/**
* @param [viewAs] Show result as list, grid or tabel. Default value is list
*/
this.viewAs = 'list';
this.result = [];
// rerender: boolean = false;
this.badRequest = false;
this.loading = true;
this.pagingLimit = 25;
}
SearchResultsComponent.prototype.ngOnInit = function () {
// page offset is 0
};
SearchResultsComponent.prototype.ngOnChanges = function () {
var _this = this;
this._route.paramMap.subscribe(function (params) {
// get the search mode
if (!_this.searchMode) {
_this.searchMode = params.get('mode');
}
// get the project iri
if (params.get('project') && (_this.projectIri !== decodeURIComponent(params.get('project')))) {
_this.projectIri = decodeURIComponent(params.get('project'));
}
// new search query or old one?
_this.initSearch = (_this.searchQuery !== params.get('q') || _this.searchQuery !== _this.gravSearchQuery);
// init pageIndex and results
if (!_this.pageEvent || _this.initSearch) {
_this.resetPage();
}
// get query params depending on the search mode
if (_this.searchMode === 'fulltext') {
_this.searchQuery = params.get('q');
_this.badRequest = _this.searchQuery.length < 3;
}
else if (_this.searchMode === 'extended') {
_this.gravsearchGenerator = _this._searchParamsService.getSearchParams();
if (!_this.searchQuery) {
_this.generateGravsearchQuery();
}
else {
_this.gravSearchQuery = _this.searchQuery;
}
}
// get results
// this.rerender = true;
_this.getResult();
});
};
SearchResultsComponent.prototype.resetPage = function () {
this.pageEvent = new PageEvent();
this.pageEvent.pageIndex = 0;
this.result = [];
};
/**
* Generates the Gravsearch query for the current offset.
* @ignore
*/
SearchResultsComponent.prototype.generateGravsearchQuery = function () {
var gravsearch = this.gravsearchGenerator.generateGravsearch(this.pageEvent.pageIndex);
if (gravsearch === false) {
// no valid search params (application has been reloaded)
// go to root
this._router.navigate([''], { relativeTo: this._route });
return;
}
else {
this.gravSearchQuery = gravsearch;
}
};
/**
* Get search result from Knora - 2 cases: simple search and extended search
* @ignore
*/
SearchResultsComponent.prototype.getResult = function () {
var _this = this;
this.loading = true;
// reset the error message
this.errorMessage = undefined;
// FULLTEXT SEARCH
if (this.searchMode === 'fulltext') {
// this.rerender = true;
if (this.badRequest) {
this.errorMessage = undefined;
// TODO: fix that!
/*
this.errorMessage.error.toString errorInfo =
'A search value is expected to have at least length of 3 characters.';
*/
this.loading = false;
// this.rerender = false;
}
else {
var searchParams = void 0;
if (this.projectIri !== undefined) {
searchParams = { limitToProject: this.projectIri };
}
if (this.pageEvent.pageIndex === 0) {
// perform count query
this.knoraApiConnection.v2.search.doFulltextSearchCountQuery(this.searchQuery, this.pageEvent.pageIndex, searchParams).subscribe(function (response) {
_this.numberOfAllResults = response.numberOfResults;
}, function (error) {
_this.errorMessage = error;
});
}
// perform full text search
this.knoraApiConnection.v2.search.doFulltextSearch(this.searchQuery, this.pageEvent.pageIndex, searchParams).subscribe(function (response) {
// this.processSearchResults(response);
// console.log('', response);
_this.result = response;
_this.loading = false;
}, function (error) {
_this.errorMessage = error;
console.error(error);
_this.loading = false;
});
}
// EXTENDED SEARCH
}
else if (this.searchMode === 'extended') {
// perform count query
if (this.pageEvent.pageIndex === 0) {
this.knoraApiConnection.v2.search.doExtendedSearchCountQuery(this.gravSearchQuery).subscribe(function (response) {
_this.numberOfAllResults = response.numberOfResults;
}, function (error) {
_this.errorMessage = error;
});
}
this.knoraApiConnection.v2.search.doExtendedSearch(this.gravSearchQuery).subscribe(function (response) {
// this.processSearchResults(response);
_this.result = response;
_this.loading = false;
}, function (error) {
_this.errorMessage = error;
_this.loading = false;
});
}
else {
// TODO: fix this
/*
this.errorMessage = new ApiResponseError();
this.errorMessage.errorInfo = `search mode invalid: ${
this.searchMode
}`;
*/
}
};
/**
* Converts search results from JSON-LD to a [[ReadResourcesSequence]] and requests information about ontology entities.
* This function is passed to `subscribe` as a pointer (instead of redundantly defining the same lambda function).
* @ignore
*
* @param {ReadResourcesSequence} searchResult the answer to a search request.
*/
SearchResultsComponent.prototype.processSearchResults = function (searchResult) {
// console.log(searchResult);
// assign ontology information to a variable so it can be used in the component's template
if (this.ontologyInfo === undefined) {
// init ontology information
// TODO: how do we get ontologyInfo from knora-api-js-lib ReadResource[]
this.ontologyInfo = searchResult[0].entityInfo;
}
else {
// update ontology information
// TODO: fix this
// this.ontologyInfo. .updateOntologyInformation(searchResult[0].entityInfo);
}
// append results to search results
this.result = this.result.concat(searchResult);
// console.log('search results', this.result);
this.loading = false;
// this.rerender = false;
};
/**
* Loads the next page of results.
* The results will be appended to the existing ones.
* @ignore
*
* @param {number} offset
* @returns void
*/
SearchResultsComponent.prototype.loadMore = function (page) {
this.pageEvent = page;
if (this.searchMode === 'extended') {
this.generateGravsearchQuery();
}
this.getResult();
};
SearchResultsComponent.ctorParameters = function () { return [
{ type: KnoraApiConnection, decorators: [{ type: Inject, args: [KnoraApiConnectionToken,] }] },
{ type: ActivatedRoute },
{ type: SearchParamsService },
{ type: Router }
]; };
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Boolean)
], SearchResultsComponent.prototype, "complexView", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String)
], SearchResultsComponent.prototype, "viewAs", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String)
], SearchResultsComponent.prototype, "searchQuery", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String)
], SearchResultsComponent.prototype, "searchMode", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String)
], SearchResultsComponent.prototype, "projectIri", void 0);
SearchResultsComponent = tslib_1.__decorate([
Component({
selector: 'kui-search-results',
template: "<!-- header / toolbar to select view and pagination -->\n<div class=\"search-results-header\">\n <span class=\"switch-view\" *ngIf=\"complexView\">\n <span class=\"switch-view-label\">Show as</span>\n <button mat-button (click)=\"viewAs = 'list'\" [class.active]=\"viewAs === 'list'\">\n <mat-icon>view_list</mat-icon> List\n </button>\n <button mat-button (click)=\"viewAs = 'grid'\" [class.active]=\"viewAs === 'grid'\">\n <mat-icon>view_module</mat-icon> Grid\n </button>\n <!-- TODO: add button to show as table, if possible (filter by same resource class) -->\n </span>\n <span class=\"fill-remaining-space\"></span>\n <span class=\"page-navigation\">\n <mat-paginator [length]=\"numberOfAllResults\" [pageSize]=\"25\" [hidePageSize]=\"true\"\n [pageIndex]=\"pageEvent.pageIndex\" (page)=\"loadMore($event)\">\n </mat-paginator>\n </span>\n</div>\n\n<!-- container with search results -->\n<div class=\"search-results-container\">\n <kui-progress-indicator *ngIf=\"loading\"></kui-progress-indicator>\n\n <div class=\"search-results\" *ngIf=\"!loading && numberOfAllResults > 0 && result\">\n <div [ngSwitch]=\"viewAs\">\n <kui-list-view *ngSwitchCase=\"'list'\" [result]=\"result\"></kui-list-view>\n <kui-grid-view *ngSwitchCase=\"'grid'\" [result]=\"result\"></kui-grid-view>\n <!-- TODO: implement table view -->\n <!-- <kui-table-view *ngSwitchCase=\"'table'\" [result]=\"result\"></kui-table-view> -->\n </div>\n\n </div>\n\n <!-- In case of 0 result -->\n <div class=\"search-results zero\" *ngIf=\"!loading && numberOfAllResults === 0\">\n <kui-message\n [message]=\"{status: 404, statusMsg: 'No results', statusText: 'Sorry, but we couldn\\'t find any results matching your search'}\"\n [medium]=\"true\">\n </kui-message>\n </div>\n\n</div>\n\n<!-- footer with pagination -->\n<div class=\"search-results-footer\" *ngIf=\"numberOfAllResults > 25 && !loading\">\n <span class=\"fill-remaining-space\"></span>\n <span class=\"page-navigation\">\n <mat-paginator [length]=\"numberOfAllResults\" [pageSize]=\"25\" [hidePageSize]=\"true\"\n [pageIndex]=\"pageEvent.pageIndex\" (page)=\"loadMore($event)\">\n </mat-paginator>\n </span>\n</div>\n",
styles: [".search-results-footer,.search-results-header{display:-webkit-box;display:flex;box-sizing:border-box;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;-webkit-box-align:center;align-items:center;white-space:nowrap;padding:0 16px;height:58px;width:100%;z-index:1;background:#fff}.search-results-header{border-bottom:1px solid rgba(0,0,0,.12);position:-webkit-sticky!important;position:sticky!important;top:64px}.search-results-header .switch-view-label{margin-right:16px}button.active{background-color:#e0e0e0}.load-panel{width:100%}.load-panel .center{display:block;line-height:24px;margin:12px auto}.tab-icon{margin-right:8px}"]
}),
tslib_1.__param(0, Inject(KnoraApiConnectionToken)),
tslib_1.__metadata("design:paramtypes", [KnoraApiConnection,
ActivatedRoute,
SearchParamsService,
Router])
], SearchResultsComponent);
return SearchResultsComponent;
}());
export { SearchResultsComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLXJlc3VsdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGtub3JhL3ZpZXdlci8iLCJzb3VyY2VzIjpbImxpYi92aWV3L3NlYXJjaC1yZXN1bHRzL3NlYXJjaC1yZXN1bHRzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLG9DQUFvQyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMxSSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakc7Ozs7R0FJRztBQU1IO0lBK0NJLGdDQUM2QyxrQkFBc0MsRUFDdkUsTUFBc0I7SUFDOUIseUNBQXlDO0lBQ2pDLG9CQUF5QyxFQUN6QyxPQUFlO1FBSmtCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdkUsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFFdEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtRQUN6QyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBbkQzQjs7O1dBR0c7UUFDTSxnQkFBVyxHQUFhLEtBQUssQ0FBQztRQUV2Qzs7V0FFRztRQUNNLFdBQU0sR0FBK0IsTUFBTSxDQUFDO1FBNEJyRCxXQUFNLEdBQW1CLEVBQUUsQ0FBQztRQUc1Qiw2QkFBNkI7UUFDN0IsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRWYsZ0JBQVcsR0FBVyxFQUFFLENBQUM7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MERBQTZDO0lBSzVDO1FBQVIsS0FBSyxFQUFFOzsrREFBc0I7SUFLckI7UUFBUixLQUFLLEVBQUU7OzhEQUFxQjtJQUtwQjtRQUFSLEtBQUssRUFBRTs7OERBQXFCO0lBekJwQixzQkFBc0I7UUFMbEMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLG9CQUFvQjtZQUM5QixnM0VBQThDOztTQUVqRCxDQUFDO1FBaURPLG1CQUFBLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO2lEQUE2QixrQkFBa0I7WUFDL0QsY0FBYztZQUVBLG1CQUFtQjtZQUNoQyxNQUFNO09BcERsQixzQkFBc0IsQ0E0UWxDO0lBQUQsNkJBQUM7Q0FBQSxBQTVRRCxJQTRRQztTQTVRWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VFcnJvciwgQ291bnRRdWVyeVJlc3BvbnNlLCBJUmVzb3VyY2VDbGFzc0FuZFByb3BlcnR5RGVmaW5pdGlvbnMsIEtub3JhQXBpQ29ubmVjdGlvbiwgUmVhZFJlc291cmNlIH0gZnJvbSAnQGtub3JhL2FwaSc7XG5pbXBvcnQgeyBFeHRlbmRlZFNlYXJjaFBhcmFtcywgS25vcmFBcGlDb25uZWN0aW9uVG9rZW4sIFNlYXJjaFBhcmFtc1NlcnZpY2UgfSBmcm9tICdAa25vcmEvY29yZSc7XG5cbi8qKlxuICogVGhlIHNlYXJjaC1yZXN1bHRzIGdldHMgdGhlIHNlYXJjaCBtb2RlIGFuZCBwYXJhbWV0ZXJzIGZyb20gcm91dGVzIG9yIGlucHV0cyxcbiAqIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlcyB0aGF0IGFyZSBkaXNwbGF5ZWQgaW4gYSBsaXN0IG9yIGEgZ3JpZC5cbiAqIFRoZSByZXN1bHRzIGNhbiBiZSBmaWx0ZXJlZCBieSBwcm9qZWN0LlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2t1aS1zZWFyY2gtcmVzdWx0cycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC1yZXN1bHRzLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zZWFyY2gtcmVzdWx0cy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNlYXJjaFJlc3VsdHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbn0gW2NvbXBsZXhWaWV3XSBJZiB0cnVlIGl0IHNob3dzIDMgd2F5cyB0byBkaXNwbGF5IHRoZSBzZWFyY2ggcmVzdWx0czogbGlzdCBvciBncmlkIG9yIHRhYmxlXG4gICAgICpcbiAgICAgKi9cbiAgICBASW5wdXQoKSBjb21wbGV4Vmlldz86IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAgW3ZpZXdBc10gU2hvdyByZXN1bHQgYXMgbGlzdCwgZ3JpZCBvciB0YWJlbC4gRGVmYXVsdCB2YWx1ZSBpcyBsaXN0XG4gICAgICovXG4gICAgQElucHV0KCkgdmlld0FzPzogJ2xpc3QnIHwgJ2dyaWQnIHwgJ3RhYmxlJyA9ICdsaXN0JztcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gW3NlYXJjaFF1ZXJ5XSBTZWFyY2ggcGFyYW1ldGVycy4gSXQgY2FuIGJlIGEgZ3JhdnNlYXJjaCBxdWVyeSAoZXh0ZW5kZWQgbW9kZSkgb3Igc3RyaW5nIChmdWxsdGV4dCBtb2RlKS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBzZWFyY2hRdWVyeT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gW3NlYXJjaE1vZGVdIFNlYXJjaCBtb2RlOiBFeHRlbmRlZCBvciBmdWxsdGV4dC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBzZWFyY2hNb2RlPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBbcHJvamVjdElyaV0gUHJvamVjdCBJcmkuIFRvIGZpbHRlciB0aGUgcmVzdWx0cyBieSBwcm9qZWN0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHByb2plY3RJcmk/OiBzdHJpbmc7XG5cblxuICAgIC8vIE1hdFBhZ2luYXRvciBPdXRwdXRcbiAgICBwYWdlRXZlbnQ6IFBhZ2VFdmVudDtcblxuICAgIC8vIG9mZnNldDogbnVtYmVyID0gMDtcblxuICAgIGluaXRTZWFyY2g6IGJvb2xlYW47XG5cbiAgICAvLyAgICBtYXhPZmZzZXQ6IG51bWJlciA9IDA7XG4gICAgZ3JhdlNlYXJjaFF1ZXJ5OiBzdHJpbmc7XG4gICAgZ3JhdnNlYXJjaEdlbmVyYXRvcjogRXh0ZW5kZWRTZWFyY2hQYXJhbXM7XG4gICAgcmVzdWx0OiBSZWFkUmVzb3VyY2VbXSA9IFtdO1xuICAgIG9udG9sb2d5SW5mbzogSVJlc291cmNlQ2xhc3NBbmRQcm9wZXJ0eURlZmluaXRpb25zO1xuICAgIG51bWJlck9mQWxsUmVzdWx0czogbnVtYmVyO1xuICAgIC8vIHJlcmVuZGVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgYmFkUmVxdWVzdDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGxvYWRpbmcgPSB0cnVlO1xuICAgIGVycm9yTWVzc2FnZTogQXBpUmVzcG9uc2VFcnJvcjtcbiAgICBwYWdpbmdMaW1pdDogbnVtYmVyID0gMjU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChLbm9yYUFwaUNvbm5lY3Rpb25Ub2tlbikgcHJpdmF0ZSBrbm9yYUFwaUNvbm5lY3Rpb246IEtub3JhQXBpQ29ubmVjdGlvbixcbiAgICAgICAgcHJpdmF0ZSBfcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAvLyBwcml2YXRlIF9zZWFyY2hTZXJ2aWNlOiBTZWFyY2hTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9zZWFyY2hQYXJhbXNTZXJ2aWNlOiBTZWFyY2hQYXJhbXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlclxuICAgICkge1xuXG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG5cbiAgICAgICAgLy8gcGFnZSBvZmZzZXQgaXMgMFxuXG5cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5fcm91dGUucGFyYW1NYXAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKHBhcmFtczogUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZWFyY2ggbW9kZVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWFyY2hNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoTW9kZSA9IHBhcmFtcy5nZXQoJ21vZGUnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb2plY3QgaXJpXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5nZXQoJ3Byb2plY3QnKSAmJiAodGhpcy5wcm9qZWN0SXJpICE9PSBkZWNvZGVVUklDb21wb25lbnQocGFyYW1zLmdldCgncHJvamVjdCcpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0SXJpID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5nZXQoJ3Byb2plY3QnKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbmV3IHNlYXJjaCBxdWVyeSBvciBvbGQgb25lP1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNlYXJjaCA9ICh0aGlzLnNlYXJjaFF1ZXJ5ICE9PSBwYXJhbXMuZ2V0KCdxJykgfHwgdGhpcy5zZWFyY2hRdWVyeSAhPT0gdGhpcy5ncmF2U2VhcmNoUXVlcnkpO1xuXG4gICAgICAgICAgICAgICAgLy8gaW5pdCBwYWdlSW5kZXggYW5kIHJlc3VsdHNcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFnZUV2ZW50IHx8IHRoaXMuaW5pdFNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0UGFnZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGdldCBxdWVyeSBwYXJhbXMgZGVwZW5kaW5nIG9uIHRoZSBzZWFyY2ggbW9kZVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaE1vZGUgPT09ICdmdWxsdGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeSA9IHBhcmFtcy5nZXQoJ3EnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWRSZXF1ZXN0ID0gdGhpcy5zZWFyY2hRdWVyeS5sZW5ndGggPCAzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hNb2RlID09PSAnZXh0ZW5kZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JhdnNlYXJjaEdlbmVyYXRvciA9IHRoaXMuX3NlYXJjaFBhcmFtc1NlcnZpY2UuZ2V0U2VhcmNoUGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWFyY2hRdWVyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUdyYXZzZWFyY2hRdWVyeSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmF2U2VhcmNoUXVlcnkgPSB0aGlzLnNlYXJjaFF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZ2V0IHJlc3VsdHNcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnJlcmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlc2V0UGFnZSgpIHtcbiAgICAgICAgdGhpcy5wYWdlRXZlbnQgPSBuZXcgUGFnZUV2ZW50KCk7XG4gICAgICAgIHRoaXMucGFnZUV2ZW50LnBhZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gW107XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdGhlIEdyYXZzZWFyY2ggcXVlcnkgZm9yIHRoZSBjdXJyZW50IG9mZnNldC5cbiAgICAgKiBAaWdub3JlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUdyYXZzZWFyY2hRdWVyeSgpIHtcbiAgICAgICAgY29uc3QgZ3JhdnNlYXJjaDogc3RyaW5nIHwgYm9vbGVhbiA9IHRoaXMuZ3JhdnNlYXJjaEdlbmVyYXRvci5nZW5lcmF0ZUdyYXZzZWFyY2goXG4gICAgICAgICAgICB0aGlzLnBhZ2VFdmVudC5wYWdlSW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGdyYXZzZWFyY2ggPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBubyB2YWxpZCBzZWFyY2ggcGFyYW1zIChhcHBsaWNhdGlvbiBoYXMgYmVlbiByZWxvYWRlZClcbiAgICAgICAgICAgIC8vIGdvIHRvIHJvb3RcbiAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbJyddLCB7IHJlbGF0aXZlVG86IHRoaXMuX3JvdXRlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmF2U2VhcmNoUXVlcnkgPSA8c3RyaW5nPmdyYXZzZWFyY2g7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2VhcmNoIHJlc3VsdCBmcm9tIEtub3JhIC0gMiBjYXNlczogc2ltcGxlIHNlYXJjaCBhbmQgZXh0ZW5kZWQgc2VhcmNoXG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UmVzdWx0KCkge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIC8vIHJlc2V0IHRoZSBlcnJvciBtZXNzYWdlXG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIEZVTExURVhUIFNFQVJDSFxuICAgICAgICBpZiAodGhpcy5zZWFyY2hNb2RlID09PSAnZnVsbHRleHQnKSB7XG4gICAgICAgICAgICAvLyB0aGlzLnJlcmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhZFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaXggdGhhdCFcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlLmVycm9yLnRvU3RyaW5nIGVycm9ySW5mbyA9XG4gICAgICAgICAgICAgICAgICAgICdBIHNlYXJjaCB2YWx1ZSBpcyBleHBlY3RlZCB0byBoYXZlIGF0IGxlYXN0IGxlbmd0aCBvZiAzIGNoYXJhY3RlcnMuJztcbiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnJlcmVuZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgbGV0IHNlYXJjaFBhcmFtcztcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RJcmkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hQYXJhbXMgPSB7IGxpbWl0VG9Qcm9qZWN0OiB0aGlzLnByb2plY3RJcmkgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYWdlRXZlbnQucGFnZUluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gY291bnQgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5rbm9yYUFwaUNvbm5lY3Rpb24udjIuc2VhcmNoLmRvRnVsbHRleHRTZWFyY2hDb3VudFF1ZXJ5KHRoaXMuc2VhcmNoUXVlcnksIHRoaXMucGFnZUV2ZW50LnBhZ2VJbmRleCwgc2VhcmNoUGFyYW1zKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2U6IENvdW50UXVlcnlSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyT2ZBbGxSZXN1bHRzID0gcmVzcG9uc2UubnVtYmVyT2ZSZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcjogQXBpUmVzcG9uc2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gcGVyZm9ybSBmdWxsIHRleHQgc2VhcmNoXG4gICAgICAgICAgICAgICAgdGhpcy5rbm9yYUFwaUNvbm5lY3Rpb24udjIuc2VhcmNoLmRvRnVsbHRleHRTZWFyY2godGhpcy5zZWFyY2hRdWVyeSwgdGhpcy5wYWdlRXZlbnQucGFnZUluZGV4LCBzZWFyY2hQYXJhbXMpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlOiBSZWFkUmVzb3VyY2VbXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5wcm9jZXNzU2VhcmNoUmVzdWx0cyhyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnJywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IEFwaVJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRVhURU5ERUQgU0VBUkNIXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hNb2RlID09PSAnZXh0ZW5kZWQnKSB7XG4gICAgICAgICAgICAvLyBwZXJmb3JtIGNvdW50IHF1ZXJ5XG4gICAgICAgICAgICBpZiAodGhpcy5wYWdlRXZlbnQucGFnZUluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5rbm9yYUFwaUNvbm5lY3Rpb24udjIuc2VhcmNoLmRvRXh0ZW5kZWRTZWFyY2hDb3VudFF1ZXJ5KHRoaXMuZ3JhdlNlYXJjaFF1ZXJ5KS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZTogQ291bnRRdWVyeVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlck9mQWxsUmVzdWx0cyA9IHJlc3BvbnNlLm51bWJlck9mUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yOiBBcGlSZXNwb25zZUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMua25vcmFBcGlDb25uZWN0aW9uLnYyLnNlYXJjaC5kb0V4dGVuZGVkU2VhcmNoKHRoaXMuZ3JhdlNlYXJjaFF1ZXJ5KS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKHJlc3BvbnNlOiBSZWFkUmVzb3VyY2VbXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnByb2Nlc3NTZWFyY2hSZXN1bHRzKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3I6IEFwaVJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGZpeCB0aGlzXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBuZXcgQXBpUmVzcG9uc2VFcnJvcigpO1xuICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UuZXJyb3JJbmZvID0gYHNlYXJjaCBtb2RlIGludmFsaWQ6ICR7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hNb2RlXG4gICAgICAgICAgICAgICAgfWA7XG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHNlYXJjaCByZXN1bHRzIGZyb20gSlNPTi1MRCB0byBhIFtbUmVhZFJlc291cmNlc1NlcXVlbmNlXV0gYW5kIHJlcXVlc3RzIGluZm9ybWF0aW9uIGFib3V0IG9udG9sb2d5IGVudGl0aWVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIGBzdWJzY3JpYmVgIGFzIGEgcG9pbnRlciAoaW5zdGVhZCBvZiByZWR1bmRhbnRseSBkZWZpbmluZyB0aGUgc2FtZSBsYW1iZGEgZnVuY3Rpb24pLlxuICAgICAqIEBpZ25vcmVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVhZFJlc291cmNlc1NlcXVlbmNlfSBzZWFyY2hSZXN1bHQgdGhlIGFuc3dlciB0byBhIHNlYXJjaCByZXF1ZXN0LlxuICAgICAqL1xuICAgIHByaXZhdGUgcHJvY2Vzc1NlYXJjaFJlc3VsdHMoc2VhcmNoUmVzdWx0OiBSZWFkUmVzb3VyY2VbXSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhzZWFyY2hSZXN1bHQpO1xuICAgICAgICAvLyBhc3NpZ24gb250b2xvZ3kgaW5mb3JtYXRpb24gdG8gYSB2YXJpYWJsZSBzbyBpdCBjYW4gYmUgdXNlZCBpbiB0aGUgY29tcG9uZW50J3MgdGVtcGxhdGVcbiAgICAgICAgaWYgKHRoaXMub250b2xvZ3lJbmZvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGluaXQgb250b2xvZ3kgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIC8vIFRPRE86IGhvdyBkbyB3ZSBnZXQgb250b2xvZ3lJbmZvIGZyb20ga25vcmEtYXBpLWpzLWxpYiBSZWFkUmVzb3VyY2VbXVxuICAgICAgICAgICAgdGhpcy5vbnRvbG9neUluZm8gPSBzZWFyY2hSZXN1bHRbMF0uZW50aXR5SW5mbztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBvbnRvbG9neSBpbmZvcm1hdGlvblxuICAgICAgICAgICAgLy8gVE9ETzogZml4IHRoaXNcbiAgICAgICAgICAgIC8vIHRoaXMub250b2xvZ3lJbmZvLiAudXBkYXRlT250b2xvZ3lJbmZvcm1hdGlvbihzZWFyY2hSZXN1bHRbMF0uZW50aXR5SW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXBwZW5kIHJlc3VsdHMgdG8gc2VhcmNoIHJlc3VsdHNcbiAgICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLnJlc3VsdC5jb25jYXQoc2VhcmNoUmVzdWx0KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3NlYXJjaCByZXN1bHRzJywgdGhpcy5yZXN1bHQpO1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAvLyB0aGlzLnJlcmVuZGVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiByZXN1bHRzLlxuICAgICAqIFRoZSByZXN1bHRzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICAgICAqIEByZXR1cm5zIHZvaWRcbiAgICAgKi9cbiAgICBsb2FkTW9yZShwYWdlOiBQYWdlRXZlbnQpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLnBhZ2VFdmVudCA9IHBhZ2U7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoTW9kZSA9PT0gJ2V4dGVuZGVkJykge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUdyYXZzZWFyY2hRdWVyeSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nZXRSZXN1bHQoKTtcbiAgICB9XG59XG4iXX0=