UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

233 lines 37 kB
import { Injectable, Optional } from '@angular/core'; import { HeaderType } from '../../header/models/header-type'; import { filter } from 'rxjs/operators'; import { HeaderChangeType } from '../../header/models/user-changes/header-change-type'; import { HeaderMode } from '../../header/models/header-mode'; import { HeaderColumnType } from '../../header/models/header-column'; import { CaseMetaField } from '../../header/case-header/case-menta-enum'; import { CaseVisualId } from '../models/category/case/case-visual-id'; import { CaseAuthor } from '../models/category/case/case-author'; import { CaseCreationDate } from '../models/category/case/case-creation-date'; import { CaseTitle } from '../models/category/case/case-title'; import { CaseStringId } from '../models/category/case/case-string-id'; import { CaseSimpleDataset } from '../models/category/case/case-simple-dataset'; import * as i0 from "@angular/core"; import * as i1 from "../category-factory/category-factory"; import * as i2 from "../../process/process.service"; import * as i3 from "@ngx-translate/core"; import * as i4 from "../../logger/services/logger.service"; import * as i5 from "../search-service/search.service"; /** * Acts as an intermediary between the {@link AbstractHeaderService} instances of various types and the {@link SearchService} */ export class HeaderSearchService { _categoryFactory; _processService; _translate; _logger; _searchService; _headerService; _columnToConfiguration; _typeToCategory; _headerSub; _searchSub; constructor(_categoryFactory, _processService, _translate, _logger, _searchService) { this._categoryFactory = _categoryFactory; this._processService = _processService; this._translate = _translate; this._logger = _logger; this._searchService = _searchService; this._columnToConfiguration = new Map(); this._typeToCategory = new Map(); [ { k: CaseMetaField.VISUAL_ID, v: CaseVisualId }, { k: CaseMetaField.TITLE, v: CaseTitle }, { k: CaseMetaField.CREATION_DATE, v: CaseCreationDate }, { k: CaseMetaField.AUTHOR, v: CaseAuthor }, { k: CaseMetaField.MONGO_ID, v: CaseStringId } ].forEach(pair => { this._typeToCategory.set(pair.k, this._categoryFactory.getWithDefaultOperator(pair.v)); }); this._typeToCategory.set(HeaderColumnType.IMMEDIATE, this._categoryFactory.get(CaseSimpleDataset)); } ngOnDestroy() { if (this._headerSub) { this._headerSub.unsubscribe(); } if (this._searchSub) { this._searchSub.unsubscribe(); } for (const cat of this._typeToCategory.values()) { cat.destroy(); } } set headerService(headerService) { if (headerService.headerType === HeaderType.CASE || headerService.headerType === HeaderType.TASK) { this._headerService = headerService; } if (headerService && this._searchService) { this.initializeHeaderSearch(); } } /** * {@link HeaderSearchService} can only be initialized if it successfully injected a {@link SearchService} * and a {@link AbstractHeaderService} instance of any of the supported types was set into it. * * Currently only task and case header searching is supported. */ initializeHeaderSearch() { if (!this._searchService) { this._logger.error('You can\'t call initializeHeaderSearch without providing a SearchService to be injected!'); return; } if (!this._headerService) { this._logger.error('You can\'t call initializeHeaderSearch without setting an AbstractHeaderService implementation instance!'); return; } this._headerSub = this._headerService.headerChange$ .pipe(filter(change => change.changeType === HeaderChangeType.SEARCH || change.changeType === HeaderChangeType.MODE_CHANGED)) .subscribe(change => { if (change.changeType === HeaderChangeType.SEARCH) { this.processSearchChange(change.headerType, change.description); } else if (change.description.previousMode === HeaderMode.SEARCH) { this.processModeChange(); } }); this._searchSub = this._searchService.predicateRemoved$.subscribe(event => this.handlePredicateRemoval(event.index, event.clearInput)); } /** * Pushes all the predicates from the headers into the search interface and clears the header inputs */ processModeChange() { const addedPredicateIds = []; this._columnToConfiguration.forEach(config => { this._searchService.removePredicate(config.predicateId); let editableCategory; if (config.type === HeaderColumnType.META) { editableCategory = this._typeToCategory.get(config.fieldIdentifier).duplicate(); editableCategory.selectDefaultOperator(); editableCategory.setOperands(config.userInput); } else { const dataset = this._typeToCategory.get(HeaderColumnType.IMMEDIATE); editableCategory = dataset.transformToCaseDataset(config.fieldType, config.fieldTitle, config.userInput); } addedPredicateIds.push(this._searchService.addGeneratedLeafPredicate(editableCategory)); }); this._searchService.show(addedPredicateIds); this._columnToConfiguration.clear(); } /** * Transforms the {@link HeaderChange} object into a search predicate */ processSearchChange(headerType, changeDescription) { if (headerType === HeaderType.CASE) { this.processCaseSearch(changeDescription); } } /** * Processes the change object and resolves it into the appropriate case search predicate change * @param changeDescription the change object that should be resolved */ processCaseSearch(changeDescription) { if (this.emptyInput(changeDescription)) { this.removePredicate(changeDescription.columnIdentifier); return; } if (changeDescription.type === HeaderColumnType.META) { this.processCaseMetaSearch(changeDescription); } else { this.processCaseDataSearch(changeDescription); } } /** * Processes the change object of a case meta header and resolves it into the appropriate case search predicate change * @param changeDescription the change object that should be resolved */ processCaseMetaSearch(changeDescription) { const config = { fieldIdentifier: changeDescription.fieldIdentifier, userInput: [changeDescription.searchInput] }; const category = this._typeToCategory.get(config.fieldIdentifier); const predicate = category.generatePredicate(config.userInput); this.addPredicate(changeDescription.columnIdentifier, predicate, { type: HeaderColumnType.META, ...config }); } /** * Processes the change object of a case immediate data header and resolves it into the appropriate case search predicate change * @param changeDescription the change object that should be resolved */ processCaseDataSearch(changeDescription) { this._processService.getNet(changeDescription.petriNetIdentifier).subscribe(net => { const config = { fieldType: changeDescription.fieldType, fieldTitle: changeDescription.fieldTitle, userInput: [changeDescription.searchInput] }; const category = this._typeToCategory.get(changeDescription.type); category.configure(changeDescription.fieldIdentifier, config.fieldType, [net.identifier]); const predicate = category.generatePredicate(config.userInput); this.addPredicate(changeDescription.columnIdentifier, predicate, { type: HeaderColumnType.IMMEDIATE, ...config }); }); } /** * @param changeDescription information about the search header change * @returns whether the input was cleared */ emptyInput(changeDescription) { return changeDescription.searchInput === undefined || changeDescription.searchInput === null || (typeof changeDescription.searchInput === 'string' && changeDescription.searchInput.length === 0); } /** * Updates a Predicate for a given column. * Removes an existing predicate for this column if it exists and adds the new Predicate. * @param column the index of the header column * @param predicate the Predicate that should be added * @param configuration data necessary for the configuration of the {@link Category} that generates the added predicate */ addPredicate(column, predicate, configuration) { this.removePredicate(column, !this._columnToConfiguration.has(column)); const predicateId = this._searchService.addPredicate(predicate); this._columnToConfiguration.set(column, { predicateId, ...configuration }); } /** * Removes a predicate that corresponds to the provided column * @param column the index of the column that cleared it's search * @param clearInput whether the corresponding header search input should be cleared */ removePredicate(column, clearInput = true) { const predicateConfig = this._columnToConfiguration.get(column); if (predicateConfig !== undefined) { this._searchService.removePredicate(predicateConfig.predicateId, clearInput); this._columnToConfiguration.delete(column); } } /** * @param removedId the id of the removed {@link Predicate} * @param clearInput whether the corresponding header search input should be cleared */ handlePredicateRemoval(removedId, clearInput = true) { if (this._headerService && clearInput) { this._headerService.clearHeaderSearch(removedId); } this._columnToConfiguration.delete(removedId); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HeaderSearchService, deps: [{ token: i1.CategoryFactory }, { token: i2.ProcessService }, { token: i3.TranslateService }, { token: i4.LoggerService }, { token: i5.SearchService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HeaderSearchService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HeaderSearchService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.CategoryFactory }, { type: i2.ProcessService }, { type: i3.TranslateService }, { type: i4.LoggerService }, { type: i5.SearchService, decorators: [{ type: Optional }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLXNlYXJjaC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9zZWFyY2gvaGVhZGVyLXNlYXJjaC1zZXJ2aWNlL2hlYWRlci1zZWFyY2guc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFhLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUc5RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBQ3JGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUczRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFFdkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBRXBFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDN0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBR3BFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZDQUE2QyxDQUFDOzs7Ozs7O0FBbUM5RTs7R0FFRztBQUVILE1BQU0sT0FBTyxtQkFBbUI7SUFRTjtJQUNBO0lBQ0E7SUFDQTtJQUNZO0lBVnhCLGNBQWMsQ0FBd0I7SUFDdEMsc0JBQXNCLENBQW1DO0lBQ3pELGVBQWUs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RSxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNPLHNCQUFzQixDQUFDLFNBQWlCLEVBQUUsVUFBVSxHQUFHLElBQUk7UUFDakUsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLFVBQVUsRUFBRTtZQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxDQUFDO3dHQXhOUSxtQkFBbUI7NEdBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBYU0sUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NlYXJjaFNlcnZpY2V9IGZyb20gJy4uL3NlYXJjaC1zZXJ2aWNlL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7QWJzdHJhY3RIZWFkZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9oZWFkZXIvYWJzdHJhY3QtaGVhZGVyLXNlcnZpY2UnO1xuaW1wb3J0IHtIZWFkZXJUeXBlfSBmcm9tICcuLi8uLi9oZWFkZXIvbW9kZWxzL2hlYWRlci10eXBlJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0hlYWRlckNoYW5nZVR5cGV9IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvdXNlci1jaGFuZ2VzL2hlYWRlci1jaGFuZ2UtdHlwZSc7XG5pbXBvcnQge0hlYWRlck1vZGV9IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvaGVhZGVyLW1vZGUnO1xuaW1wb3J0IHtNb2RlQ2hhbmdlRGVzY3JpcHRpb259IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvdXNlci1jaGFuZ2VzL21vZGUtY2hhbmdlLWRlc2NyaXB0aW9uJztcbmltcG9ydCB7U2VhcmNoQ2hhbmdlRGVzY3JpcHRpb259IGZyb20gJy4uLy4uL2hlYWRlci9tb2RlbHMvdXNlci1jaGFuZ2VzL3NlYXJjaC1jaGFuZ2UtZGVzY3JpcHRpb24nO1xuaW1wb3J0IHtIZWFkZXJDb2x1bW5UeXBlfSBmcm9tICcuLi8uLi9oZWFkZXIvbW9kZWxzL2hlYWRlci1jb2x1bW4nO1xuaW1wb3J0IHtDYXNlTWV0YUZpZWxkfSBmcm9tICcuLi8uLi9oZWFkZXIvY2FzZS1oZWFkZXIvY2FzZS1tZW50YS1lbnVtJztcbmltcG9ydCB7Q2F0ZWdvcnlGYWN0b3J5fSBmcm9tICcuLi9jYXRlZ29yeS1mYWN0b3J5L2NhdGVnb3J5LWZhY3RvcnknO1xuaW1wb3J0IHtDYXNlVmlzdWFsSWR9IGZyb20gJy4uL21vZGVscy9jYXRlZ29yeS9jYXNlL2Nhc2UtdmlzdWFsLWlkJztcbmltcG9ydCB7Q2F0ZWdvcnl9IGZyb20gJy4uL21vZGVscy9jYXRlZ29yeS9jYXRlZ29yeSc7XG5pbXBvcnQge0Nhc2VBdXRob3J9IGZyb20gJy4uL21vZGVscy9jYXRlZ29yeS9jYXNlL2Nhc2UtYXV0aG9yJztcbmltcG9ydCB7Q2FzZUNyZWF0aW9uRGF0ZX0gZnJvbSAnLi4vbW9kZWxzL2NhdGVnb3J5L2Nhc2UvY2FzZS1jcmVhdGlvbi1kYXRlJztcbmltcG9ydCB7Q2FzZVRpdGxlfSBmcm9tICcuLi9tb2RlbHMvY2F0ZWdvcnkvY2FzZS9jYXNlLXRpdGxlJztcbmltcG9ydCB7Q2FzZVN0cmluZ0lkfSBmcm9tICcuLi9tb2RlbHMvY2F0ZWdvcnkvY2FzZS9jYXNlLXN0cmluZy1pZCc7XG5pbXBvcnQge1ByZWRpY2F0ZX0gZnJvbSAnLi4vbW9kZWxzL3ByZWRpY2F0ZS9wcmVkaWNhdGUnO1xuaW1wb3J0IHtQcm9jZXNzU2VydmljZX0gZnJvbSAnLi4vLi4vcHJvY2Vzcy9wcm9jZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHtDYXNlU2ltcGxlRGF0YXNldH0gZnJvbSAnLi4vbW9kZWxzL2NhdGVnb3J5L2Nhc2UvY2FzZS1zaW1wbGUtZGF0YXNldCc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9sb2dnZXIvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEhvbGRzIHRoZSBJZCBvZiB0aGUgcHJlZGljYXRlIGluIHRoZSB7QGxpbmsgU2VhcmNoU2VydmljZX1cbiAqL1xuaW50ZXJmYWNlIFByZWRpY2F0ZUlkIHtcbiAgICBwcmVkaWNhdGVJZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhvbGRzIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9mIGEge0BsaW5rIENhdGVnb3J5fSBjbGFzcyB0byBnZW5lcmF0ZVxuICogYSBwcmVkaWNhdGUgZm9yIGEgTWV0YSBoZWFkZXIgZmllbGRcbiAqL1xuaW50ZXJmYWNlIE1ldGFHZW5lcmF0b3JDb25maWd1cmF0aW9uIHtcbiAgICB0eXBlOiBIZWFkZXJDb2x1bW5UeXBlLk1FVEE7XG4gICAgZmllbGRJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgdXNlcklucHV0OiBBcnJheTxhbnk+O1xufVxuXG4vKipcbiAqIEhvbGRzIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9mIGEge0BsaW5rIENhdGVnb3J5fSBjbGFzcyB0byBnZW5lcmF0ZVxuICogYSBwcmVkaWNhdGUgZm9yIGEgRGF0YSBoZWFkZXIgZmllbGRcbiAqL1xuaW50ZXJmYWNlIERhdGFHZW5lcmF0b3JDb25maWd1cmF0aW9uIHtcbiAgICB0eXBlOiBIZWFkZXJDb2x1bW5UeXBlLklNTUVESUFURTtcbiAgICBmaWVsZFR5cGU6IHN0cmluZztcbiAgICBmaWVsZFRpdGxlOiBzdHJpbmc7XG4gICAgdXNlcklucHV0OiBBcnJheTxhbnk+O1xufVxuXG50eXBlIEhlYWRlckNvbmZpZ3VyYXRpb24gPSBQcmVkaWNhdGVJZCAmIChNZXRhR2VuZXJhdG9yQ29uZmlndXJhdGlvbiB8IERhdGFHZW5lcmF0b3JDb25maWd1cmF0aW9uKTtcblxuLyoqXG4gKiBBY3RzIGFzIGFuIGludGVybWVkaWFyeSBiZXR3ZWVuIHRoZSB7QGxpbmsgQWJzdHJhY3RIZWFkZXJTZXJ2aWNlfSBpbnN0YW5jZXMgb2YgdmFyaW91cyB0eXBlcyBhbmQgdGhlIHtAbGluayBTZWFyY2hTZXJ2aWNlfVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSGVhZGVyU2VhcmNoU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBwcm90ZWN0ZWQgX2hlYWRlclNlcnZpY2U6IEFic3RyYWN0SGVhZGVyU2VydmljZTtcbiAgICBwcm90ZWN0ZWQgX2NvbHVtblRvQ29uZmlndXJhdGlvbjogTWFwPG51bWJlciwgSGVhZGVyQ29uZmlndXJhdGlvbj47XG4gICAgcHJvdGVjdGVkIF90eXBlVG9DYXRlZ29yeTogTWFwPHN0cmluZywgQ2F0ZWdvcnk8YW55Pj47XG4gICAgcHJvdGVjdGVkIF9oZWFkZXJTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgX3NlYXJjaFN1YjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9jYXRlZ29yeUZhY3Rvcnk6IENhdGVnb3J5RmFjdG9yeSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Byb2Nlc3NTZXJ2aWNlOiBQcm9jZXNzU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgX3NlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uVG9Db25maWd1cmF0aW9uID0gbmV3IE1hcDxudW1iZXIsIEhlYWRlckNvbmZpZ3VyYXRpb24+KCk7XG4gICAgICAgIHRoaXMuX3R5cGVUb0NhdGVnb3J5ID0gbmV3IE1hcDxzdHJpbmcsIENhdGVnb3J5PGFueT4+KCk7XG4gICAgICAgIFtcbiAgICAgICAgICAgIHtrOiBDYXNlTWV0YUZpZWxkLlZJU1VBTF9JRCwgdjogQ2FzZVZpc3VhbElkfSxcbiAgICAgICAgICAgIHtrOiBDYXNlTWV0YUZpZWxkLlRJVExFLCB2OiBDYXNlVGl0bGV9LFxuICAgICAgICAgICAge2s6IENhc2VNZXRhRmllbGQuQ1JFQVRJT05fREFURSwgdjogQ2FzZUNyZWF0aW9uRGF0ZX0sXG4gICAgICAgICAgICB7azogQ2FzZU1ldGFGaWVsZC5BVVRIT1IsIHY6IENhc2VBdXRob3J9LFxuICAgICAgICAgICAge2s6IENhc2VNZXRhRmllbGQuTU9OR09fSUQsIHY6IENhc2VTdHJpbmdJZH1cbiAgICAgICAgXS5mb3JFYWNoKHBhaXIgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdHlwZVRvQ2F0ZWdvcnkuc2V0KHBhaXIuaywgdGhpcy5fY2F0ZWdvcnlGYWN0b3J5LmdldFdpdGhEZWZhdWx0T3BlcmF0b3IocGFpci52KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90eXBlVG9DYXRlZ29yeS5zZXQoSGVhZGVyQ29sdW1uVHlwZS5JTU1FRElBVEUsIHRoaXMuX2NhdGVnb3J5RmFjdG9yeS5nZXQoQ2FzZVNpbXBsZURhdGFzZXQpKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2hlYWRlclN1Yikge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NlYXJjaFN1Yikge1xuICAgICAgICAgICAgdGhpcy5fc2VhcmNoU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjYXQgb2YgdGhpcy5fdHlwZVRvQ2F0ZWdvcnkudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGNhdC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhlYWRlclNlcnZpY2UoaGVhZGVyU2VydmljZTogQWJzdHJhY3RIZWFkZXJTZXJ2aWNlKSB7XG4gICAgICAgIGlmIChoZWFkZXJTZXJ2aWNlLmhlYWRlclR5cGUgPT09IEhlYWRlclR5cGUuQ0FTRSB8fCBoZWFkZXJTZXJ2aWNlLmhlYWRlclR5cGUgPT09IEhlYWRlclR5cGUuVEFTSykge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyU2VydmljZSA9IGhlYWRlclNlcnZpY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGVhZGVyU2VydmljZSAmJiB0aGlzLl9zZWFyY2hTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVIZWFkZXJTZWFyY2goKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAbGluayBIZWFkZXJTZWFyY2hTZXJ2aWNlfSBjYW4gb25seSBiZSBpbml0aWFsaXplZCBpZiBpdCBzdWNjZXNzZnVsbHkgaW5qZWN0ZWQgYSB7QGxpbmsgU2VhcmNoU2VydmljZX1cbiAgICAgKiBhbmQgYSB7QGxpbmsgQWJzdHJhY3RIZWFkZXJTZXJ2aWNlfSBpbnN0YW5jZSBvZiBhbnkgb2YgdGhlIHN1cHBvcnRlZCB0eXBlcyB3YXMgc2V0IGludG8gaXQuXG4gICAgICpcbiAgICAgKiBDdXJyZW50bHkgb25seSB0YXNrIGFuZCBjYXNlIGhlYWRlciBzZWFyY2hpbmcgaXMgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpbml0aWFsaXplSGVhZGVyU2VhcmNoKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX3NlYXJjaFNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignWW91IGNhblxcJ3QgY2FsbCBpbml0aWFsaXplSGVhZGVyU2VhcmNoIHdpdGhvdXQgcHJvdmlkaW5nIGEgU2VhcmNoU2VydmljZSB0byBiZSBpbmplY3RlZCEnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWRlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignWW91IGNhblxcJ3QgY2FsbCBpbml0aWFsaXplSGVhZGVyU2VhcmNoIHdpdGhvdXQgc2V0dGluZyBhbiBBYnN0cmFjdEhlYWRlclNlcnZpY2UgaW1wbGVtZW50YXRpb24gaW5zdGFuY2UhJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9oZWFkZXJTdWIgPSB0aGlzLl9oZWFkZXJTZXJ2aWNlLmhlYWRlckNoYW5nZSRcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcihjaGFuZ2UgPT4gY2hhbmdlLmNoYW5nZVR5cGUgPT09IEhlYWRlckNoYW5nZVR5cGUuU0VBUkNIIHx8IGNoYW5nZS5jaGFuZ2VUeXBlID09PSBIZWFkZXJDaGFuZ2VUeXBlLk1PREVfQ0hBTkdFRCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGNoYW5nZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBIZWFkZXJDaGFuZ2VUeXBlLlNFQVJDSCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTZWFyY2hDaGFuZ2UoY2hhbmdlLmhlYWRlclR5cGUsIGNoYW5nZS5kZXNjcmlwdGlvbiBhcyBTZWFyY2hDaGFuZ2VEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY2hhbmdlLmRlc2NyaXB0aW9uIGFzIE1vZGVDaGFuZ2VEZXNjcmlwdGlvbikucHJldmlvdXNNb2RlID09PSBIZWFkZXJNb2RlLlNFQVJDSCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NNb2RlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fc2VhcmNoU3ViID1cbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFNlcnZpY2UucHJlZGljYXRlUmVtb3ZlZCQuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuaGFuZGxlUHJlZGljYXRlUmVtb3ZhbChldmVudC5pbmRleCwgZXZlbnQuY2xlYXJJbnB1dCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhbGwgdGhlIHByZWRpY2F0ZXMgZnJvbSB0aGUgaGVhZGVycyBpbnRvIHRoZSBzZWFyY2ggaW50ZXJmYWNlIGFuZCBjbGVhcnMgdGhlIGhlYWRlciBpbnB1dHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc01vZGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFkZGVkUHJlZGljYXRlSWRzID0gW107XG4gICAgICAgIHRoaXMuX2NvbHVtblRvQ29uZmlndXJhdGlvbi5mb3JFYWNoKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hTZXJ2aWNlLnJlbW92ZVByZWRpY2F0ZShjb25maWcucHJlZGljYXRlSWQpO1xuXG4gICAgICAgICAgICBsZXQgZWRpdGFibGVDYXRlZ29yeTtcbiAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gSGVhZGVyQ29sdW1uVHlwZS5NRVRBKSB7XG4gICAgICAgICAgICAgICAgZWRpdGFibGVDYXRlZ29yeSA9IHRoaXMuX3R5cGVUb0NhdGVnb3J5LmdldChjb25maWcuZmllbGRJZGVudGlmaWVyKS5kdXBsaWNhdGUoKTtcbiAgICAgICAgICAgICAgICBlZGl0YWJsZUNhdGVnb3J5LnNlbGVjdERlZmF1bHRPcGVyYXRvcigpO1xuICAgICAgICAgICAgICAgIGVkaXRhYmxlQ2F0ZWdvcnkuc2V0T3BlcmFuZHMoY29uZmlnLnVzZXJJbnB1dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFzZXQgPSAodGhpcy5fdHlwZVRvQ2F0ZWdvcnkuZ2V0KEhlYWRlckNvbHVtblR5cGUuSU1NRURJQVRFKSBhcyBDYXNlU2ltcGxlRGF0YXNldCk7XG4gICAgICAgICAgICAgICAgZWRpdGFibGVDYXRlZ29yeSA9IGRhdGFzZXQudHJhbnNmb3JtVG9DYXNlRGF0YXNldChjb25maWcuZmllbGRUeXBlLCBjb25maWcuZmllbGRUaXRsZSwgY29uZmlnLnVzZXJJbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRlZFByZWRpY2F0ZUlkcy5wdXNoKHRoaXMuX3NlYXJjaFNlcnZpY2UuYWRkR2VuZXJhdGVkTGVhZlByZWRpY2F0ZShlZGl0YWJsZUNhdGVnb3J5KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3NlYXJjaFNlcnZpY2Uuc2hvdyhhZGRlZFByZWRpY2F0ZUlkcyk7XG5cbiAgICAgICAgdGhpcy5fY29sdW1uVG9Db25maWd1cmF0aW9uLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtcyB0aGUge0BsaW5rIEhlYWRlckNoYW5nZX0gb2JqZWN0IGludG8gYSBzZWFyY2ggcHJlZGljYXRlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NTZWFyY2hDaGFuZ2UoaGVhZGVyVHlwZTogSGVhZGVyVHlwZSwgY2hhbmdlRGVzY3JpcHRpb246IFNlYXJjaENoYW5nZURlc2NyaXB0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChoZWFkZXJUeXBlID09PSBIZWFkZXJUeXBlLkNBU0UpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Nhc2VTZWFyY2goY2hhbmdlRGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIHRoZSBjaGFuZ2Ugb2JqZWN0IGFuZCByZXNvbHZlcyBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBjYXNlIHNlYXJjaCBwcmVkaWNhdGUgY2hhbmdlXG4gICAgICogQHBhcmFtIGNoYW5nZURlc2NyaXB0aW9uIHRoZSBjaGFuZ2Ugb2JqZWN0IHRoYXQgc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDYXNlU2VhcmNoKGNoYW5nZURlc2NyaXB0aW9uOiBTZWFyY2hDaGFuZ2VEZXNjcmlwdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5lbXB0eUlucHV0KGNoYW5nZURlc2NyaXB0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVQcmVkaWNhdGUoY2hhbmdlRGVzY3JpcHRpb24uY29sdW1uSWRlbnRpZmllcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlRGVzY3JpcHRpb24udHlwZSA9PT0gSGVhZGVyQ29sdW1uVHlwZS5NRVRBKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDYXNlTWV0YVNlYXJjaChjaGFuZ2VEZXNjcmlwdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDYXNlRGF0YVNlYXJjaChjaGFuZ2VEZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGNoYW5nZSBvYmplY3Qgb2YgYSBjYXNlIG1ldGEgaGVhZGVyIGFuZCByZXNvbHZlcyBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBjYXNlIHNlYXJjaCBwcmVkaWNhdGUgY2hhbmdlXG4gICAgICogQHBhcmFtIGNoYW5nZURlc2NyaXB0aW9uIHRoZSBjaGFuZ2Ugb2JqZWN0IHRoYXQgc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NDYXNlTWV0YVNlYXJjaChjaGFuZ2VEZXNjcmlwdGlvbjogU2VhcmNoQ2hhbmdlRGVzY3JpcHRpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgZmllbGRJZGVudGlmaWVyOiBjaGFuZ2VEZXNjcmlwdGlvbi5maWVsZElkZW50aWZpZXIsXG4gICAgICAgICAgICB1c2VySW5wdXQ6IFtjaGFuZ2VEZXNjcmlwdGlvbi5zZWFyY2hJbnB1dF1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0aGlzLl90eXBlVG9DYXRlZ29yeS5nZXQoY29uZmlnLmZpZWxkSWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZSA9IGNhdGVnb3J5LmdlbmVyYXRlUHJlZGljYXRlKGNvbmZpZy51c2VySW5wdXQpO1xuICAgICAgICB0aGlzLmFkZFByZWRpY2F0ZShjaGFuZ2VEZXNjcmlwdGlvbi5jb2x1bW5JZGVudGlmaWVyLCBwcmVkaWNhdGUsIHtcbiAgICAgICAgICAgIHR5cGU6IEhlYWRlckNvbHVtblR5cGUuTUVUQSxcbiAgICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgdGhlIGNoYW5nZSBvYmplY3Qgb2YgYSBjYXNlIGltbWVkaWF0ZSBkYXRhIGhlYWRlciBhbmQgcmVzb2x2ZXMgaXQgaW50byB0aGUgYXBwcm9wcmlhdGUgY2FzZSBzZWFyY2ggcHJlZGljYXRlIGNoYW5nZVxuICAgICAqIEBwYXJhbSBjaGFuZ2VEZXNjcmlwdGlvbiB0aGUgY2hhbmdlIG9iamVjdCB0aGF0IHNob3VsZCBiZSByZXNvbHZlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzQ2FzZURhdGFTZWFyY2goY2hhbmdlRGVzY3JpcHRpb246IFNlYXJjaENoYW5nZURlc2NyaXB0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NTZXJ2aWNlLmdldE5ldChjaGFuZ2VEZXNjcmlwdGlvbi5wZXRyaU5ldElkZW50aWZpZXIpLnN1YnNjcmliZShuZXQgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGZpZWxkVHlwZTogY2hhbmdlRGVzY3JpcHRpb24uZmllbGRUeXBlLFxuICAgICAgICAgICAgICAgIGZpZWxkVGl0bGU6IGNoYW5nZURlc2NyaXB0aW9uLmZpZWxkVGl0bGUsXG4gICAgICAgICAgICAgICAgdXNlcklucHV0OiBbY2hhbmdlRGVzY3JpcHRpb24uc2VhcmNoSW5wdXRdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0aGlzLl90eXBlVG9DYXRlZ29yeS5nZXQoY2hhbmdlRGVzY3JpcHRpb24udHlwZSkgYXMgQ2FzZVNpbXBsZURhdGFzZXQ7XG4gICAgICAgICAgICBjYXRlZ29yeS5jb25maWd1cmUoY2hhbmdlRGVzY3JpcHRpb24uZmllbGRJZGVudGlmaWVyLCBjb25maWcuZmllbGRUeXBlLCBbbmV0LmlkZW50aWZpZXJdKTtcbiAgICAgICAgICAgIGNvbnN0IHByZWRpY2F0ZSA9IGNhdGVnb3J5LmdlbmVyYXRlUHJlZGljYXRlKGNvbmZpZy51c2VySW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5hZGRQcmVkaWNhdGUoY2hhbmdlRGVzY3JpcHRpb24uY29sdW1uSWRlbnRpZmllciwgcHJlZGljYXRlLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogSGVhZGVyQ29sdW1uVHlwZS5JTU1FRElBVEUsXG4gICAgICAgICAgICAgICAgLi4uY29uZmlnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNoYW5nZURlc2NyaXB0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWFyY2ggaGVhZGVyIGNoYW5nZVxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGlucHV0IHdhcyBjbGVhcmVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGVtcHR5SW5wdXQoY2hhbmdlRGVzY3JpcHRpb246IFNlYXJjaENoYW5nZURlc2NyaXB0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VEZXNjcmlwdGlvbi5zZWFyY2hJbnB1dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICB8fCBjaGFuZ2VEZXNjcmlwdGlvbi5zZWFyY2hJbnB1dCA9PT0gbnVsbFxuICAgICAgICAgICAgfHwgKHR5cGVvZiBjaGFuZ2VEZXNjcmlwdGlvbi5zZWFyY2hJbnB1dCA9PT0gJ3N0cmluZycgJiYgY2hhbmdlRGVzY3JpcHRpb24uc2VhcmNoSW5wdXQubGVuZ3RoID09PSAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGEgUHJlZGljYXRlIGZvciBhIGdpdmVuIGNvbHVtbi5cbiAgICAgKiBSZW1vdmVzIGFuIGV4aXN0aW5nIHByZWRpY2F0ZSBmb3IgdGhpcyBjb2x1bW4gaWYgaXQgZXhpc3RzIGFuZCBhZGRzIHRoZSBuZXcgUHJlZGljYXRlLlxuICAgICAqIEBwYXJhbSBjb2x1bW4gdGhlIGluZGV4IG9mIHRoZSBoZWFkZXIgY29sdW1uXG4gICAgICogQHBhcmFtIHByZWRpY2F0ZSB0aGUgUHJlZGljYXRlIHRoYXQgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gZGF0YSBuZWNlc3NhcnkgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSB7QGxpbmsgQ2F0ZWdvcnl9IHRoYXQgZ2VuZXJhdGVzIHRoZSBhZGRlZCBwcmVkaWNhdGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkUHJlZGljYXRlKGNvbHVtbjogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiBQcmVkaWNhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiBNZXRhR2VuZXJhdG9yQ29uZmlndXJhdGlvbiB8IERhdGFHZW5lcmF0b3JDb25maWd1cmF0aW9uKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVQcmVkaWNhdGUoY29sdW1uLCAhdGhpcy5fY29sdW1uVG9Db25maWd1cmF0aW9uLmhhcyhjb2x1bW4pKTtcbiAgICAgICAgY29uc3QgcHJlZGljYXRlSWQgPSB0aGlzLl9zZWFyY2hTZXJ2aWNlLmFkZFByZWRpY2F0ZShwcmVkaWNhdGUpO1xuICAgICAgICB0aGlzLl9jb2x1bW5Ub0NvbmZpZ3VyYXRpb24uc2V0KGNvbHVtbiwge3ByZWRpY2F0ZUlkLCAuLi5jb25maWd1cmF0aW9ufSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHByZWRpY2F0ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwcm92aWRlZCBjb2x1bW5cbiAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRoYXQgY2xlYXJlZCBpdCdzIHNlYXJjaFxuICAgICAqIEBwYXJhbSBjbGVhcklucHV0IHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgaGVhZGVyIHNlYXJjaCBpbnB1dCBzaG91bGQgYmUgY2xlYXJlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW1vdmVQcmVkaWNhdGUoY29sdW1uOiBudW1iZXIsIGNsZWFySW5wdXQgPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZUNvbmZpZyA9IHRoaXMuX2NvbHVtblRvQ29uZmlndXJhdGlvbi5nZXQoY29sdW1uKTtcbiAgICAgICAgaWYgKHByZWRpY2F0ZUNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hTZXJ2aWNlLnJlbW92ZVByZWRpY2F0ZShwcmVkaWNhdGVDb25maWcucHJlZGljYXRlSWQsIGNsZWFySW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5fY29sdW1uVG9Db25maWd1cmF0aW9uLmRlbGV0ZShjb2x1bW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHJlbW92ZWRJZCB0aGUgaWQgb2YgdGhlIHJlbW92ZWQge0BsaW5rIFByZWRpY2F0ZX1cbiAgICAgKiBAcGFyYW0gY2xlYXJJbnB1dCB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGhlYWRlciBzZWFyY2ggaW5wdXQgc2hvdWxkIGJlIGNsZWFyZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlUHJlZGljYXRlUmVtb3ZhbChyZW1vdmVkSWQ6IG51bWJlciwgY2xlYXJJbnB1dCA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2hlYWRlclNlcnZpY2UgJiYgY2xlYXJJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyU2VydmljZS5jbGVhckhlYWRlclNlYXJjaChyZW1vdmVkSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbHVtblRvQ29uZmlndXJhdGlvbi5kZWxldGUocmVtb3ZlZElkKTtcbiAgICB9XG59XG4iXX0=