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
JavaScript
/**
* @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