UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

318 lines 52.7 kB
import { Inject, Injectable, Optional } from '@angular/core'; import { BehaviorSubject, of, Subject } from 'rxjs'; import { HttpParams } from '@angular/common/http'; import { catchError, concatMap, filter, map, mergeMap, scan, switchMap, tap } from 'rxjs/operators'; import { CaseMetaField } from '../../../header/case-header/case-menta-enum'; import { PageLoadRequestContext } from '../../abstract/page-load-request-context'; import { LoadingWithFilterEmitter } from '../../../utility/loading-with-filter-emitter'; import { arrayToObservable } from '../../../utility/array-to-observable'; import { PermissionType } from '../../../process/permissions'; import { NAE_NEW_CASE_CONFIGURATION } from '../models/new-case-configuration-injection-token'; import { AbstractSortableViewComponent } from '../../abstract/sortable-view'; import { PaginationParams } from '../../../utility/pagination/pagination-params'; import { createSortParam, PaginationSort } from '../../../utility/pagination/pagination-sort'; import { NAE_NEW_CASE_DIALOG_COMPONENT } from '../../../dialog/injection-tokens'; import * as i0 from "@angular/core"; import * as i1 from "../../../allowed-nets/services/allowed-nets.service"; import * as i2 from "@angular/material/dialog"; import * as i3 from "../../../resources/engine-endpoint/case-resource.service"; import * as i4 from "../../../logger/services/logger.service"; import * as i5 from "../../../snack-bar/services/snack-bar.service"; import * as i6 from "../../../search/search-service/search.service"; import * as i7 from "@ngx-translate/core"; import * as i8 from "../../../user/services/user.service"; import * as i9 from "../../../process/process.service"; import * as i10 from "../../../search/search-keyword-resolver-service/search-index-resolver.service"; import * as i11 from "../../../authorization/permission/permission.service"; export class CaseViewService extends AbstractSortableViewComponent { _allowedNetsService; _dialog; _caseResourceService; _log; _snackBarService; _searchService; _translate; _user; _processService; _newCaseComponent; _permissionService; DEFAULT_NEW_CASE_CONFIGURATION = { useCachedProcesses: true }; _loading$; _cases$; _nextPage$; _endOfData; _pagination; _newCaseConfiguration; _paginationView = false; constructor(_allowedNetsService, _dialog, _caseResourceService, _log, _snackBarService, _searchService, _translate, _user, _processService, resolver, _newCaseComponent, newCaseConfig, _permissionService) { super(resolver); this._allowedNetsService = _allowedNetsService; this._dialog = _dialog; this._caseResourceService = _caseResourceService; this._log = _log; this._snackBarService = _snackBarService; this._searchService = _searchService; this._translate = _translate; this._user = _user; this._processService = _processService; this._newCaseComponent = _newCaseComponent; this._permissionService = _permissionService; this._newCaseConfiguration = { ...this.DEFAULT_NEW_CASE_CONFIGURATION }; if (newCaseConfig !== null) { Object.assign(this._newCaseConfiguration, newCaseConfig); } this._loading$ = new LoadingWithFilterEmitter(); this._searchService.activeFilter$.subscribe(() => { this.reload(); }); this._endOfData = false; this._pagination = { size: 25, totalElements: undefined, totalPages: undefined, number: -1 }; this._nextPage$ = new BehaviorSubject(new PageLoadRequestContext(this.activeFilter, Object.assign({}, this._pagination, { number: 0 }))); const casesMap = this._nextPage$.pipe(mergeMap(p => this.loadPage(p)), map(pageLoadResult => { if (pageLoadResult.requestContext && pageLoadResult.requestContext.clearLoaded) { // we set an empty value to the virtual scroll and then replace it by the real value forcing it to redraw its content const results = [{ cases: {}, requestContext: null }, pageLoadResult]; return arrayToObservable(results); } else { return of(pageLoadResult); } }), concatMap(o => o), scan((acc, pageLoadResult) => { if (pageLoadResult.requestContext === null) { return pageLoadResult.cases; } else { this._loading$.off(pageLoadResult.requestContext.filter); } Object.assign(this._pagination, pageLoadResult.requestContext.pagination); if (this._paginationView) { return pageLoadResult.cases; } return { ...acc, ...pageLoadResult.cases }; }, {})); this._cases$ = casesMap.pipe(map(v => Object.values(v))); } ngOnDestroy() { super.ngOnDestroy(); this._loading$.complete(); this._nextPage$.complete(); } get loading() { return this._loading$.isActive; } get loading$() { return this._loading$.asObservable(); } get cases$() { return this._cases$; } get pagination() { return this._pagination; } get activeFilter() { return this._searchService.activeFilter; } set paginationView(value) { this._paginationView = value; } loadPage(requestContext) { if (requestContext === null || requestContext.pageNumber < 0) { return of({ cases: {}, requestContext }); } let params = new HttpParams(); params = this.addSortParams(params); params = this.addPageParams(params, requestContext.pagination); this._loading$.on(requestContext.filter); return this._caseResourceService.searchCases(requestContext.filter, params).pipe(catchError(err => { this._log.error('Loading cases has failed!', err); this._loading$.off(requestContext.filter); return of({ content: [], pagination: { ...this._pagination } }); }), filter(() => { const r = requestContext.filter === this._searchService.activeFilter; if (!r) { this._loading$.off(requestContext.filter); this._log.debug('Received cases page is no longer relevant since the active filter has changed before it could arrive.' + ' Discarding...'); } return r; }), tap(c => { Object.assign(requestContext.pagination, c.pagination); }), tap(c => { this._endOfData = !Array.isArray(c.content) || c.content.length === 0 || c.pagination.number === c.pagination.totalPages; }), map(cases => Array.isArray(cases.content) ? cases : { ...cases, content: [] }), map(cases => { return cases.content.reduce((acc, cur) => { return { ...acc, [cur.stringId]: cur }; }, {}); }), map(cases => ({ cases, requestContext }))); } nextPage(renderedRange, totalLoaded, requestContext) { if (requestContext === undefined) { requestContext = new PageLoadRequestContext(this.activeFilter, this._pagination); requestContext.pagination.number += 1; } if (this.isLoadingRelevantFilter(requestContext) || this._endOfData) { return; } if (renderedRange.end === totalLoaded) { this._nextPage$.next(requestContext); } } nextPagePagination(length, pageIndex, requestContext) { if (requestContext === undefined) { requestContext = new PageLoadRequestContext(this.activeFilter, this._pagination); requestContext.pagination.size = length; requestContext.pagination.number = pageIndex; } if (this.isLoadingRelevantFilter(requestContext) || this._endOfData) { return; } this._nextPage$.next(requestContext); } isLoadingRelevantFilter(requestContext) { return requestContext === undefined || this._loading$.isActiveWithFilter(requestContext.filter); } createNewCase(newCaseCreationConfiguration = { enableCaseTitle: true, isCaseTitleRequired: true }) { const myCase = new Subject(); const dialogRef = this._dialog.open(this._newCaseComponent, { width: '40%', minWidth: '300px', panelClass: "dialog-responsive", data: { allowedNets$: this.getNewCaseAllowedNets(newCaseCreationConfiguration.blockNets), newCaseCreationConfiguration }, }); dialogRef.afterClosed().subscribe($event => { if ($event?.data) { this._log.debug($event.message, $event.data); this.reload(); myCase.next($event.data); } myCase.complete(); }); return myCase.asObservable(); } createDefaultNewCase(newCaseCreationConfiguration = { enableCaseTitle: true, isCaseTitleRequired: true }) { const myCase = new Subject(); this.getNewCaseAllowedNets(newCaseCreationConfiguration.blockNets).subscribe((nets) => { if (!nets || nets.length === 0) { const errorMessage = this._translate.instant('side-menu.new-case.noNets'); this._snackBarService.openErrorSnackBar(errorMessage); this._log.error('No nets available for case creation. Ensure the allowed nets configuration is correct.'); return; } this._caseResourceService.createCase({ title: null, color: 'panel-primary-icon', netId: nets[0].stringId }).subscribe((response) => { this._snackBarService.openSuccessSnackBar(this._translate.instant('side-menu.new-case.createCase') + ' ' + this._translate.instant('side-menu.new-case.defaultCaseName')); this.reload(); myCase.next(response.outcome.aCase); myCase.complete(); }, error => { const errorMessage = error.message ? error.message : this._translate.instant('side-menu.new-case.createCaseError'); this._snackBarService.openErrorSnackBar(errorMessage); this._log.error('Error occurred during case creation: ' + errorMessage); }); }, error => { const errorMessage = error.message || this._translate.instant('side-menu.new-case.errorCreate'); this._log.error('Failed to fetch allowed nets. Error: ' + errorMessage); this._snackBarService.openErrorSnackBar(errorMessage); }); return myCase; } getNewCaseAllowedNets(blockNets = []) { if (this._newCaseConfiguration.useCachedProcesses) { return this._allowedNetsService.allowedNets$.pipe(map(net => net.filter(n => blockNets.indexOf(n.identifier) === -1)), map(net => net.filter(n => this._permissionService.hasNetPermission(PermissionType.CREATE, n)))); } else { return this._allowedNetsService.allowedNets$.pipe(switchMap(allowedNets => { return this._processService.getNetReferences(allowedNets.map(net => net.identifier)).pipe(map(net => net.filter(n => blockNets.indexOf(n.identifier) === -1)), map(net => net.filter(n => this._permissionService.hasNetPermission(PermissionType.CREATE, n)))); })); } } /** * Returns number of allowed nets of case view * @returns length of allowedNets array if it is defined, 0 if it is undefined */ getAllowedNetsCount() { return this._allowedNetsService.allowedNets === undefined ? 0 : this._allowedNetsService.allowedNets.length; } addPageParams(params, pagination) { params = params.set(PaginationParams.PAGE_SIZE, `${pagination.size}`); params = params.set(PaginationParams.PAGE_NUMBER, `${pagination.number}`); return params; } getDefaultSortParam() { return createSortParam('creationDateSortable', PaginationSort.DESCENDING); } getMetaFieldSortId() { switch (this._lastHeaderSearchState.fieldIdentifier) { case CaseMetaField.TITLE: return 'title.keyword'; case CaseMetaField.VISUAL_ID: return 'visualId'; case CaseMetaField.CREATION_DATE: return 'creationDateSortable'; default: return this._lastHeaderSearchState.fieldIdentifier; } } reload() { if (!this._cases$ || !this._pagination) { return; } this._endOfData = false; const requestContext = new PageLoadRequestContext(this.activeFilter, this._pagination, true); requestContext.pagination.number = 0; const range = { start: -1, end: 0 }; this.nextPage(range, 0, requestContext); } hasAuthority(authority) { return this._user.hasAuthority(authority); } /** * Determines whether the current user has the [VIEW]{@link PermissionType#VIEW} permission on the current case * @param aCase the tested case * @returns `true` if the current user has the `VIEW` permission on the tested case, `false` otherwise. */ viewEnabled(aCase) { return this._permissionService.hasCasePermission(aCase, PermissionType.VIEW); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CaseViewService, deps: [{ token: i1.AllowedNetsService }, { token: i2.MatDialog }, { token: i3.CaseResourceService }, { token: i4.LoggerService }, { token: i5.SnackBarService }, { token: i6.SearchService }, { token: i7.TranslateService }, { token: i8.UserService }, { token: i9.ProcessService }, { token: i10.SearchIndexResolverService }, { token: NAE_NEW_CASE_DIALOG_COMPONENT, optional: true }, { token: NAE_NEW_CASE_CONFIGURATION, optional: true }, { token: i11.PermissionService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CaseViewService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CaseViewService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.AllowedNetsService }, { type: i2.MatDialog }, { type: i3.CaseResourceService }, { type: i4.LoggerService }, { type: i5.SnackBarService }, { type: i6.SearchService }, { type: i7.TranslateService }, { type: i8.UserService }, { type: i9.ProcessService }, { type: i10.SearchIndexResolverService }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_NEW_CASE_DIALOG_COMPONENT] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NAE_NEW_CASE_CONFIGURATION] }] }, { type: i11.PermissionService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS12aWV3LXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3ZpZXcvY2FzZS12aWV3L3NlcnZpY2UvY2FzZS12aWV3LXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXRFLE9BQU8sRUFBQyxlQUFlLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFNaEQsT0FBTyxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDMUUsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFHaEYsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFHdEYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBUTVGLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBTzNFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQy9FLE9BQU8sRUFBQyxlQUFlLEVBQUUsY0FBYyxFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFFNUYsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFHL0UsTUFBTSxPQUFPLGVBQWdCLFNBQVEsNkJBQTZCO0lBY3hDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUVtRDtJQUVuRDtJQXhCYiw4QkFBOEIsR0FBeUI7UUFDNUQsa0JBQWtCLEVBQUUsSUFBSTtLQUMzQixDQUFDO0lBRVEsU0FBUyxDQUEyQjtJQUNwQyxPQUFPLENBQTBCO0lBQ2pDLFVBQVUsQ0FBMEM7SUFDcEQsVUFBVSxDQUFVO0lBQ3BCLFdBQVcsQ0FBYTtJQUN4QixxQkFBcUIsQ0FBdUI7SUFDNUMsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUUzQyxZQUFzQixtQkFBdUMsRUFDdkMsT0FBa0IsRUFDbEIsb0JBQXlDLEVBQ3pDLElBQW1CLEVBQ25CLGdCQUFpQyxFQUNqQyxjQUE2QixFQUM3QixVQUE0QixFQUM1QixLQUFrQixFQUNsQixlQUErQixFQUN6QyxRQUFvQyxFQUN5QixpQkFBc0IsRUFDbkMsYUFBbUMsRUFDekUsa0JBQXFDO1FBQ3ZELEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQWJFLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFDdkMsWUFBTyxHQUFQLE9BQU8sQ0FBVztRQUNsQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUNqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixlQUFVLEdBQVYsVUFBVSxDQUFrQjtRQUM1QixVQUFLLEdBQUwsS0FBSyxDQUFhO1FBQ2xCLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUVvQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQUs7UUFFekUsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUV2RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBQyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsRUFBQyxDQUFDO1FBQ3RFLElBQUksYUFBYSxLQUFLLElBQUksRUFBRTtZQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLENBQUMsQ0FBQztTQUM1RDtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDN0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNmLElBQUksRUFBRSxFQUFFO1lBQ1IsYUFBYSxFQUFFLFNBQVM7WUFDeEIsVUFBVSxFQUFFLFNBQVM7WUFDckIsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNiLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksZUFBZSxDQUNqQyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQ2xHLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDakMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUMvQixHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDakIsSUFBSSxjQUFjLENBQUMsY0FBYyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFO2dCQUM1RSxxSEFBcUg7Z0JBQ3JILE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNyQztpQkFBTTtnQkFDSCxPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUM3QjtRQUNMLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUNqQixJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsY0FBYyxFQUFFLEVBQUU7WUFDekIsSUFBSSxjQUFjLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRTtnQkFDeEMsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNILElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDNUQ7WUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3RCLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQzthQUMvQjtZQUNELE9BQU8sRUFBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztRQUM3QyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ1QsQ0FBQztRQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FDeEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM3QixDQUFDO0lBQ04sQ0FBQztJQUVELFdBQVc7UUFDUCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBYyxZQUFZO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQVcsY0FBYyxDQUFDLEtBQWM7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUVNLFFBQVEsQ0FBQyxjQUFzQztRQUNsRCxJQUFJLGNBQWMsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDMUQsT0FBTyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBQyxDQUFDLENBQUM7U0FDMUM7UUFDRCxJQUFJLE1BQU0sR0FBZSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDNUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLEVBQ0YsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNSLE1BQU0sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7WUFDckUsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDSixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHVHQUF1RztzQkFDakgsZ0JBQWdCLENBQUMsQ0FBQzthQUMzQjtZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ0osTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO21CQUNwQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO21CQUN0QixDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUMzRCxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDLEdBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUMsQ0FBQyxFQUM1RSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDUixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNyQyxPQUFPLEVBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFDLENBQUM7WUFDekMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFDLENBQzFDLENBQUM7SUFDTixDQUFDO0lBRU0sUUFBUSxDQUFDLGFBQXdCLEVBQUUsV0FBbUIsRUFBRSxjQUF1QztRQUNsRyxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7WUFDOUIsY0FBYyxHQUFHLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDakYsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqRSxPQUFPO1NBQ1Y7UUFFRCxJQUFJLGFBQWEsQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUFFO1lBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3hDO0lBQ0wsQ0FBQztJQUVNLGtCQUFrQixDQUFDLE1BQWMsRUFBRSxTQUFpQixFQUFFLGNBQXVDO1FBQ2hHLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUM5QixjQUFjLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRixjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7WUFDeEMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqRSxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sdUJBQXVCLENBQUMsY0FBdUM7UUFDbkUsT0FBTyxjQUFjLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFTSxhQUFhLENBQUMsK0JBQWlFO1FBQ2xGLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLG1CQUFtQixFQUFFLElBQUk7S0FDNUI7UUFDRyxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ25DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN4RCxLQUFLLEVBQUUsS0FBSztZQUNaLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFVBQVUsRUFBRSxtQkFBbUI7WUFDL0IsSUFBSSxFQUFFO2dCQUNGLFlBQVksRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsNEJBQTRCLENBQUMsU0FBUyxDQUFDO2dCQUNoRiw0QkFBNEI7YUFDL0I7U0FDSixDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZDLElBQUksTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVNLG9CQUFvQixDQUFDLCtCQUFpRTtRQUN6RixlQUFlLEVBQUUsSUFBSTtRQUNyQixtQkFBbUIsRUFBRSxJQUFJO0tBQzVCO1FBQ0csTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNuQyxJQUFJLENBQUMscUJBQXFCLENBQUMsNEJBQTRCLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBNkMsRUFBRSxFQUFFO1lBQzNILElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQzVCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsd0ZBQXdGLENBQUMsQ0FBQztnQkFDMUcsT0FBTzthQUNWO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztnQkFDakMsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsS0FBSyxFQUFFLG9CQUFvQjtnQkFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRO2FBQzFCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFxQyxFQUFFLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQztzQkFDNUYsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUUsUUFBUSxDQUFDLE9BQWtDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN0QixDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ1AsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0NBQW9DLENBQUMsQ0FBQztnQkFDbkgsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUM1RSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNQLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUNoRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU0scUJBQXFCLENBQUMsWUFBc0IsRUFBRTtRQUNqRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRTtZQUMvQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUM3QyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNuRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNsRyxDQUFDO1NBQ0w7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQzdDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3JGLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ25FLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2xHLENBQUM7WUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksbUJBQW1CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7SUFDaEgsQ0FBQztJQUVTLGFBQWEsQ0FBQyxNQUFrQixFQUFFLFVBQXNCO1FBQzlELE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFUyxtQkFBbUI7UUFDekIsT0FBTyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFUyxrQkFBa0I7UUFDeEIsUUFBUSxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxFQUFFO1lBQ2pELEtBQUssYUFBYSxDQUFDLEtBQUs7Z0JBQ3BCLE9BQU8sZUFBZSxDQUFDO1lBQzNCLEtBQUssYUFBYSxDQUFDLFNBQVM7Z0JBQ3hCLE9BQU8sVUFBVSxDQUFDO1lBQ3RCLEtBQUssYUFBYSxDQUFDLGFBQWE7Z0JBQzVCLE9BQU8sc0JBQXNCLENBQUM7WUFDbEM7Z0JBQ0ksT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDO1NBQzFEO0lBQ0wsQ0FBQztJQUVNLE1BQU07UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEMsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0YsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHO1lBQ1YsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNULEdBQUcsRUFBRSxDQUFDO1NBQ1QsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sWUFBWSxDQUFDLFNBQWlDO1FBQ2pELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsS0FBVztRQUMxQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pGLENBQUM7d0dBN1RRLGVBQWUsNlVBd0JRLDZCQUE2Qiw2QkFDN0IsMEJBQTBCOzRHQXpCakQsZUFBZTs7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVTs7MEJBeUJNLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsNkJBQTZCOzswQkFDaEQsUUFBUTs7MEJBQUksTUFBTTsyQkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Nhc2VSZXNvdXJjZVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcy9lbmdpbmUtZW5kcG9pbnQvY2FzZS1yZXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0h0dHBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7Q2FzZX0gZnJvbSAnLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9jYXNlJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7U25hY2tCYXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zbmFjay1iYXIvc2VydmljZXMvc25hY2stYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHtTZWFyY2hTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZWFyY2gvc2VhcmNoLXNlcnZpY2Uvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgY29uY2F0TWFwLCBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHNjYW4sIHN3aXRjaE1hcCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1BhZ2luYXRpb259IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvcGFnaW5hdGlvbic7XG5pbXBvcnQge0Nhc2VNZXRhRmllbGR9IGZyb20gJy4uLy4uLy4uL2hlYWRlci9jYXNlLWhlYWRlci9jYXNlLW1lbnRhLWVudW0nO1xuaW1wb3J0IHtQYWdlTG9hZFJlcXVlc3RDb250ZXh0fSBmcm9tICcuLi8uLi9hYnN0cmFjdC9wYWdlLWxvYWQtcmVxdWVzdC1jb250ZXh0JztcbmltcG9ydCB7RmlsdGVyfSBmcm9tICcuLi8uLi8uLi9maWx0ZXIvbW9kZWxzL2ZpbHRlcic7XG5pbXBvcnQge0xpc3RSYW5nZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7TG9hZGluZ1dpdGhGaWx0ZXJFbWl0dGVyfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L2xvYWRpbmctd2l0aC1maWx0ZXItZW1pdHRlcic7XG5pbXBvcnQge0Nhc2VQYWdlTG9hZFJlcXVlc3RSZXN1bHR9IGZyb20gJy4uL21vZGVscy9jYXNlLXBhZ2UtbG9hZC1yZXF1ZXN0LXJlc3VsdCc7XG5pbXBvcnQge1VzZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi91c2VyL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XG5pbXBvcnQge2FycmF5VG9PYnNlcnZhYmxlfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L2FycmF5LXRvLW9ic2VydmFibGUnO1xuaW1wb3J0IHtQZXJtaXNzaW9uVHlwZX0gZnJvbSAnLi4vLi4vLi4vcHJvY2Vzcy9wZXJtaXNzaW9ucyc7XG5pbXBvcnQge05BRV9ORVdfQ0FTRV9DT05GSUdVUkFUSU9OfSBmcm9tICcuLi9tb2RlbHMvbmV3LWNhc2UtY29uZmlndXJhdGlvbi1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtOZXdDYXNlQ29uZmlndXJhdGlvbn0gZnJvbSAnLi4vbW9kZWxzL25ldy1jYXNlLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtQcm9jZXNzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vcHJvY2Vzcy9wcm9jZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHtQZXRyaU5ldFJlZmVyZW5jZVdpdGhQZXJtaXNzaW9uc30gZnJvbSAnLi4vLi4vLi4vcHJvY2Vzcy9wZXRyaS1uZXQtcmVmZXJlbmNlLXdpdGgtcGVybWlzc2lvbnMnO1xuaW1wb3J0IHtcbiAgICBTZWFyY2hJbmRleFJlc29sdmVyU2VydmljZVxufSBmcm9tICcuLi8uLi8uLi9zZWFyY2gvc2VhcmNoLWtleXdvcmQtcmVzb2x2ZXItc2VydmljZS9zZWFyY2gtaW5kZXgtcmVzb2x2ZXIuc2VydmljZSc7XG5pbXBvcnQge0FsbG93ZWROZXRzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vYWxsb3dlZC1uZXRzL3NlcnZpY2VzL2FsbG93ZWQtbmV0cy5zZXJ2aWNlJztcbmltcG9ydCB7QWJzdHJhY3RTb3J0YWJsZVZpZXdDb21wb25lbnR9IGZyb20gJy4uLy4uL2Fic3RyYWN0L3NvcnRhYmxlLXZpZXcnO1xuaW1wb3J0IHtcbiAgICBOZXdDYXNlQ3JlYXRpb25Db25maWd1cmF0aW9uRGF0YVxufSBmcm9tICcuLi8uLi8uLi9zaWRlLW1lbnUvY29udGVudC1jb21wb25lbnRzL25ldy1jYXNlL21vZGVsL25ldy1jYXNlLWluamVjdGlvbi1kYXRhJztcbmltcG9ydCB7UGVybWlzc2lvblNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2F1dGhvcml6YXRpb24vcGVybWlzc2lvbi9wZXJtaXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2V9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZSc7XG5pbXBvcnQge0NyZWF0ZUNhc2VFdmVudE91dGNvbWV9IGZyb20gJy4uLy4uLy4uL2V2ZW50L21vZGVsL2V2ZW50LW91dGNvbWVzL2Nhc2Utb3V0Y29tZXMvY3JlYXRlLWNhc2UtZXZlbnQtb3V0Y29tZSc7XG5pbXBvcnQge1BhZ2luYXRpb25QYXJhbXN9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXBhcmFtcyc7XG5pbXBvcnQge2NyZWF0ZVNvcnRQYXJhbSwgUGFnaW5hdGlvblNvcnR9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLXNvcnQnO1xuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQge05BRV9ORVdfQ0FTRV9ESUFMT0dfQ09NUE9ORU5UfSBmcm9tICcuLi8uLi8uLi9kaWFsb2cvaW5qZWN0aW9uLXRva2Vucyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDYXNlVmlld1NlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFNvcnRhYmxlVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICByZWFkb25seSBERUZBVUxUX05FV19DQVNFX0NPTkZJR1VSQVRJT046IE5ld0Nhc2VDb25maWd1cmF0aW9uID0ge1xuICAgICAgICB1c2VDYWNoZWRQcm9jZXNzZXM6IHRydWVcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9sb2FkaW5nJDogTG9hZGluZ1dpdGhGaWx0ZXJFbWl0dGVyO1xuICAgIHByb3RlY3RlZCBfY2FzZXMkOiBPYnNlcnZhYmxlPEFycmF5PENhc2U+PjtcbiAgICBwcm90ZWN0ZWQgX25leHRQYWdlJDogQmVoYXZpb3JTdWJqZWN0PFBhZ2VMb2FkUmVxdWVzdENvbnRleHQ+O1xuICAgIHByb3RlY3RlZCBfZW5kT2ZEYXRhOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfcGFnaW5hdGlvbjogUGFnaW5hdGlvbjtcbiAgICBwcm90ZWN0ZWQgX25ld0Nhc2VDb25maWd1cmF0aW9uOiBOZXdDYXNlQ29uZmlndXJhdGlvbjtcbiAgICBwcm90ZWN0ZWQgX3BhZ2luYXRpb25WaWV3OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2FsbG93ZWROZXRzU2VydmljZTogQWxsb3dlZE5ldHNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9jYXNlUmVzb3VyY2VTZXJ2aWNlOiBDYXNlUmVzb3VyY2VTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfbG9nOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfc25hY2tCYXJTZXJ2aWNlOiBTbmFja0JhclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9zZWFyY2hTZXJ2aWNlOiBTZWFyY2hTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdXNlcjogVXNlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9wcm9jZXNzU2VydmljZTogUHJvY2Vzc1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZXI6IFNlYXJjaEluZGV4UmVzb2x2ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX05FV19DQVNFX0RJQUxPR19DT01QT05FTlQpIHByb3RlY3RlZCBfbmV3Q2FzZUNvbXBvbmVudDogYW55LFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX05FV19DQVNFX0NPTkZJR1VSQVRJT04pIG5ld0Nhc2VDb25maWc6IE5ld0Nhc2VDb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfcGVybWlzc2lvblNlcnZpY2U6IFBlcm1pc3Npb25TZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKHJlc29sdmVyKTtcbiAgICAgICAgdGhpcy5fbmV3Q2FzZUNvbmZpZ3VyYXRpb24gPSB7Li4udGhpcy5ERUZBVUxUX05FV19DQVNFX0NPTkZJR1VSQVRJT059O1xuICAgICAgICBpZiAobmV3Q2FzZUNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9uZXdDYXNlQ29uZmlndXJhdGlvbiwgbmV3Q2FzZUNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbG9hZGluZyQgPSBuZXcgTG9hZGluZ1dpdGhGaWx0ZXJFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX3NlYXJjaFNlcnZpY2UuYWN0aXZlRmlsdGVyJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2VuZE9mRGF0YSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uID0ge1xuICAgICAgICAgICAgc2l6ZTogMjUsXG4gICAgICAgICAgICB0b3RhbEVsZW1lbnRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB0b3RhbFBhZ2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBudW1iZXI6IC0xXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX25leHRQYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGFnZUxvYWRSZXF1ZXN0Q29udGV4dD4oXG4gICAgICAgICAgICBuZXcgUGFnZUxvYWRSZXF1ZXN0Q29udGV4dCh0aGlzLmFjdGl2ZUZpbHRlciwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGFnaW5hdGlvbiwge251bWJlcjogMH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNhc2VzTWFwID0gdGhpcy5fbmV4dFBhZ2UkLnBpcGUoXG4gICAgICAgICAgICBtZXJnZU1hcChwID0+IHRoaXMubG9hZFBhZ2UocCkpLFxuICAgICAgICAgICAgbWFwKHBhZ2VMb2FkUmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZUxvYWRSZXN1bHQucmVxdWVzdENvbnRleHQgJiYgcGFnZUxvYWRSZXN1bHQucmVxdWVzdENvbnRleHQuY2xlYXJMb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2V0IGFuIGVtcHR5IHZhbHVlIHRvIHRoZSB2aXJ0dWFsIHNjcm9sbCBhbmQgdGhlbiByZXBsYWNlIGl0IGJ5IHRoZSByZWFsIHZhbHVlIGZvcmNpbmcgaXQgdG8gcmVkcmF3IGl0cyBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbe2Nhc2VzOiB7fSwgcmVxdWVzdENvbnRleHQ6IG51bGx9LCBwYWdlTG9hZFJlc3VsdF07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvT2JzZXJ2YWJsZShyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YocGFnZUxvYWRSZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29uY2F0TWFwKG8gPT4gbyksXG4gICAgICAgICAgICBzY2FuKChhY2MsIHBhZ2VMb2FkUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VMb2FkUmVzdWx0LnJlcXVlc3RDb250ZXh0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWdlTG9hZFJlc3VsdC5jYXNlcztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nJC5vZmYocGFnZUxvYWRSZXN1bHQucmVxdWVzdENvbnRleHQuZmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9wYWdpbmF0aW9uLCBwYWdlTG9hZFJlc3VsdC5yZXF1ZXN0Q29udGV4dC5wYWdpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGFnaW5hdGlvblZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2VMb2FkUmVzdWx0LmNhc2VzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gey4uLmFjYywgLi4ucGFnZUxvYWRSZXN1bHQuY2FzZXN9O1xuICAgICAgICAgICAgfSwge30pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2Nhc2VzJCA9IGNhc2VzTWFwLnBpcGUoXG4gICAgICAgICAgICBtYXAodiA9PiBPYmplY3QudmFsdWVzKHYpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9sb2FkaW5nJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9uZXh0UGFnZSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkaW5nJC5pc0FjdGl2ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvYWRpbmckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjYXNlcyQoKTogT2JzZXJ2YWJsZTxBcnJheTxDYXNlPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FzZXMkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFnaW5hdGlvbigpOiBQYWdpbmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luYXRpb247XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBhY3RpdmVGaWx0ZXIoKTogRmlsdGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaFNlcnZpY2UuYWN0aXZlRmlsdGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFnaW5hdGlvblZpZXcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvblZpZXcgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZFBhZ2UocmVxdWVzdENvbnRleHQ6IFBhZ2VMb2FkUmVxdWVzdENvbnRleHQpOiBPYnNlcnZhYmxlPENhc2VQYWdlTG9hZFJlcXVlc3RSZXN1bHQ+IHtcbiAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0ID09PSBudWxsIHx8IHJlcXVlc3RDb250ZXh0LnBhZ2VOdW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Yoe2Nhc2VzOiB7fSwgcmVxdWVzdENvbnRleHR9KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICAgICAgcGFyYW1zID0gdGhpcy5hZGRTb3J0UGFyYW1zKHBhcmFtcyk7XG4gICAgICAgIHBhcmFtcyA9IHRoaXMuYWRkUGFnZVBhcmFtcyhwYXJhbXMsIHJlcXVlc3RDb250ZXh0LnBhZ2luYXRpb24pO1xuICAgICAgICB0aGlzLl9sb2FkaW5nJC5vbihyZXF1ZXN0Q29udGV4dC5maWx0ZXIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jYXNlUmVzb3VyY2VTZXJ2aWNlLnNlYXJjaENhc2VzKHJlcXVlc3RDb250ZXh0LmZpbHRlciwgcGFyYW1zKS5waXBlKFxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcignTG9hZGluZyBjYXNlcyBoYXMgZmFpbGVkIScsIGVycik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZyQub2ZmKHJlcXVlc3RDb250ZXh0LmZpbHRlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtjb250ZW50OiBbXSwgcGFnaW5hdGlvbjogey4uLnRoaXMuX3BhZ2luYXRpb259fSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHJlcXVlc3RDb250ZXh0LmZpbHRlciA9PT0gdGhpcy5fc2VhcmNoU2VydmljZS5hY3RpdmVGaWx0ZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmckLm9mZihyZXF1ZXN0Q29udGV4dC5maWx0ZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ1JlY2VpdmVkIGNhc2VzIHBhZ2UgaXMgbm8gbG9uZ2VyIHJlbGV2YW50IHNpbmNlIHRoZSBhY3RpdmUgZmlsdGVyIGhhcyBjaGFuZ2VkIGJlZm9yZSBpdCBjb3VsZCBhcnJpdmUuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKyAnIERpc2NhcmRpbmcuLi4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcChjID0+IHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3RDb250ZXh0LnBhZ2luYXRpb24sIGMucGFnaW5hdGlvbik7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcChjID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbmRPZkRhdGEgPSAhQXJyYXkuaXNBcnJheShjLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgIHx8IGMuY29udGVudC5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgfHwgYy5wYWdpbmF0aW9uLm51bWJlciA9PT0gYy5wYWdpbmF0aW9uLnRvdGFsUGFnZXM7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcChjYXNlcyA9PiBBcnJheS5pc0FycmF5KGNhc2VzLmNvbnRlbnQpID8gY2FzZXMgOiB7Li4uY2FzZXMsIGNvbnRlbnQ6IFtdfSksXG4gICAgICAgICAgICBtYXAoY2FzZXMgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYXNlcy5jb250ZW50LnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5hY2MsIFtjdXIuc3RyaW5nSWRdOiBjdXJ9O1xuICAgICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKGNhc2VzID0+ICh7Y2FzZXMsIHJlcXVlc3RDb250ZXh0fSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG5leHRQYWdlKHJlbmRlcmVkUmFuZ2U6IExpc3RSYW5nZSwgdG90YWxMb2FkZWQ6IG51bWJlciwgcmVxdWVzdENvbnRleHQ/OiBQYWdlTG9hZFJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0Q29udGV4dCA9IG5ldyBQYWdlTG9hZFJlcXVlc3RDb250ZXh0KHRoaXMuYWN0aXZlRmlsdGVyLCB0aGlzLl9wYWdpbmF0aW9uKTtcbiAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnBhZ2luYXRpb24ubnVtYmVyICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmdSZWxldmFudEZpbHRlcihyZXF1ZXN0Q29udGV4dCkgfHwgdGhpcy5fZW5kT2ZEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVuZGVyZWRSYW5nZS5lbmQgPT09IHRvdGFsTG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9uZXh0UGFnZSQubmV4dChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dFBhZ2VQYWdpbmF0aW9uKGxlbmd0aDogbnVtYmVyLCBwYWdlSW5kZXg6IG51bWJlciwgcmVxdWVzdENvbnRleHQ/OiBQYWdlTG9hZFJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0Q29udGV4dCA9IG5ldyBQYWdlTG9hZFJlcXVlc3RDb250ZXh0KHRoaXMuYWN0aXZlRmlsdGVyLCB0aGlzLl9wYWdpbmF0aW9uKTtcbiAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnBhZ2luYXRpb24uc2l6ZSA9IGxlbmd0aDtcbiAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnBhZ2luYXRpb24ubnVtYmVyID0gcGFnZUluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkaW5nUmVsZXZhbnRGaWx0ZXIocmVxdWVzdENvbnRleHQpIHx8IHRoaXMuX2VuZE9mRGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX25leHRQYWdlJC5uZXh0KHJlcXVlc3RDb250ZXh0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTG9hZGluZ1JlbGV2YW50RmlsdGVyKHJlcXVlc3RDb250ZXh0PzogUGFnZUxvYWRSZXF1ZXN0Q29udGV4dCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9sb2FkaW5nJC5pc0FjdGl2ZVdpdGhGaWx0ZXIocmVxdWVzdENvbnRleHQuZmlsdGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlTmV3Q2FzZShuZXdDYXNlQ3JlYXRpb25Db25maWd1cmF0aW9uOiBOZXdDYXNlQ3JlYXRpb25Db25maWd1cmF0aW9uRGF0YSA9IHtcbiAgICAgICAgZW5hYmxlQ2FzZVRpdGxlOiB0cnVlLFxuICAgICAgICBpc0Nhc2VUaXRsZVJlcXVpcmVkOiB0cnVlXG4gICAgfSk6IE9ic2VydmFibGU8Q2FzZT4ge1xuICAgICAgICBjb25zdCBteUNhc2UgPSBuZXcgU3ViamVjdDxDYXNlPigpO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLl9kaWFsb2cub3Blbih0aGlzLl9uZXdDYXNlQ29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzQwJScsXG4gICAgICAgICAgICBtaW5XaWR0aDogJzMwMHB4JyxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFwiZGlhbG9nLXJlc3BvbnNpdmVcIixcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBhbGxvd2VkTmV0cyQ6IHRoaXMuZ2V0TmV3Q2FzZUFsbG93ZWROZXRzKG5ld0Nhc2VDcmVhdGlvbkNvbmZpZ3VyYXRpb24uYmxvY2tOZXRzKSxcbiAgICAgICAgICAgICAgICBuZXdDYXNlQ3JlYXRpb25Db25maWd1cmF0aW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCRldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoJGV2ZW50Py5kYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCRldmVudC5tZXNzYWdlLCAkZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICBteUNhc2UubmV4dCgkZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBteUNhc2UuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBteUNhc2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZURlZmF1bHROZXdDYXNlKG5ld0Nhc2VDcmVhdGlvbkNvbmZpZ3VyYXRpb246IE5ld0Nhc2VDcmVhdGlvbkNvbmZpZ3VyYXRpb25EYXRhID0ge1xuICAgICAgICBlbmFibGVDYXNlVGl0bGU6IHRydWUsXG4gICAgICAgIGlzQ2FzZVRpdGxlUmVxdWlyZWQ6IHRydWVcbiAgICB9KTogT2JzZXJ2YWJsZTxDYXNlPiB7XG4gICAgICAgIGNvbnN0IG15Q2FzZSA9IG5ldyBTdWJqZWN0PENhc2U+KCk7XG4gICAgICAgIHRoaXMuZ2V0TmV3Q2FzZUFsbG93ZWROZXRzKG5ld0Nhc2VDcmVhdGlvbkNvbmZpZ3VyYXRpb24uYmxvY2tOZXRzKS5zdWJzY3JpYmUoKG5ldHM6IEFycmF5PFBldHJpTmV0UmVmZXJlbmNlV2l0aFBlcm1pc3Npb25zPikgPT4ge1xuICAgICAgICAgICAgaWYgKCFuZXRzIHx8IG5ldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3NpZGUtbWVudS5uZXctY2FzZS5ub05ldHMnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zbmFja0JhclNlcnZpY2Uub3BlbkVycm9yU25hY2tCYXIoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZXJyb3IoJ05vIG5ldHMgYXZhaWxhYmxlIGZvciBjYXNlIGNyZWF0aW9uLiBFbnN1cmUgdGhlIGFsbG93ZWQgbmV0cyBjb25maWd1cmF0aW9uIGlzIGNvcnJlY3QuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2FzZVJlc291cmNlU2VydmljZS5jcmVhdGVDYXNlKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogbnVsbCxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3BhbmVsLXByaW1hcnktaWNvbicsXG4gICAgICAgICAgICAgICAgbmV0SWQ6IG5ldHNbMF0uc3RyaW5nSWRcbiAgICAgICAgICAgIH0pLnN1YnNjcmliZSgocmVzcG9uc2U6IEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyU2VydmljZS5vcGVuU3VjY2Vzc1NuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdzaWRlLW1lbnUubmV3LWNhc2UuY3JlYXRlQ2FzZScpXG4gICAgICAgICAgICAgICAgICAgICsgJyAnICsgdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3NpZGUtbWVudS5uZXctY2FzZS5kZWZhdWx0Q2FzZU5hbWUnKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICBteUNhc2UubmV4dCgocmVzcG9uc2Uub3V0Y29tZSBhcyBDcmVhdGVDYXNlRXZlbnRPdXRjb21lKS5hQ2FzZSk7XG4gICAgICAgICAgICAgICAgbXlDYXNlLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IubWVzc2FnZSA/IGVycm9yLm1lc3NhZ2UgOiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnc2lkZS1tZW51Lm5ldy1jYXNlLmNyZWF0ZUNhc2VFcnJvcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyU2VydmljZS5vcGVuRXJyb3JTbmFja0JhcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcignRXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNhc2UgY3JlYXRpb246ICcgKyBlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgfHwgdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3NpZGUtbWVudS5uZXctY2FzZS5lcnJvckNyZWF0ZScpO1xuICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggYWxsb3dlZCBuZXRzLiBFcnJvcjogJyArIGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0JhclNlcnZpY2Uub3BlbkVycm9yU25hY2tCYXIoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBteUNhc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5ld0Nhc2VBbGxvd2VkTmV0cyhibG9ja05ldHM6IHN0cmluZ1tdID0gW10pOiBPYnNlcnZhYmxlPEFycmF5PFBldHJpTmV0UmVmZXJlbmNlV2l0aFBlcm1pc3Npb25zPj4ge1xuICAgICAgICBpZiAodGhpcy5fbmV3Q2FzZUNvbmZpZ3VyYXRpb24udXNlQ2FjaGVkUHJvY2Vzc2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWxsb3dlZE5ldHNTZXJ2aWNlLmFsbG93ZWROZXRzJC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChuZXQgPT4gbmV0LmZpbHRlcihuID0+IGJsb2NrTmV0cy5pbmRleE9mKG4uaWRlbnRpZmllcikgPT09IC0xKSksXG4gICAgICAgICAgICAgICAgbWFwKG5ldCA9PiBuZXQuZmlsdGVyKG4gPT4gdGhpcy5fcGVybWlzc2lvblNlcnZpY2UuaGFzTmV0UGVybWlzc2lvbihQZXJtaXNzaW9uVHlwZS5DUkVBVEUsIG4pKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWxsb3dlZE5ldHNTZXJ2aWNlLmFsbG93ZWROZXRzJC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChhbGxvd2VkTmV0cyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzU2VydmljZS5nZXROZXRSZWZlcmVuY2VzKGFsbG93ZWROZXRzLm1hcChuZXQgPT4gbmV0LmlkZW50aWZpZXIpKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKG5ldCA9PiBuZXQuZmlsdGVyKG4gPT4gYmxvY2tOZXRzLmluZGV4T2Yobi5pZGVudGlmaWVyKSA9PT0gLTEpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcChuZXQgPT4gbmV0LmZpbHRlcihuID0+IHRoaXMuX3Blcm1pc3Npb25TZXJ2aWNlLmhhc05ldFBlcm1pc3Npb24oUGVybWlzc2lvblR5cGUuQ1JFQVRFLCBuKSkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG51bWJlciBvZiBhbGxvd2VkIG5ldHMgb2YgY2FzZSB2aWV3XG4gICAgICogQHJldHVybnMgbGVuZ3RoIG9mIGFsbG93ZWROZXRzIGFycmF5IGlmIGl0IGlzIGRlZmluZWQsIDAgaWYgaXQgaXMgdW5kZWZpbmVkXG4gICAgICovXG4gICAgcHVibGljIGdldEFsbG93ZWROZXRzQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93ZWROZXRzU2Vyd