UNPKG

acr-assist-simulator-module

Version:

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

660 lines (659 loc) 70.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { SimulatorState } from '../models/simulator-state.model'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { DataElementValues } from '../dataelementvalues'; import { ArithmeticExpression } from '../models/arithmetic-expression.model'; import { isArray } from 'util'; var /** @type {?} */ expressionParser = require('expr-eval').Parser; var SimulatorEngineService = /** @class */ (function () { function SimulatorEngineService() { this.endOfRoadReached = false; this.lastConditionMetBranchLevel = 1; this.nonRelevantDataElementIds = new Array(); this.simulatorStateChanged = new BehaviorSubject(new SimulatorState()); this.dataElementValues = new Map(); this.dataElementTexts = new Map(); this.nonRelevantDataElementIds = new Array(); } /** * @return {?} */ SimulatorEngineService.prototype.getTemplate = /** * @return {?} */ function () { return this.template; }; /** * @return {?} */ SimulatorEngineService.prototype.getAllDataElementValues = /** * @return {?} */ function () { return this.dataElementValues; }; /** * @return {?} */ SimulatorEngineService.prototype.getAllDataElementTexts = /** * @return {?} */ function () { return this.dataElementTexts; }; /** * @param {?} dataElementId * @return {?} */ SimulatorEngineService.prototype.getDataElementValue = /** * @param {?} dataElementId * @return {?} */ function (dataElementId) { return this.dataElementValues[dataElementId]; }; /** * @param {?} dataElementId * @return {?} */ SimulatorEngineService.prototype.getDataElementText = /** * @param {?} dataElementId * @return {?} */ function (dataElementId) { return this.dataElementTexts[dataElementId]; }; /** * @param {?} dataElementId * @param {?} value * @param {?} text * @return {?} */ SimulatorEngineService.prototype.addOrUpdateDataElement = /** * @param {?} dataElementId * @param {?} value * @param {?} text * @return {?} */ function (dataElementId, value, text) { this.dataElementValues[dataElementId] = value; this.dataElementTexts[dataElementId] = text; this.evaluateDecisionPoints(); }; /** * @param {?} decisionPoint * @param {?} branchingLevel * @return {?} */ SimulatorEngineService.prototype.evaluateDecisionPoint = /** * @param {?} decisionPoint * @param {?} branchingLevel * @return {?} */ function (decisionPoint, branchingLevel) { var /** @type {?} */ currentBranchCount = 0; var /** @type {?} */ totalBranchesInDecisionPoint = decisionPoint.branches.length; try { for (var _a = tslib_1.__values(decisionPoint.branches), _b = _a.next(); !_b.done; _b = _a.next()) { var branch = _b.value; currentBranchCount++; var /** @type {?} */ conditionMet = false; if (this.endOfRoadReached) { break; } if (branch.compositeCondition !== undefined) { conditionMet = branch.compositeCondition.evaluate(new DataElementValues(this.dataElementValues)); } else if (branch.condition !== undefined) { conditionMet = branch.condition.evaluate(new DataElementValues(this.dataElementValues)); } if (conditionMet) { this.lastConditionMetBranchLevel = branchingLevel; // if (nonRelevantDataElementIds === undefined) { // nonRelevantDataElementIds = new Array<string>(); // } // if (branch.notRelevantDataElements !== undefined) { // for (const nonRelevantDataElementReference of branch.notRelevantDataElements.dataElementReferences) { // nonRelevantDataElementIds.push(nonRelevantDataElementReference.dataElementId); // } // } if (branch.decisionPoints !== undefined) { try { for (var _c = tslib_1.__values(branch.decisionPoints), _d = _c.next(); !_d.done; _d = _c.next()) { var branchDecisionPoint = _d.value; var /** @type {?} */ newBranchingLevel = branchingLevel + 1; // this.evaluateDecisionPoint(branchDecisionPoint, newBranchingLevel, nonRelevantDataElementIds); this.evaluateDecisionPoint(branchDecisionPoint, newBranchingLevel); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_e = _c.return)) _e.call(_c); } finally { if (e_1) throw e_1.error; } } } else if (branch.endPointRef !== undefined) { var /** @type {?} */ simulatorState = new SimulatorState(); simulatorState.endPointId = branch.endPointRef.endPointId; // simulatorState.nonRelevantDataElementIds = nonRelevantDataElementIds; simulatorState.selectedBranchLabel = branch.label; simulatorState.selectedDecisionPointId = decisionPoint.id; simulatorState.selectedDecisionPointLabel = decisionPoint.label; // this.resetValuesOfNonRelevantDataElements(nonRelevantDataElementIds); this.simulatorStateChanged.next(simulatorState); this.endOfRoadReached = true; break; } } else { if (currentBranchCount >= totalBranchesInDecisionPoint) { this.endOfRoadReached = true; var /** @type {?} */ simulatorState = new SimulatorState(); // simulatorState.nonRelevantDataElementIds = nonRelevantDataElementIds; // this.resetValuesOfNonRelevantDataElements(nonRelevantDataElementIds); this.simulatorStateChanged.next(simulatorState); return; } else { continue; } } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_b && !_b.done && (_f = _a.return)) _f.call(_a); } finally { if (e_2) throw e_2.error; } } var e_2, _f, e_1, _e; }; /** * @param {?} nonRelevantDataElementIds * @return {?} */ SimulatorEngineService.prototype.resetValuesOfNonRelevantDataElements = /** * @param {?} nonRelevantDataElementIds * @return {?} */ function (nonRelevantDataElementIds) { // console.log(this.template.dataElements); if (nonRelevantDataElementIds !== undefined) { try { for (var nonRelevantDataElementIds_1 = tslib_1.__values(nonRelevantDataElementIds), nonRelevantDataElementIds_1_1 = nonRelevantDataElementIds_1.next(); !nonRelevantDataElementIds_1_1.done; nonRelevantDataElementIds_1_1 = nonRelevantDataElementIds_1.next()) { var nonRelevantDataElementId = nonRelevantDataElementIds_1_1.value; var /** @type {?} */ defaultValue = void 0; try { for (var _a = tslib_1.__values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) { var dataElement = _b.value; if (dataElement.id === nonRelevantDataElementId) { defaultValue = dataElement.defaultValue; break; } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_3) throw e_3.error; } } this.dataElementValues[nonRelevantDataElementId] = defaultValue; } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (nonRelevantDataElementIds_1_1 && !nonRelevantDataElementIds_1_1.done && (_d = nonRelevantDataElementIds_1.return)) _d.call(nonRelevantDataElementIds_1); } finally { if (e_4) throw e_4.error; } } } var e_4, _d, e_3, _c; }; /** * @param {?} elementId * @param {?} decisionPoint * @param {?} branchingLevel * @return {?} */ SimulatorEngineService.prototype.evaluateComputedElementDecisionPoint = /** * @param {?} elementId * @param {?} decisionPoint * @param {?} branchingLevel * @return {?} */ function (elementId, decisionPoint, branchingLevel) { var /** @type {?} */ currentBranchCount = 0; var /** @type {?} */ totalBranchesInDecisionPoint = decisionPoint.branches.length; try { for (var _a = tslib_1.__values(decisionPoint.branches), _b = _a.next(); !_b.done; _b = _a.next()) { var branch = _b.value; currentBranchCount++; var /** @type {?} */ conditionMet = false; if (this.endOfRoadReached) { break; } if (branch.compositeCondition !== undefined) { conditionMet = branch.compositeCondition.evaluate(new DataElementValues(this.dataElementValues)); } else if (branch.condition !== undefined) { conditionMet = branch.condition.evaluate(new DataElementValues(this.dataElementValues)); } if (conditionMet) { this.lastConditionMetBranchLevel = branchingLevel; if (branch.decisionPoints !== undefined) { try { for (var _c = tslib_1.__values(branch.decisionPoints), _d = _c.next(); !_d.done; _d = _c.next()) { var branchDecisionPoint = _d.value; var /** @type {?} */ newBranchingLevel = branchingLevel + 1; this.evaluateComputedElementDecisionPoint(elementId, branchDecisionPoint, newBranchingLevel); } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (_d && !_d.done && (_e = _c.return)) _e.call(_c); } finally { if (e_5) throw e_5.error; } } } else if (branch.computedValue !== undefined) { this.dataElementValues[elementId] = branch.computedValue.expressionText; this.endOfRoadReached = true; if (branch.computedValue instanceof ArithmeticExpression) { this.dataElementValues[elementId] = this.evaluateArithmeticExpression(branch.computedValue.expressionText); this.endOfRoadReached = true; } else { this.dataElementValues[elementId] = branch.computedValue.expressionText; this.endOfRoadReached = true; } break; } } else { if (currentBranchCount >= totalBranchesInDecisionPoint) { this.endOfRoadReached = true; this.dataElementValues[elementId] = undefined; return; } else { continue; } } } } catch (e_6_1) { e_6 = { error: e_6_1 }; } finally { try { if (_b && !_b.done && (_f = _a.return)) _f.call(_a); } finally { if (e_6) throw e_6.error; } } var e_6, _f, e_5, _e; }; /** * @param {?} computedValue * @return {?} */ SimulatorEngineService.prototype.evaluateArithmeticExpression = /** * @param {?} computedValue * @return {?} */ function (computedValue) { var /** @type {?} */ startIndex = 0; var /** @type {?} */ endIndex = 0; var _loop_1 = function () { startIndex = computedValue.indexOf('{'); endIndex = computedValue.indexOf('}'); if (startIndex !== -1 && endIndex !== -1) { var /** @type {?} */ dataElementId = computedValue.substring(startIndex + 1, endIndex); var /** @type {?} */ replacingValue = computedValue.substring(startIndex, endIndex + 1); var /** @type {?} */ dataElementValue = this_1.dataElementValues[dataElementId]; if (isArray(dataElementValue)) { var /** @type {?} */ sum_1 = 0; dataElementValue.forEach(function (val) { sum_1 += +val; }); dataElementValue = sum_1; } computedValue = computedValue.replace(replacingValue, dataElementValue); } }; var this_1 = this; while (startIndex !== -1 && endIndex !== -1) { _loop_1(); } return expressionParser.evaluate(computedValue).toString(); }; /** * @return {?} */ SimulatorEngineService.prototype.evaluateComputedExpressions = /** * @return {?} */ function () { this.endOfRoadReached = false; var /** @type {?} */ expressionValue; try { for (var _a = tslib_1.__values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) { var element = _b.value; if (element.dataElementType === 'ComputedDataElement') { expressionValue = undefined; var /** @type {?} */ computedElement = /** @type {?} */ (element); try { for (var _c = tslib_1.__values(computedElement.decisionPoints), _d = _c.next(); !_d.done; _d = _c.next()) { var decisionPoint = _d.value; this.evaluateComputedElementDecisionPoint(element.id, decisionPoint, 1); if (this.dataElementValues[element.id] === undefined && decisionPoint.defaultBranch && decisionPoint.defaultBranch.computedValue) { this.dataElementValues[element.id] = decisionPoint.defaultBranch.computedValue.expressionText; } this.endOfRoadReached = false; } } catch (e_7_1) { e_7 = { error: e_7_1 }; } finally { try { if (_d && !_d.done && (_e = _c.return)) _e.call(_c); } finally { if (e_7) throw e_7.error; } } } } } catch (e_8_1) { e_8 = { error: e_8_1 }; } finally { try { if (_b && !_b.done && (_f = _a.return)) _f.call(_a); } finally { if (e_8) throw e_8.error; } } var e_8, _f, e_7, _e; }; /** * @param {?} dataelement * @param {?=} nonRelevantDataElementIds * @return {?} */ SimulatorEngineService.prototype.evaluateConditionalProperty = /** * @param {?} dataelement * @param {?=} nonRelevantDataElementIds * @return {?} */ function (dataelement, nonRelevantDataElementIds) { if (nonRelevantDataElementIds === void 0) { nonRelevantDataElementIds = []; } if (dataelement.conditionalProperties !== undefined) { var /** @type {?} */ conditionMet = false; var /** @type {?} */ isCompositeCondition = false; try { for (var _a = tslib_1.__values(dataelement.conditionalProperties), _b = _a.next(); !_b.done; _b = _a.next()) { var conditionalProperty = _b.value; if (conditionalProperty.condition !== undefined) { conditionMet = conditionalProperty.condition.evaluate(new DataElementValues(this.dataElementValues)); isCompositeCondition = false; } else if (conditionalProperty.compositeCondition !== undefined) { conditionMet = conditionalProperty.compositeCondition.evaluate(new DataElementValues(this.dataElementValues)); isCompositeCondition = true; } if (conditionMet) { if (nonRelevantDataElementIds === undefined) { this.nonRelevantDataElementIds = new Array(); } if (conditionalProperty.isRelevant === 'false') { this.nonRelevantDataElementIds.push(dataelement.id); } else { dataelement.displaySequence = conditionalProperty.DisplaySequence; dataelement.isRequired = conditionalProperty.isRequired !== undefined ? (conditionalProperty.isRequired.toLowerCase() === 'true' ? true : false) : true; if (conditionalProperty.Minimum !== undefined && conditionalProperty.Minimum != null) { dataelement.minimum = +conditionalProperty.Minimum; } if (conditionalProperty.Maximum !== undefined && conditionalProperty.Maximum != null) { dataelement.maximum = +conditionalProperty.Maximum; } if (dataelement.dataElementType === 'ChoiceDataElement') { (/** @type {?} */ (dataelement)).ChoiceNotRelevant = conditionalProperty.ChoiceNotRelevant; } if (dataelement.dataElementType === 'MultiChoiceDataElement') { (/** @type {?} */ (dataelement)).ChoiceNotRelevant = conditionalProperty.ChoiceNotRelevant; } if (dataelement.dataElementType === 'DurationDataElement') { (/** @type {?} */ (dataelement)).MinimumDay = +conditionalProperty.MinimumDay; (/** @type {?} */ (dataelement)).MaximumDay = +conditionalProperty.MaximumDay; (/** @type {?} */ (dataelement)).MinimumHours = +conditionalProperty.MinimumHours; (/** @type {?} */ (dataelement)).MaximumHours = +conditionalProperty.MaximumHours; (/** @type {?} */ (dataelement)).MinimumMinutes = +conditionalProperty.MinimumMinutes; (/** @type {?} */ (dataelement)).MaxmimumMinutes = +conditionalProperty.MaxmimumMinutes; } } return this.nonRelevantDataElementIds; } else { if (dataelement.dataElementType === 'ChoiceDataElement') { (/** @type {?} */ (dataelement)).ChoiceNotRelevant = new Array(); } if (dataelement.dataElementType === 'MultiChoiceDataElement') { (/** @type {?} */ (dataelement)).ChoiceNotRelevant = new Array(); } } } } catch (e_9_1) { e_9 = { error: e_9_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_9) throw e_9.error; } } } else { // temp code // if (this.nonRelevantDataElementIds.length === 0) { // dataelement.isRequired = true; // } } var e_9, _c; }; /** * @return {?} */ SimulatorEngineService.prototype.isCondtionMet = /** * @return {?} */ function () { try { for (var _a = tslib_1.__values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) { var dataelement = _b.value; if (dataelement.conditionalProperties !== undefined) { var /** @type {?} */ conditionMet = false; var /** @type {?} */ isCompositeCondition = false; try { for (var _c = tslib_1.__values(dataelement.conditionalProperties), _d = _c.next(); !_d.done; _d = _c.next()) { var conditionalProperty = _d.value; if (conditionalProperty.condition !== undefined) { conditionMet = conditionalProperty.condition.evaluate(new DataElementValues(this.dataElementValues)); isCompositeCondition = false; } else if (conditionalProperty.compositeCondition !== undefined) { conditionMet = conditionalProperty.compositeCondition.evaluate(new DataElementValues(this.dataElementValues)); isCompositeCondition = true; } if (conditionMet) { return true; } return false; } } catch (e_10_1) { e_10 = { error: e_10_1 }; } finally { try { if (_d && !_d.done && (_e = _c.return)) _e.call(_c); } finally { if (e_10) throw e_10.error; } } } } } catch (e_11_1) { e_11 = { error: e_11_1 }; } finally { try { if (_b && !_b.done && (_f = _a.return)) _f.call(_a); } finally { if (e_11) throw e_11.error; } } var e_11, _f, e_10, _e; }; /** * @return {?} */ SimulatorEngineService.prototype.evaluateDecisionAndConditionalProperty = /** * @return {?} */ function () { this.nonRelevantDataElementIds = new Array(); this.RevertConditionValues(); try { for (var _a = tslib_1.__values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) { var dataelement = _b.value; this.evaluateConditionalProperty(dataelement, new Array()); } } catch (e_12_1) { e_12 = { error: e_12_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_12) throw e_12.error; } } this.resetValuesOfNonRelevantDataElements(this.nonRelevantDataElementIds); return this.nonRelevantDataElementIds; var e_12, _c; }; /** * @return {?} */ SimulatorEngineService.prototype.RevertConditionValues = /** * @return {?} */ function () { try { for (var _a = tslib_1.__values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) { var dataelement = _b.value; dataelement.isRequired = dataelement.isRequiredOverrider; dataelement.displaySequence = dataelement.displaySequenceOverrider; if (dataelement.dataElementType === 'NumericDataElement') { (/** @type {?} */ (dataelement)).minimum = +(/** @type {?} */ (dataelement)).minimumOverrider; (/** @type {?} */ (dataelement)).maximum = +(/** @type {?} */ (dataelement)).maximumOverrider; } if (dataelement.dataElementType === 'IntegerDataElement') { (/** @type {?} */ (dataelement)).minimum = +(/** @type {?} */ (dataelement)).minimumOverrider; (/** @type {?} */ (dataelement)).maximum = +(/** @type {?} */ (dataelement)).maximumOverrider; } if (dataelement.dataElementType === 'DurationDataElement') { (/** @type {?} */ (dataelement)).MinimumDay = +(/** @type {?} */ (dataelement)).MinimumDayOverrider; (/** @type {?} */ (dataelement)).MaximumDay = +(/** @type {?} */ (dataelement)).MaximumDayOverrider; (/** @type {?} */ (dataelement)).MinimumHours = +(/** @type {?} */ (dataelement)).MinimumHoursOverrider; (/** @type {?} */ (dataelement)).MaximumHours = +(/** @type {?} */ (dataelement)).MaximumHoursOverrider; (/** @type {?} */ (dataelement)).MinimumMinutes = +(/** @type {?} */ (dataelement)).MinimumMinutesOverrider; (/** @type {?} */ (dataelement)).MaxmimumMinutes = +(/** @type {?} */ (dataelement)).MaxmimumMinutesOverrider; } } } catch (e_13_1) { e_13 = { error: e_13_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_13) throw e_13.error; } } var e_13, _c; }; /** * @return {?} */ SimulatorEngineService.prototype.evaluateDecisionPoints = /** * @return {?} */ function () { this.evaluateComputedExpressions(); this.endOfRoadReached = false; try { for (var _a = tslib_1.__values(this.template.rules.decisionPoints), _b = _a.next(); !_b.done; _b = _a.next()) { var decisionPoint = _b.value; this.evaluateDecisionPoint(decisionPoint, 1); } } catch (e_14_1) { e_14 = { error: e_14_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_14) throw e_14.error; } } var e_14, _c; }; /** * @param {?} template * @return {?} */ SimulatorEngineService.prototype.initialize = /** * @param {?} template * @return {?} */ function (template) { this.template = template; try { for (var _a = tslib_1.__values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) { var dataElement = _b.value; this.dataElementValues[dataElement.id] = dataElement.currentValue; } } catch (e_15_1) { e_15 = { error: e_15_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_15) throw e_15.error; } } var e_15, _c; }; SimulatorEngineService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ SimulatorEngineService.ctorParameters = function () { return []; }; return SimulatorEngineService; }()); export { SimulatorEngineService }; function SimulatorEngineService_tsickle_Closure_declarations() { /** @type {?} */ SimulatorEngineService.prototype.template; /** @type {?} */ SimulatorEngineService.prototype.dataElementValues; /** @type {?} */ SimulatorEngineService.prototype.dataElementTexts; /** @type {?} */ SimulatorEngineService.prototype.endOfRoadReached; /** @type {?} */ SimulatorEngineService.prototype.lastConditionMetBranchLevel; /** @type {?} */ SimulatorEngineService.prototype.nonRelevantDataElementIds; /** @type {?} */ SimulatorEngineService.prototype.simulatorStateChanged; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLWVuZ2luZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL2NvcmUvc2VydmljZXMvc2ltdWxhdG9yLWVuZ2luZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFNL0IscUJBQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQzs7SUFjbkQ7Z0NBTjJCLEtBQUs7MkNBQ00sQ0FBQzt5Q0FDSCxJQUFJLEtBQUssRUFBVTtxQ0FFL0IsSUFBSSxlQUFlLENBQWlCLElBQUksY0FBYyxFQUFFLENBQUM7UUFHL0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFDL0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7S0FDdEQ7Ozs7SUFFRCw0Q0FBVzs7O0lBQVg7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztLQUN0Qjs7OztJQUVELHdEQUF1Qjs7O0lBQXZCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztLQUMvQjs7OztJQUVELHVEQUFz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QXpELElBQU0sYUFBYSxXQUFBO2dCQUN0QixJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzlDOzs7Ozs7Ozs7Ozs7Ozs7SUFHSCwyQ0FBVTs7OztJQUFWLFVBQVcsUUFBa0I7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7O1lBQ3pCLEdBQUcsQ0FBQyxDQUFzQixJQUFBLEtBQUEsaUJBQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUEsZ0JBQUE7Z0JBQS9DLElBQU0sV0FBVyxXQUFBO2dCQUNwQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7YUFDbkU7Ozs7Ozs7Ozs7S0FDRjs7Z0JBdFdGLFVBQVU7Ozs7aUNBaEJYOztTQWlCYSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vbW9kZWxzL3RlbXBsYXRlLm1vZGVsJztcclxuaW1wb3J0IHsgU2ltdWxhdG9yU3RhdGUgfSBmcm9tICcuLi9tb2RlbHMvc2ltdWxhdG9yLXN0YXRlLm1vZGVsJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcy9CZWhhdmlvclN1YmplY3QnO1xyXG5pbXBvcnQgeyBEZWNpc2lvblBvaW50IH0gZnJvbSAnLi4vbW9kZWxzL2RlY2lzaW9ucG9pbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudFZhbHVlcyB9IGZyb20gJy4uL2RhdGFlbGVtZW50dmFsdWVzJztcclxuaW1wb3J0IHsgQ29tcHV0ZWREYXRhRWxlbWVudCB9IGZyb20gJy4uL2VsZW1lbnRzL21vZGVscy9jb21wdXRlZC1kYXRhLWVsZW1lbnQtbW9kZWwnO1xyXG5pbXBvcnQgeyBBcml0aG1ldGljRXhwcmVzc2lvbiB9IGZyb20gJy4uL21vZGVscy9hcml0aG1ldGljLWV4cHJlc3Npb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAndXRpbCc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vZWxlbWVudHMvbW9kZWxzL2Nob2ljZS1kYXRhLWVsZW1lbnQtbW9kZWwnO1xyXG5pbXBvcnQgeyBOdW1lcmljRGF0YUVsZW1lbnQgfSBmcm9tICcuLi9lbGVtZW50cy9tb2RlbHMvbnVtZXJpYy1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBJbnRlZ2VyRGF0YUVsZW1lbnQgfSBmcm9tICcuLi9lbGVtZW50cy9tb2RlbHMvaW50ZWdlci1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBEdXJhdGlvbkRhdGFFbGVtZW50IH0gZnJvbSAnLi4vZWxlbWVudHMvbW9kZWxzL2R1cmF0aW9uLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IE11bHRpQ2hvaWNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi9lbGVtZW50cy9tb2RlbHMvbXVsdGktY2hvaWNlLWRhdGEtZWxlbWVudCc7XHJcbmNvbnN0IGV4cHJlc3Npb25QYXJzZXIgPSByZXF1aXJlKCdleHByLWV2YWwnKS5QYXJzZXI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlIHtcclxuXHJcbiAgcHJpdmF0ZSB0ZW1wbGF0ZTogVGVtcGxhdGU7XHJcbiAgcHJpdmF0ZSBkYXRhRWxlbWVudFZhbHVlczogTWFwPHN0cmluZywgYW55PjtcclxuICBwcml2YXRlIGRhdGFFbGVtZW50VGV4dHM6IE1hcDxzdHJpbmcsIGFueT47XHJcbiAgcHJpdmF0ZSBlbmRPZlJvYWRSZWFjaGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBsYXN0Q29uZGl0aW9uTWV0QnJhbmNoTGV2ZWwgPSAxO1xyXG4gIHByaXZhdGUgbm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcblxyXG4gIHNpbXVsYXRvclN0YXRlQ2hhbmdlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2ltdWxhdG9yU3RhdGU+KG5ldyBTaW11bGF0b3JTdGF0ZSgpKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmRhdGFFbGVtZW50VmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICAgIHRoaXMuZGF0YUVsZW1lbnRUZXh0cyA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgICB0aGlzLm5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVtcGxhdGUoKTogVGVtcGxhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICBnZXRBbGxEYXRhRWxlbWVudFZhbHVlcygpOiBNYXA8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFFbGVtZW50VmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWxsRGF0YUVsZW1lbnRUZXh0cygpOiBNYXA8c3RyaW5nLCBhbnk+IHtcclxuICAgI