stimulsoft-forms
Version:
Stimulsoft PDF Forms
655 lines • 99.5 kB
JavaScript
import StiInnerBorder from "../properties/StiInnerBorder";
import { StiBorder } from "../properties/StiBorder";
import { StiPen } from "../properties/StiPen";
import StiRectangleGeometry from "../properties/StiRectangleGeometry";
import { StiLocalizationService } from "../services/sti-localization.service";
import Color from "../system/Color";
import { Enum } from "../system/Enum";
import { StiHorizontalAlignment, StiVerticalAlignment, StiLabelAlignment } from "../system/enums";
import { Font } from "../system/Font";
import { StiFormElement } from "./base/StiFormElement";
import { StiCheckBoxColumnItem } from "./table/columns/StiCheckBoxColumnItem";
import { StiComboBoxColumnItem } from "./table/columns/StiComboBoxColumnItem";
import { StiLabelColumnItem } from "./table/columns/StiLabelColumnItem";
import { StiNumberBoxColumnItem } from "./table/columns/StiNumberBoxColumnItem";
import { StiRadioButtonColumnItem } from "./table/columns/StiRadioButtonColumnItem";
import { StiTextBoxColumnItem } from "./table/columns/StiTextBoxColumnItem";
import { StiColumnItem } from "./table/StiColumnItem";
import { StiRowLabel } from "./table/StiRowLabel";
import { StiTotalsFieldItem } from "./table/StiTotalsFieldItem";
import { StiTotalsRowHeaderEditableContent } from "./table/StiTotalsRowHeaderEditableContent";
import { StiLabelItem } from "./text/StiLabelItem";
import { StiTextItem } from "./text/StiTextItem";
import { StiInputTextItem } from "../helper/StiInputTextItem";
export class StiTableElement extends StiFormElement {
get showRowLabels() {
return this._showRowLabels;
}
set showRowLabels(value) {
let previousValue = this._showRowLabels;
if (previousValue != value) {
this._showRowLabels = value;
this.fitTable();
}
}
get showHeaderEditor() {
return this._showHeaderEditor;
}
set showHeaderEditor(value) {
this._showHeaderEditor = value;
if (value == true) {
this._showColumnsEditor = false;
this._showRowsEditor = false;
this._showTotalsEditor = false;
}
}
set name(value) {
let oldName = this.name;
super.name = value;
this.nameChanged(oldName);
}
get name() {
return super.name;
}
get totalsValuesWidth() {
return this._totalsValuesWidth;
}
set totalsValuesWidth(value) {
if (value > 0) {
this._totalsValuesWidth = value;
}
else {
this._totalsValuesWidth = 0;
}
}
get totalsHeadersWidth() {
return this._totalsHeadersWidth;
}
set totalsHeadersWidth(value) {
if (value > 0) {
this._totalsHeadersWidth = value;
}
else {
this._totalsHeadersWidth = 0;
}
}
get showColumnsEditor() {
return this._showColumnsEditor;
}
set showColumnsEditor(value) {
this._showColumnsEditor = value;
if (value == true) {
this._showHeaderEditor = false;
this._showRowsEditor = false;
this._showTotalsEditor = false;
}
}
get showRowsEditor() {
return this._showRowsEditor;
}
set showRowsEditor(value) {
this._showRowsEditor = value;
if (value == true) {
this._showHeaderEditor = false;
this._showColumnsEditor = false;
this._showTotalsEditor = false;
}
}
get showTotalsEditor() {
return this._showTotalsEditor;
}
set showTotalsEditor(value) {
this._showTotalsEditor = value;
if (value == true) {
this._showHeaderEditor = false;
this._showColumnsEditor = false;
this._showRowsEditor = false;
}
}
getDefaultEditableContent() {
let textItem = new StiInputTextItem("", this.font);
textItem.element = this;
return textItem;
}
constructor(form) {
super();
this.type = "TableElement";
this.description = new StiTextItem();
this.font = new Font("Segoe UI", 10);
this.border = new StiBorder(StiPen.dimGraySolid(), true, true, true, true);
this.gridLines = new StiInnerBorder(StiPen.dimGraySolid(), true, true);
this.backgroundColor = Color.transparent();
this.alternateRowColors = false;
this.evenRowsStyle = Color.fromArgb(0xff, 0xf9, 0xf9, 0xf9);
this.evenRowsTextColor = Color.black();
this.oddRowsStyle = Color.fromArgb(0xff, 0xf3, 0xf3, 0xf3);
this.oddRowsTextColor = Color.black();
this.tableHeaderText = "";
this.tableHeaderAlignment = StiHorizontalAlignment.Left;
this.tableHeaderColor = Color.black();
this.tableHeaderHeight = 0;
this.tableHeaderBackgroundColor = Color.transparent();
this.rowLabelsWidth = 100;
this._showRowLabels = false;
this.dynamicRows = false;
this.useWordWrap = false;
this.rowLabelsContentEditable = [];
this.rowLabelsHorizontalAlignment = StiHorizontalAlignment.Left;
this.rowHeadersBackground = Color.transparent();
this.rowHeadersColor = Color.black();
this.rowHeadersBorder = new StiBorder(StiPen.dimGraySolid(), true, true, true, true);
this.columnHeadersBorder = new StiBorder(StiPen.dimGraySolid(), true, true, true, true);
this._columns = [];
this.useTotals = true;
this.totalsRowHeader = StiLocalizationService.get("PropertyMain", "Totals");
this.totalsRowHeaderHorizontalAlignment = StiHorizontalAlignment.Left;
this.totalsRowHeaderVerticalAlignment = StiVerticalAlignment.Top;
this.totalsRowHeaderColor = Color.black();
this._totalsValuesWidth = 100;
this._totalsHeadersWidth = 100;
this.totalsFields = [];
this.showBorderEditor = false;
this.showGridLinesEditor = false;
this._showHeaderEditor = true;
this._showColumnsEditor = false;
this._showRowsEditor = false;
this._showTotalsEditor = false;
this.stopFit = false;
this.showColumnsBorderEditor = true;
this.showRowsBorderEditor = false;
this.minColumnWidth = 40;
this.totalsRowHeaderEditableContent = new StiTotalsRowHeaderEditableContent(this);
this.form = form;
this.geometry = new StiRectangleGeometry(320, 245);
this.label = new StiLabelItem(this, StiLocalizationService.get("Components", "StiTable"));
this.columns = [];
this.rowLabels = ["", "", ""];
this.columns.push(this.createColumn("textbox"));
/*this.columns.push(new StiComboBoxColumnItem(StiLocalizationService.get("PropertyMain", "Second")));
this.columns.push(new StiRadioButtonColumnItem(StiLocalizationService.get("PropertyMain", "Third")));
this.columns.push(new StiTextBoxColumnItem(StiLocalizationService.get("PropertyMain", "Fourth")));
this.columns.push(new StiNumberBoxColumnItem(StiLocalizationService.get("PropertyMain", "Fifth")));
this.columns.push(new StiLabelColumnItem(StiLocalizationService.get("PropertyMain", "Labels")));
this.rowLabels = [];
this.rowLabels.push(StiLocalizationService.get("PropertyMain", "First"));
this.rowLabels.push(StiLocalizationService.get("PropertyMain", "Second"));
this.rowLabels.push(StiLocalizationService.get("PropertyMain", "Third"));
this.totalsFields.push(new StiTotalsFieldItem(StiLocalizationService.get("PropertyMain", "First"), "{Cell(5,1)}", this.form));
this.totalsFields.push(
new StiTotalsFieldItem(StiLocalizationService.get("PropertyMain", "Maximum"), "{Max(Col(5))}", this.form)
);
this.totalsFields.push(
new StiTotalsFieldItem(StiLocalizationService.get("PropertyMain", "Summary"), "{Sum(Col(5))}", this.form)
);
this.totalsFields.push(
new StiTotalsFieldItem(StiLocalizationService.get("PropertyMain", "Count"), "{Count(Col(5))}", this.form)
);
this.columns.forEach((column) => {
if (column.type == "CheckBoxColumn" && column instanceof StiCheckBoxColumnItem) {
this.rowLabels.forEach((row) => {
column.cells.push(new StiCheckBoxCellItem("", false));
});
} else if (column.type == "ComboBoxColumn" && column instanceof StiComboBoxColumnItem) {
column.comboBoxOptions.push("yes");
column.comboBoxOptions.push("no");
this.rowLabels.forEach((row) => {
column.cells.push(new StiComboBoxCellItem("", 0));
});
} else if (column.type == "RadioButtonColumn" && column instanceof StiRadioButtonColumnItem) {
this.rowLabels.forEach((row) => {
column.cells.push(new StiRadioButtonCellItem("", false));
});
} else if (column.type == "TextBoxColumn" && column instanceof StiTextBoxColumnItem) {
this.rowLabels.forEach((row) => {
column.cells.push(new StiTextBoxCellItem("", ""));
});
} else if (column.type == "NumberBoxColumn" && column instanceof StiNumberBoxColumnItem) {
this.rowLabels.forEach((row) => {
column.cells.push(new StiNumberBoxCellItem("", 0));
});
} else if (column.type == "LabelColumn" && column instanceof StiLabelColumnItem) {
this.rowLabels.forEach((row) => {
column.cells.push("");
});
}
});*/
}
createColumn(type, label, parentItem) {
type = type.toLocaleLowerCase();
label = label ?? "";
let columnItem;
if (type.startsWith("checkbox")) {
columnItem = new StiCheckBoxColumnItem(label, this.form);
}
else if (type.startsWith("combobox")) {
columnItem = new StiComboBoxColumnItem(label, this.form);
}
else if (type.startsWith("numberbox")) {
columnItem = new StiNumberBoxColumnItem(label, this.form);
}
else if (type.startsWith("radiobutton")) {
columnItem = new StiRadioButtonColumnItem(label, this.form);
}
else if (type.startsWith("textbox")) {
columnItem = new StiTextBoxColumnItem(label, this.form);
}
else if (type.startsWith("label")) {
columnItem = new StiLabelColumnItem(label, this.form);
}
if (parentItem) {
columnItem.copyFrom(parentItem);
}
return columnItem;
}
setTabIndex(value) {
this.tabIndex = value;
return value + (this.columns?.length * this._rowLabels?.length ?? 0);
}
get maxTableWidth() {
return (this.width -
this.padding.left -
this.padding.right -
(this.label.alignment != StiLabelAlignment.Top && this.label.value.length > 0 ? this.label.width : 0));
}
set rowLabels(value) {
this.nativeRowLabels = value;
let this_ = this;
this._rowLabels = new Proxy(value, {
deleteProperty: function (target, property) {
setTimeout(() => {
this_.updateRowLabelsContentEditable();
}, 0);
return true;
},
set: function (target, property, value, receiver) {
target[property] = value;
this_.updateRowLabelsContentEditable();
return true;
},
});
this.updateRowLabelsContentEditable();
}
get rowLabels() {
return this._rowLabels;
}
setDefaultValues() {
this.columns.forEach((column) => {
column.setDefaultValues();
});
this.totalsFields.forEach((total) => {
total.setDefaultValues();
});
}
set columns(value) {
let this_ = this;
this._columns = new Proxy(value, {
deleteProperty: function (target, property) {
setTimeout(() => {
this_.fitTable();
}, 0);
return true;
},
set: function (target, property, value, receiver) {
target[property] = value;
let column = value;
if (column instanceof StiColumnItem && !column.width) {
column.width = this_.maxTableWidth / (this_.columns.length + (this_.showRowLabels ? 1 : 0));
}
if (value.cells && value.cells.length < this_.rowLabels.length) {
for (let i = value.cells.length; i < this_.rowLabels.length; i++)
value.cells.push(column.createCell());
}
if (!target.stopFit) {
this_.fitTable();
}
return true;
},
});
this_.fitTable();
}
fitTable() {
if (this.stopFit) {
return;
}
let currentWidth = this.showRowLabels ? this.rowLabelsWidth : 0;
this.columns.forEach((c) => (currentWidth += c.width));
let pc = this.maxTableWidth / currentWidth;
if (currentWidth != 0 && currentWidth && pc) {
if (this.showRowLabels) {
this.rowLabelsWidth *= pc;
}
this.columns.forEach((c) => (c.width *= pc));
}
pc = this.maxTableWidth / (this.totalsHeadersWidth + this.totalsValuesWidth);
if (pc < 1) {
this.totalsHeadersWidth *= pc;
this.totalsValuesWidth *= pc;
}
}
deleteLastRow() {
this.rowLabels.splice(this.rowLabels.length - 1, 1);
}
deleteLastColumn() {
this.columns.splice(this.columns.length - 1, 1);
}
addColumnLikeLast() {
let newColumnWidth = (this.maxTableWidth - this.rowLabelsWidth) / (this.columns.length + 1);
let maxChangeableWidth = 0;
if (this.columns.length > 0) {
this.columns.forEach((column) => {
if (column.width > this.minColumnWidth) {
maxChangeableWidth += column.width - this.minColumnWidth;
}
});
}
else {
maxChangeableWidth = this.maxTableWidth - this.rowLabelsWidth;
}
if (newColumnWidth <= maxChangeableWidth) {
if (this.columns.length > 0) {
let lastColumn = this.columns[this.columns.length - 1];
this.columns.push(this.createColumn(lastColumn.type, "", lastColumn));
}
else {
this.columns.push(new StiNumberBoxColumnItem("", this.form));
}
}
}
addRow() {
this.rowLabels.push("");
this.columns.forEach((column) => column.cells.push(column.createCell()));
}
setProperty(propName, value, oldValue) {
super.setProperty(propName, value, oldValue);
if (propName == "thousandSeparator") {
this.columns.forEach((column) => {
if ((column instanceof StiNumberBoxColumnItem || column instanceof StiLabelColumnItem) &&
(oldValue === null || column.thousandSeparator == oldValue)) {
column.thousandSeparator = value;
}
});
this.totalsFields.forEach((field) => {
if (oldValue === null || oldValue == field.thousandSeparator) {
field.thousandSeparator = value;
}
});
}
else if (propName == "decimalDigits") {
this.columns.forEach((column) => {
if ((column instanceof StiNumberBoxColumnItem || column instanceof StiLabelColumnItem) &&
(oldValue === null || column.decimalDigits == oldValue)) {
column.decimalDigits = value;
}
});
this.totalsFields.forEach((field) => {
if (oldValue === null || oldValue == field.decimalDigits) {
field.decimalDigits = value;
}
});
}
}
getUsedFonts(usedFonts) {
super.getUsedFonts(usedFonts);
usedFonts.add(this.font.family, this.arrayOfStylesToString(this.font.style), this.font.size);
usedFonts.add(this.description.font.family, this.arrayOfStylesToString(this.description.font.style), this.description.font.size);
}
propertyChanged(propName) {
this.fitTable();
}
get columns() {
return this._columns;
}
get eValue() {
return this.tableHeaderText;
}
set eValue(value) {
this.tableHeaderText = value;
}
get eFont() {
return this.font;
}
set eFont(value) {
this.font = value;
}
get eColor() {
return this.tableHeaderColor;
}
set eColor(value) {
this.tableHeaderColor = value;
}
get eBackgroundColor() {
return this.tableHeaderBackgroundColor;
}
set eBackgroundColor(value) {
this.tableHeaderBackgroundColor = value;
}
haveBackgoundColor() {
return true;
}
get eContentAlignment() {
return this.tableHeaderAlignment;
}
set eContentAlignment(value) {
this.tableHeaderAlignment = value;
}
haveContentAlignment() {
return true;
}
haveVerticalAlignment() {
return false;
}
htmlStyle() {
return `${this.eFont.htmlStyle()};color:${this.eColor.toHtmlColor()};`;
}
updateRowLabelsContentEditable() {
this.rowLabelsContentEditable = [];
this.rowLabels.forEach((l, index) => this.rowLabelsContentEditable.push(new StiRowLabel(l, this, index)));
}
set width(value) {
let needToFit = this.geometry.width != value;
this.geometry.width = value;
if (needToFit) {
this.fitTable();
}
}
get width() {
return this.geometry.width;
}
nameChanged(oldName) {
this.columns.filter(c => c instanceof StiLabelColumnItem).forEach((column) => {
column.expression = column.expression ? column.expression.replace(new RegExp(oldName, "g"), this.name) : column.expression;
});
this.totalsFields.forEach((total) => {
total.expression = total.expression ? total.expression.replace(new RegExp(oldName, "g"), this.name) : total.expression;
});
}
saveToJsonObject(options) {
this.tableHeaderHeight = this.element?.nativeElement?.offsetHeight ?? this.tableHeaderHeight;
this.columns?.forEach((column) => {
if (column["cells"] && column["cells"].length != this.rowLabels.length) {
column["cells"].splice(this.rowLabels.length, column["cells"].length);
}
});
let jObject = super.saveToJsonObject(options);
jObject.addPropertyJObject("Label", this.label.saveToJsonObject(options));
jObject.addPropertyJObject("Description", this.description.saveToJsonObject(options));
jObject.addPropertyJObject("Font", this.font.saveToJsonObject(options));
jObject.addPropertyJObject("Border", this.border.saveToJsonObject(options));
jObject.addPropertyJObject("GridLines", this.gridLines.saveToJsonObject(options));
jObject.addPropertyColor("BackgroundColor", this.backgroundColor);
jObject.addPropertyBool("AlternateRowColors", this.alternateRowColors);
jObject.addPropertyColor("EvenRowsStyle", this.evenRowsStyle);
jObject.addPropertyColor("EvenRowsTextColor", this.evenRowsTextColor);
jObject.addPropertyColor("OddRowsStyle", this.oddRowsStyle);
jObject.addPropertyColor("OddRowsTextColor", this.oddRowsTextColor);
jObject.addPropertyNumber("TableHeaderHeight", this.tableHeaderHeight);
jObject.addPropertyString("TableHeaderText", this.tableHeaderText);
jObject.addPropertyEnum("TableHeaderAlignment", StiHorizontalAlignment, this.tableHeaderAlignment);
jObject.addPropertyColor("TableHeaderColor", this.tableHeaderColor);
jObject.addPropertyColor("TableHeaderBackgroundColor", this.tableHeaderBackgroundColor);
jObject.addPropertyBool("ShowRowLabels", this.showRowLabels);
jObject.addPropertyArray("RowLabels", this.rowLabels);
jObject.addPropertyEnum("RowLabelsHorizontalAlignment", StiHorizontalAlignment, this.rowLabelsHorizontalAlignment);
jObject.addPropertyColor("RowHeadersBackground", this.rowHeadersBackground);
jObject.addPropertyColor("RowHeadersColor", this.rowHeadersColor);
jObject.addPropertyJObject("RowHeadersBorder", this.rowHeadersBorder.saveToJsonObject(options));
jObject.addPropertyJObject("ColumnHeadersBorder", this.columnHeadersBorder.saveToJsonObject(options));
jObject.addPropertyArray("Columns", this.columns);
jObject.addPropertyBool("UseTotals", this.useTotals);
// jObject.addPropertyBool("DynamicRows", this.dynamicRows);
jObject.addPropertyBool("UseWordWrap", this.useWordWrap);
jObject.addPropertyString("TotalsRowHeader", this.totalsRowHeader);
jObject.addPropertyNumber("RowLabelsWidth", this.rowLabelsWidth);
jObject.addPropertyEnum("TotalsRowHeaderHorizontalAlignment", StiHorizontalAlignment, this.totalsRowHeaderHorizontalAlignment);
jObject.addPropertyEnum("TotalsRowHeaderVerticalAlignment", StiVerticalAlignment, this.totalsRowHeaderVerticalAlignment);
jObject.addPropertyColor("TotalsRowHeaderColor", this.totalsRowHeaderColor);
jObject.addPropertyNumber("TotalsValuesWidth", this.totalsValuesWidth);
jObject.addPropertyNumber("TotalsHeadersWidth", this.totalsHeadersWidth);
jObject.addPropertyArray("TotalsFields", this.totalsFields);
return jObject;
}
loadFromJsonObject(json) {
this.stopFit = true;
super.loadFromJsonObject(json);
for (let property of json.properties()) {
switch (property.name) {
case "Label":
this.label = new StiLabelItem(this);
this.label.loadFromJsonObject(property.value);
break;
case "Description":
this.description = new StiTextItem();
this.description.loadFromJsonObject(property.value);
break;
case "Font":
this.font = new Font();
this.font.loadFromJsonObject(property.value);
break;
case "Border":
this.border = new StiBorder();
this.border.loadFromJsonObject(property.value);
break;
case "GridLines":
this.gridLines = new StiInnerBorder();
this.gridLines.loadFromJsonObject(property.value);
break;
case "BackgroundColor":
this.backgroundColor = new Color();
this.backgroundColor.deserializeFromString(property.value);
break;
case "AlternateRowColors":
this.alternateRowColors = property.value;
break;
case "EvenRowsStyle":
this.evenRowsStyle = new Color();
this.evenRowsStyle.deserializeFromString(property.value);
break;
case "EvenRowsTextColor":
this.evenRowsTextColor = new Color();
this.evenRowsTextColor.deserializeFromString(property.value);
break;
case "OddRowsStyle":
this.oddRowsStyle = new Color();
this.oddRowsStyle.deserializeFromString(property.value);
break;
case "OddRowsTextColor":
this.oddRowsTextColor = new Color();
this.oddRowsTextColor.deserializeFromString(property.value);
break;
case "TableHeaderText":
this.tableHeaderText = property.value;
break;
case "TableHeaderAlignment":
this.tableHeaderAlignment = Enum.parse(StiHorizontalAlignment, property.value);
break;
case "TableHeaderColor":
this.tableHeaderColor = new Color();
this.tableHeaderColor.deserializeFromString(property.value);
break;
case "TableHeaderBackgroundColor":
this.tableHeaderBackgroundColor = new Color();
this.tableHeaderBackgroundColor.deserializeFromString(property.value);
break;
case "ShowRowLabels":
this.showRowLabels = property.value;
break;
/* case "DynamicRows":
this.dynamicRows = property.value;
break; */
case "RowLabels":
this.rowLabels = [];
property.value.properties().forEach((p) => this.rowLabels.push(p.value));
break;
case "RowLabelsHorizontalAlignment":
this.rowLabelsHorizontalAlignment = Enum.parse(StiHorizontalAlignment, property.value);
break;
case "RowLabelsWidth":
this.rowLabelsWidth = property.value;
break;
case "RowHeadersBackground":
this.rowHeadersBackground = new Color();
this.rowHeadersBackground.deserializeFromString(property.value);
break;
case "RowHeadersColor":
this.rowHeadersColor = new Color();
this.rowHeadersColor.deserializeFromString(property.value);
break;
case "RowHeadersBorder":
this.rowHeadersBorder = new StiBorder();
this.rowHeadersBorder.loadFromJsonObject(property.value);
break;
case "ColumnHeadersBorder":
this.columnHeadersBorder = new StiBorder();
this.columnHeadersBorder.loadFromJsonObject(property.value);
break;
case "Columns":
case "ColumnCollection":
this.columns = [];
for (let colJson of property.value.value) {
let type = colJson.properties().find((p) => p.name == "Type").value;
let column = this.createColumn(type);
column.eParent = this;
column.loadFromJsonObject(colJson);
this.columns.push(column);
}
break;
case "UseTotals":
this.useTotals = property.value;
break;
case "UseWordWrap":
this.useWordWrap = property.value;
break;
case "TotalsRowHeader":
this.totalsRowHeader = property.value;
break;
case "TotalsRowHeaderHorizontalAlignment":
this.totalsRowHeaderHorizontalAlignment = Enum.parse(StiHorizontalAlignment, property.value);
break;
case "TotalsRowHeaderVerticalAlignment":
this.totalsRowHeaderVerticalAlignment = Enum.parse(StiVerticalAlignment, property.value);
break;
case "TotalsRowHeaderColor":
this.totalsRowHeaderColor = new Color();
this.totalsRowHeaderColor.deserializeFromString(property.value);
break;
case "TotalsValuesWidth":
this.totalsValuesWidth = property.value;
break;
case "TotalsHeadersWidth":
this.totalsHeadersWidth = property.value;
break;
case "TotalsFields":
this.totalsFields = [];
for (let totalJson of property.value.value) {
let total = new StiTotalsFieldItem("", "", this.form);
total.loadFromJsonObject(totalJson);
this.totalsFields.push(total);
}
break;
}
}
this.stopFit = false;
this.fitTable();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RpVGFibGVFbGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RpbXVsc29mdC1mb3Jtcy9zcmMvbGliL2VsZW1lbnRzL1N0aVRhYmxlRWxlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGNBQWMsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sb0JBQW9CLE1BQU0sb0NBQW9DLENBQUM7QUFFdEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFNdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDcEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFN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