(root node, shared between two differs)\n * (first differ) | <--- Generates \"prepend\" command (which later executes `rootNode.insertBefore(...)`)\n * ├─────────── | \n * │ | \n * (second differ | \n * - TDs) | \n * │ | \n * └─────────── | \n */\n leads.push(['prepend', nextIndex]);\n }\n } else if (nextIndex > currentIndex) {\n // This emulates DOM behavior when we try to append (or replace) an element which is already\n // mounted. The old index in the array has to be popped out indicating that an element was\n // moved to a different position.\n if (currentViewOrder.has(nextIndex)) {\n currentViewOrder.remove(nextIndex);\n\n // Decrease loop size to prevent generating \"remove\" leads. \"remove\" leads are necessary only for nodes\n // which are not mounted in current DOM order.\n if (nextViewSize <= currentViewOrder.length) {\n maxSize -= 1;\n }\n }\n leads.push(['replace', nextIndex, currentIndex]);\n } else if (nextIndex < currentIndex) {\n const indexToRemove = currentViewOrder.prepend(nextIndex);\n leads.push(['insert_before', nextIndex, currentIndex, indexToRemove]);\n } else {\n // for the same current and next indexes do nothing.\n leads.push(['none', nextIndex]);\n }\n }\n return leads;\n }\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewDiffer/index.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewDiffer/viewOrder.mjs":
/*!*****************************************************************************************************!*\
!*** ./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewDiffer/viewOrder.mjs ***!
\*****************************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ViewOrder: () => (/* binding */ ViewOrder)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n/* harmony import */ var core_js_modules_es_array_unshift_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.unshift.js */ \"./node_modules/core-js/modules/es.array.unshift.js\");\n\n\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * The view order is a list of indexes that represent the order of the rendered elements.\n *\n * @class {ViewOrder}\n */\nclass ViewOrder {\n constructor(viewOffset, viewSize) {\n _defineProperty(this, \"order\", []);\n this.order = [...Array(viewSize).keys()].map(i => viewOffset + i);\n }\n\n /**\n * The length of the view order.\n *\n * @returns {number}\n */\n get length() {\n return this.order.length;\n }\n\n /**\n * Checks if the view order contains the offset index.\n *\n * @param {number} offsetIndex The offset index.\n * @returns {boolean}\n */\n has(offsetIndex) {\n return this.order.indexOf(offsetIndex) > -1;\n }\n\n /**\n * Gets the offset index at the given zero-based index. If the index\n * is out of bounds, -1 is returned.\n *\n * @param {number} zeroBasedIndex The zero-based index.\n * @returns {number}\n */\n get(zeroBasedIndex) {\n return zeroBasedIndex < this.order.length ? this.order[zeroBasedIndex] : -1;\n }\n\n /**\n * Removes the offset index from the view order.\n *\n * @param {number} offsetIndex The offset index.\n */\n remove(offsetIndex) {\n this.order.splice(this.order.indexOf(offsetIndex), 1);\n }\n\n /**\n * Prepends the offset index to the view order. To keep the order length constant,\n * the last offset index is removed.\n *\n * @param {number} offsetIndex The offset index.\n * @returns {number}\n */\n prepend(offsetIndex) {\n this.order.unshift(offsetIndex);\n return this.order.pop();\n }\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewDiffer/viewOrder.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewSize.mjs":
/*!*****************************************************************************************!*\
!*** ./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewSize.mjs ***!
\*****************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ViewSize: () => (/* binding */ ViewSize)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * Holder for current and next size (count of rendered and to render DOM elements) and offset.\n *\n * @class {ViewSize}\n */\nclass ViewSize {\n constructor() {\n /**\n * Current size of the rendered DOM elements.\n *\n * @type {number}\n */\n _defineProperty(this, \"currentSize\", 0);\n /**\n * Next size of the rendered DOM elements which should be fulfilled.\n *\n * @type {number}\n */\n _defineProperty(this, \"nextSize\", 0);\n /**\n * Current offset.\n *\n * @type {number}\n */\n _defineProperty(this, \"currentOffset\", 0);\n /**\n * Next offset.\n *\n * @type {number}\n */\n _defineProperty(this, \"nextOffset\", 0);\n }\n /**\n * Sets new size of the rendered DOM elements.\n *\n * @param {number} size The size.\n */\n setSize(size) {\n this.currentSize = this.nextSize;\n this.nextSize = size;\n }\n\n /**\n * Sets new offset.\n *\n * @param {number} offset The offset.\n */\n setOffset(offset) {\n this.currentOffset = this.nextOffset;\n this.nextOffset = offset;\n }\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewSize.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewSizeSet.mjs":
/*!********************************************************************************************!*\
!*** ./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewSizeSet.mjs ***!
\********************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ViewSizeSet: () => (/* binding */ ViewSizeSet)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n/* harmony import */ var _viewSize_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./viewSize.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewSize.mjs\");\n/* harmony import */ var _constants_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/constants.mjs\");\n\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n/**\n * The class is a source of the truth of information about the current and\n * next size of the rendered DOM elements and current and next offset of\n * the view. That information allows us to calculate diff between current\n * DOM order and this which should be rendered without touching the DOM API at all.\n *\n * Mostly the ViewSizeSet is created for each individual renderer. But in\n * the table, there is one case where this size information should be shared\n * between two different instances (different table renderers). This is a TR\n * element which can contain TH elements - managed by own renderer and\n * TD elements - managed by another renderer. To generate correct DOM order\n * for them it is required to connect these two instances by reference\n * through `sharedSize`.\n *\n * @class {ViewSizeSet}\n */\nclass ViewSizeSet {\n constructor() {\n /**\n * Holder for current and next view size and offset.\n *\n * @type {ViewSize}\n */\n _defineProperty(this, \"size\", new _viewSize_mjs__WEBPACK_IMPORTED_MODULE_1__.ViewSize());\n /**\n * Defines if this instance shares its size with another instance. If it's in the shared\n * mode it defines what space it occupies ('top' or 'bottom').\n *\n * @type {number}\n */\n _defineProperty(this, \"workingSpace\", _constants_mjs__WEBPACK_IMPORTED_MODULE_2__.WORKING_SPACE_ALL);\n /**\n * Shared Size instance.\n *\n * @type {ViewSize}\n */\n _defineProperty(this, \"sharedSize\", null);\n }\n /**\n * Sets the size for rendered elements. It can be a size for rows, cells or size for row\n * headers etc.\n *\n * @param {number} size The size.\n */\n setSize(size) {\n this.size.setSize(size);\n }\n\n /**\n * Sets the offset for rendered elements. The offset describes the shift between 0 and\n * the first rendered element according to the scroll position.\n *\n * @param {number} offset The offset.\n */\n setOffset(offset) {\n this.size.setOffset(offset);\n }\n\n /**\n * Returns ViewSize instance.\n *\n * @returns {ViewSize}\n */\n getViewSize() {\n return this.size;\n }\n\n /**\n * Checks if this ViewSizeSet is sharing the size with another instance.\n *\n * @returns {boolean}\n */\n isShared() {\n return this.sharedSize !== null;\n }\n\n /**\n * Checks what working space describes this size instance.\n *\n * @param {number} workingSpace The number which describes the type of the working space (see constants.js).\n * @returns {boolean}\n */\n isPlaceOn(workingSpace) {\n return this.workingSpace === workingSpace;\n }\n\n /**\n * Appends the ViewSizeSet instance to this instance that turns it into a shared mode.\n *\n * @param {ViewSizeSet} viewSize The instance of the ViewSizeSet class.\n */\n append(viewSize) {\n this.workingSpace = _constants_mjs__WEBPACK_IMPORTED_MODULE_2__.WORKING_SPACE_TOP;\n viewSize.workingSpace = _constants_mjs__WEBPACK_IMPORTED_MODULE_2__.WORKING_SPACE_BOTTOM;\n this.sharedSize = viewSize.getViewSize();\n }\n\n /**\n * Prepends the ViewSize instance to this instance that turns it into a shared mode.\n *\n * @param {ViewSizeSet} viewSize The instance of the ViewSizeSet class.\n */\n prepend(viewSize) {\n this.workingSpace = _constants_mjs__WEBPACK_IMPORTED_MODULE_2__.WORKING_SPACE_BOTTOM;\n viewSize.workingSpace = _constants_mjs__WEBPACK_IMPORTED_MODULE_2__.WORKING_SPACE_TOP;\n this.sharedSize = viewSize.getViewSize();\n }\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/3rdparty/walkontable/src/utils/orderView/viewSizeSet.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/3rdparty/walkontable/src/utils/row.mjs":
/*!**************************************************************************!*\
!*** ./node_modules/handsontable/3rdparty/walkontable/src/utils/row.mjs ***!
\**************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ RowUtils)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * Row utils class contains all necessary information about sizes of the rows.\n *\n * @class {RowUtils}\n */\nclass RowUtils {\n /**\n * @param {TableDao} dataAccessObject The table Data Access Object.\n * @param {Settings} wtSettings The walkontable settings.\n */\n constructor(dataAccessObject, wtSettings) {\n /**\n * @type {TableDao}\n */\n _defineProperty(this, \"dataAccessObject\", void 0);\n /**\n * @type {Settings}\n */\n _defineProperty(this, \"wtSettings\", void 0);\n this.dataAccessObject = dataAccessObject;\n this.wtSettings = wtSettings;\n }\n\n /**\n * Returns row height based on passed source index.\n *\n * @param {number} sourceIndex Row source index.\n * @returns {number}\n */\n getHeight(sourceIndex) {\n let height = this.wtSettings.getSetting('rowHeight', sourceIndex);\n const oversizedHeight = this.dataAccessObject.wtViewport.oversizedRows[sourceIndex];\n if (oversizedHeight !== undefined) {\n height = height === undefined ? oversizedHeight : Math.max(height, oversizedHeight);\n }\n return height;\n }\n\n /**\n * Returns row height based on passed source index for the specified overlay type.\n *\n * @param {number} sourceIndex Row source index.\n * @param {'inline_start'|'top'|'top_inline_start_corner'|'bottom'|'bottom_inline_start_corner'|'master'} overlayName The overlay name.\n * @returns {number}\n */\n getHeightByOverlayName(sourceIndex, overlayName) {\n let height = this.wtSettings.getSetting('rowHeightByOverlayName', sourceIndex, overlayName);\n const oversizedHeight = this.dataAccessObject.wtViewport.oversizedRows[sourceIndex];\n if (oversizedHeight !== undefined) {\n height = height === undefined ? oversizedHeight : Math.max(height, oversizedHeight);\n }\n return height;\n }\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/3rdparty/walkontable/src/utils/row.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/3rdparty/walkontable/src/utils/stylesHandler.mjs":
/*!************************************************************************************!*\
!*** ./node_modules/handsontable/3rdparty/walkontable/src/utils/stylesHandler.mjs ***!
\************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StylesHandler: () => (/* binding */ StylesHandler)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ \"./node_modules/core-js/modules/esnext.iterator.for-each.js\");\n/* harmony import */ var _helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../helpers/dom/element.mjs */ \"./node_modules/handsontable/helpers/dom/element.mjs\");\n/* harmony import */ var _helpers_console_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../helpers/console.mjs */ \"./node_modules/handsontable/helpers/console.mjs\");\n\n\n\nfunction _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }\nfunction _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }\nfunction _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); }\nfunction _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }\nfunction _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }\nfunction _assertClassBrand(e, t, n) { if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError(\"Private element is not present on this object\"); }\n\n\nconst CLASSIC_THEME_DEFAULT_HEIGHT = 23;\n\n/**\n * Handles the theme-related style operations.\n */\nvar _themeName = /*#__PURE__*/new WeakMap();\nvar _rootElement = /*#__PURE__*/new WeakMap();\nvar _rootComputedStyle = /*#__PURE__*/new WeakMap();\nvar _rootDocument = /*#__PURE__*/new WeakMap();\nvar _isClassicTheme = /*#__PURE__*/new WeakMap();\nvar _cssVars = /*#__PURE__*/new WeakMap();\nvar _computedStyles = /*#__PURE__*/new WeakMap();\nvar _StylesHandler_brand = /*#__PURE__*/new WeakSet();\nclass StylesHandler {\n /**\n * Initializes a new instance of the `StylesHandler` class.\n *\n * @param {object} domBindings - The DOM bindings for the instance.\n */\n constructor(domBindings) {\n /**\n * Calculates the row height based on the current theme and CSS variables.\n *\n * @returns {number|null} The calculated row height, or `null` if any required CSS variable is not found.\n */\n _classPrivateMethodInitSpec(this, _StylesHandler_brand);\n /**\n * The name of the theme.\n *\n * @type {string|undefined}\n */\n _classPrivateFieldInitSpec(this, _themeName, void 0);\n /**\n * The instance's root element.\n *\n * @type {HTMLElement}\n */\n _classPrivateFieldInitSpec(this, _rootElement, void 0);\n /**\n * The computed style of the root element.\n *\n * @type {CSSStyleDeclaration}\n * @private\n */\n _classPrivateFieldInitSpec(this, _rootComputedStyle, void 0);\n /**\n * The root document of the instance.\n *\n * @type {Document}\n * @private\n */\n _classPrivateFieldInitSpec(this, _rootDocument, void 0);\n /**\n * `true` if the classic theme is enabled, `false` otherwise.\n *\n * @type {boolean}\n */\n _classPrivateFieldInitSpec(this, _isClassicTheme, true);\n /**\n * An object to store CSS variable values.\n *\n * @type {object}\n * @private\n */\n _classPrivateFieldInitSpec(this, _cssVars, {});\n /**\n * Stores the computed styles for various elements.\n *\n * @type {object} - An object containing the computed styles if a nested structore of `element: { [element type]: {property: value} }`.\n * @private\n */\n _classPrivateFieldInitSpec(this, _computedStyles, {});\n _classPrivateFieldSet(_rootElement, this, domBindings.rootTable.parentElement.parentElement);\n _classPrivateFieldSet(_rootDocument, this, domBindings.rootDocument);\n }\n\n /**\n * Gets the value indicating whether the classic theme is enabled.\n *\n * @returns {boolean} `true` if the classic theme is enabled, `false` otherwise.\n */\n isClassicTheme() {\n return _classPrivateFieldGet(_isClassicTheme, this);\n }\n\n /**\n * Retrieves the value of a specified CSS variable.\n *\n * @param {string} variableName - The name of the CSS variable to retrieve.\n * @returns {number|null|undefined} The value of the specified CSS variable, or `undefined` if not found.\n */\n getCSSVariableValue(variableName) {\n var _assertClassBrand$cal;\n if (_classPrivateFieldGet(_isClassicTheme, this)) {\n return null;\n }\n if (_classPrivateFieldGet(_cssVars, this)[`--ht-${variableName}`]) {\n return _classPrivateFieldGet(_cssVars, this)[`--ht-${variableName}`];\n }\n const acquiredValue = (_assertClassBrand$cal = _assertClassBrand(_StylesHandler_brand, this, _getParsedNumericCSSValue).call(this, `--ht-${variableName}`)) !== null && _assertClassBrand$cal !== void 0 ? _assertClassBrand$cal : _assertClassBrand(_StylesHandler_brand, this, _getCSSValue).call(this, `--ht-${variableName}`);\n if (acquiredValue !== null) {\n _classPrivateFieldGet(_cssVars, this)[`--ht-${variableName}`] = acquiredValue;\n return acquiredValue;\n }\n }\n\n /**\n * Retrieves the computed style value for a specified CSS property of a `td` element.\n *\n * @param {string} cssProperty - The CSS property to retrieve the value for.\n * @returns {number|string|undefined} The value of the specified CSS property, or `undefined` if not found.\n */\n getStyleForTD(cssProperty) {\n var _classPrivateFieldGet2;\n return (_classPrivateFieldGet2 = _classPrivateFieldGet(_computedStyles, this)) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.td[cssProperty];\n }\n\n /**\n * Calculates the row height based on the current theme and CSS variables.\n *\n * @returns {number} The calculated row height.\n */\n getDefaultRowHeight() {\n if (_classPrivateFieldGet(_isClassicTheme, this)) {\n return CLASSIC_THEME_DEFAULT_HEIGHT;\n }\n const calculatedRowHeight = _assertClassBrand(_StylesHandler_brand, this, _calculateRowHeight).call(this);\n if (!calculatedRowHeight && (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_3__.hasClass)(_classPrivateFieldGet(_rootElement, this), 'ht-wrapper')) {\n (0,_helpers_console_mjs__WEBPACK_IMPORTED_MODULE_4__.warn)(`The \"${_classPrivateFieldGet(_themeName, this)}\" theme is enabled, but its stylesheets are missing or not imported correctly. \\\nImport the correct CSS files in order to use that theme.`);\n _classPrivateFieldSet(_isClassicTheme, this, true);\n this.useTheme();\n return CLASSIC_THEME_DEFAULT_HEIGHT;\n }\n return calculatedRowHeight;\n }\n\n /**\n * Checks if the cells are using the `border-box` box-sizing model.\n *\n * @returns {boolean}\n */\n areCellsBorderBox() {\n return this.getStyleForTD('box-sizing') === 'border-box';\n }\n\n /**\n * Applies the specified theme to the instance.\n *\n * @param {string|undefined|boolean} [themeName] - The name of the theme to apply.\n */\n useTheme(themeName) {\n if (!themeName) {\n _assertClassBrand(_StylesHandler_brand, this, _cacheStylesheetValues).call(this);\n _classPrivateFieldSet(_isClassicTheme, this, true);\n _classPrivateFieldSet(_themeName, this, themeName || undefined);\n return;\n }\n if (themeName && themeName !== _classPrivateFieldGet(_themeName, this)) {\n if (_classPrivateFieldGet(_themeName, this)) {\n _assertClassBrand(_StylesHandler_brand, this, _clearCachedValues).call(this);\n }\n _classPrivateFieldSet(_themeName, this, themeName);\n _classPrivateFieldSet(_isClassicTheme, this, false);\n _assertClassBrand(_StylesHandler_brand, this, _applyClassNames).call(this);\n _assertClassBrand(_StylesHandler_brand, this, _cacheStylesheetValues).call(this);\n }\n }\n\n /**\n * Gets the name of the theme.\n *\n * @returns {string|undefined}\n */\n getThemeName() {\n return _classPrivateFieldGet(_themeName, this);\n }\n\n /**\n * Removes the theme-related class names from the root element.\n */\n removeClassNames() {\n if ((0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_3__.hasClass)(_classPrivateFieldGet(_rootElement, this), _classPrivateFieldGet(_themeName, this))) {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_3__.removeClass)(_classPrivateFieldGet(_rootElement, this), _classPrivateFieldGet(_themeName, this));\n }\n }\n}\nfunction _calculateRowHeight() {\n const lineHeightVarValue = this.getCSSVariableValue('line-height');\n const verticalPaddingVarValue = this.getCSSVariableValue('cell-vertical-padding');\n const bottomBorderWidth = Math.ceil(parseFloat(this.getStyleForTD('border-bottom-width')));\n if (lineHeightVarValue === null || verticalPaddingVarValue === null || isNaN(bottomBorderWidth)) {\n return null;\n }\n return lineHeightVarValue + 2 * verticalPaddingVarValue + bottomBorderWidth;\n}\n/**\n * Applies the necessary class names to the root element.\n */\nfunction _applyClassNames() {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_3__.removeClass)(_classPrivateFieldGet(_rootElement, this), /ht-theme-.*/g);\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_3__.addClass)(_classPrivateFieldGet(_rootElement, this), _classPrivateFieldGet(_themeName, this));\n}\n/**\n * Caches the computed style values for the root element and `td` element.\n */\nfunction _cacheStylesheetValues() {\n if (!this.isClassicTheme()) {\n _classPrivateFieldSet(_rootComputedStyle, this, getComputedStyle(_classPrivateFieldGet(_rootElement, this)));\n }\n const stylesForTD = _assertClassBrand(_StylesHandler_brand, this, _getStylesForTD).call(this, ['box-sizing', 'border-bottom-width']);\n _classPrivateFieldGet(_computedStyles, this).td = {\n ..._classPrivateFieldGet(_computedStyles, this).td,\n ...{\n 'box-sizing': stylesForTD['box-sizing'],\n 'border-bottom-width': stylesForTD['border-bottom-width']\n }\n };\n}\n/**\n * Retrieves and processes the computed styles for a `td` element.\n *\n * This method creates a temporary table structure, appends it to the root element,\n * retrieves the computed styles for the `td` element, and then removes the table\n * from the DOM. The computed styles are passed to the provided callback function.\n *\n * @param {Array} cssProps - An array of CSS properties to retrieve.\n * @returns {object} An object containing the requested computed styles for the `td` element.\n * @private\n */\nfunction _getStylesForTD(cssProps) {\n const rootDocument = _classPrivateFieldGet(_rootDocument, this);\n const rootElement = _classPrivateFieldGet(_rootElement, this);\n const table = rootDocument.createElement('table');\n const tbody = rootDocument.createElement('tbody');\n const tr = rootDocument.createElement('tr');\n // This needs not to be the first row in order to get \"regular\" vaules.\n const tr2 = rootDocument.createElement('tr');\n const td = rootDocument.createElement('td');\n tr2.appendChild(td);\n tbody.appendChild(tr);\n tbody.appendChild(tr2);\n table.appendChild(tbody);\n rootElement.appendChild(table);\n const computedStyle = getComputedStyle(td);\n const returnObject = {};\n cssProps.forEach(prop => {\n returnObject[prop] = computedStyle.getPropertyValue(prop);\n });\n rootElement.removeChild(table);\n return returnObject;\n}\n/**\n * Parses the numeric value of a specified CSS property from the root element's computed style.\n *\n * @param {string} property - The CSS property to retrieve and parse.\n * @returns {number|null} The parsed value of the CSS property or `null` if non-existent.\n */\nfunction _getParsedNumericCSSValue(property) {\n const parsedValue = Math.ceil(parseFloat(_assertClassBrand(_StylesHandler_brand, this, _getCSSValue).call(this, property)));\n return Number.isNaN(parsedValue) ? null : parsedValue;\n}\n/**\n * Retrieves the non-numeric value of a specified CSS property from the root element's computed style.\n *\n * @param {string} property - The CSS property to retrieve.\n * @returns {string|null} The value of the specified CSS property or `null` if non-existent.\n */\nfunction _getCSSValue(property) {\n const acquiredValue = _classPrivateFieldGet(_rootComputedStyle, this).getPropertyValue(property);\n return acquiredValue === '' ? null : acquiredValue;\n}\n/**\n * Clears the cached values.\n */\nfunction _clearCachedValues() {\n _classPrivateFieldSet(_computedStyles, this, {});\n _classPrivateFieldSet(_cssVars, this, {});\n _classPrivateFieldSet(_isClassicTheme, this, true);\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/3rdparty/walkontable/src/utils/stylesHandler.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/3rdparty/walkontable/src/viewport.mjs":
/*!*************************************************************************!*\
!*** ./node_modules/handsontable/3rdparty/walkontable/src/viewport.mjs ***!
\*************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var _helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../helpers/dom/element.mjs */ \"./node_modules/handsontable/helpers/dom/element.mjs\");\n/* harmony import */ var _helpers_object_mjs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../../helpers/object.mjs */ \"./node_modules/handsontable/helpers/object.mjs\");\n/* harmony import */ var _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./calculator/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/calculationType/renderedAllRows.mjs\");\n/* harmony import */ var _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./calculator/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/calculationType/renderedRows.mjs\");\n/* harmony import */ var _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./calculator/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/calculationType/fullyVisibleRows.mjs\");\n/* harmony import */ var _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./calculator/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/calculationType/partiallyVisibleRows.mjs\");\n/* harmony import */ var _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./calculator/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/calculationType/renderedAllColumns.mjs\");\n/* harmony import */ var _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./calculator/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.mjs\");\n/* harmony import */ var _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./calculator/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/calculationType/fullyVisibleColumns.mjs\");\n/* harmony import */ var _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./calculator/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/calculationType/partiallyVisibleColumns.mjs\");\n/* harmony import */ var _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./calculator/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/viewportRows.mjs\");\n/* harmony import */ var _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./calculator/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/viewportColumns.mjs\");\n\n\n\n\n\n/**\n * @class Viewport\n */\nclass Viewport {\n /**\n * @param {ViewportDao} dataAccessObject The Walkontable instance.\n * @param {DomBindings} domBindings Bindings into DOM.\n * @param {Settings} wtSettings The Walkontable settings.\n * @param {EventManager} eventManager The instance event manager.\n * @param {Table} wtTable The table.\n */\n constructor(dataAccessObject, domBindings, wtSettings, eventManager, wtTable) {\n this.dataAccessObject = dataAccessObject;\n // legacy support\n this.wot = dataAccessObject.wot;\n this.instance = this.wot;\n this.domBindings = domBindings;\n this.wtSettings = wtSettings;\n this.wtTable = wtTable;\n this.oversizedRows = [];\n this.oversizedColumnHeaders = [];\n this.hasOversizedColumnHeadersMarked = {};\n this.clientHeight = 0;\n this.rowHeaderWidth = NaN;\n this.rowsVisibleCalculator = null;\n this.columnsVisibleCalculator = null;\n this.rowsCalculatorTypes = new Map([['rendered', () => this.wtSettings.getSetting('renderAllRows') ? new _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_2__.RenderedAllRowsCalculationType() : new _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_3__.RenderedRowsCalculationType()], ['fullyVisible', () => new _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_4__.FullyVisibleRowsCalculationType()], ['partiallyVisible', () => new _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_5__.PartiallyVisibleRowsCalculationType()]]);\n this.columnsCalculatorTypes = new Map([['rendered', () => this.wtSettings.getSetting('renderAllColumns') ? new _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_6__.RenderedAllColumnsCalculationType() : new _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_7__.RenderedColumnsCalculationType()], ['fullyVisible', () => new _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_8__.FullyVisibleColumnsCalculationType()], ['partiallyVisible', () => new _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_9__.PartiallyVisibleColumnsCalculationType()]]);\n this.eventManager = eventManager;\n this.eventManager.addEventListener(this.domBindings.rootWindow, 'resize', () => {\n this.clientHeight = this.getWorkspaceHeight();\n });\n }\n\n /**\n * @returns {number}\n */\n getWorkspaceHeight() {\n const currentDocument = this.domBindings.rootDocument;\n const trimmingContainer = this.dataAccessObject.topOverlayTrimmingContainer;\n let height = 0;\n if (trimmingContainer === this.domBindings.rootWindow) {\n height = currentDocument.documentElement.clientHeight;\n } else {\n const elemHeight = (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_10__.outerHeight)(trimmingContainer);\n\n // returns height without DIV scrollbar\n height = elemHeight > 0 && trimmingContainer.clientHeight > 0 ? trimmingContainer.clientHeight : Infinity;\n }\n return height;\n }\n\n /**\n * @returns {number}\n */\n getViewportHeight() {\n let containerHeight = this.getWorkspaceHeight();\n if (containerHeight === Infinity) {\n return containerHeight;\n }\n const columnHeaderHeight = this.getColumnHeaderHeight();\n if (columnHeaderHeight > 0) {\n containerHeight -= columnHeaderHeight;\n }\n return containerHeight;\n }\n\n /**\n * Gets the width of the table workspace (in pixels). The workspace size in the current\n * implementation returns the width of the table holder element including scrollbar width when\n * the table has defined size and the width of the window excluding scrollbar width when\n * the table has no defined size (the window is a scrollable container).\n *\n * This is a bug, as the method should always return stable values, always without scrollbar width.\n * Changing this behavior would break the column calculators, which would also need to be adjusted.\n *\n * @returns {number}\n */\n getWorkspaceWidth() {\n const {\n rootDocument,\n rootWindow\n } = this.domBindings;\n const trimmingContainer = this.dataAccessObject.inlineStartOverlayTrimmingContainer;\n let width;\n if (trimmingContainer === rootWindow) {\n const totalColumns = this.wtSettings.getSetting('totalColumns');\n width = this.wtTable.holder.offsetWidth;\n if (this.getRowHeaderWidth() + this.sumColumnWidths(0, totalColumns) > width) {\n width = rootDocument.documentElement.clientWidth;\n }\n } else {\n width = trimmingContainer.clientWidth;\n }\n return width;\n }\n\n /**\n * @returns {number}\n */\n getViewportWidth() {\n const containerWidth = this.getWorkspaceWidth();\n if (containerWidth === Infinity) {\n return containerWidth;\n }\n const rowHeaderWidth = this.getRowHeaderWidth();\n if (rowHeaderWidth > 0) {\n return containerWidth - rowHeaderWidth;\n }\n return containerWidth;\n }\n\n /**\n * Checks if viewport has vertical scroll.\n *\n * @returns {boolean}\n */\n hasVerticalScroll() {\n if (this.isVerticallyScrollableByWindow()) {\n const documentElement = this.domBindings.rootDocument.documentElement;\n return documentElement.scrollHeight > documentElement.clientHeight;\n }\n const {\n holder,\n hider\n } = this.wtTable;\n const holderHeight = holder.clientHeight;\n const hiderOffsetHeight = hider.offsetHeight;\n if (holderHeight < hiderOffsetHeight) {\n return true;\n }\n return hiderOffsetHeight > this.getWorkspaceHeight();\n }\n\n /**\n * Checks if viewport has horizontal scroll.\n *\n * @returns {boolean}\n */\n hasHorizontalScroll() {\n if (this.isVerticallyScrollableByWindow()) {\n const documentElement = this.domBindings.rootDocument.documentElement;\n return documentElement.scrollWidth > documentElement.clientWidth;\n }\n const {\n holder,\n hider\n } = this.wtTable;\n const holderWidth = holder.clientWidth;\n const hiderOffsetWidth = hider.offsetWidth;\n if (holderWidth < hiderOffsetWidth) {\n return true;\n }\n return hiderOffsetWidth > this.getWorkspaceWidth();\n }\n\n /**\n * Checks if the table uses the window as a viewport and if there is a vertical scrollbar.\n *\n * @returns {boolean}\n */\n isVerticallyScrollableByWindow() {\n return this.dataAccessObject.topOverlayTrimmingContainer === this.domBindings.rootWindow;\n }\n\n /**\n * Checks if the table uses the window as a viewport and if there is a horizontal scrollbar.\n *\n * @returns {boolean}\n */\n isHorizontallyScrollableByWindow() {\n return this.dataAccessObject.inlineStartOverlayTrimmingContainer === this.domBindings.rootWindow;\n }\n\n /**\n * @param {number} from The visual column index from the width sum is start calculated.\n * @param {number} length The length of the column to traverse.\n * @returns {number}\n */\n sumColumnWidths(from, length) {\n let sum = 0;\n let column = from;\n while (column < length) {\n sum += this.wtTable.getColumnWidth(column);\n column += 1;\n }\n return sum;\n }\n\n /**\n * @returns {number}\n */\n getWorkspaceOffset() {\n return (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_10__.offset)(this.wtTable.holder);\n }\n\n /**\n * @returns {number}\n */\n getColumnHeaderHeight() {\n const columnHeaders = this.wtSettings.getSetting('columnHeaders');\n if (!columnHeaders.length) {\n this.columnHeaderHeight = 0;\n } else if (isNaN(this.columnHeaderHeight)) {\n this.columnHeaderHeight = (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_10__.outerHeight)(this.wtTable.THEAD);\n }\n return this.columnHeaderHeight;\n }\n\n /**\n * @returns {number}\n */\n getRowHeaderWidth() {\n const rowHeadersWidthSetting = this.wtSettings.getSetting('rowHeaderWidth');\n const rowHeaders = this.wtSettings.getSetting('rowHeaders');\n if (rowHeadersWidthSetting) {\n this.rowHeaderWidth = 0;\n for (let i = 0, len = rowHeaders.length; i < len; i++) {\n this.rowHeaderWidth += rowHeadersWidthSetting[i] || rowHeadersWidthSetting;\n }\n }\n if (isNaN(this.rowHeaderWidth)) {\n if (rowHeaders.length) {\n let TH = this.wtTable.TABLE.querySelector('TH');\n this.rowHeaderWidth = 0;\n for (let i = 0, len = rowHeaders.length; i < len; i++) {\n if (TH) {\n this.rowHeaderWidth += (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_10__.outerWidth)(TH);\n TH = TH.nextSibling;\n } else {\n // yes this is a cheat but it worked like that before, just taking assumption from CSS instead of measuring.\n // TODO: proper fix\n this.rowHeaderWidth += 50;\n }\n }\n } else {\n this.rowHeaderWidth = 0;\n }\n }\n this.rowHeaderWidth = this.wtSettings.getSetting('onModifyRowHeaderWidth', this.rowHeaderWidth) || this.rowHeaderWidth;\n return this.rowHeaderWidth;\n }\n\n /**\n * Creates rows calculators. The type of the calculations can be chosen from the list:\n * - 'rendered' Calculates rows that should be rendered within the current table's viewport;\n * - 'fullyVisible' Calculates rows that are fully visible (used mostly for scrolling purposes);\n * - 'partiallyVisible' Calculates rows that are partially visible (used mostly for scrolling purposes).\n *\n * @param {'rendered' | 'fullyVisible' | 'partiallyVisible'} calculatorTypes The list of the calculation types.\n * @returns {ViewportRowsCalculator}\n */\n createRowsCalculator() {\n let calculatorTypes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['rendered', 'fullyVisible', 'partiallyVisible'];\n const {\n wtSettings,\n wtTable\n } = this;\n let height = this.getViewportHeight();\n let scrollbarHeight;\n let fixedRowsHeight;\n this.rowHeaderWidth = NaN;\n let pos = this.dataAccessObject.topScrollPosition - this.dataAccessObject.topParentOffset;\n const fixedRowsTop = wtSettings.getSetting('fixedRowsTop');\n const fixedRowsBottom = wtSettings.getSetting('fixedRowsBottom');\n const totalRows = wtSettings.getSetting('totalRows');\n if (fixedRowsTop && pos >= 0) {\n fixedRowsHeight = this.dataAccessObject.topOverlay.sumCellSizes(0, fixedRowsTop);\n pos += fixedRowsHeight;\n height -= fixedRowsHeight;\n }\n if (fixedRowsBottom && this.dataAccessObject.bottomOverlay.clone) {\n fixedRowsHeight = this.dataAccessObject.bottomOverlay.sumCellSizes(totalRows - fixedRowsBottom, totalRows);\n height -= fixedRowsHeight;\n }\n if (wtTable.holder.clientHeight === wtTable.holder.offsetHeight) {\n scrollbarHeight = 0;\n } else {\n scrollbarHeight = (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_10__.getScrollbarWidth)(this.domBindings.rootDocument);\n }\n return new _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_11__.ViewportRowsCalculator({\n calculationTypes: calculatorTypes.map(type => [type, this.rowsCalculatorTypes.get(type)()]),\n viewportHeight: height,\n scrollOffset: pos,\n totalRows: wtSettings.getSetting('totalRows'),\n defaultRowHeight: this.instance.stylesHandler.getDefaultRowHeight(),\n rowHeightFn: sourceRow => wtTable.getRowHeight(sourceRow),\n overrideFn: wtSettings.getSettingPure('viewportRowCalculatorOverride'),\n horizontalScrollbarHeight: scrollbarHeight\n });\n }\n\n /**\n * Creates columns calculators. The type of the calculations can be chosen from the list:\n * - 'rendered' Calculates columns that should be rendered within the current table's viewport;\n * - 'fullyVisible' Calculates columns that are fully visible (used mostly for scrolling purposes);\n * - 'partiallyVisible' Calculates columns that are partially visible (used mostly for scrolling purposes).\n *\n * @param {'rendered' | 'fullyVisible' | 'partiallyVisible'} calculatorTypes The list of the calculation types.\n * @returns {ViewportColumnsCalculator}\n */\n createColumnsCalculator() {\n let calculatorTypes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['rendered', 'fullyVisible', 'partiallyVisible'];\n const {\n wtSettings,\n wtTable\n } = this;\n let width = this.getViewportWidth();\n let pos = Math.abs(this.dataAccessObject.inlineStartScrollPosition) - this.dataAccessObject.inlineStartParentOffset;\n this.columnHeaderHeight = NaN;\n const fixedColumnsStart = wtSettings.getSetting('fixedColumnsStart');\n if (fixedColumnsStart && pos >= 0) {\n const fixedColumnsWidth = this.dataAccessObject.inlineStartOverlay.sumCellSizes(0, fixedColumnsStart);\n pos += fixedColumnsWidth;\n width -= fixedColumnsWidth;\n }\n if (wtTable.holder.clientWidth !== wtTable.holder.offsetWidth) {\n width -= (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_10__.getScrollbarWidth)(this.domBindings.rootDocument);\n }\n return new _calculator_index_mjs__WEBPACK_IMPORTED_MODULE_12__.ViewportColumnsCalculator({\n calculationTypes: calculatorTypes.map(type => [type, this.columnsCalculatorTypes.get(type)()]),\n viewportWidth: width,\n scrollOffset: pos,\n totalColumns: wtSettings.getSetting('totalColumns'),\n columnWidthFn: sourceCol => wtTable.getColumnWidth(sourceCol),\n overrideFn: wtSettings.getSettingPure('viewportColumnCalculatorOverride'),\n inlineStartOffset: this.dataAccessObject.inlineStartParentOffset\n });\n }\n\n /**\n * Creates rowsRenderCalculator and columnsRenderCalculator (before draw, to determine what rows and\n * cols should be rendered).\n *\n * @param {boolean} fastDraw If `true`, will try to avoid full redraw and only update the border positions.\n * If `false` or `undefined`, will perform a full redraw.\n * @returns {boolean} The fastDraw value, possibly modified.\n */\n createCalculators() {\n let fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n const {\n wtSettings\n } = this;\n const rowsCalculator = this.createRowsCalculator();\n const columnsCalculator = this.createColumnsCalculator();\n if (fastDraw && !wtSettings.getSetting('renderAllRows')) {\n const proposedRowsVisibleCalculator = rowsCalculator.getResultsFor('fullyVisible');\n fastDraw = this.areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator);\n }\n if (fastDraw && !wtSettings.getSetting('renderAllColumns')) {\n const proposedColumnsVisibleCalculator = columnsCalculator.getResultsFor('fullyVisible');\n fastDraw = this.areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator);\n }\n if (!fastDraw) {\n this.rowsRenderCalculator = rowsCalculator.getResultsFor('rendered');\n this.columnsRenderCalculator = columnsCalculator.getResultsFor('rendered');\n }\n this.rowsVisibleCalculator = rowsCalculator.getResultsFor('fullyVisible');\n this.columnsVisibleCalculator = columnsCalculator.getResultsFor('fullyVisible');\n this.rowsPartiallyVisibleCalculator = rowsCalculator.getResultsFor('partiallyVisible');\n this.columnsPartiallyVisibleCalculator = columnsCalculator.getResultsFor('partiallyVisible');\n return fastDraw;\n }\n\n /**\n * Creates rows and columns calculators (after draw, to determine what are\n * the actually fully visible and partially visible rows and columns).\n */\n createVisibleCalculators() {\n const rowsCalculator = this.createRowsCalculator(['fullyVisible', 'partiallyVisible']);\n const columnsCalculator = this.createColumnsCalculator(['fullyVisible', 'partiallyVisible']);\n this.rowsVisibleCalculator = rowsCalculator.getResultsFor('fullyVisible');\n this.columnsVisibleCalculator = columnsCalculator.getResultsFor('fullyVisible');\n this.rowsPartiallyVisibleCalculator = rowsCalculator.getResultsFor('partiallyVisible');\n this.columnsPartiallyVisibleCalculator = columnsCalculator.getResultsFor('partiallyVisible');\n }\n\n /**\n * Returns information whether proposedRowsVisibleCalculator viewport\n * is contained inside rows rendered in previous draw (cached in rowsRenderCalculator).\n *\n * @param {ViewportRowsCalculator} proposedRowsVisibleCalculator The instance of the viewport calculator to compare with.\n * @returns {boolean} Returns `true` if all proposed visible rows are already rendered (meaning: redraw is not needed).\n * Returns `false` if at least one proposed visible row is not already rendered (meaning: redraw is needed).\n */\n areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) {\n if (!this.rowsVisibleCalculator) {\n return false;\n }\n let {\n startRow,\n endRow\n } = proposedRowsVisibleCalculator;\n\n // if there are no fully visible rows at all...\n if (startRow === null && endRow === null) {\n if (!proposedRowsVisibleCalculator.isVisibleInTrimmingContainer) {\n return true;\n }\n // ...use partially visible rows calculator to determine what render type is needed\n startRow = this.rowsPartiallyVisibleCalculator.startRow;\n endRow = this.rowsPartiallyVisibleCalculator.endRow;\n }\n const {\n startRow: renderedStartRow,\n endRow: renderedEndRow,\n rowStartOffset,\n rowEndOffset\n } = this.rowsRenderCalculator;\n const totalRows = this.wtSettings.getSetting('totalRows') - 1;\n const renderingThreshold = this.wtSettings.getSetting('viewportRowRenderingThreshold');\n if (Number.isInteger(renderingThreshold) && renderingThreshold > 0) {\n startRow = Math.max(0, startRow - Math.min(rowStartOffset, renderingThreshold));\n endRow = Math.min(totalRows, endRow + Math.min(rowEndOffset, renderingThreshold));\n } else if (renderingThreshold === 'auto') {\n startRow = Math.max(0, startRow - Math.ceil(rowStartOffset / 2));\n endRow = Math.min(totalRows, endRow + Math.ceil(rowEndOffset / 2));\n }\n if (startRow < renderedStartRow || startRow === renderedStartRow && startRow > 0) {\n return false;\n } else if (endRow > renderedEndRow || endRow === renderedEndRow && endRow < totalRows) {\n return false;\n }\n return true;\n }\n\n /**\n * Returns information whether proposedColumnsVisibleCalculator viewport\n * is contained inside column rendered in previous draw (cached in columnsRenderCalculator).\n *\n * @param {ViewportRowsCalculator} proposedColumnsVisibleCalculator The instance of the viewport calculator to compare with.\n * @returns {boolean} Returns `true` if all proposed visible columns are already rendered (meaning: redraw is not needed).\n * Returns `false` if at least one proposed visible column is not already rendered (meaning: redraw is needed).\n */\n areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator) {\n if (!this.columnsVisibleCalculator) {\n return false;\n }\n let {\n startColumn,\n endColumn\n } = proposedColumnsVisibleCalculator;\n\n // if there are no fully visible columns at all...\n if (startColumn === null && endColumn === null) {\n if (!proposedColumnsVisibleCalculator.isVisibleInTrimmingContainer) {\n return true;\n }\n // ...use partially visible columns calculator to determine what render type is needed\n startColumn = this.columnsPartiallyVisibleCalculator.startColumn;\n endColumn = this.columnsPartiallyVisibleCalculator.endColumn;\n }\n const {\n startColumn: renderedStartColumn,\n endColumn: renderedEndColumn,\n columnStartOffset,\n columnEndOffset\n } = this.columnsRenderCalculator;\n const totalColumns = this.wtSettings.getSetting('totalColumns') - 1;\n const renderingThreshold = this.wtSettings.getSetting('viewportColumnRenderingThreshold');\n if (Number.isInteger(renderingThreshold) && renderingThreshold > 0) {\n startColumn = Math.max(0, startColumn - Math.min(columnStartOffset, renderingThreshold));\n endColumn = Math.min(totalColumns, endColumn + Math.min(columnEndOffset, renderingThreshold));\n } else if (renderingThreshold === 'auto') {\n startColumn = Math.max(0, startColumn - Math.ceil(columnStartOffset / 2));\n endColumn = Math.min(totalColumns, endColumn + Math.ceil(columnEndOffset / 2));\n }\n if (startColumn < renderedStartColumn || startColumn === renderedStartColumn && startColumn > 0) {\n return false;\n } else if (endColumn > renderedEndColumn || endColumn === renderedEndColumn && endColumn < totalColumns) {\n return false;\n }\n return true;\n }\n\n /**\n * Resets values in keys of the hasOversizedColumnHeadersMarked object after updateSettings.\n */\n resetHasOversizedColumnHeadersMarked() {\n (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_13__.objectEach)(this.hasOversizedColumnHeadersMarked, (value, key, object) => {\n object[key] = undefined;\n });\n }\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Viewport);\n\n//# sourceURL=webpack://front/./node_modules/handsontable/3rdparty/walkontable/src/viewport.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/base.mjs":
/*!********************************************!*\
!*** ./node_modules/handsontable/base.mjs ***!
\********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CellCoords: () => (/* reexport safe */ _3rdparty_walkontable_src_index_mjs__WEBPACK_IMPORTED_MODULE_7__[\"default\"]),\n/* harmony export */ CellRange: () => (/* reexport safe */ _3rdparty_walkontable_src_index_mjs__WEBPACK_IMPORTED_MODULE_8__[\"default\"]),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _core_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./core.mjs */ \"./node_modules/handsontable/core.mjs\");\n/* harmony import */ var _utils_rootInstance_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/rootInstance.mjs */ \"./node_modules/handsontable/utils/rootInstance.mjs\");\n/* harmony import */ var _dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dataMap/index.mjs */ \"./node_modules/handsontable/dataMap/metaManager/metaSchema.mjs\");\n/* harmony import */ var _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./core/hooks/index.mjs */ \"./node_modules/handsontable/core/hooks/index.mjs\");\n/* harmony import */ var _i18n_registry_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./i18n/registry.mjs */ \"./node_modules/handsontable/i18n/registry.mjs\");\n/* harmony import */ var _cellTypes_registry_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cellTypes/registry.mjs */ \"./node_modules/handsontable/cellTypes/registry.mjs\");\n/* harmony import */ var _cellTypes_textType_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cellTypes/textType/index.mjs */ \"./node_modules/handsontable/cellTypes/textType/textType.mjs\");\n/* harmony import */ var _editors_baseEditor_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./editors/baseEditor/index.mjs */ \"./node_modules/handsontable/editors/baseEditor/baseEditor.mjs\");\n/* harmony import */ var _3rdparty_walkontable_src_index_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./3rdparty/walkontable/src/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/cell/coords.mjs\");\n/* harmony import */ var _3rdparty_walkontable_src_index_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./3rdparty/walkontable/src/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/cell/range.mjs\");\n\n\n\n // FIXME: Bug in eslint-plugin-import: https://github.com/benmosher/eslint-plugin-import/issues/1883\n/* eslint-disable import/named */\n\n/* eslint-enable import/named */\n\n\n\n // register default mandatory cell type for the Base package\n(0,_cellTypes_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_cellTypes_textType_index_mjs__WEBPACK_IMPORTED_MODULE_1__.TextCellType);\n\n// export the `BaseEditor` class to the Handsontable global namespace\nHandsontable.editors = {\n BaseEditor: _editors_baseEditor_index_mjs__WEBPACK_IMPORTED_MODULE_2__.BaseEditor\n};\n\n/**\n * @param {HTMLElement} rootElement The element to which the Handsontable instance is injected.\n * @param {object} userSettings The user defined options.\n * @returns {Core}\n */\nfunction Handsontable(rootElement, userSettings) {\n const instance = new _core_mjs__WEBPACK_IMPORTED_MODULE_3__[\"default\"](rootElement, userSettings || {}, _utils_rootInstance_mjs__WEBPACK_IMPORTED_MODULE_4__.rootInstanceSymbol);\n instance.init();\n return instance;\n}\nHandsontable.Core = function (rootElement) {\n let userSettings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return new _core_mjs__WEBPACK_IMPORTED_MODULE_3__[\"default\"](rootElement, userSettings, _utils_rootInstance_mjs__WEBPACK_IMPORTED_MODULE_4__.rootInstanceSymbol);\n};\nHandsontable.DefaultSettings = (0,_dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_5__[\"default\"])();\nHandsontable.hooks = _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_6__.Hooks.getSingleton();\nHandsontable.CellCoords = _3rdparty_walkontable_src_index_mjs__WEBPACK_IMPORTED_MODULE_7__[\"default\"];\nHandsontable.CellRange = _3rdparty_walkontable_src_index_mjs__WEBPACK_IMPORTED_MODULE_8__[\"default\"];\nHandsontable.packageName = 'handsontable';\nHandsontable.buildDate = \"24/04/2025 10:59:00\";\nHandsontable.version = \"15.3.0\";\nHandsontable.languages = {\n dictionaryKeys: _i18n_registry_mjs__WEBPACK_IMPORTED_MODULE_9__.dictionaryKeys,\n getLanguageDictionary: _i18n_registry_mjs__WEBPACK_IMPORTED_MODULE_9__.getLanguageDictionary,\n getLanguagesDictionaries: _i18n_registry_mjs__WEBPACK_IMPORTED_MODULE_9__.getLanguagesDictionaries,\n registerLanguageDictionary: _i18n_registry_mjs__WEBPACK_IMPORTED_MODULE_9__.registerLanguageDictionary,\n getTranslatedPhrase: _i18n_registry_mjs__WEBPACK_IMPORTED_MODULE_9__.getTranslatedPhrase\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Handsontable);\n\n//# sourceURL=webpack://front/./node_modules/handsontable/base.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/autocompleteType/autocompleteType.mjs":
/*!***********************************************************************************!*\
!*** ./node_modules/handsontable/cellTypes/autocompleteType/autocompleteType.mjs ***!
\***********************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AutocompleteCellType: () => (/* binding */ AutocompleteCellType),\n/* harmony export */ CELL_TYPE: () => (/* binding */ CELL_TYPE)\n/* harmony export */ });\n/* harmony import */ var _editors_autocompleteEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../editors/autocompleteEditor/index.mjs */ \"./node_modules/handsontable/editors/autocompleteEditor/autocompleteEditor.mjs\");\n/* harmony import */ var _renderers_autocompleteRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../renderers/autocompleteRenderer/index.mjs */ \"./node_modules/handsontable/renderers/autocompleteRenderer/autocompleteRenderer.mjs\");\n/* harmony import */ var _validators_autocompleteValidator_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../validators/autocompleteValidator/index.mjs */ \"./node_modules/handsontable/validators/autocompleteValidator/autocompleteValidator.mjs\");\n\n\n\nconst CELL_TYPE = 'autocomplete';\nconst AutocompleteCellType = {\n CELL_TYPE,\n editor: _editors_autocompleteEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__.AutocompleteEditor,\n renderer: _renderers_autocompleteRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__.autocompleteRenderer,\n validator: _validators_autocompleteValidator_index_mjs__WEBPACK_IMPORTED_MODULE_2__.autocompleteValidator\n};\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/autocompleteType/autocompleteType.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/checkboxType/checkboxType.mjs":
/*!***************************************************************************!*\
!*** ./node_modules/handsontable/cellTypes/checkboxType/checkboxType.mjs ***!
\***************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CELL_TYPE: () => (/* binding */ CELL_TYPE),\n/* harmony export */ CheckboxCellType: () => (/* binding */ CheckboxCellType)\n/* harmony export */ });\n/* harmony import */ var _editors_checkboxEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../editors/checkboxEditor/index.mjs */ \"./node_modules/handsontable/editors/checkboxEditor/checkboxEditor.mjs\");\n/* harmony import */ var _renderers_checkboxRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../renderers/checkboxRenderer/index.mjs */ \"./node_modules/handsontable/renderers/checkboxRenderer/checkboxRenderer.mjs\");\n\n\nconst CELL_TYPE = 'checkbox';\nconst CheckboxCellType = {\n CELL_TYPE,\n editor: _editors_checkboxEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__.CheckboxEditor,\n renderer: _renderers_checkboxRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__.checkboxRenderer\n};\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/checkboxType/checkboxType.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/dateType/dateType.mjs":
/*!*******************************************************************!*\
!*** ./node_modules/handsontable/cellTypes/dateType/dateType.mjs ***!
\*******************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CELL_TYPE: () => (/* binding */ CELL_TYPE),\n/* harmony export */ DateCellType: () => (/* binding */ DateCellType)\n/* harmony export */ });\n/* harmony import */ var _editors_dateEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../editors/dateEditor/index.mjs */ \"./node_modules/handsontable/editors/dateEditor/dateEditor.mjs\");\n/* harmony import */ var _renderers_dateRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../renderers/dateRenderer/index.mjs */ \"./node_modules/handsontable/renderers/dateRenderer/dateRenderer.mjs\");\n/* harmony import */ var _validators_dateValidator_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../validators/dateValidator/index.mjs */ \"./node_modules/handsontable/validators/dateValidator/dateValidator.mjs\");\n\n\n\nconst CELL_TYPE = 'date';\nconst DateCellType = {\n CELL_TYPE,\n editor: _editors_dateEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__.DateEditor,\n // displays small gray arrow on right side of the cell\n renderer: _renderers_dateRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__.dateRenderer,\n validator: _validators_dateValidator_index_mjs__WEBPACK_IMPORTED_MODULE_2__.dateValidator\n};\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/dateType/dateType.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/dropdownType/dropdownType.mjs":
/*!***************************************************************************!*\
!*** ./node_modules/handsontable/cellTypes/dropdownType/dropdownType.mjs ***!
\***************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CELL_TYPE: () => (/* binding */ CELL_TYPE),\n/* harmony export */ DropdownCellType: () => (/* binding */ DropdownCellType)\n/* harmony export */ });\n/* harmony import */ var _editors_dropdownEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../editors/dropdownEditor/index.mjs */ \"./node_modules/handsontable/editors/dropdownEditor/dropdownEditor.mjs\");\n/* harmony import */ var _renderers_dropdownRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../renderers/dropdownRenderer/index.mjs */ \"./node_modules/handsontable/renderers/dropdownRenderer/dropdownRenderer.mjs\");\n/* harmony import */ var _validators_dropdownValidator_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../validators/dropdownValidator/index.mjs */ \"./node_modules/handsontable/validators/dropdownValidator/dropdownValidator.mjs\");\n\n\n\nconst CELL_TYPE = 'dropdown';\nconst DropdownCellType = {\n CELL_TYPE,\n editor: _editors_dropdownEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__.DropdownEditor,\n renderer: _renderers_dropdownRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__.dropdownRenderer,\n // displays small gray arrow on right side of the cell\n validator: _validators_dropdownValidator_index_mjs__WEBPACK_IMPORTED_MODULE_2__.dropdownValidator,\n filter: false,\n strict: true\n};\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/dropdownType/dropdownType.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/handsontableType/handsontableType.mjs":
/*!***********************************************************************************!*\
!*** ./node_modules/handsontable/cellTypes/handsontableType/handsontableType.mjs ***!
\***********************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CELL_TYPE: () => (/* binding */ CELL_TYPE),\n/* harmony export */ HandsontableCellType: () => (/* binding */ HandsontableCellType)\n/* harmony export */ });\n/* harmony import */ var _editors_handsontableEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../editors/handsontableEditor/index.mjs */ \"./node_modules/handsontable/editors/handsontableEditor/handsontableEditor.mjs\");\n/* harmony import */ var _renderers_handsontableRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../renderers/handsontableRenderer/index.mjs */ \"./node_modules/handsontable/renderers/handsontableRenderer/handsontableRenderer.mjs\");\n\n\nconst CELL_TYPE = 'handsontable';\nconst HandsontableCellType = {\n CELL_TYPE,\n editor: _editors_handsontableEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__.HandsontableEditor,\n // displays small gray arrow on right side of the cell\n renderer: _renderers_handsontableRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__.handsontableRenderer\n};\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/handsontableType/handsontableType.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/index.mjs":
/*!*******************************************************!*\
!*** ./node_modules/handsontable/cellTypes/index.mjs ***!
\*******************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AUTOCOMPLETE_TYPE: () => (/* reexport safe */ _autocompleteType_index_mjs__WEBPACK_IMPORTED_MODULE_1__.CELL_TYPE),\n/* harmony export */ AutocompleteCellType: () => (/* reexport safe */ _autocompleteType_index_mjs__WEBPACK_IMPORTED_MODULE_1__.AutocompleteCellType),\n/* harmony export */ CHECKBOX_TYPE: () => (/* reexport safe */ _checkboxType_index_mjs__WEBPACK_IMPORTED_MODULE_2__.CELL_TYPE),\n/* harmony export */ CheckboxCellType: () => (/* reexport safe */ _checkboxType_index_mjs__WEBPACK_IMPORTED_MODULE_2__.CheckboxCellType),\n/* harmony export */ DATE_TYPE: () => (/* reexport safe */ _dateType_index_mjs__WEBPACK_IMPORTED_MODULE_3__.CELL_TYPE),\n/* harmony export */ DROPDOWN_TYPE: () => (/* reexport safe */ _dropdownType_index_mjs__WEBPACK_IMPORTED_MODULE_4__.CELL_TYPE),\n/* harmony export */ DateCellType: () => (/* reexport safe */ _dateType_index_mjs__WEBPACK_IMPORTED_MODULE_3__.DateCellType),\n/* harmony export */ DropdownCellType: () => (/* reexport safe */ _dropdownType_index_mjs__WEBPACK_IMPORTED_MODULE_4__.DropdownCellType),\n/* harmony export */ HANDSONTABLE_TYPE: () => (/* reexport safe */ _handsontableType_index_mjs__WEBPACK_IMPORTED_MODULE_5__.CELL_TYPE),\n/* harmony export */ HandsontableCellType: () => (/* reexport safe */ _handsontableType_index_mjs__WEBPACK_IMPORTED_MODULE_5__.HandsontableCellType),\n/* harmony export */ NUMERIC_TYPE: () => (/* reexport safe */ _numericType_index_mjs__WEBPACK_IMPORTED_MODULE_6__.CELL_TYPE),\n/* harmony export */ NumericCellType: () => (/* reexport safe */ _numericType_index_mjs__WEBPACK_IMPORTED_MODULE_6__.NumericCellType),\n/* harmony export */ PASSWORD_TYPE: () => (/* reexport safe */ _passwordType_index_mjs__WEBPACK_IMPORTED_MODULE_7__.CELL_TYPE),\n/* harmony export */ PasswordCellType: () => (/* reexport safe */ _passwordType_index_mjs__WEBPACK_IMPORTED_MODULE_7__.PasswordCellType),\n/* harmony export */ SELECT_TYPE: () => (/* reexport safe */ _selectType_index_mjs__WEBPACK_IMPORTED_MODULE_8__.CELL_TYPE),\n/* harmony export */ SelectCellType: () => (/* reexport safe */ _selectType_index_mjs__WEBPACK_IMPORTED_MODULE_8__.SelectCellType),\n/* harmony export */ TEXT_TYPE: () => (/* reexport safe */ _textType_index_mjs__WEBPACK_IMPORTED_MODULE_9__.CELL_TYPE),\n/* harmony export */ TIME_TYPE: () => (/* reexport safe */ _timeType_index_mjs__WEBPACK_IMPORTED_MODULE_10__.CELL_TYPE),\n/* harmony export */ TextCellType: () => (/* reexport safe */ _textType_index_mjs__WEBPACK_IMPORTED_MODULE_9__.TextCellType),\n/* harmony export */ TimeCellType: () => (/* reexport safe */ _timeType_index_mjs__WEBPACK_IMPORTED_MODULE_10__.TimeCellType),\n/* harmony export */ getCellType: () => (/* reexport safe */ _registry_mjs__WEBPACK_IMPORTED_MODULE_0__.getCellType),\n/* harmony export */ getRegisteredCellTypeNames: () => (/* reexport safe */ _registry_mjs__WEBPACK_IMPORTED_MODULE_0__.getRegisteredCellTypeNames),\n/* harmony export */ getRegisteredCellTypes: () => (/* reexport safe */ _registry_mjs__WEBPACK_IMPORTED_MODULE_0__.getRegisteredCellTypes),\n/* harmony export */ hasCellType: () => (/* reexport safe */ _registry_mjs__WEBPACK_IMPORTED_MODULE_0__.hasCellType),\n/* harmony export */ registerAllCellTypes: () => (/* binding */ registerAllCellTypes),\n/* harmony export */ registerCellType: () => (/* reexport safe */ _registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)\n/* harmony export */ });\n/* harmony import */ var _autocompleteType_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./autocompleteType/index.mjs */ \"./node_modules/handsontable/cellTypes/autocompleteType/autocompleteType.mjs\");\n/* harmony import */ var _checkboxType_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./checkboxType/index.mjs */ \"./node_modules/handsontable/cellTypes/checkboxType/checkboxType.mjs\");\n/* harmony import */ var _dateType_index_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dateType/index.mjs */ \"./node_modules/handsontable/cellTypes/dateType/dateType.mjs\");\n/* harmony import */ var _dropdownType_index_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dropdownType/index.mjs */ \"./node_modules/handsontable/cellTypes/dropdownType/dropdownType.mjs\");\n/* harmony import */ var _handsontableType_index_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./handsontableType/index.mjs */ \"./node_modules/handsontable/cellTypes/handsontableType/handsontableType.mjs\");\n/* harmony import */ var _numericType_index_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./numericType/index.mjs */ \"./node_modules/handsontable/cellTypes/numericType/numericType.mjs\");\n/* harmony import */ var _passwordType_index_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./passwordType/index.mjs */ \"./node_modules/handsontable/cellTypes/passwordType/passwordType.mjs\");\n/* harmony import */ var _selectType_index_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./selectType/index.mjs */ \"./node_modules/handsontable/cellTypes/selectType/selectType.mjs\");\n/* harmony import */ var _textType_index_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textType/index.mjs */ \"./node_modules/handsontable/cellTypes/textType/textType.mjs\");\n/* harmony import */ var _timeType_index_mjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./timeType/index.mjs */ \"./node_modules/handsontable/cellTypes/timeType/timeType.mjs\");\n/* harmony import */ var _registry_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./registry.mjs */ \"./node_modules/handsontable/cellTypes/registry.mjs\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Registers all available cell types.\n */\nfunction registerAllCellTypes() {\n (0,_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_autocompleteType_index_mjs__WEBPACK_IMPORTED_MODULE_1__.AutocompleteCellType);\n (0,_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_checkboxType_index_mjs__WEBPACK_IMPORTED_MODULE_2__.CheckboxCellType);\n (0,_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_dateType_index_mjs__WEBPACK_IMPORTED_MODULE_3__.DateCellType);\n (0,_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_dropdownType_index_mjs__WEBPACK_IMPORTED_MODULE_4__.DropdownCellType);\n (0,_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_handsontableType_index_mjs__WEBPACK_IMPORTED_MODULE_5__.HandsontableCellType);\n (0,_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_numericType_index_mjs__WEBPACK_IMPORTED_MODULE_6__.NumericCellType);\n (0,_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_passwordType_index_mjs__WEBPACK_IMPORTED_MODULE_7__.PasswordCellType);\n (0,_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_selectType_index_mjs__WEBPACK_IMPORTED_MODULE_8__.SelectCellType);\n (0,_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_textType_index_mjs__WEBPACK_IMPORTED_MODULE_9__.TextCellType);\n (0,_registry_mjs__WEBPACK_IMPORTED_MODULE_0__.registerCellType)(_timeType_index_mjs__WEBPACK_IMPORTED_MODULE_10__.TimeCellType);\n}\n\n\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/index.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/numericType/numericType.mjs":
/*!*************************************************************************!*\
!*** ./node_modules/handsontable/cellTypes/numericType/numericType.mjs ***!
\*************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CELL_TYPE: () => (/* binding */ CELL_TYPE),\n/* harmony export */ NumericCellType: () => (/* binding */ NumericCellType)\n/* harmony export */ });\n/* harmony import */ var _editors_numericEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../editors/numericEditor/index.mjs */ \"./node_modules/handsontable/editors/numericEditor/numericEditor.mjs\");\n/* harmony import */ var _renderers_numericRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../renderers/numericRenderer/index.mjs */ \"./node_modules/handsontable/renderers/numericRenderer/numericRenderer.mjs\");\n/* harmony import */ var _validators_numericValidator_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../validators/numericValidator/index.mjs */ \"./node_modules/handsontable/validators/numericValidator/numericValidator.mjs\");\n\n\n\nconst CELL_TYPE = 'numeric';\nconst NumericCellType = {\n CELL_TYPE,\n editor: _editors_numericEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__.NumericEditor,\n renderer: _renderers_numericRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__.numericRenderer,\n validator: _validators_numericValidator_index_mjs__WEBPACK_IMPORTED_MODULE_2__.numericValidator,\n dataType: 'number'\n};\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/numericType/numericType.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/passwordType/passwordType.mjs":
/*!***************************************************************************!*\
!*** ./node_modules/handsontable/cellTypes/passwordType/passwordType.mjs ***!
\***************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CELL_TYPE: () => (/* binding */ CELL_TYPE),\n/* harmony export */ PasswordCellType: () => (/* binding */ PasswordCellType)\n/* harmony export */ });\n/* harmony import */ var _editors_passwordEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../editors/passwordEditor/index.mjs */ \"./node_modules/handsontable/editors/passwordEditor/passwordEditor.mjs\");\n/* harmony import */ var _renderers_passwordRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../renderers/passwordRenderer/index.mjs */ \"./node_modules/handsontable/renderers/passwordRenderer/passwordRenderer.mjs\");\n\n\nconst CELL_TYPE = 'password';\nconst PasswordCellType = {\n CELL_TYPE,\n editor: _editors_passwordEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__.PasswordEditor,\n renderer: _renderers_passwordRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__.passwordRenderer,\n copyable: false\n};\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/passwordType/passwordType.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/registry.mjs":
/*!**********************************************************!*\
!*** ./node_modules/handsontable/cellTypes/registry.mjs ***!
\**********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getCellType: () => (/* binding */ _getItem),\n/* harmony export */ getRegisteredCellTypeNames: () => (/* binding */ getNames),\n/* harmony export */ getRegisteredCellTypes: () => (/* binding */ getValues),\n/* harmony export */ hasCellType: () => (/* binding */ hasItem),\n/* harmony export */ registerCellType: () => (/* binding */ _register)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n/* harmony import */ var _utils_staticRegister_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/staticRegister.mjs */ \"./node_modules/handsontable/utils/staticRegister.mjs\");\n/* harmony import */ var _editors_registry_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../editors/registry.mjs */ \"./node_modules/handsontable/editors/registry.mjs\");\n/* harmony import */ var _renderers_registry_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../renderers/registry.mjs */ \"./node_modules/handsontable/renderers/registry.mjs\");\n/* harmony import */ var _validators_registry_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../validators/registry.mjs */ \"./node_modules/handsontable/validators/registry.mjs\");\n\n\n\n\n\nconst {\n register,\n getItem,\n hasItem,\n getNames,\n getValues\n} = (0,_utils_staticRegister_mjs__WEBPACK_IMPORTED_MODULE_1__[\"default\"])('cellTypes');\n\n/**\n * Retrieve cell type object.\n *\n * @param {string} name Cell type identification.\n * @returns {object} Returns cell type object.\n */\nfunction _getItem(name) {\n if (!hasItem(name)) {\n throw Error(`You declared cell type \"${name}\" as a string that is not mapped to a known object.\n Cell type must be an object or a string mapped to an object registered by\n \"Handsontable.cellTypes.registerCellType\" method`);\n }\n return getItem(name);\n}\n\n/**\n * Register cell type under specified name.\n *\n * @param {string} name Cell type identification.\n * @param {object} type An object with contains keys (eq: `editor`, `renderer`, `validator`) which describes specified behaviour of the cell.\n */\nfunction _register(name, type) {\n if (typeof name !== 'string') {\n type = name;\n name = type.CELL_TYPE;\n }\n const {\n editor,\n renderer,\n validator\n } = type;\n if (editor) {\n (0,_editors_registry_mjs__WEBPACK_IMPORTED_MODULE_2__.registerEditor)(name, editor);\n }\n if (renderer) {\n (0,_renderers_registry_mjs__WEBPACK_IMPORTED_MODULE_3__.registerRenderer)(name, renderer);\n }\n if (validator) {\n (0,_validators_registry_mjs__WEBPACK_IMPORTED_MODULE_4__.registerValidator)(name, validator);\n }\n register(name, type);\n}\n\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/registry.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/selectType/selectType.mjs":
/*!***********************************************************************!*\
!*** ./node_modules/handsontable/cellTypes/selectType/selectType.mjs ***!
\***********************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CELL_TYPE: () => (/* binding */ CELL_TYPE),\n/* harmony export */ SelectCellType: () => (/* binding */ SelectCellType)\n/* harmony export */ });\n/* harmony import */ var _editors_selectEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../editors/selectEditor/index.mjs */ \"./node_modules/handsontable/editors/selectEditor/selectEditor.mjs\");\n/* harmony import */ var _renderers_selectRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../renderers/selectRenderer/index.mjs */ \"./node_modules/handsontable/renderers/selectRenderer/selectRenderer.mjs\");\n\n\nconst CELL_TYPE = 'select';\nconst SelectCellType = {\n CELL_TYPE,\n editor: _editors_selectEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__.SelectEditor,\n renderer: _renderers_selectRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__.selectRenderer\n};\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/selectType/selectType.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/textType/textType.mjs":
/*!*******************************************************************!*\
!*** ./node_modules/handsontable/cellTypes/textType/textType.mjs ***!
\*******************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CELL_TYPE: () => (/* binding */ CELL_TYPE),\n/* harmony export */ TextCellType: () => (/* binding */ TextCellType)\n/* harmony export */ });\n/* harmony import */ var _editors_textEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../editors/textEditor/index.mjs */ \"./node_modules/handsontable/editors/textEditor/textEditor.mjs\");\n/* harmony import */ var _renderers_textRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../renderers/textRenderer/index.mjs */ \"./node_modules/handsontable/renderers/textRenderer/textRenderer.mjs\");\n\n\nconst CELL_TYPE = 'text';\nconst TextCellType = {\n CELL_TYPE,\n editor: _editors_textEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__.TextEditor,\n renderer: _renderers_textRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__.textRenderer\n};\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/textType/textType.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/cellTypes/timeType/timeType.mjs":
/*!*******************************************************************!*\
!*** ./node_modules/handsontable/cellTypes/timeType/timeType.mjs ***!
\*******************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CELL_TYPE: () => (/* binding */ CELL_TYPE),\n/* harmony export */ TimeCellType: () => (/* binding */ TimeCellType)\n/* harmony export */ });\n/* harmony import */ var _editors_timeEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../editors/timeEditor/index.mjs */ \"./node_modules/handsontable/editors/timeEditor/timeEditor.mjs\");\n/* harmony import */ var _renderers_timeRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../renderers/timeRenderer/index.mjs */ \"./node_modules/handsontable/renderers/timeRenderer/timeRenderer.mjs\");\n/* harmony import */ var _validators_timeValidator_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../validators/timeValidator/index.mjs */ \"./node_modules/handsontable/validators/timeValidator/timeValidator.mjs\");\n\n\n\nconst CELL_TYPE = 'time';\nconst TimeCellType = {\n CELL_TYPE,\n editor: _editors_timeEditor_index_mjs__WEBPACK_IMPORTED_MODULE_0__.TimeEditor,\n renderer: _renderers_timeRenderer_index_mjs__WEBPACK_IMPORTED_MODULE_1__.timeRenderer,\n validator: _validators_timeValidator_index_mjs__WEBPACK_IMPORTED_MODULE_2__.timeValidator\n};\n\n//# sourceURL=webpack://front/./node_modules/handsontable/cellTypes/timeType/timeType.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core.mjs":
/*!********************************************!*\
!*** ./node_modules/handsontable/core.mjs ***!
\********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Core)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_object_from_entries_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.object.from-entries.js */ \"./node_modules/core-js/modules/es.object.from-entries.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ \"./node_modules/core-js/modules/esnext.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/esnext.iterator.map.js */ \"./node_modules/core-js/modules/esnext.iterator.map.js\");\n/* harmony import */ var core_js_modules_web_immediate_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/web.immediate.js */ \"./node_modules/core-js/modules/web.immediate.js\");\n/* harmony import */ var _helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./helpers/dom/element.mjs */ \"./node_modules/handsontable/helpers/dom/element.mjs\");\n/* harmony import */ var _helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./helpers/function.mjs */ \"./node_modules/handsontable/helpers/function.mjs\");\n/* harmony import */ var _helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./helpers/mixed.mjs */ \"./node_modules/handsontable/helpers/mixed.mjs\");\n/* harmony import */ var _helpers_browser_mjs__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./helpers/browser.mjs */ \"./node_modules/handsontable/helpers/browser.mjs\");\n/* harmony import */ var _editorManager_mjs__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./editorManager.mjs */ \"./node_modules/handsontable/editorManager.mjs\");\n/* harmony import */ var _eventManager_mjs__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./eventManager.mjs */ \"./node_modules/handsontable/eventManager.mjs\");\n/* harmony import */ var _helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./helpers/object.mjs */ \"./node_modules/handsontable/helpers/object.mjs\");\n/* harmony import */ var _focusManager_mjs__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./focusManager.mjs */ \"./node_modules/handsontable/focusManager.mjs\");\n/* harmony import */ var _helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./helpers/array.mjs */ \"./node_modules/handsontable/helpers/array.mjs\");\n/* harmony import */ var _utils_parseTable_mjs__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./utils/parseTable.mjs */ \"./node_modules/handsontable/utils/parseTable.mjs\");\n/* harmony import */ var _plugins_registry_mjs__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./plugins/registry.mjs */ \"./node_modules/handsontable/plugins/registry.mjs\");\n/* harmony import */ var _renderers_registry_mjs__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./renderers/registry.mjs */ \"./node_modules/handsontable/renderers/registry.mjs\");\n/* harmony import */ var _editors_registry_mjs__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./editors/registry.mjs */ \"./node_modules/handsontable/editors/registry.mjs\");\n/* harmony import */ var _validators_registry_mjs__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./validators/registry.mjs */ \"./node_modules/handsontable/validators/registry.mjs\");\n/* harmony import */ var _helpers_string_mjs__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./helpers/string.mjs */ \"./node_modules/handsontable/helpers/string.mjs\");\n/* harmony import */ var _helpers_number_mjs__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./helpers/number.mjs */ \"./node_modules/handsontable/helpers/number.mjs\");\n/* harmony import */ var _tableView_mjs__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./tableView.mjs */ \"./node_modules/handsontable/tableView.mjs\");\n/* harmony import */ var _dataMap_dataSource_mjs__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./dataMap/dataSource.mjs */ \"./node_modules/handsontable/dataMap/dataSource.mjs\");\n/* harmony import */ var _helpers_data_mjs__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./helpers/data.mjs */ \"./node_modules/handsontable/helpers/data.mjs\");\n/* harmony import */ var _translations_index_mjs__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./translations/index.mjs */ \"./node_modules/handsontable/translations/indexMapper.mjs\");\n/* harmony import */ var _utils_rootInstance_mjs__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./utils/rootInstance.mjs */ \"./node_modules/handsontable/utils/rootInstance.mjs\");\n/* harmony import */ var _3rdparty_walkontable_src_index_mjs__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./3rdparty/walkontable/src/index.mjs */ \"./node_modules/handsontable/3rdparty/walkontable/src/calculator/viewportColumns.mjs\");\n/* harmony import */ var _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./core/hooks/index.mjs */ \"./node_modules/handsontable/core/hooks/index.mjs\");\n/* harmony import */ var _i18n_registry_mjs__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./i18n/registry.mjs */ \"./node_modules/handsontable/i18n/registry.mjs\");\n/* harmony import */ var _i18n_utils_mjs__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./i18n/utils.mjs */ \"./node_modules/handsontable/i18n/utils.mjs\");\n/* harmony import */ var _selection_index_mjs__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./selection/index.mjs */ \"./node_modules/handsontable/selection/selection.mjs\");\n/* harmony import */ var _dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./dataMap/index.mjs */ \"./node_modules/handsontable/dataMap/metaManager/index.mjs\");\n/* harmony import */ var _dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./dataMap/index.mjs */ \"./node_modules/handsontable/dataMap/metaManager/mods/dynamicCellMeta.mjs\");\n/* harmony import */ var _dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./dataMap/index.mjs */ \"./node_modules/handsontable/dataMap/metaManager/mods/extendMetaProperties.mjs\");\n/* harmony import */ var _dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./dataMap/index.mjs */ \"./node_modules/handsontable/dataMap/replaceData.mjs\");\n/* harmony import */ var _core_index_mjs__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./core/index.mjs */ \"./node_modules/handsontable/core/viewportScroll/index.mjs\");\n/* harmony import */ var _core_index_mjs__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./core/index.mjs */ \"./node_modules/handsontable/core/focusCatcher/index.mjs\");\n/* harmony import */ var _utils_dataStructures_uniqueMap_mjs__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./utils/dataStructures/uniqueMap.mjs */ \"./node_modules/handsontable/utils/dataStructures/uniqueMap.mjs\");\n/* harmony import */ var _shortcuts_index_mjs__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./shortcuts/index.mjs */ \"./node_modules/handsontable/shortcuts/manager.mjs\");\n/* harmony import */ var _shortcutContexts_index_mjs__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./shortcutContexts/index.mjs */ \"./node_modules/handsontable/shortcutContexts/index.mjs\");\n/* harmony import */ var _helpers_themes_mjs__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./helpers/themes.mjs */ \"./node_modules/handsontable/helpers/themes.mjs\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nlet activeGuid = null;\n\n/**\n * Keeps the collection of the all Handsontable instances created on the same page. The\n * list is then used to trigger the \"afterUnlisten\" hook when the \"listen()\" method was\n * called on another instance.\n *\n * @type {Map}\n */\nconst foreignHotInstances = new Map();\n\n/**\n * A set of deprecated feature names.\n *\n * @type {Set}\n */\n// eslint-disable-next-line no-unused-vars\nconst deprecationWarns = new Set();\n\n/* eslint-disable jsdoc/require-description-complete-sentence */\n/**\n * Handsontable constructor.\n *\n * @core\n * @class Core\n * @description\n *\n * The `Handsontable` class (known as the `Core`) lets you modify the grid's behavior by using Handsontable's public API methods.\n *\n * ::: only-for react\n * To use these methods, associate a Handsontable instance with your instance\n * of the [`HotTable` component](@/guides/getting-started/installation/installation.md#_4-use-the-hottable-component),\n * by using React's `ref` feature (read more on the [Instance methods](@/guides/getting-started/react-methods/react-methods.md) page).\n * :::\n *\n * ## How to call a method\n *\n * ::: only-for javascript\n * ```js\n * // create a Handsontable instance\n * const hot = new Handsontable(document.getElementById('example'), options);\n *\n * // call a method\n * hot.setDataAtCell(0, 0, 'new value');\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * import { useRef } from 'react';\n *\n * const hotTableComponent = useRef(null);\n *\n * \n *\n * // access the Handsontable instance, under the `.current.hotInstance` property\n * // call a method\n * hotTableComponent.current.hotInstance.setDataAtCell(0, 0, 'new value');\n * ```\n * :::\n *\n * @param {HTMLElement} rootElement The element to which the Handsontable instance is injected.\n * @param {object} userSettings The user defined options.\n * @param {boolean} [rootInstanceSymbol=false] Indicates if the instance is root of all later instances created.\n */\nfunction Core(rootElement, userSettings) {\n var _userSettings$layoutD,\n _this = this;\n let rootInstanceSymbol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let instance = this;\n const eventManager = new _eventManager_mjs__WEBPACK_IMPORTED_MODULE_15__[\"default\"](instance);\n let datamap;\n let dataSource;\n let grid;\n let editorManager;\n let focusManager;\n let viewportScroller;\n let firstRun = true;\n if ((0,_utils_rootInstance_mjs__WEBPACK_IMPORTED_MODULE_16__.hasValidParameter)(rootInstanceSymbol)) {\n (0,_utils_rootInstance_mjs__WEBPACK_IMPORTED_MODULE_16__.registerAsRootInstance)(this);\n }\n\n // TODO: check if references to DOM elements should be move to UI layer (Walkontable)\n /**\n * Reference to the container element.\n *\n * @private\n * @type {HTMLElement}\n */\n this.rootElement = rootElement;\n /**\n * The nearest document over container.\n *\n * @private\n * @type {Document}\n */\n this.rootDocument = rootElement.ownerDocument;\n /**\n * Window object over container's document.\n *\n * @private\n * @type {Window}\n */\n this.rootWindow = this.rootDocument.defaultView;\n /**\n * A boolean to tell if the Handsontable has been fully destroyed. This is set to `true`\n * after `afterDestroy` hook is called.\n *\n * @memberof Core#\n * @member isDestroyed\n * @type {boolean}\n */\n this.isDestroyed = false;\n /**\n * The counter determines how many times the render suspending was called. It allows\n * tracking the nested suspending calls. For each render suspend resuming call the\n * counter is decremented. The value equal to 0 means the render suspending feature\n * is disabled.\n *\n * @private\n * @type {number}\n */\n this.renderSuspendedCounter = 0;\n /**\n * The counter determines how many times the execution suspending was called. It allows\n * tracking the nested suspending calls. For each execution suspend resuming call the\n * counter is decremented. The value equal to 0 means the execution suspending feature\n * is disabled.\n *\n * @private\n * @type {number}\n */\n this.executionSuspendedCounter = 0;\n const layoutDirection = (_userSettings$layoutD = userSettings === null || userSettings === void 0 ? void 0 : userSettings.layoutDirection) !== null && _userSettings$layoutD !== void 0 ? _userSettings$layoutD : 'inherit';\n const rootElementDirection = ['rtl', 'ltr'].includes(layoutDirection) ? layoutDirection : this.rootWindow.getComputedStyle(this.rootElement).direction;\n this.rootElement.setAttribute('dir', rootElementDirection);\n\n /**\n * Checks if the grid is rendered using the right-to-left layout direction.\n *\n * @since 12.0.0\n * @memberof Core#\n * @function isRtl\n * @returns {boolean} True if RTL.\n */\n this.isRtl = function () {\n return rootElementDirection === 'rtl';\n };\n\n /**\n * Checks if the grid is rendered using the left-to-right layout direction.\n *\n * @since 12.0.0\n * @memberof Core#\n * @function isLtr\n * @returns {boolean} True if LTR.\n */\n this.isLtr = function () {\n return !instance.isRtl();\n };\n\n /**\n * Returns 1 for LTR; -1 for RTL. Useful for calculations.\n *\n * @since 12.0.0\n * @memberof Core#\n * @function getDirectionFactor\n * @returns {number} Returns 1 for LTR; -1 for RTL.\n */\n this.getDirectionFactor = function () {\n return instance.isLtr() ? 1 : -1;\n };\n userSettings.language = (0,_i18n_registry_mjs__WEBPACK_IMPORTED_MODULE_17__.getValidLanguageCode)(userSettings.language);\n const settingsWithoutHooks = Object.fromEntries(Object.entries(userSettings).filter(_ref => {\n let [key] = _ref;\n return !(_core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().isRegistered(key) || _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().isDeprecated(key));\n }));\n const metaManager = new _dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_19__[\"default\"](instance, settingsWithoutHooks, [_dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_20__.DynamicCellMetaMod, _dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_21__.ExtendMetaPropertiesMod]);\n const tableMeta = metaManager.getTableMeta();\n const globalMeta = metaManager.getGlobalMeta();\n const pluginsRegistry = (0,_utils_dataStructures_uniqueMap_mjs__WEBPACK_IMPORTED_MODULE_22__.createUniqueMap)();\n this.container = this.rootDocument.createElement('div');\n rootElement.insertBefore(this.container, rootElement.firstChild);\n if ((0,_utils_rootInstance_mjs__WEBPACK_IMPORTED_MODULE_16__.isRootInstance)(this)) {\n (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__._injectProductInfo)(userSettings.licenseKey, rootElement);\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.addClass)(rootElement, 'ht-wrapper');\n }\n this.guid = `ht_${(0,_helpers_string_mjs__WEBPACK_IMPORTED_MODULE_25__.randomString)()}`; // this is the namespace for global events\n\n foreignHotInstances.set(this.guid, this);\n\n /**\n * Instance of index mapper which is responsible for managing the column indexes.\n *\n * @memberof Core#\n * @member columnIndexMapper\n * @type {IndexMapper}\n */\n this.columnIndexMapper = new _translations_index_mjs__WEBPACK_IMPORTED_MODULE_26__.IndexMapper();\n /**\n * Instance of index mapper which is responsible for managing the row indexes.\n *\n * @memberof Core#\n * @member rowIndexMapper\n * @type {IndexMapper}\n */\n this.rowIndexMapper = new _translations_index_mjs__WEBPACK_IMPORTED_MODULE_26__.IndexMapper();\n this.columnIndexMapper.addLocalHook('indexesSequenceChange', source => {\n instance.runHooks('afterColumnSequenceChange', source);\n });\n this.rowIndexMapper.addLocalHook('indexesSequenceChange', source => {\n instance.runHooks('afterRowSequenceChange', source);\n });\n eventManager.addEventListener(this.rootDocument.documentElement, 'compositionstart', event => {\n instance.runHooks('beforeCompositionStart', event);\n });\n dataSource = new _dataMap_dataSource_mjs__WEBPACK_IMPORTED_MODULE_27__[\"default\"](instance);\n if (!this.rootElement.id || this.rootElement.id.substring(0, 3) === 'ht_') {\n this.rootElement.id = this.guid; // if root element does not have an id, assign a random id\n }\n const visualToRenderableCoords = coords => {\n const {\n row: visualRow,\n col: visualColumn\n } = coords;\n return instance._createCellCoords(\n // We just store indexes for rows and columns without headers.\n visualRow >= 0 ? instance.rowIndexMapper.getRenderableFromVisualIndex(visualRow) : visualRow, visualColumn >= 0 ? instance.columnIndexMapper.getRenderableFromVisualIndex(visualColumn) : visualColumn);\n };\n const renderableToVisualCoords = coords => {\n const {\n row: renderableRow,\n col: renderableColumn\n } = coords;\n return instance._createCellCoords(\n // We just store indexes for rows and columns without headers.\n renderableRow >= 0 ? instance.rowIndexMapper.getVisualFromRenderableIndex(renderableRow) : renderableRow, renderableColumn >= 0 ? instance.columnIndexMapper.getVisualFromRenderableIndex(renderableColumn) : renderableColumn // eslint-disable-line max-len\n );\n };\n const findFirstNonHiddenRenderableRow = (visualRowFrom, visualRowTo) => {\n const dir = visualRowTo > visualRowFrom ? 1 : -1;\n const minIndex = Math.min(visualRowFrom, visualRowTo);\n const maxIndex = Math.max(visualRowFrom, visualRowTo);\n const rowIndex = instance.rowIndexMapper.getNearestNotHiddenIndex(visualRowFrom, dir);\n if (rowIndex === null || dir === 1 && rowIndex > maxIndex || dir === -1 && rowIndex < minIndex) {\n return null;\n }\n return rowIndex >= 0 ? instance.rowIndexMapper.getRenderableFromVisualIndex(rowIndex) : rowIndex;\n };\n const findFirstNonHiddenRenderableColumn = (visualColumnFrom, visualColumnTo) => {\n const dir = visualColumnTo > visualColumnFrom ? 1 : -1;\n const minIndex = Math.min(visualColumnFrom, visualColumnTo);\n const maxIndex = Math.max(visualColumnFrom, visualColumnTo);\n const columnIndex = instance.columnIndexMapper.getNearestNotHiddenIndex(visualColumnFrom, dir);\n if (columnIndex === null || dir === 1 && columnIndex > maxIndex || dir === -1 && columnIndex < minIndex) {\n return null;\n }\n return columnIndex >= 0 ? instance.columnIndexMapper.getRenderableFromVisualIndex(columnIndex) : columnIndex;\n };\n let selection = new _selection_index_mjs__WEBPACK_IMPORTED_MODULE_28__[\"default\"](tableMeta, {\n rowIndexMapper: instance.rowIndexMapper,\n columnIndexMapper: instance.columnIndexMapper,\n countCols: () => instance.countCols(),\n countRows: () => instance.countRows(),\n propToCol: prop => datamap.propToCol(prop),\n isEditorOpened: () => instance.getActiveEditor() ? instance.getActiveEditor().isOpened() : false,\n countRenderableColumns: () => this.view.countRenderableColumns(),\n countRenderableRows: () => this.view.countRenderableRows(),\n countRowHeaders: () => this.countRowHeaders(),\n countColHeaders: () => this.countColHeaders(),\n countRenderableRowsInRange: function () {\n return _this.view.countRenderableRowsInRange(...arguments);\n },\n countRenderableColumnsInRange: function () {\n return _this.view.countRenderableColumnsInRange(...arguments);\n },\n getShortcutManager: () => instance.getShortcutManager(),\n createCellCoords: (row, column) => instance._createCellCoords(row, column),\n createCellRange: (highlight, from, to) => instance._createCellRange(highlight, from, to),\n visualToRenderableCoords,\n renderableToVisualCoords,\n findFirstNonHiddenRenderableRow,\n findFirstNonHiddenRenderableColumn,\n isDisabledCellSelection: (visualRow, visualColumn) => {\n if (visualRow < 0 || visualColumn < 0) {\n return instance.getSettings().disableVisualSelection;\n }\n return instance.getCellMeta(visualRow, visualColumn).disableVisualSelection;\n }\n });\n this.selection = selection;\n const onIndexMapperCacheUpdate = _ref2 => {\n let {\n hiddenIndexesChanged\n } = _ref2;\n this.forceFullRender = true;\n if (hiddenIndexesChanged) {\n this.selection.commit();\n }\n };\n this.columnIndexMapper.addLocalHook('cacheUpdated', onIndexMapperCacheUpdate);\n this.rowIndexMapper.addLocalHook('cacheUpdated', onIndexMapperCacheUpdate);\n this.selection.addLocalHook('afterSetRangeEnd', (cellCoords, isLastSelectionLayer) => {\n const preventScrolling = (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.createObjectPropListener)(false);\n const selectionRange = this.selection.getSelectedRange();\n const {\n from,\n to\n } = selectionRange.current();\n const selectionLayerLevel = selectionRange.size() - 1;\n this.runHooks('afterSelection', from.row, from.col, to.row, to.col, preventScrolling, selectionLayerLevel);\n this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel);\n if (isLastSelectionLayer && (!preventScrolling.isTouched() || preventScrolling.isTouched() && !preventScrolling.value)) {\n viewportScroller.scrollTo(cellCoords);\n }\n const isSelectedByRowHeader = selection.isSelectedByRowHeader();\n const isSelectedByColumnHeader = selection.isSelectedByColumnHeader();\n\n // @TODO: These CSS classes are no longer needed anymore. They are used only as a indicator of the selected\n // rows/columns in the MergedCells plugin (via border.js#L520 in the walkontable module). After fixing\n // the Border class this should be removed.\n if (isSelectedByRowHeader && isSelectedByColumnHeader) {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.addClass)(this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n } else if (isSelectedByRowHeader) {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.removeClass)(this.rootElement, 'ht__selection--columns');\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.addClass)(this.rootElement, 'ht__selection--rows');\n } else if (isSelectedByColumnHeader) {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.removeClass)(this.rootElement, 'ht__selection--rows');\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.addClass)(this.rootElement, 'ht__selection--columns');\n } else {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.removeClass)(this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n }\n if (selection.getSelectionSource() !== 'shift') {\n editorManager.closeEditor(null);\n }\n instance.view.render();\n editorManager.prepareEditor();\n });\n this.selection.addLocalHook('beforeSetFocus', cellCoords => {\n this.runHooks('beforeSelectionFocusSet', cellCoords.row, cellCoords.col);\n });\n this.selection.addLocalHook('afterSetFocus', cellCoords => {\n const preventScrolling = (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.createObjectPropListener)(false);\n this.runHooks('afterSelectionFocusSet', cellCoords.row, cellCoords.col, preventScrolling);\n if (!preventScrolling.isTouched() || preventScrolling.isTouched() && !preventScrolling.value) {\n viewportScroller.scrollTo(cellCoords);\n }\n editorManager.closeEditor();\n instance.view.render();\n editorManager.prepareEditor();\n });\n this.selection.addLocalHook('afterSelectionFinished', cellRanges => {\n const selectionLayerLevel = cellRanges.length - 1;\n const {\n from,\n to\n } = cellRanges[selectionLayerLevel];\n this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel);\n this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel);\n });\n this.selection.addLocalHook('afterIsMultipleSelection', isMultiple => {\n const changedIsMultiple = this.runHooks('afterIsMultipleSelection', isMultiple.value);\n if (isMultiple.value) {\n isMultiple.value = changedIsMultiple;\n }\n });\n this.selection.addLocalHook('afterDeselect', () => {\n editorManager.closeEditor();\n instance.view.render();\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.removeClass)(this.rootElement, ['ht__selection--rows', 'ht__selection--columns']);\n this.runHooks('afterDeselect');\n });\n this.selection.addLocalHook('beforeHighlightSet', () => this.runHooks('beforeSelectionHighlightSet')).addLocalHook('beforeSetRangeStart', function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return _this.runHooks('beforeSetRangeStart', ...args);\n }).addLocalHook('beforeSetRangeStartOnly', function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return _this.runHooks('beforeSetRangeStartOnly', ...args);\n }).addLocalHook('beforeSetRangeEnd', function () {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n return _this.runHooks('beforeSetRangeEnd', ...args);\n }).addLocalHook('beforeSelectColumns', function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return _this.runHooks('beforeSelectColumns', ...args);\n }).addLocalHook('afterSelectColumns', function () {\n for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n return _this.runHooks('afterSelectColumns', ...args);\n }).addLocalHook('beforeSelectRows', function () {\n for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n args[_key6] = arguments[_key6];\n }\n return _this.runHooks('beforeSelectRows', ...args);\n }).addLocalHook('afterSelectRows', function () {\n for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n args[_key7] = arguments[_key7];\n }\n return _this.runHooks('afterSelectRows', ...args);\n }).addLocalHook('beforeModifyTransformStart', function () {\n for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {\n args[_key8] = arguments[_key8];\n }\n return _this.runHooks('modifyTransformStart', ...args);\n }).addLocalHook('afterModifyTransformStart', function () {\n for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {\n args[_key9] = arguments[_key9];\n }\n return _this.runHooks('afterModifyTransformStart', ...args);\n }).addLocalHook('beforeModifyTransformFocus', function () {\n for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {\n args[_key10] = arguments[_key10];\n }\n return _this.runHooks('modifyTransformFocus', ...args);\n }).addLocalHook('afterModifyTransformFocus', function () {\n for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {\n args[_key11] = arguments[_key11];\n }\n return _this.runHooks('afterModifyTransformFocus', ...args);\n }).addLocalHook('beforeModifyTransformEnd', function () {\n for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {\n args[_key12] = arguments[_key12];\n }\n return _this.runHooks('modifyTransformEnd', ...args);\n }).addLocalHook('afterModifyTransformEnd', function () {\n for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {\n args[_key13] = arguments[_key13];\n }\n return _this.runHooks('afterModifyTransformEnd', ...args);\n }).addLocalHook('beforeRowWrap', function () {\n for (var _len14 = arguments.length, args = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) {\n args[_key14] = arguments[_key14];\n }\n return _this.runHooks('beforeRowWrap', ...args);\n }).addLocalHook('beforeColumnWrap', function () {\n for (var _len15 = arguments.length, args = new Array(_len15), _key15 = 0; _key15 < _len15; _key15++) {\n args[_key15] = arguments[_key15];\n }\n return _this.runHooks('beforeColumnWrap', ...args);\n }).addLocalHook('insertRowRequire', totalRows => this.alter('insert_row_above', totalRows, 1, 'auto')).addLocalHook('insertColRequire', totalCols => this.alter('insert_col_start', totalCols, 1, 'auto'));\n grid = {\n /**\n * Inserts or removes rows and columns.\n *\n * @private\n * @param {string} action Possible values: \"insert_row_above\", \"insert_row_below\", \"insert_col_start\", \"insert_col_end\",\n * \"remove_row\", \"remove_col\".\n * @param {number|Array} index Row or column visual index which from the alter action will be triggered.\n * Alter actions such as \"remove_row\" and \"remove_col\" support array indexes in the\n * format `[[index, amount], [index, amount]...]` this can be used to remove\n * non-consecutive columns or rows in one call.\n * @param {number} [amount=1] Amount of rows or columns to remove.\n * @param {string} [source] Optional. Source of hook runner.\n * @param {boolean} [keepEmptyRows] Optional. Flag for preventing deletion of empty rows.\n */\n alter(action, index) {\n let amount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n let source = arguments.length > 3 ? arguments[3] : undefined;\n let keepEmptyRows = arguments.length > 4 ? arguments[4] : undefined;\n const normalizeIndexesGroup = indexes => {\n if (indexes.length === 0) {\n return [];\n }\n const sortedIndexes = [...indexes];\n\n // Sort the indexes in ascending order.\n sortedIndexes.sort((_ref3, _ref4) => {\n let [indexA] = _ref3;\n let [indexB] = _ref4;\n if (indexA === indexB) {\n return 0;\n }\n return indexA > indexB ? 1 : -1;\n });\n\n // Normalize the {index, amount} groups into bigger groups.\n const normalizedIndexes = (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayReduce)(sortedIndexes, (acc, _ref5) => {\n let [groupIndex, groupAmount] = _ref5;\n const previousItem = acc[acc.length - 1];\n const [prevIndex, prevAmount] = previousItem;\n const prevLastIndex = prevIndex + prevAmount;\n if (groupIndex <= prevLastIndex) {\n const amountToAdd = Math.max(groupAmount - (prevLastIndex - groupIndex), 0);\n previousItem[1] += amountToAdd;\n } else {\n acc.push([groupIndex, groupAmount]);\n }\n return acc;\n }, [sortedIndexes[0]]);\n return normalizedIndexes;\n };\n\n /* eslint-disable no-case-declarations */\n switch (action) {\n case 'insert_row_below':\n case 'insert_row_above':\n const numberOfSourceRows = instance.countSourceRows();\n if (tableMeta.maxRows === numberOfSourceRows) {\n return;\n }\n\n // `above` is the default behavior for creating new rows\n const insertRowMode = action === 'insert_row_below' ? 'below' : 'above';\n\n // Calling the `insert_row_above` action adds a new row at the beginning of the data set.\n // eslint-disable-next-line no-param-reassign\n index = index !== null && index !== void 0 ? index : insertRowMode === 'below' ? numberOfSourceRows : 0;\n const {\n delta: rowDelta,\n startPhysicalIndex: startRowPhysicalIndex\n } = datamap.createRow(index, amount, {\n source,\n mode: insertRowMode\n });\n selection.shiftRows(instance.toVisualRow(startRowPhysicalIndex), rowDelta);\n break;\n case 'insert_col_start':\n case 'insert_col_end':\n // \"start\" is a default behavior for creating new columns\n const insertColumnMode = action === 'insert_col_end' ? 'end' : 'start';\n\n // Calling the `insert_col_start` action adds a new column to the left of the data set.\n // eslint-disable-next-line no-param-reassign\n index = index !== null && index !== void 0 ? index : insertColumnMode === 'end' ? instance.countSourceCols() : 0;\n const {\n delta: colDelta,\n startPhysicalIndex: startColumnPhysicalIndex\n } = datamap.createCol(index, amount, {\n source,\n mode: insertColumnMode\n });\n if (colDelta) {\n if (Array.isArray(tableMeta.colHeaders)) {\n const spliceArray = [instance.toVisualColumn(startColumnPhysicalIndex), 0];\n spliceArray.length += colDelta; // inserts empty (undefined) elements at the end of an array\n Array.prototype.splice.apply(tableMeta.colHeaders, spliceArray); // inserts empty (undefined) elements into the colHeader array\n }\n selection.shiftColumns(instance.toVisualColumn(startColumnPhysicalIndex), colDelta);\n }\n break;\n case 'remove_row':\n const removeRow = indexes => {\n let offset = 0;\n\n // Normalize the {index, amount} groups into bigger groups.\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayEach)(indexes, _ref6 => {\n let [groupIndex, groupAmount] = _ref6;\n const calcIndex = (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isEmpty)(groupIndex) ? instance.countRows() - 1 : Math.max(groupIndex - offset, 0);\n\n // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value\n // compatible with datamap.removeCol method.\n if (Number.isInteger(groupIndex)) {\n // eslint-disable-next-line no-param-reassign\n groupIndex = Math.max(groupIndex - offset, 0);\n }\n\n // TODO: for datamap.removeRow index should be passed as it is (with undefined and null values). If not, the logic\n // inside the datamap.removeRow breaks the removing functionality.\n const wasRemoved = datamap.removeRow(groupIndex, groupAmount, source);\n if (!wasRemoved) {\n return;\n }\n if (selection.isSelected()) {\n const {\n row\n } = instance.getSelectedRangeLast().highlight;\n if (row >= groupIndex && row <= groupIndex + groupAmount - 1) {\n editorManager.closeEditor(true);\n }\n }\n const totalRows = instance.countRows();\n const fixedRowsTop = tableMeta.fixedRowsTop;\n if (fixedRowsTop >= calcIndex + 1) {\n tableMeta.fixedRowsTop -= Math.min(groupAmount, fixedRowsTop - calcIndex);\n }\n const fixedRowsBottom = tableMeta.fixedRowsBottom;\n if (fixedRowsBottom && calcIndex >= totalRows - fixedRowsBottom) {\n tableMeta.fixedRowsBottom -= Math.min(groupAmount, fixedRowsBottom);\n }\n if (totalRows === 0) {\n selection.deselect();\n } else if (source === 'ContextMenu.removeRow') {\n selection.refresh();\n } else {\n selection.shiftRows(groupIndex, -groupAmount);\n }\n offset += groupAmount;\n });\n };\n if (Array.isArray(index)) {\n removeRow(normalizeIndexesGroup(index));\n } else {\n removeRow([[index, amount]]);\n }\n break;\n case 'remove_col':\n const removeCol = indexes => {\n let offset = 0;\n\n // Normalize the {index, amount} groups into bigger groups.\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayEach)(indexes, _ref7 => {\n let [groupIndex, groupAmount] = _ref7;\n const calcIndex = (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isEmpty)(groupIndex) ? instance.countCols() - 1 : Math.max(groupIndex - offset, 0);\n let physicalColumnIndex = instance.toPhysicalColumn(calcIndex);\n\n // If the 'index' is an integer decrease it by 'offset' otherwise pass it through to make the value\n // compatible with datamap.removeCol method.\n if (Number.isInteger(groupIndex)) {\n // eslint-disable-next-line no-param-reassign\n groupIndex = Math.max(groupIndex - offset, 0);\n }\n\n // TODO: for datamap.removeCol index should be passed as it is (with undefined and null values). If not, the logic\n // inside the datamap.removeCol breaks the removing functionality.\n const wasRemoved = datamap.removeCol(groupIndex, groupAmount, source);\n if (!wasRemoved) {\n return;\n }\n if (selection.isSelected()) {\n const {\n col\n } = instance.getSelectedRangeLast().highlight;\n if (col >= groupIndex && col <= groupIndex + groupAmount - 1) {\n editorManager.closeEditor(true);\n }\n }\n const totalColumns = instance.countCols();\n if (totalColumns === 0) {\n selection.deselect();\n } else if (source === 'ContextMenu.removeColumn') {\n selection.refresh();\n } else {\n selection.shiftColumns(groupIndex, -groupAmount);\n }\n const fixedColumnsStart = tableMeta.fixedColumnsStart;\n if (fixedColumnsStart >= calcIndex + 1) {\n tableMeta.fixedColumnsStart -= Math.min(groupAmount, fixedColumnsStart - calcIndex);\n }\n if (Array.isArray(tableMeta.colHeaders)) {\n if (typeof physicalColumnIndex === 'undefined') {\n physicalColumnIndex = -1;\n }\n tableMeta.colHeaders.splice(physicalColumnIndex, groupAmount);\n }\n offset += groupAmount;\n });\n };\n if (Array.isArray(index)) {\n removeCol(normalizeIndexesGroup(index));\n } else {\n removeCol([[index, amount]]);\n }\n break;\n default:\n throw new Error(`There is no such action \"${action}\"`);\n }\n if (!keepEmptyRows) {\n grid.adjustRowsAndCols(); // makes sure that we did not add rows that will be removed in next refresh\n }\n instance.view.render();\n instance.view.adjustElementsSize();\n },\n /**\n * Makes sure there are empty rows at the bottom of the table.\n *\n * @private\n */\n adjustRowsAndCols() {\n const minRows = tableMeta.minRows;\n const minSpareRows = tableMeta.minSpareRows;\n const minCols = tableMeta.minCols;\n const minSpareCols = tableMeta.minSpareCols;\n if (minRows) {\n // should I add empty rows to data source to meet minRows?\n const nrOfRows = instance.countRows();\n if (nrOfRows < minRows) {\n // The synchronization with cell meta is not desired here. For `minRows` option,\n // we don't want to touch/shift cell meta objects.\n datamap.createRow(nrOfRows, minRows - nrOfRows, {\n source: 'auto'\n });\n }\n }\n if (minSpareRows) {\n const emptyRows = instance.countEmptyRows(true);\n\n // should I add empty rows to meet minSpareRows?\n if (emptyRows < minSpareRows) {\n const emptyRowsMissing = minSpareRows - emptyRows;\n const rowsToCreate = Math.min(emptyRowsMissing, tableMeta.maxRows - instance.countSourceRows());\n\n // The synchronization with cell meta is not desired here. For `minSpareRows` option,\n // we don't want to touch/shift cell meta objects.\n datamap.createRow(instance.countRows(), rowsToCreate, {\n source: 'auto'\n });\n }\n }\n {\n let emptyCols;\n\n // count currently empty cols\n if (minCols || minSpareCols) {\n emptyCols = instance.countEmptyCols(true);\n }\n let nrOfColumns = instance.countCols();\n\n // should I add empty cols to meet minCols?\n if (minCols && !tableMeta.columns && nrOfColumns < minCols) {\n // The synchronization with cell meta is not desired here. For `minCols` option,\n // we don't want to touch/shift cell meta objects.\n const colsToCreate = minCols - nrOfColumns;\n emptyCols += colsToCreate;\n datamap.createCol(nrOfColumns, colsToCreate, {\n source: 'auto'\n });\n }\n // should I add empty cols to meet minSpareCols?\n if (minSpareCols && !tableMeta.columns && instance.dataType === 'array' && emptyCols < minSpareCols) {\n nrOfColumns = instance.countCols();\n const emptyColsMissing = minSpareCols - emptyCols;\n const colsToCreate = Math.min(emptyColsMissing, tableMeta.maxCols - nrOfColumns);\n\n // The synchronization with cell meta is not desired here. For `minSpareCols` option,\n // we don't want to touch/shift cell meta objects.\n datamap.createCol(nrOfColumns, colsToCreate, {\n source: 'auto'\n });\n }\n }\n },\n /**\n * Populate the data from the provided 2d array from the given cell coordinates.\n *\n * @private\n * @param {object} start Start selection position. Visual indexes.\n * @param {Array} input 2d data array.\n * @param {object} [end] End selection position (only for drag-down mode). Visual indexes.\n * @param {string} [source=\"populateFromArray\"] Source information string.\n * @param {string} [method=\"overwrite\"] Populate method. Possible options: `shift_down`, `shift_right`, `overwrite`.\n * @returns {object|undefined} Ending td in pasted area (only if any cell was changed).\n */\n populateFromArray(start, input, end, source, method) {\n let r;\n let rlen;\n let c;\n let clen;\n const setData = [];\n const current = {};\n const newDataByColumns = [];\n const startRow = start.row;\n const startColumn = start.col;\n rlen = input.length;\n if (rlen === 0) {\n return false;\n }\n let columnsPopulationEnd = 0;\n let rowsPopulationEnd = 0;\n if ((0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.isObject)(end)) {\n columnsPopulationEnd = end.col - startColumn + 1;\n rowsPopulationEnd = end.row - startRow + 1;\n }\n\n // insert data with specified pasteMode method\n switch (method) {\n case 'shift_down':\n // translate data from a list of rows to a list of columns\n const populatedDataByColumns = (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.pivot)(input);\n const numberOfDataColumns = populatedDataByColumns.length;\n // method's argument can extend the range of data population (data would be repeated)\n const numberOfColumnsToPopulate = Math.max(numberOfDataColumns, columnsPopulationEnd);\n const pushedDownDataByRows = instance.getData().slice(startRow);\n\n // translate data from a list of rows to a list of columns\n const pushedDownDataByColumns = (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.pivot)(pushedDownDataByRows).slice(startColumn, startColumn + numberOfColumnsToPopulate);\n for (c = 0; c < numberOfColumnsToPopulate; c += 1) {\n if (c < numberOfDataColumns) {\n for (r = 0, rlen = populatedDataByColumns[c].length; r < rowsPopulationEnd - rlen; r += 1) {\n // repeating data for rows\n populatedDataByColumns[c].push(populatedDataByColumns[c][r % rlen]);\n }\n if (c < pushedDownDataByColumns.length) {\n newDataByColumns.push(populatedDataByColumns[c].concat(pushedDownDataByColumns[c]));\n } else {\n // if before data population, there was no data in the column\n // we fill the required rows' newly-created cells with `null` values\n newDataByColumns.push(populatedDataByColumns[c].concat(new Array(pushedDownDataByRows.length).fill(null)));\n }\n } else {\n // Repeating data for columns.\n newDataByColumns.push(populatedDataByColumns[c % numberOfDataColumns].concat(pushedDownDataByColumns[c]));\n }\n }\n instance.populateFromArray(startRow, startColumn, (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.pivot)(newDataByColumns));\n break;\n case 'shift_right':\n const numberOfDataRows = input.length;\n // method's argument can extend the range of data population (data would be repeated)\n const numberOfRowsToPopulate = Math.max(numberOfDataRows, rowsPopulationEnd);\n const pushedRightDataByRows = instance.getData().slice(startRow).map(rowData => rowData.slice(startColumn));\n for (r = 0; r < numberOfRowsToPopulate; r += 1) {\n if (r < numberOfDataRows) {\n for (c = 0, clen = input[r].length; c < columnsPopulationEnd - clen; c += 1) {\n // repeating data for rows\n input[r].push(input[r][c % clen]);\n }\n if (r < pushedRightDataByRows.length) {\n for (let i = 0; i < pushedRightDataByRows[r].length; i += 1) {\n input[r].push(pushedRightDataByRows[r][i]);\n }\n } else {\n // if before data population, there was no data in the row\n // we fill the required columns' newly-created cells with `null` values\n input[r].push(...new Array(pushedRightDataByRows[0].length).fill(null));\n }\n } else {\n // Repeating data for columns.\n input.push(input[r % rlen].slice(0, numberOfRowsToPopulate).concat(pushedRightDataByRows[r]));\n }\n }\n instance.populateFromArray(startRow, startColumn, input);\n break;\n case 'overwrite':\n default:\n // overwrite and other not specified options\n current.row = start.row;\n current.col = start.col;\n let skippedRow = 0;\n let skippedColumn = 0;\n let pushData = true;\n let cellMeta;\n const getInputValue = function getInputValue(row) {\n let col = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n const rowValue = input[row % input.length];\n if (col !== null) {\n return rowValue[col % rowValue.length];\n }\n return rowValue;\n };\n const rowInputLength = input.length;\n const rowSelectionLength = end ? end.row - start.row + 1 : 0;\n if (end) {\n rlen = rowSelectionLength;\n } else {\n rlen = Math.max(rowInputLength, rowSelectionLength);\n }\n for (r = 0; r < rlen; r++) {\n if (end && current.row > end.row && rowSelectionLength > rowInputLength || !tableMeta.allowInsertRow && current.row > instance.countRows() - 1 || current.row >= tableMeta.maxRows) {\n break;\n }\n const visualRow = r - skippedRow;\n const colInputLength = getInputValue(visualRow).length;\n const colSelectionLength = end ? end.col - start.col + 1 : 0;\n if (end) {\n clen = colSelectionLength;\n } else {\n clen = Math.max(colInputLength, colSelectionLength);\n }\n current.col = start.col;\n cellMeta = instance.getCellMeta(current.row, current.col);\n if ((source === 'CopyPaste.paste' || source === 'Autofill.fill') && cellMeta.skipRowOnPaste) {\n skippedRow += 1;\n current.row += 1;\n rlen += 1;\n /* eslint-disable no-continue */\n continue;\n }\n skippedColumn = 0;\n for (c = 0; c < clen; c++) {\n if (end && current.col > end.col && colSelectionLength > colInputLength || !tableMeta.allowInsertColumn && current.col > instance.countCols() - 1 || current.col >= tableMeta.maxCols) {\n break;\n }\n cellMeta = instance.getCellMeta(current.row, current.col);\n if ((source === 'CopyPaste.paste' || source === 'Autofill.fill') && cellMeta.skipColumnOnPaste) {\n skippedColumn += 1;\n current.col += 1;\n clen += 1;\n continue;\n }\n if (cellMeta.readOnly && source !== 'UndoRedo.undo') {\n current.col += 1;\n /* eslint-disable no-continue */\n continue;\n }\n const visualColumn = c - skippedColumn;\n let value = getInputValue(visualRow, visualColumn);\n let orgValue = instance.getDataAtCell(current.row, current.col);\n if (value !== null && typeof value === 'object') {\n // when 'value' is array and 'orgValue' is null, set 'orgValue' to\n // an empty array so that the null value can be compared to 'value'\n // as an empty value for the array context\n if (Array.isArray(value) && orgValue === null) {\n orgValue = [];\n }\n if (orgValue === null || typeof orgValue !== 'object') {\n pushData = false;\n } else {\n const orgValueSchema = (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.duckSchema)(Array.isArray(orgValue) ? orgValue : orgValue[0] || orgValue);\n const valueSchema = (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.duckSchema)(Array.isArray(value) ? value : value[0] || value);\n\n // Allow overwriting values with the same object-based schema or any array-based schema.\n if ((0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.isObjectEqual)(orgValueSchema, valueSchema) || Array.isArray(orgValueSchema) && Array.isArray(valueSchema)) {\n value = (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.deepClone)(value);\n } else {\n pushData = false;\n }\n }\n } else if (orgValue !== null && typeof orgValue === 'object') {\n pushData = false;\n }\n if (pushData) {\n setData.push([current.row, current.col, value]);\n }\n pushData = true;\n current.col += 1;\n }\n current.row += 1;\n }\n instance.setDataAtCell(setData, null, null, source || 'populateFromArray');\n break;\n }\n }\n };\n\n /**\n * Internal function to set `language` key of settings.\n *\n * @private\n * @param {string} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.\n * @fires Hooks#afterLanguageChange\n */\n function setLanguage(languageCode) {\n const normalizedLanguageCode = (0,_i18n_utils_mjs__WEBPACK_IMPORTED_MODULE_31__.normalizeLanguageCode)(languageCode);\n if ((0,_i18n_registry_mjs__WEBPACK_IMPORTED_MODULE_17__.hasLanguageDictionary)(normalizedLanguageCode)) {\n instance.runHooks('beforeLanguageChange', normalizedLanguageCode);\n globalMeta.language = normalizedLanguageCode;\n instance.runHooks('afterLanguageChange', normalizedLanguageCode);\n } else {\n (0,_i18n_utils_mjs__WEBPACK_IMPORTED_MODULE_31__.warnUserAboutLanguageRegistration)(languageCode);\n }\n }\n\n /**\n * Internal function to set `className` or `tableClassName`, depending on the key from the settings object.\n *\n * @private\n * @param {string} className `className` or `tableClassName` from the key in the settings object.\n * @param {string|string[]} classSettings String or array of strings. Contains class name(s) from settings object.\n */\n function setClassName(className, classSettings) {\n const element = className === 'className' ? instance.rootElement : instance.table;\n if (firstRun) {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.addClass)(element, classSettings);\n } else {\n let globalMetaSettingsArray = [];\n let settingsArray = [];\n if (globalMeta[className]) {\n globalMetaSettingsArray = Array.isArray(globalMeta[className]) ? globalMeta[className] : (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.stringToArray)(globalMeta[className]);\n }\n if (classSettings) {\n settingsArray = Array.isArray(classSettings) ? classSettings : (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.stringToArray)(classSettings);\n }\n const classNameToRemove = (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.getDifferenceOfArrays)(globalMetaSettingsArray, settingsArray);\n const classNameToAdd = (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.getDifferenceOfArrays)(settingsArray, globalMetaSettingsArray);\n if (classNameToRemove.length) {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.removeClass)(element, classNameToRemove);\n }\n if (classNameToAdd.length) {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.addClass)(element, classNameToAdd);\n }\n }\n globalMeta[className] = classSettings;\n }\n this.init = function () {\n dataSource.setData(tableMeta.data);\n instance.runHooks('beforeInit');\n if ((0,_helpers_browser_mjs__WEBPACK_IMPORTED_MODULE_32__.isMobileBrowser)() || (0,_helpers_browser_mjs__WEBPACK_IMPORTED_MODULE_32__.isIpadOS)()) {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.addClass)(instance.rootElement, 'mobile');\n }\n this.updateSettings(userSettings, true);\n this.view = new _tableView_mjs__WEBPACK_IMPORTED_MODULE_33__[\"default\"](this);\n const themeName = tableMeta.themeName || (0,_helpers_themes_mjs__WEBPACK_IMPORTED_MODULE_34__.getThemeClassName)(instance.rootElement);\n\n // Use the theme defined as a root element class or in the settings (in that order).\n instance.useTheme(themeName);\n\n // Add the theme class name to the license info element.\n instance.view.addClassNameToLicenseElement(instance.getCurrentThemeName());\n editorManager = _editorManager_mjs__WEBPACK_IMPORTED_MODULE_35__[\"default\"].getInstance(instance, tableMeta, selection);\n viewportScroller = (0,_core_index_mjs__WEBPACK_IMPORTED_MODULE_36__.createViewportScroller)(instance);\n focusManager = new _focusManager_mjs__WEBPACK_IMPORTED_MODULE_37__.FocusManager(instance);\n if ((0,_utils_rootInstance_mjs__WEBPACK_IMPORTED_MODULE_16__.isRootInstance)(this)) {\n (0,_core_index_mjs__WEBPACK_IMPORTED_MODULE_38__.installFocusCatcher)(instance);\n }\n instance.runHooks('init');\n this.render();\n\n // Run the logic only if it's the table's initialization and the root element is not visible.\n if (!!firstRun && instance.rootElement.offsetParent === null) {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.observeVisibilityChangeOnce)(instance.rootElement, () => {\n // Update the spreader size cache before rendering.\n instance.view._wt.wtOverlays.updateLastSpreaderSize();\n instance.render();\n instance.view.adjustElementsSize();\n });\n }\n if (typeof firstRun === 'object') {\n instance.runHooks('afterChange', firstRun[0], firstRun[1]);\n firstRun = false;\n }\n instance.runHooks('afterInit');\n };\n\n /**\n * @ignore\n * @returns {object}\n */\n function ValidatorsQueue() {\n // moved this one level up so it can be used in any function here. Probably this should be moved to a separate file\n let resolved = false;\n return {\n validatorsInQueue: 0,\n valid: true,\n addValidatorToQueue() {\n this.validatorsInQueue += 1;\n resolved = false;\n },\n removeValidatorFormQueue() {\n this.validatorsInQueue = this.validatorsInQueue - 1 < 0 ? 0 : this.validatorsInQueue - 1;\n this.checkIfQueueIsEmpty();\n },\n onQueueEmpty() {},\n checkIfQueueIsEmpty() {\n if (this.validatorsInQueue === 0 && resolved === false) {\n resolved = true;\n this.onQueueEmpty(this.valid);\n }\n }\n };\n }\n\n /**\n * Get parsed number from numeric string.\n *\n * @private\n * @param {string} numericData Float (separated by a dot or a comma) or integer.\n * @returns {number} Number if we get data in parsable format, not changed value otherwise.\n */\n function getParsedNumber(numericData) {\n // Unifying \"float like\" string. Change from value with comma determiner to value with dot determiner,\n // for example from `450,65` to `450.65`.\n const unifiedNumericData = numericData.replace(',', '.');\n if (isNaN(parseFloat(unifiedNumericData)) === false) {\n return parseFloat(unifiedNumericData);\n }\n return numericData;\n }\n\n /**\n * @ignore\n * @param {Array} changes The 2D array containing information about each of the edited cells.\n * @param {string} source The string that identifies source of validation.\n * @param {Function} callback The callback function fot async validation.\n */\n function validateChanges(changes, source, callback) {\n if (!changes.length) {\n callback();\n return;\n }\n const activeEditor = instance.getActiveEditor();\n const waitingForValidator = new ValidatorsQueue();\n let shouldBeCanceled = true;\n waitingForValidator.onQueueEmpty = () => {\n if (activeEditor && shouldBeCanceled) {\n activeEditor.cancelChanges();\n }\n callback(); // called when async validators are resolved and beforeChange was not async\n };\n for (let i = changes.length - 1; i >= 0; i--) {\n const [row, prop] = changes[i];\n const visualCol = datamap.propToCol(prop);\n let cellProperties;\n if (Number.isInteger(visualCol)) {\n cellProperties = instance.getCellMeta(row, visualCol);\n } else {\n // If there's no requested visual column, we can use the table meta as the cell properties when retrieving\n // the cell validator.\n cellProperties = {\n ...Object.getPrototypeOf(tableMeta),\n ...tableMeta\n };\n }\n\n /* eslint-disable no-loop-func */\n if (instance.getCellValidator(cellProperties)) {\n waitingForValidator.addValidatorToQueue();\n instance.validateCell(changes[i][3], cellProperties, function (index, cellPropertiesReference) {\n return function (result) {\n if (typeof result !== 'boolean') {\n throw new Error('Validation error: result is not boolean');\n }\n if (result === false && cellPropertiesReference.allowInvalid === false) {\n shouldBeCanceled = false;\n changes.splice(index, 1); // cancel the change\n cellPropertiesReference.valid = true; // we cancelled the change, so cell value is still valid\n }\n waitingForValidator.removeValidatorFormQueue();\n };\n }(i, cellProperties), source);\n }\n }\n waitingForValidator.checkIfQueueIsEmpty();\n }\n\n /**\n * Internal function to apply changes. Called after validateChanges.\n *\n * @private\n * @param {Array} changes Array in form of [row, prop, oldValue, newValue].\n * @param {string} source String that identifies how this change will be described in changes array (useful in onChange callback).\n * @fires Hooks#beforeChangeRender\n * @fires Hooks#afterChange\n */\n function applyChanges(changes, source) {\n for (let i = changes.length - 1; i >= 0; i--) {\n let skipThisChange = false;\n if (changes[i] === null) {\n changes.splice(i, 1);\n /* eslint-disable no-continue */\n continue;\n }\n if ((changes[i][2] === null || changes[i][2] === undefined) && (changes[i][3] === null || changes[i][3] === undefined)) {\n /* eslint-disable no-continue */\n continue;\n }\n if (tableMeta.allowInsertRow) {\n while (changes[i][0] > instance.countRows() - 1) {\n const {\n delta: numberOfCreatedRows\n } = datamap.createRow(undefined, undefined, {\n source: 'auto'\n });\n if (numberOfCreatedRows === 0) {\n skipThisChange = true;\n break;\n }\n }\n }\n if (instance.dataType === 'array' && (!tableMeta.columns || tableMeta.columns.length === 0) && tableMeta.allowInsertColumn) {\n while (datamap.propToCol(changes[i][1]) > instance.countCols() - 1) {\n const {\n delta: numberOfCreatedColumns\n } = datamap.createCol(undefined, undefined, {\n source: 'auto'\n });\n if (numberOfCreatedColumns === 0) {\n skipThisChange = true;\n break;\n }\n }\n }\n if (skipThisChange) {\n /* eslint-disable no-continue */\n continue;\n }\n datamap.set(changes[i][0], changes[i][1], changes[i][3]);\n }\n const hasChanges = changes.length > 0;\n if (hasChanges) {\n grid.adjustRowsAndCols();\n instance.runHooks('beforeChangeRender', changes, source);\n editorManager.closeEditor();\n instance.render();\n editorManager.prepareEditor();\n instance.view.adjustElementsSize();\n instance.runHooks('afterChange', changes, source || 'edit');\n const activeEditor = instance.getActiveEditor();\n if (activeEditor && (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isDefined)(activeEditor.refreshValue)) {\n activeEditor.refreshValue();\n }\n } else {\n instance.render();\n }\n }\n\n /**\n * Creates and returns the CellCoords object.\n *\n * @private\n * @memberof Core#\n * @function _createCellCoords\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @returns {CellCoords}\n */\n this._createCellCoords = function (row, column) {\n return instance.view._wt.createCellCoords(row, column);\n };\n\n /**\n * Creates and returns the CellRange object.\n *\n * @private\n * @memberof Core#\n * @function _createCellRange\n * @param {CellCoords} highlight Defines the border around a cell where selection was started and to edit the cell\n * when you press Enter. The highlight cannot point to headers (negative values).\n * @param {CellCoords} from Initial coordinates.\n * @param {CellCoords} to Final coordinates.\n * @returns {CellRange}\n */\n this._createCellRange = function (highlight, from, to) {\n return instance.view._wt.createCellRange(highlight, from, to);\n };\n\n /**\n * Validate a single cell.\n *\n * @memberof Core#\n * @function validateCell\n * @param {string|number} value The value to validate.\n * @param {object} cellProperties The cell meta which corresponds with the value.\n * @param {Function} callback The callback function.\n * @param {string} source The string that identifies source of the validation.\n */\n this.validateCell = function (value, cellProperties, callback, source) {\n let validator = instance.getCellValidator(cellProperties);\n\n // the `canBeValidated = false` argument suggests, that the cell passes validation by default.\n /**\n * @private\n * @function done\n * @param {boolean} valid Indicates if the validation was successful.\n * @param {boolean} [canBeValidated=true] Flag which controls the validation process.\n */\n function done(valid) {\n let canBeValidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n // Fixes GH#3903\n if (!canBeValidated || cellProperties.hidden === true) {\n callback(valid);\n return;\n }\n const col = cellProperties.visualCol;\n const row = cellProperties.visualRow;\n const td = instance.getCell(row, col, true);\n if (td && td.nodeName !== 'TH') {\n const renderableRow = instance.rowIndexMapper.getRenderableFromVisualIndex(row);\n const renderableColumn = instance.columnIndexMapper.getRenderableFromVisualIndex(col);\n instance.view._wt.getSetting('cellRenderer', renderableRow, renderableColumn, td);\n }\n callback(valid);\n }\n if ((0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isRegExp)(validator)) {\n validator = function (expression) {\n return function (cellValue, validatorCallback) {\n validatorCallback(expression.test(cellValue));\n };\n }(validator);\n }\n if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(validator)) {\n // eslint-disable-next-line no-param-reassign\n value = instance.runHooks('beforeValidate', value, cellProperties.visualRow, cellProperties.prop, source);\n\n // To provide consistent behaviour, validation should be always asynchronous\n instance._registerImmediate(() => {\n validator.call(cellProperties, value, valid => {\n if (!instance) {\n return;\n }\n // eslint-disable-next-line no-param-reassign\n valid = instance.runHooks('afterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);\n cellProperties.valid = valid;\n done(valid);\n instance.runHooks('postAfterValidate', valid, value, cellProperties.visualRow, cellProperties.prop, source);\n });\n });\n } else {\n // resolve callback even if validator function was not found\n instance._registerImmediate(() => {\n cellProperties.valid = true;\n done(cellProperties.valid, false);\n });\n }\n };\n\n /**\n * @ignore\n * @param {number} row The visual row index.\n * @param {string|number} propOrCol The visual prop or column index.\n * @param {*} value The cell value.\n * @returns {Array}\n */\n function setDataInputToArray(row, propOrCol, value) {\n if (Array.isArray(row)) {\n // it's an array of changes\n return row;\n }\n return [[row, propOrCol, value]];\n }\n\n /**\n * Process changes prepared for applying to the dataset (unifying list of changes, closing an editor - when needed,\n * calling a hook).\n *\n * @private\n * @param {Array} changes Array of changes in format `[[row, col, value],...]`.\n * @param {string} [source] String that identifies how this change will be described in the changes array (useful in afterChange or beforeChange callback). Set to 'edit' if left empty.\n * @returns {Array} List of changes finally applied to the dataset.\n */\n function processChanges(changes, source) {\n const beforeChangeResult = instance.runHooks('beforeChange', changes, source || 'edit');\n // The `beforeChange` hook could add a `null` for purpose of cancelling some dataset's change.\n const filteredChanges = changes.filter(change => change !== null);\n if (beforeChangeResult === false || filteredChanges.length === 0) {\n var _instance$getActiveEd;\n (_instance$getActiveEd = instance.getActiveEditor()) === null || _instance$getActiveEd === void 0 || _instance$getActiveEd.cancelChanges();\n return [];\n }\n for (let i = filteredChanges.length - 1; i >= 0; i--) {\n const [row, prop,, newValue] = filteredChanges[i];\n const visualColumn = datamap.propToCol(prop);\n let cellProperties;\n if (Number.isInteger(visualColumn)) {\n cellProperties = instance.getCellMeta(row, visualColumn);\n } else {\n // If there's no requested visual column, we can use the table meta as the cell properties\n cellProperties = {\n ...Object.getPrototypeOf(tableMeta),\n ...tableMeta\n };\n }\n const {\n type,\n checkedTemplate,\n uncheckedTemplate\n } = cellProperties;\n if (type === 'numeric' && typeof newValue === 'string' && (0,_helpers_number_mjs__WEBPACK_IMPORTED_MODULE_40__.isNumericLike)(newValue)) {\n filteredChanges[i][3] = getParsedNumber(newValue);\n }\n if (type === 'checkbox') {\n const stringifiedValue = (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.stringify)(newValue);\n const isChecked = stringifiedValue === (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.stringify)(checkedTemplate);\n const isUnchecked = stringifiedValue === (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.stringify)(uncheckedTemplate);\n if (isChecked || isUnchecked) {\n filteredChanges[i][3] = isChecked ? checkedTemplate : uncheckedTemplate;\n }\n }\n }\n return filteredChanges;\n }\n\n /**\n * @description\n * Set new value to a cell. To change many cells at once (recommended way), pass an array of `changes` in format\n * `[[row, col, value],...]` as the first argument.\n *\n * @memberof Core#\n * @function setDataAtCell\n * @param {number|Array} row Visual row index or array of changes in format `[[row, col, value],...]`.\n * @param {number} [column] Visual column index.\n * @param {string} [value] New value.\n * @param {string} [source] String that identifies how this change will be described in the changes array (useful in afterChange or beforeChange callback). Set to 'edit' if left empty.\n */\n this.setDataAtCell = function (row, column, value, source) {\n const input = setDataInputToArray(row, column, value);\n const changes = [];\n let changeSource = source;\n let i;\n let ilen;\n let prop;\n for (i = 0, ilen = input.length; i < ilen; i++) {\n if (typeof input[i] !== 'object') {\n throw new Error('Method `setDataAtCell` accepts row number or changes array of arrays as its first parameter');\n }\n if (typeof input[i][1] !== 'number') {\n throw new Error('Method `setDataAtCell` accepts row and column number as its parameters. If you want to use object property name, use method `setDataAtRowProp`'); // eslint-disable-line max-len\n }\n if (input[i][1] >= this.countCols()) {\n prop = input[i][1];\n } else {\n prop = datamap.colToProp(input[i][1]);\n }\n changes.push([input[i][0], prop, dataSource.getAtCell(this.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);\n }\n if (!changeSource && typeof row === 'object') {\n changeSource = column;\n }\n const processedChanges = processChanges(changes, changeSource);\n instance.runHooks('afterSetDataAtCell', processedChanges, changeSource);\n validateChanges(processedChanges, changeSource, () => {\n applyChanges(processedChanges, changeSource);\n });\n };\n\n /**\n * @description\n * Set new value to a cell. To change many cells at once (recommended way), pass an array of `changes` in format\n * `[[row, prop, value],...]` as the first argument.\n *\n * @memberof Core#\n * @function setDataAtRowProp\n * @param {number|Array} row Visual row index or array of changes in format `[[row, prop, value], ...]`.\n * @param {string} prop Property name or the source string (e.g. `'first.name'` or `'0'`).\n * @param {string} value Value to be set.\n * @param {string} [source] String that identifies how this change will be described in changes array (useful in onChange callback).\n */\n this.setDataAtRowProp = function (row, prop, value, source) {\n const input = setDataInputToArray(row, prop, value);\n const changes = [];\n let changeSource = source;\n let i;\n let ilen;\n for (i = 0, ilen = input.length; i < ilen; i++) {\n changes.push([input[i][0], input[i][1], dataSource.getAtCell(this.toPhysicalRow(input[i][0]), input[i][1]), input[i][2]]);\n }\n\n // TODO: I don't think `prop` should be used as `changeSource` here, but removing it would be a breaking change.\n // We should remove it with the next major release.\n if (!changeSource && typeof row === 'object') {\n changeSource = prop;\n }\n const processedChanges = processChanges(changes, source);\n instance.runHooks('afterSetDataAtRowProp', processedChanges, changeSource);\n validateChanges(processedChanges, changeSource, () => {\n applyChanges(processedChanges, changeSource);\n });\n };\n\n /**\n * Listen to the keyboard input on document body. This allows Handsontable to capture keyboard events and respond\n * in the right way.\n *\n * @memberof Core#\n * @function listen\n * @fires Hooks#afterListen\n */\n this.listen = function () {\n if (instance && !instance.isListening()) {\n foreignHotInstances.forEach(foreignHot => {\n if (instance !== foreignHot) {\n foreignHot.unlisten();\n }\n });\n activeGuid = instance.guid;\n instance.runHooks('afterListen');\n }\n };\n\n /**\n * Stop listening to keyboard input on the document body. Calling this method makes the Handsontable inactive for\n * any keyboard events.\n *\n * @memberof Core#\n * @function unlisten\n */\n this.unlisten = function () {\n if (this.isListening()) {\n activeGuid = null;\n instance.runHooks('afterUnlisten');\n }\n };\n\n /**\n * Returns `true` if the current Handsontable instance is listening to keyboard input on document body.\n *\n * @memberof Core#\n * @function isListening\n * @returns {boolean} `true` if the instance is listening, `false` otherwise.\n */\n this.isListening = function () {\n return activeGuid === instance.guid;\n };\n\n /**\n * Destroys the current editor, render the table and prepares the editor of the newly selected cell.\n *\n * @memberof Core#\n * @function destroyEditor\n * @param {boolean} [revertOriginal=false] If `true`, the previous value will be restored. Otherwise, the edited value will be saved.\n * @param {boolean} [prepareEditorIfNeeded=true] If `true` the editor under the selected cell will be prepared to open.\n */\n this.destroyEditor = function () {\n let revertOriginal = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n let prepareEditorIfNeeded = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n editorManager.closeEditor(revertOriginal);\n instance.view.render();\n if (prepareEditorIfNeeded && selection.isSelected()) {\n editorManager.prepareEditor();\n }\n };\n\n /**\n * Populates cells at position with 2D input array (e.g. `[[1, 2], [3, 4]]`). Use `endRow`, `endCol` when you\n * want to cut input when a certain row is reached.\n *\n * The `populateFromArray()` method can't change [`readOnly`](@/api/options.md#readonly) cells.\n *\n * Optional `method` argument has the same effect as pasteMode option (see {@link Options#pasteMode}).\n *\n * @memberof Core#\n * @function populateFromArray\n * @param {number} row Start visual row index.\n * @param {number} column Start visual column index.\n * @param {Array} input 2d array.\n * @param {number} [endRow] End visual row index (use when you want to cut input when certain row is reached).\n * @param {number} [endCol] End visual column index (use when you want to cut input when certain column is reached).\n * @param {string} [source=populateFromArray] Used to identify this call in the resulting events (beforeChange, afterChange).\n * @param {string} [method=overwrite] Populate method, possible values: `'shift_down'`, `'shift_right'`, `'overwrite'`.\n * @returns {object|undefined} Ending td in pasted area (only if any cell was changed).\n */\n this.populateFromArray = function (row, column, input, endRow, endCol, source, method) {\n if (!(typeof input === 'object' && typeof input[0] === 'object')) {\n throw new Error('populateFromArray parameter `input` must be an array of arrays'); // API changed in 0.9-beta2, let's check if you use it correctly\n }\n const c = typeof endRow === 'number' ? instance._createCellCoords(endRow, endCol) : null;\n return grid.populateFromArray(instance._createCellCoords(row, column), input, c, source, method);\n };\n\n /**\n * Adds/removes data from the column. This method works the same as Array.splice for arrays.\n *\n * @memberof Core#\n * @function spliceCol\n * @param {number} column Index of the column in which do you want to do splice.\n * @param {number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n * @param {number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n * @param {...number} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.\n * @returns {Array} Returns removed portion of columns.\n */\n this.spliceCol = function (column, index, amount) {\n for (var _len16 = arguments.length, elements = new Array(_len16 > 3 ? _len16 - 3 : 0), _key16 = 3; _key16 < _len16; _key16++) {\n elements[_key16 - 3] = arguments[_key16];\n }\n return datamap.spliceCol(column, index, amount, ...elements);\n };\n\n /**\n * Adds/removes data from the row. This method works the same as Array.splice for arrays.\n *\n * @memberof Core#\n * @function spliceRow\n * @param {number} row Index of column in which do you want to do splice.\n * @param {number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n * @param {number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n * @param {...number} [elements] The elements to add to the array. If you don't specify any elements, spliceCol simply removes elements from the array.\n * @returns {Array} Returns removed portion of rows.\n */\n this.spliceRow = function (row, index, amount) {\n for (var _len17 = arguments.length, elements = new Array(_len17 > 3 ? _len17 - 3 : 0), _key17 = 3; _key17 < _len17; _key17++) {\n elements[_key17 - 3] = arguments[_key17];\n }\n return datamap.spliceRow(row, index, amount, ...elements);\n };\n\n /**\n * Returns indexes of the currently selected cells as an array of arrays `[[startRow, startCol, endRow, endCol],...]`.\n *\n * Start row and start column are the coordinates of the active cell (where the selection was started).\n *\n * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays.\n * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method)\n * you need to use `getSelectedLast` method.\n *\n * @memberof Core#\n * @function getSelected\n * @returns {Array[]|undefined} An array of arrays of the selection's coordinates.\n */\n this.getSelected = function () {\n // https://github.com/handsontable/handsontable/issues/44 //cjl\n if (selection.isSelected()) {\n return (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayMap)(selection.getSelectedRange(), _ref8 => {\n let {\n from,\n to\n } = _ref8;\n return [from.row, from.col, to.row, to.col];\n });\n }\n };\n\n /**\n * Returns the last coordinates applied to the table as a an array `[startRow, startCol, endRow, endCol]`.\n *\n * @since 0.36.0\n * @memberof Core#\n * @function getSelectedLast\n * @returns {Array|undefined} An array of the selection's coordinates.\n */\n this.getSelectedLast = function () {\n const selected = this.getSelected();\n let result;\n if (selected && selected.length > 0) {\n result = selected[selected.length - 1];\n }\n return result;\n };\n\n /**\n * Returns the current selection as an array of CellRange objects.\n *\n * The version 0.36.0 adds a non-consecutive selection feature. Since this version, the method returns an array of arrays.\n * Additionally to collect the coordinates of the currently selected area (as it was previously done by the method)\n * you need to use `getSelectedRangeLast` method.\n *\n * @memberof Core#\n * @function getSelectedRange\n * @returns {CellRange[]|undefined} Selected range object or undefined if there is no selection.\n */\n this.getSelectedRange = function () {\n // https://github.com/handsontable/handsontable/issues/44 //cjl\n if (selection.isSelected()) {\n return Array.from(selection.getSelectedRange());\n }\n };\n\n /**\n * Returns the last coordinates applied to the table as a CellRange object.\n *\n * @memberof Core#\n * @function getSelectedRangeLast\n * @since 0.36.0\n * @returns {CellRange|undefined} Selected range object or undefined` if there is no selection.\n */\n this.getSelectedRangeLast = function () {\n const selectedRange = this.getSelectedRange();\n let result;\n if (selectedRange && selectedRange.length > 0) {\n result = selectedRange[selectedRange.length - 1];\n }\n return result;\n };\n\n /**\n * Erases content from cells that have been selected in the table.\n *\n * @memberof Core#\n * @function emptySelectedCells\n * @param {string} [source] String that identifies how this change will be described in the changes array (useful in afterChange or beforeChange callback). Set to 'edit' if left empty.\n * @since 0.36.0\n */\n this.emptySelectedCells = function (source) {\n if (!selection.isSelected() || this.countRows() === 0 || this.countCols() === 0) {\n return;\n }\n const changes = [];\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayEach)(selection.getSelectedRange(), cellRange => {\n if (cellRange.isSingleHeader()) {\n return;\n }\n const topStart = cellRange.getTopStartCorner();\n const bottomEnd = cellRange.getBottomEndCorner();\n (0,_helpers_number_mjs__WEBPACK_IMPORTED_MODULE_40__.rangeEach)(topStart.row, bottomEnd.row, row => {\n (0,_helpers_number_mjs__WEBPACK_IMPORTED_MODULE_40__.rangeEach)(topStart.col, bottomEnd.col, column => {\n if (!this.getCellMeta(row, column).readOnly) {\n changes.push([row, column, null]);\n }\n });\n });\n });\n if (changes.length > 0) {\n this.setDataAtCell(changes, source);\n }\n };\n\n /**\n * Checks if the table rendering process was suspended. See explanation in {@link Core#suspendRender}.\n *\n * @memberof Core#\n * @function isRenderSuspended\n * @since 8.3.0\n * @returns {boolean}\n */\n this.isRenderSuspended = function () {\n return this.renderSuspendedCounter > 0;\n };\n\n /**\n * Suspends the rendering process. It's helpful to wrap the table render\n * cycles triggered by API calls or UI actions (or both) and call the \"render\"\n * once in the end. As a result, it improves the performance of wrapped operations.\n * When the table is in the suspend state, most operations will have no visual\n * effect until the rendering state is resumed. Resuming the state automatically\n * invokes the table rendering. To make sure that after executing all operations,\n * the table will be rendered, it's highly recommended to use the {@link Core#batchRender}\n * method or {@link Core#batch}, which additionally aggregates the logic execution\n * that happens behind the table.\n *\n * The method is intended to be used by advanced users. Suspending the rendering\n * process could cause visual glitches when wrongly implemented.\n *\n * Every [`suspendRender()`](@/api/core.md#suspendrender) call needs to correspond with one [`resumeRender()`](@/api/core.md#resumerender) call.\n * For example, if you call [`suspendRender()`](@/api/core.md#suspendrender) 5 times, you need to call [`resumeRender()`](@/api/core.md#resumerender) 5 times as well.\n *\n * @memberof Core#\n * @function suspendRender\n * @since 8.3.0\n * @example\n * ```js\n * hot.suspendRender();\n * hot.alter('insert_row_above', 5, 45);\n * hot.alter('insert_col_start', 10, 40);\n * hot.setDataAtCell(1, 1, 'John');\n * hot.setDataAtCell(2, 2, 'Mark');\n * hot.setDataAtCell(3, 3, 'Ann');\n * hot.setDataAtCell(4, 4, 'Sophia');\n * hot.setDataAtCell(5, 5, 'Mia');\n * hot.selectCell(0, 0);\n * hot.resumeRender(); // It re-renders the table internally\n * ```\n */\n this.suspendRender = function () {\n this.renderSuspendedCounter += 1;\n };\n\n /**\n * Resumes the rendering process. In combination with the {@link Core#suspendRender}\n * method it allows aggregating the table render cycles triggered by API calls or UI\n * actions (or both) and calls the \"render\" once in the end. When the table is in\n * the suspend state, most operations will have no visual effect until the rendering\n * state is resumed. Resuming the state automatically invokes the table rendering.\n *\n * The method is intended to be used by advanced users. Suspending the rendering\n * process could cause visual glitches when wrongly implemented.\n *\n * Every [`suspendRender()`](@/api/core.md#suspendrender) call needs to correspond with one [`resumeRender()`](@/api/core.md#resumerender) call.\n * For example, if you call [`suspendRender()`](@/api/core.md#suspendrender) 5 times, you need to call [`resumeRender()`](@/api/core.md#resumerender) 5 times as well.\n *\n * @memberof Core#\n * @function resumeRender\n * @since 8.3.0\n * @example\n * ```js\n * hot.suspendRender();\n * hot.alter('insert_row_above', 5, 45);\n * hot.alter('insert_col_start', 10, 40);\n * hot.setDataAtCell(1, 1, 'John');\n * hot.setDataAtCell(2, 2, 'Mark');\n * hot.setDataAtCell(3, 3, 'Ann');\n * hot.setDataAtCell(4, 4, 'Sophia');\n * hot.setDataAtCell(5, 5, 'Mia');\n * hot.selectCell(0, 0);\n * hot.resumeRender(); // It re-renders the table internally\n * ```\n */\n this.resumeRender = function () {\n const nextValue = this.renderSuspendedCounter - 1;\n this.renderSuspendedCounter = Math.max(nextValue, 0);\n if (!this.isRenderSuspended() && nextValue === this.renderSuspendedCounter) {\n instance.view.render();\n }\n };\n\n /**\n * Rerender the table. Calling this method starts the process of recalculating, redrawing and applying the changes\n * to the DOM. While rendering the table all cell renderers are recalled.\n *\n * Calling this method manually is not recommended. Handsontable tries to render itself by choosing the most\n * optimal moments in its lifecycle.\n *\n * @memberof Core#\n * @function render\n */\n this.render = function () {\n if (this.view) {\n // used when data was changed or when all cells need to be re-rendered (slow render)\n this.forceFullRender = true;\n if (!this.isRenderSuspended()) {\n instance.view.render();\n }\n }\n };\n\n /**\n * The method aggregates multi-line API calls into a callback and postpones the\n * table rendering process. After the execution of the operations, the table is\n * rendered once. As a result, it improves the performance of wrapped operations.\n * Without batching, a similar case could trigger multiple table render calls.\n *\n * @memberof Core#\n * @function batchRender\n * @param {Function} wrappedOperations Batched operations wrapped in a function.\n * @returns {*} Returns result from the wrappedOperations callback.\n * @since 8.3.0\n * @example\n * ```js\n * hot.batchRender(() => {\n * hot.alter('insert_row_above', 5, 45);\n * hot.alter('insert_col_start', 10, 40);\n * hot.setDataAtCell(1, 1, 'John');\n * hot.setDataAtCell(2, 2, 'Mark');\n * hot.setDataAtCell(3, 3, 'Ann');\n * hot.setDataAtCell(4, 4, 'Sophia');\n * hot.setDataAtCell(5, 5, 'Mia');\n * hot.selectCell(0, 0);\n * // The table will be rendered once after executing the callback\n * });\n * ```\n */\n this.batchRender = function (wrappedOperations) {\n this.suspendRender();\n const result = wrappedOperations();\n this.resumeRender();\n return result;\n };\n\n /**\n * Checks if the table indexes recalculation process was suspended. See explanation\n * in {@link Core#suspendExecution}.\n *\n * @memberof Core#\n * @function isExecutionSuspended\n * @since 8.3.0\n * @returns {boolean}\n */\n this.isExecutionSuspended = function () {\n return this.executionSuspendedCounter > 0;\n };\n\n /**\n * Suspends the execution process. It's helpful to wrap the table logic changes\n * such as index changes into one call after which the cache is updated. As a result,\n * it improves the performance of wrapped operations.\n *\n * The method is intended to be used by advanced users. Suspending the execution\n * process could cause visual glitches caused by not updated the internal table cache.\n *\n * @memberof Core#\n * @function suspendExecution\n * @since 8.3.0\n * @example\n * ```js\n * hot.suspendExecution();\n * const filters = hot.getPlugin('filters');\n *\n * filters.addCondition(2, 'contains', ['3']);\n * filters.filter();\n * hot.getPlugin('columnSorting').sort({ column: 1, sortOrder: 'desc' });\n * hot.resumeExecution(); // It updates the cache internally\n * ```\n */\n this.suspendExecution = function () {\n this.executionSuspendedCounter += 1;\n this.columnIndexMapper.suspendOperations();\n this.rowIndexMapper.suspendOperations();\n };\n\n /**\n * Resumes the execution process. In combination with the {@link Core#suspendExecution}\n * method it allows aggregating the table logic changes after which the cache is\n * updated. Resuming the state automatically invokes the table cache updating process.\n *\n * The method is intended to be used by advanced users. Suspending the execution\n * process could cause visual glitches caused by not updated the internal table cache.\n *\n * @memberof Core#\n * @function resumeExecution\n * @param {boolean} [forceFlushChanges=false] If `true`, the table internal data cache\n * is recalculated after the execution of the batched operations. For nested\n * {@link Core#batchExecution} calls, it can be desire to recalculate the table\n * after each batch.\n * @since 8.3.0\n * @example\n * ```js\n * hot.suspendExecution();\n * const filters = hot.getPlugin('filters');\n *\n * filters.addCondition(2, 'contains', ['3']);\n * filters.filter();\n * hot.getPlugin('columnSorting').sort({ column: 1, sortOrder: 'desc' });\n * hot.resumeExecution(); // It updates the cache internally\n * ```\n */\n this.resumeExecution = function () {\n let forceFlushChanges = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n const nextValue = this.executionSuspendedCounter - 1;\n this.executionSuspendedCounter = Math.max(nextValue, 0);\n if (!this.isExecutionSuspended() && nextValue === this.executionSuspendedCounter || forceFlushChanges) {\n this.columnIndexMapper.resumeOperations();\n this.rowIndexMapper.resumeOperations();\n }\n };\n\n /**\n * The method aggregates multi-line API calls into a callback and postpones the\n * table execution process. After the execution of the operations, the internal table\n * cache is recalculated once. As a result, it improves the performance of wrapped\n * operations. Without batching, a similar case could trigger multiple table cache rebuilds.\n *\n * @memberof Core#\n * @function batchExecution\n * @param {Function} wrappedOperations Batched operations wrapped in a function.\n * @param {boolean} [forceFlushChanges=false] If `true`, the table internal data cache\n * is recalculated after the execution of the batched operations. For nested calls,\n * it can be a desire to recalculate the table after each batch.\n * @returns {*} Returns result from the wrappedOperations callback.\n * @since 8.3.0\n * @example\n * ```js\n * hot.batchExecution(() => {\n * const filters = hot.getPlugin('filters');\n *\n * filters.addCondition(2, 'contains', ['3']);\n * filters.filter();\n * hot.getPlugin('columnSorting').sort({ column: 1, sortOrder: 'desc' });\n * // The table cache will be recalculated once after executing the callback\n * });\n * ```\n */\n this.batchExecution = function (wrappedOperations) {\n let forceFlushChanges = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n this.suspendExecution();\n const result = wrappedOperations();\n this.resumeExecution(forceFlushChanges);\n return result;\n };\n\n /**\n * It batches the rendering process and index recalculations. The method aggregates\n * multi-line API calls into a callback and postpones the table rendering process\n * as well aggregates the table logic changes such as index changes into one call\n * after which the cache is updated. After the execution of the operations, the\n * table is rendered, and the cache is updated once. As a result, it improves the\n * performance of wrapped operations.\n *\n * @memberof Core#\n * @function batch\n * @param {Function} wrappedOperations Batched operations wrapped in a function.\n * @returns {*} Returns result from the wrappedOperations callback.\n * @since 8.3.0\n * @example\n * ```js\n * hot.batch(() => {\n * hot.alter('insert_row_above', 5, 45);\n * hot.alter('insert_col_start', 10, 40);\n * hot.setDataAtCell(1, 1, 'x');\n * hot.setDataAtCell(2, 2, 'c');\n * hot.setDataAtCell(3, 3, 'v');\n * hot.setDataAtCell(4, 4, 'b');\n * hot.setDataAtCell(5, 5, 'n');\n * hot.selectCell(0, 0);\n *\n * const filters = hot.getPlugin('filters');\n *\n * filters.addCondition(2, 'contains', ['3']);\n * filters.filter();\n * hot.getPlugin('columnSorting').sort({ column: 1, sortOrder: 'desc' });\n * // The table will be re-rendered and cache will be recalculated once after executing the callback\n * });\n * ```\n */\n this.batch = function (wrappedOperations) {\n this.suspendRender();\n this.suspendExecution();\n const result = wrappedOperations();\n this.resumeExecution();\n this.resumeRender();\n return result;\n };\n\n /**\n * Updates dimensions of the table. The method compares previous dimensions with the current ones and updates accordingly.\n *\n * @memberof Core#\n * @function refreshDimensions\n * @fires Hooks#beforeRefreshDimensions\n * @fires Hooks#afterRefreshDimensions\n */\n this.refreshDimensions = function () {\n if (!instance.view) {\n return;\n }\n const view = instance.view;\n const {\n width: lastWidth,\n height: lastHeight\n } = view.getLastSize();\n const {\n width,\n height\n } = instance.rootElement.getBoundingClientRect();\n const isSizeChanged = width !== lastWidth || height !== lastHeight;\n const isResizeBlocked = instance.runHooks('beforeRefreshDimensions', {\n width: lastWidth,\n height: lastHeight\n }, {\n width,\n height\n }, isSizeChanged) === false;\n if (isResizeBlocked) {\n return;\n }\n if (isSizeChanged || view._wt.wtOverlays.scrollableElement === instance.rootWindow) {\n view.setLastSize(width, height);\n instance.render();\n view.adjustElementsSize();\n }\n instance.runHooks('afterRefreshDimensions', {\n width: lastWidth,\n height: lastHeight\n }, {\n width,\n height\n }, isSizeChanged);\n };\n\n /**\n * The `updateData()` method replaces Handsontable's [`data`](@/api/options.md#data) with a new dataset.\n *\n * The `updateData()` method:\n * - Keeps cells' states (e.g. cells' [formatting](@/guides/cell-features/formatting-cells/formatting-cells.md) and cells' [`readOnly`](@/api/options.md#readonly) states)\n * - Keeps rows' states (e.g. row order)\n * - Keeps columns' states (e.g. column order)\n *\n * To replace Handsontable's [`data`](@/api/options.md#data) and reset states, use the [`loadData()`](#loaddata) method.\n *\n * Read more:\n * - [Binding to data](@/guides/getting-started/binding-to-data/binding-to-data.md)\n * - [Saving data](@/guides/getting-started/saving-data/saving-data.md)\n *\n * @memberof Core#\n * @function updateData\n * @since 11.1.0\n * @param {Array} data An [array of arrays](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-objects), that contains Handsontable's data\n * @param {string} [source] The source of the `updateData()` call\n * @fires Hooks#beforeUpdateData\n * @fires Hooks#afterUpdateData\n * @fires Hooks#afterChange\n */\n this.updateData = function (data, source) {\n (0,_dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_41__.replaceData)(data, newDataMap => {\n datamap = newDataMap;\n }, newDataMap => {\n datamap = newDataMap;\n instance.columnIndexMapper.fitToLength(this.getInitialColumnCount());\n instance.rowIndexMapper.fitToLength(this.countSourceRows());\n grid.adjustRowsAndCols();\n selection.refresh();\n }, {\n hotInstance: instance,\n dataMap: datamap,\n dataSource,\n internalSource: 'updateData',\n source,\n metaManager,\n firstRun\n });\n };\n\n /**\n * The `loadData()` method replaces Handsontable's [`data`](@/api/options.md#data) with a new dataset.\n *\n * Additionally, the `loadData()` method:\n * - Resets cells' states (e.g. cells' [formatting](@/guides/cell-features/formatting-cells/formatting-cells.md) and cells' [`readOnly`](@/api/options.md#readonly) states)\n * - Resets rows' states (e.g. row order)\n * - Resets columns' states (e.g. column order)\n *\n * To replace Handsontable's [`data`](@/api/options.md#data) without resetting states, use the [`updateData()`](#updatedata) method.\n *\n * Read more:\n * - [Binding to data](@/guides/getting-started/binding-to-data/binding-to-data.md)\n * - [Saving data](@/guides/getting-started/saving-data/saving-data.md)\n *\n * @memberof Core#\n * @function loadData\n * @param {Array} data An [array of arrays](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-objects), that contains Handsontable's data\n * @param {string} [source] The source of the `loadData()` call\n * @fires Hooks#beforeLoadData\n * @fires Hooks#afterLoadData\n * @fires Hooks#afterChange\n */\n this.loadData = function (data, source) {\n (0,_dataMap_index_mjs__WEBPACK_IMPORTED_MODULE_41__.replaceData)(data, newDataMap => {\n datamap = newDataMap;\n }, () => {\n metaManager.clearCellsCache();\n instance.initIndexMappers();\n grid.adjustRowsAndCols();\n selection.refresh();\n if (firstRun) {\n firstRun = [null, 'loadData'];\n }\n }, {\n hotInstance: instance,\n dataMap: datamap,\n dataSource,\n internalSource: 'loadData',\n source,\n metaManager,\n firstRun\n });\n };\n\n /**\n * Gets the initial column count, calculated based on the `columns` setting.\n *\n * @private\n * @returns {number} The calculated number of columns.\n */\n this.getInitialColumnCount = function () {\n const columnsSettings = tableMeta.columns;\n let finalNrOfColumns = 0;\n\n // We will check number of columns when the `columns` property was defined as an array. Columns option may\n // narrow down or expand displayed dataset in that case.\n if (Array.isArray(columnsSettings)) {\n finalNrOfColumns = columnsSettings.length;\n } else if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(columnsSettings)) {\n if (instance.dataType === 'array') {\n const nrOfSourceColumns = this.countSourceCols();\n for (let columnIndex = 0; columnIndex < nrOfSourceColumns; columnIndex += 1) {\n if (columnsSettings(columnIndex)) {\n finalNrOfColumns += 1;\n }\n }\n\n // Extended dataset by the `columns` property? Moved code right from the refactored `countCols` method.\n } else if (instance.dataType === 'object' || instance.dataType === 'function') {\n finalNrOfColumns = datamap.colToPropCache.length;\n }\n\n // In some cases we need to check columns length from the schema, i.e. `data` may be empty.\n } else if ((0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isDefined)(tableMeta.dataSchema)) {\n const schema = datamap.getSchema();\n\n // Schema may be defined as an array of objects. Each object will define column.\n finalNrOfColumns = Array.isArray(schema) ? schema.length : (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.deepObjectSize)(schema);\n } else {\n // We init index mappers by length of source data to provide indexes also for skipped indexes.\n finalNrOfColumns = this.countSourceCols();\n }\n return finalNrOfColumns;\n };\n\n /**\n * Init index mapper which manage indexes assigned to the data.\n *\n * @private\n */\n this.initIndexMappers = function () {\n this.columnIndexMapper.initToLength(this.getInitialColumnCount());\n this.rowIndexMapper.initToLength(this.countSourceRows());\n };\n\n /**\n * Returns the current data object (the same one that was passed by `data` configuration option or `loadData` method,\n * unless some modifications have been applied (i.e. Sequence of rows/columns was changed, some row/column was skipped).\n * If that's the case - use the {@link Core#getSourceData} method.).\n *\n * Optionally you can provide cell range by defining `row`, `column`, `row2`, `column2` to get only a fragment of table data.\n *\n * @memberof Core#\n * @function getData\n * @param {number} [row] From visual row index.\n * @param {number} [column] From visual column index.\n * @param {number} [row2] To visual row index.\n * @param {number} [column2] To visual column index.\n * @returns {Array[]} Array with the data.\n * @example\n * ```js\n * // Get all data (in order how it is rendered in the table).\n * hot.getData();\n * // Get data fragment (from top-left 0, 0 to bottom-right 3, 3).\n * hot.getData(3, 3);\n * // Get data fragment (from top-left 2, 1 to bottom-right 3, 3).\n * hot.getData(2, 1, 3, 3);\n * ```\n */\n this.getData = function (row, column, row2, column2) {\n if ((0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isUndefined)(row)) {\n return datamap.getAll();\n }\n return datamap.getRange(instance._createCellCoords(row, column), instance._createCellCoords(row2, column2), datamap.DESTINATION_RENDERER);\n };\n\n /**\n * Returns a string value of the selected range. Each column is separated by tab, each row is separated by a new\n * line character.\n *\n * @memberof Core#\n * @function getCopyableText\n * @param {number} startRow From visual row index.\n * @param {number} startCol From visual column index.\n * @param {number} endRow To visual row index.\n * @param {number} endCol To visual column index.\n * @returns {string}\n */\n this.getCopyableText = function (startRow, startCol, endRow, endCol) {\n return datamap.getCopyableText(instance._createCellCoords(startRow, startCol), instance._createCellCoords(endRow, endCol));\n };\n\n /**\n * Returns the data's copyable value at specified `row` and `column` index.\n *\n * @memberof Core#\n * @function getCopyableData\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @returns {string}\n */\n this.getCopyableData = function (row, column) {\n return datamap.getCopyable(row, datamap.colToProp(column));\n };\n\n /**\n * Returns schema provided by constructor settings. If it doesn't exist then it returns the schema based on the data\n * structure in the first row.\n *\n * @memberof Core#\n * @function getSchema\n * @returns {object} Schema object.\n */\n this.getSchema = function () {\n return datamap.getSchema();\n };\n\n /**\n * Use it if you need to change configuration after initialization. The `settings` argument is an object containing the changed\n * settings, declared the same way as in the initial settings object.\n *\n * __Note__, that although the `updateSettings` method doesn't overwrite the previously declared settings, it might reset\n * the settings made post-initialization. (for example - ignore changes made using the columnResize feature).\n *\n * Since 8.0.0 passing `columns` or `data` inside `settings` objects will result in resetting states corresponding to rows and columns\n * (for example, row/column sequence, column width, row height, frozen columns etc.).\n *\n * Since 12.0.0 passing `data` inside `settings` objects no longer results in resetting states corresponding to rows and columns\n * (for example, row/column sequence, column width, row height, frozen columns etc.).\n *\n * @memberof Core#\n * @function updateSettings\n * @param {object} settings A settings object (see {@link Options}). Only provide the settings that are changed, not the whole settings object that was used for initialization.\n * @param {boolean} [init=false] Internally used for in initialization mode.\n * @example\n * ```js\n * hot.updateSettings({\n * contextMenu: true,\n * colHeaders: true,\n * fixedRowsTop: 2\n * });\n * ```\n * @fires Hooks#afterCellMetaReset\n * @fires Hooks#afterUpdateSettings\n */\n this.updateSettings = function (settings) {\n let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n const dataUpdateFunction = (firstRun ? instance.loadData : instance.updateData).bind(this);\n let columnsAsFunc = false;\n let i;\n let j;\n if ((0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isDefined)(settings.rows)) {\n throw new Error('The \"rows\" setting is no longer supported. Do you mean startRows, minRows or maxRows?');\n }\n if ((0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isDefined)(settings.cols)) {\n throw new Error('The \"cols\" setting is no longer supported. Do you mean startCols, minCols or maxCols?');\n }\n if ((0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isDefined)(settings.ganttChart)) {\n throw new Error('Since 8.0.0 the \"ganttChart\" setting is no longer supported.');\n }\n if (settings.language) {\n setLanguage(settings.language);\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (i in settings) {\n if (i === 'data' || i === 'language') {\n // Do nothing. loadData and language change will be triggered later\n } else if (i === 'className') {\n setClassName('className', settings.className);\n } else if (i === 'tableClassName' && instance.table) {\n setClassName('tableClassName', settings.tableClassName);\n instance.view._wt.wtOverlays.syncOverlayTableClassNames();\n } else if (_core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().isRegistered(i) || _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().isDeprecated(i)) {\n const hook = settings[i];\n if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(hook)) {\n _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().addAsFixed(i, hook, instance);\n tableMeta[i] = hook;\n } else if (Array.isArray(hook)) {\n _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().add(i, hook, instance);\n tableMeta[i] = hook;\n }\n } else if (!init && (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.hasOwnProperty)(settings, i)) {\n // Update settings\n globalMeta[i] = settings[i];\n }\n }\n\n // Load data or create data map\n if (settings.data === undefined && tableMeta.data === undefined) {\n dataUpdateFunction(null, 'updateSettings'); // data source created just now\n } else if (settings.data !== undefined) {\n dataUpdateFunction(settings.data, 'updateSettings'); // data source given as option\n } else if (settings.columns !== undefined) {\n datamap.createMap();\n\n // The `column` property has changed - dataset may be expanded or narrowed down. The `loadData` do the same.\n instance.initIndexMappers();\n }\n const clen = instance.countCols();\n const columnSetting = tableMeta.columns;\n\n // Init columns constructors configuration\n if (columnSetting && (0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(columnSetting)) {\n columnsAsFunc = true;\n }\n\n // Clear cell meta cache\n if (settings.cell !== undefined || settings.cells !== undefined || settings.columns !== undefined) {\n metaManager.clearCache();\n }\n if (clen > 0) {\n for (i = 0, j = 0; i < clen; i++) {\n // Use settings provided by user\n if (columnSetting) {\n const column = columnsAsFunc ? columnSetting(i) : columnSetting[j];\n if (column) {\n metaManager.updateColumnMeta(j, column);\n }\n }\n j += 1;\n }\n }\n if ((0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isDefined)(settings.cell)) {\n (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.objectEach)(settings.cell, cell => {\n instance.setCellMetaObject(cell.row, cell.col, cell);\n });\n }\n instance.runHooks('afterCellMetaReset');\n let currentHeight = instance.rootElement.style.height;\n if (currentHeight !== '') {\n currentHeight = parseInt(instance.rootElement.style.height, 10);\n }\n let height = settings.height;\n if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(height)) {\n height = height();\n }\n if (init) {\n const initialStyle = instance.rootElement.getAttribute('style');\n if (initialStyle) {\n instance.rootElement.setAttribute('data-initialstyle', instance.rootElement.getAttribute('style'));\n }\n }\n if (height === null) {\n const initialStyle = instance.rootElement.getAttribute('data-initialstyle');\n if (initialStyle && (initialStyle.indexOf('height') > -1 || initialStyle.indexOf('overflow') > -1)) {\n instance.rootElement.setAttribute('style', initialStyle);\n } else {\n instance.rootElement.style.height = '';\n instance.rootElement.style.overflow = '';\n }\n } else if (height !== undefined) {\n instance.rootElement.style.height = isNaN(height) ? `${height}` : `${height}px`;\n instance.rootElement.style.overflow = 'hidden';\n }\n if (typeof settings.width !== 'undefined') {\n let width = settings.width;\n if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(width)) {\n width = width();\n }\n instance.rootElement.style.width = isNaN(width) ? `${width}` : `${width}px`;\n }\n if (!init) {\n if (instance.view) {\n instance.view._wt.wtViewport.resetHasOversizedColumnHeadersMarked();\n instance.view._wt.exportSettingsAsClassNames();\n const currentThemeName = instance.getCurrentThemeName();\n const themeNameOptionExists = (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.hasOwnProperty)(settings, 'themeName');\n if (currentThemeName && themeNameOptionExists && currentThemeName !== settings.themeName) {\n instance.view.getStylesHandler().removeClassNames();\n instance.view.removeClassNameFromLicenseElement(currentThemeName);\n }\n const themeName = themeNameOptionExists && settings.themeName || (0,_helpers_themes_mjs__WEBPACK_IMPORTED_MODULE_34__.getThemeClassName)(instance.rootElement);\n\n // Use the theme defined as a root element class or in the settings (in that order).\n instance.useTheme(themeName);\n\n // Add the theme class name to the license info element.\n instance.view.addClassNameToLicenseElement(instance.getCurrentThemeName());\n }\n instance.runHooks('afterUpdateSettings', settings);\n }\n grid.adjustRowsAndCols();\n if (instance.view && !firstRun) {\n instance.render();\n instance.view._wt.wtOverlays.adjustElementsSize();\n }\n if (!init && instance.view && (currentHeight === '' || height === '' || height === undefined) && currentHeight !== height) {\n instance.view._wt.wtOverlays.updateMainScrollableElements();\n }\n };\n\n /**\n * Gets the value of the currently focused cell.\n *\n * For column headers and row headers, returns `null`.\n *\n * @memberof Core#\n * @function getValue\n * @returns {*} The value of the focused cell.\n */\n this.getValue = function () {\n const sel = instance.getSelectedLast();\n if (tableMeta.getValue) {\n if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(tableMeta.getValue)) {\n return tableMeta.getValue.call(instance);\n } else if (sel) {\n return instance.getData()[sel[0][0]][tableMeta.getValue];\n }\n } else if (sel) {\n return instance.getDataAtCell(sel[0], sel[1]);\n }\n };\n\n /**\n * Returns the object settings.\n *\n * @memberof Core#\n * @function getSettings\n * @returns {TableMeta} Object containing the current table settings.\n */\n this.getSettings = function () {\n return tableMeta;\n };\n\n /**\n * Clears the data from the table (the table settings remain intact).\n *\n * @memberof Core#\n * @function clear\n */\n this.clear = function () {\n this.selectAll();\n this.emptySelectedCells();\n };\n\n /**\n * The `alter()` method lets you alter the grid's structure\n * by adding or removing rows and columns at specified positions.\n *\n * ::: tip\n * If you use an array of objects in your [`data`](@/api/options.md#data), the column-related actions won't work.\n * :::\n *\n * ```js\n * // above row 10 (by visual index), insert 1 new row\n * hot.alter('insert_row_above', 10);\n * ```\n *\n * | Action | With `index` | Without `index` |\n * | -------------------- | ------------ | --------------- |\n * | `'insert_row_above'` | Inserts rows above the `index` row. | Inserts rows above the first row. |\n * | `'insert_row_below'` | Inserts rows below the `index` row. | Inserts rows below the last row. |\n * | `'remove_row'` | Removes rows, starting from the `index` row. | Removes rows, starting from the last row. |\n * | `'insert_col_start'` | Inserts columns before the `index` column. | Inserts columns before the first column. |\n * | `'insert_col_end'` | Inserts columns after the `index` column. | Inserts columns after the last column. |\n * | `'remove_col'` | Removes columns, starting from the `index` column. | Removes columns, starting from the last column. |\n *\n * Additional information about `'insert_col_start'` and `'insert_col_end'`:\n * - Their behavior depends on your [`layoutDirection`](@/api/options.md#layoutdirection).\n * - If the provided `index` is higher than the actual number of columns, Handsontable doesn't generate\n * the columns missing in between. Instead, the new columns are inserted next to the last column.\n *\n * @memberof Core#\n * @function alter\n * @param {string} action Available operations:\n * \n * - `'insert_row_above'`
\n * - `'insert_row_below'`
\n * - `'remove_row'`
\n * - `'insert_col_start'`
\n * - `'insert_col_end'`
\n * - `'remove_col'`
\n * \n * @param {number|number[]} [index] A visual index of the row/column before or after which the new row/column will be\n * inserted or removed. Can also be an array of arrays, in format `[[index, amount],...]`.\n * @param {number} [amount] The amount of rows or columns to be inserted or removed (default: `1`).\n * @param {string} [source] Source indicator.\n * @param {boolean} [keepEmptyRows] If set to `true`: prevents removing empty rows.\n * @example\n * ```js\n * // above row 10 (by visual index), insert 1 new row\n * hot.alter('insert_row_above', 10);\n *\n * // below row 10 (by visual index), insert 3 new rows\n * hot.alter('insert_row_below', 10, 3);\n *\n * // in the LTR layout direction: to the left of column 10 (by visual index), insert 3 new columns\n * // in the RTL layout direction: to the right of column 10 (by visual index), insert 3 new columns\n * hot.alter('insert_col_start', 10, 3);\n *\n * // in the LTR layout direction: to the right of column 10 (by visual index), insert 1 new column\n * // in the RTL layout direction: to the left of column 10 (by visual index), insert 1 new column\n * hot.alter('insert_col_end', 10);\n *\n * // remove 2 rows, starting from row 10 (by visual index)\n * hot.alter('remove_row', 10, 2);\n *\n * // remove 3 rows, starting from row 1 (by visual index)\n * // remove 2 rows, starting from row 5 (by visual index)\n * hot.alter('remove_row', [[1, 3], [5, 2]]);\n * ```\n */\n this.alter = function (action, index, amount, source, keepEmptyRows) {\n grid.alter(action, index, amount, source, keepEmptyRows);\n };\n\n /**\n * Returns a TD element for the given `row` and `column` arguments, if it is rendered on screen.\n * Returns `null` if the TD is not rendered on screen (probably because that part of the table is not visible).\n *\n * @memberof Core#\n * @function getCell\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {boolean} [topmost=false] If set to `true`, it returns the TD element from the topmost overlay. For example,\n * if the wanted cell is in the range of fixed rows, it will return a TD element from the `top` overlay.\n * @returns {HTMLTableCellElement|null} The cell's TD element.\n */\n this.getCell = function (row, column) {\n let topmost = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let renderableColumnIndex = column; // Handling also column headers.\n let renderableRowIndex = row; // Handling also row headers.\n\n if (column >= 0) {\n if (this.columnIndexMapper.isHidden(this.toPhysicalColumn(column))) {\n return null;\n }\n renderableColumnIndex = this.columnIndexMapper.getRenderableFromVisualIndex(column);\n }\n if (row >= 0) {\n if (this.rowIndexMapper.isHidden(this.toPhysicalRow(row))) {\n return null;\n }\n renderableRowIndex = this.rowIndexMapper.getRenderableFromVisualIndex(row);\n }\n if (renderableRowIndex === null || renderableColumnIndex === null || renderableRowIndex === undefined || renderableColumnIndex === undefined) {\n return null;\n }\n return instance.view.getCellAtCoords(instance._createCellCoords(renderableRowIndex, renderableColumnIndex), topmost);\n };\n\n /**\n * Returns the coordinates of the cell, provided as a HTML table cell element.\n *\n * @memberof Core#\n * @function getCoords\n * @param {HTMLTableCellElement} element The HTML Element representing the cell.\n * @returns {CellCoords|null} Visual coordinates object.\n * @example\n * ```js\n * hot.getCoords(hot.getCell(1, 1));\n * // it returns CellCoords object instance with props row: 1 and col: 1.\n * ```\n */\n this.getCoords = function (element) {\n const renderableCoords = this.view._wt.wtTable.getCoords(element);\n if (renderableCoords === null) {\n return null;\n }\n const {\n row: renderableRow,\n col: renderableColumn\n } = renderableCoords;\n let visualRow = renderableRow;\n let visualColumn = renderableColumn;\n if (renderableRow >= 0) {\n visualRow = this.rowIndexMapper.getVisualFromRenderableIndex(renderableRow);\n }\n if (renderableColumn >= 0) {\n visualColumn = this.columnIndexMapper.getVisualFromRenderableIndex(renderableColumn);\n }\n return instance._createCellCoords(visualRow, visualColumn);\n };\n\n /**\n * Returns the property name that corresponds with the given column index.\n * If the data source is an array of arrays, it returns the columns index.\n *\n * @memberof Core#\n * @function colToProp\n * @param {number} column Visual column index.\n * @returns {string|number} Column property or physical column index.\n */\n this.colToProp = function (column) {\n return datamap.colToProp(column);\n };\n\n /**\n * Returns column index that corresponds with the given property.\n *\n * @memberof Core#\n * @function propToCol\n * @param {string|number} prop Property name or physical column index.\n * @returns {number} Visual column index.\n */\n this.propToCol = function (prop) {\n return datamap.propToCol(prop);\n };\n\n /**\n * Translate physical row index into visual.\n *\n * This method is useful when you want to retrieve visual row index which can be reordered, moved or trimmed\n * based on a physical index.\n *\n * @memberof Core#\n * @function toVisualRow\n * @param {number} row Physical row index.\n * @returns {number} Returns visual row index.\n */\n this.toVisualRow = row => this.rowIndexMapper.getVisualFromPhysicalIndex(row);\n\n /**\n * Translate physical column index into visual.\n *\n * This method is useful when you want to retrieve visual column index which can be reordered, moved or trimmed\n * based on a physical index.\n *\n * @memberof Core#\n * @function toVisualColumn\n * @param {number} column Physical column index.\n * @returns {number} Returns visual column index.\n */\n this.toVisualColumn = column => this.columnIndexMapper.getVisualFromPhysicalIndex(column);\n\n /**\n * Translate visual row index into physical.\n *\n * This method is useful when you want to retrieve physical row index based on a visual index which can be\n * reordered, moved or trimmed.\n *\n * @memberof Core#\n * @function toPhysicalRow\n * @param {number} row Visual row index.\n * @returns {number} Returns physical row index.\n */\n this.toPhysicalRow = row => this.rowIndexMapper.getPhysicalFromVisualIndex(row);\n\n /**\n * Translate visual column index into physical.\n *\n * This method is useful when you want to retrieve physical column index based on a visual index which can be\n * reordered, moved or trimmed.\n *\n * @memberof Core#\n * @function toPhysicalColumn\n * @param {number} column Visual column index.\n * @returns {number} Returns physical column index.\n */\n this.toPhysicalColumn = column => this.columnIndexMapper.getPhysicalFromVisualIndex(column);\n\n /**\n * @description\n * Returns the cell value at `row`, `column`.\n *\n * __Note__: If data is reordered, sorted or trimmed, the currently visible order will be used.\n *\n * @memberof Core#\n * @function getDataAtCell\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @returns {*} Data at cell.\n */\n this.getDataAtCell = function (row, column) {\n return datamap.get(row, datamap.colToProp(column));\n };\n\n /**\n * Returns value at visual `row` and `prop` indexes.\n *\n * __Note__: If data is reordered, sorted or trimmed, the currently visible order will be used.\n *\n * @memberof Core#\n * @function getDataAtRowProp\n * @param {number} row Visual row index.\n * @param {string} prop Property name.\n * @returns {*} Cell value.\n */\n this.getDataAtRowProp = function (row, prop) {\n return datamap.get(row, prop);\n };\n\n /**\n * @description\n * Returns array of column values from the data source.\n *\n * __Note__: If columns were reordered or sorted, the currently visible order will be used.\n *\n * @memberof Core#\n * @function getDataAtCol\n * @param {number} column Visual column index.\n * @returns {Array} Array of cell values.\n */\n this.getDataAtCol = function (column) {\n const columnData = [];\n const dataByRows = datamap.getRange(instance._createCellCoords(0, column), instance._createCellCoords(tableMeta.data.length - 1, column), datamap.DESTINATION_RENDERER);\n for (let i = 0; i < dataByRows.length; i += 1) {\n for (let j = 0; j < dataByRows[i].length; j += 1) {\n columnData.push(dataByRows[i][j]);\n }\n }\n return columnData;\n };\n\n /**\n * Given the object property name (e.g. `'first.name'` or `'0'`), returns an array of column's values from the table data.\n * You can also provide a column index as the first argument.\n *\n * @memberof Core#\n * @function getDataAtProp\n * @param {string|number} prop Property name or physical column index.\n * @returns {Array} Array of cell values.\n */\n // TODO: Getting data from `datamap` should work on visual indexes.\n this.getDataAtProp = function (prop) {\n const columnData = [];\n const dataByRows = datamap.getRange(instance._createCellCoords(0, datamap.propToCol(prop)), instance._createCellCoords(tableMeta.data.length - 1, datamap.propToCol(prop)), datamap.DESTINATION_RENDERER);\n for (let i = 0; i < dataByRows.length; i += 1) {\n for (let j = 0; j < dataByRows[i].length; j += 1) {\n columnData.push(dataByRows[i][j]);\n }\n }\n return columnData;\n };\n\n /**\n * Returns a clone of the source data object.\n * Optionally you can provide a cell range by using the `row`, `column`, `row2`, `column2` arguments, to get only a\n * fragment of the table data.\n *\n * __Note__: This method does not participate in data transformation. If the visual data of the table is reordered,\n * sorted or trimmed only physical indexes are correct.\n *\n * __Note__: This method may return incorrect values for cells that contain\n * [formulas](@/guides/formulas/formula-calculation/formula-calculation.md). This is because `getSourceData()`\n * operates on source data ([physical indexes](@/api/indexMapper.md)),\n * whereas formulas operate on visual data (visual indexes).\n *\n * @memberof Core#\n * @function getSourceData\n * @param {number} [row] From physical row index.\n * @param {number} [column] From physical column index (or visual index, if data type is an array of objects).\n * @param {number} [row2] To physical row index.\n * @param {number} [column2] To physical column index (or visual index, if data type is an array of objects).\n * @returns {Array[]|object[]} The table data.\n */\n this.getSourceData = function (row, column, row2, column2) {\n let data;\n if (row === undefined) {\n data = dataSource.getData();\n } else {\n data = dataSource.getByRange(instance._createCellCoords(row, column), instance._createCellCoords(row2, column2));\n }\n return data;\n };\n\n /**\n * Returns the source data object as an arrays of arrays format even when source data was provided in another format.\n * Optionally you can provide a cell range by using the `row`, `column`, `row2`, `column2` arguments, to get only a\n * fragment of the table data.\n *\n * __Note__: This method does not participate in data transformation. If the visual data of the table is reordered,\n * sorted or trimmed only physical indexes are correct.\n *\n * @memberof Core#\n * @function getSourceDataArray\n * @param {number} [row] From physical row index.\n * @param {number} [column] From physical column index (or visual index, if data type is an array of objects).\n * @param {number} [row2] To physical row index.\n * @param {number} [column2] To physical column index (or visual index, if data type is an array of objects).\n * @returns {Array} An array of arrays.\n */\n this.getSourceDataArray = function (row, column, row2, column2) {\n let data;\n if (row === undefined) {\n data = dataSource.getData(true);\n } else {\n data = dataSource.getByRange(instance._createCellCoords(row, column), instance._createCellCoords(row2, column2), true);\n }\n return data;\n };\n\n /**\n * Returns an array of column values from the data source.\n *\n * @memberof Core#\n * @function getSourceDataAtCol\n * @param {number} column Visual column index.\n * @returns {Array} Array of the column's cell values.\n */\n // TODO: Getting data from `sourceData` should work always on physical indexes.\n this.getSourceDataAtCol = function (column) {\n return dataSource.getAtColumn(column);\n };\n\n /* eslint-disable jsdoc/require-param */\n /**\n * Set the provided value in the source data set at the provided coordinates.\n *\n * @memberof Core#\n * @function setSourceDataAtCell\n * @param {number|Array} row Physical row index or array of changes in format `[[row, prop, value], ...]`.\n * @param {number|string} column Physical column index / prop name.\n * @param {*} value The value to be set at the provided coordinates.\n * @param {string} [source] Source of the change as a string.\n */\n /* eslint-enable jsdoc/require-param */\n this.setSourceDataAtCell = function (row, column, value, source) {\n const input = setDataInputToArray(row, column, value);\n const isThereAnySetSourceListener = this.hasHook('afterSetSourceDataAtCell');\n const changesForHook = [];\n if (isThereAnySetSourceListener) {\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayEach)(input, _ref9 => {\n let [changeRow, changeProp, changeValue] = _ref9;\n changesForHook.push([changeRow, changeProp, dataSource.getAtCell(changeRow, changeProp),\n // The previous value.\n changeValue]);\n });\n }\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayEach)(input, _ref10 => {\n let [changeRow, changeProp, changeValue] = _ref10;\n dataSource.setAtCell(changeRow, changeProp, changeValue);\n });\n if (isThereAnySetSourceListener) {\n this.runHooks('afterSetSourceDataAtCell', changesForHook, source);\n }\n this.render();\n const activeEditor = instance.getActiveEditor();\n if (activeEditor && (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isDefined)(activeEditor.refreshValue)) {\n activeEditor.refreshValue();\n }\n };\n\n /**\n * Returns a single row of the data (array or object, depending on what data format you use).\n *\n * __Note__: This method does not participate in data transformation. If the visual data of the table is reordered,\n * sorted or trimmed only physical indexes are correct.\n *\n * @memberof Core#\n * @function getSourceDataAtRow\n * @param {number} row Physical row index.\n * @returns {Array|object} Single row of data.\n */\n this.getSourceDataAtRow = function (row) {\n return dataSource.getAtRow(row);\n };\n\n /**\n * Returns a single value from the data source.\n *\n * @memberof Core#\n * @function getSourceDataAtCell\n * @param {number} row Physical row index.\n * @param {number} column Visual column index.\n * @returns {*} Cell data.\n */\n // TODO: Getting data from `sourceData` should work always on physical indexes.\n this.getSourceDataAtCell = function (row, column) {\n return dataSource.getAtCell(row, column);\n };\n\n /**\n * @description\n * Returns a single row of the data.\n *\n * __Note__: If rows were reordered, sorted or trimmed, the currently visible order will be used.\n *\n * @memberof Core#\n * @function getDataAtRow\n * @param {number} row Visual row index.\n * @returns {Array} Array of row's cell data.\n */\n this.getDataAtRow = function (row) {\n const data = datamap.getRange(instance._createCellCoords(row, 0), instance._createCellCoords(row, this.countCols() - 1), datamap.DESTINATION_RENDERER);\n return data[0] || [];\n };\n\n /**\n * @description\n * Returns a data type defined in the Handsontable settings under the `type` key ({@link Options#type}).\n * If there are cells with different types in the selected range, it returns `'mixed'`.\n *\n * __Note__: If data is reordered, sorted or trimmed, the currently visible order will be used.\n *\n * @memberof Core#\n * @function getDataType\n * @param {number} rowFrom From visual row index.\n * @param {number} columnFrom From visual column index.\n * @param {number} rowTo To visual row index.\n * @param {number} columnTo To visual column index.\n * @returns {string} Cell type (e.q: `'mixed'`, `'text'`, `'numeric'`, `'autocomplete'`).\n */\n this.getDataType = function (rowFrom, columnFrom, rowTo, columnTo) {\n const coords = rowFrom === undefined ? [0, 0, this.countRows(), this.countCols()] : [rowFrom, columnFrom, rowTo, columnTo];\n const [rowStart, columnStart] = coords;\n let [,, rowEnd, columnEnd] = coords;\n let previousType = null;\n let currentType = null;\n if (rowEnd === undefined) {\n rowEnd = rowStart;\n }\n if (columnEnd === undefined) {\n columnEnd = columnStart;\n }\n let type = 'mixed';\n (0,_helpers_number_mjs__WEBPACK_IMPORTED_MODULE_40__.rangeEach)(Math.max(Math.min(rowStart, rowEnd), 0), Math.max(rowStart, rowEnd), row => {\n let isTypeEqual = true;\n (0,_helpers_number_mjs__WEBPACK_IMPORTED_MODULE_40__.rangeEach)(Math.max(Math.min(columnStart, columnEnd), 0), Math.max(columnStart, columnEnd), column => {\n const cellType = this.getCellMeta(row, column);\n currentType = cellType.type;\n if (previousType) {\n isTypeEqual = previousType === currentType;\n } else {\n previousType = currentType;\n }\n return isTypeEqual;\n });\n type = isTypeEqual ? currentType : 'mixed';\n return isTypeEqual;\n });\n return type;\n };\n\n /**\n * Remove a property defined by the `key` argument from the cell meta object for the provided `row` and `column` coordinates.\n *\n * @memberof Core#\n * @function removeCellMeta\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {string} key Property name.\n * @fires Hooks#beforeRemoveCellMeta\n * @fires Hooks#afterRemoveCellMeta\n */\n this.removeCellMeta = function (row, column, key) {\n const [physicalRow, physicalColumn] = [this.toPhysicalRow(row), this.toPhysicalColumn(column)];\n let cachedValue = metaManager.getCellMetaKeyValue(physicalRow, physicalColumn, key);\n const hookResult = instance.runHooks('beforeRemoveCellMeta', row, column, key, cachedValue);\n if (hookResult !== false) {\n metaManager.removeCellMeta(physicalRow, physicalColumn, key);\n instance.runHooks('afterRemoveCellMeta', row, column, key, cachedValue);\n }\n cachedValue = null;\n };\n\n /**\n * Removes or adds one or more rows of the cell meta objects to the cell meta collections.\n *\n * @since 0.30.0\n * @memberof Core#\n * @function spliceCellsMeta\n * @param {number} visualIndex A visual index that specifies at what position to add/remove items.\n * @param {number} [deleteAmount=0] The number of items to be removed. If set to 0, no cell meta objects will be removed.\n * @param {...object} [cellMetaRows] The new cell meta row objects to be added to the cell meta collection.\n */\n this.spliceCellsMeta = function (visualIndex) {\n let deleteAmount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n for (var _len18 = arguments.length, cellMetaRows = new Array(_len18 > 2 ? _len18 - 2 : 0), _key18 = 2; _key18 < _len18; _key18++) {\n cellMetaRows[_key18 - 2] = arguments[_key18];\n }\n if (cellMetaRows.length > 0 && !Array.isArray(cellMetaRows[0])) {\n throw new Error('The 3rd argument (cellMetaRows) has to be passed as an array of cell meta objects array.');\n }\n if (deleteAmount > 0) {\n metaManager.removeRow(this.toPhysicalRow(visualIndex), deleteAmount);\n }\n if (cellMetaRows.length > 0) {\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayEach)(cellMetaRows.reverse(), cellMetaRow => {\n metaManager.createRow(this.toPhysicalRow(visualIndex));\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayEach)(cellMetaRow, (cellMeta, columnIndex) => this.setCellMetaObject(visualIndex, columnIndex, cellMeta));\n });\n }\n instance.render();\n };\n\n /**\n * Set cell meta data object defined by `prop` to the corresponding params `row` and `column`.\n *\n * @memberof Core#\n * @function setCellMetaObject\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {object} prop Meta object.\n */\n this.setCellMetaObject = function (row, column, prop) {\n if (typeof prop === 'object') {\n (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.objectEach)(prop, (value, key) => {\n this.setCellMeta(row, column, key, value);\n });\n }\n };\n\n /**\n * Sets a property defined by the `key` property to the meta object of a cell corresponding to params `row` and `column`.\n *\n * @memberof Core#\n * @function setCellMeta\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {string} key Property name.\n * @param {string} value Property value.\n * @fires Hooks#beforeSetCellMeta\n * @fires Hooks#afterSetCellMeta\n */\n this.setCellMeta = function (row, column, key, value) {\n const allowSetCellMeta = instance.runHooks('beforeSetCellMeta', row, column, key, value);\n if (allowSetCellMeta === false) {\n return;\n }\n let physicalRow = row;\n let physicalColumn = column;\n if (row < this.countRows()) {\n physicalRow = this.toPhysicalRow(row);\n }\n if (column < this.countCols()) {\n physicalColumn = this.toPhysicalColumn(column);\n }\n metaManager.setCellMeta(physicalRow, physicalColumn, key, value);\n instance.runHooks('afterSetCellMeta', row, column, key, value);\n };\n\n /**\n * Get all the cells meta settings at least once generated in the table (in order of cell initialization).\n *\n * @memberof Core#\n * @function getCellsMeta\n * @returns {Array} Returns an array of ColumnSettings object instances.\n */\n this.getCellsMeta = function () {\n return metaManager.getCellsMeta();\n };\n\n /**\n * Returns the cell properties object for the given `row` and `column` coordinates.\n *\n * @memberof Core#\n * @function getCellMeta\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {object} options Execution options for the `getCellMeta` method.\n * @param {boolean} [options.skipMetaExtension=false] If `true`, skips extending the cell meta object. This means, the `cells` function, as well as the `afterGetCellMeta` and `beforeGetCellMeta` hooks, will not be called.\n * @returns {object} The cell properties object.\n * @fires Hooks#beforeGetCellMeta\n * @fires Hooks#afterGetCellMeta\n */\n this.getCellMeta = function (row, column) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n skipMetaExtension: false\n };\n let physicalRow = this.toPhysicalRow(row);\n let physicalColumn = this.toPhysicalColumn(column);\n if (physicalRow === null) {\n physicalRow = row;\n }\n if (physicalColumn === null) {\n physicalColumn = column;\n }\n return metaManager.getCellMeta(physicalRow, physicalColumn, {\n visualRow: row,\n visualColumn: column,\n ...options\n });\n };\n\n /**\n * Returns the meta information for the provided column.\n *\n * @since 14.5.0\n * @memberof Core#\n * @function getColumnMeta\n * @param {number} column Visual column index.\n * @returns {object}\n */\n this.getColumnMeta = function (column) {\n return metaManager.getColumnMeta(this.toPhysicalColumn(column));\n };\n\n /**\n * Returns an array of cell meta objects for specified physical row index.\n *\n * @memberof Core#\n * @function getCellMetaAtRow\n * @param {number} row Physical row index.\n * @returns {Array}\n */\n this.getCellMetaAtRow = function (row) {\n return metaManager.getCellsMetaAtRow(row);\n };\n\n /**\n * Checks if your [data format](@/guides/getting-started/binding-to-data/binding-to-data.md#compatible-data-types)\n * and [configuration options](@/guides/getting-started/configuration-options/configuration-options.md)\n * allow for changing the number of columns.\n *\n * Returns `false` when your data is an array of objects,\n * or when you use the [`columns`](@/api/options.md#columns) option.\n * Otherwise, returns `true`.\n *\n * @memberof Core#\n * @function isColumnModificationAllowed\n * @returns {boolean}\n */\n this.isColumnModificationAllowed = function () {\n return !(instance.dataType === 'object' || tableMeta.columns);\n };\n\n /**\n * Returns the cell renderer function by given `row` and `column` arguments.\n *\n * @memberof Core#\n * @function getCellRenderer\n * @param {number|object} rowOrMeta Visual row index or cell meta object (see {@link Core#getCellMeta}).\n * @param {number} column Visual column index.\n * @returns {Function} Returns the renderer function.\n * @example\n * ```js\n * // Get cell renderer using `row` and `column` coordinates.\n * hot.getCellRenderer(1, 1);\n * // Get cell renderer using cell meta object.\n * hot.getCellRenderer(hot.getCellMeta(1, 1));\n * ```\n */\n this.getCellRenderer = function (rowOrMeta, column) {\n const cellRenderer = typeof rowOrMeta === 'number' ? instance.getCellMeta(rowOrMeta, column).renderer : rowOrMeta.renderer;\n if (typeof cellRenderer === 'string') {\n return (0,_renderers_registry_mjs__WEBPACK_IMPORTED_MODULE_42__.getRenderer)(cellRenderer);\n }\n return (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isUndefined)(cellRenderer) ? (0,_renderers_registry_mjs__WEBPACK_IMPORTED_MODULE_42__.getRenderer)('text') : cellRenderer;\n };\n\n /**\n * Returns the cell editor class by the provided `row` and `column` arguments.\n *\n * @memberof Core#\n * @function getCellEditor\n * @param {number} rowOrMeta Visual row index or cell meta object (see {@link Core#getCellMeta}).\n * @param {number} column Visual column index.\n * @returns {Function|boolean} Returns the editor class or `false` is cell editor is disabled.\n * @example\n * ```js\n * // Get cell editor class using `row` and `column` coordinates.\n * hot.getCellEditor(1, 1);\n * // Get cell editor class using cell meta object.\n * hot.getCellEditor(hot.getCellMeta(1, 1));\n * ```\n */\n this.getCellEditor = function (rowOrMeta, column) {\n const cellEditor = typeof rowOrMeta === 'number' ? instance.getCellMeta(rowOrMeta, column).editor : rowOrMeta.editor;\n if (typeof cellEditor === 'string') {\n return (0,_editors_registry_mjs__WEBPACK_IMPORTED_MODULE_43__.getEditor)(cellEditor);\n }\n return (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isUndefined)(cellEditor) ? (0,_editors_registry_mjs__WEBPACK_IMPORTED_MODULE_43__.getEditor)('text') : cellEditor;\n };\n\n /**\n * Returns the cell validator by `row` and `column`.\n *\n * @memberof Core#\n * @function getCellValidator\n * @param {number|object} rowOrMeta Visual row index or cell meta object (see {@link Core#getCellMeta}).\n * @param {number} column Visual column index.\n * @returns {Function|RegExp|undefined} The validator function.\n * @example\n * ```js\n * // Get cell validator using `row` and `column` coordinates.\n * hot.getCellValidator(1, 1);\n * // Get cell validator using cell meta object.\n * hot.getCellValidator(hot.getCellMeta(1, 1));\n * ```\n */\n this.getCellValidator = function (rowOrMeta, column) {\n const cellValidator = typeof rowOrMeta === 'number' ? instance.getCellMeta(rowOrMeta, column).validator : rowOrMeta.validator;\n if (typeof cellValidator === 'string') {\n return (0,_validators_registry_mjs__WEBPACK_IMPORTED_MODULE_44__.getValidator)(cellValidator);\n }\n return cellValidator;\n };\n\n /**\n * Validates every cell in the data set,\n * using a [validator function](@/guides/cell-functions/cell-validator/cell-validator.md) configured for each cell.\n *\n * Doesn't validate cells that are currently [trimmed](@/guides/rows/row-trimming/row-trimming.md),\n * [hidden](@/guides/rows/row-hiding/row-hiding.md), or [filtered](@/guides/columns/column-filter/column-filter.md),\n * as such cells are not included in the data set until you bring them back again.\n *\n * After the validation, the `callback` function is fired, with the `valid` argument set to:\n * - `true` for valid cells\n * - `false` for invalid cells\n *\n * @memberof Core#\n * @function validateCells\n * @param {Function} [callback] The callback function.\n * @example\n * ```js\n * hot.validateCells((valid) => {\n * if (valid) {\n * // ... code for validated cells\n * }\n * })\n * ```\n */\n this.validateCells = function (callback) {\n this._validateCells(callback);\n };\n\n /**\n * Validates rows using their validator functions and calls callback when finished.\n *\n * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it\n * would equal `true`.\n *\n * @memberof Core#\n * @function validateRows\n * @param {Array} [rows] Array of validation target visual row indexes.\n * @param {Function} [callback] The callback function.\n * @example\n * ```js\n * hot.validateRows([3, 4, 5], (valid) => {\n * if (valid) {\n * // ... code for validated rows\n * }\n * })\n * ```\n */\n this.validateRows = function (rows, callback) {\n if (!Array.isArray(rows)) {\n throw new Error('validateRows parameter `rows` must be an array');\n }\n this._validateCells(callback, rows);\n };\n\n /**\n * Validates columns using their validator functions and calls callback when finished.\n *\n * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it\n * would equal `true`.\n *\n * @memberof Core#\n * @function validateColumns\n * @param {Array} [columns] Array of validation target visual columns indexes.\n * @param {Function} [callback] The callback function.\n * @example\n * ```js\n * hot.validateColumns([3, 4, 5], (valid) => {\n * if (valid) {\n * // ... code for validated columns\n * }\n * })\n * ```\n */\n this.validateColumns = function (columns, callback) {\n if (!Array.isArray(columns)) {\n throw new Error('validateColumns parameter `columns` must be an array');\n }\n this._validateCells(callback, undefined, columns);\n };\n\n /**\n * Validates all cells using their validator functions and calls callback when finished.\n *\n * If one of the cells is invalid, the callback will be fired with `'valid'` arguments as `false` - otherwise it would equal `true`.\n *\n * Private use intended.\n *\n * @private\n * @memberof Core#\n * @function _validateCells\n * @param {Function} [callback] The callback function.\n * @param {Array} [rows] An array of validation target visual row indexes.\n * @param {Array} [columns] An array of validation target visual column indexes.\n */\n this._validateCells = function (callback, rows, columns) {\n const waitingForValidator = new ValidatorsQueue();\n if (callback) {\n waitingForValidator.onQueueEmpty = callback;\n }\n let i = instance.countRows() - 1;\n while (i >= 0) {\n if (rows !== undefined && rows.indexOf(i) === -1) {\n i -= 1;\n continue;\n }\n let j = instance.countCols() - 1;\n while (j >= 0) {\n if (columns !== undefined && columns.indexOf(j) === -1) {\n j -= 1;\n continue;\n }\n waitingForValidator.addValidatorToQueue();\n instance.validateCell(instance.getDataAtCell(i, j), instance.getCellMeta(i, j), result => {\n if (typeof result !== 'boolean') {\n throw new Error('Validation error: result is not boolean');\n }\n if (result === false) {\n waitingForValidator.valid = false;\n }\n waitingForValidator.removeValidatorFormQueue();\n }, 'validateCells');\n j -= 1;\n }\n i -= 1;\n }\n waitingForValidator.checkIfQueueIsEmpty();\n };\n\n /**\n * Returns an array of row headers' values (if they are enabled). If param `row` was given, it returns the header of the given row as a string.\n *\n * @memberof Core#\n * @function getRowHeader\n * @param {number} [row] Visual row index.\n * @fires Hooks#modifyRowHeader\n * @returns {Array|string|number} Array of header values / single header value.\n */\n this.getRowHeader = function (row) {\n let rowHeader = tableMeta.rowHeaders;\n let physicalRow = row;\n if (physicalRow !== undefined) {\n physicalRow = instance.runHooks('modifyRowHeader', physicalRow);\n }\n if (physicalRow === undefined) {\n rowHeader = [];\n (0,_helpers_number_mjs__WEBPACK_IMPORTED_MODULE_40__.rangeEach)(instance.countRows() - 1, i => {\n rowHeader.push(instance.getRowHeader(i));\n });\n } else if (Array.isArray(rowHeader) && rowHeader[physicalRow] !== undefined) {\n rowHeader = rowHeader[physicalRow];\n } else if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(rowHeader)) {\n rowHeader = rowHeader(physicalRow);\n } else if (rowHeader && typeof rowHeader !== 'string' && typeof rowHeader !== 'number') {\n rowHeader = physicalRow + 1;\n }\n return rowHeader;\n };\n\n /**\n * Returns information about if this table is configured to display row headers.\n *\n * @memberof Core#\n * @function hasRowHeaders\n * @returns {boolean} `true` if the instance has the row headers enabled, `false` otherwise.\n */\n this.hasRowHeaders = function () {\n return !!tableMeta.rowHeaders;\n };\n\n /**\n * Returns information about if this table is configured to display column headers.\n *\n * @memberof Core#\n * @function hasColHeaders\n * @returns {boolean} `true` if the instance has the column headers enabled, `false` otherwise.\n */\n this.hasColHeaders = function () {\n if (tableMeta.colHeaders !== undefined && tableMeta.colHeaders !== null) {\n // Polymer has empty value = null\n return !!tableMeta.colHeaders;\n }\n for (let i = 0, ilen = instance.countCols(); i < ilen; i++) {\n if (instance.getColHeader(i)) {\n return true;\n }\n }\n return false;\n };\n\n /**\n * Gets the values of column headers (if column headers are [enabled](@/api/options.md#colheaders)).\n *\n * To get an array with the values of all\n * [bottom-most](@/guides/cell-features/clipboard/clipboard.md#copy-with-headers) column headers,\n * call `getColHeader()` with no arguments.\n *\n * To get the value of the bottom-most header of a specific column, use the `column` parameter.\n *\n * To get the value of a [specific-level](@/guides/columns/column-groups/column-groups.md) header\n * of a specific column, use the `column` and `headerLevel` parameters.\n *\n * Read more:\n * - [Guides: Column groups](@/guides/columns/column-groups/column-groups.md)\n * - [Options: `colHeaders`](@/api/options.md#colheaders)\n * - [Guides: Copy with headers](@/guides/cell-features/clipboard/clipboard.md#copy-with-headers)\n *\n * ```js\n * // get the contents of all bottom-most column headers\n * hot.getColHeader();\n *\n * // get the contents of the bottom-most header of a specific column\n * hot.getColHeader(5);\n *\n * // get the contents of a specific column header at a specific level\n * hot.getColHeader(5, -2);\n * ```\n *\n * @memberof Core#\n * @function getColHeader\n * @param {number} [column] A visual column index.\n * @param {number} [headerLevel=-1] (Since 12.3.0) Header level index. Accepts positive (0 to n)\n * and negative (-1 to -n) values. For positive values, 0 points to the\n * topmost header. For negative values, -1 points to the bottom-most\n * header (the header closest to the cells).\n * @fires Hooks#modifyColHeader\n * @fires Hooks#modifyColumnHeaderValue\n * @returns {Array|string|number} Column header values.\n */\n this.getColHeader = function (column) {\n let headerLevel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;\n const columnIndex = instance.runHooks('modifyColHeader', column);\n if (columnIndex === undefined) {\n const out = [];\n const ilen = instance.countCols();\n for (let i = 0; i < ilen; i++) {\n out.push(instance.getColHeader(i));\n }\n return out;\n }\n let result = tableMeta.colHeaders;\n const translateVisualIndexToColumns = function (visualColumnIndex) {\n const arr = [];\n const columnsLen = instance.countCols();\n let index = 0;\n for (; index < columnsLen; index++) {\n if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(tableMeta.columns) && tableMeta.columns(index)) {\n arr.push(index);\n }\n }\n return arr[visualColumnIndex];\n };\n const physicalColumn = instance.toPhysicalColumn(columnIndex);\n const prop = translateVisualIndexToColumns(physicalColumn);\n if (tableMeta.colHeaders === false) {\n result = null;\n } else if (tableMeta.columns && (0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(tableMeta.columns) && tableMeta.columns(prop) && tableMeta.columns(prop).title) {\n result = tableMeta.columns(prop).title;\n } else if (tableMeta.columns && tableMeta.columns[physicalColumn] && tableMeta.columns[physicalColumn].title) {\n result = tableMeta.columns[physicalColumn].title;\n } else if (Array.isArray(tableMeta.colHeaders) && tableMeta.colHeaders[physicalColumn] !== undefined) {\n result = tableMeta.colHeaders[physicalColumn];\n } else if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(tableMeta.colHeaders)) {\n result = tableMeta.colHeaders(physicalColumn);\n } else if (tableMeta.colHeaders && typeof tableMeta.colHeaders !== 'string' && typeof tableMeta.colHeaders !== 'number') {\n result = (0,_helpers_data_mjs__WEBPACK_IMPORTED_MODULE_45__.spreadsheetColumnLabel)(columnIndex); // see #1458\n }\n result = instance.runHooks('modifyColumnHeaderValue', result, column, headerLevel);\n return result;\n };\n\n /**\n * Return column width from settings (no guessing). Private use intended.\n *\n * @private\n * @memberof Core#\n * @function _getColWidthFromSettings\n * @param {number} col Visual col index.\n * @returns {number}\n */\n this._getColWidthFromSettings = function (col) {\n let width;\n\n // We currently don't support cell meta objects for headers (negative values)\n if (col >= 0) {\n const cellProperties = instance.getCellMeta(0, col);\n width = cellProperties.width;\n }\n if (width === undefined || width === tableMeta.width) {\n width = tableMeta.colWidths;\n }\n if (width !== undefined && width !== null) {\n switch (typeof width) {\n case 'object':\n // array\n width = width[col];\n break;\n case 'function':\n width = width(col);\n break;\n default:\n break;\n }\n if (typeof width === 'string') {\n width = parseInt(width, 10);\n }\n }\n return width;\n };\n\n /**\n * Returns the width of the requested column.\n *\n * @memberof Core#\n * @function getColWidth\n * @param {number} column Visual column index.\n * @param {string} [source] The source of the call.\n * @returns {number} Column width.\n * @fires Hooks#modifyColWidth\n */\n this.getColWidth = function (column, source) {\n let width = instance._getColWidthFromSettings(column);\n width = instance.runHooks('modifyColWidth', width, column, source);\n if (width === undefined) {\n width = _3rdparty_walkontable_src_index_mjs__WEBPACK_IMPORTED_MODULE_46__.DEFAULT_WIDTH;\n }\n return width;\n };\n\n /**\n * Return row height from settings (no guessing). Private use intended.\n *\n * @private\n * @memberof Core#\n * @function _getRowHeightFromSettings\n * @param {number} row Visual row index.\n * @returns {number}\n */\n this._getRowHeightFromSettings = function (row) {\n const defaultRowHeight = this.view.getDefaultRowHeight();\n let height = tableMeta.rowHeights;\n if (height !== undefined && height !== null) {\n switch (typeof height) {\n case 'object':\n // array\n height = height[row];\n break;\n case 'function':\n height = height(row);\n break;\n default:\n break;\n }\n if (typeof height === 'string') {\n height = parseInt(height, 10);\n }\n }\n return height !== undefined && height !== null && height < defaultRowHeight ? defaultRowHeight : height;\n };\n\n /**\n * Returns a row's height, as recognized by Handsontable.\n *\n * Depending on your configuration, the method returns (in order of priority):\n * 1. The row height set by the [`ManualRowResize`](@/api/manualRowResize.md) plugin\n * (if the plugin is enabled).\n * 2. The row height set by the [`rowHeights`](@/api/options.md#rowheights) configuration option\n * (if the option is set).\n * 3. The row height as measured in the DOM by the [`AutoRowSize`](@/api/autoRowSize.md) plugin\n * (if the plugin is enabled).\n * 4. `undefined`, if neither [`ManualRowResize`](@/api/manualRowResize.md),\n * nor [`rowHeights`](@/api/options.md#rowheights),\n * nor [`AutoRowSize`](@/api/autoRowSize.md) is used.\n *\n * The height returned includes 1 px of the row's bottom border.\n *\n * Mind that this method is different from the\n * [`getRowHeight()`](@/api/autoRowSize.md#getrowheight) method\n * of the [`AutoRowSize`](@/api/autoRowSize.md) plugin.\n *\n * @memberof Core#\n * @function getRowHeight\n * @param {number} row A visual row index.\n * @param {string} [source] The source of the call.\n * @returns {number|undefined} The height of the specified row, in pixels.\n * @fires Hooks#modifyRowHeight\n */\n this.getRowHeight = function (row, source) {\n let height = instance._getRowHeightFromSettings(row);\n height = instance.runHooks('modifyRowHeight', height, row, source);\n return height;\n };\n\n /**\n * Returns the total number of rows in the data source.\n *\n * @memberof Core#\n * @function countSourceRows\n * @returns {number} Total number of rows.\n */\n this.countSourceRows = function () {\n return dataSource.countRows();\n };\n\n /**\n * Returns the total number of columns in the data source.\n *\n * @memberof Core#\n * @function countSourceCols\n * @returns {number} Total number of columns.\n */\n this.countSourceCols = function () {\n return dataSource.countFirstRowKeys();\n };\n\n /**\n * Returns the total number of visual rows in the table.\n *\n * @memberof Core#\n * @function countRows\n * @returns {number} Total number of rows.\n */\n this.countRows = function () {\n return datamap.getLength();\n };\n\n /**\n * Returns the total number of visible columns in the table.\n *\n * @memberof Core#\n * @function countCols\n * @returns {number} Total number of columns.\n */\n this.countCols = function () {\n const maxCols = tableMeta.maxCols;\n const dataLen = this.columnIndexMapper.getNotTrimmedIndexesLength();\n return Math.min(maxCols, dataLen);\n };\n\n /**\n * Returns the number of rendered rows including rows that are partially or fully rendered\n * outside the table viewport.\n *\n * @memberof Core#\n * @function countRenderedRows\n * @returns {number} Returns -1 if table is not visible.\n */\n this.countRenderedRows = function () {\n return instance.view._wt.drawn ? instance.view._wt.wtTable.getRenderedRowsCount() : -1;\n };\n\n /**\n * Returns the number of rendered rows that are only visible in the table viewport.\n * The rows that are partially visible are not counted.\n *\n * @memberof Core#\n * @function countVisibleRows\n * @returns {number} Number of visible rows or -1.\n */\n this.countVisibleRows = function () {\n return instance.view._wt.drawn ? instance.view._wt.wtTable.getVisibleRowsCount() : -1;\n };\n\n /**\n * Returns the number of rendered rows including columns that are partially or fully rendered\n * outside the table viewport.\n *\n * @memberof Core#\n * @function countRenderedCols\n * @returns {number} Returns -1 if table is not visible.\n */\n this.countRenderedCols = function () {\n return instance.view._wt.drawn ? instance.view._wt.wtTable.getRenderedColumnsCount() : -1;\n };\n\n /**\n * Returns the number of rendered columns that are only visible in the table viewport.\n * The columns that are partially visible are not counted.\n *\n * @memberof Core#\n * @function countVisibleCols\n * @returns {number} Number of visible columns or -1.\n */\n this.countVisibleCols = function () {\n return instance.view._wt.drawn ? instance.view._wt.wtTable.getVisibleColumnsCount() : -1;\n };\n\n /**\n * Returns the number of rendered row headers.\n *\n * @since 14.0.0\n * @memberof Core#\n * @function countRowHeaders\n * @returns {number} Number of row headers.\n */\n this.countRowHeaders = function () {\n return this.view.getRowHeadersCount();\n };\n\n /**\n * Returns the number of rendered column headers.\n *\n * @since 14.0.0\n * @memberof Core#\n * @function countColHeaders\n * @returns {number} Number of column headers.\n */\n this.countColHeaders = function () {\n return this.view.getColumnHeadersCount();\n };\n\n /**\n * Returns the number of empty rows. If the optional ending parameter is `true`, returns the\n * number of empty rows at the bottom of the table.\n *\n * @memberof Core#\n * @function countEmptyRows\n * @param {boolean} [ending=false] If `true`, will only count empty rows at the end of the data source.\n * @returns {number} Count empty rows.\n */\n this.countEmptyRows = function () {\n let ending = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n let emptyRows = 0;\n (0,_helpers_number_mjs__WEBPACK_IMPORTED_MODULE_40__.rangeEachReverse)(instance.countRows() - 1, visualIndex => {\n if (instance.isEmptyRow(visualIndex)) {\n emptyRows += 1;\n } else if (ending === true) {\n return false;\n }\n });\n return emptyRows;\n };\n\n /**\n * Returns the number of empty columns. If the optional ending parameter is `true`, returns the number of empty\n * columns at right hand edge of the table.\n *\n * @memberof Core#\n * @function countEmptyCols\n * @param {boolean} [ending=false] If `true`, will only count empty columns at the end of the data source row.\n * @returns {number} Count empty cols.\n */\n this.countEmptyCols = function () {\n let ending = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n let emptyColumns = 0;\n (0,_helpers_number_mjs__WEBPACK_IMPORTED_MODULE_40__.rangeEachReverse)(instance.countCols() - 1, visualIndex => {\n if (instance.isEmptyCol(visualIndex)) {\n emptyColumns += 1;\n } else if (ending === true) {\n return false;\n }\n });\n return emptyColumns;\n };\n\n /**\n * Check if all cells in the row declared by the `row` argument are empty.\n *\n * @memberof Core#\n * @function isEmptyRow\n * @param {number} row Visual row index.\n * @returns {boolean} `true` if the row at the given `row` is empty, `false` otherwise.\n */\n this.isEmptyRow = function (row) {\n return tableMeta.isEmptyRow.call(instance, row);\n };\n\n /**\n * Check if all cells in the the column declared by the `column` argument are empty.\n *\n * @memberof Core#\n * @function isEmptyCol\n * @param {number} column Column index.\n * @returns {boolean} `true` if the column at the given `col` is empty, `false` otherwise.\n */\n this.isEmptyCol = function (column) {\n return tableMeta.isEmptyCol.call(instance, column);\n };\n\n /**\n * Select a single cell, or a single range of adjacent cells.\n *\n * To select a cell, pass its visual row and column indexes, for example: `selectCell(2, 4)`.\n *\n * To select a range, pass the visual indexes of the first and last cell in the range, for example: `selectCell(2, 4, 3, 5)`.\n *\n * If your columns have properties, you can pass those properties' values instead of column indexes, for example: `selectCell(2, 'first_name')`.\n *\n * By default, `selectCell()` also:\n * - Scrolls the viewport to the newly-selected cells.\n * - Switches the keyboard focus to Handsontable (by calling Handsontable's [`listen()`](#listen) method).\n *\n * @example\n * ```js\n * // select a single cell\n * hot.selectCell(2, 4);\n *\n * // select a range of cells\n * hot.selectCell(2, 4, 3, 5);\n *\n * // select a single cell, using a column property\n * hot.selectCell(2, 'first_name');\n *\n * // select a range of cells, using column properties\n * hot.selectCell(2, 'first_name', 3, 'last_name');\n *\n * // select a range of cells, without scrolling to them\n * hot.selectCell(2, 4, 3, 5, false);\n *\n * // select a range of cells, without switching the keyboard focus to Handsontable\n * hot.selectCell(2, 4, 3, 5, null, false);\n * ```\n *\n * @memberof Core#\n * @function selectCell\n * @param {number} row A visual row index.\n * @param {number|string} column A visual column index (`number`), or a column property's value (`string`).\n * @param {number} [endRow] If selecting a range: the visual row index of the last cell in the range.\n * @param {number|string} [endColumn] If selecting a range: the visual column index (or a column property's value) of the last cell in the range.\n * @param {boolean} [scrollToCell=true] `true`: scroll the viewport to the newly-selected cells. `false`: keep the previous viewport.\n * @param {boolean} [changeListener=true] `true`: switch the keyboard focus to Handsontable. `false`: keep the previous keyboard focus.\n * @returns {boolean} `true`: the selection was successful, `false`: the selection failed.\n */\n this.selectCell = function (row, column, endRow, endColumn) {\n let scrollToCell = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n let changeListener = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n if ((0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isUndefined)(row) || (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_23__.isUndefined)(column)) {\n return false;\n }\n return this.selectCells([[row, column, endRow, endColumn]], scrollToCell, changeListener);\n };\n\n /**\n * Select multiple cells or ranges of cells, adjacent or non-adjacent.\n *\n * You can pass one of the below:\n * - An array of arrays (which matches the output of Handsontable's [`getSelected()`](#getselected) method).\n * - An array of [`CellRange`](@/api/cellRange.md) objects (which matches the output of Handsontable's [`getSelectedRange()`](#getselectedrange) method).\n *\n * To select multiple cells, pass the visual row and column indexes of each cell, for example: `hot.selectCells([[1, 1], [5, 5]])`.\n *\n * To select multiple ranges, pass the visual indexes of the first and last cell in each range, for example: `hot.selectCells([[1, 1, 2, 2], [6, 2, 0, 2]])`.\n *\n * If your columns have properties, you can pass those properties' values instead of column indexes, for example: `hot.selectCells([[1, 'first_name'], [5, 'last_name']])`.\n *\n * By default, `selectCell()` also:\n * - Scrolls the viewport to the newly-selected cells.\n * - Switches the keyboard focus to Handsontable (by calling Handsontable's [`listen()`](#listen) method).\n *\n * @example\n * ```js\n * // select non-adjacent cells\n * hot.selectCells([[1, 1], [5, 5], [10, 10]]);\n *\n * // select non-adjacent ranges of cells\n * hot.selectCells([[1, 1, 2, 2], [10, 10, 20, 20]]);\n *\n * // select cells and ranges of cells\n * hot.selectCells([[1, 1, 2, 2], [3, 3], [6, 2, 0, 2]]);\n *\n * // select cells, using column properties\n * hot.selectCells([[1, 'id', 2, 'first_name'], [3, 'full_name'], [6, 'last_name', 0, 'first_name']]);\n *\n * // select multiple ranges, using an array of `CellRange` objects\n * const selected = hot.getSelectedRange();\n *\n * selected[0].from.row = 0;\n * selected[0].from.col = 0;\n * selected[0].to.row = 5;\n * selected[0].to.col = 5;\n *\n * selected[1].from.row = 10;\n * selected[1].from.col = 10;\n * selected[1].to.row = 20;\n * selected[1].to.col = 20;\n *\n * hot.selectCells(selected);\n * ```\n *\n * @memberof Core#\n * @since 0.38.0\n * @function selectCells\n * @param {Array[]|CellRange[]} coords Visual coordinates,\n * passed either as an array of arrays (`[[rowStart, columnStart, rowEnd, columnEnd], ...]`)\n * or as an array of [`CellRange`](@/api/cellRange.md) objects.\n * @param {boolean} [scrollToCell=true] `true`: scroll the viewport to the newly-selected cells. `false`: keep the previous viewport.\n * @param {boolean} [changeListener=true] `true`: switch the keyboard focus to Handsontable. `false`: keep the previous keyboard focus.\n * @returns {boolean} `true`: the selection was successful, `false`: the selection failed.\n */\n this.selectCells = function () {\n let coords = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [[]];\n let scrollToCell = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n let changeListener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n if (scrollToCell === false) {\n viewportScroller.suspend();\n }\n const wasSelected = selection.selectCells(coords);\n if (wasSelected && changeListener) {\n instance.listen();\n }\n viewportScroller.resume();\n return wasSelected;\n };\n\n /**\n * Select column specified by `startColumn` visual index, column property or a range of columns finishing at `endColumn`.\n *\n * @example\n * ```js\n * // Select column using visual index.\n * hot.selectColumns(1);\n * // Select column using column property.\n * hot.selectColumns('id');\n * // Select range of columns using visual indexes.\n * hot.selectColumns(1, 4);\n * // Select range of columns using visual indexes and mark the first header as highlighted.\n * hot.selectColumns(1, 2, -1);\n * // Select range of columns using visual indexes and mark the second cell as highlighted.\n * hot.selectColumns(2, 1, 1);\n * // Select range of columns using visual indexes and move the focus position somewhere in the middle of the range.\n * hot.selectColumns(2, 5, { row: 2, col: 3 });\n * // Select range of columns using column properties.\n * hot.selectColumns('id', 'last_name');\n * ```\n *\n * @memberof Core#\n * @since 0.38.0\n * @function selectColumns\n * @param {number} startColumn The visual column index from which the selection starts.\n * @param {number} [endColumn=startColumn] The visual column index to which the selection finishes. If `endColumn`\n * is not defined the column defined by `startColumn` will be selected.\n * @param {number | { row: number, col: number } | CellCoords} [focusPosition=0] The argument allows changing the cell/header focus\n * position. The value can take visual row index from -N to N, where negative values point to the headers and positive\n * values point to the cell range. An object with `row` and `col` properties also can be passed to change the focus\n * position horizontally.\n * @returns {boolean} `true` if selection was successful, `false` otherwise.\n */\n this.selectColumns = function (startColumn) {\n let endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;\n let focusPosition = arguments.length > 2 ? arguments[2] : undefined;\n return selection.selectColumns(startColumn, endColumn, focusPosition);\n };\n\n /**\n * Select row specified by `startRow` visual index or a range of rows finishing at `endRow`.\n *\n * @example\n * ```js\n * // Select row using visual index.\n * hot.selectRows(1);\n * // select a range of rows, using visual indexes.\n * hot.selectRows(1, 4);\n * // select a range of rows, using visual indexes, and mark the header as highlighted.\n * hot.selectRows(1, 2, -1);\n * // Select range of rows using visual indexes and mark the second cell as highlighted.\n * hot.selectRows(2, 1, 1);\n * // Select range of rows using visual indexes and move the focus position somewhere in the middle of the range.\n * hot.selectRows(2, 5, { row: 2, col: 3 });\n * ```\n *\n * @memberof Core#\n * @since 0.38.0\n * @function selectRows\n * @param {number} startRow The visual row index from which the selection starts.\n * @param {number} [endRow=startRow] The visual row index to which the selection finishes. If `endRow`\n * is not defined the row defined by `startRow` will be selected.\n * @param {number | { row: number, col: number } | CellCoords} [focusPosition=0] The argument allows changing the cell/header focus\n * position. The value can take visual row index from -N to N, where negative values point to the headers and positive\n * values point to the cell range. An object with `row` and `col` properties also can be passed to change the focus\n * position vertically.\n * @returns {boolean} `true` if selection was successful, `false` otherwise.\n */\n this.selectRows = function (startRow) {\n let endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;\n let focusPosition = arguments.length > 2 ? arguments[2] : undefined;\n return selection.selectRows(startRow, endRow, focusPosition);\n };\n\n /**\n * Deselects the current cell selection on the table.\n *\n * @memberof Core#\n * @function deselectCell\n */\n this.deselectCell = function () {\n selection.deselect();\n };\n\n /**\n * Select all cells in the table excluding headers and corner elements.\n *\n * The previous selection is overwritten.\n *\n * ```js\n * // Select all cells in the table along with row headers, including all headers and the corner cell.\n * // Doesn't select column headers and corner elements.\n * hot.selectAll();\n *\n * // Select all cells in the table, including row headers but excluding the corner cell and column headers.\n * hot.selectAll(true, false);\n *\n * // Select all cells in the table, including all headers and the corner cell, but move the focus.\n * // highlight to position 2, 1\n * hot.selectAll(-2, -1, {\n * focusPosition: { row: 2, col: 1 }\n * });\n *\n * // Select all cells in the table, without headers and corner elements.\n * hot.selectAll(false);\n * ```\n *\n * @since 0.38.2\n * @memberof Core#\n * @function selectAll\n * @param {boolean} [includeRowHeaders=false] `true` If the selection should include the row headers,\n * `false` otherwise.\n * @param {boolean} [includeColumnHeaders=false] `true` If the selection should include the column\n * headers, `false` otherwise.\n *\n * @param {object} [options] Additional object with options. Since 14.0.0\n * @param {{row: number, col: number} | boolean} [options.focusPosition] The argument allows changing the cell/header\n * focus position. The value takes an object with a `row` and `col` properties from -N to N, where\n * negative values point to the headers and positive values point to the cell range. If `false`, the focus\n * position won't be changed. Example:\n * ```js\n * hot.selectAll(0, 0, {\n * focusPosition: { row: 0, col: 1 },\n * disableHeadersHighlight: true\n * })\n * ```\n *\n * @param {boolean} [options.disableHeadersHighlight] If `true`, disables highlighting the headers even when\n * the logical coordinates points on them.\n */\n this.selectAll = function () {\n let includeRowHeaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n let includeColumnHeaders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : includeRowHeaders;\n let options = arguments.length > 2 ? arguments[2] : undefined;\n viewportScroller.skipNextScrollCycle();\n selection.selectAll(includeRowHeaders, includeColumnHeaders, options);\n };\n const getIndexToScroll = (indexMapper, visualIndex) => {\n // Looking for a visual index on the right and then (when not found) on the left.\n return indexMapper.getNearestNotHiddenIndex(visualIndex, 1, true);\n };\n\n /**\n * Scroll viewport to coordinates specified by the `row` and/or `col` object properties.\n *\n * ```js\n * // scroll the viewport to the visual row index (leave the horizontal scroll untouched)\n * hot.scrollViewportTo({ row: 50 });\n *\n * // scroll the viewport to the passed coordinates so that the cell at 50, 50 will be snapped to\n * // the bottom-end table's edge.\n * hot.scrollViewportTo({\n * row: 50,\n * col: 50,\n * verticalSnap: 'bottom',\n * horizontalSnap: 'end',\n * }, () => {\n * // callback function executed after the viewport is scrolled\n * });\n * ```\n *\n * @memberof Core#\n * @function scrollViewportTo\n * @param {object} options A dictionary containing the following parameters:\n * @param {number} [options.row] Specifies the number of visual rows along the Y axis to scroll the viewport.\n * @param {number} [options.col] Specifies the number of visual columns along the X axis to scroll the viewport.\n * @param {'top' | 'bottom'} [options.verticalSnap] Determines to which edge of the table the viewport will be scrolled based on the passed coordinates.\n * This option is a string which must take one of the following values:\n * - `top`: The viewport will be scrolled to a row in such a way that it will be positioned on the top of the viewport;\n * - `bottom`: The viewport will be scrolled to a row in such a way that it will be positioned on the bottom of the viewport;\n * - If the property is not defined the vertical auto-snapping is enabled. Depending on where the viewport is scrolled from, a row will\n * be positioned at the top or bottom of the viewport.\n * @param {'start' | 'end'} [options.horizontalSnap] Determines to which edge of the table the viewport will be scrolled based on the passed coordinates.\n * This option is a string which must take one of the following values:\n * - `start`: The viewport will be scrolled to a column in such a way that it will be positioned on the start (left edge or right, if the layout direction is set to `rtl`) of the viewport;\n * - `end`: The viewport will be scrolled to a column in such a way that it will be positioned on the end (right edge or left, if the layout direction is set to `rtl`) of the viewport;\n * - If the property is not defined the horizontal auto-snapping is enabled. Depending on where the viewport is scrolled from, a column will\n * be positioned at the start or end of the viewport.\n * @param {boolean} [options.considerHiddenIndexes=true] If `true`, we handle visual indexes, otherwise we handle only indexes which\n * may be rendered when they are in the viewport (we don't consider hidden indexes as they aren't rendered).\n * @param {Function} [callback] The callback function to call after the viewport is scrolled.\n * @returns {boolean} `true` if viewport was scrolled, `false` otherwise.\n */\n this.scrollViewportTo = function (options, callback) {\n // Support for backward compatibility arguments: (row, col, snapToBottom, snapToRight, considerHiddenIndexes)\n if (typeof options === 'number') {\n var _arguments$;\n /* eslint-disable prefer-rest-params */\n options = {\n row: arguments[0],\n col: arguments[1],\n verticalSnap: arguments[2] ? 'bottom' : 'top',\n horizontalSnap: arguments[3] ? 'end' : 'start',\n considerHiddenIndexes: (_arguments$ = arguments[4]) !== null && _arguments$ !== void 0 ? _arguments$ : true\n };\n /* eslint-enable prefer-rest-params */\n }\n const {\n row,\n col,\n considerHiddenIndexes\n } = options !== null && options !== void 0 ? options : {};\n let renderableRow = row;\n let renderableColumn = col;\n if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(callback)) {\n this.addHookOnce('afterScroll', callback);\n }\n if (considerHiddenIndexes === undefined || considerHiddenIndexes) {\n const isValidRowGrid = Number.isInteger(row) && row >= 0;\n const isValidColumnGrid = Number.isInteger(col) && col >= 0;\n const visualRowToScroll = isValidRowGrid ? getIndexToScroll(this.rowIndexMapper, row) : undefined;\n const visualColumnToScroll = isValidColumnGrid ? getIndexToScroll(this.columnIndexMapper, col) : undefined;\n if (visualRowToScroll === null || visualColumnToScroll === null) {\n return false;\n }\n renderableRow = isValidRowGrid ? instance.rowIndexMapper.getRenderableFromVisualIndex(visualRowToScroll) : row;\n renderableColumn = isValidColumnGrid ? instance.columnIndexMapper.getRenderableFromVisualIndex(visualColumnToScroll) : col;\n }\n const isRowInteger = Number.isInteger(renderableRow);\n const isColumnInteger = Number.isInteger(renderableColumn);\n let isScrolled = false;\n if (isRowInteger && renderableRow >= 0 && isColumnInteger && renderableColumn >= 0) {\n isScrolled = instance.view.scrollViewport(instance._createCellCoords(renderableRow, renderableColumn), options.horizontalSnap, options.verticalSnap);\n } else if (isRowInteger && renderableRow >= 0 && (isColumnInteger && renderableColumn < 0 || !isColumnInteger)) {\n isScrolled = instance.view.scrollViewportVertically(renderableRow, options.verticalSnap);\n } else if (isColumnInteger && renderableColumn >= 0 && (isRowInteger && renderableRow < 0 || !isRowInteger)) {\n isScrolled = instance.view.scrollViewportHorizontally(renderableColumn, options.horizontalSnap);\n }\n if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(callback)) {\n if (isScrolled) {\n // fast render triggers `afterScroll` hook\n this.view.render();\n } else {\n this.removeHook('afterScroll', callback);\n this._registerMicrotask(() => callback());\n }\n }\n return isScrolled;\n };\n\n /**\n * Scrolls the viewport to coordinates specified by the currently focused cell.\n *\n * @since 14.0.0\n * @memberof Core#\n * @fires Hooks#afterScroll\n * @function scrollToFocusedCell\n * @param {Function} [callback] The callback function to call after the viewport is scrolled.\n * @returns {boolean} `true` if the viewport was scrolled, `false` otherwise.\n */\n this.scrollToFocusedCell = function (callback) {\n if (!this.selection.isSelected()) {\n return false;\n }\n if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(callback)) {\n this.addHookOnce('afterScroll', callback);\n }\n const {\n highlight\n } = this.getSelectedRangeLast();\n const isScrolled = this.scrollViewportTo(highlight.toObject());\n if (isScrolled) {\n // fast render triggers `afterScroll` hook\n this.view.render();\n } else if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(callback)) {\n this.removeHook('afterScroll', callback);\n this._registerMicrotask(() => callback());\n }\n return isScrolled;\n };\n\n /**\n * Removes the table from the DOM and destroys the instance of the Handsontable.\n *\n * @memberof Core#\n * @function destroy\n * @fires Hooks#afterDestroy\n */\n this.destroy = function () {\n instance._clearTimeouts();\n instance._clearImmediates();\n if (instance.view) {\n // in case HT is destroyed before initialization has finished\n instance.view.destroy();\n }\n if (dataSource) {\n dataSource.destroy();\n }\n dataSource = null;\n this.getShortcutManager().destroy();\n metaManager.clearCache();\n foreignHotInstances.delete(this.guid);\n if ((0,_utils_rootInstance_mjs__WEBPACK_IMPORTED_MODULE_16__.isRootInstance)(instance)) {\n const licenseInfo = this.rootDocument.querySelector('.hot-display-license-info');\n if (licenseInfo) {\n licenseInfo.parentNode.removeChild(licenseInfo);\n }\n }\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_24__.empty)(instance.rootElement);\n eventManager.destroy();\n if (editorManager) {\n editorManager.destroy();\n }\n\n // The plugin's `destroy` method is called as a consequence and it should handle\n // unregistration of plugin's maps. Some unregistered maps reset the cache.\n instance.batchExecution(() => {\n instance.rowIndexMapper.unregisterAll();\n instance.columnIndexMapper.unregisterAll();\n pluginsRegistry.getItems().forEach(_ref11 => {\n let [, plugin] = _ref11;\n plugin.destroy();\n });\n pluginsRegistry.clear();\n instance.runHooks('afterDestroy');\n }, true);\n _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().destroy(instance);\n (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_29__.objectEach)(instance, (property, key, obj) => {\n // replace instance methods with post mortem\n if ((0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_39__.isFunction)(property)) {\n obj[key] = postMortem(key);\n } else if (key !== 'guid') {\n // replace instance properties with null (restores memory)\n // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests\n obj[key] = null;\n }\n });\n instance.isDestroyed = true;\n\n // replace private properties with null (restores memory)\n // it should not be necessary but this prevents a memory leak side effects that show itself in Jasmine tests\n if (datamap) {\n datamap.destroy();\n }\n datamap = null;\n grid = null;\n selection = null;\n editorManager = null;\n instance = null;\n };\n\n /**\n * Replacement for all methods after the Handsontable was destroyed.\n *\n * @private\n * @param {string} method The method name.\n * @returns {Function}\n */\n function postMortem(method) {\n return () => {\n throw new Error(`The \"${method}\" method cannot be called because this Handsontable instance has been destroyed`);\n };\n }\n\n /**\n * Returns the active editor class instance.\n *\n * @memberof Core#\n * @function getActiveEditor\n * @returns {BaseEditor} The active editor instance.\n */\n this.getActiveEditor = function () {\n return editorManager.getActiveEditor();\n };\n\n /**\n * Returns the first rendered row in the DOM (usually, it is not visible in the table's viewport).\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getFirstRenderedVisibleRow\n * @returns {number | null}\n */\n this.getFirstRenderedVisibleRow = function () {\n return instance.view.getFirstRenderedVisibleRow();\n };\n\n /**\n * Returns the last rendered row in the DOM (usually, it is not visible in the table's viewport).\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getLastRenderedVisibleRow\n * @returns {number | null}\n */\n this.getLastRenderedVisibleRow = function () {\n return instance.view.getLastRenderedVisibleRow();\n };\n\n /**\n * Returns the first rendered column in the DOM (usually, it is not visible in the table's viewport).\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getFirstRenderedVisibleColumn\n * @returns {number | null}\n */\n this.getFirstRenderedVisibleColumn = function () {\n return instance.view.getFirstRenderedVisibleColumn();\n };\n\n /**\n * Returns the last rendered column in the DOM (usually, it is not visible in the table's viewport).\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getLastRenderedVisibleColumn\n * @returns {number | null}\n */\n this.getLastRenderedVisibleColumn = function () {\n return instance.view.getLastRenderedVisibleColumn();\n };\n\n /**\n * Returns the first fully visible row in the table viewport. When the table has overlays the method returns\n * the first row of the main table that is not overlapped by overlay.\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getFirstFullyVisibleRow\n * @returns {number | null}\n */\n this.getFirstFullyVisibleRow = function () {\n return instance.view.getFirstFullyVisibleRow();\n };\n\n /**\n * Returns the last fully visible row in the table viewport. When the table has overlays the method returns\n * the first row of the main table that is not overlapped by overlay.\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getLastFullyVisibleRow\n * @returns {number | null}\n */\n this.getLastFullyVisibleRow = function () {\n return instance.view.getLastFullyVisibleRow();\n };\n\n /**\n * Returns the first fully visible column in the table viewport. When the table has overlays the method returns\n * the first row of the main table that is not overlapped by overlay.\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getFirstFullyVisibleColumn\n * @returns {number | null}\n */\n this.getFirstFullyVisibleColumn = function () {\n return instance.view.getFirstFullyVisibleColumn();\n };\n\n /**\n * Returns the last fully visible column in the table viewport. When the table has overlays the method returns\n * the first row of the main table that is not overlapped by overlay.\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getLastFullyVisibleColumn\n * @returns {number | null}\n */\n this.getLastFullyVisibleColumn = function () {\n return instance.view.getLastFullyVisibleColumn();\n };\n\n /**\n * Returns the first partially visible row in the table viewport. When the table has overlays the method returns\n * the first row of the main table that is not overlapped by overlay.\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getFirstPartiallyVisibleRow\n * @returns {number | null}\n */\n this.getFirstPartiallyVisibleRow = function () {\n return instance.view.getFirstPartiallyVisibleRow();\n };\n\n /**\n * Returns the last partially visible row in the table viewport. When the table has overlays the method returns\n * the first row of the main table that is not overlapped by overlay.\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getLastPartiallyVisibleRow\n * @returns {number | null}\n */\n this.getLastPartiallyVisibleRow = function () {\n return instance.view.getLastPartiallyVisibleRow();\n };\n\n /**\n * Returns the first partially visible column in the table viewport. When the table has overlays the method returns\n * the first row of the main table that is not overlapped by overlay.\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getFirstPartiallyVisibleColumn\n * @returns {number | null}\n */\n this.getFirstPartiallyVisibleColumn = function () {\n return instance.view.getFirstPartiallyVisibleColumn();\n };\n\n /**\n * Returns the last partially visible column in the table viewport. When the table has overlays the method returns\n * the first row of the main table that is not overlapped by overlay.\n *\n * @since 14.6.0\n * @memberof Core#\n * @function getLastPartiallyVisibleColumn\n * @returns {number | null}\n */\n this.getLastPartiallyVisibleColumn = function () {\n return instance.view.getLastPartiallyVisibleColumn();\n };\n\n /**\n * Returns plugin instance by provided its name.\n *\n * @memberof Core#\n * @function getPlugin\n * @param {string} pluginName The plugin name.\n * @returns {BasePlugin|undefined} The plugin instance or undefined if there is no plugin.\n */\n this.getPlugin = function (pluginName) {\n return pluginsRegistry.getItem((0,_helpers_string_mjs__WEBPACK_IMPORTED_MODULE_25__.toUpperCaseFirst)(pluginName));\n };\n\n /**\n * Returns name of the passed plugin.\n *\n * @private\n * @memberof Core#\n * @param {BasePlugin} plugin The plugin instance.\n * @returns {string}\n */\n this.getPluginName = function (plugin) {\n // Workaround for the UndoRedo plugin which, currently doesn't follow the plugin architecture.\n if (plugin === this.undoRedo) {\n return this.undoRedo.constructor.PLUGIN_KEY;\n }\n return pluginsRegistry.getId(plugin);\n };\n\n /**\n * Returns the Handsontable instance.\n *\n * @memberof Core#\n * @function getInstance\n * @returns {Handsontable} The Handsontable instance.\n */\n this.getInstance = function () {\n return instance;\n };\n\n /**\n * Adds listener to the specified hook name (only for this Handsontable instance).\n *\n * @memberof Core#\n * @function addHook\n * @see Hooks#add\n * @param {string} key Hook name (see {@link Hooks}).\n * @param {Function|Array} callback Function or array of functions.\n * @param {number} [orderIndex] Order index of the callback.\n * If > 0, the callback will be added after the others, for example, with an index of 1, the callback will be added before the ones with an index of 2, 3, etc., but after the ones with an index of 0 and lower.\n * If < 0, the callback will be added before the others, for example, with an index of -1, the callback will be added after the ones with an index of -2, -3, etc., but before the ones with an index of 0 and higher.\n * If 0 or no order index is provided, the callback will be added between the \"negative\" and \"positive\" indexes.\n * @example\n * ```js\n * hot.addHook('beforeInit', myCallback);\n * ```\n */\n this.addHook = function (key, callback, orderIndex) {\n _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().add(key, callback, instance, orderIndex);\n };\n\n /**\n * Check if for a specified hook name there are added listeners (only for this Handsontable instance). All available\n * hooks you will find {@link Hooks}.\n *\n * @memberof Core#\n * @function hasHook\n * @see Hooks#has\n * @param {string} key Hook name.\n * @returns {boolean}\n *\n * @example\n * ```js\n * const hasBeforeInitListeners = hot.hasHook('beforeInit');\n * ```\n */\n this.hasHook = function (key) {\n return _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().has(key, instance) || _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().has(key);\n };\n\n /**\n * Adds listener to specified hook name (only for this Handsontable instance). After the listener is triggered,\n * it will be automatically removed.\n *\n * @memberof Core#\n * @function addHookOnce\n * @see Hooks#once\n * @param {string} key Hook name (see {@link Hooks}).\n * @param {Function|Array} callback Function or array of functions.\n * @param {number} [orderIndex] Order index of the callback.\n * If > 0, the callback will be added after the others, for example, with an index of 1, the callback will be added before the ones with an index of 2, 3, etc., but after the ones with an index of 0 and lower.\n * If < 0, the callback will be added before the others, for example, with an index of -1, the callback will be added after the ones with an index of -2, -3, etc., but before the ones with an index of 0 and higher.\n * If 0 or no order index is provided, the callback will be added between the \"negative\" and \"positive\" indexes.\n * @example\n * ```js\n * hot.addHookOnce('beforeInit', myCallback);\n * ```\n */\n this.addHookOnce = function (key, callback, orderIndex) {\n _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().once(key, callback, instance, orderIndex);\n };\n\n /**\n * Removes the hook listener previously registered with {@link Core#addHook}.\n *\n * @memberof Core#\n * @function removeHook\n * @see Hooks#remove\n * @param {string} key Hook name.\n * @param {Function} callback Reference to the function which has been registered using {@link Core#addHook}.\n *\n * @example\n * ```js\n * hot.removeHook('beforeInit', myCallback);\n * ```\n */\n this.removeHook = function (key, callback) {\n _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().remove(key, callback, instance);\n };\n\n /**\n * Run the callbacks for the hook provided in the `key` argument using the parameters given in the other arguments.\n *\n * @memberof Core#\n * @function runHooks\n * @see Hooks#run\n * @param {string} key Hook name.\n * @param {*} [p1] Argument passed to the callback.\n * @param {*} [p2] Argument passed to the callback.\n * @param {*} [p3] Argument passed to the callback.\n * @param {*} [p4] Argument passed to the callback.\n * @param {*} [p5] Argument passed to the callback.\n * @param {*} [p6] Argument passed to the callback.\n * @returns {*}\n *\n * @example\n * ```js\n * // Run built-in hook\n * hot.runHooks('beforeInit');\n * // Run custom hook\n * hot.runHooks('customAction', 10, 'foo');\n * ```\n */\n this.runHooks = function (key, p1, p2, p3, p4, p5, p6) {\n return _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().run(instance, key, p1, p2, p3, p4, p5, p6);\n };\n\n /**\n * Get language phrase for specified dictionary key.\n *\n * @memberof Core#\n * @function getTranslatedPhrase\n * @since 0.35.0\n * @param {string} dictionaryKey Constant which is dictionary key.\n * @param {*} extraArguments Arguments which will be handled by formatters.\n * @returns {string}\n */\n this.getTranslatedPhrase = function (dictionaryKey, extraArguments) {\n return (0,_i18n_registry_mjs__WEBPACK_IMPORTED_MODULE_17__.getTranslatedPhrase)(tableMeta.language, dictionaryKey, extraArguments);\n };\n\n /**\n * Converts instance into outerHTML of HTMLTableElement.\n *\n * @memberof Core#\n * @function toHTML\n * @since 7.1.0\n * @returns {string}\n */\n this.toHTML = () => (0,_utils_parseTable_mjs__WEBPACK_IMPORTED_MODULE_47__.instanceToHTML)(this);\n\n /**\n * Converts instance into HTMLTableElement.\n *\n * @memberof Core#\n * @function toTableElement\n * @since 7.1.0\n * @returns {HTMLTableElement}\n */\n this.toTableElement = () => {\n const tempElement = this.rootDocument.createElement('div');\n tempElement.insertAdjacentHTML('afterbegin', (0,_utils_parseTable_mjs__WEBPACK_IMPORTED_MODULE_47__.instanceToHTML)(this));\n return tempElement.firstElementChild;\n };\n this.timeouts = [];\n\n /**\n * Use the theme specified by the provided name.\n *\n * @memberof Core#\n * @function useTheme\n * @since 15.0.0\n * @param {string|boolean|undefined} themeName The name of the theme to use.\n */\n this.useTheme = themeName => {\n this.view.getStylesHandler().useTheme(themeName);\n this.runHooks('afterSetTheme', themeName, !!firstRun);\n };\n\n /**\n * Gets the name of the currently used theme.\n *\n * @memberof Core#\n * @function getCurrentThemeName\n * @since 15.0.0\n * @returns {string|undefined} The name of the currently used theme.\n */\n this.getCurrentThemeName = () => {\n return this.view.getStylesHandler().getThemeName();\n };\n\n /**\n * Sets timeout. Purpose of this method is to clear all known timeouts when `destroy` method is called.\n *\n * @param {number|Function} handle Handler returned from setTimeout or function to execute (it will be automatically wraped\n * by setTimeout function).\n * @param {number} [delay=0] If first argument is passed as a function this argument set delay of the execution of that function.\n * @private\n */\n this._registerTimeout = function (handle) {\n let delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n let handleFunc = handle;\n if (typeof handleFunc === 'function') {\n handleFunc = setTimeout(handleFunc, delay);\n }\n this.timeouts.push(handleFunc);\n };\n\n /**\n * Clears all known timeouts.\n *\n * @private\n */\n this._clearTimeouts = function () {\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayEach)(this.timeouts, handler => {\n clearTimeout(handler);\n });\n };\n this.immediates = [];\n\n /**\n * Execute function execution to the next event loop cycle. Purpose of this method is to clear all known timeouts when `destroy` method is called.\n *\n * @param {Function} callback Function to be delayed in execution.\n * @private\n */\n this._registerImmediate = function (callback) {\n this.immediates.push(setImmediate(callback));\n };\n\n /**\n * Clears all known timeouts.\n *\n * @private\n */\n this._clearImmediates = function () {\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_30__.arrayEach)(this.immediates, handler => {\n clearImmediate(handler);\n });\n };\n\n /**\n * Registers a microtask callback.\n *\n * @param {Function} callback Function to be delayed in execution.\n * @private\n */\n this._registerMicrotask = function (callback) {\n this.rootWindow.queueMicrotask(() => {\n if (!this.isDestroyed) {\n callback();\n }\n });\n };\n\n /**\n * Gets the instance of the EditorManager.\n *\n * @private\n * @returns {EditorManager}\n */\n this._getEditorManager = function () {\n return editorManager;\n };\n const shortcutManager = (0,_shortcuts_index_mjs__WEBPACK_IMPORTED_MODULE_48__.createShortcutManager)({\n handleEvent() {\n return instance.isListening();\n },\n beforeKeyDown: event => {\n return this.runHooks('beforeKeyDown', event);\n },\n afterKeyDown: event => {\n if (this.isDestroyed) {\n // Handsontable could be destroyed after performing action (executing a callback).\n return;\n }\n instance.runHooks('afterDocumentKeyDown', event);\n },\n ownerWindow: this.rootWindow\n });\n this.addHook('beforeOnCellMouseDown', event => {\n // Releasing keys as some browser/system shortcuts break events sequence (thus the `keyup` event isn't triggered).\n if (event.ctrlKey === false && event.metaKey === false) {\n shortcutManager.releasePressedKeys();\n }\n });\n\n /**\n * Returns instance of a manager responsible for handling shortcuts stored in some contexts. It run actions after\n * pressing key combination in active Handsontable instance.\n *\n * @memberof Core#\n * @since 12.0.0\n * @function getShortcutManager\n * @returns {ShortcutManager} Instance of {@link ShortcutManager}\n */\n this.getShortcutManager = function () {\n return shortcutManager;\n };\n\n /**\n * Return the Focus Manager responsible for managing the browser's focus in the table.\n *\n * @memberof Core#\n * @since 14.0.0\n * @function getFocusManager\n * @returns {FocusManager}\n */\n this.getFocusManager = function () {\n return focusManager;\n };\n (0,_plugins_registry_mjs__WEBPACK_IMPORTED_MODULE_49__.getPluginsNames)().forEach(pluginName => {\n const PluginClass = (0,_plugins_registry_mjs__WEBPACK_IMPORTED_MODULE_49__.getPlugin)(pluginName);\n pluginsRegistry.addItem(pluginName, new PluginClass(this));\n });\n (0,_shortcutContexts_index_mjs__WEBPACK_IMPORTED_MODULE_50__.registerAllShortcutContexts)(instance);\n shortcutManager.setActiveContextName('grid');\n _core_hooks_index_mjs__WEBPACK_IMPORTED_MODULE_18__.Hooks.getSingleton().run(instance, 'construct');\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/focusCatcher/focusDetector.mjs":
/*!***********************************************************************!*\
!*** ./node_modules/handsontable/core/focusCatcher/focusDetector.mjs ***!
\***********************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ installFocusDetector: () => (/* binding */ installFocusDetector)\n/* harmony export */ });\n/* harmony import */ var _helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../helpers/dom/element.mjs */ \"./node_modules/handsontable/helpers/dom/element.mjs\");\n/* harmony import */ var _helpers_a11y_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../helpers/a11y.mjs */ \"./node_modules/handsontable/helpers/a11y.mjs\");\n\n\n/**\n * Installs a focus detector module. The module appends two input elements into the DOM side by side.\n * When the first input is focused, then it means that a user entered to the component using the TAB key\n * from the element above. When the second input is focused, a user enters to the component from\n * the element below the table. Each action, once detected, triggers the specific hook.\n *\n * @param {Handsontable} hot The Handsontable instance.\n * @param {{ onFocusFromTop: Function, onFocusFromBottom: Function }} hooks An object with defined callbacks to call.\n * @returns {{ activate: Function, deactivate: Function }}\n */\nfunction installFocusDetector(hot) {\n let hooks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const rootElement = hot.rootElement;\n const inputTrapTop = createInputElement(hot);\n const inputTrapBottom = createInputElement(hot);\n inputTrapTop.addEventListener('focus', () => hooks === null || hooks === void 0 ? void 0 : hooks.onFocusFromTop());\n inputTrapBottom.addEventListener('focus', () => hooks === null || hooks === void 0 ? void 0 : hooks.onFocusFromBottom());\n rootElement.firstChild.before(inputTrapTop);\n rootElement.lastChild.after(inputTrapBottom);\n return {\n /**\n * Activates the detector by resetting the tabIndex of the input elements.\n */\n activate() {\n hot._registerTimeout(() => {\n inputTrapTop.tabIndex = 0;\n inputTrapBottom.tabIndex = 0;\n }, 10);\n },\n /**\n * Deactivates the detector by setting tabIndex to -1.\n */\n deactivate() {\n hot._registerTimeout(() => {\n inputTrapTop.tabIndex = -1;\n inputTrapBottom.tabIndex = -1;\n }, 10);\n }\n };\n}\n\n/**\n * Creates a new HTML input element.\n *\n * @param {Handsontable} hot The Handsontable instance.\n * @returns {HTMLInputElement}\n */\nfunction createInputElement(hot) {\n const rootDocument = hot.rootDocument;\n const input = rootDocument.createElement('input');\n input.type = 'text';\n input.name = '__htFocusCatcher';\n input.classList.add('htFocusCatcher');\n if (hot.getSettings().ariaTags) {\n (0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_0__.setAttribute)(input, [(0,_helpers_a11y_mjs__WEBPACK_IMPORTED_MODULE_1__.A11Y_LABEL)('Focus catcher')]);\n }\n return input;\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/focusCatcher/focusDetector.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/focusCatcher/index.mjs":
/*!***************************************************************!*\
!*** ./node_modules/handsontable/core/focusCatcher/index.mjs ***!
\***************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ installFocusCatcher: () => (/* binding */ installFocusCatcher)\n/* harmony export */ });\n/* harmony import */ var _shortcutContexts_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shortcutContexts/index.mjs */ \"./node_modules/handsontable/shortcutContexts/constants.mjs\");\n/* harmony import */ var _focusDetector_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./focusDetector.mjs */ \"./node_modules/handsontable/core/focusCatcher/focusDetector.mjs\");\n\n\n/**\n * Installs a focus catcher module. The module observes when the table is focused and depending on\n * from the which side it was focused on it selects a specified cell or releases the TAB navigation\n * to the browser.\n *\n * @param {Core} hot The Handsontable instance.\n */\nfunction installFocusCatcher(hot) {\n const clampCoordsIfNeeded = normalizeCoordsIfNeeded(hot);\n let recentlyAddedFocusCoords;\n const {\n activate,\n deactivate\n } = (0,_focusDetector_mjs__WEBPACK_IMPORTED_MODULE_0__.installFocusDetector)(hot, {\n onFocusFromTop() {\n var _clampCoordsIfNeeded;\n const mostTopStartCoords = (_clampCoordsIfNeeded = clampCoordsIfNeeded(recentlyAddedFocusCoords)) !== null && _clampCoordsIfNeeded !== void 0 ? _clampCoordsIfNeeded : getMostTopStartPosition(hot);\n if (mostTopStartCoords) {\n hot.runHooks('modifyFocusOnTabNavigation', 'from_above', mostTopStartCoords);\n hot.selectCell(mostTopStartCoords.row, mostTopStartCoords.col);\n }\n hot.listen();\n },\n onFocusFromBottom() {\n var _clampCoordsIfNeeded2;\n const mostBottomEndCoords = (_clampCoordsIfNeeded2 = clampCoordsIfNeeded(recentlyAddedFocusCoords)) !== null && _clampCoordsIfNeeded2 !== void 0 ? _clampCoordsIfNeeded2 : getMostBottomEndPosition(hot);\n if (mostBottomEndCoords) {\n hot.runHooks('modifyFocusOnTabNavigation', 'from_below', mostBottomEndCoords);\n hot.selectCell(mostBottomEndCoords.row, mostBottomEndCoords.col);\n }\n hot.listen();\n }\n });\n const rowWrapState = {\n wrapped: false,\n flipped: false\n };\n let isSavingCoordsEnabled = true;\n let isTabOrShiftTabPressed = false;\n let preventViewportScroll = false;\n hot.addHook('afterListen', () => deactivate());\n hot.addHook('afterUnlisten', () => activate());\n hot.addHook('afterSelection', (row, column, row2, column2, preventScrolling) => {\n if (isTabOrShiftTabPressed && (rowWrapState.wrapped && rowWrapState.flipped || preventViewportScroll)) {\n preventViewportScroll = false;\n preventScrolling.value = true;\n }\n if (isSavingCoordsEnabled) {\n var _hot$getSelectedRange;\n recentlyAddedFocusCoords = (_hot$getSelectedRange = hot.getSelectedRangeLast()) === null || _hot$getSelectedRange === void 0 ? void 0 : _hot$getSelectedRange.highlight;\n }\n });\n hot.addHook('beforeRowWrap', (interruptedByAutoInsertMode, newCoords, isFlipped) => {\n rowWrapState.wrapped = true;\n rowWrapState.flipped = isFlipped;\n });\n\n /**\n * Unselects the cell and deactivates the table.\n */\n function deactivateTable() {\n rowWrapState.wrapped = false;\n rowWrapState.flipped = false;\n hot.deselectCell();\n hot.unlisten();\n }\n const shortcutOptions = {\n keys: [['Tab'], ['Shift', 'Tab']],\n preventDefault: false,\n stopPropagation: false,\n relativeToGroup: _shortcutContexts_index_mjs__WEBPACK_IMPORTED_MODULE_1__.GRID_GROUP,\n group: 'focusCatcher'\n };\n hot.getShortcutManager().getContext('grid').addShortcuts([{\n ...shortcutOptions,\n callback: () => {\n const {\n tabNavigation\n } = hot.getSettings();\n isTabOrShiftTabPressed = true;\n if (hot.getSelectedRangeLast() && !tabNavigation) {\n isSavingCoordsEnabled = false;\n }\n if (!tabNavigation) {\n preventViewportScroll = true;\n }\n },\n position: 'before'\n }, {\n ...shortcutOptions,\n callback: event => {\n const {\n tabNavigation,\n autoWrapRow\n } = hot.getSettings();\n isTabOrShiftTabPressed = false;\n isSavingCoordsEnabled = true;\n if (!tabNavigation || !hot.selection.isSelected() || autoWrapRow && rowWrapState.wrapped && rowWrapState.flipped || !autoWrapRow && rowWrapState.wrapped) {\n if (autoWrapRow && rowWrapState.wrapped && rowWrapState.flipped) {\n recentlyAddedFocusCoords = event.shiftKey ? getMostTopStartPosition(hot) : getMostBottomEndPosition(hot);\n }\n deactivateTable();\n return false;\n }\n\n // if the selection is still within the table's range then prevent default action\n event.preventDefault();\n },\n position: 'after'\n }]);\n}\n\n/**\n * Gets the coordinates of the most top-start cell or header (depends on the table settings and its size).\n *\n * @param {Core} hot The Handsontable instance.\n * @returns {CellCoords|null}\n */\nfunction getMostTopStartPosition(hot) {\n const {\n rowIndexMapper,\n columnIndexMapper\n } = hot;\n const {\n navigableHeaders\n } = hot.getSettings();\n let topRow = navigableHeaders && hot.countColHeaders() > 0 ? -hot.countColHeaders() : 0;\n let startColumn = navigableHeaders && hot.countRowHeaders() > 0 ? -hot.countRowHeaders() : 0;\n if (topRow === 0) {\n topRow = rowIndexMapper.getVisualFromRenderableIndex(topRow);\n }\n if (startColumn === 0) {\n startColumn = columnIndexMapper.getVisualFromRenderableIndex(startColumn);\n }\n if (topRow === null || startColumn === null) {\n return null;\n }\n return hot._createCellCoords(topRow, startColumn);\n}\n\n/**\n * Gets the coordinates of the most bottom-end cell or header (depends on the table settings and its size).\n *\n * @param {Core} hot The Handsontable instance.\n * @returns {CellCoords|null}\n */\nfunction getMostBottomEndPosition(hot) {\n var _rowIndexMapper$getVi, _columnIndexMapper$ge;\n const {\n rowIndexMapper,\n columnIndexMapper\n } = hot;\n const {\n navigableHeaders\n } = hot.getSettings();\n let bottomRow = rowIndexMapper.getRenderableIndexesLength() - 1;\n let endColumn = columnIndexMapper.getRenderableIndexesLength() - 1;\n if (bottomRow < 0) {\n if (!navigableHeaders || hot.countColHeaders() === 0) {\n return null;\n }\n bottomRow = -1;\n }\n if (endColumn < 0) {\n if (!navigableHeaders || hot.countColHeaders() === 0) {\n return null;\n }\n endColumn = -1;\n }\n return hot._createCellCoords((_rowIndexMapper$getVi = rowIndexMapper.getVisualFromRenderableIndex(bottomRow)) !== null && _rowIndexMapper$getVi !== void 0 ? _rowIndexMapper$getVi : bottomRow, (_columnIndexMapper$ge = columnIndexMapper.getVisualFromRenderableIndex(endColumn)) !== null && _columnIndexMapper$ge !== void 0 ? _columnIndexMapper$ge : endColumn);\n}\n\n/**\n * Normalizes the coordinates (clamps to nearest visible cell position within dataset range).\n *\n * @param {Core} hot The Handsontable instance.\n * @returns {function(Coords | undefined): Coords | null}\n */\nfunction normalizeCoordsIfNeeded(hot) {\n return coords => {\n if (!coords) {\n return null;\n }\n const mostTopStartCoords = getMostTopStartPosition(hot);\n const mostBottomEndCoords = getMostBottomEndPosition(hot);\n if (coords.col < mostTopStartCoords.col) {\n coords.col = mostTopStartCoords.col;\n }\n if (coords.col > mostBottomEndCoords.col) {\n coords.col = mostBottomEndCoords.col;\n }\n if (coords.row < mostTopStartCoords.row) {\n coords.row = mostTopStartCoords.row;\n }\n if (coords.row > mostBottomEndCoords.row) {\n coords.row = mostBottomEndCoords.row;\n }\n return coords;\n };\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/focusCatcher/index.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/hooks/bucket.mjs":
/*!*********************************************************!*\
!*** ./node_modules/handsontable/core/hooks/bucket.mjs ***!
\*********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HooksBucket: () => (/* binding */ HooksBucket)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_to_sorted_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.array.to-sorted.js */ \"./node_modules/core-js/modules/es.array.to-sorted.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/esnext.iterator.find.js */ \"./node_modules/core-js/modules/esnext.iterator.find.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ \"./node_modules/core-js/modules/esnext.iterator.for-each.js\");\n/* harmony import */ var _constants_mjs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./constants.mjs */ \"./node_modules/handsontable/core/hooks/constants.mjs\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }\nfunction _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }\nfunction _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); }\nfunction _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }\nfunction _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }\nfunction _assertClassBrand(e, t, n) { if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError(\"Private element is not present on this object\"); }\n\n/**\n * @typedef {object} HookEntry\n * @property {Function} callback The callback function.\n * @property {number} orderIndex The order index.\n * @property {boolean} runOnce Indicates if the hook should run only once.\n * @property {boolean} initialHook Indicates if it is an initial hook - which means that the hook\n * always stays at the same index position even after update.\n * @property {boolean} skip Indicates if the hook was removed.\n */\n/**\n * The maximum number of hooks that can be skipped before the bucket is cleaned up.\n */\nconst MAX_SKIPPED_HOOKS_COUNT = 100;\n\n/**\n * The class represents a collection that allows to manage hooks (add, remove).\n *\n * @class HooksBucket\n */\nvar _hooks = /*#__PURE__*/new WeakMap();\nvar _skippedHooksCount = /*#__PURE__*/new WeakMap();\nvar _needsSort = /*#__PURE__*/new WeakMap();\nvar _HooksBucket_brand = /*#__PURE__*/new WeakSet();\nclass HooksBucket {\n constructor() {\n /**\n * Creates a initial collection for the provided hook name.\n *\n * @param {string} hookName The name of the hook.\n */\n _classPrivateMethodInitSpec(this, _HooksBucket_brand);\n /**\n * A map that stores hooks.\n *\n * @type {Map}\n */\n _classPrivateFieldInitSpec(this, _hooks, new Map());\n /**\n * A map that stores the number of skipped hooks.\n */\n _classPrivateFieldInitSpec(this, _skippedHooksCount, new Map());\n /**\n * A set that stores hook names that need to be re-sorted.\n */\n _classPrivateFieldInitSpec(this, _needsSort, new Set());\n _constants_mjs__WEBPACK_IMPORTED_MODULE_14__.REGISTERED_HOOKS.forEach(hookName => _assertClassBrand(_HooksBucket_brand, this, _createHooksCollection).call(this, hookName));\n }\n\n /**\n * Gets all hooks for the provided hook name.\n *\n * @param {string} hookName The name of the hook.\n * @returns {HookEntry[]}\n */\n getHooks(hookName) {\n var _classPrivateFieldGet2;\n return (_classPrivateFieldGet2 = _classPrivateFieldGet(_hooks, this).get(hookName)) !== null && _classPrivateFieldGet2 !== void 0 ? _classPrivateFieldGet2 : [];\n }\n\n /**\n * Adds a new hook to the collection.\n *\n * @param {string} hookName The name of the hook.\n * @param {Function} callback The callback function to add.\n * @param {{ orderIndex?: number, runOnce?: boolean, initialHook?: boolean }} options The options object.\n */\n add(hookName, callback) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (!_classPrivateFieldGet(_hooks, this).has(hookName)) {\n _assertClassBrand(_HooksBucket_brand, this, _createHooksCollection).call(this, hookName);\n _constants_mjs__WEBPACK_IMPORTED_MODULE_14__.REGISTERED_HOOKS.push(hookName);\n }\n const hooks = _classPrivateFieldGet(_hooks, this).get(hookName);\n if (hooks.find(hook => hook.callback === callback)) {\n // adding the same hook twice is now silently ignored\n return;\n }\n const orderIndex = Number.isInteger(options.orderIndex) ? options.orderIndex : 0;\n const runOnce = !!options.runOnce;\n const initialHook = !!options.initialHook;\n let foundInitialHook = false;\n if (initialHook) {\n const initialHookEntry = hooks.find(hook => hook.initialHook);\n if (initialHookEntry) {\n initialHookEntry.callback = callback;\n foundInitialHook = true;\n }\n }\n if (!foundInitialHook) {\n hooks.push({\n callback,\n orderIndex,\n runOnce,\n initialHook,\n skip: false\n });\n let needsSort = _classPrivateFieldGet(_needsSort, this).has(hookName);\n if (!needsSort && orderIndex !== 0) {\n needsSort = true;\n _classPrivateFieldGet(_needsSort, this).add(hookName);\n }\n if (needsSort && hooks.length > 1) {\n _classPrivateFieldGet(_hooks, this).set(hookName, hooks.toSorted((a, b) => a.orderIndex - b.orderIndex));\n }\n }\n }\n\n /**\n * Checks if there are any hooks for the provided hook name.\n *\n * @param {string} hookName The name of the hook.\n * @returns {boolean}\n */\n has(hookName) {\n return _classPrivateFieldGet(_hooks, this).has(hookName) && _classPrivateFieldGet(_hooks, this).get(hookName).length > 0;\n }\n\n /**\n * Removes a hook from the collection. If the hook was found and removed,\n * the method returns `true`, otherwise `false`.\n *\n * @param {string} hookName The name of the hook.\n * @param {*} callback The callback function to remove.\n * @returns {boolean}\n */\n remove(hookName, callback) {\n if (!_classPrivateFieldGet(_hooks, this).has(hookName)) {\n return false;\n }\n const hooks = _classPrivateFieldGet(_hooks, this).get(hookName);\n const hookEntry = hooks.find(hook => hook.callback === callback);\n if (hookEntry) {\n let skippedHooksCount = _classPrivateFieldGet(_skippedHooksCount, this).get(hookName);\n hookEntry.skip = true;\n skippedHooksCount += 1;\n if (skippedHooksCount > MAX_SKIPPED_HOOKS_COUNT) {\n _classPrivateFieldGet(_hooks, this).set(hookName, hooks.filter(hook => !hook.skip));\n skippedHooksCount = 0;\n }\n _classPrivateFieldGet(_skippedHooksCount, this).set(hookName, skippedHooksCount);\n return true;\n }\n return false;\n }\n\n /**\n * Destroys the bucket.\n */\n destroy() {\n _classPrivateFieldGet(_hooks, this).clear();\n _classPrivateFieldGet(_skippedHooksCount, this).clear();\n _classPrivateFieldSet(_hooks, this, null);\n _classPrivateFieldSet(_skippedHooksCount, this, null);\n }\n}\nfunction _createHooksCollection(hookName) {\n _classPrivateFieldGet(_hooks, this).set(hookName, []);\n _classPrivateFieldGet(_skippedHooksCount, this).set(hookName, 0);\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/hooks/bucket.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/hooks/constants.mjs":
/*!************************************************************!*\
!*** ./node_modules/handsontable/core/hooks/constants.mjs ***!
\************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DEPRECATED_HOOKS: () => (/* binding */ DEPRECATED_HOOKS),\n/* harmony export */ REGISTERED_HOOKS: () => (/* binding */ REGISTERED_HOOKS),\n/* harmony export */ REMOVED_HOOKS: () => (/* binding */ REMOVED_HOOKS)\n/* harmony export */ });\n/* eslint-disable jsdoc/require-description-complete-sentence */\n/**\n * @description\n *\n * ::: only-for javascript\n * Handsontable events are the common interface that function in 2 ways: as __callbacks__ and as __hooks__.\n * :::\n *\n * ::: only-for react\n * This page lists all the **Handsontable hooks** – callbacks that let you react before or after an action occurs.\n *\n * Read more on the [Events and hooks](@/guides/getting-started/events-and-hooks/events-and-hooks.md) page.\n * :::\n *\n * @example\n *\n * ::: only-for javascript\n * ```js\n * // using events as callbacks\n * ...\n * const hot1 = new Handsontable(document.getElementById('example1'), {\n * afterChange: function(changes, source) {\n * $.ajax({\n * url: \"save.php',\n * data: change\n * });\n * }\n * });\n * ...\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * {\n * fetch('save.php', {\n * method: 'POST',\n * headers: {\n * 'Accept': 'application/json',\n * 'Content-Type': 'application/json'\n * },\n * body: JSON.stringify(changes)\n * });\n * }}\n * />\n * :::\n *\n * ::: only-for javascript\n * ```js\n * // using events as plugin hooks\n * ...\n * const hot1 = new Handsontable(document.getElementById('example1'), {\n * myPlugin: true\n * });\n *\n * const hot2 = new Handsontable(document.getElementById('example2'), {\n * myPlugin: false\n * });\n *\n * // global hook\n * Handsontable.hooks.add('afterChange', function() {\n * // Fired twice - for hot1 and hot2\n * if (this.getSettings().myPlugin) {\n * // function body - will only run for hot1\n * }\n * });\n *\n * // local hook (has same effect as a callback)\n * hot2.addHook('afterChange', function() {\n * // function body - will only run in #example2\n * });\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * const hotRef1 = useRef(null);\n * const hotRef2 = useRef(null);\n *\n * // Using events as plugin hooks:\n * ...\n *\n * {\n * changes?.forEach(([row, prop, oldValue, newValue]) => {\n * // Some logic...\n * });\n * }\n * })\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * {\n * changes?.forEach(([row, prop, oldValue, newValue]) => {\n * // Some logic...\n * });\n * }}\n * />\n * ```\n * :::\n */\n'afterChange',\n/**\n * Fired each time user opens {@link ContextMenu} and after setting up the Context Menu's default options. These options are a collection\n * which user can select by setting an array of keys or an array of objects in {@link Options#contextMenu} option.\n *\n * @event Hooks#afterContextMenuDefaultOptions\n * @param {Array} predefinedItems An array of objects containing information about the pre-defined Context Menu items.\n */\n'afterContextMenuDefaultOptions',\n/**\n * Fired each time user opens {@link ContextMenu} plugin before setting up the Context Menu's items but after filtering these options by\n * user ([`contextMenu`](@/api/options.md#contextmenu) option). This hook can by helpful to determine if user use specified menu item or to set up\n * one of the menu item to by always visible.\n *\n * @event Hooks#beforeContextMenuSetItems\n * @param {object[]} menuItems An array of objects containing information about to generated Context Menu items.\n */\n'beforeContextMenuSetItems',\n/**\n * Fired by {@link DropdownMenu} plugin after setting up the Dropdown Menu's default options. These options are a\n * collection which user can select by setting an array of keys or an array of objects in {@link Options#dropdownMenu}\n * option.\n *\n * @event Hooks#afterDropdownMenuDefaultOptions\n * @param {object[]} predefinedItems An array of objects containing information about the pre-defined Context Menu items.\n */\n'afterDropdownMenuDefaultOptions',\n/**\n * Fired by {@link DropdownMenu} plugin before setting up the Dropdown Menu's items but after filtering these options\n * by user ([`dropdownMenu`](@/api/options.md#dropdownmenu) option). This hook can by helpful to determine if user use specified menu item or to set\n * up one of the menu item to by always visible.\n *\n * @event Hooks#beforeDropdownMenuSetItems\n * @param {object[]} menuItems An array of objects containing information about to generated Dropdown Menu items.\n */\n'beforeDropdownMenuSetItems',\n/**\n * Fired by {@link ContextMenu} plugin after hiding the Context Menu. This hook is fired when {@link Options#contextMenu}\n * option is enabled.\n *\n * @event Hooks#afterContextMenuHide\n * @param {object} context The Context Menu plugin instance.\n */\n'afterContextMenuHide',\n/**\n * Fired by {@link ContextMenu} plugin before opening the Context Menu. This hook is fired when {@link Options#contextMenu}\n * option is enabled.\n *\n * @event Hooks#beforeContextMenuShow\n * @param {object} context The Context Menu instance.\n */\n'beforeContextMenuShow',\n/**\n * Fired by {@link ContextMenu} plugin after opening the Context Menu. This hook is fired when {@link Options#contextMenu}\n * option is enabled.\n *\n * @event Hooks#afterContextMenuShow\n * @param {object} context The Context Menu plugin instance.\n */\n'afterContextMenuShow',\n/**\n * Fired by {@link CopyPaste} plugin after reaching the copy limit while copying data. This hook is fired when\n * {@link Options#copyPaste} option is enabled.\n *\n * @event Hooks#afterCopyLimit\n * @param {number} selectedRows Count of selected copyable rows.\n * @param {number} selectedColumns Count of selected copyable columns.\n * @param {number} copyRowsLimit Current copy rows limit.\n * @param {number} copyColumnsLimit Current copy columns limit.\n */\n'afterCopyLimit',\n/**\n * Fired before created a new column.\n *\n * @event Hooks#beforeCreateCol\n * @param {number} index Represents the visual index of first newly created column in the data source array.\n * @param {number} amount Number of newly created columns in the data source array.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n * @returns {*} If `false` then creating columns is cancelled.\n * @example\n * ::: only-for javascript\n * ```js\n * // Return `false` to cancel column inserting.\n * new Handsontable(element, {\n * beforeCreateCol: function(data, coords) {\n * return false;\n * }\n * });\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * // Return `false` to cancel column inserting.\n * {\n * return false;\n * }}\n * />\n * ```\n * :::\n */\n'beforeCreateCol',\n/**\n * Fired after the order of columns has changed.\n * This hook is fired by changing column indexes of any type supported by the {@link IndexMapper}.\n *\n * @event Hooks#afterColumnSequenceChange\n * @param {'init'|'remove'|'insert'|'move'|'update'} [source] A string that indicates what caused the change to the order of columns.\n */\n'afterColumnSequenceChange',\n/**\n * Fired after created a new column.\n *\n * @event Hooks#afterCreateCol\n * @param {number} index Represents the visual index of first newly created column in the data source.\n * @param {number} amount Number of newly created columns in the data source.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n */\n'afterCreateCol',\n/**\n * Fired before created a new row.\n *\n * @event Hooks#beforeCreateRow\n * @param {number} index Represents the visual index of first newly created row in the data source array.\n * @param {number} amount Number of newly created rows in the data source array.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n * @returns {*|boolean} If false is returned the action is canceled.\n */\n'beforeCreateRow',\n/**\n * Fired after created a new row.\n *\n * @event Hooks#afterCreateRow\n * @param {number} index Represents the visual index of first newly created row in the data source array.\n * @param {number} amount Number of newly created rows in the data source array.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n */\n'afterCreateRow',\n/**\n * Fired after all selected cells are deselected.\n *\n * @event Hooks#afterDeselect\n */\n'afterDeselect',\n/**\n * Fired after destroying the Handsontable instance.\n *\n * @event Hooks#afterDestroy\n */\n'afterDestroy',\n/**\n * Hook fired after `keydown` event is handled.\n *\n * @event Hooks#afterDocumentKeyDown\n * @param {Event} event A native `keydown` event object.\n */\n'afterDocumentKeyDown',\n/**\n * Fired inside the Walkontable's selection `draw` method. Can be used to add additional class names to cells, depending on the current selection.\n *\n * @event Hooks#afterDrawSelection\n * @param {number} currentRow Row index of the currently processed cell.\n * @param {number} currentColumn Column index of the currently cell.\n * @param {number[]} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.\n * @param {number|undefined} layerLevel Number indicating which layer of selection is currently processed.\n * @since 0.38.1\n * @returns {string|undefined} Can return a `String`, which will act as an additional `className` to be added to the currently processed cell.\n */\n'afterDrawSelection',\n/**\n * Fired inside the Walkontable's `refreshSelections` method. Can be used to remove additional class names from all cells in the table.\n *\n * @event Hooks#beforeRemoveCellClassNames\n * @since 0.38.1\n * @returns {string[]|undefined} Can return an `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.\n */\n'beforeRemoveCellClassNames',\n/**\n * Hook fired after `compositionstart` event is handled.\n *\n * @event Hooks#beforeCompositionStart\n * @since 15.3.0\n * @param {Event} event A native `composition` event object.\n */\n'beforeCompositionStart',\n/**\n * Fired after getting the cell settings.\n *\n * @event Hooks#afterGetCellMeta\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {object} cellProperties Object containing the cell properties.\n */\n'afterGetCellMeta',\n/**\n * Fired after retrieving information about a column header and appending it to the table header.\n *\n * @event Hooks#afterGetColHeader\n * @param {number} column Visual column index.\n * @param {HTMLTableCellElement} TH Header's TH element.\n * @param {number} [headerLevel=0] (Since 12.2.0) Header level index. Accepts positive (0 to n)\n * and negative (-1 to -n) values. For positive values, 0 points to the\n * topmost header. For negative values, -1 points to the bottom-most\n * header (the header closest to the cells).\n */\n'afterGetColHeader',\n/**\n * Fired after retrieving information about a row header and appending it to the table header.\n *\n * @event Hooks#afterGetRowHeader\n * @param {number} row Visual row index.\n * @param {HTMLTableCellElement} TH Header's TH element.\n */\n'afterGetRowHeader',\n/**\n * Fired after the Handsontable instance is initiated.\n *\n * @event Hooks#afterInit\n */\n'afterInit',\n/**\n * Fired after Handsontable's [`data`](@/api/options.md#data)\n * gets modified by the [`loadData()`](@/api/core.md#loaddata) method\n * or the [`updateSettings()`](@/api/core.md#updatesettings) method.\n *\n * Read more:\n * - [Binding to data](@/guides/getting-started/binding-to-data/binding-to-data.md)\n * - [Saving data](@/guides/getting-started/saving-data/saving-data.md)\n *\n * @event Hooks#afterLoadData\n * @param {Array} sourceData An [array of arrays](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-objects), that contains Handsontable's data\n * @param {boolean} initialLoad A flag that indicates whether the data was loaded at Handsontable's initialization (`true`) or later (`false`)\n * @param {string} source The source of the call\n */\n'afterLoadData',\n/**\n * Fired after the [`updateData()`](@/api/core.md#updatedata) method\n * modifies Handsontable's [`data`](@/api/options.md#data).\n *\n * Read more:\n * - [Binding to data](@/guides/getting-started/binding-to-data/binding-to-data.md)\n * - [Saving data](@/guides/getting-started/saving-data/saving-data.md)\n *\n * @event Hooks#afterUpdateData\n * @since 11.1.0\n * @param {Array} sourceData An [array of arrays](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-objects), that contains Handsontable's data\n * @param {boolean} initialLoad A flag that indicates whether the data was loaded at Handsontable's initialization (`true`) or later (`false`)\n * @param {string} source The source of the call\n */\n'afterUpdateData',\n/**\n * Fired after a scroll event, which is identified as a momentum scroll (e.g. on an iPad).\n *\n * @event Hooks#afterMomentumScroll\n */\n'afterMomentumScroll',\n/**\n * Fired after a `mousedown` event is triggered on the cell corner (the drag handle).\n *\n * @event Hooks#afterOnCellCornerMouseDown\n * @param {Event} event `mousedown` event object.\n */\n'afterOnCellCornerMouseDown',\n/**\n * Fired after a `dblclick` event is triggered on the cell corner (the drag handle).\n *\n * @event Hooks#afterOnCellCornerDblClick\n * @param {Event} event `dblclick` event object.\n */\n'afterOnCellCornerDblClick',\n/**\n * Fired after clicking on a cell or row/column header. In case the row/column header was clicked, the coordinate\n * indexes are negative.\n *\n * For example clicking on the row header of cell (0, 0) results with `afterOnCellMouseDown` called\n * with coordinates `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseDown\n * @param {Event} event `mousedown` event object.\n * @param {CellCoords} coords Coordinates object containing the visual row and visual column indexes of the clicked cell.\n * @param {HTMLTableCellElement} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseDown',\n/**\n * Fired after clicking on a cell or row/column header. In case the row/column header was clicked, the coordinate\n * indexes are negative.\n *\n * For example clicking on the row header of cell (0, 0) results with `afterOnCellMouseUp` called\n * with coordinates `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseUp\n * @param {Event} event `mouseup` event object.\n * @param {CellCoords} coords Coordinates object containing the visual row and visual column indexes of the clicked cell.\n * @param {HTMLTableCellElement} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseUp',\n/**\n * Fired after clicking right mouse button on a cell or row/column header.\n *\n * For example clicking on the row header of cell (0, 0) results with `afterOnCellContextMenu` called\n * with coordinates `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellContextMenu\n * @since 4.1.0\n * @param {Event} event `contextmenu` event object.\n * @param {CellCoords} coords Coordinates object containing the visual row and visual column indexes of the clicked cell.\n * @param {HTMLTableCellElement} TD Cell's TD (or TH) element.\n */\n'afterOnCellContextMenu',\n/**\n * Fired after hovering a cell or row/column header with the mouse cursor. In case the row/column header was\n * hovered, the index is negative.\n *\n * For example, hovering over the row header of cell (0, 0) results with `afterOnCellMouseOver` called\n * with coords `{row: 0, col: -1}`.\n *\n * @event Hooks#afterOnCellMouseOver\n * @param {Event} event `mouseover` event object.\n * @param {CellCoords} coords Hovered cell's visual coordinate object.\n * @param {HTMLTableCellElement} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseOver',\n/**\n * Fired after leaving a cell or row/column header with the mouse cursor.\n *\n * @event Hooks#afterOnCellMouseOut\n * @param {Event} event `mouseout` event object.\n * @param {CellCoords} coords Leaved cell's visual coordinate object.\n * @param {HTMLTableCellElement} TD Cell's TD (or TH) element.\n */\n'afterOnCellMouseOut',\n/**\n * Fired after one or more columns are removed.\n *\n * @event Hooks#afterRemoveCol\n * @param {number} index Visual index of starter column.\n * @param {number} amount An amount of removed columns.\n * @param {number[]} physicalColumns An array of physical columns removed from the data source.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n */\n'afterRemoveCol',\n/**\n * Fired after one or more rows are removed.\n *\n * @event Hooks#afterRemoveRow\n * @param {number} index Visual index of starter row.\n * @param {number} amount An amount of removed rows.\n * @param {number[]} physicalRows An array of physical rows removed from the data source.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n */\n'afterRemoveRow',\n/**\n * Fired before starting rendering the cell.\n *\n * @event Hooks#beforeRenderer\n * @param {HTMLTableCellElement} TD Currently rendered cell's TD element.\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {string|number} prop Column property name or a column index, if datasource is an array of arrays.\n * @param {*} value Value of the rendered cell.\n * @param {object} cellProperties Object containing the cell's properties.\n */\n'beforeRenderer',\n/**\n * Fired after finishing rendering the cell (after the renderer finishes).\n *\n * @event Hooks#afterRenderer\n * @param {HTMLTableCellElement} TD Currently rendered cell's TD element.\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {string|number} prop Column property name or a column index, if datasource is an array of arrays.\n * @param {*} value Value of the rendered cell.\n * @param {object} cellProperties Object containing the cell's properties.\n */\n'afterRenderer',\n/**\n * Fired after the order of rows has changed.\n * This hook is fired by changing row indexes of any type supported by the {@link IndexMapper}.\n *\n * @event Hooks#afterRowSequenceChange\n * @param {'init'|'remove'|'insert'|'move'|'update'} [source] A string that indicates what caused the change to the order of rows.\n */\n'afterRowSequenceChange',\n/**\n * Fired before the vertical viewport scroll. Triggered by the [`scrollViewportTo()`](@/api/core.md#scrollviewportto)\n * method or table internals.\n *\n * @since 14.0.0\n * @event Hooks#beforeViewportScrollVertically\n * @param {number} visualRow Visual row index.\n * @param {'auto' | 'top' | 'bottom'} [snapping='auto'] If `'top'`, viewport is scrolled to show\n * the cell on the top of the table. If `'bottom'`, viewport is scrolled to show the cell on\n * the bottom of the table. When `'auto'`, the viewport is scrolled only when the row is outside of\n * the viewport.\n * @returns {number | boolean} Returns modified row index (or the same as passed in the method argument) to which\n * the viewport will be scrolled. If the returned value is `false`, the scrolling will be canceled.\n */\n'beforeViewportScrollVertically',\n/**\n * Fired before the horizontal viewport scroll. Triggered by the [`scrollViewportTo()`](@/api/core.md#scrollviewportto)\n * method or table internals.\n *\n * @since 14.0.0\n * @event Hooks#beforeViewportScrollHorizontally\n * @param {number} visualColumn Visual column index.\n * @param {'auto' | 'start' | 'end'} [snapping='auto'] If `'start'`, viewport is scrolled to show\n * the cell on the left of the table. If `'end'`, viewport is scrolled to show the cell on the right of\n * the table. When `'auto'`, the viewport is scrolled only when the column is outside of the viewport.\n * @returns {number | boolean} Returns modified column index (or the same as passed in the method argument) to which\n * the viewport will be scrolled. If the returned value is `false`, the scrolling will be canceled.\n */\n'beforeViewportScrollHorizontally',\n/**\n * Fired before the vertical or horizontal viewport scroll. Triggered by the [`scrollViewportTo()`](@/api/core.md#scrollviewportto)\n * method or table internals.\n *\n * @since 14.0.0\n * @event Hooks#beforeViewportScroll\n */\n'beforeViewportScroll',\n/**\n * Fired after the horizontal scroll event.\n *\n * @event Hooks#afterScrollHorizontally\n */\n'afterScrollHorizontally',\n/**\n * Fired after the vertical scroll event.\n *\n * @event Hooks#afterScrollVertically\n */\n'afterScrollVertically',\n/**\n * Fired after the vertical or horizontal scroll event.\n *\n * @since 14.0.0\n * @event Hooks#afterScroll\n */\n'afterScroll',\n/**\n * Fired after one or more cells are selected (e.g. during mouse move).\n *\n * @event Hooks#afterSelection\n * @param {number} row Selection start visual row index.\n * @param {number} column Selection start visual column index.\n * @param {number} row2 Selection end visual row index.\n * @param {number} column2 Selection end visual column index.\n * @param {object} preventScrolling A reference to the observable object with the `value` property.\n * Property `preventScrolling.value` expects a boolean value that\n * Handsontable uses to control scroll behavior after selection.\n * @param {number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n * @example\n * ::: only-for javascript\n * ```js\n * new Handsontable(element, {\n * afterSelection: (row, column, row2, column2, preventScrolling, selectionLayerLevel) => {\n * // If set to `false` (default): when cell selection is outside the viewport,\n * // Handsontable scrolls the viewport to cell selection's end corner.\n * // If set to `true`: when cell selection is outside the viewport,\n * // Handsontable doesn't scroll to cell selection's end corner.\n * preventScrolling.value = true;\n * }\n * })\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * {\n * // If set to `false` (default): when cell selection is outside the viewport,\n * // Handsontable scrolls the viewport to cell selection's end corner.\n * // If set to `true`: when cell selection is outside the viewport,\n * // Handsontable doesn't scroll to cell selection's end corner.\n * preventScrolling.value = true;\n * }}\n * />\n * ```\n * :::\n */\n'afterSelection',\n/**\n * Fired after one or more cells are selected.\n *\n * The `prop` and `prop2` arguments represent the source object property name instead of the column number.\n *\n * @event Hooks#afterSelectionByProp\n * @param {number} row Selection start visual row index.\n * @param {string} prop Selection start data source object property name.\n * @param {number} row2 Selection end visual row index.\n * @param {string} prop2 Selection end data source object property name.\n * @param {object} preventScrolling A reference to the observable object with the `value` property.\n * Property `preventScrolling.value` expects a boolean value that\n * Handsontable uses to control scroll behavior after selection.\n * @param {number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n * @example\n * ```js\n * ::: only-for javascript\n * new Handsontable(element, {\n * afterSelectionByProp: (row, column, row2, column2, preventScrolling, selectionLayerLevel) => {\n * // setting if prevent scrolling after selection\n * preventScrolling.value = true;\n * }\n * })\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * {\n * // setting if prevent scrolling after selection\n * preventScrolling.value = true;\n * }}\n * />\n * ```\n * :::\n */\n'afterSelectionByProp',\n/**\n * Fired after one or more cells are selected (e.g. on mouse up).\n *\n * @event Hooks#afterSelectionEnd\n * @param {number} row Selection start visual row index.\n * @param {number} column Selection start visual column index.\n * @param {number} row2 Selection end visual row index.\n * @param {number} column2 Selection end visual column index.\n * @param {number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n */\n'afterSelectionEnd',\n/**\n * Fired after one or more cells are selected (e.g. on mouse up).\n *\n * The `prop` and `prop2` arguments represent the source object property name instead of the column number.\n *\n * @event Hooks#afterSelectionEndByProp\n * @param {number} row Selection start visual row index.\n * @param {string} prop Selection start data source object property index.\n * @param {number} row2 Selection end visual row index.\n * @param {string} prop2 Selection end data source object property index.\n * @param {number} selectionLayerLevel The number which indicates what selection layer is currently modified.\n */\n'afterSelectionEndByProp',\n/**\n * Fired after the focus position within a selected range is changed.\n *\n * @since 14.3.0\n * @event Hooks#afterSelectionFocusSet\n * @param {number} row The focus visual row index position.\n * @param {number} column The focus visual column index position.\n * @param {object} preventScrolling A reference to the observable object with the `value` property.\n * Property `preventScrolling.value` expects a boolean value that\n * Handsontable uses to control scroll behavior after selection.\n * @example\n * ```js\n * ::: only-for javascript\n * new Handsontable(element, {\n * afterSelectionFocusSet: (row, column, preventScrolling) => {\n * // If set to `false` (default): when focused cell selection is outside the viewport,\n * // Handsontable scrolls the viewport to that cell.\n * // If set to `true`: when focused cell selection is outside the viewport,\n * // Handsontable doesn't scroll the viewport.\n * preventScrolling.value = true;\n * }\n * })\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * {\n * // If set to `false` (default): when focused cell selection is outside the viewport,\n * // Handsontable scrolls the viewport to that cell.\n * // If set to `true`: when focused cell selection is outside the viewport,\n * // Handsontable doesn't scroll the viewport.\n * preventScrolling.value = true;\n * }}\n * />\n * ```\n * :::\n */\n'afterSelectionFocusSet',\n/**\n * Fired before one or more columns are selected (e.g. During mouse header click or {@link Core#selectColumns} API call).\n *\n * @since 14.0.0\n * @event Hooks#beforeSelectColumns\n * @param {CellCoords} from Selection start coords object.\n * @param {CellCoords} to Selection end coords object.\n * @param {CellCoords} highlight Selection cell focus coords object.\n * @example\n * ::: only-for javascript\n * ```js\n * new Handsontable(element, {\n * beforeSelectColumns: (from, to, highlight) => {\n * // Extend the column selection by one column left and one column right.\n * from.col = Math.max(from.col - 1, 0);\n * to.col = Math.min(to.col + 1, this.countCols() - 1);\n * }\n * })\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * {\n * // Extend the column selection by one column left and one column right.\n * from.col = Math.max(from.col - 1, 0);\n * to.col = Math.min(to.col + 1, this.countCols() - 1);\n * }}\n * />\n * ```\n * :::\n */\n'beforeSelectColumns',\n/**\n * Fired after one or more columns are selected (e.g. during mouse header click or {@link Core#selectColumns} API call).\n *\n * @since 14.0.0\n * @event Hooks#afterSelectColumns\n * @param {CellCoords} from Selection start coords object.\n * @param {CellCoords} to Selection end coords object.\n * @param {CellCoords} highlight Selection cell focus coords object.\n */\n'afterSelectColumns',\n/**\n * Fired before one or more rows are selected (e.g. during mouse header click or {@link Core#selectRows} API call).\n *\n * @since 14.0.0\n * @event Hooks#beforeSelectRows\n * @param {CellCoords} from Selection start coords object.\n * @param {CellCoords} to Selection end coords object.\n * @param {CellCoords} highlight Selection cell focus coords object.\n * @example\n * ::: only-for javascript\n * ```js\n * new Handsontable(element, {\n * beforeSelectRows: (from, to, highlight) => {\n * // Extend the row selection by one row up and one row bottom more.\n * from.row = Math.max(from.row - 1, 0);\n * to.row = Math.min(to.row + 1, this.countRows() - 1);\n * }\n * })\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * {\n * // Extend the row selection by one row up and one row bottom more.\n * from.row = Math.max(from.row - 1, 0);\n * to.row = Math.min(to.row + 1, this.countRows() - 1);\n * }}\n * />\n * ```\n * :::\n */\n'beforeSelectRows',\n/**\n * Fired after one or more rows are selected (e.g. during mouse header click or {@link Core#selectRows} API call).\n *\n * @since 14.0.0\n * @event Hooks#afterSelectRows\n * @param {CellCoords} from Selection start coords object.\n * @param {CellCoords} to Selection end coords object.\n * @param {CellCoords} highlight Selection cell focus coords object.\n */\n'afterSelectRows',\n/**\n * Fired after cell meta is changed.\n *\n * @event Hooks#afterSetCellMeta\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {string} key The updated meta key.\n * @param {*} value The updated meta value.\n */\n'afterSetCellMeta',\n/**\n * Fired after cell meta is removed.\n *\n * @event Hooks#afterRemoveCellMeta\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {string} key The removed meta key.\n * @param {*} value Value which was under removed key of cell meta.\n */\n'afterRemoveCellMeta',\n/**\n * Fired after cell data was changed.\n *\n * @event Hooks#afterSetDataAtCell\n * @param {Array} changes An array of changes in format `[[row, column, oldValue, value], ...]`.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n */\n'afterSetDataAtCell',\n/**\n * Fired after cell data was changed.\n * Called only when [`setDataAtRowProp`](@/api/core.md#setdataatrowprop) was executed.\n *\n * @event Hooks#afterSetDataAtRowProp\n * @param {Array} changes An array of changes in format `[[row, prop, oldValue, value], ...]`.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n */\n'afterSetDataAtRowProp',\n/**\n * Fired after cell source data was changed.\n *\n * @event Hooks#afterSetSourceDataAtCell\n * @since 8.0.0\n * @param {Array} changes An array of changes in format `[[row, column, oldValue, value], ...]`.\n * @param {string} [source] String that identifies source of hook call.\n */\n'afterSetSourceDataAtCell',\n/**\n * Fired after a theme is enabled, changed, or disabled.\n *\n * @since 15.0.0\n * @event Hooks#afterSetTheme\n * @param {string|boolean|undefined} themeName The theme name.\n * @param {boolean} firstRun `true` if it's the initial setting of the theme, `false` otherwise.\n */\n'afterSetTheme',\n/**\n * Fired after calling the [`updateSettings`](@/api/core.md#updatesettings) method.\n *\n * @event Hooks#afterUpdateSettings\n * @param {object} newSettings New settings object.\n */\n'afterUpdateSettings',\n/**\n * @description\n * A plugin hook executed after validator function, only if validator function is defined.\n * Validation result is the first parameter. This can be used to determinate if validation passed successfully or not.\n *\n * __Returning false from the callback will mark the cell as invalid__.\n *\n * @event Hooks#afterValidate\n * @param {boolean} isValid `true` if valid, `false` if not.\n * @param {*} value The value in question.\n * @param {number} row Visual row index.\n * @param {string|number} prop Property name / visual column index.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n * @returns {undefined | boolean} If `false` the cell will be marked as invalid, `true` otherwise.\n */\n'afterValidate',\n/**\n * Fired before successful change of language (when proper language code was set).\n *\n * @event Hooks#beforeLanguageChange\n * @since 0.35.0\n * @param {string} languageCode New language code.\n */\n'beforeLanguageChange',\n/**\n * Fired after successful change of language (when proper language code was set).\n *\n * @event Hooks#afterLanguageChange\n * @since 0.35.0\n * @param {string} languageCode New language code.\n */\n'afterLanguageChange',\n/**\n * Fired by {@link Autofill} plugin before populating the data in the autofill feature. This hook is fired when\n * {@link Options#fillHandle} option is enabled.\n *\n * @event Hooks#beforeAutofill\n * @param {Array[]} selectionData Data the autofill operation will start from.\n * @param {CellRange} sourceRange The range values will be filled from.\n * @param {CellRange} targetRange The range new values will be filled into.\n * @param {string} direction Declares the direction of the autofill. Possible values: `up`, `down`, `left`, `right`.\n *\n * @returns {boolean|Array[]} If false, the operation is cancelled. If array of arrays, the returned data\n * will be passed into [`populateFromArray`](@/api/core.md#populatefromarray) instead of the default autofill\n * algorithm's result.\n */\n'beforeAutofill',\n/**\n * Fired by {@link Autofill} plugin after populating the data in the autofill feature. This hook is fired when\n * {@link Options#fillHandle} option is enabled.\n *\n * @event Hooks#afterAutofill\n * @since 8.0.0\n * @param {Array[]} fillData The data that was used to fill the `targetRange`. If `beforeAutofill` was used\n * and returned `[[]]`, this will be the same object that was returned from `beforeAutofill`.\n * @param {CellRange} sourceRange The range values will be filled from.\n * @param {CellRange} targetRange The range new values will be filled into.\n * @param {string} direction Declares the direction of the autofill. Possible values: `up`, `down`, `left`, `right`.\n */\n'afterAutofill',\n/**\n * Fired before aligning the cell contents.\n *\n * @event Hooks#beforeCellAlignment\n * @param {object} stateBefore An object with class names defining the cell alignment.\n * @param {CellRange[]} range An array of `CellRange` coordinates where the alignment will be applied.\n * @param {string} type Type of the alignment - either `horizontal` or `vertical`.\n * @param {string} alignmentClass String defining the alignment class added to the cell.\n * Possible values: `htLeft` , `htCenter`, `htRight`, `htJustify`, `htTop`, `htMiddle`, `htBottom`.\n */\n'beforeCellAlignment',\n/**\n * Fired before one or more cells are changed.\n *\n * Use this hook to silently alter the user's changes before Handsontable re-renders.\n *\n * To ignore the user's changes, use a nullified array or return `false`.\n *\n * @event Hooks#beforeChange\n * @param {Array[]} changes 2D array containing information about each of the edited cells `[[row, prop, oldVal, newVal], ...]`. `row` is a visual row index.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n * @returns {undefined | boolean} If `false` all changes were cancelled, `true` otherwise.\n * @example\n * ::: only-for javascript\n * ```js\n * // to alter a single change, overwrite the value with `changes[i][3]`\n * new Handsontable(element, {\n * beforeChange: (changes, source) => {\n * // [[row, prop, oldVal, newVal], ...]\n * changes[0][3] = 10;\n * }\n * });\n *\n * // to ignore a single change, set `changes[i]` to `null`\n * // or remove `changes[i]` from the array, by using `changes.splice(i, 1)`\n * new Handsontable(element, {\n * beforeChange: (changes, source) => {\n * // [[row, prop, oldVal, newVal], ...]\n * changes[0] = null;\n * }\n * });\n *\n * // to ignore all changes, return `false`\n * // or set the array's length to 0, by using `changes.length = 0`\n * new Handsontable(element, {\n * beforeChange: (changes, source) => {\n * // [[row, prop, oldVal, newVal], ...]\n * return false;\n * }\n * });\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * // to alter a single change, overwrite the desired value with `changes[i][3]`\n * {\n * // [[row, prop, oldVal, newVal], ...]\n * changes[0][3] = 10;\n * }}\n * />\n *\n * // to ignore a single change, set `changes[i]` to `null`\n * // or remove `changes[i]` from the array, by using changes.splice(i, 1).\n * {\n * // [[row, prop, oldVal, newVal], ...]\n * changes[0] = null;\n * }}\n * />\n *\n * // to ignore all changes, return `false`\n * // or set the array's length to 0 (`changes.length = 0`)\n * {\n * // [[row, prop, oldVal, newVal], ...]\n * return false;\n * }}\n * />\n * ```\n * :::\n */\n'beforeChange',\n/**\n * Fired right before rendering the changes.\n *\n * @event Hooks#beforeChangeRender\n * @param {Array[]} changes Array in form of `[row, prop, oldValue, newValue]`.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n */\n'beforeChangeRender',\n/**\n * Fired before drawing the borders.\n *\n * @event Hooks#beforeDrawBorders\n * @param {Array} corners Array specifying the current selection borders.\n * @param {string} borderClassName Specifies the border class name.\n */\n'beforeDrawBorders',\n/**\n * Fired before getting cell settings.\n *\n * @event Hooks#beforeGetCellMeta\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {object} cellProperties Object containing the cell's properties.\n */\n'beforeGetCellMeta',\n/**\n * Fired before cell meta is removed.\n *\n * @event Hooks#beforeRemoveCellMeta\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {string} key The removed meta key.\n * @param {*} value Value which is under removed key of cell meta.\n * @returns {*|boolean} If false is returned the action is canceled.\n */\n'beforeRemoveCellMeta',\n/**\n * Fired before the Handsontable instance is initiated.\n *\n * @event Hooks#beforeInit\n */\n'beforeInit',\n/**\n * Fired before the Walkontable instance is initiated.\n *\n * @event Hooks#beforeInitWalkontable\n * @param {object} walkontableConfig Walkontable configuration object.\n */\n'beforeInitWalkontable',\n/**\n * Fired before Handsontable's [`data`](@/api/options.md#data)\n * gets modified by the [`loadData()`](@/api/core.md#loaddata) method\n * or the [`updateSettings()`](@/api/core.md#updatesettings) method.\n *\n * Read more:\n * - [Binding to data](@/guides/getting-started/binding-to-data/binding-to-data.md)\n * - [Saving data](@/guides/getting-started/saving-data/saving-data.md)\n *\n * @event Hooks#beforeLoadData\n * @since 8.0.0\n * @param {Array} sourceData An [array of arrays](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-objects), that contains Handsontable's data\n * @param {boolean} initialLoad A flag that indicates whether the data was loaded at Handsontable's initialization (`true`) or later (`false`)\n * @param {string} source The source of the call\n * @returns {Array} The returned array will be used as Handsontable's new dataset.\n */\n'beforeLoadData',\n/**\n * Fired before the [`updateData()`](@/api/core.md#updatedata) method\n * modifies Handsontable's [`data`](@/api/options.md#data).\n *\n * Read more:\n * - [Binding to data](@/guides/getting-started/binding-to-data/binding-to-data.md)\n * - [Saving data](@/guides/getting-started/saving-data/saving-data.md)\n *\n * @event Hooks#beforeUpdateData\n * @since 11.1.0\n * @param {Array} sourceData An [array of arrays](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data/binding-to-data.md#array-of-objects), that contains Handsontable's data\n * @param {boolean} initialLoad A flag that indicates whether the data was loaded at Handsontable's initialization (`true`) or later (`false`)\n * @param {string} source The source of the call\n * @returns {Array} The returned array will be used as Handsontable's new dataset.\n */\n'beforeUpdateData',\n/**\n * Hook fired before `keydown` event is handled. It can be used to stop default key bindings.\n *\n * __Note__: To prevent default behavior you need to call `false` in your `beforeKeyDown` handler.\n *\n * @event Hooks#beforeKeyDown\n * @param {Event} event Original DOM event.\n */\n'beforeKeyDown',\n/**\n * Fired after the user clicked a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseDown\n * @param {Event} event The `mousedown` event object.\n * @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell.\n * @param {HTMLTableCellElement} TD TD element.\n * @param {object} controller An object with properties `row`, `column` and `cell`. Each property contains\n * a boolean value that allows or disallows changing the selection for that particular area.\n */\n'beforeOnCellMouseDown',\n/**\n * Fired after the user clicked a cell.\n *\n * @event Hooks#beforeOnCellMouseUp\n * @param {Event} event The `mouseup` event object.\n * @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell.\n * @param {HTMLTableCellElement} TD TD element.\n */\n'beforeOnCellMouseUp',\n/**\n * Fired after the user clicked a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellContextMenu\n * @since 4.1.0\n * @param {Event} event The `contextmenu` event object.\n * @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell.\n * @param {HTMLTableCellElement} TD TD element.\n */\n'beforeOnCellContextMenu',\n/**\n * Fired after the user moved cursor over a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseOver\n * @param {Event} event The `mouseover` event object.\n * @param {CellCoords} coords CellCoords object containing the visual coordinates of the clicked cell.\n * @param {HTMLTableCellElement} TD TD element.\n * @param {object} controller An object with properties `row`, `column` and `cell`. Each property contains\n * a boolean value that allows or disallows changing the selection for that particular area.\n */\n'beforeOnCellMouseOver',\n/**\n * Fired after the user moved cursor out from a cell, but before all the calculations related with it.\n *\n * @event Hooks#beforeOnCellMouseOut\n * @param {Event} event The `mouseout` event object.\n * @param {CellCoords} coords CellCoords object containing the visual coordinates of the leaved cell.\n * @param {HTMLTableCellElement} TD TD element.\n */\n'beforeOnCellMouseOut',\n/**\n * Fired before one or more columns are about to be removed.\n *\n * @event Hooks#beforeRemoveCol\n * @param {number} index Visual index of starter column.\n * @param {number} amount Amount of columns to be removed.\n * @param {number[]} physicalColumns An array of physical columns removed from the data source.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n * @returns {*|boolean} If false is returned the action is canceled.\n */\n'beforeRemoveCol',\n/**\n * Fired when one or more rows are about to be removed.\n *\n * @event Hooks#beforeRemoveRow\n * @param {number} index Visual index of starter row.\n * @param {number} amount Amount of rows to be removed.\n * @param {number[]} physicalRows An array of physical rows removed from the data source.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n * @returns {*|boolean} If false is returned the action is canceled.\n */\n'beforeRemoveRow',\n/**\n * Fired before Handsontable's view-rendering engine is rendered.\n *\n * __Note:__ In Handsontable 9.x and earlier, the `beforeViewRender` hook was named `beforeRender`.\n *\n * @event Hooks#beforeViewRender\n * @since 10.0.0\n * @param {boolean} isForced If set to `true`, the rendering gets triggered by a change of settings, a change of\n * data, or a logic that needs a full Handsontable render cycle.\n * If set to `false`, the rendering gets triggered by scrolling or moving the selection.\n * @param {object} skipRender Object with `skipRender` property, if it is set to `true ` the next rendering cycle will be skipped.\n */\n'beforeViewRender',\n/**\n * Fired after Handsontable's view-rendering engine is rendered,\n * but before redrawing the selection borders and before scroll syncing.\n *\n * __Note:__ In Handsontable 9.x and earlier, the `afterViewRender` hook was named `afterRender`.\n *\n * @event Hooks#afterViewRender\n * @since 10.0.0\n * @param {boolean} isForced If set to `true`, the rendering gets triggered by a change of settings, a change of\n * data, or a logic that needs a full Handsontable render cycle.\n * If set to `false`, the rendering gets triggered by scrolling or moving the selection.\n */\n'afterViewRender',\n/**\n * Fired before Handsontable's view-rendering engine updates the view.\n *\n * The `beforeRender` event is fired right after the Handsontable\n * business logic is executed and right before the rendering engine starts calling\n * the Core logic, renderers, cell meta objects etc. to update the view.\n *\n * @event Hooks#beforeRender\n * @param {boolean} isForced If set to `true`, the rendering gets triggered by a change of settings, a change of\n * data, or a logic that needs a full Handsontable render cycle.\n * If set to `false`, the rendering gets triggered by scrolling or moving the selection.\n */\n'beforeRender',\n/**\n * Fired after Handsontable's view-rendering engine updates the view.\n *\n * @event Hooks#afterRender\n * @param {boolean} isForced If set to `true`, the rendering gets triggered by a change of settings, a change of\n * data, or a logic that needs a full Handsontable render cycle.\n * If set to `false`, the rendering gets triggered by scrolling or moving the selection.\n */\n'afterRender',\n/**\n * When the focus position is moved to the next or previous row caused by the {@link Options#autoWrapRow} option\n * the hook is triggered.\n *\n * @since 14.0.0\n * @event Hooks#beforeRowWrap\n * @param {boolean} isWrapEnabled Tells whether the row wrapping is going to happen.\n * There may be situations where the option does not work even though it is enabled.\n * This is due to the priority of other options that may block the feature.\n * For example, when the {@link Options#minSpareCols} is defined, the {@link Options#autoWrapRow} option is not checked.\n * Thus, row wrapping is off.\n * @param {CellCoords} newCoords The new focus position. It is an object with keys `row` and `col`, where a value of `-1` indicates a header.\n * @param {boolean} isFlipped `true` if the row index was flipped, `false` otherwise.\n * Flipped index means that the user reached the last row and the focus is moved to the first row or vice versa.\n */\n'beforeRowWrap',\n/**\n * When the focus position is moved to the next or previous column caused by the {@link Options#autoWrapCol} option\n * the hook is triggered.\n *\n * @since 14.0.0\n * @event Hooks#beforeColumnWrap\n * @param {boolean} isWrapEnabled Tells whether the column wrapping is going to happen.\n * There may be situations where the option does not work even though it is enabled.\n * This is due to the priority of other options that may block the feature.\n * For example, when the {@link Options#minSpareRows} is defined, the {@link Options#autoWrapCol} option is not checked.\n * Thus, column wrapping is off.\n * @param {CellCoords} newCoords The new focus position. It is an object with keys `row` and `col`, where a value of `-1` indicates a header.\n * @param {boolean} isFlipped `true` if the column index was flipped, `false` otherwise.\n * Flipped index means that the user reached the last column and the focus is moved to the first column or vice versa.\n */\n'beforeColumnWrap',\n/**\n * Fired before cell meta is changed.\n *\n * @event Hooks#beforeSetCellMeta\n * @since 8.0.0\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {string} key The updated meta key.\n * @param {*} value The updated meta value.\n * @returns {boolean|undefined} If false is returned the action is canceled.\n */\n'beforeSetCellMeta',\n/**\n * Fired before setting focus selection.\n *\n * @since 14.3.0\n * @event Hooks#beforeSelectionFocusSet\n * @param {CellCoords} coords CellCoords instance.\n */\n'beforeSelectionFocusSet',\n/**\n * Fired before setting range is started but not finished yet.\n *\n * @event Hooks#beforeSetRangeStartOnly\n * @param {CellCoords} coords `CellCoords` instance.\n */\n'beforeSetRangeStartOnly',\n/**\n * Fired before setting range is started.\n *\n * @event Hooks#beforeSetRangeStart\n * @param {CellCoords} coords `CellCoords` instance.\n */\n'beforeSetRangeStart',\n/**\n * Fired before setting range is ended.\n *\n * @event Hooks#beforeSetRangeEnd\n * @param {CellCoords} coords `CellCoords` instance.\n */\n'beforeSetRangeEnd',\n/**\n * Fired before applying selection coordinates to the renderable coordinates for Walkontable (rendering engine).\n * It occurs even when cell coordinates remain unchanged and activates during cell selection and drag selection.\n * The behavior of Shift+Tab differs from Arrow Left when there's no further movement possible.\n *\n * @since 14.0.0\n * @event Hooks#beforeSelectionHighlightSet\n */\n'beforeSelectionHighlightSet',\n/**\n * Fired before the logic of handling a touch scroll, when user started scrolling on a touch-enabled device.\n *\n * @event Hooks#beforeTouchScroll\n */\n'beforeTouchScroll',\n/**\n * Fired before cell validation, only if validator function is defined. This can be used to manipulate the value\n * of changed cell before it is applied to the validator function.\n *\n * __Note:__ this will not affect values of changes. This will change value *ONLY* for validation.\n *\n * @event Hooks#beforeValidate\n * @param {*} value Value of the cell.\n * @param {number} row Visual row index.\n * @param {string|number} prop Property name / column index.\n * @param {string} [source] String that identifies source of hook call\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n */\n'beforeValidate',\n/**\n * Fired before cell value is rendered into the DOM (through renderer function). This can be used to manipulate the\n * value which is passed to the renderer without modifying the renderer itself.\n *\n * @event Hooks#beforeValueRender\n * @param {*} value Cell value to render.\n * @param {object} cellProperties An object containing the cell properties.\n */\n'beforeValueRender',\n/**\n * Fired after Handsontable instance is constructed (using `new` operator).\n *\n * @event Hooks#construct\n */\n'construct',\n/**\n * Fired after Handsontable instance is initiated but before table is rendered.\n *\n * @event Hooks#init\n */\n'init',\n/**\n * Fired when a column header index is about to be modified by a callback function.\n *\n * @event Hooks#modifyColHeader\n * @param {number} column Visual column header index.\n */\n'modifyColHeader',\n/**\n * Fired when a column width is about to be modified by a callback function.\n *\n * @event Hooks#modifyColWidth\n * @param {number} width Current column width.\n * @param {number} column Visual column index.\n * @param {string} [source] String that identifies source of hook call.\n */\n'modifyColWidth',\n/**\n * Fired when rendering the list of values in the multiple-selection component of the Filters dropdown.\n * The hook allows modifying the displayed values in that component.\n *\n * @since 14.2.0\n * @event Hooks#modifyFiltersMultiSelectValue\n * @param {object} item The item in the list of values.\n * @param {object} meta The cell properties object.\n */\n'modifyFiltersMultiSelectValue',\n/**\n * Fired when focusing a cell or a header element. Allows replacing the element to be focused by returning a\n * different HTML element.\n *\n * @since 14.0.0\n * @event Hooks#modifyFocusedElement\n * @param {number} row Row index.\n * @param {number} column Column index.\n * @param {HTMLElement|undefined} focusedElement The element to be focused. `null` for focusedElement is intended when focused cell is hidden.\n */\n'modifyFocusedElement',\n/**\n * Fired when a row header index is about to be modified by a callback function.\n *\n * @event Hooks#modifyRowHeader\n * @param {number} row Visual row header index.\n */\n'modifyRowHeader',\n/**\n * Fired when a row height is about to be modified by a callback function.\n *\n * @event Hooks#modifyRowHeight\n * @param {number} height Row height.\n * @param {number} row Visual row index.\n * @param {string} [source] String that identifies source of hook call.\n */\n'modifyRowHeight',\n/**\n * Fired when a row height is about to be modified by a callback function. The hook allows to change the row height\n * for the specified overlay type.\n *\n * @since 14.5.0\n * @event Hooks#modifyRowHeightByOverlayName\n * @param {number} height Row height.\n * @param {number} row Visual row index.\n * @param {'inline_start'|'top'|'top_inline_start_corner'|'bottom'|'bottom_inline_start_corner'|'master'} overlayName Overlay name.\n */\n'modifyRowHeightByOverlayName',\n/**\n * Fired when a data was retrieved or modified.\n *\n * @event Hooks#modifyData\n * @param {number} row Physical row index.\n * @param {number} column Visual column index.\n * @param {object} valueHolder Object which contains original value which can be modified by overwriting `.value` property.\n * @param {string} ioMode String which indicates for what operation hook is fired (`get` or `set`).\n */\n'modifyData',\n/**\n * Fired when a data was retrieved or modified from the source data set.\n *\n * @event Hooks#modifySourceData\n * @since 8.0.0\n * @param {number} row Physical row index.\n * @param {number} column Physical column index or property name.\n * @param {object} valueHolder Object which contains original value which can be modified by overwriting `.value` property.\n * @param {string} ioMode String which indicates for what operation hook is fired (`get` or `set`).\n */\n'modifySourceData',\n/**\n * Fired when a data was retrieved or modified.\n *\n * @event Hooks#modifyRowData\n * @param {number} row Physical row index.\n */\n'modifyRowData',\n/**\n * Used to modify the cell coordinates when using the [`getCell`](@/api/core.md#getcell) method, opening editor, getting value from the editor\n * and saving values from the closed editor.\n *\n * @event Hooks#modifyGetCellCoords\n * @since 0.36.0\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @param {boolean} topmost If set to `true`, it returns the TD element from the topmost overlay. For example,\n * if the wanted cell is in the range of fixed rows, it will return a TD element\n * from the `top` overlay.\n * @param {string} source String that identifies how this coords change will be processed. Possible values:\n * `meta` the change will affect the cell meta and data; `render` the change will affect the\n * DOM element that will be returned by the `getCell` method.\n * @returns {undefined|number[]}\n */\n'modifyGetCellCoords',\n/**\n * Used to modify the returned cell coordinates of clicked cells (TD or TH elements).\n *\n * @event Hooks#modifyGetCoordsElement\n * @since 14.6.0\n * @param {number} row Visual row index.\n * @param {number} column Visual column index.\n * @returns {undefined|number[]}\n */\n'modifyGetCoordsElement',\n/**\n * Used to modify the cell coordinates when the table is activated (going into the listen mode).\n *\n * @event Hooks#modifyFocusOnTabNavigation\n * @since 14.0.0\n * @param {'from_above' | 'from_below'} tabActivationDir The browsers Tab navigation direction. Depending on\n * whether the user activated the table from the element above or below, another cell can be selected.\n * @param {CellCoords} visualCoords The coords that will be used to select a cell.\n */\n'modifyFocusOnTabNavigation',\n/**\n * Allows modify the visual row index that is used to retrieve the row header element (TH) before it's\n * highlighted (proper CSS class names are added). Modifying the visual row index allows building a custom\n * implementation of the nested headers feature or other features that require highlighting other DOM\n * elements than that the rendering engine, by default, would have highlighted.\n *\n * @event Hooks#beforeHighlightingRowHeader\n * @since 8.4.0\n * @param {number} row Visual row index.\n * @param {number} headerLevel Column header level (0 = most distant to the table).\n * @param {object} highlightMeta An object that contains additional information about processed selection.\n * @returns {number|undefined}\n */\n'beforeHighlightingRowHeader',\n/**\n * Allows modify the visual column index that is used to retrieve the column header element (TH) before it's\n * highlighted (proper CSS class names are added). Modifying the visual column index allows building a custom\n * implementation of the nested headers feature or other features that require highlighting other DOM\n * elements than that the rendering engine, by default, would have highlighted.\n *\n * @event Hooks#beforeHighlightingColumnHeader\n * @since 8.4.0\n * @param {number} column Visual column index.\n * @param {number} headerLevel Row header level (0 = most distant to the table).\n * @param {object} highlightMeta An object that contains additional information about processed selection.\n * @returns {number|undefined}\n */\n'beforeHighlightingColumnHeader',\n/**\n * Fired by {@link PersistentState} plugin, after loading value, saved under given key, from browser local storage.\n *\n * The `persistentStateLoad` hook is fired even when the {@link Options#persistentState} option is disabled.\n *\n * @event Hooks#persistentStateLoad\n * @param {string} key Key.\n * @param {object} valuePlaceholder Object containing the loaded value under `valuePlaceholder.value` (if no value have been saved, `value` key will be undefined).\n */\n'persistentStateLoad',\n/**\n * Fired by {@link PersistentState} plugin after resetting data from local storage. If no key is given, all values associated with table will be cleared.\n * This hook is fired when {@link Options#persistentState} option is enabled.\n *\n * @event Hooks#persistentStateReset\n * @param {string} [key] Key.\n */\n'persistentStateReset',\n/**\n * Fired by {@link PersistentState} plugin, after saving value under given key in browser local storage.\n *\n * The `persistentStateSave` hook is fired even when the {@link Options#persistentState} option is disabled.\n *\n * @event Hooks#persistentStateSave\n * @param {string} key Key.\n * @param {Mixed} value Value to save.\n */\n'persistentStateSave',\n/**\n * Fired by {@link ColumnSorting} and {@link MultiColumnSorting} plugins before sorting the column. If you return `false` value inside callback for hook, then sorting\n * will be not applied by the Handsontable (useful for server-side sorting).\n *\n * This hook is fired when {@link Options#columnSorting} or {@link Options#multiColumnSorting} option is enabled.\n *\n * @event Hooks#beforeColumnSort\n * @param {Array} currentSortConfig Current sort configuration (for all sorted columns).\n * @param {Array} destinationSortConfigs Destination sort configuration (for all sorted columns).\n * @returns {boolean | undefined} If `false` the column will not be sorted, `true` otherwise.\n */\n'beforeColumnSort',\n/**\n * Fired by {@link ColumnSorting} and {@link MultiColumnSorting} plugins after sorting the column. This hook is fired when {@link Options#columnSorting}\n * or {@link Options#multiColumnSorting} option is enabled.\n *\n * @event Hooks#afterColumnSort\n * @param {Array} currentSortConfig Current sort configuration (for all sorted columns).\n * @param {Array} destinationSortConfigs Destination sort configuration (for all sorted columns).\n */\n'afterColumnSort',\n/**\n * Fired by {@link Autofill} plugin after setting range of autofill. This hook is fired when {@link Options#fillHandle}\n * option is enabled.\n *\n * @event Hooks#modifyAutofillRange\n * @param {Array} startArea Array of visual coordinates of the starting point for the drag-down operation (`[startRow, startColumn, endRow, endColumn]`).\n * @param {Array} entireArea Array of visual coordinates of the entire area of the drag-down operation (`[startRow, startColumn, endRow, endColumn]`).\n */\n'modifyAutofillRange',\n/**\n * Fired to allow modifying the copyable range with a callback function.\n *\n * @event Hooks#modifyCopyableRange\n * @param {Array[]} copyableRanges Array of objects defining copyable cells.\n */\n'modifyCopyableRange',\n/**\n * Fired by {@link CopyPaste} plugin before copying the values to the clipboard and before clearing values of\n * the selected cells. This hook is fired when {@link Options#copyPaste} option is enabled.\n *\n * @event Hooks#beforeCut\n * @param {Array[]} data An array of arrays which contains data to cut.\n * @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n * which will be cut out.\n * @returns {*} If returns `false` then operation of the cutting out is canceled.\n * @example\n * ::: only-for javascript\n * ```js\n * // To disregard a single row, remove it from the array using data.splice(i, 1).\n * new Handsontable(element, {\n * beforeCut: function(data, coords) {\n * // data -> [[1, 2, 3], [4, 5, 6]]\n * data.splice(0, 1);\n * // data -> [[4, 5, 6]]\n * // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n * }\n * });\n * // To cancel a cutting action, just return `false`.\n * new Handsontable(element, {\n * beforeCut: function(data, coords) {\n * return false;\n * }\n * });\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * // To disregard a single row, remove it from the array using data.splice(i, 1).\n * {\n * // data -> [[1, 2, 3], [4, 5, 6]]\n * data.splice(0, 1);\n * // data -> [[4, 5, 6]]\n * // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n * }}\n * />\n * // To cancel a cutting action, just return `false`.\n * {\n * return false;\n * }}\n * />\n * ```\n * :::\n */\n'beforeCut',\n/**\n * Fired by {@link CopyPaste} plugin after data was cut out from the table. This hook is fired when\n * {@link Options#copyPaste} option is enabled.\n *\n * @event Hooks#afterCut\n * @param {Array[]} data An array of arrays with the cut data.\n * @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n * which was cut out.\n */\n'afterCut',\n/**\n * Fired before values are copied to the clipboard.\n *\n * @event Hooks#beforeCopy\n * @param {Array[]} data An array of arrays which contains data to copied.\n * @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n * which will copied.\n * @param {{ columnHeadersCount: number }} copiedHeadersCount (Since 12.3.0) The number of copied column headers.\n * @returns {*} If returns `false` then copying is canceled.\n *\n * @example\n * ::: only-for javascript\n * ```js\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * new Handsontable(document.getElementById('example'), {\n * beforeCopy: (data, coords) => {\n * // data -> [[1, 2, 3], [4, 5, 6]]\n * data.splice(0, 1);\n * // data -> [[4, 5, 6]]\n * // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n * }\n * });\n * ...\n *\n * // To cancel copying, return false from the callback.\n * ...\n * new Handsontable(document.getElementById('example'), {\n * beforeCopy: (data, coords) => {\n * return false;\n * }\n * });\n * ...\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * ...\n * {\n * // data -> [[1, 2, 3], [4, 5, 6]]\n * data.splice(0, 1);\n * // data -> [[4, 5, 6]]\n * // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n * }}\n * />\n * ...\n *\n * // To cancel copying, return false from the callback.\n * ...\n * {\n * return false;\n * }}\n * />\n * ...\n * ```\n * :::\n */\n'beforeCopy',\n/**\n * Fired by {@link CopyPaste} plugin after data are pasted into table. This hook is fired when {@link Options#copyPaste}\n * option is enabled.\n *\n * @event Hooks#afterCopy\n * @param {Array[]} data An array of arrays which contains the copied data.\n * @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n * which was copied.\n * @param {{ columnHeadersCount: number }} copiedHeadersCount (Since 12.3.0) The number of copied column headers.\n */\n'afterCopy',\n/**\n * Fired by {@link CopyPaste} plugin before values are pasted into table. This hook is fired when\n * {@link Options#copyPaste} option is enabled.\n *\n * @event Hooks#beforePaste\n * @param {Array[]} data An array of arrays which contains data to paste.\n * @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n * that correspond to the previously selected area.\n * @returns {*} If returns `false` then pasting is canceled.\n * @example\n * ```js\n * ::: only-for javascript\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * new Handsontable(example, {\n * beforePaste: (data, coords) => {\n * // data -> [[1, 2, 3], [4, 5, 6]]\n * data.splice(0, 1);\n * // data -> [[4, 5, 6]]\n * // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n * }\n * });\n * // To cancel pasting, return false from the callback.\n * new Handsontable(example, {\n * beforePaste: (data, coords) => {\n * return false;\n * }\n * });\n * ```\n * :::\n *\n * ::: only-for react\n * ```jsx\n * // To disregard a single row, remove it from array using data.splice(i, 1).\n * {\n * // data -> [[1, 2, 3], [4, 5, 6]]\n * data.splice(0, 1);\n * // data -> [[4, 5, 6]]\n * // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]\n * }}\n * />\n * // To cancel pasting, return false from the callback.\n * {\n * return false;\n * }}\n * />\n * ```\n * :::\n */\n'beforePaste',\n/**\n * Fired by {@link CopyPaste} plugin after values are pasted into table. This hook is fired when\n * {@link Options#copyPaste} option is enabled.\n *\n * @event Hooks#afterPaste\n * @param {Array[]} data An array of arrays with the pasted data.\n * @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)\n * that correspond to the previously selected area.\n */\n'afterPaste',\n/**\n * Fired by the {@link ManualColumnFreeze} plugin, before freezing a column.\n *\n * @event Hooks#beforeColumnFreeze\n * @since 12.1.0\n * @param {number} column The visual index of the column that is going to freeze.\n * @param {boolean} freezePerformed If `true`: the column is going to freeze. If `false`: the column is not going to freeze (which might happen if the column is already frozen).\n * @returns {boolean|undefined} If `false`: the column is not going to freeze, and the `afterColumnFreeze` hook won't fire.\n */\n'beforeColumnFreeze',\n/**\n * Fired by the {@link ManualColumnFreeze} plugin, right after freezing a column.\n *\n * @event Hooks#afterColumnFreeze\n * @since 12.1.0\n * @param {number} column The visual index of the frozen column.\n * @param {boolean} freezePerformed If `true`: the column got successfully frozen. If `false`: the column didn't get frozen.\n */\n'afterColumnFreeze',\n/**\n * Fired by {@link ManualColumnMove} plugin before change order of the visual indexes. This hook is fired when\n * {@link Options#manualColumnMove} option is enabled.\n *\n * @event Hooks#beforeColumnMove\n * @param {Array} movedColumns Array of visual column indexes to be moved.\n * @param {number} finalIndex Visual column index, being a start index for the moved columns.\n * Points to where the elements will be placed after the moving action.\n * To check visualization of final index please take a look at\n * [documentation](@/guides/columns/column-moving/column-moving.md).\n * @param {number|undefined} dropIndex Visual column index, being a drop index for the moved columns.\n * Points to where we are going to drop the moved elements. To check\n * visualization of drop index please take a look at\n * [documentation](@/guides/columns/column-moving/column-moving.md).\n * It's `undefined` when `dragColumns` function wasn't called.\n * @param {boolean} movePossible Indicates if it's possible to move rows to the desired position.\n * @returns {undefined | boolean} If `false` the column will not be moved, `true` otherwise.\n */\n'beforeColumnMove',\n/**\n * Fired by {@link ManualColumnMove} plugin after changing order of the visual indexes.\n * This hook is fired when {@link Options#manualColumnMove} option is enabled.\n *\n * @event Hooks#afterColumnMove\n * @param {Array} movedColumns Array of visual column indexes to be moved.\n * @param {number} finalIndex Visual column index, being a start index for the moved columns.\n * Points to where the elements will be placed after the moving action.\n * To check visualization of final index please take a look at\n * [documentation](@/guides/columns/column-moving/column-moving.md).\n * @param {number|undefined} dropIndex Visual column index, being a drop index for the moved columns.\n * Points to where we are going to drop the moved elements.\n * To check visualization of drop index please take a look at\n * [documentation](@/guides/columns/column-moving/column-moving.md).\n * It's `undefined` when `dragColumns` function wasn't called.\n * @param {boolean} movePossible Indicates if it was possible to move columns to the desired position.\n * @param {boolean} orderChanged Indicates if order of columns was changed by move.\n */\n'afterColumnMove',\n/**\n * Fired by the {@link ManualColumnFreeze} plugin, before unfreezing a column.\n *\n * @event Hooks#beforeColumnUnfreeze\n * @since 12.1.0\n * @param {number} column The visual index of the column that is going to unfreeze.\n * @param {boolean} unfreezePerformed If `true`: the column is going to unfreeze. If `false`: the column is not going to unfreeze (which might happen if the column is already unfrozen).\n * @returns {boolean|undefined} If `false`: the column is not going to unfreeze, and the `afterColumnUnfreeze` hook won't fire.\n */\n'beforeColumnUnfreeze',\n/**\n * Fired by the {@link ManualColumnFreeze} plugin, right after unfreezing a column.\n *\n * @event Hooks#afterColumnUnfreeze\n * @since 12.1.0\n * @param {number} column The visual index of the unfrozen column.\n * @param {boolean} unfreezePerformed If `true`: the column got successfully unfrozen. If `false`: the column didn't get unfrozen.\n */\n'afterColumnUnfreeze',\n/**\n * Fired by {@link ManualRowMove} plugin before changing the order of the visual indexes. This hook is fired when\n * {@link Options#manualRowMove} option is enabled.\n *\n * @event Hooks#beforeRowMove\n * @param {Array} movedRows Array of visual row indexes to be moved.\n * @param {number} finalIndex Visual row index, being a start index for the moved rows.\n * Points to where the elements will be placed after the moving action.\n * To check visualization of final index please take a look at\n * [documentation](@/guides/rows/row-moving/row-moving.md).\n * @param {number|undefined} dropIndex Visual row index, being a drop index for the moved rows.\n * Points to where we are going to drop the moved elements.\n * To check visualization of drop index please take a look at\n * [documentation](@/guides/rows/row-moving/row-moving.md).\n * It's `undefined` when `dragRows` function wasn't called.\n * @param {boolean} movePossible Indicates if it's possible to move rows to the desired position.\n * @returns {*|boolean} If false is returned the action is canceled.\n */\n'beforeRowMove',\n/**\n * Fired by {@link ManualRowMove} plugin after changing the order of the visual indexes.\n * This hook is fired when {@link Options#manualRowMove} option is enabled.\n *\n * @event Hooks#afterRowMove\n * @param {Array} movedRows Array of visual row indexes to be moved.\n * @param {number} finalIndex Visual row index, being a start index for the moved rows.\n * Points to where the elements will be placed after the moving action.\n * To check visualization of final index please take a look at\n * [documentation](@/guides/rows/row-moving/row-moving.md).\n * @param {number|undefined} dropIndex Visual row index, being a drop index for the moved rows.\n * Points to where we are going to drop the moved elements.\n * To check visualization of drop index please take a look at\n * [documentation](@/guides/rows/row-moving/row-moving.md).\n * It's `undefined` when `dragRows` function wasn't called.\n * @param {boolean} movePossible Indicates if it was possible to move rows to the desired position.\n * @param {boolean} orderChanged Indicates if order of rows was changed by move.\n */\n'afterRowMove',\n/**\n * Fired by {@link ManualColumnResize} plugin before rendering the table with modified column sizes. This hook is\n * fired when {@link Options#manualColumnResize} option is enabled.\n *\n * @event Hooks#beforeColumnResize\n * @param {number} newSize Calculated new column width.\n * @param {number} column Visual index of the resized column.\n * @param {boolean} isDoubleClick Flag that determines whether there was a double-click.\n * @returns {number} Returns a new column size or `undefined`, if column size should be calculated automatically.\n */\n'beforeColumnResize',\n/**\n * Fired by {@link ManualColumnResize} plugin after rendering the table with modified column sizes. This hook is\n * fired when {@link Options#manualColumnResize} option is enabled.\n *\n * @event Hooks#afterColumnResize\n * @param {number} newSize Calculated new column width.\n * @param {number} column Visual index of the resized column.\n * @param {boolean} isDoubleClick Flag that determines whether there was a double-click.\n */\n'afterColumnResize',\n/**\n * Fired by {@link ManualRowResize} plugin before rendering the table with modified row sizes. This hook is\n * fired when {@link Options#manualRowResize} option is enabled.\n *\n * @event Hooks#beforeRowResize\n * @param {number} newSize Calculated new row height.\n * @param {number} row Visual index of the resized row.\n * @param {boolean} isDoubleClick Flag that determines whether there was a double-click.\n * @returns {number|undefined} Returns the new row size or `undefined` if row size should be calculated automatically.\n */\n'beforeRowResize',\n/**\n * Fired by {@link ManualRowResize} plugin after rendering the table with modified row sizes. This hook is\n * fired when {@link Options#manualRowResize} option is enabled.\n *\n * @event Hooks#afterRowResize\n * @param {number} newSize Calculated new row height.\n * @param {number} row Visual index of the resized row.\n * @param {boolean} isDoubleClick Flag that determines whether there was a double-click.\n */\n'afterRowResize',\n/**\n * Fired after getting the column header renderers.\n *\n * @event Hooks#afterGetColumnHeaderRenderers\n * @param {Function[]} renderers An array of the column header renderers.\n */\n'afterGetColumnHeaderRenderers',\n/**\n * Fired after getting the row header renderers.\n *\n * @event Hooks#afterGetRowHeaderRenderers\n * @param {Function[]} renderers An array of the row header renderers.\n */\n'afterGetRowHeaderRenderers',\n/**\n * Fired before applying stretched column width to column.\n *\n * @event Hooks#beforeStretchingColumnWidth\n * @param {number} stretchedWidth Calculated width.\n * @param {number} column Visual column index.\n * @returns {number|undefined} Returns new width which will be applied to the column element.\n */\n'beforeStretchingColumnWidth',\n/**\n * Fired by the [`Filters`](@/api/filters.md) plugin,\n * before a [column filter](@/guides/columns/column-filter/column-filter.md) gets applied.\n *\n * [`beforeFilter`](#beforefilter) takes two arguments: `conditionsStack` and `previousConditionsStack`, both are\n * arrays of objects.\n *\n * Each object represents one of your [column filters](@/api/filters.md#addcondition),\n * and consists of the following properties:\n *\n * | Property | Possible values | Description |\n * | ------------ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |\n * | `column` | Number | A visual index of the column to which the filter will be applied. |\n * | `conditions` | Array of objects | Each object represents one condition. For details, see [`addCondition()`](@/api/filters.md#addcondition). |\n * | `operation` | `'conjunction'` \\| `'disjunction'` \\| `'disjunctionWithExtraCondition'` | An operation to perform on your set of `conditions`. For details, see [`addCondition()`](@/api/filters.md#addcondition). |\n *\n * An example of the format of the `conditionsStack` argument:\n *\n * ```js\n * [\n * {\n * column: 2,\n * conditions: [\n * {name: 'begins_with', args: [['S']]}\n * ],\n * operation: 'conjunction'\n * },\n * {\n * column: 4,\n * conditions: [\n * {name: 'not_empty', args: []}\n * ],\n * operation: 'conjunction'\n * },\n * ]\n * ```\n *\n * To perform server-side filtering (i.e., to not apply filtering to Handsontable's UI),\n * set [`beforeFilter`](#beforefilter) to return `false`:\n *\n * ```js\n * new Handsontable(document.getElementById('example'), {\n * beforeFilter: (conditionsStack) => {\n * return false;\n * }\n * });\n *```\n *\n * Read more:\n * - [Guides: Column filter](@/guides/columns/column-filter/column-filter.md)\n * - [Hooks: `afterFilter`](#afterfilter)\n * - [Options: `filters`](@/api/options.md#filters)\n * - [Plugins: `Filters`](@/api/filters.md)\n * – [Plugin methods: `addCondition()`](@/api/filters.md#addcondition)\n *\n * @event Hooks#beforeFilter\n * @param {object[]} conditionsStack An array of objects with your [column filters](@/api/filters.md#addcondition).\n * @param {object[]|null} previousConditionsStack An array of objects with your previous [column filters](@/api/filters.md#addcondition). It can also be `null` if there was no previous filters applied or the conditions did not change between performing the `filter` action.\n * @returns {boolean} To perform server-side filtering (i.e., to not apply filtering to Handsontable's UI), return `false`.\n */\n'beforeFilter',\n/**\n * Fired by the [`Filters`](@/api/filters.md) plugin,\n * after a [column filter](@/guides/columns/column-filter/column-filter.md) gets applied.\n *\n * [`afterFilter`](#afterfilter) takes one argument (`conditionsStack`), which is an array of objects.\n * Each object represents one of your [column filters](@/api/filters.md#addcondition),\n * and consists of the following properties:\n *\n * | Property | Possible values | Description |\n * | ------------ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |\n * | `column` | Number | A visual index of the column to which the filter was applied. |\n * | `conditions` | Array of objects | Each object represents one condition. For details, see [`addCondition()`](@/api/filters.md#addcondition). |\n * | `operation` | `'conjunction'` \\| `'disjunction'` \\| `'disjunctionWithExtraCondition'` | An operation to perform on your set of `conditions`. For details, see [`addCondition()`](@/api/filters.md#addcondition). |\n *\n * An example of the format of the `conditionsStack` argument:\n *\n * ```js\n * [\n * {\n * column: 2,\n * conditions: [\n * {name: 'begins_with', args: [['S']]}\n * ],\n * operation: 'conjunction'\n * },\n * {\n * column: 4,\n * conditions: [\n * {name: 'not_empty', args: []}\n * ],\n * operation: 'conjunction'\n * },\n * ]\n * ```\n *\n * Read more:\n * - [Guides: Column filter](@/guides/columns/column-filter/column-filter.md)\n * - [Hooks: `beforeFilter`](#beforefilter)\n * - [Options: `filters`](@/api/options.md#filters)\n * - [Plugins: `Filters`](@/api/filters.md)\n * – [Plugin methods: `addCondition()`](@/api/filters.md#addcondition)\n *\n * @event Hooks#afterFilter\n * @param {object[]} conditionsStack An array of objects with your [column filters](@/api/filters.md#addcondition).\n */\n'afterFilter',\n/**\n * Fired by the {@link Formulas} plugin, when any cell value changes.\n *\n * Returns an array of objects that contains:\n * - The addresses (`sheet`, `row`, `col`) and new values (`newValue`) of the changed cells.\n * - The addresses and new values of any cells that had to be recalculated (because their formulas depend on the cells that changed).\n *\n * This hook gets also fired on Handsontable's initialization, returning the addresses and values of all cells.\n *\n * Read more:\n * - [Guides: Formula calculation](@/guides/formulas/formula-calculation/formula-calculation.md)\n * - [HyperFormula documentation: `valuesUpdated`](https://hyperformula.handsontable.com/api/interfaces/listeners.html#valuesupdated)\n *\n * @since 9.0.0\n * @event Hooks#afterFormulasValuesUpdate\n * @param {Array} changes The addresses and new values of all the changed and recalculated cells.\n */\n'afterFormulasValuesUpdate',\n/**\n * Fired when a named expression is added to the Formulas' engine instance.\n *\n * @since 9.0.0\n * @event Hooks#afterNamedExpressionAdded\n * @param {string} namedExpressionName The name of the added expression.\n * @param {Array} changes The values and location of applied changes.\n */\n'afterNamedExpressionAdded',\n/**\n * Fired when a named expression is removed from the Formulas' engine instance.\n *\n * @since 9.0.0\n * @event Hooks#afterNamedExpressionRemoved\n * @param {string} namedExpressionName The name of the removed expression.\n * @param {Array} changes The values and location of applied changes.\n */\n'afterNamedExpressionRemoved',\n/**\n * Fired when a new sheet is added to the Formulas' engine instance.\n *\n * @since 9.0.0\n * @event Hooks#afterSheetAdded\n * @param {string} addedSheetDisplayName The name of the added sheet.\n */\n'afterSheetAdded',\n/**\n * Fired when a sheet in the Formulas' engine instance is renamed.\n *\n * @since 9.0.0\n * @event Hooks#afterSheetRenamed\n * @param {string} oldDisplayName The old name of the sheet.\n * @param {string} newDisplayName The new name of the sheet.\n */\n'afterSheetRenamed',\n/**\n * Fired when a sheet is removed from the Formulas' engine instance.\n *\n * @since 9.0.0\n * @event Hooks#afterSheetRemoved\n * @param {string} removedSheetDisplayName The removed sheet name.\n * @param {Array} changes The values and location of applied changes.\n */\n'afterSheetRemoved',\n/**\n * Fired while retrieving the column header height.\n *\n * @event Hooks#modifyColumnHeaderHeight\n */\n'modifyColumnHeaderHeight',\n/**\n * Fired while retrieving a column header's value.\n *\n * @since 12.3.0\n * @event Hooks#modifyColumnHeaderValue\n * @param {string} value A column header value.\n * @param {number} visualColumnIndex A visual column index.\n * @param {number} [headerLevel=0] Header level index. Accepts positive (`0` to `n`)\n * and negative (`-1` to `-n`) values. For positive values, `0` points to the\n * topmost header. For negative values, `-1` points to the bottom-most\n * header (the header closest to the cells).\n * @returns {string} The column header value to be updated.\n */\n'modifyColumnHeaderValue',\n/**\n * Fired by {@link UndoRedo} plugin before the undo action. Contains information about the action that is being undone.\n * This hook is fired when {@link Options#undo} option is enabled.\n *\n * @event Hooks#beforeUndo\n * @param {object} action The action object. Contains information about the action being undone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n * @returns {*|boolean} If false is returned the action is canceled.\n */\n'beforeUndo',\n/**\n * Fired by {@link UndoRedo} plugin before changing undo stack.\n *\n * @event Hooks#beforeUndoStackChange\n * @since 8.4.0\n * @param {Array} doneActions Stack of actions which may be undone.\n * @param {string} [source] String that identifies source of action\n * ([list of all available sources](@/guides/getting-started/events-and-hooks/events-and-hooks.md#definition-for-source-argument)).\n * @returns {*|boolean} If false is returned the action of changing undo stack is canceled.\n */\n'beforeUndoStackChange',\n/**\n * Fired by {@link UndoRedo} plugin after the undo action. Contains information about the action that is being undone.\n * This hook is fired when {@link Options#undo} option is enabled.\n *\n * @event Hooks#afterUndo\n * @param {object} action The action object. Contains information about the action being undone. The `actionType`\n * property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).\n */\n'afterUndo',\n/**\n * Fired by {@link UndoRedo} plugin after changing undo stack.\n *\n * @event Hooks#afterUndoStackChange\n * @since 8.4.0\n * @param {Array} doneActionsBefore Stack of actions which could be undone before performing new action.\n * @param {Array} doneActionsAfter Stack of actions which can be undone after performing new action.\n */\n'afterUndoStackChange',\n/**\n * Fired by {@link UndoRedo} plugin before the redo action. Contains information about the action that is being redone.\n * This hook is fired when {@link Options#undo} option is enabled.\n *\n * @event Hooks#beforeRedo\n * @param {object} action The action object. Contains information about the action being redone. The `actionType`\n * property of the object specifies the type of the action in a String format (e.g. `'remove_row'`).\n * @returns {*|boolean} If false is returned the action is canceled.\n */\n'beforeRedo',\n/**\n * Fired by {@link UndoRedo} plugin before changing redo stack.\n *\n * @event Hooks#beforeRedoStackChange\n * @since 8.4.0\n * @param {Array} undoneActions Stack of actions which may be redone.\n */\n'beforeRedoStackChange',\n/**\n * Fired by {@link UndoRedo} plugin after the redo action. Contains information about the action that is being redone.\n * This hook is fired when {@link Options#undo} option is enabled.\n *\n * @event Hooks#afterRedo\n * @param {object} action The action object. Contains information about the action being redone. The `actionType`\n * property of the object specifies the type of the action in a String format (e.g. `'remove_row'`).\n */\n'afterRedo',\n/**\n * Fired by {@link UndoRedo} plugin after changing redo stack.\n *\n * @event Hooks#afterRedoStackChange\n * @since 8.4.0\n * @param {Array} undoneActionsBefore Stack of actions which could be redone before performing new action.\n * @param {Array} undoneActionsAfter Stack of actions which can be redone after performing new action.\n */\n'afterRedoStackChange',\n/**\n * Fired while retrieving the row header width.\n *\n * @event Hooks#modifyRowHeaderWidth\n * @param {number} rowHeaderWidth Row header width.\n */\n'modifyRowHeaderWidth',\n/**\n * Fired when the focus of the selection is being modified (e.g. Moving the focus with the enter/tab keys).\n *\n * @since 14.3.0\n * @event Hooks#modifyTransformFocus\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformFocus',\n/**\n * Fired when the start of the selection is being modified (e.g. Moving the selection with the arrow keys).\n *\n * @event Hooks#modifyTransformStart\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformStart',\n/**\n * Fired when the end of the selection is being modified (e.g. Moving the selection with the arrow keys).\n *\n * @event Hooks#modifyTransformEnd\n * @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.\n */\n'modifyTransformEnd',\n/**\n * Fired after the focus of the selection is being modified (e.g. Moving the focus with the enter/tab keys).\n *\n * @since 14.3.0\n * @event Hooks#afterModifyTransformFocus\n * @param {CellCoords} coords Coords of the freshly focused cell.\n * @param {number} rowTransformDir `-1` if trying to focus a cell with a negative row index. `0` otherwise.\n * @param {number} colTransformDir `-1` if trying to focus a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformFocus',\n/**\n * Fired after the start of the selection is being modified (e.g. Moving the selection with the arrow keys).\n *\n * @event Hooks#afterModifyTransformStart\n * @param {CellCoords} coords Coords of the freshly selected cell.\n * @param {number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.\n * @param {number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformStart',\n/**\n * Fired after the end of the selection is being modified (e.g. Moving the selection with the arrow keys).\n *\n * @event Hooks#afterModifyTransformEnd\n * @param {CellCoords} coords Visual coords of the freshly selected cell.\n * @param {number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.\n * @param {number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.\n */\n'afterModifyTransformEnd',\n/**\n * Fired inside the `viewportRowCalculatorOverride` method. Allows modifying the row calculator parameters.\n *\n * @event Hooks#afterViewportRowCalculatorOverride\n * @param {object} calc The row calculator.\n */\n'afterViewportRowCalculatorOverride',\n/**\n * Fired inside the `viewportColumnCalculatorOverride` method. Allows modifying the row calculator parameters.\n *\n * @event Hooks#afterViewportColumnCalculatorOverride\n * @param {object} calc The row calculator.\n */\n'afterViewportColumnCalculatorOverride',\n/**\n * Fired after initializing all the plugins.\n * This hook should be added before Handsontable is initialized.\n *\n * @event Hooks#afterPluginsInitialized\n *\n * @example\n * ```js\n * Handsontable.hooks.add('afterPluginsInitialized', myCallback);\n * ```\n */\n'afterPluginsInitialized',\n/**\n * Fired by {@link HiddenRows} plugin before marking the rows as hidden. Fired only if the {@link Options#hiddenRows} option is enabled.\n * Returning `false` in the callback will prevent the hiding action from completing.\n *\n * @event Hooks#beforeHideRows\n * @param {Array} currentHideConfig Current hide configuration - a list of hidden physical row indexes.\n * @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical row indexes.\n * @param {boolean} actionPossible `true`, if provided row indexes are valid, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the hiding action will not be completed.\n */\n'beforeHideRows',\n/**\n * Fired by {@link HiddenRows} plugin after marking the rows as hidden. Fired only if the {@link Options#hiddenRows} option is enabled.\n *\n * @event Hooks#afterHideRows\n * @param {Array} currentHideConfig Current hide configuration - a list of hidden physical row indexes.\n * @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical row indexes.\n * @param {boolean} actionPossible `true`, if provided row indexes are valid, `false` otherwise.\n * @param {boolean} stateChanged `true`, if the action affected any non-hidden rows, `false` otherwise.\n */\n'afterHideRows',\n/**\n * Fired by {@link HiddenRows} plugin before marking the rows as not hidden. Fired only if the {@link Options#hiddenRows} option is enabled.\n * Returning `false` in the callback will prevent the row revealing action from completing.\n *\n * @event Hooks#beforeUnhideRows\n * @param {Array} currentHideConfig Current hide configuration - a list of hidden physical row indexes.\n * @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical row indexes.\n * @param {boolean} actionPossible `true`, if provided row indexes are valid, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the revealing action will not be completed.\n */\n'beforeUnhideRows',\n/**\n * Fired by {@link HiddenRows} plugin after marking the rows as not hidden. Fired only if the {@link Options#hiddenRows} option is enabled.\n *\n * @event Hooks#afterUnhideRows\n * @param {Array} currentHideConfig Current hide configuration - a list of hidden physical row indexes.\n * @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical row indexes.\n * @param {boolean} actionPossible `true`, if provided row indexes are valid, `false` otherwise.\n * @param {boolean} stateChanged `true`, if the action affected any hidden rows, `false` otherwise.\n */\n'afterUnhideRows',\n/**\n * Fired by {@link HiddenColumns} plugin before marking the columns as hidden. Fired only if the {@link Options#hiddenColumns} option is enabled.\n * Returning `false` in the callback will prevent the hiding action from completing.\n *\n * @event Hooks#beforeHideColumns\n * @param {Array} currentHideConfig Current hide configuration - a list of hidden physical column indexes.\n * @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical column indexes.\n * @param {boolean} actionPossible `true`, if the provided column indexes are valid, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the hiding action will not be completed.\n */\n'beforeHideColumns',\n/**\n * Fired by {@link HiddenColumns} plugin after marking the columns as hidden. Fired only if the {@link Options#hiddenColumns} option is enabled.\n *\n * @event Hooks#afterHideColumns\n * @param {Array} currentHideConfig Current hide configuration - a list of hidden physical column indexes.\n * @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical column indexes.\n * @param {boolean} actionPossible `true`, if the provided column indexes are valid, `false` otherwise.\n * @param {boolean} stateChanged `true`, if the action affected any non-hidden columns, `false` otherwise.\n */\n'afterHideColumns',\n/**\n * Fired by {@link HiddenColumns} plugin before marking the columns as not hidden. Fired only if the {@link Options#hiddenColumns} option is enabled.\n * Returning `false` in the callback will prevent the column revealing action from completing.\n *\n * @event Hooks#beforeUnhideColumns\n * @param {Array} currentHideConfig Current hide configuration - a list of hidden physical column indexes.\n * @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical column indexes.\n * @param {boolean} actionPossible `true`, if the provided column indexes are valid, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the hiding action will not be completed.\n */\n'beforeUnhideColumns',\n/**\n * Fired by {@link HiddenColumns} plugin after marking the columns as not hidden. Fired only if the {@link Options#hiddenColumns} option is enabled.\n *\n * @event Hooks#afterUnhideColumns\n * @param {Array} currentHideConfig Current hide configuration - a list of hidden physical column indexes.\n * @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical column indexes.\n * @param {boolean} actionPossible `true`, if the provided column indexes are valid, `false` otherwise.\n * @param {boolean} stateChanged `true`, if the action affected any hidden columns, `false` otherwise.\n */\n'afterUnhideColumns',\n/**\n * Fired by {@link TrimRows} plugin before trimming rows. This hook is fired when {@link Options#trimRows} option is enabled.\n *\n * @event Hooks#beforeTrimRow\n * @param {Array} currentTrimConfig Current trim configuration - a list of trimmed physical row indexes.\n * @param {Array} destinationTrimConfig Destination trim configuration - a list of trimmed physical row indexes.\n * @param {boolean} actionPossible `true`, if all of the row indexes are withing the bounds of the table, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the trimming action will not be completed.\n */\n'beforeTrimRow',\n/**\n * Fired by {@link TrimRows} plugin after trimming rows. This hook is fired when {@link Options#trimRows} option is enabled.\n *\n * @event Hooks#afterTrimRow\n * @param {Array} currentTrimConfig Current trim configuration - a list of trimmed physical row indexes.\n * @param {Array} destinationTrimConfig Destination trim configuration - a list of trimmed physical row indexes.\n * @param {boolean} actionPossible `true`, if all of the row indexes are withing the bounds of the table, `false` otherwise.\n * @param {boolean} stateChanged `true`, if the action affected any non-trimmed rows, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the trimming action will not be completed.\n */\n'afterTrimRow',\n/**\n * Fired by {@link TrimRows} plugin before untrimming rows. This hook is fired when {@link Options#trimRows} option is enabled.\n *\n * @event Hooks#beforeUntrimRow\n * @param {Array} currentTrimConfig Current trim configuration - a list of trimmed physical row indexes.\n * @param {Array} destinationTrimConfig Destination trim configuration - a list of trimmed physical row indexes.\n * @param {boolean} actionPossible `true`, if all of the row indexes are withing the bounds of the table, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the untrimming action will not be completed.\n */\n'beforeUntrimRow',\n/**\n * Fired by {@link TrimRows} plugin after untrimming rows. This hook is fired when {@link Options#trimRows} option is enabled.\n *\n * @event Hooks#afterUntrimRow\n * @param {Array} currentTrimConfig Current trim configuration - a list of trimmed physical row indexes.\n * @param {Array} destinationTrimConfig Destination trim configuration - a list of trimmed physical row indexes.\n * @param {boolean} actionPossible `true`, if all of the row indexes are withing the bounds of the table, `false` otherwise.\n * @param {boolean} stateChanged `true`, if the action affected any trimmed rows, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the untrimming action will not be completed.\n */\n'afterUntrimRow',\n/**\n * Fired by {@link DropdownMenu} plugin before opening the dropdown menu. This hook is fired when {@link Options#dropdownMenu}\n * option is enabled.\n *\n * @event Hooks#beforeDropdownMenuShow\n * @param {DropdownMenu} dropdownMenu The `DropdownMenu` instance.\n */\n'beforeDropdownMenuShow',\n/**\n * Fired by {@link DropdownMenu} plugin after opening the Dropdown Menu. This hook is fired when {@link Options#dropdownMenu}\n * option is enabled.\n *\n * @event Hooks#afterDropdownMenuShow\n * @param {DropdownMenu} dropdownMenu The `DropdownMenu` instance.\n */\n'afterDropdownMenuShow',\n/**\n * Fired by {@link DropdownMenu} plugin after hiding the Dropdown Menu. This hook is fired when {@link Options#dropdownMenu}\n * option is enabled.\n *\n * @event Hooks#afterDropdownMenuHide\n * @param {DropdownMenu} instance The `DropdownMenu` instance.\n */\n'afterDropdownMenuHide',\n/**\n * Fired by {@link NestedRows} plugin before adding a children to the `NestedRows` structure. This hook is fired when\n * {@link Options#nestedRows} option is enabled.\n *\n * @event Hooks#beforeAddChild\n * @param {object} parent The parent object.\n * @param {object|undefined} element The element added as a child. If `undefined`, a blank child was added.\n * @param {number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.\n */\n'beforeAddChild',\n/**\n * Fired by {@link NestedRows} plugin after adding a children to the `NestedRows` structure. This hook is fired when\n * {@link Options#nestedRows} option is enabled.\n *\n * @event Hooks#afterAddChild\n * @param {object} parent The parent object.\n * @param {object|undefined} element The element added as a child. If `undefined`, a blank child was added.\n * @param {number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.\n */\n'afterAddChild',\n/**\n * Fired by {@link NestedRows} plugin before detaching a child from its parent. This hook is fired when\n * {@link Options#nestedRows} option is enabled.\n *\n * @event Hooks#beforeDetachChild\n * @param {object} parent An object representing the parent from which the element is to be detached.\n * @param {object} element The detached element.\n */\n'beforeDetachChild',\n/**\n * Fired by {@link NestedRows} plugin after detaching a child from its parent. This hook is fired when\n * {@link Options#nestedRows} option is enabled.\n *\n * @event Hooks#afterDetachChild\n * @param {object} parent An object representing the parent from which the element was detached.\n * @param {object} element The detached element.\n * @param {number} finalElementPosition The final row index of the detached element.\n */\n'afterDetachChild',\n/**\n * Fired before the editor is opened and rendered.\n *\n * @since 14.2.0\n * @event Hooks#beforeBeginEditing\n * @param {number} row Visual row index of the edited cell.\n * @param {number} column Visual column index of the edited cell.\n * @param {*} initialValue The initial editor value.\n * @param {MouseEvent | KeyboardEvent} event The event which was responsible for opening the editor.\n * @param {boolean} fullEditMode `true` if the editor is opened in full edit mode, `false` otherwise.\n * Editor opened in full edit mode does not close after pressing Arrow keys.\n * @returns {boolean | undefined} If the callback returns `false,` the editor won't be opened after\n * the mouse double click or after pressing the Enter key. Returning `undefined` (or other value\n * than boolean) will result in default behavior, which disallows opening an editor for non-contiguous\n * selection (while pressing Ctrl/Cmd) and for multiple selected cells (while pressing SHIFT).\n * Returning `true` removes those restrictions.\n */\n'beforeBeginEditing',\n/**\n * Fired after the editor is opened and rendered.\n *\n * @event Hooks#afterBeginEditing\n * @param {number} row Visual row index of the edited cell.\n * @param {number} column Visual column index of the edited cell.\n */\n'afterBeginEditing',\n/**\n * Fired by {@link MergeCells} plugin before cell merging. This hook is fired when {@link Options#mergeCells}\n * option is enabled.\n *\n * @event Hooks#beforeMergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'beforeMergeCells',\n/**\n * Fired by {@link MergeCells} plugin after cell merging. This hook is fired when {@link Options#mergeCells}\n * option is enabled.\n *\n * @event Hooks#afterMergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {object} mergeParent The parent collection of the provided cell range.\n * @param {boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'afterMergeCells',\n/**\n * Fired by {@link MergeCells} plugin before unmerging the cells. This hook is fired when {@link Options#mergeCells}\n * option is enabled.\n *\n * @event Hooks#beforeUnmergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'beforeUnmergeCells',\n/**\n * Fired by {@link MergeCells} plugin after unmerging the cells. This hook is fired when {@link Options#mergeCells}\n * option is enabled.\n *\n * @event Hooks#afterUnmergeCells\n * @param {CellRange} cellRange Selection cell range.\n * @param {boolean} [auto=false] `true` if called automatically by the plugin.\n */\n'afterUnmergeCells',\n/**\n * Fired after the table was switched into listening mode. This allows Handsontable to capture keyboard events and\n * respond in the right way.\n *\n * @event Hooks#afterListen\n */\n'afterListen',\n/**\n * Fired after the table was switched off from the listening mode. This makes the Handsontable inert for any\n * keyboard events.\n *\n * @event Hooks#afterUnlisten\n */\n'afterUnlisten',\n/**\n * Fired after the window was resized or the size of the Handsontable root element was changed.\n *\n * @event Hooks#afterRefreshDimensions\n * @param {{ width: number, height: number }} previousDimensions Previous dimensions of the container.\n * @param {{ width: number, height: number }} currentDimensions Current dimensions of the container.\n * @param {boolean} stateChanged `true`, if the container was re-render, `false` otherwise.\n */\n'afterRefreshDimensions',\n/**\n * Cancellable hook, called after resizing a window or after detecting size change of the\n * Handsontable root element, but before redrawing a table.\n *\n * @event Hooks#beforeRefreshDimensions\n * @param {{ width: number, height: number }} previousDimensions Previous dimensions of the container.\n * @param {{ width: number, height: number }} currentDimensions Current dimensions of the container.\n * @param {boolean} actionPossible `true`, if current and previous dimensions are different, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the refresh action will not be completed.\n */\n'beforeRefreshDimensions',\n/**\n * Fired by {@link CollapsibleColumns} plugin before columns collapse. This hook is fired when {@link Options#collapsibleColumns} option is enabled.\n *\n * @event Hooks#beforeColumnCollapse\n * @since 8.0.0\n * @param {Array} currentCollapsedColumns Current collapsible configuration - a list of collapsible physical column indexes.\n * @param {Array} destinationCollapsedColumns Destination collapsible configuration - a list of collapsible physical column indexes.\n * @param {boolean} collapsePossible `true`, if all of the column indexes are withing the bounds of the collapsed sections, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the collapsing action will not be completed.\n */\n'beforeColumnCollapse',\n/**\n * Fired by {@link CollapsibleColumns} plugin before columns collapse. This hook is fired when {@link Options#collapsibleColumns} option is enabled.\n *\n * @event Hooks#afterColumnCollapse\n * @since 8.0.0\n * @param {Array} currentCollapsedColumns Current collapsible configuration - a list of collapsible physical column indexes.\n * @param {Array} destinationCollapsedColumns Destination collapsible configuration - a list of collapsible physical column indexes.\n * @param {boolean} collapsePossible `true`, if all of the column indexes are withing the bounds of the collapsed sections, `false` otherwise.\n * @param {boolean} successfullyCollapsed `true`, if the action affected any non-collapsible column, `false` otherwise.\n */\n'afterColumnCollapse',\n/**\n * Fired by {@link CollapsibleColumns} plugin before columns expand. This hook is fired when {@link Options#collapsibleColumns} option is enabled.\n *\n * @event Hooks#beforeColumnExpand\n * @since 8.0.0\n * @param {Array} currentCollapsedColumns Current collapsible configuration - a list of collapsible physical column indexes.\n * @param {Array} destinationCollapsedColumns Destination collapsible configuration - a list of collapsible physical column indexes.\n * @param {boolean} expandPossible `true`, if all of the column indexes are withing the bounds of the collapsed sections, `false` otherwise.\n * @returns {undefined|boolean} If the callback returns `false`, the expanding action will not be completed.\n */\n'beforeColumnExpand',\n/**\n * Fired by {@link CollapsibleColumns} plugin before columns expand. This hook is fired when {@link Options#collapsibleColumns} option is enabled.\n *\n * @event Hooks#afterColumnExpand\n * @since 8.0.0\n * @param {Array} currentCollapsedColumns Current collapsible configuration - a list of collapsible physical column indexes.\n * @param {Array} destinationCollapsedColumns Destination collapsible configuration - a list of collapsible physical column indexes.\n * @param {boolean} expandPossible `true`, if all of the column indexes are withing the bounds of the collapsed sections, `false` otherwise.\n * @param {boolean} successfullyExpanded `true`, if the action affected any non-collapsible column, `false` otherwise.\n */\n'afterColumnExpand',\n/**\n * Fired by {@link AutoColumnSize} plugin within SampleGenerator utility.\n *\n * @event Hooks#modifyAutoColumnSizeSeed\n * @since 8.4.0\n * @param {string|undefined} seed Seed ID, unique name to categorize samples.\n * @param {object} cellProperties Object containing the cell properties.\n * @param {*} cellValue Value of the cell.\n */\n'modifyAutoColumnSizeSeed'];\n\n/**\n * The list of the hooks which are removed from the API. The warning message is printed out in\n * the developer console when the hook is used.\n *\n * The Map key is represented by hook name and its value points to the Handsontable version\n * in which it was removed.\n *\n * @type {Map}\n */\nconst REMOVED_HOOKS = new Map([['modifyRow', '8.0.0'], ['modifyCol', '8.0.0'], ['unmodifyRow', '8.0.0'], ['unmodifyCol', '8.0.0'], ['skipLengthCache', '8.0.0'], ['hiddenColumn', '8.0.0'], ['hiddenRow', '8.0.0']]);\n\n/* eslint-disable jsdoc/require-description-complete-sentence */\n/**\n * The list of the hooks which are deprecated. The warning message is printed out in\n * the developer console when the hook is used.\n *\n * The Map key is represented by hook name and its value keeps message which whould be\n * printed out when the hook is used.\n *\n * Usage:\n * ```js\n * ...\n * New Map([\n * ['beforeColumnExpand', 'The plugin hook \"beforeColumnExpand\" is deprecated. Use \"beforeColumnExpand2\" instead.'],\n * ])\n * ...\n * ```\n *\n *\n * @type {Map}\n */\n/* eslint-enable jsdoc/require-description-complete-sentence */\nconst DEPRECATED_HOOKS = new Map([[]]);\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/hooks/constants.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/hooks/index.mjs":
/*!********************************************************!*\
!*** ./node_modules/handsontable/core/hooks/index.mjs ***!
\********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Hooks: () => (/* binding */ Hooks),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var _helpers_array_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../helpers/array.mjs */ \"./node_modules/handsontable/helpers/array.mjs\");\n/* harmony import */ var _helpers_string_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../helpers/string.mjs */ \"./node_modules/handsontable/helpers/string.mjs\");\n/* harmony import */ var _helpers_console_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../helpers/console.mjs */ \"./node_modules/handsontable/helpers/console.mjs\");\n/* harmony import */ var _helpers_templateLiteralTag_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../helpers/templateLiteralTag.mjs */ \"./node_modules/handsontable/helpers/templateLiteralTag.mjs\");\n/* harmony import */ var _helpers_function_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../helpers/function.mjs */ \"./node_modules/handsontable/helpers/function.mjs\");\n/* harmony import */ var _constants_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./constants.mjs */ \"./node_modules/handsontable/core/hooks/constants.mjs\");\n/* harmony import */ var _bucket_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bucket.mjs */ \"./node_modules/handsontable/core/hooks/bucket.mjs\");\n\n\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n\n/**\n * Template warning message for removed hooks.\n *\n * @type {string}\n */\nconst REMOVED_MESSAGE = (0,_helpers_templateLiteralTag_mjs__WEBPACK_IMPORTED_MODULE_2__.toSingleLine)`The plugin hook \"[hookName]\" was removed in Handsontable [removedInVersion].\\x20\n Please consult release notes https://github.com/handsontable/handsontable/releases/tag/[removedInVersion] to\\x20\n learn about the migration path.`;\nclass Hooks {\n constructor() {\n /**\n * @type {HooksBucket}\n */\n _defineProperty(this, \"globalBucket\", new _bucket_mjs__WEBPACK_IMPORTED_MODULE_3__.HooksBucket());\n }\n static getSingleton() {\n return getGlobalSingleton();\n }\n /**\n * Get hook bucket based on the context of the object or if argument is missing, get the global hook bucket.\n *\n * @param {object} [context=null] A Handsontable instance.\n * @returns {HooksBucket} Returns a global or Handsontable instance bucket.\n */\n getBucket() {\n let context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n if (context) {\n if (!context.pluginHookBucket) {\n context.pluginHookBucket = new _bucket_mjs__WEBPACK_IMPORTED_MODULE_3__.HooksBucket();\n }\n return context.pluginHookBucket;\n }\n return this.globalBucket;\n }\n\n /**\n * Adds a listener (globally or locally) to a specified hook name.\n * If the `context` parameter is provided, the hook will be added only to the instance it references.\n * Otherwise, the callback will be used every time the hook fires on any Handsontable instance.\n * You can provide an array of callback functions as the `callback` argument, this way they will all be fired\n * once the hook is triggered.\n *\n * @param {string} key Hook name.\n * @param {Function|Function[]} callback Callback function or an array of functions.\n * @param {object} [context=null] The context for the hook callback to be added - a Handsontable instance or leave empty.\n * @param {number} [orderIndex] Order index of the callback.\n * If > 0, the callback will be added after the others, for example, with an index of 1, the callback will be added before the ones with an index of 2, 3, etc., but after the ones with an index of 0 and lower.\n * If < 0, the callback will be added before the others, for example, with an index of -1, the callback will be added after the ones with an index of -2, -3, etc., but before the ones with an index of 0 and higher.\n * If 0 or no order index is provided, the callback will be added between the \"negative\" and \"positive\" indexes.\n * @returns {Hooks} Instance of Hooks.\n *\n * @example\n * ```js\n * // single callback, added locally\n * Handsontable.hooks.add('beforeInit', myCallback, hotInstance);\n *\n * // single callback, added globally\n * Handsontable.hooks.add('beforeInit', myCallback);\n *\n * // multiple callbacks, added locally\n * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback], hotInstance);\n *\n * // multiple callbacks, added globally\n * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback]);\n * ```\n */\n add(key, callback) {\n let context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n let orderIndex = arguments.length > 3 ? arguments[3] : undefined;\n if (Array.isArray(callback)) {\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_4__.arrayEach)(callback, c => this.add(key, c, context));\n } else {\n if (_constants_mjs__WEBPACK_IMPORTED_MODULE_5__.REMOVED_HOOKS.has(key)) {\n (0,_helpers_console_mjs__WEBPACK_IMPORTED_MODULE_6__.warn)((0,_helpers_string_mjs__WEBPACK_IMPORTED_MODULE_7__.substitute)(REMOVED_MESSAGE, {\n hookName: key,\n removedInVersion: _constants_mjs__WEBPACK_IMPORTED_MODULE_5__.REMOVED_HOOKS.get(key)\n }));\n }\n if (_constants_mjs__WEBPACK_IMPORTED_MODULE_5__.DEPRECATED_HOOKS.has(key)) {\n (0,_helpers_console_mjs__WEBPACK_IMPORTED_MODULE_6__.warn)(_constants_mjs__WEBPACK_IMPORTED_MODULE_5__.DEPRECATED_HOOKS.get(key));\n }\n this.getBucket(context).add(key, callback, {\n orderIndex,\n runOnce: false\n });\n }\n return this;\n }\n\n /**\n * Adds a listener to a specified hook. After the hook runs this listener will be automatically removed from the bucket.\n *\n * @param {string} key Hook/Event name.\n * @param {Function|Function[]} callback Callback function.\n * @param {object} [context=null] A Handsontable instance.\n * @param {number} [orderIndex] Order index of the callback.\n * If > 0, the callback will be added after the others, for example, with an index of 1, the callback will be added before the ones with an index of 2, 3, etc., but after the ones with an index of 0 and lower.\n * If < 0, the callback will be added before the others, for example, with an index of -1, the callback will be added after the ones with an index of -2, -3, etc., but before the ones with an index of 0 and higher.\n * If 0 or no order index is provided, the callback will be added between the \"negative\" and \"positive\" indexes.\n * @returns {Hooks} Instance of Hooks.\n *\n * @example\n * ```js\n * Handsontable.hooks.once('beforeInit', myCallback, hotInstance);\n * ```\n */\n once(key, callback) {\n let context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n let orderIndex = arguments.length > 3 ? arguments[3] : undefined;\n if (Array.isArray(callback)) {\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_4__.arrayEach)(callback, c => this.once(key, c, context));\n } else {\n this.getBucket(context).add(key, callback, {\n orderIndex,\n runOnce: true\n });\n }\n return this;\n }\n\n /**\n * Adds a listener to a specified hook. The added hook stays in the bucket at specified index position even after\n * adding another one with the same hook name.\n *\n * @param {string} key Hook/Event name.\n * @param {Function|Function[]} callback Callback function.\n * @param {object} [context=null] A Handsontable instance.\n * @returns {Hooks} Instance of Hooks.\n *\n * @example\n * ```js\n * Handsontable.hooks.addAsFixed('beforeInit', myCallback, hotInstance);\n * ```\n */\n addAsFixed(key, callback) {\n let context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n if (Array.isArray(callback)) {\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_4__.arrayEach)(callback, c => this.addAsFixed(key, c, context));\n } else {\n this.getBucket(context).add(key, callback, {\n initialHook: true\n });\n }\n return this;\n }\n\n /**\n * Removes a listener from a hook with a given name. If the `context` argument is provided, it removes a listener from a local hook assigned to the given Handsontable instance.\n *\n * @param {string} key Hook/Event name.\n * @param {Function} callback Callback function (needs the be the function that was previously added to the hook).\n * @param {object} [context=null] Handsontable instance.\n * @returns {boolean} Returns `true` if hook was removed, `false` otherwise.\n *\n * @example\n * ```js\n * Handsontable.hooks.remove('beforeInit', myCallback);\n * ```\n */\n remove(key, callback) {\n let context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n return this.getBucket(context).remove(key, callback);\n }\n\n /**\n * Checks whether there are any registered listeners for the provided hook name.\n * If the `context` parameter is provided, it only checks for listeners assigned to the given Handsontable instance.\n *\n * @param {string} key Hook name.\n * @param {object} [context=null] A Handsontable instance.\n * @returns {boolean} `true` for success, `false` otherwise.\n */\n has(key) {\n let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n return this.getBucket(context).has(key);\n }\n\n /**\n * Runs all local and global callbacks assigned to the hook identified by the `key` parameter.\n * It returns either a return value from the last called callback or the first parameter (`p1`) passed to the `run` function.\n *\n * @param {object} context Handsontable instance.\n * @param {string} key Hook/Event name.\n * @param {*} [p1] Parameter to be passed as an argument to the callback function.\n * @param {*} [p2] Parameter to be passed as an argument to the callback function.\n * @param {*} [p3] Parameter to be passed as an argument to the callback function.\n * @param {*} [p4] Parameter to be passed as an argument to the callback function.\n * @param {*} [p5] Parameter to be passed as an argument to the callback function.\n * @param {*} [p6] Parameter to be passed as an argument to the callback function.\n * @returns {*} Either a return value from the last called callback or `p1`.\n *\n * @example\n * ```js\n * Handsontable.hooks.run(hot, 'beforeInit');\n * ```\n */\n run(context, key, p1, p2, p3, p4, p5, p6) {\n {\n const globalHandlers = this.getBucket().getHooks(key);\n const length = globalHandlers ? globalHandlers.length : 0;\n let index = 0;\n if (length) {\n // Do not optimize this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.\n while (index < length) {\n if (!globalHandlers[index] || globalHandlers[index].skip) {\n index += 1;\n /* eslint-disable no-continue */\n continue;\n }\n const res = (0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_8__.fastCall)(globalHandlers[index].callback, context, p1, p2, p3, p4, p5, p6);\n if (res !== undefined) {\n // eslint-disable-next-line no-param-reassign\n p1 = res;\n }\n if (globalHandlers[index] && globalHandlers[index].runOnce) {\n this.remove(key, globalHandlers[index].callback);\n }\n index += 1;\n }\n }\n }\n {\n const localHandlers = this.getBucket(context).getHooks(key);\n const length = localHandlers ? localHandlers.length : 0;\n let index = 0;\n if (length) {\n // Do not optimize this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.\n while (index < length) {\n if (!localHandlers[index] || localHandlers[index].skip) {\n index += 1;\n /* eslint-disable no-continue */\n continue;\n }\n const res = (0,_helpers_function_mjs__WEBPACK_IMPORTED_MODULE_8__.fastCall)(localHandlers[index].callback, context, p1, p2, p3, p4, p5, p6);\n if (res !== undefined) {\n // eslint-disable-next-line no-param-reassign\n p1 = res;\n }\n if (localHandlers[index] && localHandlers[index].runOnce) {\n this.remove(key, localHandlers[index].callback, context);\n }\n index += 1;\n }\n }\n }\n return p1;\n }\n\n /**\n * Destroy all listeners connected to the context. If no context is provided, the global listeners will be destroyed.\n *\n * @param {object} [context=null] A Handsontable instance.\n * @example\n * ```js\n * // destroy the global listeners\n * Handsontable.hooks.destroy();\n *\n * // destroy the local listeners\n * Handsontable.hooks.destroy(hotInstance);\n * ```\n */\n destroy() {\n let context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n this.getBucket(context).destroy();\n }\n\n /**\n * Registers a hook name (adds it to the list of the known hook names). Used by plugins.\n * It is not necessary to call register, but if you use it, your plugin hook will be used returned by\n * the `getRegistered` method. (which itself is used in the [demo](@/guides/getting-started/events-and-hooks/events-and-hooks.md)).\n *\n * @param {string} key The hook name.\n *\n * @example\n * ```js\n * Handsontable.hooks.register('myHook');\n * ```\n */\n register(key) {\n if (!this.isRegistered(key)) {\n _constants_mjs__WEBPACK_IMPORTED_MODULE_5__.REGISTERED_HOOKS.push(key);\n }\n }\n\n /**\n * Deregisters a hook name (removes it from the list of known hook names).\n *\n * @param {string} key The hook name.\n *\n * @example\n * ```js\n * Handsontable.hooks.deregister('myHook');\n * ```\n */\n deregister(key) {\n if (this.isRegistered(key)) {\n _constants_mjs__WEBPACK_IMPORTED_MODULE_5__.REGISTERED_HOOKS.splice(_constants_mjs__WEBPACK_IMPORTED_MODULE_5__.REGISTERED_HOOKS.indexOf(key), 1);\n }\n }\n\n /**\n * Returns a boolean value depending on if a hook by such name has been removed or deprecated.\n *\n * @param {string} hookName The hook name to check.\n * @returns {boolean} Returns `true` if the provided hook name was marked as deprecated or\n * removed from API, `false` otherwise.\n * @example\n * ```js\n * Handsontable.hooks.isDeprecated('skipLengthCache');\n *\n * // Results:\n * true\n * ```\n */\n isDeprecated(hookName) {\n return _constants_mjs__WEBPACK_IMPORTED_MODULE_5__.DEPRECATED_HOOKS.has(hookName) || _constants_mjs__WEBPACK_IMPORTED_MODULE_5__.REMOVED_HOOKS.has(hookName);\n }\n\n /**\n * Returns a boolean depending on if a hook by such name has been registered.\n *\n * @param {string} hookName The hook name to check.\n * @returns {boolean} `true` for success, `false` otherwise.\n * @example\n * ```js\n * Handsontable.hooks.isRegistered('beforeInit');\n *\n * // Results:\n * true\n * ```\n */\n isRegistered(hookName) {\n return _constants_mjs__WEBPACK_IMPORTED_MODULE_5__.REGISTERED_HOOKS.indexOf(hookName) >= 0;\n }\n\n /**\n * Returns an array of registered hooks.\n *\n * @returns {Array} An array of registered hooks.\n *\n * @example\n * ```js\n * Handsontable.hooks.getRegistered();\n *\n * // Results:\n * [\n * ...\n * 'beforeInit',\n * 'beforeRender',\n * 'beforeSetRangeEnd',\n * 'beforeDrawBorders',\n * 'beforeChange',\n * ...\n * ]\n * ```\n */\n getRegistered() {\n return _constants_mjs__WEBPACK_IMPORTED_MODULE_5__.REGISTERED_HOOKS;\n }\n}\nconst globalSingleton = new Hooks();\n\n/**\n * @returns {Hooks}\n */\nfunction getGlobalSingleton() {\n return globalSingleton;\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Hooks);\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/hooks/index.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/viewportScroll/index.mjs":
/*!*****************************************************************!*\
!*** ./node_modules/handsontable/core/viewportScroll/index.mjs ***!
\*****************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createViewportScroller: () => (/* binding */ createViewportScroller)\n/* harmony export */ });\n/* harmony import */ var _scrollStrategies_columnHeaderScroll_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./scrollStrategies/columnHeaderScroll.mjs */ \"./node_modules/handsontable/core/viewportScroll/scrollStrategies/columnHeaderScroll.mjs\");\n/* harmony import */ var _scrollStrategies_cornerHeaderScroll_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./scrollStrategies/cornerHeaderScroll.mjs */ \"./node_modules/handsontable/core/viewportScroll/scrollStrategies/cornerHeaderScroll.mjs\");\n/* harmony import */ var _scrollStrategies_focusScroll_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scrollStrategies/focusScroll.mjs */ \"./node_modules/handsontable/core/viewportScroll/scrollStrategies/focusScroll.mjs\");\n/* harmony import */ var _scrollStrategies_multipleScroll_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./scrollStrategies/multipleScroll.mjs */ \"./node_modules/handsontable/core/viewportScroll/scrollStrategies/multipleScroll.mjs\");\n/* harmony import */ var _scrollStrategies_noncontiguousScroll_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./scrollStrategies/noncontiguousScroll.mjs */ \"./node_modules/handsontable/core/viewportScroll/scrollStrategies/noncontiguousScroll.mjs\");\n/* harmony import */ var _scrollStrategies_rowHeaderScroll_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./scrollStrategies/rowHeaderScroll.mjs */ \"./node_modules/handsontable/core/viewportScroll/scrollStrategies/rowHeaderScroll.mjs\");\n/* harmony import */ var _scrollStrategies_singleScroll_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./scrollStrategies/singleScroll.mjs */ \"./node_modules/handsontable/core/viewportScroll/scrollStrategies/singleScroll.mjs\");\n\n\n\n\n\n\n\n/**\n * @typedef ViewportScroller\n * @property {function(): void} resume Resumes the viewport scroller.\n * @property {function(): void} suspend Suspends the viewport scroller until the `resume` method is called.\n * @property {function(): void} skipNextScrollCycle Skip the next scroll cycle.\n * @property {function(CellCoords): void} scrollTo Scroll the viewport to a given cell.\n */\n/**\n * Installs a viewport scroller module. The module is responsible for scrolling the viewport to a given cell\n * based on the selection type (single cell selection, multiple cells selection, header selection etc.).\n * It's triggered by the selection module via the `afterSetRangeEnd` hook every time the selection changes.\n *\n * @param {Core} hot The Handsontable instance.\n * @returns {ViewportScroller} The viewport scroller module.\n */\nfunction createViewportScroller(hot) {\n const {\n selection\n } = hot;\n let skipNextCall = false;\n let isSuspended = false;\n return {\n resume() {\n isSuspended = false;\n },\n suspend() {\n isSuspended = true;\n },\n skipNextScrollCycle() {\n skipNextCall = true;\n },\n scrollTo(cellCoords) {\n var _scrollStrategy;\n if (skipNextCall || isSuspended) {\n skipNextCall = false;\n return;\n }\n let scrollStrategy;\n if (selection.isFocusSelectionChanged()) {\n scrollStrategy = (0,_scrollStrategies_focusScroll_mjs__WEBPACK_IMPORTED_MODULE_0__.focusScrollStrategy)(hot);\n } else if (selection.isSelectedByCorner()) {\n scrollStrategy = (0,_scrollStrategies_cornerHeaderScroll_mjs__WEBPACK_IMPORTED_MODULE_1__.cornerHeaderScrollStrategy)(hot);\n } else if (selection.isSelectedByRowHeader()) {\n scrollStrategy = (0,_scrollStrategies_rowHeaderScroll_mjs__WEBPACK_IMPORTED_MODULE_2__.rowHeaderScrollStrategy)(hot);\n } else if (selection.isSelectedByColumnHeader()) {\n scrollStrategy = (0,_scrollStrategies_columnHeaderScroll_mjs__WEBPACK_IMPORTED_MODULE_3__.columnHeaderScrollStrategy)(hot);\n } else if (selection.getSelectedRange().size() === 1 && selection.isMultiple()) {\n scrollStrategy = (0,_scrollStrategies_multipleScroll_mjs__WEBPACK_IMPORTED_MODULE_4__.multipleScrollStrategy)(hot);\n } else if (selection.getSelectedRange().size() === 1 && !selection.isMultiple()) {\n scrollStrategy = (0,_scrollStrategies_singleScroll_mjs__WEBPACK_IMPORTED_MODULE_5__.singleScrollStrategy)(hot);\n } else if (selection.getSelectedRange().size() > 1) {\n scrollStrategy = (0,_scrollStrategies_noncontiguousScroll_mjs__WEBPACK_IMPORTED_MODULE_6__.noncontiguousScrollStrategy)(hot);\n }\n (_scrollStrategy = scrollStrategy) === null || _scrollStrategy === void 0 || _scrollStrategy(cellCoords);\n }\n };\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/viewportScroll/index.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/viewportScroll/scrollStrategies/columnHeaderScroll.mjs":
/*!***********************************************************************************************!*\
!*** ./node_modules/handsontable/core/viewportScroll/scrollStrategies/columnHeaderScroll.mjs ***!
\***********************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ columnHeaderScrollStrategy: () => (/* binding */ columnHeaderScrollStrategy)\n/* harmony export */ });\n/* harmony import */ var _utils_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.mjs */ \"./node_modules/handsontable/core/viewportScroll/utils.mjs\");\n\n/**\n * Scroll strategy for column header selection.\n *\n * @param {Core} hot Handsontable instance.\n * @returns {function(): function(CellCoords): void}\n */\nfunction columnHeaderScrollStrategy(hot) {\n return cellCoords => {\n const scrollColumnTarget = (0,_utils_mjs__WEBPACK_IMPORTED_MODULE_0__.createScrollTargetCalculator)(hot).getComputedColumnTarget(cellCoords);\n hot.scrollViewportTo({\n col: scrollColumnTarget\n }, () => {\n const hasColumnHeaders = !!hot.getSettings().colHeaders;\n (0,_utils_mjs__WEBPACK_IMPORTED_MODULE_0__.scrollWindowToCell)(hot.getCell(hasColumnHeaders ? -1 : 0, scrollColumnTarget, true));\n });\n };\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/viewportScroll/scrollStrategies/columnHeaderScroll.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/viewportScroll/scrollStrategies/cornerHeaderScroll.mjs":
/*!***********************************************************************************************!*\
!*** ./node_modules/handsontable/core/viewportScroll/scrollStrategies/cornerHeaderScroll.mjs ***!
\***********************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ cornerHeaderScrollStrategy: () => (/* binding */ cornerHeaderScrollStrategy)\n/* harmony export */ });\n/**\n * Scroll strategy for corner header selection.\n *\n * @returns {function(): function(CellCoords): void}\n */\nfunction cornerHeaderScrollStrategy() {\n return () => {\n // do not scroll the viewport when the corner is clicked\n };\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/viewportScroll/scrollStrategies/cornerHeaderScroll.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/viewportScroll/scrollStrategies/focusScroll.mjs":
/*!****************************************************************************************!*\
!*** ./node_modules/handsontable/core/viewportScroll/scrollStrategies/focusScroll.mjs ***!
\****************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ focusScrollStrategy: () => (/* binding */ focusScrollStrategy)\n/* harmony export */ });\n/* harmony import */ var _utils_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.mjs */ \"./node_modules/handsontable/core/viewportScroll/utils.mjs\");\n\n/**\n * Scroll strategy for changed the focus position of the selection.\n *\n * @param {Core} hot Handsontable instance.\n * @returns {function(): function(CellCoords): void}\n */\nfunction focusScrollStrategy(hot) {\n return cellCoords => {\n hot.scrollViewportTo(cellCoords.toObject(), () => {\n const {\n row,\n col\n } = hot.getSelectedRangeLast().highlight;\n (0,_utils_mjs__WEBPACK_IMPORTED_MODULE_0__.scrollWindowToCell)(hot.getCell(row, col, true));\n });\n };\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/viewportScroll/scrollStrategies/focusScroll.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/viewportScroll/scrollStrategies/multipleScroll.mjs":
/*!*******************************************************************************************!*\
!*** ./node_modules/handsontable/core/viewportScroll/scrollStrategies/multipleScroll.mjs ***!
\*******************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ multipleScrollStrategy: () => (/* binding */ multipleScrollStrategy)\n/* harmony export */ });\n/* harmony import */ var _utils_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.mjs */ \"./node_modules/handsontable/core/viewportScroll/utils.mjs\");\n\n/**\n * Scroll strategy for multiple selections.\n *\n * @param {Core} hot Handsontable instance.\n * @returns {function(): function(CellCoords): void}\n */\nfunction multipleScrollStrategy(hot) {\n return cellCoords => {\n const scrollTargetCalc = (0,_utils_mjs__WEBPACK_IMPORTED_MODULE_0__.createScrollTargetCalculator)(hot);\n const targetScroll = {\n row: scrollTargetCalc.getComputedRowTarget(cellCoords),\n col: scrollTargetCalc.getComputedColumnTarget(cellCoords)\n };\n hot.scrollViewportTo(targetScroll, () => {\n const {\n row,\n col\n } = targetScroll;\n (0,_utils_mjs__WEBPACK_IMPORTED_MODULE_0__.scrollWindowToCell)(hot.getCell(row, col, true));\n });\n };\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/viewportScroll/scrollStrategies/multipleScroll.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/viewportScroll/scrollStrategies/noncontiguousScroll.mjs":
/*!************************************************************************************************!*\
!*** ./node_modules/handsontable/core/viewportScroll/scrollStrategies/noncontiguousScroll.mjs ***!
\************************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ noncontiguousScrollStrategy: () => (/* binding */ noncontiguousScrollStrategy)\n/* harmony export */ });\n/* harmony import */ var _utils_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.mjs */ \"./node_modules/handsontable/core/viewportScroll/utils.mjs\");\n\n/**\n * Scroll strategy for non-contiguous selections.\n *\n * @param {Core} hot Handsontable instance.\n * @returns {function(): function(CellCoords): void}\n */\nfunction noncontiguousScrollStrategy(hot) {\n return cellCoords => {\n const scrollTargetCalc = (0,_utils_mjs__WEBPACK_IMPORTED_MODULE_0__.createScrollTargetCalculator)(hot);\n const targetScroll = {\n row: scrollTargetCalc.getComputedRowTarget(cellCoords),\n col: scrollTargetCalc.getComputedColumnTarget(cellCoords)\n };\n hot.scrollViewportTo(targetScroll, () => {\n const {\n row,\n col\n } = targetScroll;\n (0,_utils_mjs__WEBPACK_IMPORTED_MODULE_0__.scrollWindowToCell)(hot.getCell(row, col, true));\n });\n };\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/viewportScroll/scrollStrategies/noncontiguousScroll.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/viewportScroll/scrollStrategies/rowHeaderScroll.mjs":
/*!********************************************************************************************!*\
!*** ./node_modules/handsontable/core/viewportScroll/scrollStrategies/rowHeaderScroll.mjs ***!
\********************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ rowHeaderScrollStrategy: () => (/* binding */ rowHeaderScrollStrategy)\n/* harmony export */ });\n/* harmony import */ var _utils_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.mjs */ \"./node_modules/handsontable/core/viewportScroll/utils.mjs\");\n\n/**\n * Scroll strategy for row header selection.\n *\n * @param {Core} hot Handsontable instance.\n * @returns {function(): function(CellCoords): void}\n */\nfunction rowHeaderScrollStrategy(hot) {\n return cellCoords => {\n const scrollRowTarget = (0,_utils_mjs__WEBPACK_IMPORTED_MODULE_0__.createScrollTargetCalculator)(hot).getComputedRowTarget(cellCoords);\n hot.scrollViewportTo({\n row: scrollRowTarget\n }, () => {\n const hasRowHeaders = !!hot.getSettings().rowHeaders;\n (0,_utils_mjs__WEBPACK_IMPORTED_MODULE_0__.scrollWindowToCell)(hot.getCell(scrollRowTarget, hasRowHeaders ? -1 : 0, true));\n });\n };\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/viewportScroll/scrollStrategies/rowHeaderScroll.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/viewportScroll/scrollStrategies/singleScroll.mjs":
/*!*****************************************************************************************!*\
!*** ./node_modules/handsontable/core/viewportScroll/scrollStrategies/singleScroll.mjs ***!
\*****************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ singleScrollStrategy: () => (/* binding */ singleScrollStrategy)\n/* harmony export */ });\n/* harmony import */ var _utils_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.mjs */ \"./node_modules/handsontable/core/viewportScroll/utils.mjs\");\n\n/**\n * Scroll strategy for single cell selection.\n *\n * @param {Core} hot Handsontable instance.\n * @returns {function(): function(CellCoords): void}\n */\nfunction singleScrollStrategy(hot) {\n return cellCoords => {\n const selectionSource = hot.selection.getSelectionSource();\n const {\n row,\n col\n } = cellCoords;\n const scrollWindow = () => {\n (0,_utils_mjs__WEBPACK_IMPORTED_MODULE_0__.scrollWindowToCell)(hot.getCell(row, col, true));\n };\n\n // navigating through the column headers (when `navigableHeaders` is enabled)\n // scrolls the viewport horizontally only\n if (row < 0 && col >= 0) {\n hot.scrollViewportTo({\n col\n }, scrollWindow);\n\n // navigating through the row headers (when `navigableHeaders` is enabled)\n // scrolls the viewport vertically only\n } else if (col < 0 && row >= 0) {\n hot.scrollViewportTo({\n row\n }, scrollWindow);\n\n // navigating through the cells\n } else {\n if (selectionSource === 'mouse') {\n if (col === hot.view.getLastPartiallyVisibleColumn() || row === hot.view.getLastPartiallyVisibleRow()) {\n return;\n }\n }\n hot.scrollViewportTo({\n row,\n col\n }, scrollWindow);\n }\n };\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/viewportScroll/scrollStrategies/singleScroll.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/core/viewportScroll/utils.mjs":
/*!*****************************************************************!*\
!*** ./node_modules/handsontable/core/viewportScroll/utils.mjs ***!
\*****************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createScrollTargetCalculator: () => (/* binding */ createScrollTargetCalculator),\n/* harmony export */ scrollWindowToCell: () => (/* binding */ scrollWindowToCell)\n/* harmony export */ });\n/* harmony import */ var _helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../helpers/dom/element.mjs */ \"./node_modules/handsontable/helpers/dom/element.mjs\");\n\n/**\n * Scrolls the browser's viewport to the specified element.\n *\n * @param {HTMLElement} element The element to scroll.\n */\nfunction scrollWindowToCell(element) {\n if ((0,_helpers_dom_element_mjs__WEBPACK_IMPORTED_MODULE_0__.isHTMLElement)(element)) {\n element.scrollIntoView({\n block: 'nearest',\n inline: 'nearest'\n });\n }\n}\n\n/**\n * Creates a scroll target calculator that calculates the target row and column best viewport\n * scroll position based on the current selection.\n *\n * @param {Core} hotInstance The Handsontable instance.\n * @returns {{ getComputedColumnTarget: Function, getComputedRowTarget: Function }}\n */\nfunction createScrollTargetCalculator(hotInstance) {\n const {\n selection,\n view\n } = hotInstance;\n const cellRange = hotInstance.getSelectedRangeLast();\n const source = selection.getSelectionSource();\n const firstVisibleColumn = view.getFirstFullyVisibleColumn();\n const lastVisibleColumn = view.getLastFullyVisibleColumn();\n const selectionFirstColumn = cellRange.getTopStartCorner().col;\n const selectionLastColumn = cellRange.getBottomEndCorner().col;\n const isSelectionOutsideStartViewport = selectionFirstColumn <= firstVisibleColumn;\n const isSelectionOutsideEndViewport = selectionLastColumn >= lastVisibleColumn;\n const firstVisibleRow = view.getFirstFullyVisibleRow();\n const lastVisibleRow = view.getLastFullyVisibleRow();\n const selectionFirstRow = cellRange.getTopStartCorner().row;\n const selectionLastRow = cellRange.getBottomEndCorner().row;\n const isSelectionOutsideTopViewport = selectionFirstRow <= firstVisibleRow;\n const isSelectionOutsideBottomViewport = selectionLastRow >= lastVisibleRow;\n return {\n /**\n * Calculates the target column for scrolling.\n *\n * @param {CellCoords} lastSelectionCoords The last selection coordinates.\n * @returns {number}\n */\n getComputedColumnTarget(lastSelectionCoords) {\n if (source === 'mouse' || source === 'keyboard') {\n // For mouse or keyboard selection, always scroll to the last column\n // defined by the last selection coords\n return lastSelectionCoords.col;\n }\n if (isSelectionOutsideStartViewport && isSelectionOutsideEndViewport) {\n // If the selection is outside both ends of the viewport, scroll to the\n // column where the focused cell is located\n return cellRange.highlight.col;\n }\n if (isSelectionOutsideStartViewport) {\n // If the selection is outside the start (left) of the viewport, scroll to\n // the first column of the selection range\n return selectionFirstColumn;\n }\n if (isSelectionOutsideEndViewport) {\n // If the selection is outside the end (right) of the viewport, scroll to\n // the last column of the selection range\n return selectionLastColumn;\n }\n\n // For other cases, scroll to the column defined by the last selection coords\n return lastSelectionCoords.col;\n },\n /**\n * Calculates the target row for scrolling.\n *\n * @param {CellCoords} lastSelectionCoords The last selection coordinates.\n * @returns {number}\n */\n getComputedRowTarget(lastSelectionCoords) {\n if (source === 'mouse' || source === 'keyboard') {\n // For mouse or keyboard selection, always scroll to the last row\n // defined by the coords\n return lastSelectionCoords.row;\n }\n if (isSelectionOutsideTopViewport && isSelectionOutsideBottomViewport) {\n // If the selection is outside both ends of the viewport, scroll to the\n // row where the focused cell is located\n return cellRange.highlight.row;\n }\n if (isSelectionOutsideTopViewport) {\n // If the selection is outside the top of the viewport, scroll to\n // the first row of the selection range\n return selectionFirstRow;\n }\n if (isSelectionOutsideBottomViewport) {\n // If the selection is outside the bottom of the viewport, scroll to\n // the last row of the selection range\n return selectionLastRow;\n }\n\n // For other cases, scroll to the row defined by the last selection coords\n return lastSelectionCoords.row;\n }\n };\n}\n\n//# sourceURL=webpack://front/./node_modules/handsontable/core/viewportScroll/utils.mjs?");
/***/ }),
/***/ "./node_modules/handsontable/dataMap/dataMap.mjs":
/*!*******************************************************!*\
!*** ./node_modules/handsontable/dataMap/dataMap.mjs ***!
\*******************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_error_cause_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.error.cause.js */ \"./node_modules/core-js/modules/es.error.cause.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/esnext.iterator.constructor.js */ \"./node_modules/core-js/modules/esnext.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/esnext.iterator.filter.js */ \"./node_modules/core-js/modules/esnext.iterator.filter.js\");\n/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/esnext.iterator.for-each.js */ \"./node_modules/core-js/modules/esnext.iterator.for-each.js\");\n/* harmony import */ var _3rdparty_SheetClip_index_mjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../3rdparty/SheetClip/index.mjs */ \"./node_modules/handsontable/3rdparty/SheetClip/SheetClip.mjs\");\n/* harmony import */ var _helpers_data_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../helpers/data.mjs */ \"./node_modules/handsontable/helpers/data.mjs\");\n/* harmony import */ var _helpers_object_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../helpers/object.mjs */ \"./node_modules/handsontable/helpers/object.mjs\");\n/* harmony import */ var _helpers_array_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../helpers/array.mjs */ \"./node_modules/handsontable/helpers/array.mjs\");\n/* harmony import */ var _helpers_number_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../helpers/number.mjs */ \"./node_modules/handsontable/helpers/number.mjs\");\n/* harmony import */ var _helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../helpers/mixed.mjs */ \"./node_modules/handsontable/helpers/mixed.mjs\");\n\n\n\n\n\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n/*\nThis class contains open-source contributions covered by the MIT license.\n\n1) In the `createRow` method: Row creation using functional `dataSchema` value\n2) In the `set` method: Data setting using functional `prop` value\n3) in the `get` method: Data getting using functional `prop` value\n\nThe remaining part of this code comment contains the full license text of these contributions.\n\n======\n\nThe MIT License\n\nCopyright 2013 Nicholas Bollweg\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n/**\n * Utility class that gets and saves data from/to the data source using mapping of columns numbers to object property names.\n *\n * @todo Refactor arguments of methods getRange, getText to be numbers (not objects).\n * @todo Remove priv, GridSettings from object constructor.\n *\n * @class DataMap\n * @private\n */\nclass DataMap {\n /**\n * @type {number}\n */\n static get DESTINATION_RENDERER() {\n return 1;\n }\n\n /**\n * @type {number}\n */\n static get DESTINATION_CLIPBOARD_GENERATOR() {\n return 2;\n }\n\n /**\n * Instance of {@link Handsontable}.\n *\n * @private\n * @type {Handsontable}\n */\n\n /**\n * @param {object} hotInstance Instance of Handsontable.\n * @param {Array} data Array of arrays or array of objects containing data.\n * @param {MetaManager} metaManager The meta manager instance.\n */\n constructor(hotInstance, data, metaManager) {\n _defineProperty(this, \"hot\", void 0);\n /**\n * Instance of {@link MetaManager}.\n *\n * @private\n * @type {MetaManager}\n */\n _defineProperty(this, \"metaManager\", void 0);\n /**\n * Instance of {@link TableMeta}.\n *\n * @private\n * @type {TableMeta}\n */\n _defineProperty(this, \"tableMeta\", void 0);\n /**\n * Reference to the original dataset.\n *\n * @type {*}\n */\n _defineProperty(this, \"dataSource\", void 0);\n /**\n * Generated schema based on the first row from the source data.\n *\n * @type {object}\n */\n _defineProperty(this, \"duckSchema\", void 0);\n /**\n * Cached array of properties to columns.\n *\n * @type {Array}\n */\n _defineProperty(this, \"colToPropCache\", void 0);\n /**\n * Cached map of properties to columns.\n *\n * @type {Map}\n */\n _defineProperty(this, \"propToColCache\", void 0);\n this.hot = hotInstance;\n this.metaManager = metaManager;\n this.tableMeta = metaManager.getTableMeta();\n this.dataSource = data;\n this.refreshDuckSchema();\n this.createMap();\n }\n\n /**\n * Generates cache for property to and from column addressation.\n */\n createMap() {\n const schema = this.getSchema();\n if (typeof schema === 'undefined') {\n throw new Error('trying to create `columns` definition but you didn\\'t provide `schema` nor `data`');\n }\n const columns = this.tableMeta.columns;\n let i;\n this.colToPropCache = [];\n this.propToColCache = new Map();\n if (columns) {\n let columnsLen = 0;\n let filteredIndex = 0;\n let columnsAsFunc = false;\n if (typeof columns === 'function') {\n const schemaLen = (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_5__.deepObjectSize)(schema);\n columnsLen = schemaLen > 0 ? schemaLen : this.countFirstRowKeys();\n columnsAsFunc = true;\n } else {\n const maxCols = this.tableMeta.maxCols;\n columnsLen = Math.min(maxCols, columns.length);\n }\n for (i = 0; i < columnsLen; i++) {\n const column = columnsAsFunc ? columns(i) : columns[i];\n if ((0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_5__.isObject)(column)) {\n if (typeof column.data !== 'undefined') {\n const index = columnsAsFunc ? filteredIndex : i;\n this.colToPropCache[index] = column.data;\n this.propToColCache.set(column.data, index);\n }\n filteredIndex += 1;\n }\n }\n } else {\n this.recursiveDuckColumns(schema);\n }\n }\n\n /**\n * Get the amount of physical columns in the first data row.\n *\n * @returns {number} Amount of physical columns in the first data row.\n */\n countFirstRowKeys() {\n return (0,_helpers_data_mjs__WEBPACK_IMPORTED_MODULE_6__.countFirstRowKeys)(this.dataSource);\n }\n\n /**\n * Generates columns' translation cache.\n *\n * @param {object} schema An object to generate schema from.\n * @param {number} lastCol The column index.\n * @param {number} parent The property cache for recursive calls.\n * @returns {number}\n */\n recursiveDuckColumns(schema, lastCol, parent) {\n let lastColumn = lastCol;\n let propertyParent = parent;\n let prop;\n if (typeof lastColumn === 'undefined') {\n lastColumn = 0;\n propertyParent = '';\n }\n if (typeof schema === 'object' && !Array.isArray(schema)) {\n (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_5__.objectEach)(schema, (value, key) => {\n if (value === null) {\n prop = propertyParent + key;\n this.colToPropCache.push(prop);\n this.propToColCache.set(prop, lastColumn);\n lastColumn += 1;\n } else {\n lastColumn = this.recursiveDuckColumns(value, lastColumn, `${key}.`);\n }\n });\n }\n return lastColumn;\n }\n\n /**\n * Returns property name that corresponds with the given column index.\n *\n * @param {string|number} column Visual column index or another passed argument.\n * @returns {string|number} Column property, physical column index or passed argument.\n */\n colToProp(column) {\n // TODO: Should it work? Please, look at the test:\n // \"it should return the provided property name, when the user passes a property name as a column number\".\n if (Number.isInteger(column) === false) {\n return column;\n }\n const physicalColumn = this.hot.toPhysicalColumn(column);\n\n // Out of range, not visible column index.\n if (physicalColumn === null) {\n return column;\n }\n\n // Cached property.\n if (this.colToPropCache && (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_7__.isDefined)(this.colToPropCache[physicalColumn])) {\n return this.colToPropCache[physicalColumn];\n }\n return physicalColumn;\n }\n\n /**\n * Translates property into visual column index.\n *\n * @param {string|number} prop Column property which may be also a physical column index.\n * @returns {string|number} Visual column index or passed argument.\n */\n propToCol(prop) {\n const cachedPhysicalIndex = this.propToColCache.get(prop);\n if ((0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_7__.isDefined)(cachedPhysicalIndex)) {\n return this.hot.toVisualColumn(cachedPhysicalIndex);\n }\n\n // Property may be a physical column index.\n const visualColumn = this.hot.toVisualColumn(prop);\n if (visualColumn === null) {\n return prop;\n }\n return visualColumn;\n }\n\n /**\n * Returns data's schema.\n *\n * @returns {object}\n */\n getSchema() {\n const schema = this.tableMeta.dataSchema;\n if (schema) {\n if (typeof schema === 'function') {\n return schema();\n }\n return schema;\n }\n return this.duckSchema;\n }\n\n /**\n * Creates the duck schema based on the current dataset.\n *\n * @returns {Array|object}\n */\n createDuckSchema() {\n return this.dataSource && this.dataSource[0] ? (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_5__.duckSchema)(this.dataSource[0]) : {};\n }\n\n /**\n * Refresh the data schema.\n */\n refreshDuckSchema() {\n this.duckSchema = this.createDuckSchema();\n }\n\n /**\n * Creates row at the bottom of the data array.\n *\n * @param {number} [index] Physical index of the row before which the new row will be inserted.\n * @param {number} [amount=1] An amount of rows to add.\n * @param {object} [options] Additional options for created rows.\n * @param {string} [options.source] Source of method call.\n * @param {'above'|'below'} [options.mode] Sets where the row is inserted: above or below the passed index.\n * @fires Hooks#afterCreateRow\n * @returns {number} Returns number of created rows.\n */\n createRow(index) {\n let amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n let {\n source,\n mode = 'above'\n } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n const sourceRowsCount = this.hot.countSourceRows();\n let physicalRowIndex = sourceRowsCount;\n let numberOfCreatedRows = 0;\n let rowIndex = index;\n if (typeof rowIndex !== 'number' || rowIndex >= sourceRowsCount) {\n rowIndex = sourceRowsCount;\n }\n if (rowIndex < this.hot.countRows()) {\n physicalRowIndex = this.hot.toPhysicalRow(rowIndex);\n }\n const continueProcess = this.hot.runHooks('beforeCreateRow', rowIndex, amount, source);\n if (continueProcess === false || physicalRowIndex === null) {\n return {\n delta: 0\n };\n }\n const maxRows = this.tableMeta.maxRows;\n const columnCount = this.getSchema().length;\n const rowsToAdd = [];\n while (numberOfCreatedRows < amount && sourceRowsCount + numberOfCreatedRows < maxRows) {\n let row = null;\n if (this.hot.dataType === 'array') {\n if (this.tableMeta.dataSchema) {\n // Clone template array\n row = (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_5__.deepClone)(this.getSchema());\n } else {\n row = [];\n /* eslint-disable no-loop-func */\n (0,_helpers_number_mjs__WEBPACK_IMPORTED_MODULE_8__.rangeEach)(columnCount - 1, () => row.push(null));\n }\n } else if (this.hot.dataType === 'function') {\n row = this.tableMeta.dataSchema(rowIndex + numberOfCreatedRows);\n } else {\n row = {};\n (0,_helpers_object_mjs__WEBPACK_IMPORTED_MODULE_5__.deepExtend)(row, this.getSchema());\n }\n rowsToAdd.push(row);\n numberOfCreatedRows += 1;\n }\n this.hot.rowIndexMapper.insertIndexes(rowIndex, numberOfCreatedRows);\n if (mode === 'below') {\n physicalRowIndex = Math.min(physicalRowIndex + 1, sourceRowsCount);\n }\n this.spliceData(physicalRowIndex, 0, rowsToAdd);\n const newVisualRowIndex = this.hot.toVisualRow(physicalRowIndex);\n\n // In case the created rows are the only ones in the table, the column index mappers need to be rebuilt based on\n // the number of columns created in the row or the schema.\n if (this.hot.countSourceRows() === rowsToAdd.length) {\n this.hot.columnIndexMapper.initToLength(this.hot.getInitialColumnCount());\n }\n if (numberOfCreatedRows > 0) {\n if (index === undefined || index === null) {\n // Creates the meta rows at the end of the rows collection without shifting the cells\n // that were defined out of the range of the dataset.\n this.metaManager.createRow(null, numberOfCreatedRows);\n } else if (source !== 'auto') {\n this.metaManager.createRow(physicalRowIndex, amount);\n }\n }\n this.hot.runHooks('afterCreateRow', newVisualRowIndex, numberOfCreatedRows, source);\n return {\n delta: numberOfCreatedRows,\n startPhysicalIndex: physicalRowIndex\n };\n }\n\n /**\n * Creates column at the right of the data array.\n *\n * @param {number} [index] Visual index of the column before which the new column will be inserted.\n * @param {number} [amount=1] An amount of columns to add.\n * @param {object} [options] Additional options for created columns.\n * @param {string} [options.source] Source of method call.\n * @param {'start'|'end'} [options.mode] Sets where the column is inserted: at the start (left in [LTR](@/api/options.md#layoutdirection), right in [RTL](@/api/options.md#layoutdirection)) or at the end (right in LTR, left in LTR)\n * the passed index.\n * @fires Hooks#afterCreateCol\n * @returns {number} Returns number of created columns.\n */\n createCol(index) {\n let amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n let {\n source,\n mode = 'start'\n } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (!this.hot.isColumnModificationAllowed()) {\n throw new Error('Cannot create new column. When data source in an object, ' + 'you can only have as much columns as defined in first data row, data schema or in the \\'columns\\' setting.' + 'If you want to be able to add new columns, you have to use array datasource.');\n }\n const dataSource = this.dataSource;\n const maxCols = this.tableMeta.maxCols;\n const countSourceCols = this.hot.countSourceCols();\n let columnIndex = index;\n if (typeof columnIndex !== 'number' || columnIndex >= countSourceCols) {\n columnIndex = countSourceCols;\n }\n const continueProcess = this.hot.runHooks('beforeCreateCol', columnIndex, amount, source);\n if (continueProcess === false) {\n return {\n delta: 0\n };\n }\n let physicalColumnIndex = countSourceCols;\n if (columnIndex < this.hot.countCols()) {\n physicalColumnIndex = this.hot.toPhysicalColumn(columnIndex);\n }\n const numberOfSourceRows = this.hot.countSourceRows();\n let nrOfColumns = this.hot.countCols();\n let numberOfCreatedCols = 0;\n let currentIndex = physicalColumnIndex;\n if (mode === 'end') {\n currentIndex = Math.min(currentIndex + 1, countSourceCols);\n }\n const startPhysicalIndex = currentIndex;\n while (numberOfCreatedCols < amount && nrOfColumns < maxCols) {\n if (typeof columnIndex !== 'number' || columnIndex >= nrOfColumns) {\n if (numberOfSourceRows > 0) {\n for (let row = 0; row < numberOfSourceRows; row += 1) {\n if (typeof dataSource[row] === 'undefined') {\n dataSource[row] = [];\n }\n dataSource[row].push(null);\n }\n } else {\n dataSource.push([null]);\n }\n } else {\n for (let row = 0; row < numberOfSourceRows; row++) {\n dataSource[row].splice(currentIndex, 0, null);\n }\n }\n numberOfCreatedCols += 1;\n currentIndex += 1;\n nrOfColumns += 1;\n }\n this.hot.columnIndexMapper.insertIndexes(columnIndex, numberOfCreatedCols);\n if (numberOfCreatedCols > 0) {\n if (index === undefined || index === null) {\n // Creates the meta columns at the end of the columns collection without shifting the cells\n // that were defined out of the range of the dataset.\n this.metaManager.createColumn(null, numberOfCreatedCols);\n } else if (source !== 'auto') {\n this.metaManager.createColumn(startPhysicalIndex, amount);\n }\n }\n const newVisualColumnIndex = this.hot.toVisualColumn(startPhysicalIndex);\n this.hot.runHooks('afterCreateCol', newVisualColumnIndex, numberOfCreatedCols, source);\n this.refreshDuckSchema();\n return {\n delta: numberOfCreatedCols,\n startPhysicalIndex\n };\n }\n\n /**\n * Removes row from the data array.\n *\n * @fires Hooks#beforeRemoveRow\n * @fires Hooks#afterRemoveRow\n * @param {number} [index] Visual index of the row to be removed. If not provided, the last row will be removed.\n * @param {number} [amount=1] Amount of the rows to be removed. If not provided, one row will be removed.\n * @param {string} [source] Source of method call.\n * @returns {boolean} Returns `false` when action was cancelled, otherwise `true`.\n */\n removeRow(index) {\n let amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n let source = arguments.length > 2 ? arguments[2] : undefined;\n let rowIndex = Number.isInteger(index) ? index : -amount; // -amount = taking indexes from the end.\n const removedPhysicalIndexes = this.visualRowsToPhysical(rowIndex, amount);\n const sourceRowsLength = this.hot.countSourceRows();\n rowIndex = (sourceRowsLength + rowIndex) % sourceRowsLength;\n\n // It handle also callback from the `NestedRows` plugin. Removing parent node has effect in removing children nodes.\n const actionWasNotCancelled = this.hot.runHooks('beforeRemoveRow', rowIndex, removedPhysicalIndexes.length, removedPhysicalIndexes, source);\n if (actionWasNotCancelled === false) {\n return false;\n }\n\n // List of removed indexes might be changed in the `beforeRemoveRow` hook. There may be new values.\n const numberOfRemovedIndexes = removedPhysicalIndexes.length;\n this.filterData(rowIndex, numberOfRemovedIndexes, removedPhysicalIndexes);\n if (rowIndex < this.hot.countRows()) {\n this.hot.rowIndexMapper.removeIndexes(removedPhysicalIndexes);\n const preserveColumns = (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_7__.isDefined)(this.tableMeta.columns) || (0,_helpers_mixed_mjs__WEBPACK_IMPORTED_MODULE_7__.isDefined)(this.tableMeta.dataSchema) || this.tableMeta.colHeaders;\n if (this.hot.rowIndexMapper.getNotTrimmedIndexesLength() === 0 && !preserveColumns) {\n this.hot.columnIndexMapper.setIndexesSequence([]);\n }\n }\n const descendingPhysicalRows = removedPhysicalIndexes.slice(0).sort((a, b) => b - a);\n descendingPhysicalRows.forEach(rowPhysicalIndex => {\n this.metaManager.removeRow(rowPhysicalIndex, 1);\n });\n this.hot.runHooks('afterRemoveRow', rowIndex, numberOfRemovedIndexes, removedPhysicalIndexes, source);\n return true;\n }\n\n /**\n * Removes column from the data array.\n *\n * @fires Hooks#beforeRemoveCol\n * @fires Hooks#afterRemoveCol\n * @param {number} [index] Visual index of the column to be removed. If not provided, the last column will be removed.\n * @param {number} [amount=1] Amount of the columns to be removed. If not provided, one column will be removed.\n * @param {string} [source] Source of method call.\n * @returns {boolean} Returns `false` when action was cancelled, otherwise `true`.\n */\n removeCol(index) {\n let amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n let source = arguments.length > 2 ? arguments[2] : undefined;\n if (this.hot.dataType === 'object' || this.tableMeta.columns) {\n throw new Error('cannot remove column with object data source or columns option specified');\n }\n let columnIndex = typeof index !== 'number' ? -amount : index;\n columnIndex = (this.hot.countCols() + columnIndex) % this.hot.countCols();\n const removedPhysicalIndexes = this.visualColumnsToPhysical(columnIndex, amount);\n const descendingPhysicalColumns = removedPhysicalIndexes.slice(0).sort((a, b) => b - a);\n const actionWasNotCancelled = this.hot.runHooks('beforeRemoveCol', columnIndex, amount, removedPhysicalIndexes, source);\n if (actionWasNotCancelled === false) {\n return false;\n }\n let isTableUniform = true;\n const removedColumnsCount = descendingPhysicalColumns.length;\n const data = this.dataSource;\n for (let c = 0; c < removedColumnsCount; c++) {\n if (isTableUniform && removedPhysicalIndexes[0] !== removedPhysicalIndexes[c] - c) {\n isTableUniform = false;\n }\n }\n if (isTableUniform) {\n for (let r = 0, rlen = this.hot.countSourceRows(); r < rlen; r++) {\n data[r].splice(removedPhysicalIndexes[0], amount);\n if (r === 0) {\n this.metaManager.removeColumn(removedPhysicalIndexes[0], amount);\n }\n }\n } else {\n for (let r = 0, rlen = this.hot.countSourceRows(); r < rlen; r++) {\n for (let c = 0; c < removedColumnsCount; c++) {\n data[r].splice(descendingPhysicalColumns[c], 1);\n if (r === 0) {\n this.metaManager.removeColumn(descendingPhysicalColumns[c], 1);\n }\n }\n }\n }\n if (columnIndex < this.hot.countCols()) {\n this.hot.columnIndexMapper.removeIndexes(removedPhysicalIndexes);\n if (!this.tableMeta.rowHeaders && this.hot.columnIndexMapper.getNotTrimmedIndexesLength() === 0) {\n this.hot.rowIndexMapper.setIndexesSequence([]);\n }\n }\n this.hot.runHooks('afterRemoveCol', columnIndex, amount, removedPhysicalIndexes, source);\n this.refreshDuckSchema();\n return true;\n }\n\n /**\n * Add/Removes data from the column.\n *\n * @param {number} col Physical index of column in which do you want to do splice.\n * @param {number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n * @param {number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n * @param {Array} [elements] The new columns to add.\n * @returns {Array} Returns removed portion of columns.\n */\n spliceCol(col, index, amount) {\n const colData = this.hot.getDataAtCol(col);\n const removed = colData.slice(index, index + amount);\n const after = colData.slice(index + amount);\n for (var _len = arguments.length, elements = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {\n elements[_key - 3] = arguments[_key];\n }\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_9__.extendArray)(elements, after);\n let i = 0;\n while (i < amount) {\n elements.push(null); // add null in place of removed elements\n i += 1;\n }\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_9__.to2dArray)(elements);\n this.hot.populateFromArray(index, col, elements, null, null, 'spliceCol');\n return removed;\n }\n\n /**\n * Add/Removes data from the row.\n *\n * @param {number} row Physical index of row in which do you want to do splice.\n * @param {number} index Index at which to start changing the array. If negative, will begin that many elements from the end.\n * @param {number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.\n * @param {Array} [elements] The new rows to add.\n * @returns {Array} Returns removed portion of rows.\n */\n spliceRow(row, index, amount) {\n const rowData = this.hot.getSourceDataAtRow(row);\n const removed = rowData.slice(index, index + amount);\n const after = rowData.slice(index + amount);\n for (var _len2 = arguments.length, elements = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {\n elements[_key2 - 3] = arguments[_key2];\n }\n (0,_helpers_array_mjs__WEBPACK_IMPORTED_MODULE_9__.extendArray)(elements, after);\n let i = 0;\n while (i < amount) {\n elements.push(null); // add null in place of removed elements\n i += 1;\n }\n this.hot.populateFromArray(row, index, [elements], null, null, 'spliceRow');\n return removed;\n }\n\n /**\n * Add/remove row(s) to/from the data source.\n *\n * @param {number} index Physical index of the element to add/remove.\n * @param {number} deleteCount Number of rows to remove.\n * @param {Array |