@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
637 lines • 87.6 kB
JavaScript
import { __assign, __decorate, __metadata, __read, __spread } from "tslib";
import { Injectable, EventEmitter, NgZone } from '@angular/core';
// TODO: Refactor - export in a separate file
var IgxRow = /** @class */ (function () {
function IgxRow(id, index, data) {
this.id = id;
this.index = index;
this.data = data;
}
IgxRow.prototype.createEditEventArgs = function () {
return {
rowID: this.id,
oldValue: __assign({}, this.data),
newValue: this.newData,
cancel: false
};
};
return IgxRow;
}());
export { IgxRow };
var IgxCell = /** @class */ (function () {
function IgxCell(id, rowIndex, column, value, editValue, rowData) {
this.id = id;
this.rowIndex = rowIndex;
this.column = column;
this.value = value;
this.editValue = editValue;
this.rowData = rowData;
}
IgxCell.prototype.castToNumber = function (value) {
if (this.column.dataType === 'number' && !this.column.inlineEditorTemplate) {
var v = parseFloat(value);
return !isNaN(v) && isFinite(v) ? v : 0;
}
return value;
};
IgxCell.prototype.createEditEventArgs = function () {
return {
rowID: this.id.rowID,
cellID: this.id,
oldValue: this.value,
newValue: this.editValue,
cancel: false
};
};
return IgxCell;
}());
export { IgxCell };
var IgxGridCRUDService = /** @class */ (function () {
function IgxGridCRUDService() {
this.cell = null;
this.row = null;
}
IgxGridCRUDService.prototype.createCell = function (cell) {
return new IgxCell(cell.cellID, cell.rowIndex, cell.column, cell.value, cell.value, cell.row.rowData);
};
IgxGridCRUDService.prototype.createRow = function (cell) {
return new IgxRow(cell.id.rowID, cell.rowIndex, cell.rowData);
};
IgxGridCRUDService.prototype.sameRow = function (rowID) {
return this.row && this.row.id === rowID;
};
IgxGridCRUDService.prototype.sameCell = function (cell) {
return (this.cell.id.rowID === cell.id.rowID &&
this.cell.id.columnID === cell.id.columnID);
};
Object.defineProperty(IgxGridCRUDService.prototype, "inEditMode", {
get: function () {
return !!this.cell;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridCRUDService.prototype, "rowEditing", {
get: function () {
return this.grid.rowEditable;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridCRUDService.prototype, "primaryKey", {
get: function () {
return this.grid.primaryKey;
},
enumerable: true,
configurable: true
});
IgxGridCRUDService.prototype.beginRowEdit = function () {
if (this.grid.rowEditable && (this.grid.primaryKey === undefined || this.grid.primaryKey === null)) {
console.warn('The grid must have a `primaryKey` specified when using `rowEditable`!');
}
this.row = this.createRow(this.cell);
var args = {
rowID: this.row.id,
oldValue: this.row.data,
cancel: false
};
this.grid.onRowEditEnter.emit(args);
if (args.cancel) {
this.endRowEdit();
return;
}
this.row.transactionState = this.grid.transactions.getAggregatedValue(this.row.id, true);
this.grid.transactions.startPending();
this.grid.openRowOverlay(this.row.id);
};
IgxGridCRUDService.prototype.endRowEdit = function () {
this.row = null;
};
IgxGridCRUDService.prototype.begin = function (cell) {
var newCell = this.createCell(cell);
newCell.primaryKey = this.primaryKey;
var args = {
cellID: newCell.id,
rowID: newCell.id.rowID,
oldValue: newCell.value,
cancel: false
};
this.grid.onCellEditEnter.emit(args);
if (args.cancel) {
this.end();
return;
}
if (this.rowEditing) {
if (this.row && !this.sameRow(newCell.id.rowID)) {
this.grid.endEdit(true);
this.cell = newCell;
this.beginRowEdit();
return;
}
this.cell = newCell;
if (!this.row) {
this.beginRowEdit();
return;
}
}
else {
this.cell = newCell;
this.endRowEdit();
}
};
IgxGridCRUDService.prototype.end = function () {
this.cell = null;
};
IgxGridCRUDService.prototype.isInEditMode = function (rowIndex, columnIndex) {
if (!this.cell) {
return false;
}
return this.cell.column.index === columnIndex && this.cell.rowIndex === rowIndex;
};
IgxGridCRUDService = __decorate([
Injectable()
], IgxGridCRUDService);
return IgxGridCRUDService;
}());
export { IgxGridCRUDService };
var IgxGridSelectionService = /** @class */ (function () {
function IgxGridSelectionService(zone) {
this.zone = zone;
this.dragMode = false;
this.keyboardState = {};
this.pointerState = {};
this.selection = new Map();
this.temp = new Map();
this._ranges = new Set();
this.rowSelection = new Set();
this.initPointerState();
this.initKeyboardState();
}
Object.defineProperty(IgxGridSelectionService.prototype, "ranges", {
/**
* Returns the current selected ranges in the grid from both
* keyboard and pointer interactions
*/
get: function () {
// The last action was keyboard + shift selection -> add it
this.addKeyboardRange();
var ranges = Array.from(this._ranges).map(function (range) { return JSON.parse(range); });
// No ranges but we have a focused cell -> add it
if (!ranges.length && this.activeElement && this.grid.isCellSelectable) {
ranges.push(this.generateRange(this.activeElement));
}
return ranges;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridSelectionService.prototype, "primaryButton", {
get: function () {
return this.pointerState.primaryButton;
},
set: function (value) {
this.pointerState.primaryButton = value;
},
enumerable: true,
configurable: true
});
/**
* Resets the keyboard state
*/
IgxGridSelectionService.prototype.initKeyboardState = function () {
this.keyboardState.node = null;
this.keyboardState.shift = false;
this.keyboardState.range = null;
this.keyboardState.active = false;
};
/**
* Resets the pointer state
*/
IgxGridSelectionService.prototype.initPointerState = function () {
this.pointerState.node = null;
this.pointerState.ctrl = false;
this.pointerState.shift = false;
this.pointerState.range = null;
this.pointerState.primaryButton = true;
};
/**
* Adds a single node.
* Single clicks | Ctrl + single clicks on cells is the usual case.
*/
IgxGridSelectionService.prototype.add = function (node, addToRange) {
if (addToRange === void 0) { addToRange = true; }
this.selection.has(node.row) ? this.selection.get(node.row).add(node.column) :
this.selection.set(node.row, new Set()).get(node.row).add(node.column);
if (addToRange) {
this._ranges.add(JSON.stringify(this.generateRange(node)));
}
};
/**
* Adds the active keyboard range selection (if any) to the `ranges` meta.
*/
IgxGridSelectionService.prototype.addKeyboardRange = function () {
if (this.keyboardState.range) {
this._ranges.add(JSON.stringify(this.keyboardState.range));
}
};
IgxGridSelectionService.prototype.remove = function (node) {
if (this.selection.has(node.row)) {
this.selection.get(node.row).delete(node.column);
}
if (this.isActiveNode(node)) {
this.activeElement = null;
}
this._ranges.delete(JSON.stringify(this.generateRange(node)));
};
IgxGridSelectionService.prototype.isInMap = function (node) {
return (this.selection.has(node.row) && this.selection.get(node.row).has(node.column)) ||
(this.temp.has(node.row) && this.temp.get(node.row).has(node.column));
};
IgxGridSelectionService.prototype.selected = function (node) {
return (this.isActiveNode(node) && this.grid.isCellSelectable) || this.isInMap(node);
};
IgxGridSelectionService.prototype.isActiveNode = function (node) {
if (this.activeElement) {
var isActive = this.activeElement.column === node.column && this.activeElement.row === node.row;
if (this.grid.hasColumnLayouts) {
var layout = this.activeElement.layout;
return isActive && this.isActiveLayout(layout, node.layout);
}
return isActive;
}
return false;
};
IgxGridSelectionService.prototype.isActiveLayout = function (current, target) {
return current.columnVisibleIndex === target.columnVisibleIndex;
};
IgxGridSelectionService.prototype.addRangeMeta = function (node, state) {
this._ranges.add(JSON.stringify(this.generateRange(node, state)));
};
IgxGridSelectionService.prototype.removeRangeMeta = function (node, state) {
this._ranges.delete(JSON.stringify(this.generateRange(node, state)));
};
/**
* Generates a new selection range from the given `node`.
* If `state` is passed instead it will generate the range based on the passed `node`
* and the start node of the `state`.
*/
IgxGridSelectionService.prototype.generateRange = function (node, state) {
if (!state) {
return {
rowStart: node.row,
rowEnd: node.row,
columnStart: node.column,
columnEnd: node.column
};
}
var _a = state.node, row = _a.row, column = _a.column;
var rowStart = Math.min(node.row, row);
var rowEnd = Math.max(node.row, row);
var columnStart = Math.min(node.column, column);
var columnEnd = Math.max(node.column, column);
return { rowStart: rowStart, rowEnd: rowEnd, columnStart: columnStart, columnEnd: columnEnd };
};
/**
*
*/
IgxGridSelectionService.prototype.keyboardStateOnKeydown = function (node, shift, shiftTab) {
this.keyboardState.active = true;
this.initPointerState();
this.keyboardState.shift = shift && !shiftTab;
// Kb navigation with shift and no previous node.
// Clear the current selection init the start node.
if (this.keyboardState.shift && !this.keyboardState.node) {
this.clear();
this.keyboardState.node = node;
}
};
IgxGridSelectionService.prototype.keyboardStateOnFocus = function (node, emitter, dom) {
var kbState = this.keyboardState;
// Focus triggered by keyboard navigation
if (kbState.active) {
if (isChromium()) {
this._moveSelectionChrome(dom);
}
// Start generating a range if shift is hold
if (kbState.shift) {
this.dragSelect(node, kbState);
kbState.range = this.generateRange(node, kbState);
emitter.emit(this.generateRange(node, kbState));
return;
}
this.initKeyboardState();
this.clear();
this.add(node);
}
};
IgxGridSelectionService.prototype.pointerDown = function (node, shift, ctrl) {
this.addKeyboardRange();
this.initKeyboardState();
this.pointerState.ctrl = ctrl;
this.pointerState.shift = shift;
// No ctrl key pressed - no multiple selection
if (!ctrl) {
this.clear();
}
if (shift) {
// No previously 'clicked' node. Use the last active node.
if (!this.pointerState.node) {
this.pointerState.node = this.activeElement || node;
}
this.pointerDownShiftKey(node);
this.clearTextSelection();
return;
}
this.removeRangeMeta(node);
this.pointerState.node = node;
};
IgxGridSelectionService.prototype.pointerDownShiftKey = function (node) {
this.clear();
this.selectRange(node, this.pointerState);
};
IgxGridSelectionService.prototype.mergeMap = function (target, source) {
var iterator = source.entries();
var pair = iterator.next();
var key;
var value;
var _loop_1 = function () {
var _a;
_a = __read(pair.value, 2), key = _a[0], value = _a[1];
if (target.has(key)) {
var newValue_1 = target.get(key);
value.forEach(function (record) { return newValue_1.add(record); });
target.set(key, newValue_1);
}
else {
target.set(key, value);
}
pair = iterator.next();
};
while (!pair.done) {
_loop_1();
}
};
IgxGridSelectionService.prototype.pointerEnter = function (node, event) {
// https://www.w3.org/TR/pointerevents/#the-button-property
this.dragMode = event.buttons === 1 && event.button === -1;
if (!this.dragMode) {
return false;
}
this.clearTextSelection();
// If the users triggers a drag-like event by first clicking outside the grid cells
// and then enters in the grid body we may not have a initial pointer starting node.
// Assume the first pointerenter node is where we start.
if (!this.pointerState.node) {
this.pointerState.node = node;
}
this.pointerState.ctrl ? this.selectRange(node, this.pointerState, this.temp) :
this.dragSelect(node, this.pointerState);
return true;
};
IgxGridSelectionService.prototype.pointerUp = function (node, emitter) {
var _this = this;
if (this.dragMode) {
this.restoreTextSelection();
this.addRangeMeta(node, this.pointerState);
this.mergeMap(this.selection, this.temp);
this.zone.runTask(function () { return emitter.emit(_this.generateRange(node, _this.pointerState)); });
this.temp.clear();
this.dragMode = false;
return true;
}
if (this.pointerState.shift) {
this.clearTextSelection();
this.restoreTextSelection();
this.addRangeMeta(node, this.pointerState);
emitter.emit(this.generateRange(node, this.pointerState));
return true;
}
this.add(node);
return false;
};
IgxGridSelectionService.prototype.selectRange = function (node, state, collection) {
if (collection === void 0) { collection = this.selection; }
if (collection === this.temp) {
collection.clear();
}
var _a = this.generateRange(node, state), rowStart = _a.rowStart, rowEnd = _a.rowEnd, columnStart = _a.columnStart, columnEnd = _a.columnEnd;
for (var i = rowStart; i <= rowEnd; i++) {
for (var j = columnStart; j <= columnEnd; j++) {
collection.has(i) ? collection.get(i).add(j) :
collection.set(i, new Set()).get(i).add(j);
}
}
};
IgxGridSelectionService.prototype.dragSelect = function (node, state) {
if (!this.pointerState.ctrl) {
this.selection.clear();
}
this.selectRange(node, state);
};
IgxGridSelectionService.prototype.clear = function (clearAcriveEl) {
if (clearAcriveEl === void 0) { clearAcriveEl = false; }
if (clearAcriveEl) {
this.activeElement = null;
}
this.selection.clear();
this.temp.clear();
this._ranges.clear();
};
IgxGridSelectionService.prototype.clearTextSelection = function () {
var selection = window.getSelection();
if (selection.rangeCount) {
this._selectionRange = selection.getRangeAt(0);
this._selectionRange.collapse(true);
selection.removeAllRanges();
}
};
IgxGridSelectionService.prototype.restoreTextSelection = function () {
var selection = window.getSelection();
if (!selection.rangeCount) {
selection.addRange(this._selectionRange || document.createRange());
}
};
/**
* (╯°□°)╯︵ ┻━┻
* Chrome and Chromium don't care about the active
* range after keyboard navigation, thus this.
*/
IgxGridSelectionService.prototype._moveSelectionChrome = function (node) {
var selection = window.getSelection();
selection.removeAllRanges();
var range = new Range();
range.selectNode(node);
range.collapse(true);
selection.addRange(range);
};
/** Returns array of the selected row id's. */
IgxGridSelectionService.prototype.getSelectedRows = function () {
return this.rowSelection.size ? Array.from(this.rowSelection.keys()) : [];
};
/** Clears row selection, if filtering is applied clears only selected rows from filtered data. */
IgxGridSelectionService.prototype.clearRowSelection = function (event) {
var _this = this;
var removedRec = this.isFilteringApplied() ?
this.getRowIDs(this.allData).filter(function (rID) { return _this.isRowSelected(rID); }) : this.getSelectedRows();
var newSelection = this.isFilteringApplied() ? this.getSelectedRows().filter(function (x) { return !removedRec.includes(x); }) : [];
this.emitRowSelectionEvent(newSelection, [], removedRec, event);
};
/** Select all rows, if filtering is applied select only from filtered data. */
IgxGridSelectionService.prototype.selectAllRows = function (event) {
var _this = this;
var allRowIDs = this.getRowIDs(this.allData);
var addedRows = allRowIDs.filter(function (rID) { return !_this.isRowSelected(rID); });
var newSelection = this.rowSelection.size ? this.getSelectedRows().concat(addedRows) : addedRows;
this.emitRowSelectionEvent(newSelection, addedRows, [], event);
};
/** Select the specified row and emit event. */
IgxGridSelectionService.prototype.selectRowById = function (rowID, clearPrevSelection, event) {
if (!this.grid.isRowSelectable || this.isRowDeleted(rowID)) {
return;
}
clearPrevSelection = !this.grid.isMultiRowSelectionEnabled || clearPrevSelection;
var newSelection = clearPrevSelection ? [rowID] : this.getSelectedRows().indexOf(rowID) !== -1 ?
this.getSelectedRows() : __spread(this.getSelectedRows(), [rowID]);
var removed = clearPrevSelection ? this.getSelectedRows() : [];
this.emitRowSelectionEvent(newSelection, [rowID], removed, event);
};
/** Deselect the specified row and emit event. */
IgxGridSelectionService.prototype.deselectRow = function (rowID, event) {
if (!this.isRowSelected(rowID)) {
return;
}
var newSelection = this.getSelectedRows().filter(function (r) { return r !== rowID; });
if (this.rowSelection.size && this.rowSelection.has(rowID)) {
this.emitRowSelectionEvent(newSelection, [], [rowID], event);
}
};
/** Select specified rows. No event is emitted. */
IgxGridSelectionService.prototype.selectRowsWithNoEvent = function (rowIDs, clearPrevSelection) {
var _this = this;
if (clearPrevSelection) {
this.rowSelection.clear();
}
rowIDs.forEach(function (rowID) { _this.rowSelection.add(rowID); });
this.allRowsSelected = undefined;
};
/** Deselect specified rows. No event is emitted. */
IgxGridSelectionService.prototype.deselectRowsWithNoEvent = function (rowIDs) {
var _this = this;
rowIDs.forEach(function (rowID) { return _this.rowSelection.delete(rowID); });
this.allRowsSelected = undefined;
};
IgxGridSelectionService.prototype.isRowSelected = function (rowID) {
return this.rowSelection.size > 0 && this.rowSelection.has(rowID);
};
/** Select range from last selected row to the current specified row.*/
IgxGridSelectionService.prototype.selectMultipleRows = function (rowID, rowData, event) {
var _this = this;
this.allRowsSelected = undefined;
if (!this.rowSelection.size || this.isRowDeleted(rowID)) {
this.selectRowById(rowID);
return;
}
var gridData = this.allData;
var lastRowID = this.getSelectedRows()[this.rowSelection.size - 1];
var currIndex = gridData.indexOf(this.getRowDataById(lastRowID));
var newIndex = gridData.indexOf(rowData);
var rows = gridData.slice(Math.min(currIndex, newIndex), Math.max(currIndex, newIndex) + 1);
var added = this.getRowIDs(rows).filter(function (rID) { return !_this.isRowSelected(rID); });
var newSelection = this.getSelectedRows().concat(added);
this.emitRowSelectionEvent(newSelection, added, [], event);
};
IgxGridSelectionService.prototype.areAllRowSelected = function () {
if (!this.grid.data) {
return false;
}
if (this.allRowsSelected !== undefined) {
return this.allRowsSelected;
}
var dataItemsID = this.getRowIDs(this.allData);
return this.allRowsSelected = Math.min(this.rowSelection.size, dataItemsID.length) > 0 &&
new Set(Array.from(this.rowSelection.values()).concat(dataItemsID)).size === this.rowSelection.size;
};
IgxGridSelectionService.prototype.hasSomeRowSelected = function () {
var _this = this;
var filteredData = this.isFilteringApplied() ?
this.getRowIDs(this.grid.filteredData).some(function (rID) { return _this.isRowSelected(rID); }) : true;
return this.rowSelection.size > 0 && filteredData && !this.areAllRowSelected();
};
Object.defineProperty(IgxGridSelectionService.prototype, "filteredSelectedRowIds", {
get: function () {
var _this = this;
return this.isFilteringApplied() ?
this.getRowIDs(this.allData).filter(function (rowID) { return _this.isRowSelected(rowID); }) :
this.getSelectedRows().filter(function (rowID) { return !_this.isRowDeleted(rowID); });
},
enumerable: true,
configurable: true
});
IgxGridSelectionService.prototype.emitRowSelectionEvent = function (newSelection, added, removed, event) {
var currSelection = this.getSelectedRows();
if (this.areEqualCollections(currSelection, newSelection)) {
return;
}
var args = {
oldSelection: currSelection, newSelection: newSelection,
added: added, removed: removed, event: event, cancel: false
};
this.grid.onRowSelectionChange.emit(args);
if (args.cancel) {
return;
}
this.selectRowsWithNoEvent(args.newSelection, true);
};
IgxGridSelectionService.prototype.getRowDataById = function (rowID) {
if (!this.grid.primaryKey) {
return rowID;
}
var rowIndex = this.getRowIDs(this.grid.gridAPI.get_all_data(true)).indexOf(rowID);
return rowIndex < 0 ? {} : this.grid.gridAPI.get_all_data(true)[rowIndex];
};
IgxGridSelectionService.prototype.getRowIDs = function (data) {
var _this = this;
return this.grid.primaryKey && data.length ? data.map(function (rec) { return rec[_this.grid.primaryKey]; }) : data;
};
IgxGridSelectionService.prototype.clearHeaderCBState = function () {
this.allRowsSelected = undefined;
};
/**Clear rowSelection and update checkbox state*/
IgxGridSelectionService.prototype.clearAllSelectedRows = function () {
this.rowSelection.clear();
this.clearHeaderCBState();
};
Object.defineProperty(IgxGridSelectionService.prototype, "allData", {
/** Returns all data in the grid, with applied filtering and sorting and without deleted rows. */
get: function () {
var _this = this;
var allData = this.isFilteringApplied() || this.grid.sortingExpressions.length ?
this.grid.filteredSortedData : this.grid.gridAPI.get_all_data(true);
return allData.filter(function (rData) { return !_this.isRowDeleted(_this.grid.gridAPI.get_row_id(rData)); });
},
enumerable: true,
configurable: true
});
IgxGridSelectionService.prototype.areEqualCollections = function (first, second) {
return first.length === second.length && new Set(first.concat(second)).size === first.length;
};
IgxGridSelectionService.prototype.isFilteringApplied = function () {
return this.grid.filteringExpressionsTree.filteringOperands.length > 0;
};
IgxGridSelectionService.prototype.isRowDeleted = function (rowID) {
return this.grid.gridAPI.row_deleted_transaction(rowID);
};
IgxGridSelectionService.ctorParameters = function () { return [
{ type: NgZone }
]; };
IgxGridSelectionService = __decorate([
Injectable(),
__metadata("design:paramtypes", [NgZone])
], IgxGridSelectionService);
return IgxGridSelectionService;
}());
export { IgxGridSelectionService };
export function isChromium() {
return (/Chrom|e?ium/g.test(navigator.userAgent) || /Google Inc/g.test(navigator.vendor)) && !/Edge/g.test(navigator.userAgent);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2dyaWRzL3NlbGVjdGlvbi9zZWxlY3Rpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBeUNqRSw2Q0FBNkM7QUFFN0M7SUFLSSxnQkFBbUIsRUFBTyxFQUFTLEtBQWEsRUFBUyxJQUFTO1FBQS9DLE9BQUUsR0FBRixFQUFFLENBQUs7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBSztJQUFHLENBQUM7SUFFdEUsb0NBQW1CLEdBQW5CO1FBQ0ksT0FBTztZQUNILEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNkLFFBQVEsZUFBUSxJQUFJLENBQUMsSUFBSSxDQUFFO1lBQzNCLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTztZQUN0QixNQUFNLEVBQUUsS0FBSztTQUNoQixDQUFDO0lBQ04sQ0FBQztJQUNMLGFBQUM7QUFBRCxDQUFDLEFBZkQsSUFlQzs7QUFFRDtJQUtJLGlCQUNXLEVBQUUsRUFDRixRQUFnQixFQUNoQixNQUFNLEVBQ04sS0FBVSxFQUNWLFNBQWMsRUFDZCxPQUFZO1FBTFosT0FBRSxHQUFGLEVBQUUsQ0FBQTtRQUNGLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBQTtRQUNOLFVBQUssR0FBTCxLQUFLLENBQUs7UUFDVixjQUFTLEdBQVQsU0FBUyxDQUFLO1FBQ2QsWUFBTyxHQUFQLE9BQU8sQ0FBSztJQUFHLENBQUM7SUFFM0IsOEJBQVksR0FBWixVQUFhLEtBQVU7UUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG9C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