UNPKG

acr-assist-simulator-module

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.

417 lines (416 loc) 45.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { EqualCondition } from '../../../core/rules/equal-condition'; import { ConditionType } from '../../../core/models/conditiontype.model'; import { GreaterThanCondition } from '../../../core/rules/greater-than-condition'; import { LessThanCondition } from '../../../core/rules/less-than-condition'; import { GreaterThanOrEqualsCondition } from '../../../core/rules/greater-than-or-equals-condition'; import { LessThanOrEqualsCondition } from '../../../core/rules/less-than-or-equals-condition'; import { ContainsCondition } from '../../../core/rules/contains-condition'; import { AndCondition } from '../../../core/rules/and-condition'; import { OrCondition } from '../../../core/rules/or-condition'; import { ArrayCheckerService } from './array-checker.service'; import { NotCondition } from '../../../core/rules/not-condition'; var ConditionsCreationService = /** @class */ (function () { function ConditionsCreationService(arrayCheckerService) { this.arrayCheckerService = arrayCheckerService; } /** * @param {?} conditionJSON * @return {?} */ ConditionsCreationService.prototype.returnConditionType = /** * @param {?} conditionJSON * @return {?} */ function (conditionJSON) { var /** @type {?} */ conditionType = new ConditionType(); conditionType.comparisonValue = conditionJSON.Attr.ComparisonValue; conditionType.dataElementId = conditionJSON.Attr.DataElementId; return conditionType; }; /** * @param {?} branchJSON * @return {?} */ ConditionsCreationService.prototype.returnCondition = /** * @param {?} branchJSON * @return {?} */ function (branchJSON) { var /** @type {?} */ condition; if (branchJSON.hasOwnProperty('EqualCondition')) { condition = new EqualCondition(this.returnConditionType(branchJSON.EqualCondition)); } if (branchJSON.hasOwnProperty('GreaterThanCondition')) { condition = new GreaterThanCondition(this.returnConditionType(branchJSON.GreaterThanCondition)); } if (branchJSON.hasOwnProperty('LessThanCondition')) { condition = new LessThanCondition(this.returnConditionType(branchJSON.LessThanCondition)); } if (branchJSON.hasOwnProperty('GreaterThanOrEqualsCondition')) { condition = new GreaterThanOrEqualsCondition(this.returnConditionType(branchJSON.GreaterThanOrEqualsCondition)); } if (branchJSON.hasOwnProperty('LessThanOrEqualsCondition')) { condition = new LessThanOrEqualsCondition(this.returnConditionType(branchJSON.LessThanOrEqualsCondition)); } if (branchJSON.hasOwnProperty('ContainsCondition')) { condition = new ContainsCondition(this.returnConditionType(branchJSON.ContainsCondition)); } // if (condition !== undefined) { // condition.IsRelevant = branchJSON.IsRelevant !== undefined // ? branchJSON.IsRelevant : false; // } // condition.IsRelevant = branchJSON.IsRelevant !== undefined // ? branchJSON.IsRelevant : true; return condition; }; /** * @param {?} compositeElementJSON * @return {?} */ ConditionsCreationService.prototype.isComposite = /** * @param {?} compositeElementJSON * @return {?} */ function (compositeElementJSON) { return compositeElementJSON.hasOwnProperty('AndCondition') || compositeElementJSON.hasOwnProperty('OrCondition') || compositeElementJSON.hasOwnProperty('NotCondition'); }; /** * @param {?} conditionIdentifier * @param {?} conditionJSON * @return {?} */ ConditionsCreationService.prototype.returnConditionFromJSON = /** * @param {?} conditionIdentifier * @param {?} conditionJSON * @return {?} */ function (conditionIdentifier, conditionJSON) { var /** @type {?} */ condition; if (conditionIdentifier === 'EqualCondition') { condition = new EqualCondition(this.returnConditionType(conditionJSON)); } if (conditionIdentifier === 'GreaterThanCondition') { condition = new GreaterThanCondition(this.returnConditionType(conditionJSON)); } if (conditionIdentifier === 'LessThanCondition') { condition = new LessThanCondition(this.returnConditionType(conditionJSON)); } if (conditionIdentifier === 'GreaterThanOrEqualsCondition') { condition = new GreaterThanOrEqualsCondition(this.returnConditionType(conditionJSON)); } if (conditionIdentifier === 'LessThanOrEqualsCondition') { condition = new LessThanOrEqualsCondition(this.returnConditionType(conditionJSON)); } if (conditionIdentifier === 'ContainsCondition') { condition = new ContainsCondition(this.returnConditionType(conditionJSON)); } return condition; }; /** * @param {?} conditionsJSON * @return {?} */ ConditionsCreationService.prototype.returnConditions = /** * @param {?} conditionsJSON * @return {?} */ function (conditionsJSON) { var /** @type {?} */ conditions; var /** @type {?} */ conditionIdentifiers = ['EqualCondition', 'GreaterThanCondition', 'LessThanCondition', 'GreaterThanOrEqualsCondition', 'LessThanOrEqualsCondition', 'ContainsCondition']; try { for (var conditionIdentifiers_1 = tslib_1.__values(conditionIdentifiers), conditionIdentifiers_1_1 = conditionIdentifiers_1.next(); !conditionIdentifiers_1_1.done; conditionIdentifiers_1_1 = conditionIdentifiers_1.next()) { var conditionIdentifier = conditionIdentifiers_1_1.value; var /** @type {?} */ conditionJSON = conditionsJSON[conditionIdentifier]; if (conditionJSON !== undefined) { conditions = new Array(); if (this.arrayCheckerService.isArray(conditionJSON)) { try { for (var conditionJSON_1 = tslib_1.__values(conditionJSON), conditionJSON_1_1 = conditionJSON_1.next(); !conditionJSON_1_1.done; conditionJSON_1_1 = conditionJSON_1.next()) { var jsonValue = conditionJSON_1_1.value; conditions.push(this.returnConditionFromJSON(conditionIdentifier, jsonValue)); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (conditionJSON_1_1 && !conditionJSON_1_1.done && (_a = conditionJSON_1.return)) _a.call(conditionJSON_1); } finally { if (e_1) throw e_1.error; } } } else { conditions.push(this.returnConditionFromJSON(conditionIdentifier, conditionJSON)); } } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (conditionIdentifiers_1_1 && !conditionIdentifiers_1_1.done && (_b = conditionIdentifiers_1.return)) _b.call(conditionIdentifiers_1); } finally { if (e_2) throw e_2.error; } } return conditions; var e_2, _b, e_1, _a; }; /** * @param {?} compositeElementJSON * @return {?} */ ConditionsCreationService.prototype.isHybrid = /** * @param {?} compositeElementJSON * @return {?} */ function (compositeElementJSON) { var /** @type {?} */ compositeExists = compositeElementJSON.hasOwnProperty('AndCondition') || compositeElementJSON.hasOwnProperty('OrCondition') || compositeElementJSON.hasOwnProperty('NotCondition'); var /** @type {?} */ primitiveExists = compositeElementJSON.hasOwnProperty('EqualCondition') || compositeElementJSON.hasOwnProperty('GreaterThanCondition') || compositeElementJSON.hasOwnProperty('LessThanCondition') || compositeElementJSON.hasOwnProperty('GreaterThanOrEqualsCondition') || compositeElementJSON.hasOwnProperty('LessThanOrEqualsCondition') || compositeElementJSON.hasOwnProperty('ContainsCondition'); return compositeExists && primitiveExists; }; /** * @param {?} data * @return {?} */ ConditionsCreationService.prototype.returnCompositeCondition = /** * @param {?} data * @return {?} */ function (data) { if (!this.isComposite(data)) { return; } var /** @type {?} */ compositeConditionJSON; var /** @type {?} */ compositeCondition; if (data.hasOwnProperty('AndCondition')) { compositeConditionJSON = data.AndCondition; compositeCondition = new AndCondition(); } else if (data.hasOwnProperty('OrCondition')) { compositeConditionJSON = data.OrCondition; compositeCondition = new OrCondition(); } else if (data.hasOwnProperty('NotCondition')) { compositeConditionJSON = data.NotCondition; compositeCondition = new NotCondition(); } // if (data.hasOwnProperty('IsRelevant')){ // compositeConditionJSON += data.IsRelevant; // } if (!this.isComposite(compositeConditionJSON)) { compositeCondition.conditions = this.returnConditions(compositeConditionJSON); } else if (this.isHybrid(compositeConditionJSON)) { var /** @type {?} */ jsonKeys = Object.keys(compositeConditionJSON); try { for (var jsonKeys_1 = tslib_1.__values(jsonKeys), jsonKeys_1_1 = jsonKeys_1.next(); !jsonKeys_1_1.done; jsonKeys_1_1 = jsonKeys_1.next()) { var jsonKey = jsonKeys_1_1.value; var /** @type {?} */ jsonValue = compositeConditionJSON[jsonKey]; var /** @type {?} */ jsonString = '{"' + jsonKey + '":' + JSON.stringify(jsonValue) + '}'; var /** @type {?} */ jsonObject = JSON.parse(jsonString); if (this.isComposite(jsonObject)) { this.returnInnerConditions(jsonObject, compositeCondition); } else { if (this.arrayCheckerService.isArray(jsonValue)) { try { for (var jsonValue_1 = tslib_1.__values(jsonValue), jsonValue_1_1 = jsonValue_1.next(); !jsonValue_1_1.done; jsonValue_1_1 = jsonValue_1.next()) { var arrayValue = jsonValue_1_1.value; compositeCondition.conditions.push(this.returnConditionFromJSON(jsonKey, arrayValue)); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (jsonValue_1_1 && !jsonValue_1_1.done && (_a = jsonValue_1.return)) _a.call(jsonValue_1); } finally { if (e_3) throw e_3.error; } } } else { compositeCondition.conditions.push(this.returnConditionFromJSON(jsonKey, jsonValue)); } } } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (jsonKeys_1_1 && !jsonKeys_1_1.done && (_b = jsonKeys_1.return)) _b.call(jsonKeys_1); } finally { if (e_4) throw e_4.error; } } } else { this.returnInnerConditions(compositeConditionJSON, compositeCondition); } return compositeCondition; var e_4, _b, e_3, _a; }; /** * @param {?} elementName * @return {?} */ ConditionsCreationService.prototype.returnCompositeConditionFromName = /** * @param {?} elementName * @return {?} */ function (elementName) { var /** @type {?} */ compositeCondition; switch (elementName) { case 'AndCondition': { compositeCondition = new AndCondition(); break; } case 'OrCondition': { compositeCondition = new OrCondition(); break; } case 'NotCondition': { compositeCondition = new NotCondition(); } } return compositeCondition; }; /** * @param {?} key * @param {?} value * @param {?} compositeCondition * @return {?} */ ConditionsCreationService.prototype.addConditionsToInnerConditions = /** * @param {?} key * @param {?} value * @param {?} compositeCondition * @return {?} */ function (key, value, compositeCondition) { var /** @type {?} */ condition = this.returnCompositeConditionFromName(key); compositeCondition.conditions.push(condition); if (this.isHybrid(value)) { var /** @type {?} */ jsonKeys = Object.keys(value); try { for (var jsonKeys_2 = tslib_1.__values(jsonKeys), jsonKeys_2_1 = jsonKeys_2.next(); !jsonKeys_2_1.done; jsonKeys_2_1 = jsonKeys_2.next()) { var jsonKey = jsonKeys_2_1.value; var /** @type {?} */ jsonValue = value[jsonKey]; var /** @type {?} */ jsonString = '{"' + jsonKey + '":' + JSON.stringify(jsonValue) + '}'; var /** @type {?} */ jsonObject = JSON.parse(jsonString); if (this.isComposite(jsonObject)) { this.returnInnerConditions(jsonObject, condition); } else { if (this.arrayCheckerService.isArray(jsonValue)) { try { for (var jsonValue_2 = tslib_1.__values(jsonValue), jsonValue_2_1 = jsonValue_2.next(); !jsonValue_2_1.done; jsonValue_2_1 = jsonValue_2.next()) { var arrayValue = jsonValue_2_1.value; condition.conditions.push(this.returnConditionFromJSON(jsonKey, arrayValue)); } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (jsonValue_2_1 && !jsonValue_2_1.done && (_a = jsonValue_2.return)) _a.call(jsonValue_2); } finally { if (e_5) throw e_5.error; } } } else { condition.conditions.push(this.returnConditionFromJSON(jsonKey, jsonValue)); } } } } catch (e_6_1) { e_6 = { error: e_6_1 }; } finally { try { if (jsonKeys_2_1 && !jsonKeys_2_1.done && (_b = jsonKeys_2.return)) _b.call(jsonKeys_2); } finally { if (e_6) throw e_6.error; } } } else if (this.isComposite(value)) { // console.log( 'isComposite'); } else { condition.conditions = this.returnConditions(value); } var e_6, _b, e_5, _a; }; /** * @param {?} innerConditionsJSON * @param {?} compositeCondition * @return {?} */ ConditionsCreationService.prototype.returnInnerConditions = /** * @param {?} innerConditionsJSON * @param {?} compositeCondition * @return {?} */ function (innerConditionsJSON, compositeCondition) { var /** @type {?} */ jsonKeys = Object.keys(innerConditionsJSON); try { for (var jsonKeys_3 = tslib_1.__values(jsonKeys), jsonKeys_3_1 = jsonKeys_3.next(); !jsonKeys_3_1.done; jsonKeys_3_1 = jsonKeys_3.next()) { var key = jsonKeys_3_1.value; var /** @type {?} */ values = innerConditionsJSON[key]; if (this.arrayCheckerService.isArray(values)) { try { for (var values_1 = tslib_1.__values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) { var value = values_1_1.value; this.addConditionsToInnerConditions(key, value, compositeCondition); } } catch (e_7_1) { e_7 = { error: e_7_1 }; } finally { try { if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1); } finally { if (e_7) throw e_7.error; } } } else { this.addConditionsToInnerConditions(key, innerConditionsJSON[key], compositeCondition); } } } catch (e_8_1) { e_8 = { error: e_8_1 }; } finally { try { if (jsonKeys_3_1 && !jsonKeys_3_1.done && (_b = jsonKeys_3.return)) _b.call(jsonKeys_3); } finally { if (e_8) throw e_8.error; } } var e_8, _b, e_7, _a; }; ConditionsCreationService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ ConditionsCreationService.ctorParameters = function () { return [ { type: ArrayCheckerService } ]; }; return ConditionsCreationService; }()); export { ConditionsCreationService }; function ConditionsCreationService_tsickle_Closure_declarations() { /** @type {?} */ ConditionsCreationService.prototype.arrayCheckerService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9ucy1jcmVhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy9jb25kaXRpb25zLWNyZWF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDNUUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDcEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDOUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0lBTzlELG1DQUFxQixtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtLQUFLOzs7OztJQUV6RCx1REFBbUI7Ozs7Y0FBQyxhQUFrQjtRQUM1QyxxQkFBTSxhQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUMxQyxhQUFhLENBQUMs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bEQsR0FBRyxDQUFDLENBQWMsSUFBQSxhQUFBLGlCQUFBLFFBQVEsQ0FBQSxrQ0FBQTtnQkFBckIsSUFBTSxHQUFHLHFCQUFBO2dCQUNWLHFCQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7O3dCQUM1QyxHQUFHLENBQUMsQ0FBZ0IsSUFBQSxXQUFBLGlCQUFBLE1BQU0sQ0FBQSw4QkFBQTs0QkFBckIsSUFBTSxLQUFLLG1CQUFBOzRCQUNaLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7eUJBQ3ZFOzs7Ozs7Ozs7aUJBQ0g7Z0JBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ0osSUFBSSxDQUFDLDhCQUE4QixDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2lCQUN4RjthQUNGOzs7Ozs7Ozs7Ozs7Z0JBbk9aLFVBQVU7Ozs7Z0JBSEYsbUJBQW1COztvQ0FaNUI7O1NBZ0JhLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBFcXVhbENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZXF1YWwtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uVHlwZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2NvbmRpdGlvbnR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBHcmVhdGVyVGhhbkNvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZ3JlYXRlci10aGFuLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IExlc3NUaGFuQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9sZXNzLXRoYW4tY29uZGl0aW9uJztcclxuaW1wb3J0IHsgR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZ3JlYXRlci10aGFuLW9yLWVxdWFscy1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9sZXNzLXRoYW4tb3ItZXF1YWxzLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IENvbnRhaW5zQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9jb250YWlucy1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb21wb3NpdGVDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbXBvc2l0ZS1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBBbmRDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL2FuZC1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBPckNvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvb3ItY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQXJyYXlDaGVja2VyU2VydmljZSB9IGZyb20gJy4vYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90Q29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9ub3QtY29uZGl0aW9uJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2Uge1xyXG5cclxuXHJcblxyXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlICBhcnJheUNoZWNrZXJTZXJ2aWNlOiBBcnJheUNoZWNrZXJTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICBwcml2YXRlIHJldHVybkNvbmRpdGlvblR5cGUoY29uZGl0aW9uSlNPTjogYW55KTogQ29uZGl0aW9uVHlwZSB7XHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvblR5cGUgPSBuZXcgQ29uZGl0aW9uVHlwZSgpO1xyXG4gICAgICBjb25kaXRpb25UeXBlLmNvbXBhcmlzb25WYWx1ZSA9IGNvbmRpdGlvbkpTT04uQXR0ci5Db21wYXJpc29uVmFsdWU7XHJcbiAgICAgIGNvbmRpdGlvblR5cGUuZGF0YUVsZW1lbnRJZCA9IGNvbmRpdGlvbkpTT04uQXR0ci5EYXRhRWxlbWVudElkO1xyXG4gICAgICByZXR1cm4gY29uZGl0aW9uVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5Db25kaXRpb24oYnJhbmNoSlNPTjogYW55KTogQ29uZGl0aW9uIHtcclxuICAgICAgICBsZXQgY29uZGl0aW9uOiBDb25kaXRpb247XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0VxdWFsQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gbmV3IEVxdWFsQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkVxdWFsQ29uZGl0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChicmFuY2hKU09OLmhhc093blByb3BlcnR5KCdHcmVhdGVyVGhhbkNvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgR3JlYXRlclRoYW5Db25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGJyYW5jaEpTT04uR3JlYXRlclRoYW5Db25kaXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0xlc3NUaGFuQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbkNvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5MZXNzVGhhbkNvbmRpdGlvbikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYnJhbmNoSlNPTi5oYXNPd25Qcm9wZXJ0eSgnR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5HcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChicmFuY2hKU09OLmhhc093blByb3BlcnR5KCdMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkxlc3NUaGFuT3JFcXVhbHNDb25kaXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0NvbnRhaW5zQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBDb250YWluc0NvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5Db250YWluc0NvbmRpdGlvbikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgKGNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgLy8gICBjb25kaXRpb24uSXNSZWxldmFudCA9IGJyYW5jaEpTT04uSXNSZWxldmFudCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgID8gYnJhbmNoSlNPTi5Jc1JlbGV2YW50IDogZmFsc2U7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGNvbmRpdGlvbi5Jc1JlbGV2YW50ID0gYnJhbmNoSlNPTi5Jc1JlbGV2YW50ICE9PSB1bmRlZmluZWRcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJyYW5jaEpTT04uSXNSZWxldmFudCA6IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAgaXNDb21wb3NpdGUoY29tcG9zaXRlRWxlbWVudEpTT04pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0FuZENvbmRpdGlvbicpIHx8XHJcbiAgICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ09yQ29uZGl0aW9uJykgfHxcclxuICAgICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnTm90Q29uZGl0aW9uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXR1cm5Db25kaXRpb25Gcm9tSlNPTihjb25kaXRpb25JZGVudGlmaWVyOiBzdHJpbmcgLCBjb25kaXRpb25KU09OOiBhbnkpOiBDb25kaXRpb24ge1xyXG4gICAgICBsZXQgY29uZGl0aW9uOiBDb25kaXRpb247XHJcbiAgICAgIGlmIChjb25kaXRpb25JZGVudGlmaWVyID09PSAnRXF1YWxDb25kaXRpb24nKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgRXF1YWxDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29uZGl0aW9uSWRlbnRpZmllciA9PT0gJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBHcmVhdGVyVGhhbkNvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoY29uZGl0aW9uSlNPTikpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb25kaXRpb25JZGVudGlmaWVyID09PSAnTGVzc1RoYW5Db25kaXRpb24nKSB7XHJcbiAgICAgICAgY29uZGl0aW9uID0gbmV3IExlc3NUaGFuQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdDb250YWluc0NvbmRpdGlvbicpIHtcclxuICAgICAgICBjb25kaXRpb24gPSBuZXcgQ29udGFpbnNDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29uZGl0aW9uO1xyXG4gIH1cclxuXHJcbiAgICBwcml2YXRlICByZXR1cm5Db25kaXRpb25zKGNvbmRpdGlvbnNKU09OOiBKU09OKTogQ29uZGl0aW9uW10ge1xyXG4gICAgICAgICBsZXQgY29uZGl0aW9uczogQ29uZGl0aW9uW107XHJcbiAgICAgICAgY29uc3QgY29uZGl0aW9uSWRlbnRpZmllcnMgPSBbJ0VxdWFsQ29uZGl0aW9uJywgJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJywgJ0xlc3NUaGFuQ29uZGl0aW9uJyxcclxuICAgICAgICAgICAgJ0dyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24nLCAnTGVzc1RoYW5PckVxdWFsc0NvbmRpdGlvbicsICdDb250YWluc0NvbmRpdGlvbiddO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uSWRlbnRpZmllciBvZiBjb25kaXRpb25JZGVudGlmaWVycykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkpTT04gPSBjb25kaXRpb25zSlNPTltjb25kaXRpb25JZGVudGlmaWVyXTtcclxuICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uSlNPTiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25kaXRpb25zID0gbmV3IEFycmF5PENvbmRpdGlvbj4oKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShjb25kaXRpb25KU09OKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBqc29uVmFsdWUgb2YgY29uZGl0aW9uSlNPTikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihjb25kaXRpb25JZGVudGlmaWVyLCBqc29uVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLnJldHVybkNvbmRpdGlvbkZyb21KU09OKGNvbmRpdGlvbklkZW50aWZpZXIsIGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb25kaXRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSHlicmlkKGNvbXBvc2l0ZUVsZW1lbnRKU09OKTogYm9vbGVhbiB7XHJcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZUV4aXN0cyA9ICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnQW5kQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ09yQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ05vdENvbmRpdGlvbicpO1xyXG5cclxuICAgICAgY29uc3QgcHJpbWl0aXZlRXhpc3RzID0gY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0VxdWFsQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0xlc3NUaGFuQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0dyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24nKSB8fFxyXG4gICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnTGVzc1RoYW5PckVxdWFsc0NvbmRpdGlvbicpIHx8XHJcbiAgICAgIGNvbXBvc2l0ZUVsZW1lbnRKU09OLmhhc093blByb3BlcnR5KCdDb250YWluc0NvbmRpdGlvbicpO1xyXG4gICAgICByZXR1cm4gIGNvbXBvc2l0ZUV4aXN0cyAmJiBwcmltaXRpdmVFeGlzdHM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJldHVybkNvbXBvc2l0ZUNvbmRpdGlvbihkYXRhOiBhbnkpOiBDb21wb3NpdGVDb25kaXRpb24ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNDb21wb3NpdGUoZGF0YSkpICB7XHJcbiAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZGl0aW9uSlNPTjogYW55O1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZGl0aW9uOiBDb21wb3NpdGVDb25kaXRpb247XHJcblxyXG4gICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgnQW5kQ29uZGl0aW9uJykgKSB7XHJcbiAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb25KU09OID0gZGF0YS5BbmRDb25kaXRpb247XHJcbiAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24gPSBuZXcgQW5kQ29uZGl0aW9uKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgnT3JDb25kaXRpb24nKSkge1xyXG4gICAgICAgICBjb21wb3NpdGVDb25kaXRpb25KU09OID0gZGF0YS5PckNvbmRpdGlvbjtcclxuICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uID0gbmV3IE9yQ29uZGl0aW9uKCk7XHJcbiAgICAgICB9IGVsc2UgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoJ05vdENvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uSlNPTiA9IGRhdGEuTm90Q29uZGl0aW9uO1xyXG4gICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbiA9IG5ldyBOb3RDb25kaXRpb24oKTtcclxuICAgICB9XHJcbi8vIGlmIChkYXRhLmhhc093blByb3BlcnR5KCdJc1JlbGV2YW50Jykpe1xyXG4vLyAgIGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04gKz0gZGF0YS5Jc1JlbGV2YW50O1xyXG4vLyB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNDb21wb3NpdGUoY29tcG9zaXRlQ29uZGl0aW9uSlNPTikpIHtcclxuICAgICAgICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uLmNvbmRpdGlvbnMgPSB0aGlzLnJldHVybkNvbmRpdGlvbnMoY29tcG9zaXRlQ29uZGl0aW9uSlNPTik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0h5YnJpZChjb21wb3NpdGVDb25kaXRpb25KU09OKSkge1xyXG4gICAgICAgICAgIGNvbnN0IGpzb25LZXlzID0gT2JqZWN0LmtleXMoY29tcG9zaXRlQ29uZGl0aW9uSlNPTik7XHJcbiAgICAgICAgIGZvciAoY29uc3QganNvbktleSBvZiBqc29uS2V5cykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGpzb25WYWx1ZSA9ICBjb21wb3NpdGVDb25kaXRpb25KU09OW2pzb25LZXldO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSAgJ3tcIicgKyBqc29uS2V5ICArICdcIjonICsgSlNPTi5zdHJpbmdpZnkoanNvblZhbHVlKSArICd9JyA7XHJcbiAgICAgICAgICAgICAgY29uc3QganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpdGUoanNvbk9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgICB0aGlzLnJldHVybklubmVyQ29uZGl0aW9ucyhqc29uT2JqZWN0LCBjb21wb3NpdGVDb25kaXRpb24pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShqc29uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFycmF5VmFsdWUgb2YgIGpzb25WYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwgYXJyYXlWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwganNvblZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgIHRoaXMucmV0dXJuSW5uZXJDb25kaXRpb25zKGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04sIGNvbXBvc2l0ZUNvbmRpdGlvbik7XHJcbiAgICAgIH1cclxuICAgICByZXR1cm4gY29tcG9zaXRlQ29uZGl0aW9uO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm5Db21wb3NpdGVDb25kaXRpb25Gcm9tTmFtZShlbGVtZW50TmFtZTogc3RyaW5nKTogQ29tcG9zaXRlQ29uZGl0aW9uIHtcclxuICAgICAgbGV0IGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uO1xyXG4gICAgICBzd2l0Y2ggKGVsZW1lbnROYW1lKSB7XHJcbiAgICAgICAgICBjYXNlICAnQW5kQ29uZGl0aW9uJzpcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24gPSBuZXcgQW5kQ29uZGl0aW9uKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgICdPckNvbmRpdGlvbic6XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uID0gbmV3IE9yQ29uZGl0aW9uKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ05vdENvbmRpdGlvbicgOlxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbiA9IG5ldyBOb3RDb25kaXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUNvbmRpdGlvbjtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgIGFkZENvbmRpdGlvbnNUb0lubmVyQ29uZGl0aW9ucyhrZXk6IGFueSAsIHZhbHVlOiBhbnksIGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uKSB7XHJcblxyXG4gICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLnJldHVybkNvbXBvc2l0ZUNvbmRpdGlvbkZyb21OYW1lKGtleSk7XHJcbiAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2goY29uZGl0aW9uKTtcclxuICAgICAgaWYgKHRoaXMuaXNIeWJyaWQodmFsdWUpKSB7XHJcbiAgICAgICAgIGNvbnN0IGpzb25LZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xyXG4gICAgICAgIGZvciAoY29uc3QganNvbktleSBvZiBqc29uS2V5cykge1xyXG4gICAgICAgICAgICAgY29uc3QganNvblZhbHVlID0gIHZhbHVlW2pzb25LZXldO1xyXG4gICAgICAgICAgICAgY29uc3QganNvblN0cmluZyA9ICAne1wiJyArIGpzb25LZXkgICsgJ1wiOicgKyBKU09OLnN0cmluZ2lmeShqc29uVmFsdWUpICsgJ30nIDtcclxuICAgICAgICAgICAgIGNvbnN0IGpzb25PYmplY3QgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xyXG4gICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpdGUoanNvbk9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuSW5uZXJDb25kaXRpb25zKGpzb25PYmplY3QsIGNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShqc29uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXJyYXlWYWx1ZSBvZiAganNvblZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwgYXJyYXlWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihqc29uS2V5LCBqc29uVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9IGVsc2UgIGlmICh0aGlzLmlzQ29tcG9zaXRlKHZhbHVlKSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCAnaXNDb21wb3NpdGUnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbmRpdGlvbi5jb25kaXRpb25zID0gdGhpcy5yZXR1cm5Db25kaXRpb25zKHZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJldHVybklubmVyQ29uZGl0aW9ucyhpbm5lckNvbmRpdGlvbnNKU09OOiBhbnksIGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uKSB7XHJcbiAgICAgICAgY29uc3QganNvbktleXMgPSBPYmplY3Qua2V5cyhpbm5lckNvbmRpdGlvbnNKU09OKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBqc29uS2V5cyApIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gaW5uZXJDb25kaXRpb25zSlNPTltrZXldO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcnJheUNoZWNrZXJTZXJ2aWNlLmlzQXJyYXkodmFsdWVzKSkge1xyXG4gICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDb25kaXRpb25zVG9Jbm5lckNvbmRpdGlvbnMoa2V5LCB2YWx1ZSwgY29tcG9zaXRlQ29uZGl0aW9uKTtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb25kaXRpb25zVG9Jbm5lckNvbmRpdGlvbnMoa2V5LCBpbm5lckNvbmRpdGlvbnNKU09OW2tleV0sIGNvbXBvc2l0ZUNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuIl19