@scrabble-solver/scrabble-solver 2.8.7 → 2.8.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +10 -10
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/cache/eslint/.cache_8dgz12 +1 -1
  5. package/.next/cache/next-server.js.nft.json +1 -1
  6. package/.next/cache/webpack/client-production/0.pack +0 -0
  7. package/.next/cache/webpack/client-production/index.pack +0 -0
  8. package/.next/cache/webpack/server-production/0.pack +0 -0
  9. package/.next/cache/webpack/server-production/index.pack +0 -0
  10. package/.next/next-server.js.nft.json +1 -1
  11. package/.next/prerender-manifest.json +1 -1
  12. package/.next/routes-manifest.json +1 -1
  13. package/.next/server/chunks/413.js +257 -55
  14. package/.next/server/chunks/44.js +802 -0
  15. package/.next/server/chunks/515.js +452 -104
  16. package/.next/server/chunks/911.js +53 -23
  17. package/.next/server/middleware-build-manifest.js +1 -1
  18. package/.next/server/pages/404.html +2 -2
  19. package/.next/server/pages/404.js.nft.json +1 -1
  20. package/.next/server/pages/500.html +2 -2
  21. package/.next/server/pages/_app.js.nft.json +1 -1
  22. package/.next/server/pages/_document.js.nft.json +1 -1
  23. package/.next/server/pages/_error.js.nft.json +1 -1
  24. package/.next/server/pages/api/solve.js +193 -927
  25. package/.next/server/pages/api/solve.js.nft.json +1 -1
  26. package/.next/server/pages/api/verify.js +217 -0
  27. package/.next/server/pages/api/verify.js.nft.json +1 -0
  28. package/.next/server/pages/index.html +3 -3
  29. package/.next/server/pages/index.js +7 -1
  30. package/.next/server/pages/index.js.nft.json +1 -1
  31. package/.next/server/pages/index.json +1 -1
  32. package/.next/server/pages-manifest.json +1 -0
  33. package/.next/static/chunks/317-a33dd38e9b9a17ed.js +1 -0
  34. package/.next/static/chunks/pages/{404-30c06e61d256c5b2.js → 404-90c624da3c83fd17.js} +1 -1
  35. package/.next/static/chunks/pages/_app-f8f360878e1c2aff.js +1 -0
  36. package/.next/static/chunks/pages/index-ecea697d3e5d8a6f.js +1 -0
  37. package/.next/static/css/64dc2ce1811912f1.css +1 -0
  38. package/.next/static/css/{cdbc9e0afcff5473.css → ad2a08918868cad8.css} +1 -1
  39. package/.next/static/yCxjzzYpw5JjJE53PO_s6/_buildManifest.js +1 -0
  40. package/.next/static/{z_0_lqfmiI_ISokr6NNRq → yCxjzzYpw5JjJE53PO_s6}/_ssgManifest.js +0 -0
  41. package/.next/trace +42 -40
  42. package/package.json +9 -9
  43. package/src/components/Badge/Badge.module.scss +13 -0
  44. package/src/components/Badge/Badge.tsx +15 -0
  45. package/src/components/Badge/index.ts +1 -0
  46. package/src/components/Board/components/Cell/Cell.module.scss +34 -9
  47. package/src/components/Board/components/Cell/Cell.tsx +23 -4
  48. package/src/components/Board/components/Cell/CellPure.tsx +29 -1
  49. package/src/components/Board/hooks/useGrid.ts +1 -0
  50. package/src/components/NavButtons/NavButtons.tsx +33 -14
  51. package/src/components/RemainingTiles/RemainingTiles.module.scss +8 -7
  52. package/src/components/RemainingTiles/RemainingTiles.tsx +13 -4
  53. package/src/components/Sidebar/Sidebar.tsx +2 -2
  54. package/src/components/Sidebar/components/Section/Section.module.scss +0 -1
  55. package/src/components/Sidebar/components/Section/Section.tsx +1 -1
  56. package/src/components/SquareButton/SquareButton.module.scss +5 -0
  57. package/src/components/Words/Words.module.scss +35 -0
  58. package/src/components/Words/Words.tsx +57 -0
  59. package/src/components/Words/index.ts +1 -0
  60. package/src/components/index.ts +2 -0
  61. package/src/i18n/de.json +5 -1
  62. package/src/i18n/en.json +5 -1
  63. package/src/i18n/es.json +5 -1
  64. package/src/i18n/fr.json +5 -1
  65. package/src/i18n/pl.json +5 -1
  66. package/src/icons/BookHalf.svg +4 -0
  67. package/src/icons/Check.svg +4 -0
  68. package/src/icons/Cross.svg +2 -2
  69. package/src/icons/CrossFill.svg +4 -0
  70. package/src/icons/Flag.svg +4 -0
  71. package/src/icons/Star.svg +4 -0
  72. package/src/icons/index.ts +5 -0
  73. package/src/pages/api/solve.ts +2 -3
  74. package/src/pages/api/verify.ts +71 -0
  75. package/src/pages/index.tsx +5 -0
  76. package/src/sdk/index.ts +1 -0
  77. package/src/sdk/verify.ts +24 -0
  78. package/src/state/rootReducer.ts +12 -1
  79. package/src/state/sagas.ts +54 -7
  80. package/src/state/selectors.ts +49 -11
  81. package/src/state/slices/cellFilterInitialState.ts +7 -0
  82. package/src/state/slices/cellFilterSlice.ts +24 -0
  83. package/src/state/slices/index.ts +4 -0
  84. package/src/state/slices/verifyInitialState.ts +12 -0
  85. package/src/state/slices/verifySlice.ts +31 -0
  86. package/src/styles/variables.scss +2 -1
  87. package/src/types/index.ts +5 -1
  88. package/.next/static/chunks/56-cf37c430261bbea5.js +0 -1
  89. package/.next/static/chunks/pages/_app-0b12a65bea70a0df.js +0 -1
  90. package/.next/static/chunks/pages/index-fcb69802550afb81.js +0 -1
  91. package/.next/static/css/1f39b55d50f5b30b.css +0 -1
  92. package/.next/static/z_0_lqfmiI_ISokr6NNRq/_buildManifest.js +0 -1
@@ -1416,7 +1416,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1416
1416
  /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(redux__WEBPACK_IMPORTED_MODULE_0__);
1417
1417
  /* harmony import */ var redux_saga__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(75998);
1418
1418
  /* harmony import */ var _rootReducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12935);
1419
- /* harmony import */ var _sagas__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(58531);
1419
+ /* harmony import */ var _sagas__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(21701);
1420
1420
  var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([redux_saga__WEBPACK_IMPORTED_MODULE_1__]);
1421
1421
  redux_saga__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];
1422
1422
 
@@ -1445,6 +1445,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1445
1445
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1446
1446
  /* harmony export */ "$o": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.$o),
1447
1447
  /* harmony export */ "En": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.En),
1448
+ /* harmony export */ "HM": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.HM),
1448
1449
  /* harmony export */ "I8": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__.I8),
1449
1450
  /* harmony export */ "Mj": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.Mj),
1450
1451
  /* harmony export */ "O0": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.O0),
@@ -1460,12 +1461,15 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1460
1461
  /* harmony export */ "ZO": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.ZO),
1461
1462
  /* harmony export */ "Zf": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.Zf),
1462
1463
  /* harmony export */ "_C": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__._C),
1464
+ /* harmony export */ "bs": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.bs),
1463
1465
  /* harmony export */ "dN": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.dN),
1464
1466
  /* harmony export */ "f2": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.f2),
1465
1467
  /* harmony export */ "fN": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.fN),
1468
+ /* harmony export */ "id": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.id),
1466
1469
  /* harmony export */ "ix": () => (/* reexport safe */ _useTypedSelector__WEBPACK_IMPORTED_MODULE_6__.Z),
1467
1470
  /* harmony export */ "j2": () => (/* reexport safe */ _actions__WEBPACK_IMPORTED_MODULE_0__.j),
1468
1471
  /* harmony export */ "lj": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__.lj),
1472
+ /* harmony export */ "mO": () => (/* reexport safe */ _slices__WEBPACK_IMPORTED_MODULE_4__.mO),
1469
1473
  /* harmony export */ "mc": () => (/* reexport safe */ _actions__WEBPACK_IMPORTED_MODULE_0__.m),
1470
1474
  /* harmony export */ "md": () => (/* reexport safe */ _selectors__WEBPACK_IMPORTED_MODULE_3__.md),
1471
1475
  /* harmony export */ "qM": () => (/* reexport safe */ _useTranslate__WEBPACK_IMPORTED_MODULE_5__.Z),
@@ -1481,7 +1485,7 @@ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __we
1481
1485
  /* harmony import */ var _createAppStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(33282);
1482
1486
  /* harmony import */ var _localStorage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(83773);
1483
1487
  /* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6114);
1484
- /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(28546);
1488
+ /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(99134);
1485
1489
  /* harmony import */ var _useTranslate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(41573);
1486
1490
  /* harmony import */ var _useTypedSelector__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(53872);
1487
1491
  var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_createAppStore__WEBPACK_IMPORTED_MODULE_1__]);
@@ -1564,23 +1568,25 @@ const localStorage = {
1564
1568
  /* harmony export */ });
1565
1569
  /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86695);
1566
1570
  /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(redux__WEBPACK_IMPORTED_MODULE_0__);
1567
- /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(28546);
1571
+ /* harmony import */ var _slices__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(99134);
1568
1572
 
1569
1573
 
1570
1574
  const rootReducer = (0,redux__WEBPACK_IMPORTED_MODULE_0__.combineReducers)({
1571
1575
  board: _slices__WEBPACK_IMPORTED_MODULE_1__/* .boardSlice.reducer */ .I8.reducer,
1576
+ cellFilter: _slices__WEBPACK_IMPORTED_MODULE_1__/* .cellFilterSlice.reducer */ .mO.reducer,
1572
1577
  dictionary: _slices__WEBPACK_IMPORTED_MODULE_1__/* .dictionarySlice.reducer */ .lj.reducer,
1573
1578
  rack: _slices__WEBPACK_IMPORTED_MODULE_1__/* .rackSlice.reducer */ .O_.reducer,
1574
1579
  results: _slices__WEBPACK_IMPORTED_MODULE_1__/* .resultsSlice.reducer */ ._C.reducer,
1575
1580
  settings: _slices__WEBPACK_IMPORTED_MODULE_1__/* .settingsSlice.reducer */ .xj.reducer,
1576
- solve: _slices__WEBPACK_IMPORTED_MODULE_1__/* .solveSlice.reducer */ .TP.reducer
1581
+ solve: _slices__WEBPACK_IMPORTED_MODULE_1__/* .solveSlice.reducer */ .TP.reducer,
1582
+ verify: _slices__WEBPACK_IMPORTED_MODULE_1__/* .verifySlice.reducer */ .Gt.reducer
1577
1583
  });
1578
1584
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (rootReducer);
1579
1585
 
1580
1586
 
1581
1587
  /***/ }),
1582
1588
 
1583
- /***/ 58531:
1589
+ /***/ 21701:
1584
1590
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1585
1591
 
1586
1592
 
@@ -1621,6 +1627,22 @@ const solve = ({ board , characters , configId , locale })=>{
1621
1627
  };
1622
1628
  /* harmony default export */ const sdk_solve = (solve);
1623
1629
 
1630
+ ;// CONCATENATED MODULE: ./src/sdk/verify.ts
1631
+ const verify = ({ board , configId , locale })=>{
1632
+ return fetch("/api/verify", {
1633
+ method: "POST",
1634
+ headers: {
1635
+ "Content-Type": "application/json"
1636
+ },
1637
+ body: JSON.stringify({
1638
+ board,
1639
+ configId,
1640
+ locale
1641
+ })
1642
+ }).then((response)=>response.json());
1643
+ };
1644
+ /* harmony default export */ const sdk_verify = (verify);
1645
+
1624
1646
  ;// CONCATENATED MODULE: ./src/sdk/visit.ts
1625
1647
  const visit = ()=>{
1626
1648
  return fetch("/api/visit", {
@@ -1634,12 +1656,13 @@ const visit = ()=>{
1634
1656
 
1635
1657
 
1636
1658
 
1659
+
1637
1660
  // EXTERNAL MODULE: ./src/state/actions.ts
1638
1661
  var actions = __webpack_require__(89969);
1639
1662
  // EXTERNAL MODULE: ./src/state/selectors.ts + 6 modules
1640
1663
  var selectors = __webpack_require__(6114);
1641
- // EXTERNAL MODULE: ./src/state/slices/index.ts + 12 modules
1642
- var slices = __webpack_require__(28546);
1664
+ // EXTERNAL MODULE: ./src/state/slices/index.ts + 16 modules
1665
+ var slices = __webpack_require__(99134);
1643
1666
  ;// CONCATENATED MODULE: ./src/state/sagas.ts
1644
1667
 
1645
1668
 
@@ -1651,6 +1674,7 @@ var slices = __webpack_require__(28546);
1651
1674
  const SUBMIT_DELAY = 150;
1652
1675
  const memoizedFindWordDefinitions = (0,lib/* memoize */.HP)(sdk_findWordDefinitions);
1653
1676
  function* rootSaga() {
1677
+ yield (0,effects_.takeEvery)(slices/* boardSlice.actions.changeCellValue.type */.I8.actions.changeCellValue.type, onCellValueChange);
1654
1678
  yield (0,effects_.takeEvery)(slices/* resultsSlice.actions.applyResult.type */._C.actions.applyResult.type, onApplyResult);
1655
1679
  yield (0,effects_.takeEvery)(slices/* resultsSlice.actions.changeResultCandidate.type */._C.actions.changeResultCandidate.type, onResultCandidateChange);
1656
1680
  yield (0,effects_.takeEvery)(slices/* settingsSlice.actions.changeConfigId.type */.xj.actions.changeConfigId.type, onConfigIdChange);
@@ -1658,17 +1682,28 @@ function* rootSaga() {
1658
1682
  yield (0,effects_.takeLatest)(slices/* dictionarySlice.actions.submit.type */.lj.actions.submit.type, onDictionarySubmit);
1659
1683
  yield (0,effects_.takeLatest)(actions/* initialize.type */.j.type, onInitialize);
1660
1684
  yield (0,effects_.takeLatest)(actions/* reset.type */.m.type, onReset);
1661
- yield (0,effects_.takeLatest)(slices/* solveSlice.actions.submit.type */.TP.actions.submit.type, onSubmit);
1685
+ yield (0,effects_.takeLatest)(slices/* solveSlice.actions.submit.type */.TP.actions.submit.type, onSolve);
1686
+ yield (0,effects_.takeLatest)(slices/* verifySlice.actions.submit.type */.Gt.actions.submit.type, onVerify);
1687
+ }
1688
+ function* onCellValueChange({ payload }) {
1689
+ const isFiltered = yield (0,effects_.select)((state)=>(0,selectors/* selectCellIsFiltered */.id)(state, payload));
1690
+ if (isFiltered) {
1691
+ yield (0,effects_.put)(slices/* cellFilterSlice.actions.toggle */.mO.actions.toggle(payload));
1692
+ }
1693
+ yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
1662
1694
  }
1663
1695
  function* onApplyResult({ payload: result }) {
1664
1696
  const autoGroupTiles = yield (0,effects_.select)(selectors/* selectAutoGroupTiles */.uz);
1665
1697
  yield (0,effects_.put)(slices/* boardSlice.actions.applyResult */.I8.actions.applyResult(result));
1698
+ yield (0,effects_.put)(slices/* cellFilterSlice.actions.reset */.mO.actions.reset());
1666
1699
  yield (0,effects_.put)(slices/* rackSlice.actions.removeTiles */.O_.actions.removeTiles(result.tiles));
1667
1700
  yield (0,effects_.put)(slices/* rackSlice.actions.groupTiles */.O_.actions.groupTiles(autoGroupTiles));
1701
+ yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
1668
1702
  }
1669
1703
  function* onConfigIdChange() {
1670
1704
  yield (0,effects_.put)(slices/* resultsSlice.actions.reset */._C.actions.reset());
1671
1705
  yield (0,effects_.put)(slices/* solveSlice.actions.submit */.TP.actions.submit());
1706
+ yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
1672
1707
  yield* ensureProperTilesCount();
1673
1708
  }
1674
1709
  function* onDictionarySubmit() {
@@ -1690,14 +1725,17 @@ function* onInitialize() {
1690
1725
  }
1691
1726
  function* onReset() {
1692
1727
  yield (0,effects_.put)(slices/* boardSlice.actions.reset */.I8.actions.reset());
1728
+ yield (0,effects_.put)(slices/* cellFilterSlice.actions.reset */.mO.actions.reset());
1693
1729
  yield (0,effects_.put)(slices/* dictionarySlice.actions.reset */.lj.actions.reset());
1694
1730
  yield (0,effects_.put)(slices/* rackSlice.actions.reset */.O_.actions.reset());
1695
1731
  yield (0,effects_.put)(slices/* resultsSlice.actions.reset */._C.actions.reset());
1732
+ yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
1696
1733
  }
1697
1734
  function* onLocaleChange() {
1698
- yield (0,effects_.put)(slices/* solveSlice.actions.submit */.TP.actions.submit());
1699
- yield (0,effects_.put)(slices/* resultsSlice.actions.changeResultCandidate */._C.actions.changeResultCandidate(null));
1700
1735
  yield (0,effects_.put)(slices/* dictionarySlice.actions.reset */.lj.actions.reset());
1736
+ yield (0,effects_.put)(slices/* resultsSlice.actions.changeResultCandidate */._C.actions.changeResultCandidate(null));
1737
+ yield (0,effects_.put)(slices/* solveSlice.actions.submit */.TP.actions.submit());
1738
+ yield (0,effects_.put)(slices/* verifySlice.actions.submit */.Gt.actions.submit());
1701
1739
  }
1702
1740
  function* onResultCandidateChange({ payload: result }) {
1703
1741
  if (result) {
@@ -1705,7 +1743,7 @@ function* onResultCandidateChange({ payload: result }) {
1705
1743
  yield (0,effects_.put)(slices/* dictionarySlice.actions.submit */.lj.actions.submit());
1706
1744
  }
1707
1745
  }
1708
- function* onSubmit() {
1746
+ function* onSolve() {
1709
1747
  const board = yield (0,effects_.select)(selectors/* selectBoard */.ZO);
1710
1748
  const { config } = yield (0,effects_.select)(selectors/* selectConfig */.$o);
1711
1749
  const locale = yield (0,effects_.select)(selectors/* selectLocale */.fN);
@@ -1725,16 +1763,36 @@ function* onSubmit() {
1725
1763
  configId: config.id,
1726
1764
  locale
1727
1765
  });
1766
+ yield (0,effects_.put)(slices/* resultsSlice.actions.changeResults */._C.actions.changeResults(results.map(build.Result.fromJson)));
1728
1767
  yield (0,effects_.put)(slices/* solveSlice.actions.submitSuccess */.TP.actions.submitSuccess({
1729
1768
  board,
1730
1769
  characters
1731
1770
  }));
1732
- yield (0,effects_.put)(slices/* resultsSlice.actions.changeResults */._C.actions.changeResults(results.map(build.Result.fromJson)));
1733
1771
  } catch (error) {
1734
1772
  yield (0,effects_.put)(slices/* resultsSlice.actions.changeResults */._C.actions.changeResults([]));
1735
1773
  yield (0,effects_.put)(slices/* solveSlice.actions.submitFailure */.TP.actions.submitFailure());
1736
1774
  }
1737
1775
  }
1776
+ function* onVerify() {
1777
+ yield (0,effects_.delay)(SUBMIT_DELAY);
1778
+ const board = yield (0,effects_.select)(selectors/* selectBoard */.ZO);
1779
+ const { config } = yield (0,effects_.select)(selectors/* selectConfig */.$o);
1780
+ const locale = yield (0,effects_.select)(selectors/* selectLocale */.fN);
1781
+ try {
1782
+ const { invalidWords , validWords } = yield (0,effects_.call)(sdk_verify, {
1783
+ board: board.toJson(),
1784
+ configId: config.id,
1785
+ locale
1786
+ });
1787
+ yield (0,effects_.put)(slices/* verifySlice.actions.submitSuccess */.Gt.actions.submitSuccess({
1788
+ board,
1789
+ invalidWords,
1790
+ validWords
1791
+ }));
1792
+ } catch (error) {
1793
+ yield (0,effects_.put)(slices/* verifySlice.actions.submitFailure */.Gt.actions.submitFailure());
1794
+ }
1795
+ }
1738
1796
  function* ensureProperTilesCount() {
1739
1797
  const { config } = yield (0,effects_.select)(selectors/* selectConfig */.$o);
1740
1798
  const characters = yield (0,effects_.select)(selectors/* selectCharacters */.yp);
@@ -1769,11 +1827,13 @@ __webpack_require__.d(__webpack_exports__, {
1769
1827
  "uz": () => (/* binding */ selectAutoGroupTiles),
1770
1828
  "ZO": () => (/* binding */ selectBoard),
1771
1829
  "O0": () => (/* binding */ selectCellBonus),
1830
+ "id": () => (/* binding */ selectCellIsFiltered),
1772
1831
  "Or": () => (/* binding */ selectCharacterPoints),
1773
1832
  "yp": () => (/* binding */ selectCharacters),
1774
1833
  "$o": () => (/* binding */ selectConfig),
1775
1834
  "md": () => (/* binding */ selectConfigId),
1776
1835
  "w1": () => (/* binding */ selectDictionary),
1836
+ "bs": () => (/* binding */ selectHasInvalidWords),
1777
1837
  "En": () => (/* binding */ selectHasOverusedTiles),
1778
1838
  "xU": () => (/* binding */ selectIsLoading),
1779
1839
  "fN": () => (/* binding */ selectLocale),
@@ -1787,10 +1847,11 @@ __webpack_require__.d(__webpack_exports__, {
1787
1847
  "dN": () => (/* binding */ selectSortedFilteredResults),
1788
1848
  "f2": () => (/* binding */ selectSortedResults),
1789
1849
  "Zf": () => (/* binding */ selectTilePoints),
1790
- "nb": () => (/* binding */ selectTranslations)
1850
+ "nb": () => (/* binding */ selectTranslations),
1851
+ "HM": () => (/* binding */ selectVerify)
1791
1852
  });
1792
1853
 
1793
- // UNUSED EXPORTS: selectHasBoardChanged, selectHaveCharactersChanged, selectLastSolvedParameters, selectRemainingTiles, selectResultCandidate, selectResultCandidateCells, selectResults, selectTranslation
1854
+ // UNUSED EXPORTS: selectCellFilter, selectHasBoardChanged, selectHaveCharactersChanged, selectLastSolvedParameters, selectRemainingTiles, selectResultCandidate, selectResultCandidateCells, selectResults, selectTranslation
1794
1855
 
1795
1856
  // EXTERNAL MODULE: external "@reduxjs/toolkit"
1796
1857
  var toolkit_ = __webpack_require__(75184);
@@ -1799,15 +1860,15 @@ var build = __webpack_require__(89418);
1799
1860
  // EXTERNAL MODULE: ../types/build/index.js
1800
1861
  var types_build = __webpack_require__(34046);
1801
1862
  ;// CONCATENATED MODULE: ./src/i18n/de.json
1802
- const de_namespaceObject = JSON.parse('{"cell.set-blank":"Als Blanko markieren","cell.set-not-blank":"Nicht als Blanko markieren","cell.toggle-direction":"Schreibrichtung - klicken zum Wechseln","common.blanks":"Blankos","common.clear":"Löschen","common.close":"Schließen","common.consonants":"Konsonanten","common.loading":"Laden","common.points":"Punkte","common.tiles":"Steine","common.two-letter-tiles":"Zwei-Buchstaben","common.vowels":"Vokale","common.word":"Wort","common.words":"Wörter","dictionary.empty-state.no-definitions":"Wort existiert im Wörterbuch aber hat keine Definition.","dictionary.empty-state.no-results":"Wort kann nicht im Wörterbuch gefunden werden.","dictionary.empty-state.not-allowed":"Dieses Wort ist nicht erlaubt.","dictionary.empty-state.uninitialized":"Die Wörterbuchdefinition des letzten markierten Wortes wird hier angezeigt.","dictionary.input.placeholder":"Durchsuche Wörterbuch...","empty-state.error":"Fehler","empty-state.info":"Info","empty-state.success":"Juhuu!","empty-state.warning":"Oje!","github":"Schau dieses Projekt auf GitHub an","keyMap":"Tastaturkürzel","keyMap.board":"Brett","keyMap.board.toggle-blank":"Als Blanko markieren / aufheben","keyMap.board.toggle-direction":"Schreibrichtung umschalten","keyMap.board-and-rack":"Brett & Ablage","keyMap.board-and-rack.insert-two-letter-tile":"Zwei-Buchstaben Stein hinzufügen","keyMap.board-and-rack.navigate":"Navigieren","keyMap.board-and-rack.remove-tile":"Stein entfernen","keyMap.board-and-rack.submit":"Lösen starten","keyMap.rack":"Ablage","keyMap.rack.insert-blank":"Blanko hinzufügen (Leertaste)","rack.placeholder":"Steine…","remaining-tiles":"Restliche Steine","results.empty-state.no-filtered-results":"Keine Ergebnisse für diese Anfrage.","results.empty-state.no-results":"Keine Ergebnisse - kein Wort konnte generiert werden.","results.empty-state.outdated":"Ergebnisse sind alt. Klicken zum Aktualisieren.","results.empty-state.uninitialized":"Wörter die aus deinen Buchstaben generiert wurden erscheinen hier.","results.input.placeholder":"Suchergebnisse... (RegExp)","results.solve":"Lösen","settings":"Einstellungen","settings.autoGroupTiles":"Restliche Steine gruppieren","settings.autoGroupTiles.left":"Linke Seite","settings.autoGroupTiles.right":"Rechte Seite","settings.autoGroupTiles.null":"Nicht gruppieren","settings.game":"Spiel","settings.language":"Sprache"}');
1863
+ const de_namespaceObject = JSON.parse('{"cell.filter-cell":"Zielort - klicken zum Wechseln","cell.set-blank":"Als Blanko markieren","cell.set-not-blank":"Nicht als Blanko markieren","cell.toggle-direction":"Schreibrichtung - klicken zum Wechseln","common.blanks":"Blankos","common.clear":"Löschen","common.close":"Schließen","common.consonants":"Konsonanten","common.loading":"Laden","common.points":"Punkte","common.tiles":"Steine","common.two-letter-tiles":"Zwei-Buchstaben","common.vowels":"Vokale","common.word":"Wort","common.words":"Wörter","dictionary.empty-state.no-definitions":"Wort existiert im Wörterbuch aber hat keine Definition.","dictionary.empty-state.no-results":"Wort kann nicht im Wörterbuch gefunden werden.","dictionary.empty-state.not-allowed":"Dieses Wort ist nicht erlaubt.","dictionary.empty-state.uninitialized":"Die Wörterbuchdefinition des letzten markierten Wortes wird hier angezeigt.","dictionary.input.placeholder":"Durchsuche Wörterbuch...","empty-state.error":"Fehler","empty-state.info":"Info","empty-state.success":"Juhuu!","empty-state.warning":"Oje!","github":"Schau dieses Projekt auf GitHub an","keyMap":"Tastaturkürzel","keyMap.board":"Brett","keyMap.board.toggle-blank":"Als Blanko markieren / aufheben","keyMap.board.toggle-direction":"Schreibrichtung umschalten","keyMap.board-and-rack":"Brett & Ablage","keyMap.board-and-rack.insert-two-letter-tile":"Zwei-Buchstaben Stein hinzufügen","keyMap.board-and-rack.navigate":"Navigieren","keyMap.board-and-rack.remove-tile":"Stein entfernen","keyMap.board-and-rack.submit":"Lösen starten","keyMap.rack":"Ablage","keyMap.rack.insert-blank":"Blanko hinzufügen (Leertaste)","rack.placeholder":"Steine…","remaining-tiles":"Restliche Steine","results.empty-state.no-filtered-results":"Keine Ergebnisse für diese Anfrage.","results.empty-state.no-results":"Keine Ergebnisse - kein Wort konnte generiert werden.","results.empty-state.outdated":"Ergebnisse sind alt. Klicken zum Aktualisieren.","results.empty-state.uninitialized":"Wörter die aus deinen Buchstaben generiert wurden erscheinen hier.","results.input.placeholder":"Suchergebnisse... (RegExp)","results.solve":"Lösen","settings":"Einstellungen","settings.autoGroupTiles":"Restliche Steine gruppieren","settings.autoGroupTiles.left":"Linke Seite","settings.autoGroupTiles.right":"Rechte Seite","settings.autoGroupTiles.null":"Nicht gruppieren","settings.game":"Spiel","settings.language":"Sprache","words":"Gebildete Wörter","words.invalid":"Falsch","words.valid":"Korrekt"}');
1803
1864
  ;// CONCATENATED MODULE: ./src/i18n/en.json
1804
- const en_namespaceObject = JSON.parse('{"cell.set-blank":"Mark it a blank","cell.set-not-blank":"Mark it not a blank","cell.toggle-direction":"Typing direction - click to toggle","common.blanks":"Blanks","common.clear":"Clear","common.close":"Close","common.consonants":"Consonants","common.loading":"Loading","common.points":"Points","common.tiles":"Tiles","common.two-letter-tiles":"Two-letter","common.vowels":"Vowels","common.word":"Word","common.words":"Words","dictionary.empty-state.no-definitions":"Word exists in the dictionary but it does not have a definition.","dictionary.empty-state.no-results":"Unable to find word definition in dictionary.","dictionary.empty-state.not-allowed":"This word is not allowed.","dictionary.empty-state.uninitialized":"Dictionary definition of the last highlighted word will be shown here.","dictionary.input.placeholder":"Search dictionary...","empty-state.error":"Error","empty-state.info":"Info","empty-state.success":"Yeah!","empty-state.warning":"Oops!","github":"See this project on GitHub","keyMap":"Keyboard shortcuts","keyMap.board":"Board","keyMap.board.toggle-blank":"Mark/unmark tile as a blank","keyMap.board.toggle-direction":"Toggle typing direction","keyMap.board-and-rack":"Board & rack","keyMap.board-and-rack.insert-two-letter-tile":"Insert two-letter tile","keyMap.board-and-rack.navigate":"Navigate","keyMap.board-and-rack.remove-tile":"Remove tile","keyMap.board-and-rack.submit":"Start solving","keyMap.rack":"Rack","keyMap.rack.insert-blank":"Insert blank (spacebar)","rack.placeholder":"Letters","remaining-tiles":"Remaining tiles","results.empty-state.no-filtered-results":"No result matches this query.","results.empty-state.no-results":"No results - unable to generate any words.","results.empty-state.outdated":"Results are outdated. Click below to update.","results.empty-state.uninitialized":"Words generated from your letters will be shown here.","results.input.placeholder":"Search results... (RegExp)","results.solve":"Solve","settings":"Settings","settings.autoGroupTiles":"Group remaining tiles","settings.autoGroupTiles.left":"On the left","settings.autoGroupTiles.right":"On the right","settings.autoGroupTiles.null":"Do not group","settings.game":"Game","settings.language":"Language"}');
1865
+ const en_namespaceObject = JSON.parse('{"cell.filter-cell":"Target destination - click to toggle","cell.set-blank":"Mark it a blank","cell.set-not-blank":"Mark it not a blank","cell.toggle-direction":"Typing direction - click to toggle","common.blanks":"Blanks","common.clear":"Clear","common.close":"Close","common.consonants":"Consonants","common.loading":"Loading","common.points":"Points","common.tiles":"Tiles","common.two-letter-tiles":"Two-letter","common.vowels":"Vowels","common.word":"Word","common.words":"Words","dictionary.empty-state.no-definitions":"Word exists in the dictionary but it does not have a definition.","dictionary.empty-state.no-results":"Unable to find word definition in dictionary.","dictionary.empty-state.not-allowed":"This word is not allowed.","dictionary.empty-state.uninitialized":"Dictionary definition of the last highlighted word will be shown here.","dictionary.input.placeholder":"Search dictionary...","empty-state.error":"Error","empty-state.info":"Info","empty-state.success":"Yeah!","empty-state.warning":"Oops!","github":"See this project on GitHub","keyMap":"Keyboard shortcuts","keyMap.board":"Board","keyMap.board.toggle-blank":"Mark/unmark tile as a blank","keyMap.board.toggle-direction":"Toggle typing direction","keyMap.board-and-rack":"Board & rack","keyMap.board-and-rack.insert-two-letter-tile":"Insert two-letter tile","keyMap.board-and-rack.navigate":"Navigate","keyMap.board-and-rack.remove-tile":"Remove tile","keyMap.board-and-rack.submit":"Start solving","keyMap.rack":"Rack","keyMap.rack.insert-blank":"Insert blank (spacebar)","rack.placeholder":"Letters","remaining-tiles":"Remaining tiles","results.empty-state.no-filtered-results":"No result matches this query.","results.empty-state.no-results":"No results - unable to generate any words.","results.empty-state.outdated":"Results are outdated. Click below to update.","results.empty-state.uninitialized":"Words generated from your letters will be shown here.","results.input.placeholder":"Search results... (RegExp)","results.solve":"Solve","settings":"Settings","settings.autoGroupTiles":"Group remaining tiles","settings.autoGroupTiles.left":"On the left","settings.autoGroupTiles.right":"On the right","settings.autoGroupTiles.null":"Do not group","settings.game":"Game","settings.language":"Language","words":"Created words","words.invalid":"Invalid","words.valid":"Valid"}');
1805
1866
  ;// CONCATENATED MODULE: ./src/i18n/es.json
1806
- const es_namespaceObject = JSON.parse('{"cell.set-blank":"Marcar como en blanco","cell.set-not-blank":"Marcar como no en blanco","cell.toggle-direction":"Dirección de escritura: haga clic para alternar","common.blanks":"Blancos","common.clear":"Borrar","common.close":"Cerrar","common.consonants":"Consonantes","common.loading":"Cargando","common.points":"Puntos","common.tiles":"Longitud","common.two-letter-tiles":"Dos letras","common.vowels":"Vocales","common.word":"Palabra","common.words":"Palabras","dictionary.empty-state.no-definitions":"La palabra existe en el diccionario pero no tiene una definición.","dictionary.empty-state.no-results":"No se puede encontrar la definición de palabra en el diccionario.","dictionary.empty-state.not-allowed":"Esta palabra no es aceptable.","dictionary.empty-state.uninitialized":"Aquí se mostrará la definición del diccionario de la última palabra resaltada.","dictionary.input.placeholder":"Busca el diccionario...","empty-state.error":"Error","empty-state.info":"Info","empty-state.success":"Sí!","empty-state.warning":"Vaya!","github":"Ver este proyecto en GitHub","keyMap":"Atajos de teclado","keyMap.board":"Tablero","keyMap.board.toggle-blank":"Marcar / desmarcar un espacio en blanco","keyMap.board.toggle-direction":"Alternar dirección de escritura","keyMap.board-and-rack":"Tablero y estante","keyMap.board-and-rack.insert-two-letter-tile":"Insertar mosaico de dos letras","keyMap.board-and-rack.navigate":"Navegar","keyMap.board-and-rack.remove-tile":"Quitar Letra","keyMap.board-and-rack.submit":"Empezar a resolver","keyMap.rack":"Estante","keyMap.rack.insert-blank":"Insertar espacio en blanco (barra espaciadora)","rack.placeholder":"Letras…","remaining-tiles":"Casillas restantes","results.empty-state.no-filtered-results":"Ningún resultado coincide con esta consulta.","results.empty-state.no-results":"No hay resultados; no se pueden generar palabras","results.empty-state.outdated":"Los resultados están desactualizados. Haga clic a continuación para actualizar.","results.empty-state.uninitialized":"Aquí se mostrarán las palabras generadas a partir de sus letras.","results.input.placeholder":"Busque una solución... (RegExp)","results.solve":"Resolver","settings":"Configuración","settings.autoGroupTiles":"Agrupar casillas restantes","settings.autoGroupTiles.left":"A la izquierda","settings.autoGroupTiles.right":"A la derecha","settings.autoGroupTiles.null":"No agrupar","settings.game":"Juego","settings.language":"Idioma"}');
1867
+ const es_namespaceObject = JSON.parse('{"cell.filter-cell":"Destino objetivo: haga clic para alternar","cell.set-blank":"Marcar como en blanco","cell.set-not-blank":"Marcar como no en blanco","cell.toggle-direction":"Dirección de escritura: haga clic para alternar","common.blanks":"Blancos","common.clear":"Borrar","common.close":"Cerrar","common.consonants":"Consonantes","common.loading":"Cargando","common.points":"Puntos","common.tiles":"Longitud","common.two-letter-tiles":"Dos letras","common.vowels":"Vocales","common.word":"Palabra","common.words":"Palabras","dictionary.empty-state.no-definitions":"La palabra existe en el diccionario pero no tiene una definición.","dictionary.empty-state.no-results":"No se puede encontrar la definición de palabra en el diccionario.","dictionary.empty-state.not-allowed":"Esta palabra no es aceptable.","dictionary.empty-state.uninitialized":"Aquí se mostrará la definición del diccionario de la última palabra resaltada.","dictionary.input.placeholder":"Busca el diccionario...","empty-state.error":"Error","empty-state.info":"Info","empty-state.success":"Sí!","empty-state.warning":"Vaya!","github":"Ver este proyecto en GitHub","keyMap":"Atajos de teclado","keyMap.board":"Tablero","keyMap.board.toggle-blank":"Marcar / desmarcar un espacio en blanco","keyMap.board.toggle-direction":"Alternar dirección de escritura","keyMap.board-and-rack":"Tablero y estante","keyMap.board-and-rack.insert-two-letter-tile":"Insertar mosaico de dos letras","keyMap.board-and-rack.navigate":"Navegar","keyMap.board-and-rack.remove-tile":"Quitar Letra","keyMap.board-and-rack.submit":"Empezar a resolver","keyMap.rack":"Estante","keyMap.rack.insert-blank":"Insertar espacio en blanco (barra espaciadora)","rack.placeholder":"Letras…","remaining-tiles":"Casillas restantes","results.empty-state.no-filtered-results":"Ningún resultado coincide con esta consulta.","results.empty-state.no-results":"No hay resultados; no se pueden generar palabras","results.empty-state.outdated":"Los resultados están desactualizados. Haga clic a continuación para actualizar.","results.empty-state.uninitialized":"Aquí se mostrarán las palabras generadas a partir de sus letras.","results.input.placeholder":"Busque una solución... (RegExp)","results.solve":"Resolver","settings":"Configuración","settings.autoGroupTiles":"Agrupar casillas restantes","settings.autoGroupTiles.left":"A la izquierda","settings.autoGroupTiles.right":"A la derecha","settings.autoGroupTiles.null":"No agrupar","settings.game":"Juego","settings.language":"Idioma","words":"Palabras creadas","words.invalid":"Incorrecto","words.valid":"Correcto"}');
1807
1868
  ;// CONCATENATED MODULE: ./src/i18n/fr.json
1808
- const fr_namespaceObject = JSON.parse('{"cell.set-blank":"Marquer comme vide","cell.set-not-blank":"Marquer comme non vide","cell.toggle-direction":"Direction d\'écriture - cliquer pour changer","common.blanks":"Cases vides","common.clear":"Effacer","common.close":"Fermer","common.consonants":"Consonnes","common.loading":"Chargement","common.points":"Points","common.tiles":"Cases","common.two-letter-tiles":"Deux lettres","common.vowels":"Voyelles","common.word":"Mot","common.words":"Mots","dictionary.empty-state.no-definitions":"Le mot existe dans le dictionary mais n\'a pas de définition.","dictionary.empty-state.no-results":"Impossible de trouver une définition pour ce mot dans le dictionaire.","dictionary.empty-state.not-allowed":"Ce mot n\'est pas pas acceptable.","dictionary.empty-state.uninitialized":"La définition dictionaire du dernier mot surligné sera affichée ici.","dictionary.input.placeholder":"Rechercher dans le dictionnaire...","empty-state.error":"Erreur","empty-state.info":"Info","empty-state.success":"Ouais!","empty-state.warning":"Oups!","github":"Voir ce projet sur GitHub","keyMap":"Raccourcis clavier","keyMap.board":"Plateau","keyMap.board.toggle-blank":"Marqué/Démarqué la case en tant que vide","keyMap.board.toggle-direction":"Faire basculer la direction d\'écriture","keyMap.board-and-rack":"Plateau & chevalet","keyMap.board-and-rack.insert-two-letter-tile":"Insérer une tuile de deux lettres","keyMap.board-and-rack.navigate":"Naviguer","keyMap.board-and-rack.remove-tile":"Supprimer une case","keyMap.board-and-rack.submit":"Commencer la résolution","keyMap.rack":"Chevalet","keyMap.rack.insert-blank":"Inserer une case vide (spacebar)","rack.placeholder":"Lettres","remaining-tiles":"Cases restantes","results.empty-state.no-filtered-results":"Aucun résultat ne correspond à cette requête","results.empty-state.no-results":"Pas de résultats - impossible de générer des mots.","results.empty-state.outdated":"Les résultats sont dépassé. Cliquer ci-dessous pour mettre à jour.","results.empty-state.uninitialized":"Words generated from your letters will be shown here.","results.input.placeholder":"Rechercher les résultats... (RegExp)","results.solve":"Résoudre","settings":"Options","settings.autoGroupTiles":"Grouper les cases restantes","settings.autoGroupTiles.left":"Vers la droite","settings.autoGroupTiles.right":"Vers la gauche","settings.autoGroupTiles.null":"Ne pas grouper","settings.game":"Jeu","settings.language":"Langue"}');
1869
+ const fr_namespaceObject = JSON.parse('{"cell.filter-cell":"Destination cible - cliquer pour changer","cell.set-blank":"Marquer comme vide","cell.set-not-blank":"Marquer comme non vide","cell.toggle-direction":"Direction d\'écriture - cliquer pour changer","common.blanks":"Cases vides","common.clear":"Effacer","common.close":"Fermer","common.consonants":"Consonnes","common.loading":"Chargement","common.points":"Points","common.tiles":"Cases","common.two-letter-tiles":"Deux lettres","common.vowels":"Voyelles","common.word":"Mot","common.words":"Mots","dictionary.empty-state.no-definitions":"Le mot existe dans le dictionary mais n\'a pas de définition.","dictionary.empty-state.no-results":"Impossible de trouver une définition pour ce mot dans le dictionaire.","dictionary.empty-state.not-allowed":"Ce mot n\'est pas pas acceptable.","dictionary.empty-state.uninitialized":"La définition dictionaire du dernier mot surligné sera affichée ici.","dictionary.input.placeholder":"Rechercher dans le dictionnaire...","empty-state.error":"Erreur","empty-state.info":"Info","empty-state.success":"Ouais!","empty-state.warning":"Oups!","github":"Voir ce projet sur GitHub","keyMap":"Raccourcis clavier","keyMap.board":"Plateau","keyMap.board.toggle-blank":"Marqué/Démarqué la case en tant que vide","keyMap.board.toggle-direction":"Faire basculer la direction d\'écriture","keyMap.board-and-rack":"Plateau & chevalet","keyMap.board-and-rack.insert-two-letter-tile":"Insérer une tuile de deux lettres","keyMap.board-and-rack.navigate":"Naviguer","keyMap.board-and-rack.remove-tile":"Supprimer une case","keyMap.board-and-rack.submit":"Commencer la résolution","keyMap.rack":"Chevalet","keyMap.rack.insert-blank":"Inserer une case vide (spacebar)","rack.placeholder":"Lettres","remaining-tiles":"Cases restantes","results.empty-state.no-filtered-results":"Aucun résultat ne correspond à cette requête","results.empty-state.no-results":"Pas de résultats - impossible de générer des mots.","results.empty-state.outdated":"Les résultats sont dépassé. Cliquer ci-dessous pour mettre à jour.","results.empty-state.uninitialized":"Words generated from your letters will be shown here.","results.input.placeholder":"Rechercher les résultats... (RegExp)","results.solve":"Résoudre","settings":"Options","settings.autoGroupTiles":"Grouper les cases restantes","settings.autoGroupTiles.left":"Vers la droite","settings.autoGroupTiles.right":"Vers la gauche","settings.autoGroupTiles.null":"Ne pas grouper","settings.game":"Jeu","settings.language":"Langue","words":"Mots créés","words.invalid":"Incorrect","words.valid":"Corriger"}');
1809
1870
  ;// CONCATENATED MODULE: ./src/i18n/pl.json
1810
- const pl_namespaceObject = JSON.parse('{"cell.set-blank":"Oznacz jako blank","cell.set-not-blank":"Oznacz jako nie blank","cell.toggle-direction":"Kierunek wpisywania - kliknij aby zmienić","common.blanks":"Blanki","common.clear":"Wyczyść","common.close":"Zamknij","common.consonants":"Spółgłoski","common.loading":"Ładowanie","common.points":"Punkty","common.tiles":"Płytki","common.two-letter-tiles":"Dwuliterowe","common.vowels":"Samogłoski","common.word":"Słowo","common.words":"Słowa","dictionary.empty-state.no-definitions":"Słowo istnieje w słowniku ale nie posiada definicji.","dictionary.empty-state.no-results":"Nie udało się znaleźć definicji słowa w słowniku.","dictionary.empty-state.not-allowed":"To słowo nie jest dopuszczalne w grach.","dictionary.empty-state.uninitialized":"Tu zostanie wyświetlona słownikowa definicja ostatnio podświetlonego słowa.","dictionary.input.placeholder":"Szukaj w słowniku...","empty-state.error":"Błąd","empty-state.info":"Info","empty-state.success":"Hurra!","empty-state.warning":"Ups!","github":"Zobacz ten projekt na GitHubie","keyMap":"Skróty klawiszowe","keyMap.board":"Plansza","keyMap.board.toggle-blank":"Oznacz/odznacz płytkę jako blank","keyMap.board.toggle-direction":"Zmień kierunek wpisywania","keyMap.board-and-rack":"Plansza i stojak","keyMap.board-and-rack.insert-two-letter-tile":"Wstaw dwuliterową płytkę","keyMap.board-and-rack.navigate":"Nawigacja","keyMap.board-and-rack.remove-tile":"Zdejmij płytkę","keyMap.board-and-rack.submit":"Rozpocznij wyszukiwanie","keyMap.rack":"Stojak","keyMap.rack.insert-blank":"Wstaw blanka (spacja)","rack.placeholder":"Literki","remaining-tiles":"Pozostałe płytki","results.empty-state.no-filtered-results":"Żaden wynik nie pasuje do tej kwerendy.","results.empty-state.no-results":"Brak wyników - nie można wygenerować żadnego słowa.","results.empty-state.outdated":"Wyniki są nieaktualne. Kliknij poniżej, aby zaktualizować.","results.empty-state.uninitialized":"Tu zostaną wyświetlone słowa wygenerowane z Twoich liter.","results.input.placeholder":"Szukaj rozwiązania... (RegExp)","results.solve":"Rozwiąż","settings":"Opcje","settings.autoGroupTiles":"Grupuj pozostałe płytki","settings.autoGroupTiles.left":"Po lewej","settings.autoGroupTiles.right":"Po prawej","settings.autoGroupTiles.null":"Nie grupuj","settings.game":"Gra","settings.language":"Język"}');
1871
+ const pl_namespaceObject = JSON.parse('{"cell.filter-cell":"Miejsce docelowe - kliknij aby zmienić","cell.set-blank":"Oznacz jako blank","cell.set-not-blank":"Oznacz jako nie blank","cell.toggle-direction":"Kierunek wpisywania - kliknij aby zmienić","common.blanks":"Blanki","common.clear":"Wyczyść","common.close":"Zamknij","common.consonants":"Spółgłoski","common.loading":"Ładowanie","common.points":"Punkty","common.tiles":"Płytki","common.two-letter-tiles":"Dwuliterowe","common.vowels":"Samogłoski","common.word":"Słowo","common.words":"Słowa","dictionary.empty-state.no-definitions":"Słowo istnieje w słowniku ale nie posiada definicji.","dictionary.empty-state.no-results":"Nie udało się znaleźć definicji słowa w słowniku.","dictionary.empty-state.not-allowed":"To słowo nie jest dopuszczalne w grach.","dictionary.empty-state.uninitialized":"Tu zostanie wyświetlona słownikowa definicja ostatnio podświetlonego słowa.","dictionary.input.placeholder":"Szukaj w słowniku...","empty-state.error":"Błąd","empty-state.info":"Info","empty-state.success":"Hurra!","empty-state.warning":"Ups!","github":"Zobacz ten projekt na GitHubie","keyMap":"Skróty klawiszowe","keyMap.board":"Plansza","keyMap.board.toggle-blank":"Oznacz/odznacz płytkę jako blank","keyMap.board.toggle-direction":"Zmień kierunek wpisywania","keyMap.board-and-rack":"Plansza i stojak","keyMap.board-and-rack.insert-two-letter-tile":"Wstaw dwuliterową płytkę","keyMap.board-and-rack.navigate":"Nawigacja","keyMap.board-and-rack.remove-tile":"Zdejmij płytkę","keyMap.board-and-rack.submit":"Rozpocznij wyszukiwanie","keyMap.rack":"Stojak","keyMap.rack.insert-blank":"Wstaw blanka (spacja)","rack.placeholder":"Literki","remaining-tiles":"Pozostałe płytki","results.empty-state.no-filtered-results":"Żaden wynik nie pasuje do tej kwerendy.","results.empty-state.no-results":"Brak wyników - nie można wygenerować żadnego słowa.","results.empty-state.outdated":"Wyniki są nieaktualne. Kliknij poniżej, aby zaktualizować.","results.empty-state.uninitialized":"Tu zostaną wyświetlone słowa wygenerowane z Twoich liter.","results.input.placeholder":"Szukaj rozwiązania... (RegExp)","results.solve":"Rozwiąż","settings":"Opcje","settings.autoGroupTiles":"Grupuj pozostałe płytki","settings.autoGroupTiles.left":"Po lewej","settings.autoGroupTiles.right":"Po prawej","settings.autoGroupTiles.null":"Nie grupuj","settings.game":"Gra","settings.language":"Język","words":"Utworzone słowa","words.invalid":"Niepoprawne","words.valid":"Poprawne"}');
1811
1872
  ;// CONCATENATED MODULE: ./src/i18n/index.ts
1812
1873
 
1813
1874
 
@@ -1833,14 +1894,17 @@ var lib = __webpack_require__(92237);
1833
1894
 
1834
1895
 
1835
1896
  const selectCell = (_, cell)=>cell;
1897
+ const selectPoint = (_, point)=>point;
1836
1898
  const selectCharacter = (_, character)=>character;
1837
1899
  const selectTile = (_, tile)=>tile;
1838
1900
  const selectBoardRoot = (state)=>state.board;
1839
1901
  const selectDictionaryRoot = (state)=>state.dictionary;
1902
+ const selectCellFilterRoot = (state)=>state.cellFilter;
1840
1903
  const selectRackRoot = (state)=>state.rack;
1841
1904
  const selectResultsRoot = (state)=>state.results;
1842
1905
  const selectSettingsRoot = (state)=>state.settings;
1843
1906
  const selectSolveRoot = (state)=>state.solve;
1907
+ const selectVerifyRoot = (state)=>state.verify;
1844
1908
  const selectDictionary = selectDictionaryRoot;
1845
1909
  const selectAutoGroupTiles = (0,toolkit_.createSelector)([
1846
1910
  selectSettingsRoot
@@ -1856,6 +1920,13 @@ const selectConfig = (0,toolkit_.createSelector)([
1856
1920
  selectConfigId,
1857
1921
  selectLocale
1858
1922
  ], build.getLocaleConfig);
1923
+ const selectCellFilter = selectCellFilterRoot;
1924
+ const selectCellIsFiltered = (0,toolkit_.createSelector)([
1925
+ selectCellFilter,
1926
+ selectPoint
1927
+ ], (cellFilter, { x , y })=>{
1928
+ return cellFilter.some((cell)=>cell.x === x && cell.y === y);
1929
+ });
1859
1930
  const selectResults = (0,toolkit_.createSelector)([
1860
1931
  selectResultsRoot
1861
1932
  ], (results)=>results.results);
@@ -1873,20 +1944,35 @@ const selectSortedResults = (0,toolkit_.createSelector)([
1873
1944
  selectResultsSortColumn,
1874
1945
  selectResultsSortDirection
1875
1946
  ], lib/* sortResults */.uj);
1947
+ const filterResultsByQuery = (results, query)=>{
1948
+ if (query.trim().length === 0) {
1949
+ return results;
1950
+ }
1951
+ let regExp;
1952
+ try {
1953
+ regExp = new RegExp(query, "gi");
1954
+ } catch {
1955
+ return results;
1956
+ }
1957
+ return results.filter((result)=>{
1958
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
1959
+ return regExp.test(result.word);
1960
+ });
1961
+ };
1876
1962
  const selectSortedFilteredResults = (0,toolkit_.createSelector)([
1877
1963
  selectSortedResults,
1878
- selectResultsQuery
1879
- ], (results, query)=>{
1880
- if (!results || query.trim().length === 0) {
1964
+ selectResultsQuery,
1965
+ selectCellFilter
1966
+ ], (results, query, cellFilter)=>{
1967
+ if (!results) {
1881
1968
  return results;
1882
1969
  }
1883
- return results.filter((result)=>{
1884
- try {
1885
- const regExp = new RegExp(query, "gi");
1886
- return regExp.test(result.word);
1887
- } catch {
1888
- return false;
1889
- }
1970
+ const filteredByQuery = filterResultsByQuery(results, query);
1971
+ if (!cellFilter) {
1972
+ return filteredByQuery;
1973
+ }
1974
+ return filteredByQuery.filter((result)=>{
1975
+ return cellFilter.every(({ x , y })=>result.cells.some((cell)=>cell.x === x && cell.y === y));
1890
1976
  });
1891
1977
  });
1892
1978
  const selectResultCandidate = (0,toolkit_.createSelector)([
@@ -1971,25 +2057,33 @@ const selectHasOverusedTiles = (0,toolkit_.createSelector)([
1971
2057
  const selectRemainingTilesGroups = (0,toolkit_.createSelector)([
1972
2058
  selectRemainingTiles
1973
2059
  ], lib/* getRemainingTilesGroups */.op);
2060
+ const selectVerify = selectVerifyRoot;
2061
+ const selectHasInvalidWords = (0,toolkit_.createSelector)([
2062
+ selectVerify
2063
+ ], ({ invalidWords })=>{
2064
+ return invalidWords.length > 0;
2065
+ });
1974
2066
 
1975
2067
 
1976
2068
  /***/ }),
1977
2069
 
1978
- /***/ 28546:
2070
+ /***/ 99134:
1979
2071
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1980
2072
 
1981
2073
 
1982
2074
  // EXPORTS
1983
2075
  __webpack_require__.d(__webpack_exports__, {
1984
2076
  "I8": () => (/* reexport */ slices_boardSlice),
2077
+ "mO": () => (/* reexport */ slices_cellFilterSlice),
1985
2078
  "lj": () => (/* reexport */ slices_dictionarySlice),
1986
2079
  "O_": () => (/* reexport */ slices_rackSlice),
1987
2080
  "_C": () => (/* reexport */ slices_resultsSlice),
1988
2081
  "xj": () => (/* reexport */ slices_settingsSlice),
1989
- "TP": () => (/* reexport */ slices_solveSlice)
2082
+ "TP": () => (/* reexport */ slices_solveSlice),
2083
+ "Gt": () => (/* reexport */ slices_verifySlice)
1990
2084
  });
1991
2085
 
1992
- // UNUSED EXPORTS: boardInitialState, dictionaryInitialState, rackInitialState, resultsInitialState, settingsInitialState, solveInitialState
2086
+ // UNUSED EXPORTS: boardInitialState, cellFilterInitialState, dictionaryInitialState, rackInitialState, resultsInitialState, settingsInitialState, solveInitialState, verifyInitialState
1993
2087
 
1994
2088
  // EXTERNAL MODULE: ../configs/build/index.js
1995
2089
  var build = __webpack_require__(89418);
@@ -2084,6 +2178,33 @@ const boardSlice = (0,toolkit_.createSlice)({
2084
2178
  });
2085
2179
  /* harmony default export */ const slices_boardSlice = (boardSlice);
2086
2180
 
2181
+ ;// CONCATENATED MODULE: ./src/state/slices/cellFilterInitialState.ts
2182
+ const cellFilterInitialState = [];
2183
+ /* harmony default export */ const slices_cellFilterInitialState = (cellFilterInitialState);
2184
+
2185
+ ;// CONCATENATED MODULE: ./src/state/slices/cellFilterSlice.ts
2186
+
2187
+
2188
+ const cellFilterSlice = (0,toolkit_.createSlice)({
2189
+ initialState: slices_cellFilterInitialState,
2190
+ name: "cellFilter",
2191
+ reducers: {
2192
+ toggle: (state, action)=>{
2193
+ const { x , y } = action.payload;
2194
+ const has = state.some((point)=>point.x === x && point.y === y);
2195
+ if (has) {
2196
+ return state.filter((point)=>point.x !== x || point.y !== y);
2197
+ }
2198
+ return [
2199
+ ...state,
2200
+ action.payload
2201
+ ];
2202
+ },
2203
+ reset: ()=>slices_cellFilterInitialState
2204
+ }
2205
+ });
2206
+ /* harmony default export */ const slices_cellFilterSlice = (cellFilterSlice);
2207
+
2087
2208
  ;// CONCATENATED MODULE: ./src/state/slices/dictionaryInitialState.ts
2088
2209
  const dictionaryInitialState = {
2089
2210
  input: "",
@@ -2339,6 +2460,53 @@ const solveSlice = (0,toolkit_.createSlice)({
2339
2460
  });
2340
2461
  /* harmony default export */ const slices_solveSlice = (solveSlice);
2341
2462
 
2463
+ ;// CONCATENATED MODULE: ./src/state/slices/verifyInitialState.ts
2464
+
2465
+ const verifyInitialState = {
2466
+ isLoading: false,
2467
+ lastSolvedParameters: {
2468
+ board: slices_boardInitialState
2469
+ },
2470
+ invalidWords: [],
2471
+ validWords: []
2472
+ };
2473
+ /* harmony default export */ const slices_verifyInitialState = (verifyInitialState);
2474
+
2475
+ ;// CONCATENATED MODULE: ./src/state/slices/verifySlice.ts
2476
+
2477
+
2478
+ const verifySlice = (0,toolkit_.createSlice)({
2479
+ initialState: slices_verifyInitialState,
2480
+ name: "verify",
2481
+ reducers: {
2482
+ submit: (state)=>{
2483
+ return {
2484
+ ...state,
2485
+ isLoading: true
2486
+ };
2487
+ },
2488
+ submitFailure: (state)=>{
2489
+ return {
2490
+ ...state,
2491
+ isLoading: false
2492
+ };
2493
+ },
2494
+ submitSuccess: (state, action)=>{
2495
+ const { board , invalidWords , validWords } = action.payload;
2496
+ return {
2497
+ ...state,
2498
+ isLoading: false,
2499
+ lastSolvedParameters: {
2500
+ board
2501
+ },
2502
+ invalidWords,
2503
+ validWords
2504
+ };
2505
+ }
2506
+ }
2507
+ });
2508
+ /* harmony default export */ const slices_verifySlice = (verifySlice);
2509
+
2342
2510
  ;// CONCATENATED MODULE: ./src/state/slices/index.ts
2343
2511
 
2344
2512
 
@@ -2354,6 +2522,10 @@ const solveSlice = (0,toolkit_.createSlice)({
2354
2522
 
2355
2523
 
2356
2524
 
2525
+
2526
+
2527
+
2528
+
2357
2529
  /***/ }),
2358
2530
 
2359
2531
  /***/ 41573:
@@ -2514,6 +2686,22 @@ class Board {
2514
2686
  return count + row.reduce((rowCount, cell) => (cell.hasTile() ? rowCount + 1 : rowCount), 0);
2515
2687
  }, 0);
2516
2688
  }
2689
+ getWords() {
2690
+ const columns = [];
2691
+ for (let x = 0; x < this.columnsCount; ++x) {
2692
+ const column = [];
2693
+ for (let y = 0; y < this.rowsCount; ++y) {
2694
+ column.push(this.rows[y][x]);
2695
+ }
2696
+ columns.push(column);
2697
+ }
2698
+ const columnsBoard = new Board({ rows: columns });
2699
+ const lines = this.toString().split('\n').concat(columnsBoard.toString().split('\n'));
2700
+ const words = lines
2701
+ .flatMap((line) => line.replaceAll(/\s+/g, constants_1.EMPTY_CELL).split(' '))
2702
+ .filter((word) => word.length > 1);
2703
+ return words;
2704
+ }
2517
2705
  isEmpty() {
2518
2706
  return this.rows.every((row) => row.every(({ isEmpty }) => isEmpty));
2519
2707
  }
@@ -2521,7 +2709,7 @@ class Board {
2521
2709
  return this.rows.map((row) => row.map((cell) => cell.toJson()));
2522
2710
  }
2523
2711
  toString() {
2524
- return this.rows.map((row) => row.map(String)).join('\n');
2712
+ return this.rows.map((row) => row.map(String).join('')).join('\n');
2525
2713
  }
2526
2714
  updateCell(x, y, updateCell) {
2527
2715
  this.rows[y][x] = updateCell(this.rows[y][x]);
@@ -2789,7 +2977,7 @@ class Config {
2789
2977
  return tile.isBlank ? this.blankScore : this.getCharacterPoints(tile.character);
2790
2978
  }
2791
2979
  hasCharacter(character) {
2792
- return this.alphabet.includes(character);
2980
+ return character in this.pointsMap;
2793
2981
  }
2794
2982
  isTwoCharacterTilePrefix(character) {
2795
2983
  return typeof this.getTwoCharacterTileByPrefix(character) !== 'undefined';
@@ -2823,6 +3011,29 @@ const getPointsMap = (config) => config.tiles.reduce((pointsMap, { character, sc
2823
3011
  exports["default"] = Config;
2824
3012
 
2825
3013
 
3014
+ /***/ }),
3015
+
3016
+ /***/ 35905:
3017
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
3018
+
3019
+
3020
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3021
+ return (mod && mod.__esModule) ? mod : { "default": mod };
3022
+ };
3023
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
3024
+ const Pattern_1 = __importDefault(__webpack_require__(63207));
3025
+ class FinalPattern extends Pattern_1.default {
3026
+ constructor(pattern) {
3027
+ super(pattern.board, pattern.cells);
3028
+ this.collisions = pattern.getCollisions();
3029
+ }
3030
+ getCollisions() {
3031
+ return this.collisions;
3032
+ }
3033
+ }
3034
+ exports["default"] = FinalPattern;
3035
+
3036
+
2826
3037
  /***/ }),
2827
3038
 
2828
3039
  /***/ 49594:
@@ -2836,10 +3047,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
2836
3047
  const Pattern_1 = __importDefault(__webpack_require__(63207));
2837
3048
  class HorizontalPattern extends Pattern_1.default {
2838
3049
  clone() {
2839
- return new HorizontalPattern({
2840
- board: this.board,
2841
- cells: this.cells.map((cell) => cell.clone()),
2842
- });
3050
+ return new HorizontalPattern(this.board, this.cells.map((cell) => cell.clone()));
2843
3051
  }
2844
3052
  getCollisions() {
2845
3053
  const collisions = [];
@@ -2859,7 +3067,7 @@ class HorizontalPattern extends Pattern_1.default {
2859
3067
  const nextCells = column.slice(cell.y + 1, y);
2860
3068
  const cells = [...previousCells, cell, ...nextCells];
2861
3069
  if (cells.length > 1) {
2862
- const pattern = new Pattern_1.default({ board: this.board, cells });
3070
+ const pattern = new Pattern_1.default(this.board, cells);
2863
3071
  collisions.push(pattern);
2864
3072
  }
2865
3073
  });
@@ -2901,7 +3109,7 @@ exports["default"] = Locale;
2901
3109
 
2902
3110
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2903
3111
  class Pattern {
2904
- constructor({ board, cells }) {
3112
+ constructor(board, cells) {
2905
3113
  this.board = board;
2906
3114
  this.cells = cells;
2907
3115
  }
@@ -2912,10 +3120,7 @@ class Pattern {
2912
3120
  (this.hasAtLeast1NonEmptyCell() || this.collides() || (this.goesThroughBoardCenter() && this.board.isEmpty())));
2913
3121
  }
2914
3122
  clone() {
2915
- return new Pattern({
2916
- board: this.board,
2917
- cells: this.cells.map((cell) => cell.clone()),
2918
- });
3123
+ return new Pattern(this.board, this.cells.map((cell) => cell.clone()));
2919
3124
  }
2920
3125
  collides() {
2921
3126
  return this.cells.some((cell) => cell.isEmpty && this.board.collides(cell));
@@ -3009,11 +3214,9 @@ const getNonBlanks = (tiles) => tiles.filter(({ isBlank }) => !isBlank);
3009
3214
  const getPointsRatio = (tiles, points) => points / tiles.length;
3010
3215
  const getTiles = (cells) => cells.filter(({ isEmpty }) => isEmpty).map(({ tile }) => tile);
3011
3216
  const getTilesCharacters = (tiles) => getNonBlankCharacters(tiles).sort(charactersComparator).join('');
3012
- const getWord = (cells) => cells.map(String).join('');
3013
- const getWords = (cells, collisions) => [
3014
- getWord(cells),
3015
- ...collisions.map((collision) => collision.map(String).join('')),
3016
- ];
3217
+ // eslint-disable-next-line prefer-template
3218
+ const getWord = (cells) => cells.reduce((word, cell) => word + cell.toString(), '');
3219
+ const getWords = (cells, collisions) => [cells, ...collisions].map(getWord);
3017
3220
  const isConsonant = ({ character, isBlank }) => constants_1.CONSONANTS.includes(character) && !isBlank;
3018
3221
  const isVowel = ({ character, isBlank }) => constants_1.VOWELS.includes(character) && !isBlank;
3019
3222
  exports["default"] = Result;
@@ -3102,10 +3305,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
3102
3305
  const Pattern_1 = __importDefault(__webpack_require__(63207));
3103
3306
  class VerticalPattern extends Pattern_1.default {
3104
3307
  clone() {
3105
- return new VerticalPattern({
3106
- board: this.board,
3107
- cells: this.cells.map((cell) => cell.clone()),
3108
- });
3308
+ return new VerticalPattern(this.board, this.cells.map((cell) => cell.clone()));
3109
3309
  }
3110
3310
  getCollisions() {
3111
3311
  const collisions = [];
@@ -3125,7 +3325,7 @@ class VerticalPattern extends Pattern_1.default {
3125
3325
  const nextCells = row.slice(cell.x + 1, x);
3126
3326
  const cells = [...previousCells, cell, ...nextCells];
3127
3327
  if (cells.length > 1) {
3128
- const pattern = new Pattern_1.default({ board: this.board, cells });
3328
+ const pattern = new Pattern_1.default(this.board, cells);
3129
3329
  collisions.push(pattern);
3130
3330
  }
3131
3331
  });
@@ -3212,7 +3412,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3212
3412
  return (mod && mod.__esModule) ? mod : { "default": mod };
3213
3413
  };
3214
3414
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3215
- exports.WordDefinition = exports.WordBonus = exports.VerticalPattern = exports.isTileJson = exports.Tile = exports.Result = exports.Pattern = exports.isLocale = exports.Locale = exports.isObject = exports.HorizontalPattern = exports.Config = exports.CharacterBonus = exports.isCellJson = exports.Cell = exports.Bonus = exports.isBoardJson = exports.Board = void 0;
3415
+ exports.WordDefinition = exports.WordBonus = exports.VerticalPattern = exports.isTileJson = exports.Tile = exports.Result = exports.Pattern = exports.isLocale = exports.Locale = exports.isObject = exports.HorizontalPattern = exports.FinalPattern = exports.Config = exports.CharacterBonus = exports.isCellJson = exports.Cell = exports.Bonus = exports.isBoardJson = exports.Board = void 0;
3216
3416
  var Board_1 = __webpack_require__(80559);
3217
3417
  Object.defineProperty(exports, "Board", ({ enumerable: true, get: function () { return __importDefault(Board_1).default; } }));
3218
3418
  var BoardJson_1 = __webpack_require__(46936);
@@ -3227,6 +3427,8 @@ var CharacterBonus_1 = __webpack_require__(19582);
3227
3427
  Object.defineProperty(exports, "CharacterBonus", ({ enumerable: true, get: function () { return __importDefault(CharacterBonus_1).default; } }));
3228
3428
  var Config_1 = __webpack_require__(28433);
3229
3429
  Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return __importDefault(Config_1).default; } }));
3430
+ var FinalPattern_1 = __webpack_require__(35905);
3431
+ Object.defineProperty(exports, "FinalPattern", ({ enumerable: true, get: function () { return __importDefault(FinalPattern_1).default; } }));
3230
3432
  var HorizontalPattern_1 = __webpack_require__(49594);
3231
3433
  Object.defineProperty(exports, "HorizontalPattern", ({ enumerable: true, get: function () { return __importDefault(HorizontalPattern_1).default; } }));
3232
3434
  var isObject_1 = __webpack_require__(24814);