@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
219 lines • 31.2 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject, forkJoin, of, Subject, timer } from 'rxjs';
import { LoadingEmitter } from '../../utility/loading-emitter';
import { catchError, map, mergeMap, scan, tap } from 'rxjs/operators';
import { HttpParams } from '@angular/common/http';
import { PaginationParams } from '../../utility/pagination/pagination-params';
import * as i0 from "@angular/core";
import * as i1 from "../../resources/engine-endpoint/ldap-group-resource.service";
import * as i2 from "../../logger/services/logger.service";
import * as i3 from "../../snack-bar/services/snack-bar.service";
import * as i4 from "@ngx-translate/core";
export class LdapGroupListService {
_resources;
_log;
_snackbar;
_translate;
/**
* Ldap Group Value array stream, that represents ldap group loading from backend.
*/
_ldapGroups$;
/**
* Emit ldap group loading status from backend.
*/
_loading$;
/**
* Number stream of next page ldap group list, that to be requested from backend.
*/
_nextPage$;
/**
* Signals the end of loaded ldap groups.
*/
_endOfData;
/**
* Necessary for pagination parameters in ldap group assign loading from backend.
*/
_pagination;
/**
* Signals if response is empty or no.
*/
_clear;
/**
* The search content that should be applied to the request
*/
_searchQuery;
/**
* Roles that should be applied to the request
*/
rolesQuery;
/**
* negative Roles that should be applied to the request
*/
negativeRolesQuery;
_updateProgress$;
_ldapGroupsReload$;
/**
* Inject services.
* Initialize declared attributes.
*
* Loading and mapped stream of ldap groups.
* @param _resources Loading ldap groups from backend.
* @param _log Logging action status.
* @param _snackbar Display info about loading from backend for ldap group.
* @param _translate Translate messages for ldap group.
*/
constructor(_resources, _log, _snackbar, _translate) {
this._resources = _resources;
this._log = _log;
this._snackbar = _snackbar;
this._translate = _translate;
this._loading$ = new LoadingEmitter();
this._updateProgress$ = new LoadingEmitter();
this._ldapGroupsReload$ = new Subject();
this._nextPage$ = new BehaviorSubject(null);
this._endOfData = false;
this._pagination = {
size: 20,
totalElements: undefined,
totalPages: undefined,
number: -1
};
this._searchQuery = '';
this._clear = false;
this.negativeRolesQuery = new Array();
this.rolesQuery = new Array();
const ldapGroupsMap = this._nextPage$.pipe(mergeMap(p => this.loadPage(p)), tap(() => {
if (!this._clear) {
this._ldapGroupsReload$.next();
}
}), scan((acc, value) => {
const result = this._clear ? {} : { ...acc, ...value };
this._clear = false;
return result;
}, {}));
this._ldapGroups$ = ldapGroupsMap.pipe(map(v => Object.values(v)));
}
ngOnDestroy() {
this._loading$.complete();
this._updateProgress$.complete();
this._ldapGroupsReload$.complete();
this._nextPage$.complete();
}
get loading() {
return this._loading$.isActive;
}
get loading$() {
return this._loading$.asObservable();
}
get ldapGroupsReload$() {
return this._ldapGroupsReload$.asObservable();
}
get ldapGroups$() {
return this._ldapGroups$;
}
get updating$() {
return this._updateProgress$.asObservable();
}
get totalLdapGroups() {
return this._pagination.totalElements ? this._pagination.totalElements : 0;
}
/**
* Get all ldapGroups from backend and mapped to [ldapGroupValue]{@link ldapGroupValue} interface with catching errors.
* @param page Page number that is requested. / Next page ldapGroups list.
*/
loadPage(page) {
if (page === null || page === undefined || this._clear) {
return of({});
}
let params = new HttpParams();
params = this.addPageParams(params, page);
this._loading$.on();
return this._resources.searchLdapGroups({ fulltext: this._searchQuery }).pipe(catchError(err => {
this._log.error('Loading ldap groups has failed on page ' + this._pagination.number, err);
return of({ ldapGroupResponseBodies: [], pagination: { ...this._pagination, number: this._pagination.number - 1 } });
}), tap(ldapGroupResponseBody => this._endOfData = !Array.isArray(ldapGroupResponseBody.ldapGroupResponseBodies) ||
(Array.isArray(ldapGroupResponseBody.ldapGroupResponseBodies)
&& ldapGroupResponseBody.ldapGroupResponseBodies.length === 0)), map(ldapGroupResponseBody => (Array.isArray(ldapGroupResponseBody.ldapGroupResponseBodies) ?
ldapGroupResponseBody : { ...ldapGroupResponseBody, ldapGroupResponseBodies: [] })), map(ldapGroupResponseBody => {
const result = {};
ldapGroupResponseBody.ldapGroupResponseBodies.forEach(ldapGroup => {
const item = ldapGroup;
item.roles = new Set(ldapGroup.processRoles.map(pr => pr.stringId));
item.processRoles = undefined;
item.selected = false;
item.toggle = function () {
this.selected = !this.selected;
};
result[ldapGroup.dn] = item;
});
return result;
}), tap(_ => this._loading$.off()));
}
/**
* Set value to nextPage stream as next page ldapGroups list.
* @param lastRendered Last rendered ldapGroup index.
* @param totalRendered Total loaded size ldapGroups.
*/
nextPage(lastRendered, totalRendered) {
if (this.loading || this._endOfData) {
return;
}
if (lastRendered === totalRendered) {
this._nextPage$.next(this._pagination.number + 1);
}
}
/**
* Reload page with ldapGroups.
*/
reload(newSearchQuery = '') {
if (!this._ldapGroups$ || !this._pagination) {
return;
}
this._clear = true;
this._endOfData = false;
this._pagination.number = -1;
this._searchQuery = newSearchQuery;
this.nextPage(0, 0);
timer(100).subscribe(_ => {
this._pagination.number = -1;
this.nextPage(0, 0);
});
}
updateRoles(selectedLdapGroups, selectedRoles = []) {
if (!selectedLdapGroups || selectedLdapGroups.length === 0) {
return of([]);
}
this._updateProgress$.on();
return forkJoin(selectedLdapGroups.map(ldapGroup => this._resources.assignRolesToLdapGroup({ groupDn: ldapGroup.dn, roleIds: selectedRoles }))).pipe(tap(messages => {
messages.forEach((message, idx) => {
if (message.error) {
this._log.error(message.error, message);
this._snackbar.openErrorSnackBar(message.error);
}
else {
this._log.info(message.success);
selectedLdapGroups[idx].roles = new Set(selectedRoles);
this._snackbar.openSuccessSnackBar(this._translate.instant('tasks.snackbar.rolesSuccessAssign'));
}
});
this._updateProgress$.off();
}));
}
/**
* Returns HttpParams with page params addition.
* @param params Existing HttpParams.
* @param page Page number that is requested. / Next page ldapGroups list.
*/
addPageParams(params, page) {
params = params.set(PaginationParams.PAGE_SIZE, `${this._pagination.size}`);
page = page !== null ? page : this._pagination.number;
params = params.set(PaginationParams.PAGE_NUMBER, `${page}`);
return params;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LdapGroupListService, deps: [{ token: i1.LdapGroupResourceService }, { token: i2.LoggerService }, { token: i3.SnackBarService }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LdapGroupListService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LdapGroupListService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.LdapGroupResourceService }, { type: i2.LoggerService }, { type: i3.SnackBarService }, { type: i4.TranslateService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGRhcC1ncm91cC1saXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL2dyb3Vwcy9zZXJ2aWNlcy9sZGFwLWdyb3VwLWxpc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBQyxlQUFlLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUs3RCxPQUFPLEVBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7O0FBYTVFLE1BQU0sT0FBTyxvQkFBb0I7SUFvRFA7SUFDQTtJQUNBO0lBQ0E7SUFyRHRCOztPQUVHO0lBQ2dCLFlBQVksQ0FBdUM7SUFDdEU7O09BRUc7SUFDTyxTQUFTLENBQWlCO0lBQ3BDOztPQUVHO0lBQ08sVUFBVSxDQUEwQjtJQUM5Qzs7T0FFRztJQUNPLFVBQVUsQ0FBVTtJQUM5Qjs7T0FFRztJQUNPLFdBQVcsQ0FBYTtJQUNsQzs7T0FFRztJQUNPLE1BQU0sQ0FBVTtJQUMxQjs7T0FFRztJQUNPLFlBQVksQ0FBUztJQUMvQjs7T0FFRztJQUNJLFVBQVUsQ0FBZ0I7SUFDakM7O09BRUc7SUFDSSxrQkFBa0IsQ0FBZ0I7SUFDL0IsZ0JBQWdCLENBQWlCO0lBQ2pDLGtCQUFrQixDQUFnQjtJQUc1Qzs7Ozs7Ozs7O09BU0c7SUFD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LGFBQWEsQ0FBQyxNQUFrQixFQUFFLElBQWE7UUFDckQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3RELE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQzt3R0FsT1Esb0JBQW9COzRHQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0xvYWRpbmdFbWl0dGVyfSBmcm9tICcuLi8uLi91dGlsaXR5L2xvYWRpbmctZW1pdHRlcic7XG5pbXBvcnQge1BhZ2luYXRpb259IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnaW5hdGlvbic7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1NuYWNrQmFyU2VydmljZX0gZnJvbSAnLi4vLi4vc25hY2stYmFyL3NlcnZpY2VzL3NuYWNrLWJhci5zZXJ2aWNlJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIG1hcCwgbWVyZ2VNYXAsIHNjYW4sIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1BhZ2luYXRpb25QYXJhbXN9IGZyb20gJy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXBhcmFtcyc7XG5pbXBvcnQge0xkYXBHcm91cCwgTGRhcEdyb3VwUmVzcG9uc2VCb2R5fSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2xkYXBHcm91cFJlc3BvbnNlQm9keSc7XG5pbXBvcnQge0xkYXBHcm91cFJlc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2VuZ2luZS1lbmRwb2ludC9sZGFwLWdyb3VwLXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtNZXNzYWdlUmVzb3VyY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGRhcEdyb3VwTGlzdEl0ZW0gZXh0ZW5kcyBMZGFwR3JvdXAge1xuICAgIHNlbGVjdGVkOiBib29sZWFuO1xuICAgIHJvbGVzOiBTZXQ8c3RyaW5nPjtcblxuICAgIHRvZ2dsZSgpOiB2b2lkO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTGRhcEdyb3VwTGlzdFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAgICogTGRhcCBHcm91cCBWYWx1ZSBhcnJheSBzdHJlYW0sIHRoYXQgcmVwcmVzZW50cyBsZGFwIGdyb3VwIGxvYWRpbmcgZnJvbSBiYWNrZW5kLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbGRhcEdyb3VwcyQ6IE9ic2VydmFibGU8QXJyYXk8TGRhcEdyb3VwTGlzdEl0ZW0+PjtcbiAgICAvKipcbiAgICAgKiBFbWl0IGxkYXAgZ3JvdXAgbG9hZGluZyBzdGF0dXMgZnJvbSBiYWNrZW5kLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbG9hZGluZyQ6IExvYWRpbmdFbWl0dGVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBzdHJlYW0gb2YgbmV4dCBwYWdlIGxkYXAgZ3JvdXAgbGlzdCwgdGhhdCB0byBiZSByZXF1ZXN0ZWQgZnJvbSBiYWNrZW5kLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbmV4dFBhZ2UkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBTaWduYWxzIHRoZSBlbmQgb2YgbG9hZGVkIGxkYXAgZ3JvdXBzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZW5kT2ZEYXRhOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIE5lY2Vzc2FyeSBmb3IgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzIGluIGxkYXAgZ3JvdXAgYXNzaWduIGxvYWRpbmcgZnJvbSBiYWNrZW5kLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGFnaW5hdGlvbjogUGFnaW5hdGlvbjtcbiAgICAvKipcbiAgICAgKiBTaWduYWxzIGlmIHJlc3BvbnNlIGlzIGVtcHR5IG9yIG5vLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY2xlYXI6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBjb250ZW50IHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3NlYXJjaFF1ZXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUm9sZXMgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgcmVxdWVzdFxuICAgICAqL1xuICAgIHB1YmxpYyByb2xlc1F1ZXJ5OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIG5lZ2F0aXZlIFJvbGVzIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgbmVnYXRpdmVSb2xlc1F1ZXJ5OiBBcnJheTxzdHJpbmc+O1xuICAgIHByb3RlY3RlZCBfdXBkYXRlUHJvZ3Jlc3MkOiBMb2FkaW5nRW1pdHRlcjtcbiAgICBwcm90ZWN0ZWQgX2xkYXBHcm91cHNSZWxvYWQkOiBTdWJqZWN0PHZvaWQ+O1xuXG5cbiAgICAvKipcbiAgICAgKiBJbmplY3Qgc2VydmljZXMuXG4gICAgICogSW5pdGlhbGl6ZSBkZWNsYXJlZCBhdHRyaWJ1dGVzLlxuICAgICAqXG4gICAgICogTG9hZGluZyBhbmQgbWFwcGVkIHN0cmVhbSBvZiBsZGFwIGdyb3Vwcy5cbiAgICAgKiBAcGFyYW0gX3Jlc291cmNlcyBMb2FkaW5nIGxkYXAgZ3JvdXBzIGZyb20gYmFja2VuZC5cbiAgICAgKiBAcGFyYW0gX2xvZyBMb2dnaW5nIGFjdGlvbiBzdGF0dXMuXG4gICAgICogQHBhcmFtIF9zbmFja2JhciBEaXNwbGF5IGluZm8gYWJvdXQgbG9hZGluZyBmcm9tIGJhY2tlbmQgZm9yIGxkYXAgZ3JvdXAuXG4gICAgICogQHBhcmFtIF90cmFuc2xhdGUgVHJhbnNsYXRlIG1lc3NhZ2VzIGZvciBsZGFwIGdyb3VwLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfcmVzb3VyY2VzOiBMZGFwR3JvdXBSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zbmFja2JhcjogU25hY2tCYXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuX2xvYWRpbmckID0gbmV3IExvYWRpbmdFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVByb2dyZXNzJCA9IG5ldyBMb2FkaW5nRW1pdHRlcigpO1xuICAgICAgICB0aGlzLl9sZGFwR3JvdXBzUmVsb2FkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICAgIHRoaXMuX25leHRQYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihudWxsKTtcbiAgICAgICAgdGhpcy5fZW5kT2ZEYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb24gPSB7XG4gICAgICAgICAgICBzaXplOiAyMCxcbiAgICAgICAgICAgIHRvdGFsRWxlbWVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRvdGFsUGFnZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bWJlcjogLTFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fc2VhcmNoUXVlcnkgPSAnJztcbiAgICAgICAgdGhpcy5fY2xlYXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5uZWdhdGl2ZVJvbGVzUXVlcnkgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgICAgICB0aGlzLnJvbGVzUXVlcnkgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgICAgIGNvbnN0IGxkYXBHcm91cHNNYXAgPSB0aGlzLl9uZXh0UGFnZSQucGlwZShcbiAgICAgICAgICAgIG1lcmdlTWFwKHAgPT4gdGhpcy5sb2FkUGFnZShwKSksXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2xlYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGRhcEdyb3Vwc1JlbG9hZCQubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2NhbigoYWNjLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NsZWFyID8ge30gOiB7Li4uYWNjLCAuLi52YWx1ZX07XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xlYXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSwge30pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2xkYXBHcm91cHMkID0gbGRhcEdyb3Vwc01hcC5waXBlKFxuICAgICAgICAgICAgbWFwKHYgPT4gT2JqZWN0LnZhbHVlcyh2KSBhcyBBcnJheTxMZGFwR3JvdXBMaXN0SXRlbT4pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9sb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl91cGRhdGVQcm9ncmVzcyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fbGRhcEdyb3Vwc1JlbG9hZCQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fbmV4dFBhZ2UkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZyQuaXNBY3RpdmU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2FkaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGRhcEdyb3Vwc1JlbG9hZCQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZGFwR3JvdXBzUmVsb2FkJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxkYXBHcm91cHMkKCk6IE9ic2VydmFibGU8QXJyYXk8TGRhcEdyb3VwTGlzdEl0ZW0+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZGFwR3JvdXBzJDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHVwZGF0aW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZVByb2dyZXNzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvdGFsTGRhcEdyb3VwcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnaW5hdGlvbi50b3RhbEVsZW1lbnRzID8gdGhpcy5fcGFnaW5hdGlvbi50b3RhbEVsZW1lbnRzIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGxkYXBHcm91cHMgZnJvbSBiYWNrZW5kIGFuZCBtYXBwZWQgdG8gW2xkYXBHcm91cFZhbHVlXXtAbGluayBsZGFwR3JvdXBWYWx1ZX0gaW50ZXJmYWNlIHdpdGggY2F0Y2hpbmcgZXJyb3JzLlxuICAgICAqIEBwYXJhbSBwYWdlIFBhZ2UgbnVtYmVyIHRoYXQgaXMgcmVxdWVzdGVkLiAvIE5leHQgcGFnZSBsZGFwR3JvdXBzIGxpc3QuXG4gICAgICovXG4gICAgcHVibGljIGxvYWRQYWdlKHBhZ2U6IG51bWJlcik6IE9ic2VydmFibGU8eyBbazogc3RyaW5nXTogTGRhcEdyb3VwTGlzdEl0ZW0gfT4ge1xuICAgICAgICBpZiAocGFnZSA9PT0gbnVsbCB8fCBwYWdlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fY2xlYXIpIHtcbiAgICAgICAgICAgIHJldHVybiBvZih7fSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgICAgIHBhcmFtcyA9IHRoaXMuYWRkUGFnZVBhcmFtcyhwYXJhbXMsIHBhZ2UpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nJC5vbigpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2VzLnNlYXJjaExkYXBHcm91cHMoe2Z1bGx0ZXh0OiB0aGlzLl9zZWFyY2hRdWVyeX0pLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKCdMb2FkaW5nIGxkYXAgZ3JvdXBzIGhhcyBmYWlsZWQgb24gcGFnZSAnICsgdGhpcy5fcGFnaW5hdGlvbi5udW1iZXIsIGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtsZGFwR3JvdXBSZXNwb25zZUJvZGllczogW10sIHBhZ2luYXRpb246IHsuLi50aGlzLl9wYWdpbmF0aW9uLCBudW1iZXI6IHRoaXMuX3BhZ2luYXRpb24ubnVtYmVyIC0gMX19KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKGxkYXBHcm91cFJlc3BvbnNlQm9keSA9PiB0aGlzLl9lbmRPZkRhdGEgPSAhQXJyYXkuaXNBcnJheShsZGFwR3JvdXBSZXNwb25zZUJvZHkubGRhcEdyb3VwUmVzcG9uc2VCb2RpZXMpIHx8XG4gICAgICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkobGRhcEdyb3VwUmVzcG9uc2VCb2R5LmxkYXBHcm91cFJlc3BvbnNlQm9kaWVzKVxuICAgICAgICAgICAgICAgICAgICAmJiBsZGFwR3JvdXBSZXNwb25zZUJvZHkubGRhcEdyb3VwUmVzcG9uc2VCb2RpZXMubGVuZ3RoID09PSAwKSksXG4gICAgICAgICAgICBtYXAobGRhcEdyb3VwUmVzcG9uc2VCb2R5ID0+IChBcnJheS5pc0FycmF5KGxkYXBHcm91cFJlc3BvbnNlQm9keS5sZGFwR3JvdXBSZXNwb25zZUJvZGllcykgP1xuICAgICAgICAgICAgICAgIGxkYXBHcm91cFJlc3BvbnNlQm9keSA6IHsuLi5sZGFwR3JvdXBSZXNwb25zZUJvZHksIGxkYXBHcm91cFJlc3BvbnNlQm9kaWVzOiBbXX0pKSxcbiAgICAgICAgICAgIG1hcCggbGRhcEdyb3VwUmVzcG9uc2VCb2R5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgICAgICAgICBsZGFwR3JvdXBSZXNwb25zZUJvZHkubGRhcEdyb3VwUmVzcG9uc2VCb2RpZXMuZm9yRWFjaCggbGRhcEdyb3VwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGxkYXBHcm91cCBhcyBMZGFwR3JvdXBMaXN0SXRlbTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5yb2xlcyA9IG5ldyBTZXQ8c3RyaW5nPihsZGFwR3JvdXAucHJvY2Vzc1JvbGVzLm1hcChwciA9PiBwci5zdHJpbmdJZCkpO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnByb2Nlc3NSb2xlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnRvZ2dsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9ICF0aGlzLnNlbGVjdGVkO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbbGRhcEdyb3VwLmRuXSA9IGl0ZW07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKF8gPT4gdGhpcy5fbG9hZGluZyQub2ZmKCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHZhbHVlIHRvIG5leHRQYWdlIHN0cmVhbSBhcyBuZXh0IHBhZ2UgbGRhcEdyb3VwcyBsaXN0LlxuICAgICAqIEBwYXJhbSBsYXN0UmVuZGVyZWQgTGFzdCByZW5kZXJlZCBsZGFwR3JvdXAgaW5kZXguXG4gICAgICogQHBhcmFtIHRvdGFsUmVuZGVyZWQgVG90YWwgbG9hZGVkIHNpemUgbGRhcEdyb3Vwcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2UobGFzdFJlbmRlcmVkOiBudW1iZXIsIHRvdGFsUmVuZGVyZWQ6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5sb2FkaW5nIHx8IHRoaXMuX2VuZE9mRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhc3RSZW5kZXJlZCA9PT0gdG90YWxSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dFBhZ2UkLm5leHQodGhpcy5fcGFnaW5hdGlvbi5udW1iZXIgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbG9hZCBwYWdlIHdpdGggbGRhcEdyb3Vwcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsb2FkKG5ld1NlYXJjaFF1ZXJ5ID0gJycpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sZGFwR3JvdXBzJCB8fCAhdGhpcy5fcGFnaW5hdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsZWFyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZW5kT2ZEYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb24ubnVtYmVyID0gLTE7XG4gICAgICAgIHRoaXMuX3NlYXJjaFF1ZXJ5ID0gbmV3U2VhcmNoUXVlcnk7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoMCwgMCk7XG4gICAgICAgIHRpbWVyKDEwMCkuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgICAgICAgdGhpcy5fcGFnaW5hdGlvbi5udW1iZXIgPSAtMTtcbiAgICAgICAgICAgIHRoaXMubmV4dFBhZ2UoMCwgMCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVSb2xlcyhzZWxlY3RlZExkYXBHcm91cHM6IEFycmF5PExkYXBHcm91cExpc3RJdGVtPiwgc2VsZWN0ZWRSb2xlczogQXJyYXk8c3RyaW5nPiA9IFtdKTpcbiAgICBPYnNlcnZhYmxlPEFycmF5PE1lc3NhZ2VSZXNvdXJjZT4+IHtcbiAgICAgICAgaWYgKCFzZWxlY3RlZExkYXBHcm91cHMgfHwgc2VsZWN0ZWRMZGFwR3JvdXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVQcm9ncmVzcyQub24oKTtcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKHNlbGVjdGVkTGRhcEdyb3Vwcy5tYXAobGRhcEdyb3VwID0+IHRoaXMuX3Jlc291cmNlcy5hc3NpZ25Sb2xlc1RvTGRhcEdyb3VwKFxuICAgICAgICAgICAge2dyb3VwRG46IGxkYXBHcm91cC5kbiwgcm9sZUlkczogc2VsZWN0ZWRSb2xlc30pKSkucGlwZShcbiAgICAgICAgICAgIHRhcChtZXNzYWdlcyA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXMuZm9yRWFjaCgobWVzc2FnZSwgaWR4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IobWVzc2FnZS5lcnJvciwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuRXJyb3JTbmFja0JhcihtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5pbmZvKG1lc3NhZ2Uuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZExkYXBHcm91cHNbaWR4XS5yb2xlcyA9IG5ldyBTZXQ8c3RyaW5nPihzZWxlY3RlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW5TdWNjZXNzU25hY2tCYXIodGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLnJvbGVzU3VjY2Vzc0Fzc2lnbicpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVByb2dyZXNzJC5vZmYoKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIEh0dHBQYXJhbXMgd2l0aCBwYWdlIHBhcmFtcyBhZGRpdGlvbi5cbiAgICAgKiBAcGFyYW0gcGFyYW1zIEV4aXN0aW5nIEh0dHBQYXJhbXMuXG4gICAgICogQHBhcmFtIHBhZ2UgUGFnZSBudW1iZXIgdGhhdCBpcyByZXF1ZXN0ZWQuIC8gTmV4dCBwYWdlIGxkYXBHcm91cHMgbGlzdC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkUGFnZVBhcmFtcyhwYXJhbXM6IEh0dHBQYXJhbXMsIHBhZ2U/OiBudW1iZXIpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChQYWdpbmF0aW9uUGFyYW1zLlBBR0VfU0laRSwgYCR7dGhpcy5fcGFnaW5hdGlvbi5zaXplfWApO1xuICAgICAgICBwYWdlID0gcGFnZSAhPT0gbnVsbCA/IHBhZ2UgOiB0aGlzLl9wYWdpbmF0aW9uLm51bWJlcjtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChQYWdpbmF0aW9uUGFyYW1zLlBBR0VfTlVNQkVSLCBgJHtwYWdlfWApO1xuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbn1cbiJdfQ==